diff --git a/.editorconfig b/.editorconfig
index a25dbdfc85..df93ae3a16 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -2,3 +2,7 @@
insert_final_newline = true
indent_style = tab
indent_size = 4
+
+[*.yml]
+indent_style = space
+indent_size = 2
diff --git a/.travis.yml b/.travis.yml
index bef3a69ad7..ab3b1003c3 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,28 +1,34 @@
language: generic
-sudo: false
dist: xenial
+sudo: false
+
branches:
except:
- ___TGS3TempBranch
- ___TGSTempBranch
+
matrix:
include:
- - env:
- - BUILD_TOOLS=true
- name: "Build Tools"
+ - name: "Run Linters"
addons:
apt:
packages:
- python3
- python3-pip
- python3-setuptools
- cache:
- directories:
- - tgui/node_modules
- - env:
- - BUILD_TESTING=true
- - BUILD_TOOLS=false
- name: "Build All Maps"
+ install:
+ - tools/travis/install_build_tools.sh
+ - tools/travis/install_dreamchecker.sh
+ script:
+ - tools/travis/check_filedirs.sh tgstation.dme
+ - tools/travis/check_changelogs.sh
+ - find . -name "*.php" -print0 | xargs -0 -n1 php -l
+ - find . -name "*.json" -not -path "./tgui/node_modules/*" -print0 | xargs -0 python3 ./tools/json_verifier.py
+ - tools/travis/build_tgui.sh
+ - tools/travis/check_grep.sh
+ - ~/dreamchecker
+
+ - name: "Compile All Maps"
addons:
apt:
packages:
@@ -30,10 +36,15 @@ matrix:
cache:
directories:
- $HOME/BYOND
- - env:
- - BUILD_TESTING=false
- - BUILD_TOOLS=false
- name: "Build and Run Unit Tests"
+ install:
+ - tools/travis/install_byond.sh
+ - source $HOME/BYOND/byond/bin/byondsetup
+ before_script:
+ - tools/travis/template_dm_generator.py
+ script:
+ - tools/travis/dm.sh -DTRAVISBUILDING -DTRAVISTESTING -DALL_MAPS tgstation.dme
+
+ - name: "Compile and Run Tests"
addons:
mariadb: '10.2'
apt:
@@ -41,7 +52,6 @@ matrix:
- ubuntu-toolchain-r-test
packages:
- libstdc++6:i386
- - libssl-dev:i386
- gcc-multilib
- g++-7
- g++-7-multilib
@@ -49,25 +59,19 @@ matrix:
- libmariadbd-dev
cache:
directories:
- - $HOME/.cargo
- $HOME/BYOND
- - $HOME/MariaDB
- - $HOME/.rustup
-
-install:
- - tools/travis/install_build_tools.sh
- - if [ $BUILD_TOOLS = false ] && [ $BUILD_TESTING = false ]; then mysql -u root -e 'CREATE DATABASE tg_travis;'; fi
- - if [ $BUILD_TOOLS = false ] && [ $BUILD_TESTING = false ]; then mysql -u root tg_travis < SQL/tgstation_schema.sql; fi
- - if [ $BUILD_TOOLS = false ] && [ $BUILD_TESTING = false ]; then mysql -u root -e 'CREATE DATABASE tg_travis_prefixed;'; fi
- - if [ $BUILD_TOOLS = false ] && [ $BUILD_TESTING = false ]; then mysql -u root tg_travis_prefixed < SQL/tgstation_schema_prefixed.sql; fi
-
-before_script:
- - tools/travis/before_build_tools.sh
- - tools/travis/before_build_byond.sh
-
-script:
- - tools/travis/check_filedirs.sh tgstation.dme
- - tools/travis/build_tools.sh || travis_terminate 1
- - tools/travis/build_dependencies.sh || travis_terminate 1
- - tools/travis/build_byond.sh
-
+ - $HOME/libmariadb
+ install:
+ - tools/travis/install_byond.sh
+ - source $HOME/BYOND/byond/bin/byondsetup
+ - tools/travis/install_libmariadb.sh
+ - tools/travis/install_rust_g.sh
+ before_script:
+ - mysql -u root -e 'CREATE DATABASE tg_travis;'
+ - mysql -u root tg_travis < SQL/tgstation_schema.sql
+ - mysql -u root -e 'CREATE DATABASE tg_travis_prefixed;'
+ - mysql -u root tg_travis_prefixed < SQL/tgstation_schema_prefixed.sql
+ - tools/travis/build_bsql.sh
+ script:
+ - tools/travis/dm.sh -DTRAVISBUILDING tgstation.dme || travis_terminate 1
+ - tools/travis/run_server.sh
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elite_tumor.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elite_tumor.dmm
new file mode 100644
index 0000000000..6e44ec3197
--- /dev/null
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_elite_tumor.dmm
@@ -0,0 +1,111 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/lavaland/surface/outdoors)
+"b" = (
+/obj/structure/elite_tumor,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"c" = (
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(4,1,1) = {"
+a
+a
+a
+c
+c
+c
+a
+a
+a
+"}
+(5,1,1) = {"
+a
+a
+a
+c
+b
+c
+a
+a
+a
+"}
+(6,1,1) = {"
+a
+a
+a
+c
+c
+c
+a
+a
+a
+"}
+(7,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(8,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(9,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm
index 341dcf7b99..f64bfa8a4e 100644
--- a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm
@@ -338,6 +338,9 @@
/obj/item/flashlight/lamp/bananalamp,
/turf/open/floor/plating/asteroid,
/area/ruin/unpowered)
+"bt" = (
+/turf/closed/mineral/random/low_chance/earth_like,
+/area/ruin/unpowered)
(1,1,1) = {"
aa
@@ -474,13 +477,13 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
ab
ab
@@ -520,22 +523,22 @@ aA
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
ab
aA
@@ -569,27 +572,27 @@ aA
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -620,29 +623,29 @@ ab
ab
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -666,36 +669,36 @@ aM
aa
aA
ab
+bt
+bt
+bt
+bt
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -718,37 +721,37 @@ aa
aa
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ae
af
ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -770,38 +773,38 @@ aa
aa
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
af
aq
af
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -822,38 +825,38 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ae
ae
ao
ae
ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -874,39 +877,39 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
af
an
an
an
af
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -927,24 +930,24 @@ aA
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ae
ae
bh
@@ -952,13 +955,13 @@ an
an
ae
aZ
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -979,24 +982,24 @@ aA
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
af
aY
ao
@@ -1004,13 +1007,13 @@ ao
ao
ak
ba
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -1031,24 +1034,24 @@ aA
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
al
aj
ap
@@ -1056,13 +1059,13 @@ an
as
aj
aE
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -1083,24 +1086,24 @@ aA
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
af
ak
ao
@@ -1109,12 +1112,12 @@ ao
ak
ba
ac
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -1134,24 +1137,24 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ah
az
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
aR
ae
ae
@@ -1161,12 +1164,12 @@ an
ae
aZ
ac
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aM
@@ -1186,24 +1189,24 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ac
ac
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
aR
ag
ag
@@ -1213,12 +1216,12 @@ af
at
bb
ac
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -1238,24 +1241,24 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ad
ac
ac
ac
ac
-ab
+bt
aH
aJ
aL
-ab
-ab
+bt
+bt
aT
ac
ac
@@ -1265,12 +1268,12 @@ ac
ac
ac
aR
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -1289,14 +1292,14 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ad
au
ac
@@ -1306,8 +1309,8 @@ ac
ac
ac
ac
-ab
-ab
+bt
+bt
ac
ac
ac
@@ -1317,12 +1320,12 @@ ac
ac
ac
bg
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -1341,14 +1344,14 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ad
aw
bs
@@ -1358,9 +1361,9 @@ ac
ac
ac
ac
-ab
-ab
-ab
+bt
+bt
+bt
ac
ac
ac
@@ -1368,13 +1371,13 @@ ac
ac
ac
ac
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -1393,14 +1396,14 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ad
ax
ac
@@ -1409,9 +1412,9 @@ aF
ac
ac
ac
-ab
-ab
-ab
+bt
+bt
+bt
aU
bd
ac
@@ -1420,13 +1423,13 @@ bl
bm
ac
ac
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -1445,14 +1448,14 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ad
ay
ac
@@ -1461,9 +1464,9 @@ ac
aG
ac
ac
-ab
-ab
-ab
+bt
+bt
+bt
av
be
ac
@@ -1473,12 +1476,12 @@ bn
bo
bo
bq
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -1496,16 +1499,16 @@ aa
aa
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ac
ac
ac
@@ -1513,9 +1516,9 @@ ac
ac
ac
ac
-ab
-ab
-ab
+bt
+bt
+bt
bc
bf
ac
@@ -1525,11 +1528,11 @@ ac
ac
ac
br
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -1548,26 +1551,26 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ac
-ab
+bt
ac
ac
ac
ac
ac
-ab
-ab
+bt
+bt
ac
ac
ac
@@ -1577,11 +1580,11 @@ ac
ac
ac
ac
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -1599,20 +1602,20 @@ aa
aa
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ac
ac
ac
@@ -1628,11 +1631,11 @@ ac
ac
ac
ac
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -1651,26 +1654,26 @@ aa
aa
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ac
ac
ac
-ab
-ab
+bt
+bt
ac
ac
ac
@@ -1682,9 +1685,9 @@ ac
ac
ac
ac
-ab
-ab
-ab
+bt
+bt
+bt
ab
aa
aa
@@ -1703,26 +1706,26 @@ aa
aa
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
aK
-ab
-ab
+bt
+bt
ac
ac
ac
@@ -1734,8 +1737,8 @@ bp
ac
ac
aR
-ab
-ab
+bt
+bt
ab
aA
aa
@@ -1756,25 +1759,25 @@ aa
aa
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
aP
ac
ac
@@ -1786,8 +1789,8 @@ ac
ac
ac
aR
-ab
-ab
+bt
+bt
ab
aA
aa
@@ -1808,25 +1811,25 @@ aa
aa
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
aQ
aP
ac
@@ -1836,10 +1839,10 @@ ac
ac
ac
ac
-ab
+bt
ac
-ab
-ab
+bt
+bt
ab
aA
aa
@@ -1860,27 +1863,27 @@ aa
aa
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ac
ac
ac
@@ -1888,10 +1891,10 @@ ac
aP
ac
bg
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
ab
aa
aa
@@ -1913,26 +1916,26 @@ aa
aA
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ac
ac
ac
@@ -1940,9 +1943,9 @@ ac
ac
ac
aS
-ab
-ab
-ab
+bt
+bt
+bt
ab
aA
aa
@@ -1966,25 +1969,25 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
bg
ac
ac
@@ -1992,9 +1995,9 @@ ac
ac
ac
aS
-ab
-ab
-ab
+bt
+bt
+bt
ab
aA
aa
@@ -2018,25 +2021,25 @@ aa
aa
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ac
ac
bj
@@ -2044,9 +2047,9 @@ ac
ac
ac
aS
-ab
-ab
-ab
+bt
+bt
+bt
ab
aA
aa
@@ -2071,24 +2074,24 @@ aa
aa
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
aS
bi
ac
@@ -2096,9 +2099,9 @@ ac
ac
aS
aS
-ab
-ab
-ab
+bt
+bt
+bt
ab
aA
aa
@@ -2124,23 +2127,23 @@ aM
aa
aA
ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
aS
ac
ac
@@ -2148,8 +2151,8 @@ ac
ac
aS
aS
-ab
-ab
+bt
+bt
ab
aA
aa
@@ -2176,20 +2179,20 @@ aa
aa
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aS
@@ -2229,18 +2232,18 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aA
@@ -2282,17 +2285,17 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aA
@@ -2335,16 +2338,16 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
aA
aa
@@ -2388,16 +2391,16 @@ aa
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
+bt
ab
ab
aa
@@ -2448,9 +2451,9 @@ ab
ab
ab
ab
-ab
-ab
-ab
+bt
+bt
+bt
ab
aa
aa
@@ -2933,7 +2936,7 @@ aa
aa
aa
aa
-ab
+bt
aa
aa
aa
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 53b12ca0bb..7bec217f62 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -3,44 +3,17 @@
/turf/open/space/basic,
/area/space)
"aab" = (
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = 24
- },
-/obj/structure/table,
-/obj/machinery/chem_dispenser/drinks/beer{
- dir = 8
- },
-/obj/item/radio/intercom{
- pixel_y = 25
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
+/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/turf/open/floor/plating,
+/area/space/nearstation)
"aac" = (
-/obj/machinery/requests_console{
- department = "Bar";
- departmentType = 2;
- pixel_x = 30;
- receive_ore_updates = 1
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
},
-/obj/machinery/camera{
- c_tag = "Bar";
- dir = 8
- },
-/obj/structure/table,
-/obj/machinery/chem_dispenser/drinks{
- dir = 8
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/turf/open/floor/plating,
+/area/space/nearstation)
"aad" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -113,40 +86,30 @@
"aan" = (
/obj/machinery/hydroponics/soil,
/obj/item/seeds/ambrosia,
-/obj/effect/turf_decal/tile/green{
- dir = 1
+/obj/machinery/newscaster{
+ pixel_y = 32
},
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/grass,
/area/security/prison)
"aao" = (
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/turf/open/floor/plating,
+/obj/machinery/hydroponics/soil,
+/obj/item/seeds/carrot,
+/turf/open/floor/grass,
/area/security/prison)
"aap" = (
/obj/machinery/hydroponics/soil,
-/obj/item/seeds/carrot,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
-"aaq" = (
+/obj/item/plant_analyzer,
/obj/structure/sign/warning/electricshock{
pixel_y = 32
},
+/turf/open/floor/grass,
+/area/security/prison)
+"aaq" = (
/obj/machinery/hydroponics/soil,
-/obj/item/plant_analyzer,
+/obj/item/seeds/glowshroom,
+/turf/open/floor/grass,
+/area/security/prison)
+"aar" = (
/obj/machinery/camera{
c_tag = "Prison Common Room";
network = list("ss13","prison")
@@ -158,24 +121,20 @@
/obj/effect/turf_decal/tile/green{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/security/prison)
-"aar" = (
-/obj/machinery/hydroponics/soil,
-/obj/item/seeds/glowshroom,
/obj/effect/turf_decal/tile/green{
- dir = 1
+ dir = 8
},
-/obj/effect/turf_decal/tile/green{
- dir = 4
+/obj/structure/sink{
+ pixel_y = 20
},
/turf/open/floor/plasteel,
/area/security/prison)
"aas" = (
-/obj/structure/sink{
- pixel_y = 20
+/obj/structure/sign/warning/electricshock{
+ pixel_y = 32
},
-/turf/open/floor/plating,
+/obj/machinery/seed_extractor,
+/turf/open/floor/plasteel,
/area/security/prison)
"aat" = (
/turf/open/floor/plasteel,
@@ -194,78 +153,64 @@
/obj/machinery/light{
dir = 8
},
-/turf/open/floor/plating,
+/turf/open/floor/grass,
/area/security/prison)
"aax" = (
-/mob/living/simple_animal/mouse/brown/Tom,
-/turf/open/floor/plating,
+/turf/open/floor/grass,
/area/security/prison)
"aay" = (
/turf/open/floor/plating,
/area/security/prison)
"aaz" = (
/obj/item/reagent_containers/glass/bucket,
-/turf/open/floor/plating,
+/turf/open/floor/grass,
/area/security/prison)
"aaA" = (
-/obj/machinery/seed_extractor,
+/obj/machinery/vr_sleeper{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"aaB" = (
-/obj/structure/window/reinforced,
-/obj/machinery/hydroponics/soil,
-/obj/item/seeds/potato,
+/mob/living/simple_animal/mouse/brown/Tom,
+/turf/open/floor/grass,
+/area/security/prison)
+"aaC" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
/obj/effect/turf_decal/tile/green{
dir = 1
},
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
- dir = 8
+ dir = 4
},
/turf/open/floor/plasteel,
/area/security/prison)
-"aaC" = (
-/obj/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/security/prison)
"aaD" = (
/obj/structure/window/reinforced,
/obj/machinery/hydroponics/soil,
-/obj/item/seeds/grass,
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel,
+/obj/item/seeds/potato,
+/turf/open/floor/grass,
/area/security/prison)
"aaE" = (
/obj/structure/window/reinforced,
/obj/machinery/hydroponics/soil,
-/obj/item/cultivator,
-/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,
+/obj/item/seeds/grass,
+/turf/open/floor/grass,
/area/security/prison)
"aaF" = (
-/obj/structure/window/reinforced,
/obj/machinery/hydroponics/soil,
-/obj/item/cultivator,
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel,
+/obj/structure/window/reinforced,
+/obj/item/seeds/tower,
+/turf/open/floor/grass,
/area/security/prison)
"aaG" = (
/obj/machinery/light{
dir = 4
},
-/obj/machinery/cryopod{
+/obj/machinery/vr_sleeper{
dir = 8
},
/turf/open/floor/plasteel,
@@ -282,77 +227,54 @@
/turf/open/floor/plasteel,
/area/security/prison)
"aaK" = (
-/obj/machinery/washing_machine,
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/security/prison)
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aaL" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/security/prison)
-"aaM" = (
/obj/machinery/computer/libraryconsole/bookmanagement,
/obj/structure/table,
-/obj/machinery/newscaster{
- pixel_x = -32
- },
/turf/open/floor/plasteel,
/area/security/prison)
+"aaM" = (
+/obj/structure/falsewall,
+/turf/open/floor/plating,
+/area/security/prison)
"aaN" = (
-/obj/structure/table,
-/obj/item/pen,
-/turf/open/floor/plasteel,
+/obj/structure/window/reinforced,
+/obj/machinery/hydroponics/soil,
+/obj/item/cultivator,
+/turf/open/floor/grass,
/area/security/prison)
"aaO" = (
-/obj/structure/table,
-/obj/item/storage/pill_bottle/dice,
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"aaP" = (
-/obj/structure/table,
-/obj/structure/bedsheetbin,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
},
+/turf/closed/wall,
+/area/security/execution/transfer)
+"aaQ" = (
/obj/machinery/computer/cryopod{
dir = 8;
pixel_x = 26
},
-/turf/open/floor/plasteel/cafeteria,
-/area/security/prison)
-"aaQ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
+/obj/machinery/cryopod{
dir = 8
},
-/turf/open/floor/plasteel/cafeteria,
+/turf/open/floor/plasteel,
/area/security/prison)
"aaR" = (
/obj/structure/lattice,
@@ -372,50 +294,30 @@
/turf/open/space,
/area/space/nearstation)
"aaU" = (
-/obj/machinery/computer/arcade{
- icon_state = "arcade";
+/obj/machinery/computer/arcade/minesweeper{
dir = 4
},
/turf/open/floor/plasteel,
/area/security/prison)
"aaV" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/pen,
+/obj/structure/chair/sofa/right,
/turf/open/floor/plasteel,
/area/security/prison)
"aaW" = (
-/obj/structure/table,
-/obj/item/toy/cards/deck,
+/obj/structure/chair/sofa/left,
/turf/open/floor/plasteel,
/area/security/prison)
"aaX" = (
-/obj/machinery/washing_machine,
/obj/structure/window/reinforced,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
+/obj/machinery/cryopod{
dir = 8
},
-/turf/open/floor/plasteel/cafeteria,
+/turf/open/floor/plasteel,
/area/security/prison)
"aaY" = (
-/obj/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/security/prison)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall,
+/area/security/execution/transfer)
"aaZ" = (
/turf/closed/wall/r_wall,
/area/ai_monitored/security/armory)
@@ -450,11 +352,11 @@
/turf/open/floor/plasteel,
/area/security/prison)
"abg" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
+/obj/machinery/computer/arcade{
+ dir = 4
},
-/turf/closed/wall/r_wall,
-/area/security/execution/transfer)
+/turf/open/floor/plasteel,
+/area/security/prison)
"abh" = (
/obj/machinery/holopad,
/turf/open/floor/plasteel,
@@ -473,6 +375,7 @@
/obj/structure/window/reinforced{
dir = 8
},
+/obj/machinery/washing_machine,
/turf/open/floor/plasteel/freezer,
/area/security/prison)
"abk" = (
@@ -560,8 +463,7 @@
/area/security/execution/transfer)
"abu" = (
/obj/machinery/door/poddoor{
- id = "executionspaceblast";
- name = "blast door"
+ id = "executionspaceblast"
},
/turf/open/floor/plating,
/area/security/execution/transfer)
@@ -588,8 +490,9 @@
/turf/open/floor/plasteel/dark,
/area/security/execution/transfer)
"abx" = (
-/obj/machinery/vending/cola/random,
-/turf/open/floor/plasteel,
+/obj/structure/bedsheetbin/color,
+/obj/structure/table,
+/turf/open/floor/plasteel/freezer,
/area/security/prison)
"aby" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -616,9 +519,6 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-24"
- },
/turf/open/floor/plasteel,
/area/security/prison)
"abB" = (
@@ -655,7 +555,6 @@
"abG" = (
/obj/machinery/door/window/westleft{
base_state = "right";
- dir = 8;
icon_state = "right";
name = "Unisex Showers"
},
@@ -751,8 +650,7 @@
pixel_y = -3
},
/obj/machinery/camera/motion{
- c_tag = "Armory Motion Sensor";
- dir = 2
+ c_tag = "Armory Motion Sensor"
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -921,7 +819,6 @@
/area/security/execution/transfer)
"acb" = (
/obj/machinery/sparker{
- dir = 2;
id = "executionburn";
pixel_x = 25
},
@@ -1009,8 +906,8 @@
/area/ai_monitored/security/armory)
"acm" = (
/obj/machinery/power/apc/highcap/five_k{
- dir = 4;
areastring = "/area/ai_monitored/security/armory";
+ dir = 4;
name = "Armory APC";
pixel_x = 24
},
@@ -1098,18 +995,14 @@
/turf/open/floor/plasteel/dark,
/area/security/execution/transfer)
"acA" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
- dir = 2
- },
+/obj/machinery/atmospherics/components/unary/outlet_injector/on,
/obj/effect/turf_decal/stripes/line{
dir = 6
},
/turf/open/floor/plasteel/dark,
/area/security/execution/transfer)
"acB" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel/dark,
/area/security/execution/transfer)
"acC" = (
@@ -1120,7 +1013,6 @@
},
/obj/item/radio/intercom{
desc = "Talk through this. It looks like it has been modified to not broadcast.";
- dir = 2;
name = "Prison Intercom (General)";
pixel_y = 24;
prison_radio = 1
@@ -1150,7 +1042,6 @@
},
/obj/item/radio/intercom{
desc = "Talk through this. It looks like it has been modified to not broadcast.";
- dir = 2;
name = "Prison Intercom (General)";
pixel_y = 24;
prison_radio = 1
@@ -1172,7 +1063,6 @@
},
/obj/item/radio/intercom{
desc = "Talk through this. It looks like it has been modified to not broadcast.";
- dir = 2;
name = "Prison Intercom (General)";
pixel_y = 24;
prison_radio = 1
@@ -1211,13 +1101,15 @@
/turf/open/floor/plasteel,
/area/security/prison)
"acK" = (
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
+/obj/structure/mirror{
+ pixel_x = 25
},
/obj/machinery/light/small{
- dir = 4
+ dir = 8
+ },
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 11
},
/turf/open/floor/plasteel/freezer,
/area/security/prison)
@@ -1239,25 +1131,23 @@
pixel_y = -3
},
/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/effect/turf_decal/bot{
- dir = 2
- },
+/obj/effect/turf_decal/bot,
/obj/structure/window/reinforced{
dir = 1;
layer = 2.9
},
-/turf/open/floor/plasteel{
- dir = 2
- },
+/turf/open/floor/plasteel,
/area/ai_monitored/security/armory)
"acN" = (
-/obj/structure/chair/stool/bar,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/structure/table/wood,
+/obj/item/flashlight/lamp/green{
+ on = 0;
+ pixel_x = -7;
+ pixel_y = 12
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"acO" = (
/obj/structure/closet/l3closet/security,
/obj/machinery/camera{
@@ -1278,15 +1168,16 @@
/area/crew_quarters/heads/hos)
"acR" = (
/obj/structure/table/wood,
+/obj/item/paper_bin{
+ pixel_x = -3;
+ pixel_y = 7
+ },
/obj/item/flashlight/lamp/green{
on = 0;
pixel_x = -3;
pixel_y = 8
},
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
+/obj/item/pen/fountain,
/turf/open/floor/carpet,
/area/crew_quarters/heads/hos)
"acS" = (
@@ -1438,9 +1329,7 @@
pixel_x = 3;
pixel_y = -3
},
-/obj/effect/turf_decal/bot{
- dir = 2
- },
+/obj/effect/turf_decal/bot,
/obj/structure/window/reinforced{
dir = 1;
layer = 2.9
@@ -1448,9 +1337,7 @@
/obj/structure/window/reinforced{
dir = 4
},
-/turf/open/floor/plasteel{
- dir = 2
- },
+/turf/open/floor/plasteel,
/area/ai_monitored/security/armory)
"adk" = (
/obj/structure/rack,
@@ -1463,9 +1350,7 @@
pixel_x = 3;
pixel_y = -3
},
-/obj/effect/turf_decal/bot{
- dir = 2
- },
+/obj/effect/turf_decal/bot,
/obj/structure/window/reinforced{
dir = 1;
layer = 2.9
@@ -1473,9 +1358,7 @@
/obj/structure/window/reinforced{
dir = 8
},
-/turf/open/floor/plasteel{
- dir = 2
- },
+/turf/open/floor/plasteel,
/area/ai_monitored/security/armory)
"adl" = (
/obj/machinery/door/poddoor/shutters{
@@ -1514,15 +1397,12 @@
/turf/open/floor/carpet,
/area/crew_quarters/heads/hos)
"adq" = (
-/obj/structure/table/wood,
-/obj/item/instrument/guitar{
- pixel_x = -7
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/item/instrument/eguitar{
- pixel_x = 5
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
+/turf/open/floor/plating,
+/area/maintenance/fore/secondary)
"adr" = (
/obj/structure/sign/warning/vacuum/external{
pixel_x = -32
@@ -1700,9 +1580,7 @@
/area/security/prison)
"adK" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/ai_monitored/security/armory)
"adL" = (
@@ -1731,8 +1609,8 @@
/area/crew_quarters/heads/hos)
"adN" = (
/obj/machinery/power/apc{
- dir = 8;
areastring = "/area/crew_quarters/heads/hos";
+ dir = 8;
name = "Head of Security's Office APC";
pixel_x = -24
},
@@ -1743,8 +1621,11 @@
/turf/open/floor/carpet,
/area/crew_quarters/heads/hos)
"adO" = (
-/obj/structure/chair/stool,
/obj/effect/landmark/event_spawn,
+/obj/structure/chair/comfy/brown{
+ color = "#596479";
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"adP" = (
@@ -1755,9 +1636,7 @@
/turf/open/floor/carpet,
/area/crew_quarters/heads/hos)
"adQ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/ai_monitored/security/armory)
"adR" = (
@@ -2040,13 +1919,12 @@
/area/security/prison)
"aer" = (
/obj/machinery/firealarm{
- dir = 2;
pixel_y = 24
},
/obj/machinery/power/apc{
+ areastring = "/area/security/prison";
dir = 4;
name = "Prison Wing APC";
- areastring = "/area/security/prison";
pixel_x = 24
},
/obj/structure/cable{
@@ -2065,7 +1943,6 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/suit_storage_unit/security,
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
@@ -2082,7 +1959,6 @@
/obj/structure/cable{
icon_state = "1-8"
},
-/obj/machinery/suit_storage_unit/security,
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
@@ -2145,7 +2021,8 @@
"aeB" = (
/obj/structure/table,
/obj/item/stack/packageWrap,
-/obj/item/pen,
+/obj/item/stack/packageWrap,
+/obj/item/hand_labeler,
/turf/open/floor/plasteel,
/area/security/main)
"aeC" = (
@@ -2444,8 +2321,6 @@
/area/security/main)
"afd" = (
/obj/item/radio/intercom{
- freerange = 0;
- frequency = 1459;
name = "Station Intercom (General)";
pixel_x = 29
},
@@ -2553,7 +2428,7 @@
/turf/open/floor/plasteel,
/area/security/main)
"afn" = (
-/obj/structure/table,
+/obj/machinery/suit_storage_unit/security,
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"afo" = (
@@ -2924,9 +2799,8 @@
/obj/structure/closet/secure_closet/injection,
/obj/structure/cable,
/obj/machinery/power/apc{
- dir = 2;
- name = "Prisoner Transfer Centre";
areastring = "/area/security/execution/transfer";
+ name = "Prisoner Transfer Centre";
pixel_y = -27
},
/turf/open/floor/plasteel/dark,
@@ -3034,9 +2908,7 @@
icon_state = "2-4"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/ai_monitored/security/armory)
"agr" = (
@@ -3054,12 +2926,11 @@
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"agu" = (
-/obj/structure/table,
-/obj/machinery/recharger,
/obj/machinery/airalarm{
dir = 8;
pixel_x = 24
},
+/obj/machinery/suit_storage_unit/security,
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"agv" = (
@@ -3085,6 +2956,7 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/machinery/syndicatebomb/training,
/turf/open/floor/plasteel,
/area/security/main)
"agx" = (
@@ -3159,8 +3031,13 @@
/area/security/brig)
"agE" = (
/obj/structure/table,
-/obj/item/folder/red,
-/obj/item/pen,
+/obj/item/storage/fancy/donut_box{
+ pixel_y = 10
+ },
+/obj/item/storage/fancy/donut_box,
+/obj/item/storage/fancy/donut_box{
+ pixel_y = -10
+ },
/turf/open/floor/plasteel,
/area/security/main)
"agF" = (
@@ -3334,8 +3211,11 @@
/turf/open/floor/plating,
/area/security/warden)
"agX" = (
-/obj/structure/table,
-/obj/machinery/recharger,
+/obj/structure/closet/secure_closet/warden,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/item/book/manual/wiki/security_space_law,
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"agY" = (
@@ -3402,14 +3282,21 @@
/turf/open/floor/plasteel,
/area/security/main)
"ahh" = (
+/obj/item/paper_bin/bundlenatural{
+ pixel_x = 6;
+ pixel_y = 4
+ },
+/obj/item/paper_bin{
+ pixel_x = -6;
+ pixel_y = 4
+ },
+/obj/item/pen/fountain,
+/obj/item/folder/red,
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/item/pen,
/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
/turf/open/floor/plasteel,
/area/security/main)
"ahi" = (
@@ -3517,8 +3404,6 @@
/area/security/brig)
"ahs" = (
/obj/item/radio/intercom{
- freerange = 0;
- frequency = 1459;
name = "Station Intercom (General)";
pixel_y = 24
},
@@ -3563,9 +3448,9 @@
/area/security/brig)
"ahv" = (
/obj/machinery/power/apc{
+ areastring = "/area/security/warden";
dir = 8;
name = "Brig Control APC";
- areastring = "/area/security/warden";
pixel_x = -24
},
/obj/structure/cable{
@@ -3649,9 +3534,7 @@
/area/security/main)
"ahD" = (
/obj/machinery/door/window/westleft{
- base_state = "left";
dir = 4;
- icon_state = "left";
name = "Brig Infirmary"
},
/obj/effect/turf_decal/tile/red,
@@ -3784,9 +3667,9 @@
/area/security/main)
"ahN" = (
/obj/machinery/power/apc{
+ areastring = "/area/security/main";
dir = 4;
name = "Security Office APC";
- areastring = "/area/security/main";
pixel_x = 24
},
/obj/structure/cable{
@@ -3809,9 +3692,17 @@
/turf/open/floor/plasteel/white,
/area/security/brig)
"ahQ" = (
-/obj/structure/closet/secure_closet/warden,
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/table,
+/obj/machinery/recharger{
+ pixel_x = -6;
+ pixel_y = 3
+ },
+/obj/machinery/recharger{
+ pixel_x = 6;
+ pixel_y = 3
},
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
@@ -3966,16 +3857,11 @@
/turf/open/floor/plasteel/white,
/area/security/brig)
"aie" = (
-/obj/structure/table,
-/obj/item/folder/red,
-/obj/item/pen,
-/obj/item/hand_labeler,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/item/book/manual/wiki/security_space_law,
-/turf/open/floor/plasteel/showroomfloor,
-/area/security/warden)
+/obj/structure/closet/wardrobe/mixed,
+/obj/item/clothing/shoes/jackboots,
+/obj/item/coin/silver,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"aif" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -4475,7 +4361,6 @@
"aje" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/machinery/firealarm{
- dir = 2;
pixel_y = 24
},
/obj/effect/turf_decal/tile/red{
@@ -4535,8 +4420,6 @@
/area/security/courtroom)
"ajj" = (
/obj/item/radio/intercom{
- broadcasting = 0;
- listening = 1;
name = "Station Intercom (General)";
pixel_y = 20
},
@@ -4590,10 +4473,10 @@
/turf/open/floor/plasteel/dark,
/area/security/courtroom)
"ajq" = (
+/obj/structure/lattice/catwalk,
/obj/structure/cable{
icon_state = "0-2"
},
-/obj/structure/lattice/catwalk,
/turf/open/space,
/area/solar/port/fore)
"ajr" = (
@@ -4643,7 +4526,6 @@
/area/security/brig)
"ajx" = (
/obj/machinery/firealarm{
- dir = 2;
pixel_y = 24
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -4660,9 +4542,9 @@
/area/security/brig)
"ajy" = (
/obj/machinery/power/apc{
+ areastring = "/area/security/brig";
dir = 1;
name = "Brig APC";
- areastring = "/area/security/brig";
pixel_y = 24
},
/obj/structure/cable{
@@ -4740,9 +4622,7 @@
/area/security/courtroom)
"ajF" = (
/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/obj/effect/turf_decal/tile/red{
- dir = 2
- },
+/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel,
/area/security/brig)
"ajG" = (
@@ -4824,9 +4704,7 @@
"ajO" = (
/obj/structure/table/wood,
/obj/item/radio/intercom{
- broadcasting = 0;
dir = 8;
- listening = 1;
name = "Station Intercom (Court)"
},
/obj/effect/turf_decal/tile/neutral{
@@ -5027,9 +4905,7 @@
dir = 1
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/effect/turf_decal/tile/red{
- dir = 2
- },
+/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel,
/area/security/brig)
"akh" = (
@@ -5077,9 +4953,7 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
-/obj/effect/turf_decal/tile/red{
- dir = 2
- },
+/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel,
/area/security/brig)
"akl" = (
@@ -5582,10 +5456,10 @@
/turf/open/floor/plasteel,
/area/security/brig)
"alg" = (
+/obj/structure/lattice/catwalk,
/obj/structure/cable{
icon_state = "0-2"
},
-/obj/structure/lattice/catwalk,
/turf/open/space,
/area/solar/starboard/fore)
"alh" = (
@@ -5703,7 +5577,6 @@
},
/obj/item/radio/intercom{
desc = "Talk through this. It looks like it has been modified to not broadcast.";
- dir = 2;
name = "Prison Intercom (General)";
pixel_x = -25;
pixel_y = -2;
@@ -5738,7 +5611,6 @@
},
/obj/item/radio/intercom{
desc = "Talk through this. It looks like it has been modified to not broadcast.";
- dir = 2;
name = "Prison Intercom (General)";
pixel_x = -25;
pixel_y = -2;
@@ -5815,9 +5687,7 @@
/turf/open/floor/plasteel,
/area/security/brig)
"alF" = (
-/obj/machinery/atmospherics/components/unary/tank/air{
- dir = 2
- },
+/obj/machinery/atmospherics/components/unary/tank/air,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"alG" = (
@@ -5862,22 +5732,25 @@
/turf/open/floor/plasteel,
/area/security/courtroom)
"alK" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/button/door{
+ id = "Room Two";
+ name = "Door Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 7;
+ pixel_y = -24;
+ specialfunctions = 4
},
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/structure/chair/comfy/brown{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"alL" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/power/apc{
+ areastring = "/area/security/courtroom";
dir = 8;
name = "Courtroom APC";
- areastring = "/area/security/courtroom";
pixel_x = -24
},
/obj/structure/cable{
@@ -5905,14 +5778,8 @@
/turf/open/floor/plasteel,
/area/security/prison)
"alN" = (
-/obj/machinery/camera{
- c_tag = "Dormitory Toilets";
- dir = 1
- },
-/obj/structure/table,
-/obj/structure/bedsheetbin/towel,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
+/turf/open/space/basic,
+/area/space/nearstation)
"alO" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -5923,8 +5790,7 @@
"alQ" = (
/obj/machinery/power/solar_control{
id = "auxsolareast";
- name = "Port Bow Solar Control";
- track = 0
+ name = "Port Bow Solar Control"
},
/obj/structure/cable{
icon_state = "0-4"
@@ -6001,7 +5867,7 @@
pixel_y = -2
},
/obj/machinery/firealarm{
- dir = 4;
+ dir = 8;
pixel_x = 24
},
/turf/open/floor/plasteel,
@@ -6026,17 +5892,23 @@
/turf/open/floor/plasteel,
/area/security/processing)
"amd" = (
-/obj/effect/turf_decal/tile/red{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/button/door{
+ desc = "Bolts the doors to the Private Study.";
+ id = "PrivateStudy";
+ name = "Private Study Lock";
+ pixel_x = -5;
+ pixel_y = 24;
+ req_access_txt = "28"
},
-/obj/machinery/computer/arcade{
- icon_state = "arcade";
- dir = 4
+/obj/machinery/button/door{
+ id = "PrivateStudy1";
+ name = "Privacy Shutters";
+ pixel_x = 5;
+ pixel_y = 24
},
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/hallway/secondary/exit)
+/turf/open/floor/wood,
+/area/library)
"ame" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -6048,7 +5920,6 @@
/area/security/processing)
"amf" = (
/obj/structure/bed,
-/obj/item/bedsheet,
/obj/structure/cable{
icon_state = "1-2"
},
@@ -6056,6 +5927,7 @@
id = "Cell 1";
pixel_x = -28
},
+/obj/item/bedsheet/orange,
/turf/open/floor/plasteel,
/area/security/brig)
"amg" = (
@@ -6067,11 +5939,11 @@
/area/security/brig)
"amh" = (
/obj/structure/bed,
-/obj/item/bedsheet,
/obj/machinery/flasher{
id = "Cell 2";
pixel_x = -28
},
+/obj/item/bedsheet/orange,
/turf/open/floor/plasteel,
/area/security/brig)
"ami" = (
@@ -6083,11 +5955,11 @@
/area/security/brig)
"amj" = (
/obj/structure/bed,
-/obj/item/bedsheet,
/obj/machinery/flasher{
id = "Cell 3";
pixel_x = -28
},
+/obj/item/bedsheet/orange,
/turf/open/floor/plasteel,
/area/security/brig)
"amk" = (
@@ -6170,7 +6042,6 @@
/obj/item/bedsheet,
/obj/item/radio/intercom{
desc = "Talk through this. It looks like it has been modified to not broadcast.";
- dir = 2;
name = "Prison Intercom (General)";
pixel_x = 25;
pixel_y = -2;
@@ -6216,11 +6087,8 @@
/turf/open/floor/plating,
/area/maintenance/solars/starboard/fore)
"amx" = (
-/obj/structure/chair{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/turf/closed/wall,
+/area/crew_quarters/abandoned_gambling_den)
"amy" = (
/obj/structure/chair/stool{
pixel_y = 8
@@ -6244,16 +6112,18 @@
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
"amB" = (
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/machinery/computer/arcade{
- icon_state = "arcade";
- dir = 1
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore/secondary)
"amC" = (
/turf/open/floor/plating,
/area/maintenance/port/fore)
@@ -6300,6 +6170,29 @@
/obj/item/trash/plate,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"amI" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 4;
+ name = "Air In"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore/secondary)
+"amJ" = (
+/obj/structure/mirror{
+ pixel_y = 32
+ },
+/obj/structure/sink{
+ dir = 1;
+ pixel_y = 25
+ },
+/obj/structure/toilet{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/dorms)
"amK" = (
/obj/structure/sign/warning/docking,
/turf/closed/wall,
@@ -6320,6 +6213,19 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/security/processing)
+"amN" = (
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
+"amO" = (
+/obj/machinery/shower{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/dorms)
+"amP" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall,
+/area/crew_quarters/dorms)
"amQ" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -6465,18 +6371,21 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"anc" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/shower{
+ dir = 4
},
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
+/obj/item/soap,
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/dorms)
"and" = (
/obj/machinery/light/small{
dir = 4
},
/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 2;
+ name = "2maintenance loot spawner"
+ },
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"ane" = (
@@ -6493,9 +6402,9 @@
icon_state = "0-4"
},
/obj/machinery/power/apc{
+ areastring = "/area/maintenance/solars/port/fore";
dir = 8;
name = "Port Bow Solar APC";
- areastring = "/area/maintenance/solars/port/fore";
pixel_x = -25;
pixel_y = 3
},
@@ -6566,6 +6475,13 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"anq" = (
+/obj/structure/sign/poster/official/twelve_gauge,
+/turf/closed/wall/r_wall,
+/area/ai_monitored/security/armory)
+"anr" = (
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/dorms)
"ans" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -6679,15 +6595,11 @@
/turf/open/floor/plating,
/area/security/courtroom)
"anD" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
},
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"anE" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
@@ -6733,6 +6645,16 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"anM" = (
+/obj/structure/window/reinforced/tinted{
+ dir = 8
+ },
+/obj/structure/window/reinforced/tinted{
+ dir = 4
+ },
+/obj/structure/curtain,
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/dorms)
"anN" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
@@ -6879,8 +6801,7 @@
"aoh" = (
/obj/machinery/power/solar_control{
id = "auxsolareast";
- name = "Starboard Bow Solar Control";
- track = 0
+ name = "Starboard Bow Solar Control"
},
/obj/structure/cable{
icon_state = "0-4"
@@ -6932,6 +6853,9 @@
/obj/item/circuitboard/machine/monkey_recycler,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"aop" = (
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/toilet)
"aoq" = (
/obj/structure/sign/warning/vacuum/external{
pixel_y = -32
@@ -7026,9 +6950,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"aoz" = (
-/obj/effect/turf_decal/tile/red{
- dir = 2
- },
+/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"aoA" = (
@@ -7037,9 +6959,7 @@
pixel_y = -29
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/red{
- dir = 2
- },
+/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"aoB" = (
@@ -7047,16 +6967,12 @@
dir = 1;
pixel_y = -24
},
-/obj/effect/turf_decal/tile/red{
- dir = 2
- },
+/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"aoC" = (
/obj/machinery/vending/coffee,
-/obj/effect/turf_decal/tile/red{
- dir = 2
- },
+/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"aoD" = (
@@ -7068,23 +6984,17 @@
pixel_x = 5;
pixel_y = -32
},
-/obj/effect/turf_decal/tile/red{
- dir = 2
- },
+/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"aoE" = (
/obj/machinery/vending/cigarette,
-/obj/effect/turf_decal/tile/red{
- dir = 2
- },
+/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"aoF" = (
/obj/machinery/vending/snack/random,
-/obj/effect/turf_decal/tile/red{
- dir = 2
- },
+/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"aoG" = (
@@ -7104,27 +7014,9 @@
/turf/open/floor/plasteel/dark,
/area/security/courtroom)
"aoI" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/power/apc{
- dir = 2;
- name = "Fitness Room APC";
- areastring = "/area/crew_quarters/fitness";
- pixel_y = -24
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
+/obj/structure/fireplace,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"aoJ" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
@@ -7219,6 +7111,26 @@
/obj/structure/closet/emcloset,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"aoY" = (
+/obj/structure/sign/warning/fire{
+ desc = "A sign that states the labeled room's number.";
+ dir = 10;
+ icon_state = "roomnum";
+ name = "Room Number 6";
+ pixel_y = 24
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/washing_machine{
+ pixel_x = 7;
+ pixel_y = 7
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aoZ" = (
/obj/machinery/atmospherics/components/binary/valve/digital{
name = "Waste Release"
@@ -7334,9 +7246,9 @@
icon_state = "0-2"
},
/obj/machinery/power/apc{
+ areastring = "/area/maintenance/fore/secondary";
dir = 1;
name = "Fore Maintenance APC";
- areastring = "/area/maintenance/fore/secondary";
pixel_y = 24
},
/obj/structure/disposalpipe/segment{
@@ -7367,38 +7279,23 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"apu" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/closet/secure_closet/personal/cabinet{
+ desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here.";
+ name = "Personal ID-Locked Closet";
+ pixel_y = 15
},
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"apv" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Fitness Maintenance";
- req_access_txt = "12"
- },
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/space/nearstation)
+"apw" = (
/obj/structure/cable{
icon_state = "1-2"
},
/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"apw" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 4;
- name = "Air In"
- },
-/obj/effect/landmark/blobstart,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"apx" = (
@@ -7435,9 +7332,9 @@
icon_state = "0-4"
},
/obj/machinery/power/apc{
+ areastring = "/area/maintenance/solars/starboard/fore";
dir = 8;
name = "Starboard Bow Solar APC";
- areastring = "/area/maintenance/solars/starboard/fore";
pixel_x = -25;
pixel_y = 3
},
@@ -7458,8 +7355,9 @@
/turf/closed/wall/r_wall,
/area/maintenance/starboard/fore)
"apD" = (
-/obj/structure/closet/wardrobe/mixed,
-/obj/item/clothing/shoes/jackboots,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/machinery/computer/slot_machine,
+/obj/item/coin/iron,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"apE" = (
@@ -7475,6 +7373,15 @@
/obj/machinery/portable_atmospherics/canister/water_vapor,
/turf/open/floor/plasteel,
/area/janitor)
+"apH" = (
+/obj/machinery/door/airlock{
+ desc = "A small bathroom with a sink, toilet and shower.";
+ id_tag = "Bath1";
+ name = "Bathroom"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/toilet)
"apI" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{
dir = 1
@@ -7485,6 +7392,12 @@
"apJ" = (
/turf/closed/wall,
/area/construction/mining/aux_base)
+"apK" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/space/nearstation)
"apL" = (
/obj/structure/table,
/obj/effect/spawner/lootdrop/maintenance{
@@ -7513,6 +7426,14 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"apQ" = (
+/obj/machinery/door/airlock{
+ desc = "A small bathroom with a sink, toilet and shower.";
+ id_tag = "Bath2";
+ name = "Bathroom"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/toilet)
"apR" = (
/obj/item/paper/fluff/jobs/security/beepsky_mom,
/turf/open/floor/plating,
@@ -7523,6 +7444,18 @@
},
/turf/open/floor/plating,
/area/maintenance/fore)
+"apT" = (
+/obj/structure/lattice/catwalk,
+/obj/item/stack/marker_beacon{
+ anchored = 1;
+ icon_state = "markerburgundy-on";
+ light_power = 3;
+ light_range = 3;
+ name = "Docking Beacon";
+ picked_color = "Burgundy"
+ },
+/turf/open/space/basic,
+/area/space/nearstation)
"apU" = (
/turf/open/floor/plating,
/area/security/vacantoffice/b)
@@ -7539,13 +7472,21 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"apX" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/crew_quarters/fitness)
-"apY" = (
-/obj/structure/closet/secure_closet/personal,
+/obj/structure/bed,
+/obj/item/bedsheet/random,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
+"apY" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "maintdiy";
+ name = "Security Shutters"
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/abandoned_gambling_den)
"apZ" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
@@ -7553,12 +7494,9 @@
/turf/open/floor/wood,
/area/lawoffice)
"aqa" = (
-/obj/structure/table,
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
+/obj/machinery/recharge_station,
+/turf/open/floor/plating,
+/area/maintenance/fore/secondary)
"aqb" = (
/obj/structure/rack,
/obj/item/storage/briefcase,
@@ -7639,9 +7577,8 @@
/area/maintenance/fore/secondary)
"aqk" = (
/obj/machinery/power/apc{
- dir = 2;
- name = "Dormitory APC";
areastring = "/area/crew_quarters/dorms";
+ name = "Dormitory APC";
pixel_y = -24
},
/obj/structure/cable{
@@ -7653,32 +7590,22 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"aql" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
+/obj/structure/mirror{
+ pixel_y = 32
},
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/structure/sink{
+ dir = 1;
+ pixel_y = 25
},
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"aqm" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/machinery/light/small{
dir = 4
},
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/dorms)
+"aqm" = (
+/obj/structure/chair/sofa/right,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"aqn" = (
/obj/structure/bed,
/obj/machinery/airalarm{
@@ -7698,11 +7625,25 @@
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"aqo" = (
-/obj/structure/chair/stool{
- pixel_y = 8
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/crew_quarters/fitness";
+ name = "Fitness Room APC";
+ pixel_y = -24
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore/secondary)
"aqp" = (
/obj/structure/rack,
/obj/item/clothing/suit/fire/firefighter,
@@ -7727,24 +7668,45 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"aqr" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore/secondary)
+"aqs" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "holoprivacy";
+ name = "Holodeck Shutters"
+ },
/turf/open/floor/plating,
/area/crew_quarters/fitness)
-"aqs" = (
+"aqt" = (
+/obj/machinery/door/airlock{
+ desc = "A small bathroom with a sink, toilet and shower.";
+ id_tag = "Bath3";
+ name = "Bathroom"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/toilet)
+"aqu" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/crew_quarters/fitness)
-"aqu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "holoprivacy";
+ name = "Holodeck Shutters"
},
-/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/crew_quarters/fitness)
"aqv" = (
@@ -7788,26 +7750,47 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aqB" = (
-/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/structure/table/glass,
+/obj/item/paper_bin{
+ pixel_x = -3;
+ pixel_y = 7
+ },
+/obj/item/pen,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aqC" = (
-/obj/machinery/computer/slot_machine{
- balance = 15;
- money = 500
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/structure/chair/comfy/brown{
+ dir = 4
},
-/obj/item/coin/iron,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"aqD" = (
-/obj/effect/decal/cleanable/cobweb,
-/obj/item/coin/gold,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"aqE" = (
-/obj/effect/landmark/xeno_spawn,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/obj/item/flashlight/lamp/green{
+ pixel_x = -3;
+ pixel_y = 22
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4;
+ pixel_y = 5
+ },
+/obj/structure/dresser{
+ desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too.";
+ name = "Dresser";
+ pixel_y = 7
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
+"aqF" = (
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"aqG" = (
/obj/docking_port/stationary/random{
dir = 4;
@@ -7816,6 +7799,28 @@
},
/turf/open/space,
/area/space/nearstation)
+"aqH" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore/secondary)
+"aqI" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore/secondary)
"aqJ" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/door/airlock/external{
@@ -7841,19 +7846,25 @@
/obj/machinery/meter,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"aqN" = (
+/obj/structure/toilet{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/dorms)
"aqO" = (
/obj/structure/closet,
/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
+ lootcount = 3;
+ name = "3maintenance loot spawner"
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
"aqP" = (
/obj/machinery/power/apc{
+ areastring = "/area/maintenance/port/fore";
dir = 1;
name = "Port Bow Maintenance APC";
- areastring = "/area/maintenance/port/fore";
pixel_x = -1;
pixel_y = 26
},
@@ -7882,9 +7893,9 @@
/area/security/processing)
"aqT" = (
/obj/machinery/power/apc{
+ areastring = "/area/security/processing";
dir = 8;
name = "Labor Shuttle Dock APC";
- areastring = "/area/security/processing";
pixel_x = -24
},
/obj/structure/cable,
@@ -7893,6 +7904,14 @@
},
/turf/open/floor/plating,
/area/maintenance/fore)
+"aqU" = (
+/obj/structure/closet/secure_closet/personal{
+ desc = "Swipe your ID on this locker to claim it. You can drag it around and use it as your own personal storage area. Very useful.";
+ name = "Personal ID-Locked Locker";
+ pixel_y = 10
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"aqV" = (
/obj/structure/table/wood,
/obj/item/paper_bin{
@@ -7961,6 +7980,13 @@
"arf" = (
/turf/closed/wall,
/area/crew_quarters/dorms)
+"arg" = (
+/obj/machinery/hydroponics/constructable,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/hydroponics)
"arh" = (
/obj/machinery/door/airlock/maintenance{
name = "Dormitories Maintenance";
@@ -7970,60 +7996,49 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"ari" = (
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/structure/closet/secure_closet/personal/cabinet,
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
-"arj" = (
-/turf/closed/wall,
-/area/crew_quarters/fitness)
-"ark" = (
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/structure/closet/secure_closet/personal/cabinet,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
-"arl" = (
-/obj/structure/disposalpipe/junction/flip{
- dir = 2
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/light/small{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
+"arj" = (
+/obj/machinery/door/airlock{
+ id_tag = "Room Two";
+ name = "Room Seven - Luxury Suite"
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"arm" = (
+/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/dorms)
+"ark" = (
+/obj/structure/bed,
+/obj/item/bedsheet/random,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
+"arl" = (
+/obj/structure/sign/poster/official/ion_rifle,
+/turf/closed/wall/r_wall,
+/area/ai_monitored/security/armory)
+"arm" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "holoprivacy";
+ name = "Holodeck Shutters"
+ },
/turf/open/floor/plating,
/area/crew_quarters/fitness)
"arn" = (
-/obj/structure/closet/athletic_mixed,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/turf/open/floor/plating,
+/area/maintenance/fore/secondary)
"aro" = (
/turf/open/floor/engine{
name = "Holodeck Projector Floor"
@@ -8046,35 +8061,31 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"arr" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/structure/disposalpipe/segment,
+/obj/machinery/door/airlock/maintenance{
+ name = "Dormitories Maintenance";
+ req_access_txt = "12"
},
/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/area/maintenance/fore/secondary)
"ars" = (
-/obj/machinery/power/apc{
- dir = 1;
- name = "Starboard Bow Maintenance APC";
- areastring = "/area/maintenance/starboard/fore";
- pixel_y = 24
+/obj/item/flashlight/lamp/green{
+ pixel_x = -3;
+ pixel_y = 22
},
-/obj/structure/cable{
- icon_state = "0-4"
+/obj/structure/dresser{
+ desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too.";
+ name = "Dresser";
+ pixel_y = 7
},
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"art" = (
-/obj/machinery/light/small{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
},
-/obj/machinery/camera{
- c_tag = "Fore Starboard Solar Access"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
"aru" = (
/obj/structure/chair/stool,
/turf/open/floor/plating,
@@ -8099,11 +8110,11 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"ary" = (
-/obj/structure/closet,
-/obj/item/coin/iron,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"arz" = (
/obj/item/coin/gold,
/obj/item/coin/iron,
@@ -8112,11 +8123,26 @@
"arA" = (
/obj/structure/closet,
/obj/effect/spawner/lootdrop/maintenance,
+/obj/item/coin/plasma,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"arB" = (
/turf/closed/wall/r_wall,
/area/hallway/secondary/entry)
+"arC" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"arD" = (
+/obj/item/radio/intercom{
+ dir = 4;
+ name = "Station Intercom (General)";
+ pixel_x = 27
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"arE" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/effect/turf_decal/tile/yellow{
@@ -8204,14 +8230,27 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"arO" = (
-/obj/machinery/monkey_recycler,
-/obj/item/reagent_containers/food/snacks/monkeycube,
-/obj/item/reagent_containers/food/snacks/monkeycube,
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/chair/sofa,
+/obj/item/radio/intercom{
+ pixel_y = 25
+ },
+/obj/effect/landmark/start/assistant,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
"arP" = (
/turf/closed/wall,
/area/maintenance/fore)
+"arQ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"arR" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/structure/table/wood,
@@ -8235,7 +8274,7 @@
},
/obj/structure/filingcabinet/employment,
/obj/machinery/firealarm{
- dir = 8;
+ dir = 4;
pixel_x = -24
},
/turf/open/floor/wood,
@@ -8284,14 +8323,15 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"asb" = (
-/obj/structure/disposalpipe/trunk{
- dir = 8
+/obj/structure/sign/warning/fire{
+ desc = "A sign that states the labeled room's number.";
+ dir = 5;
+ icon_state = "roomnum";
+ name = "Room Number 7";
+ pixel_y = 24
},
-/obj/machinery/disposal/bin,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/structure/chair/sofa/right,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel,
@@ -8335,20 +8375,11 @@
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"asg" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+/obj/structure/chair{
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
- },
/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/area/crew_quarters/fitness)
"ash" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -8381,23 +8412,29 @@
/turf/open/floor/plating,
/area/security/vacantoffice/b)
"ask" = (
-/obj/structure/dresser,
+/obj/machinery/light/small{
+ dir = 4;
+ light_color = "#d8b1b1"
+ },
/turf/open/floor/wood,
/area/crew_quarters/dorms)
"asl" = (
/obj/machinery/firealarm{
- dir = 4;
+ dir = 8;
pixel_x = 24
},
/turf/open/floor/plating,
/area/security/vacantoffice/b)
"asm" = (
-/obj/machinery/light/small{
- dir = 1
+/obj/structure/closet/secure_closet/bar{
+ req_access_txt = "25"
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/item/clothing/under/waiter,
+/obj/item/clothing/under/waiter,
+/obj/item/clothing/under/waiter,
+/obj/item/gun/ballistic/revolver/doublebarrel,
/turf/open/floor/wood,
-/area/crew_quarters/dorms)
+/area/crew_quarters/bar)
"asn" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plating,
@@ -8414,69 +8451,41 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"asp" = (
-/obj/structure/table/wood,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/vending/wardrobe/bar_wardrobe,
/turf/open/floor/wood,
-/area/crew_quarters/dorms)
+/area/crew_quarters/bar)
"asq" = (
-/obj/machinery/camera{
- c_tag = "Fitness Room"
+/obj/machinery/light,
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -24
},
-/obj/structure/closet/masks,
-/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
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"asr" = (
-/obj/structure/closet/boxinggloves,
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/item/clothing/shoes/jackboots,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/drinks/soda_cans/starkist{
+ pixel_x = -3;
+ pixel_y = 5
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"ass" = (
-/obj/structure/closet/lasertag/red,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/door/airlock/external{
+ name = "External Access";
+ req_access_txt = "13"
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"ast" = (
-/obj/structure/closet/lasertag/blue,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/machinery/airalarm{
+ pixel_y = 23
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/obj/structure/chair/sofa/left,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"asu" = (
/obj/structure/bed,
/obj/machinery/button/door{
@@ -8496,6 +8505,9 @@
lootcount = 3;
name = "3maintenance loot spawner"
},
+/obj/structure/light_construct{
+ dir = 8
+ },
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"asw" = (
@@ -8531,6 +8543,10 @@
"asC" = (
/turf/open/floor/plasteel/airless,
/area/space/nearstation)
+"asD" = (
+/obj/machinery/light,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"asE" = (
/turf/closed/wall,
/area/hallway/secondary/entry)
@@ -8538,6 +8554,13 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/construction/mining/aux_base)
+"asG" = (
+/obj/machinery/camera{
+ c_tag = "Bar South";
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"asH" = (
/obj/structure/closet/toolcloset,
/obj/effect/turf_decal/tile/yellow{
@@ -8582,40 +8605,30 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"asL" = (
-/obj/structure/bed,
-/obj/machinery/button/door{
- id = "Dorm6";
- name = "Cabin Bolt Control";
- normaldoorcontrol = 1;
- pixel_y = -25;
- specialfunctions = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/space/nearstation)
"asM" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
+/obj/structure/cable{
+ icon_state = "1-2"
},
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "2-4"
},
-/obj/effect/turf_decal/tile/neutral{
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
+"asN" = (
+/obj/machinery/light/small{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/obj/machinery/camera{
+ c_tag = "Fore Starboard Solar Access"
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"asN" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"asO" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
@@ -8643,48 +8656,64 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"asU" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 8;
+ name = "8maintenance loot spawner"
+ },
/turf/open/floor/plasteel,
/area/security/vacantoffice/b)
"asV" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
+/obj/machinery/power/apc{
+ areastring = "/area/maintenance/starboard/fore";
+ dir = 1;
+ name = "Starboard Bow Maintenance APC";
+ pixel_y = 24
},
/obj/structure/cable{
- icon_state = "2-8"
+ icon_state = "0-8"
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"asW" = (
-/obj/machinery/light/small{
- dir = 8
+/obj/structure/table/wood,
+/obj/item/storage/box/evidence,
+/obj/item/hand_labeler{
+ pixel_x = 5
},
-/obj/structure/rack,
-/obj/item/storage/briefcase,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/item/taperecorder,
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
"asX" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/item/radio/intercom{
+ pixel_y = 25
+ },
/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/area/crew_quarters/dorms)
"asY" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "holoprivacy";
+ name = "Holodeck Shutters"
},
/turf/open/floor/plating,
/area/crew_quarters/fitness)
"asZ" = (
+/obj/structure/chair/sofa/left,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/vr_sleeper,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
+ dir = 10
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
@@ -8725,23 +8754,23 @@
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"atf" = (
-/obj/structure/chair/stool{
- pixel_y = 8
+/obj/machinery/camera{
+ c_tag = "Bar Storage"
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
+/obj/structure/sink/kitchen{
+ pixel_y = 28
},
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"atg" = (
/obj/machinery/door/airlock{
id_tag = "Dorm4";
- name = "Dorm 4"
+ name = "Room Three"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark,
/area/crew_quarters/dorms)
"ath" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -8772,6 +8801,17 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
+"atk" = (
+/obj/machinery/light/small,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"atl" = (
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -23
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"atm" = (
/turf/open/floor/wood,
/area/crew_quarters/dorms)
@@ -8816,7 +8856,13 @@
/turf/open/floor/plating,
/area/security/vacantoffice/b)
"att" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/table/wood/fancy,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/item/reagent_containers/food/drinks/britcup{
+ desc = "Kingston's personal cup.";
+ pixel_x = 5;
+ pixel_y = 5
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"atu" = (
@@ -8860,8 +8906,22 @@
icon_state = "panelscorched"
},
/area/maintenance/starboard/fore)
+"atz" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
+/obj/structure/closet/wardrobe/black,
+/obj/item/clothing/under/skirt/black,
+/obj/item/clothing/head/beret/black,
+/obj/item/clothing/head/beret/black,
+/obj/item/clothing/under/trendy_fit,
+/obj/item/clothing/under/trendy_fit,
+/obj/item/clothing/under/sundress,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
"atA" = (
/obj/structure/table,
+/obj/item/paicard,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"atB" = (
@@ -8957,13 +9017,19 @@
/turf/closed/wall,
/area/maintenance/port/fore)
"atQ" = (
-/obj/machinery/door/airlock{
- id_tag = "Dorm5";
- name = "Cabin 1"
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
+/obj/structure/closet/wardrobe/white,
+/obj/item/clothing/under/waiter,
+/obj/item/clothing/under/waiter,
+/obj/item/clothing/under/waiter,
+/obj/structure/sign/poster/contraband/lizard{
+ pixel_x = -32
+ },
+/obj/item/clothing/suit/straight_jacket,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
"atR" = (
/obj/effect/landmark/carpspawn,
/obj/structure/lattice,
@@ -8973,10 +9039,15 @@
/turf/closed/wall,
/area/space/nearstation)
"atT" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
+/obj/structure/table/wood/poker,
+/obj/item/toy/cards/deck{
+ pixel_y = 5
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"atU" = (
/obj/structure/rack,
/obj/effect/spawner/lootdrop/maintenance{
@@ -8986,44 +9057,48 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"atV" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
-/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
+ dir = 4;
+ pixel_y = 5
},
-/obj/effect/turf_decal/tile/neutral{
+/obj/structure/chair/sofa{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"atW" = (
/obj/structure/chair/stool,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"atX" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plating,
+/area/space/nearstation)
"atY" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
/area/security/vacantoffice/b)
"atZ" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Holodeck Door"
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"aua" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
+/obj/structure/bed,
+/obj/machinery/button/door{
+ id = "Dorm6";
+ name = "Cabin Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_y = -25;
+ specialfunctions = 4
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"aub" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/yellow,
@@ -9043,6 +9118,12 @@
},
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
+"aud" = (
+/obj/machinery/atmospherics/components/unary/tank/air{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"aue" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
@@ -9146,60 +9227,60 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"aup" = (
-/obj/machinery/door/airlock{
- id_tag = "Dorm6";
- name = "Cabin 2"
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_x = -3;
+ pixel_y = 9
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
+/obj/item/reagent_containers/food/condiment/peppermill{
+ dir = 1;
+ pixel_x = 3;
+ pixel_y = 9
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
"auq" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
/area/security/vacantoffice/b)
"aur" = (
-/obj/machinery/door/window/eastright{
- base_state = "left";
- dir = 8;
- icon_state = "left";
- name = "Fitness Ring"
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/fitness)
+/obj/structure/table/wood/fancy/black,
+/obj/machinery/light/small,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"aus" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/area/crew_quarters/dorms)
"aut" = (
-/obj/structure/window/reinforced{
- dir = 1
+/obj/machinery/door/airlock{
+ id_tag = "Room One";
+ name = "Room Six - Luxury Suite"
},
+/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
-/area/crew_quarters/fitness)
+/area/crew_quarters/dorms)
"auu" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
+/obj/structure/closet/secure_closet/personal/cabinet{
+ desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here.";
+ name = "Personal ID-Locked Closet";
+ pixel_y = 15
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"auv" = (
-/obj/structure/window/reinforced{
- dir = 4
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/structure/closet/secure_closet/personal/cabinet{
+ desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here.";
+ name = "Personal ID-Locked Closet";
+ pixel_y = 15
},
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/fitness)
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"auw" = (
/obj/structure/bed,
/obj/machinery/airalarm{
@@ -9219,54 +9300,79 @@
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"aux" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/obj/machinery/meter,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
+"auy" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"auy" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Holodeck Door"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"auz" = (
-/obj/machinery/camera{
- c_tag = "Holodeck"
- },
-/obj/machinery/airalarm{
- pixel_y = 24
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"auA" = (
-/obj/machinery/light/small{
+/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
+"auz" = (
+/obj/machinery/light/small,
+/obj/machinery/atmospherics/components/unary/tank/air{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
+"auA" = (
+/obj/machinery/atmospherics/pipe/manifold/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/structure/sign/warning/fire{
+ desc = "A sign that states the labeled room's number.";
+ dir = 4;
+ icon_state = "roomnum";
+ name = "Room Number 3";
+ pixel_x = -30;
+ pixel_y = -7
+ },
+/obj/effect/landmark/start/assistant,
/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/area/crew_quarters/dorms)
"auB" = (
/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "holoprivacy";
+ name = "Holodeck Shutters"
+ },
/turf/open/floor/plating,
/area/crew_quarters/fitness)
"auC" = (
-/obj/machinery/light/small,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"auD" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
@@ -9328,6 +9434,21 @@
},
/turf/open/floor/plasteel,
/area/maintenance/department/electrical)
+"auN" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"auO" = (
/obj/structure/closet/emcloset,
/turf/open/floor/plating,
@@ -9339,37 +9460,20 @@
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
"auR" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/turf/closed/wall,
+/area/crew_quarters/fitness)
"auS" = (
-/obj/machinery/requests_console{
- department = "Crew Quarters";
- pixel_y = 30
- },
/obj/machinery/camera{
- c_tag = "Dormitory North"
+ c_tag = "Holodeck"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/machinery/airalarm{
+ pixel_y = 24
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
},
/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/area/crew_quarters/fitness)
"auT" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -9377,36 +9481,20 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"auU" = (
-/obj/machinery/firealarm{
- dir = 2;
- 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{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/obj/machinery/atmospherics/components/binary/valve,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"auV" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
/area/maintenance/port/fore)
"auW" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"auX" = (
@@ -9475,13 +9563,7 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"avg" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"avh" = (
@@ -9490,18 +9572,18 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/power/apc{
+ areastring = "/area/security/vacantoffice/b";
dir = 8;
name = "Vacant Office B APC";
- areastring = "/area/security/vacantoffice/b";
pixel_x = -24
},
/turf/open/floor/plating,
/area/maintenance/fore)
"avi" = (
/obj/machinery/power/apc{
+ areastring = "/area/lawoffice";
dir = 1;
name = "Law Office APC";
- areastring = "/area/lawoffice";
pixel_y = 24
},
/obj/structure/cable{
@@ -9512,7 +9594,7 @@
/area/maintenance/fore)
"avj" = (
/obj/machinery/firealarm{
- dir = 8;
+ dir = 4;
pixel_x = -24
},
/obj/structure/cable{
@@ -9533,43 +9615,17 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"avl" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -5;
- pixel_y = 30
- },
-/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/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"avm" = (
-/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/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"avn" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
+/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"avo" = (
@@ -9597,8 +9653,7 @@
pixel_y = 24
},
/obj/machinery/camera{
- c_tag = "Detective's Office";
- dir = 2
+ c_tag = "Detective's Office"
},
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
@@ -9616,68 +9671,63 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"avt" = (
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"avu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/neutral{
+/obj/structure/chair/sofa/left{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"avv" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/obj/effect/landmark/start/assistant,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"avw" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
+"avv" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/meter,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
+"avw" = (
+/obj/machinery/button/door{
+ id = "Room One";
+ name = "Door Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"avx" = (
-/obj/effect/spawner/structure/window,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
+"avy" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "holoprivacy";
+ name = "Holodeck Shutters"
+ },
/turf/open/floor/plating,
/area/crew_quarters/fitness)
-"avy" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/fitness)
"avz" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/computer/holodeck{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"avA" = (
-/obj/structure/window/reinforced{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#e8eaff"
},
-/turf/open/floor/plasteel/dark,
+/obj/structure/chair/sofa/right{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"avB" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -9687,17 +9737,20 @@
/turf/open/floor/plating,
/area/ai_monitored/security/armory)
"avC" = (
-/obj/structure/chair{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"avD" = (
-/obj/machinery/computer/holodeck{
- dir = 4
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"avE" = (
/obj/machinery/door/poddoor/preopen{
id = "maint3"
@@ -9746,9 +9799,9 @@
/area/maintenance/department/electrical)
"avL" = (
/obj/machinery/power/apc{
+ areastring = "/area/maintenance/department/electrical";
dir = 1;
name = "Electrical Maintenance APC";
- areastring = "/area/maintenance/department/electrical";
pixel_y = 24
},
/obj/structure/cable{
@@ -9777,8 +9830,6 @@
},
/obj/item/multitool,
/obj/item/radio/intercom{
- freerange = 0;
- frequency = 1459;
name = "Station Intercom (General)";
pixel_x = 29
},
@@ -9810,11 +9861,17 @@
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
"avR" = (
-/obj/structure/table/wood,
-/obj/item/storage/firstaid/regular,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/obj/structure/table/wood/poker,
+/obj/item/clothing/mask/cigarette/cigar{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4;
+ pixel_y = 5
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"avS" = (
/obj/item/wrench,
/turf/open/floor/plating,
@@ -9892,9 +9949,9 @@
/area/maintenance/fore)
"awd" = (
/obj/machinery/power/apc{
+ areastring = "/area/maintenance/fore";
dir = 1;
name = "Fore Maintenance APC";
- areastring = "/area/maintenance/fore";
pixel_y = 24
},
/obj/structure/cable{
@@ -10027,60 +10084,73 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"awo" = (
-/obj/machinery/door/airlock{
- id_tag = "Dorm3";
- name = "Dorm 3"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/structure/chair/comfy/black{
dir = 4
},
-/turf/open/floor/plasteel,
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_y = -29
+ },
+/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"awp" = (
-/obj/structure/table/wood,
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/item/storage/pill_bottle/dice,
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"awq" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/area/crew_quarters/fitness)
"awr" = (
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"aws" = (
-/obj/structure/table/wood,
-/obj/item/coin/silver,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/public/glass{
+ name = "Holodeck Door"
+ },
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/fitness)
+"awt" = (
+/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"awt" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
+ dir = 4
},
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"awu" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/closet/wardrobe/mixed,
+/obj/item/clothing/under/kilt,
+/obj/item/clothing/under/kilt,
+/obj/item/clothing/under/skirt/purple,
+/obj/item/clothing/head/beret,
+/obj/item/clothing/head/beret,
+/obj/item/clothing/head/beret,
/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/area/crew_quarters/fitness)
"awv" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/structure/sign/warning/fire{
+ desc = "A sign that states the labeled room's number.";
+ dir = 8;
+ icon_state = "roomnum";
+ name = "Room Number 4";
+ pixel_y = 24
+ },
+/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"aww" = (
@@ -10097,48 +10167,62 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"awy" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"awz" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
- name = "Fitness"
+ name = "Holodeck Door"
},
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
+/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness)
"awA" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/door/airlock{
+ id_tag = "Dorm5";
+ name = "Room Four"
},
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/dorms)
"awB" = (
-/obj/effect/landmark/start/assistant,
-/obj/machinery/vr_sleeper,
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"awC" = (
-/obj/structure/table,
-/obj/item/paper/fluff/holodeck/disclaimer,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"awD" = (
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"awE" = (
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/table/wood,
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_x = -3;
+ pixel_y = 20
+ },
+/obj/item/reagent_containers/food/condiment/peppermill{
+ dir = 1;
+ pixel_x = 3;
+ pixel_y = 20
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/item/reagent_containers/food/drinks/britcup,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"awF" = (
/obj/structure/closet/crate,
/obj/effect/spawner/lootdrop/maintenance{
@@ -10179,26 +10263,34 @@
/area/maintenance/starboard/fore)
"awK" = (
/obj/structure/table/glass,
-/obj/item/pen,
+/obj/item/coin/silver,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"awL" = (
-/obj/structure/table/glass,
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
+/obj/structure/table,
+/obj/item/instrument/guitar{
+ pixel_x = -7
},
+/obj/item/instrument/eguitar{
+ pixel_x = 5
+ },
+/obj/item/instrument/violin,
+/obj/item/instrument/trombone,
+/obj/item/instrument/saxophone,
+/obj/item/instrument/piano_synth,
+/obj/item/instrument/recorder,
+/obj/item/instrument/accordion,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"awM" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
+/obj/machinery/button/door{
+ id = "maintdiy";
+ name = "Shutters Control Button";
+ pixel_x = -6;
+ pixel_y = 24
},
/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/area/crew_quarters/abandoned_gambling_den)
"awN" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -10294,6 +10386,14 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/hallway/secondary/entry)
+"awX" = (
+/obj/machinery/door/airlock{
+ id_tag = "Dorm6";
+ name = "Room Five"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/dorms)
"awY" = (
/obj/machinery/light{
dir = 1
@@ -10357,6 +10457,15 @@
},
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
+"axd" = (
+/obj/structure/closet,
+/obj/effect/decal/cleanable/cobweb,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 4;
+ name = "4maintenance loot spawner"
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"axe" = (
/obj/machinery/sleeper{
dir = 4
@@ -10558,12 +10667,11 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"axC" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/effect/turf_decal/tile/red{
dir = 4
},
-/obj/effect/turf_decal/tile/blue{
- dir = 8
+/obj/structure/sign/poster/official/enlist{
+ pixel_y = 32
},
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
@@ -10574,12 +10682,16 @@
/turf/closed/wall,
/area/maintenance/fore/secondary)
"axE" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
+/obj/structure/closet,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 8;
+ name = "8maintenance loot spawner"
},
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
+/obj/item/radio/intercom{
+ pixel_y = 25
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/abandoned_gambling_den)
"axF" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
@@ -10617,6 +10729,12 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
+"axJ" = (
+/obj/structure/piano{
+ icon_state = "piano"
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"axK" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
@@ -10624,128 +10742,189 @@
/turf/closed/wall,
/area/maintenance/port/fore)
"axL" = (
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/closet/wardrobe/grey,
+/obj/item/clothing/under/assistantformal,
+/obj/item/clothing/under/assistantformal,
+/obj/machinery/camera{
+ c_tag = "Dorms East - Holodeck";
+ dir = 4
+ },
/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/area/crew_quarters/fitness)
"axM" = (
-/obj/structure/table/wood,
-/obj/item/paicard,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"axN" = (
-/obj/structure/table/wood,
-/obj/item/storage/crayons,
-/turf/open/floor/plasteel,
+/obj/structure/chair/comfy/black{
+ dir = 8
+ },
+/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"axO" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel,
+/obj/machinery/light/small,
+/turf/open/floor/mineral/titanium/blue,
/area/crew_quarters/dorms)
"axP" = (
-/obj/structure/table/wood,
-/obj/item/toy/cards/deck{
- pixel_x = 2
+/obj/structure/cable{
+ icon_state = "4-8"
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/structure/table/wood,
+/obj/item/paicard,
/obj/item/clothing/mask/balaclava{
pixel_x = -8;
pixel_y = 8
},
+/obj/item/toy/cards/deck{
+ pixel_x = 2
+ },
+/obj/item/storage/crayons,
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"axQ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"axR" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Fitness"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"axS" = (
-/obj/structure/window/reinforced,
-/obj/structure/window/reinforced{
+/obj/machinery/light{
dir = 8
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/fitness)
-"axT" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
},
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"axU" = (
-/obj/structure/window/reinforced,
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/fitness)
-"axV" = (
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/structure/sign/warning/fire{
+ desc = "A sign that states the labeled room's number.";
+ dir = 1;
+ icon_state = "roomnum";
+ name = "Room Number 2";
+ pixel_x = -30;
+ pixel_y = -7
},
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
-"axW" = (
-/obj/machinery/door/window/eastright{
- base_state = "left";
- icon_state = "left";
- name = "Fitness Ring"
+"axR" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
-/obj/structure/window/reinforced,
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/fitness)
-"axX" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
-"axY" = (
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
+"axS" = (
+/obj/item/flashlight/lamp/green{
+ pixel_x = -3;
+ pixel_y = 22
+ },
+/obj/structure/dresser{
+ desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too.";
+ name = "Dresser";
+ pixel_y = 7
+ },
+/turf/open/floor/plating,
+/area/maintenance/port)
+"axT" = (
+/obj/machinery/door/airlock{
+ id_tag = "Dorm3";
+ name = "Room Two"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/dorms)
+"axU" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/structure/sign/warning/fire{
+ desc = "A sign that states the labeled room's number.";
+ dir = 6;
+ icon_state = "roomnum";
+ name = "Room Number 5";
+ pixel_y = 24
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"axZ" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Holodeck Door"
+/area/crew_quarters/dorms)
+"axV" = (
+/obj/structure/chair/comfy/brown{
+ dir = 8
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"axW" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
+"axX" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/light/small,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
+"axY" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/structure/closet/toolcloset,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
+"axZ" = (
+/obj/machinery/light/small{
+ dir = 1;
+ light_color = "#ffc1c1"
+ },
+/obj/machinery/airalarm{
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"aya" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
},
/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/area/crew_quarters/dorms)
"ayb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/structure/chair{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
@@ -10821,9 +11000,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"ayn" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 2
- },
+/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"ayo" = (
@@ -10997,14 +11174,6 @@
/turf/closed/wall/r_wall,
/area/ai_monitored/storage/eva)
"ayM" = (
-/obj/machinery/firealarm{
- dir = 2;
- pixel_y = 24
- },
-/obj/item/clothing/head/welding,
-/turf/open/floor/plasteel,
-/area/ai_monitored/storage/eva)
-"ayN" = (
/obj/structure/rack,
/obj/machinery/light{
dir = 1
@@ -11014,8 +11183,15 @@
/obj/item/flashlight,
/obj/item/flashlight,
/obj/item/flashlight,
+/obj/item/clothing/glasses/welding,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/storage/eva)
+"ayN" = (
+/obj/machinery/firealarm{
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel,
+/area/ai_monitored/storage/eva)
"ayO" = (
/obj/structure/table,
/obj/item/storage/toolbox/electrical{
@@ -11029,9 +11205,9 @@
/area/ai_monitored/storage/eva)
"ayP" = (
/obj/machinery/power/apc{
+ areastring = "/area/ai_monitored/storage/eva";
dir = 1;
name = "EVA Storage APC";
- areastring = "/area/ai_monitored/storage/eva";
pixel_y = 24
},
/obj/structure/cable{
@@ -11114,38 +11290,45 @@
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"ayY" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
+/obj/structure/sign/poster/official/cohiba_robusto_ad,
+/turf/closed/wall,
+/area/lawoffice)
+"ayZ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
-"ayZ" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
+/obj/structure/sign/poster/contraband/pwr_game{
+ pixel_x = -32
},
-/obj/effect/turf_decal/tile/blue,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"aza" = (
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/vr_sleeper{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white/side{
+ dir = 4
+ },
+/area/crew_quarters/fitness)
"azb" = (
-/obj/structure/chair/stool{
- pixel_y = 8
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 2
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/fitness)
"azc" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
@@ -11159,47 +11342,68 @@
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"azd" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/vr_sleeper{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"aze" = (
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"azf" = (
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"azg" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/crew_quarters/fitness)
-"azh" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/vr_sleeper,
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
dir = 4
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white/side{
+ dir = 8
+ },
+/area/crew_quarters/fitness)
+"aze" = (
+/obj/machinery/vr_sleeper{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white/side{
+ dir = 4
+ },
+/area/crew_quarters/fitness)
+"azf" = (
+/obj/structure/grille/broken,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/window{
+ dir = 4
+ },
+/obj/structure/window,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/starboard/fore)
+"azg" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/button/door{
+ id = "holoprivacy";
+ name = "Holodeck Privacy";
+ pixel_y = 24
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
+"azh" = (
+/obj/machinery/door/airlock{
+ name = "Instrument Storage"
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/starboard/fore)
"azi" = (
/obj/machinery/door/airlock/maintenance{
name = "Garden Maintenance";
@@ -11209,61 +11413,81 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"azj" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -29
+/obj/structure/closet{
+ name = "Holodeck Outfits"
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/obj/item/clothing/under/trek/Q,
+/obj/item/clothing/under/trek/command/next,
+/obj/item/clothing/under/trek/command/next,
+/obj/item/clothing/under/trek/command/next,
+/obj/item/clothing/under/trek/engsec/next,
+/obj/item/clothing/under/trek/engsec/next,
+/obj/item/clothing/under/trek/engsec/next,
+/obj/item/clothing/under/trek/engsec/next,
+/obj/item/clothing/under/trek/medsci/next,
+/obj/item/clothing/under/trek/medsci/next,
+/obj/item/clothing/under/trek/medsci/next,
+/obj/item/clothing/under/mw2_russian_para,
+/obj/item/clothing/under/mw2_russian_para,
+/obj/item/clothing/under/gladiator,
+/obj/item/clothing/under/gladiator,
+/obj/machinery/firealarm{
+ dir = 4;
+ pixel_x = -24
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"azk" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ dir = 4;
+ light_color = "#d8b1b1"
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"azl" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
},
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"azm" = (
-/obj/structure/chair/stool{
- pixel_y = 8
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
},
/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"azn" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/regular,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"azo" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/area/crew_quarters/dorms)
+"azm" = (
+/obj/machinery/shower{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/toilet)
+"azn" = (
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/dorms)
+"azo" = (
+/obj/machinery/shower{
+ dir = 8;
+ pixel_y = -4
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/toilet)
"azp" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "holoprivacy";
+ name = "Holodeck Shutters"
+ },
/turf/open/floor/plating,
/area/crew_quarters/fitness)
"azq" = (
@@ -11466,6 +11690,27 @@
},
/turf/open/floor/plating,
/area/maintenance/fore)
+"azP" = (
+/obj/structure/table/wood,
+/obj/machinery/requests_console{
+ department = "Theatre";
+ name = "theatre RC";
+ pixel_x = -32
+ },
+/obj/item/reagent_containers/food/snacks/baguette,
+/obj/item/toy/dummy,
+/obj/item/lipstick/random{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/lipstick/random{
+ pixel_x = -2;
+ pixel_y = -2
+ },
+/turf/open/floor/plasteel/white/side{
+ dir = 4
+ },
+/area/crew_quarters/theatre)
"azQ" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -11504,12 +11749,9 @@
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"azT" = (
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 2
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/obj/effect/landmark/event_spawn,
+/turf/closed/wall,
+/area/crew_quarters/fitness)
"azU" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -11523,27 +11765,38 @@
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"azV" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+/obj/machinery/vr_sleeper{
dir = 8
},
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white/side{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/area/crew_quarters/fitness)
"azW" = (
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"azX" = (
-/obj/machinery/door/airlock{
- name = "Unisex Showers"
+/obj/machinery/vr_sleeper{
+ dir = 4
},
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/turf_decal/tile/green{
+ dir = 8
},
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 4
+ },
+/area/crew_quarters/fitness)
"azY" = (
/obj/structure/table,
/obj/item/radio/off,
@@ -11563,27 +11816,26 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"aAb" = (
-/obj/machinery/door/airlock{
- id_tag = "Dorm2";
- name = "Dorm 2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/area/crew_quarters/fitness)
"aAc" = (
/obj/effect/spawner/structure/window,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aAd" = (
-/obj/machinery/light_switch{
- pixel_y = -25
+/obj/machinery/camera{
+ c_tag = "Dorms West"
},
-/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
- dir = 8
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
},
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
@@ -11595,46 +11847,51 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"aAf" = (
-/obj/structure/closet/wardrobe/pjs,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/vr_sleeper{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness)
"aAg" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -29
+/obj/machinery/vr_sleeper{
+ dir = 4
},
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 4
+ },
+/area/crew_quarters/fitness)
"aAh" = (
/turf/closed/wall,
/area/crew_quarters/toilet)
"aAi" = (
-/obj/structure/closet/wardrobe/pjs,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/turf/open/floor/plating,
+/area/crew_quarters/fitness)
"aAj" = (
/obj/structure/cable{
icon_state = "1-4"
},
/obj/machinery/power/apc{
- dir = 2;
- name = "Security Checkpoint APC";
areastring = "/area/security/checkpoint/auxiliary";
+ name = "Security Checkpoint APC";
pixel_x = 1;
pixel_y = -24
},
@@ -11643,119 +11900,77 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"aAk" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
+/obj/structure/closet/athletic_mixed,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"aAl" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/obj/structure/reagent_dispensers/water_cooler,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
+/obj/structure/closet/boxinggloves,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"aAm" = (
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/public/glass{
+ name = "Holodeck Door"
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
},
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness)
"aAn" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
},
-/obj/machinery/light_switch{
- pixel_y = -25
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/area/crew_quarters/dorms)
"aAo" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/dorms)
"aAp" = (
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/structure/closet{
+ name = "Suit Closet"
},
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/obj/item/clothing/under/suit_jacket/white,
+/obj/item/clothing/under/suit_jacket/tan,
+/obj/item/clothing/under/suit_jacket/red,
+/obj/item/clothing/under/suit_jacket/really_black,
+/obj/item/clothing/under/suit_jacket/navy,
+/obj/item/clothing/under/suit_jacket/green,
+/obj/item/clothing/under/suit_jacket/female,
+/obj/item/clothing/under/suit_jacket/checkered,
+/obj/item/clothing/under/suit_jacket/charcoal,
+/obj/item/clothing/under/suit_jacket/burgundy,
+/obj/item/clothing/under/suit_jacket,
+/obj/item/clothing/under/lawyer/black,
+/obj/item/clothing/under/lawyer/blacksuit,
+/obj/item/clothing/under/lawyer/blue,
+/obj/item/clothing/under/lawyer/bluesuit,
+/obj/item/clothing/under/lawyer/female,
+/obj/item/clothing/under/lawyer/purpsuit,
+/obj/item/clothing/under/lawyer/really_black,
+/obj/item/clothing/under/lawyer/red,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
+"aAq" = (
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
+"aAr" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
+"aAs" = (
+/obj/machinery/light/small{
+ dir = 4;
+ light_color = "#d8b1b1"
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
-"aAr" = (
-/obj/structure/closet,
-/obj/effect/decal/cleanable/cobweb,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"aAs" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
"aAt" = (
/obj/machinery/door/poddoor/preopen{
id = "maint2"
@@ -11763,12 +11978,12 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aAu" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/obj/machinery/door/poddoor/preopen{
id = "maint2"
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aAv" = (
@@ -11780,9 +11995,9 @@
/area/maintenance/starboard/fore)
"aAw" = (
/obj/machinery/power/apc{
+ areastring = "/area/hydroponics/garden";
dir = 4;
name = "Garden APC";
- areastring = "/area/hydroponics/garden";
pixel_x = 27;
pixel_y = 2
},
@@ -11796,9 +12011,7 @@
/turf/open/floor/plasteel,
/area/hydroponics/garden)
"aAy" = (
-/obj/machinery/power/smes{
- charge = 0
- },
+/obj/machinery/power/smes,
/obj/structure/cable{
icon_state = "0-4"
},
@@ -11825,9 +12038,7 @@
/turf/closed/wall,
/area/maintenance/department/electrical)
"aAB" = (
-/obj/machinery/power/smes{
- charge = 0
- },
+/obj/machinery/power/smes,
/obj/structure/cable{
icon_state = "0-8"
},
@@ -11900,9 +12111,8 @@
/area/hydroponics/garden)
"aAL" = (
/obj/machinery/power/apc{
- dir = 2;
- name = "Primary Tool Storage APC";
areastring = "/area/storage/primary";
+ name = "Primary Tool Storage APC";
pixel_x = 1;
pixel_y = -24
},
@@ -11914,6 +12124,16 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"aAM" = (
+/obj/structure/mirror{
+ pixel_y = 32
+ },
+/obj/structure/sink{
+ dir = 1;
+ pixel_y = 25
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/toilet)
"aAN" = (
/obj/structure/cable{
icon_state = "2-8"
@@ -11989,18 +12209,11 @@
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"aAX" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/area/crew_quarters/fitness)
"aAY" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -12008,10 +12221,10 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"aAZ" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/urinal{
+ pixel_y = 32
},
-/turf/open/floor/plasteel/freezer,
+/turf/open/floor/mineral/titanium/blue,
/area/crew_quarters/toilet)
"aBa" = (
/turf/closed/wall/r_wall,
@@ -12084,9 +12297,9 @@
/area/maintenance/fore)
"aBi" = (
/obj/machinery/power/apc{
+ areastring = "/area/gateway";
dir = 8;
name = "Gateway APC";
- areastring = "/area/gateway";
pixel_x = -24;
pixel_y = -1
},
@@ -12126,7 +12339,6 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"aBm" = (
-/obj/effect/landmark/start/assistant,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
@@ -12216,26 +12428,41 @@
/turf/open/floor/plasteel,
/area/hydroponics/garden)
"aBx" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/closed/wall,
-/area/crew_quarters/toilet)
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/plasteel,
+/area/hydroponics)
"aBy" = (
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aBz" = (
-/obj/machinery/shower{
+/obj/machinery/camera{
+ c_tag = "Library North"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aBA" = (
-/obj/machinery/shower{
- dir = 8
+/obj/structure/chair/sofa/right,
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#c1caff"
},
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
+/turf/open/floor/wood,
+/area/library)
+"aBz" = (
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/obj/effect/landmark/start/assistant,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/chair/sofa/left,
+/turf/open/floor/wood,
+/area/library)
+"aBA" = (
+/obj/structure/chair/comfy/brown{
+ dir = 4
+ },
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/wood,
+/area/library)
"aBB" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
@@ -12251,6 +12478,12 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"aBD" = (
+/obj/structure/chair/comfy/brown{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/library)
"aBE" = (
/obj/item/clothing/under/rank/mailman,
/obj/item/clothing/head/mailman,
@@ -12300,9 +12533,12 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"aBM" = (
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel,
-/area/hydroponics/garden)
+/obj/structure/sign/poster/official/nanomichi_ad{
+ pixel_y = 32
+ },
+/obj/machinery/vending/snack/random,
+/turf/open/floor/plasteel/dark,
+/area/hallway/primary/central)
"aBN" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
@@ -12359,9 +12595,9 @@
/area/ai_monitored/nuke_storage)
"aBU" = (
/obj/machinery/power/apc{
+ areastring = "/area/ai_monitored/nuke_storage";
dir = 1;
name = "Vault APC";
- areastring = "/area/ai_monitored/nuke_storage";
pixel_y = 25
},
/obj/structure/cable{
@@ -12483,21 +12719,27 @@
/turf/open/floor/carpet,
/area/crew_quarters/cryopod)
"aCe" = (
-/obj/effect/landmark/xeno_spawn,
-/obj/item/bikehorn/rubberducky,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
},
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
+/obj/effect/turf_decal/tile/blue,
+/obj/structure/sign/poster/official/do_not_question{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
"aCf" = (
-/obj/machinery/camera{
- c_tag = "Theatre Storage"
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
},
-/turf/open/floor/plasteel/white/side{
- dir = 4
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
},
-/area/crew_quarters/theatre)
+/obj/structure/sign/poster/official/obey{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
"aCg" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -12505,11 +12747,14 @@
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"aCh" = (
-/obj/machinery/vending/autodrobe,
-/turf/open/floor/plasteel/white/side{
- dir = 4
+/obj/machinery/shower{
+ dir = 8;
+ pixel_y = -4
},
-/area/crew_quarters/theatre)
+/obj/effect/landmark/xeno_spawn,
+/obj/effect/landmark/start/assistant,
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/toilet)
"aCi" = (
/obj/structure/cable,
/obj/effect/spawner/structure/window/reinforced,
@@ -12536,32 +12781,48 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aCm" = (
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
+/obj/item/radio/intercom{
+ pixel_y = 25
},
-/obj/structure/mirror{
- pixel_x = -28
+/obj/machinery/camera{
+ c_tag = "Theatre Stage"
},
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aCn" = (
-/obj/structure/urinal{
- pixel_y = 32
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aCo" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+/obj/structure/chair/comfy/brown{
dir = 4
},
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aCn" = (
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_x = -3;
+ pixel_y = 20
+ },
+/obj/item/reagent_containers/food/condiment/peppermill{
+ dir = 1;
+ pixel_x = 3;
+ pixel_y = 20
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aCo" = (
+/obj/structure/closet{
+ name = "Costume Closet"
+ },
+/obj/item/clothing/head/russobluecamohat,
+/obj/item/clothing/head/russobluecamohat,
+/obj/item/clothing/head/russofurhat,
+/obj/item/clothing/head/russofurhat,
+/obj/item/clothing/head/russofurhat,
+/obj/item/clothing/head/russofurhat,
+/obj/item/clothing/under/mw2_russian_para,
+/obj/item/clothing/under/mw2_russian_para,
+/obj/item/clothing/under/mw2_russian_para,
+/obj/item/clothing/under/mw2_russian_para,
+/obj/item/clothing/shoes/jackboots,
+/obj/item/clothing/shoes/jackboots,
+/obj/item/clothing/shoes/jackboots,
+/obj/item/clothing/shoes/jackboots,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aCp" = (
@@ -12578,19 +12839,11 @@
/turf/open/floor/plasteel/white/corner,
/area/hallway/secondary/entry)
"aCq" = (
-/obj/structure/table/wood,
-/obj/machinery/requests_console{
- department = "Theatre";
- departmentType = 0;
- name = "theatre RC";
- pixel_x = -32
- },
-/obj/item/reagent_containers/food/snacks/baguette,
-/obj/item/toy/dummy,
-/turf/open/floor/plasteel/white/side{
- dir = 4
- },
-/area/crew_quarters/theatre)
+/obj/structure/closet/lasertag/red,
+/obj/item/clothing/under/pj/red,
+/obj/item/clothing/under/pj/red,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
"aCr" = (
/turf/closed/wall,
/area/crew_quarters/theatre)
@@ -12614,30 +12867,53 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aCu" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "holoprivacy";
+ name = "Holodeck Shutters"
+ },
/turf/open/floor/plating,
/area/crew_quarters/fitness)
"aCv" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+ dir = 5
},
/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "holoprivacy";
+ name = "Holodeck Shutters"
+ },
/turf/open/floor/plating,
/area/crew_quarters/fitness)
"aCw" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
+ dir = 4
},
/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "holoprivacy";
+ name = "Holodeck Shutters"
+ },
/turf/open/floor/plating,
/area/crew_quarters/fitness)
+"aCx" = (
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aCy" = (
-/obj/effect/decal/cleanable/oil,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/machinery/firealarm{
+ pixel_y = 24
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aCz" = (
/obj/structure/window/reinforced{
dir = 8
@@ -12648,18 +12924,11 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aCA" = (
-/obj/structure/grille/broken,
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/structure/chair/comfy/brown{
+ dir = 1
},
-/obj/structure/window{
- dir = 4
- },
-/obj/structure/window,
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
-/area/maintenance/starboard/fore)
+/turf/open/floor/wood,
+/area/library)
"aCB" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
@@ -12789,6 +13058,13 @@
"aCR" = (
/turf/closed/wall,
/area/chapel/main)
+"aCS" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/chair/comfy/brown{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/library)
"aCT" = (
/obj/structure/table,
/obj/item/stack/sheet/metal/fifty,
@@ -12800,6 +13076,23 @@
},
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
+"aCU" = (
+/obj/machinery/photocopier{
+ pixel_x = -5;
+ pixel_y = -5
+ },
+/turf/open/floor/wood,
+/area/library)
+"aCV" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/structure/sign/poster/official/obey{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
"aCW" = (
/obj/structure/reagent_dispensers/watertank,
/obj/effect/spawner/lootdrop/maintenance,
@@ -12846,7 +13139,6 @@
pixel_y = 5
},
/obj/machinery/firealarm{
- dir = 2;
pixel_y = 24
},
/turf/open/floor/plasteel,
@@ -12857,7 +13149,6 @@
dir = 1
},
/obj/item/radio/intercom{
- broadcasting = 0;
name = "Station Intercom (General)";
pixel_y = 20
},
@@ -12900,9 +13191,14 @@
/turf/open/floor/plasteel,
/area/hydroponics/garden)
"aDh" = (
-/obj/machinery/vending/assist,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/structure/sign/poster/official/space_cops{
+ pixel_x = -32
+ },
/turf/open/floor/plasteel,
-/area/storage/primary)
+/area/hallway/primary/fore)
"aDi" = (
/obj/structure/window/reinforced,
/turf/open/floor/plasteel/dark,
@@ -12927,7 +13223,6 @@
},
/obj/machinery/requests_console{
department = "Tool Storage";
- departmentType = 0;
pixel_y = 30
},
/turf/open/floor/plasteel,
@@ -12954,7 +13249,6 @@
/obj/item/assembly/signaler,
/obj/item/assembly/signaler,
/obj/item/radio/intercom{
- broadcasting = 0;
name = "Station Intercom (General)";
pixel_y = 20
},
@@ -13011,6 +13305,10 @@
},
/turf/open/floor/circuit,
/area/ai_monitored/nuke_storage)
+"aDu" = (
+/obj/structure/chair/comfy/brown,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aDv" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -13073,9 +13371,7 @@
/area/ai_monitored/storage/eva)
"aDB" = (
/obj/machinery/suit_storage_unit/standard_unit,
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"aDC" = (
@@ -13099,9 +13395,7 @@
c_tag = "EVA Storage";
dir = 1
},
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"aDF" = (
@@ -13112,38 +13406,33 @@
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"aDG" = (
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/obj/machinery/door/poddoor/shutters/preopen{
+ desc = "Privacy shutters for the Private Study. Stops people spying in on your game.";
+ id = "PrivateStudy1";
+ name = "Private Study Privacy Shutters"
},
-/obj/machinery/camera{
- c_tag = "Dormitory South";
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/obj/effect/spawner/structure/window,
+/turf/open/floor/wood,
+/area/library)
"aDH" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = 1;
- pixel_y = 9
- },
-/obj/item/pen,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/item/folder/white,
-/obj/item/stamp/rd{
- pixel_x = 3;
- pixel_y = -2
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
+/obj/structure/table/wood,
+/obj/item/flashlight/lamp/green,
+/obj/item/pen/fountain/captain,
+/turf/open/floor/carpet,
+/area/crew_quarters/heads/captain)
"aDI" = (
/obj/structure/sign/warning/electricshock,
/turf/closed/wall/r_wall,
/area/ai_monitored/storage/eva)
+"aDJ" = (
+/obj/machinery/door/airlock{
+ desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals.";
+ id_tag = "PrivateStudy";
+ name = "Private Study"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/wood,
+/area/library)
"aDK" = (
/obj/machinery/door/airlock/public/glass{
name = "Cryogenics "
@@ -13156,126 +13445,140 @@
/turf/open/floor/plasteel,
/area/crew_quarters/cryopod)
"aDL" = (
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
- },
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aDM" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aDN" = (
-/obj/machinery/light/small,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aDO" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aDP" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aDQ" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aDR" = (
-/obj/structure/table/wood,
-/obj/structure/mirror{
- pixel_x = -28
- },
-/obj/item/lipstick/random{
- pixel_x = 2;
- pixel_y = 2
- },
-/obj/item/lipstick/random{
- pixel_x = -2;
- pixel_y = -2
- },
-/turf/open/floor/plasteel/white/side{
- dir = 4
- },
-/area/crew_quarters/theatre)
-"aDS" = (
/obj/machinery/door/airlock{
- name = "Unisex Showers"
+ desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals.";
+ id_tag = "PrivateStudy";
+ name = "Private Study"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/machinery/door/firedoor,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/wood,
+/area/library)
+"aDM" = (
+/obj/structure/chair/sofa/right,
+/obj/structure/window{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aDN" = (
+/obj/structure/chair/sofa,
+/obj/structure/window{
+ dir = 1
+ },
+/obj/effect/landmark/start/assistant,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aDO" = (
+/obj/structure/chair/sofa/left,
+/obj/structure/window{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aDP" = (
+/obj/structure/chair/comfy/brown{
dir = 4
},
-/obj/structure/cable{
- icon_state = "4-8"
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aDR" = (
+/obj/structure/closet/lasertag/blue,
+/obj/item/clothing/under/pj/blue,
+/obj/item/clothing/under/pj/blue,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
+"aDS" = (
+/obj/machinery/light/small{
+ dir = 4;
+ light_color = "#d8b1b1"
},
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aDT" = (
-/obj/machinery/light/small,
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/structure/table/wood/fancy,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4;
+ pixel_y = 5
},
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
+/obj/item/reagent_containers/food/snacks/burger/plain,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aDU" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
+/obj/structure/table,
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_x = -3;
+ pixel_y = 9
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/item/reagent_containers/food/condiment/peppermill{
+ dir = 1;
+ pixel_x = 3;
+ pixel_y = 9
},
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aDV" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/meter,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/obj/structure/table/wood/fancy,
+/obj/machinery/light,
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_x = -3;
+ pixel_y = 20
+ },
+/obj/item/reagent_containers/food/condiment/peppermill{
+ dir = 1;
+ pixel_x = 3;
+ pixel_y = 20
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4;
+ pixel_y = 5
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aDW" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+/obj/machinery/holopad,
+/obj/machinery/camera{
+ c_tag = "Dorms Central"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
},
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -5;
+ pixel_y = 30
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aDX" = (
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/obj/structure/chair/sofa{
+ dir = 1
+ },
+/obj/structure/window,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aDY" = (
-/obj/structure/chair/stool,
-/obj/effect/landmark/start/mime,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel/white/side{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 11
},
-/area/crew_quarters/theatre)
+/obj/structure/mirror{
+ pixel_x = 25
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/toilet)
"aDZ" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -13304,29 +13607,17 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aEb" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Theatre Maintenance";
- req_access_txt = "46"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/structure/closet/secure_closet/personal/cabinet{
+ desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here.";
+ name = "Personal ID-Locked Closet";
+ pixel_y = 15
},
/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/area/maintenance/port)
"aEc" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 4
- },
-/area/crew_quarters/theatre)
+/obj/structure/chair/wood/wings,
+/turf/open/floor/plating,
+/area/maintenance/port)
"aEd" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -13360,9 +13651,8 @@
dir = 4
},
/obj/machinery/power/apc{
- dir = 2;
- name = "Chapel APC";
areastring = "/area/chapel/main";
+ name = "Chapel APC";
pixel_y = -24
},
/obj/structure/cable{
@@ -13424,11 +13714,121 @@
/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/chapel/main)
+"aEo" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aEp" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/structure/flora/ausbushes/ppflowers,
+/obj/structure/flora/ausbushes/ywflowers,
+/obj/structure/flora/ausbushes/brflowers,
+/obj/effect/spawner/structure/window,
+/turf/open/floor/grass,
+/area/crew_quarters/bar)
+"aEq" = (
+/obj/structure/chair/stool{
+ pixel_y = 8
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aEr" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#cee5d2"
+ },
+/obj/structure/table,
+/obj/structure/bedsheetbin/color,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
+"aEs" = (
+/obj/machinery/vending/cola/red,
+/turf/open/floor/plasteel/dark,
+/area/hallway/primary/central)
+"aEt" = (
+/obj/machinery/computer/arcade/minesweeper,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aEu" = (
+/obj/machinery/computer/arcade/battle,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aEv" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/closet/wardrobe/pjs,
+/obj/item/clothing/under/maid,
+/obj/item/clothing/under/maid,
+/obj/item/clothing/under/janimaid,
+/obj/item/clothing/under/janimaid,
+/obj/item/clothing/accessory/maidapron,
+/obj/item/clothing/accessory/maidapron,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
+"aEw" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
+"aEx" = (
+/obj/structure/table/reinforced,
+/obj/item/clothing/head/that,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
+"aEy" = (
+/obj/structure/table,
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_x = -9;
+ pixel_y = 9
+ },
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_x = -3;
+ pixel_y = 9
+ },
+/obj/item/reagent_containers/food/condiment/peppermill{
+ dir = 1;
+ pixel_x = -3
+ },
+/obj/item/reagent_containers/food/condiment/peppermill{
+ pixel_x = -9
+ },
+/obj/item/sharpener{
+ pixel_x = 10
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/kitchen)
"aEz" = (
/obj/machinery/power/apc{
+ areastring = "/area/hallway/secondary/entry";
dir = 4;
name = "Entry Hall APC";
- areastring = "/area/hallway/secondary/entry";
pixel_x = 24
},
/obj/structure/cable,
@@ -13685,97 +14085,68 @@
/turf/closed/wall/r_wall,
/area/ai_monitored/storage/eva)
"aFd" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/structure/table/wood,
+/obj/item/instrument/guitar{
+ pixel_x = -7
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/obj/item/instrument/eguitar{
+ pixel_x = 5
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
+/obj/item/instrument/violin,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aFe" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
+/obj/machinery/door/airlock{
+ id_tag = "Dorm2";
+ name = "Room One"
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"aFf" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aFg" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/closed/wall,
-/area/crew_quarters/toilet)
-"aFh" = (
-/obj/machinery/door/airlock{
- name = "Unisex Restrooms"
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/dorms)
+"aFf" = (
+/obj/structure/piano{
+ icon_state = "piano"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aFi" = (
-/obj/machinery/power/apc{
- dir = 4;
- name = "Dormitory Bathrooms APC";
- areastring = "/area/crew_quarters/toilet";
- pixel_x = 26
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aFj" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/blue{
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aFg" = (
+/obj/structure/chair/comfy/black{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/theatre)
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aFh" = (
+/obj/structure/chair/comfy/brown{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aFi" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aFj" = (
+/obj/structure/table,
+/obj/item/reagent_containers/food/drinks/britcup,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aFk" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
dir = 1
},
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
-/area/crew_quarters/theatre)
+/area/crew_quarters/bar)
"aFl" = (
/obj/machinery/light/small{
dir = 8
@@ -13808,12 +14179,17 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aFp" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/machinery/door/window/southright{
+ name = "Bar Door";
+ req_one_access_txt = "25;28"
},
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
"aFq" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -13846,6 +14222,20 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"aFt" = (
+/obj/structure/table/reinforced,
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_x = 32
+ },
+/obj/item/book/manual/wiki/barman_recipes,
+/obj/item/reagent_containers/rag,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
"aFu" = (
/turf/closed/wall,
/area/library)
@@ -13871,15 +14261,14 @@
/area/maintenance/starboard/fore)
"aFy" = (
/obj/machinery/power/apc{
- dir = 2;
- name = "Chapel Office APC";
areastring = "/area/chapel/office";
+ name = "Chapel Office APC";
pixel_y = -24
},
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
-/area/chapel/office)
+/area/maintenance/starboard/fore)
"aFz" = (
/turf/open/floor/plasteel/dark,
/area/chapel/main)
@@ -13899,6 +14288,36 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/chapel/main)
+"aFC" = (
+/obj/structure/table,
+/obj/item/reagent_containers/food/snacks/bluecherrycupcake{
+ pixel_y = 5
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aFD" = (
+/obj/structure/chair/comfy/brown{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aFE" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 23
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/toilet)
+"aFF" = (
+/obj/structure/chair/sofa{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aFG" = (
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -14044,7 +14463,9 @@
/turf/open/floor/plasteel,
/area/storage/primary)
"aFS" = (
-/obj/effect/landmark/start/assistant,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/storage/primary)
"aFT" = (
@@ -14054,9 +14475,8 @@
/turf/open/floor/plasteel,
/area/storage/primary)
"aFU" = (
-/obj/effect/landmark/start/assistant,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
+/obj/structure/chair/stool{
+ pixel_y = 8
},
/turf/open/floor/plasteel,
/area/storage/primary)
@@ -14075,8 +14495,6 @@
/area/gateway)
"aFX" = (
/obj/item/radio/intercom{
- freerange = 0;
- frequency = 1459;
name = "Station Intercom (General)";
pixel_x = -30
},
@@ -14168,7 +14586,7 @@
/area/ai_monitored/nuke_storage)
"aGf" = (
/obj/machinery/firealarm{
- dir = 4;
+ dir = 8;
pixel_x = 24
},
/turf/open/floor/plasteel,
@@ -14191,39 +14609,48 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/storage/eva)
"aGk" = (
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
+/turf/open/floor/plating,
+/area/space/nearstation)
"aGl" = (
-/obj/machinery/light_switch{
- pixel_x = 27
+/obj/structure/closet/crate,
+/obj/item/book/manual/wiki/telescience,
+/obj/item/book/manual/wiki/engineering_guide,
+/obj/item/book/manual/wiki/engineering_construction,
+/obj/item/book/manual/wiki/atmospherics,
+/obj/item/book/manual/wiki/detective,
+/obj/item/book/manual/wiki/tcomms,
+/obj/item/book/manual/wiki/engineering_singulo_tesla,
+/obj/item/book/manual/wiki/experimentor,
+/obj/item/book/manual/wiki/research_and_development,
+/obj/item/book/manual/wiki/robotics_cyborgs,
+/obj/item/book/manual/wiki/security_space_law,
+/obj/item/book/manual/wiki/medicine,
+/obj/item/book/manual/wiki/medical_cloning,
+/obj/item/book/manual/wiki/infections,
+/obj/item/book/manual/ripley_build_and_repair,
+/obj/item/book/manual/hydroponics_pod_people,
+/obj/item/book/manual/wiki/toxins,
+/obj/item/book/manual/wiki/grenades,
+/obj/item/book{
+ desc = "An undeniably handy book.";
+ icon_state = "bookknock";
+ name = "A Simpleton's Guide to Safe-cracking with Stethoscopes"
},
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
+/turf/open/floor/wood,
+/area/library)
"aGm" = (
-/obj/structure/toilet{
- pixel_y = 8
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/hydroponics)
"aGn" = (
-/obj/structure/toilet{
- pixel_y = 8
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
},
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/effect/landmark/blobstart,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
+/turf/open/floor/plasteel,
+/area/hydroponics)
"aGo" = (
/obj/structure/table,
/obj/item/stack/sheet/rglass{
@@ -14243,12 +14670,11 @@
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"aGp" = (
-/obj/machinery/light/small{
- dir = 8
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/obj/machinery/recharge_station,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
+/turf/open/floor/plasteel,
+/area/hydroponics)
"aGq" = (
/obj/item/stack/sheet/plasteel{
amount = 10
@@ -14300,28 +14726,13 @@
/turf/closed/wall,
/area/crew_quarters/theatre)
"aGw" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/closet/secure_closet/freezer/cream_pie,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/theatre)
+/obj/machinery/seed_extractor,
+/turf/open/floor/plasteel/dark,
+/area/hydroponics)
"aGx" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/crew_quarters/toilet)
+/obj/machinery/biogenerator,
+/turf/open/floor/plasteel/dark,
+/area/hydroponics)
"aGy" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -14479,6 +14890,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"aGK" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hydroponics)
"aGL" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -14520,15 +14937,9 @@
/turf/closed/wall,
/area/chapel/office)
"aGP" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/obj/machinery/vending/hydronutrients,
+/turf/open/floor/plasteel/dark,
+/area/hydroponics)
"aGQ" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -14541,6 +14952,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"aGR" = (
+/obj/machinery/vending/hydroseeds{
+ slogan_delay = 700
+ },
+/turf/open/floor/plasteel/dark,
+/area/hydroponics)
"aGS" = (
/obj/structure/cable{
icon_state = "2-8"
@@ -14632,17 +15049,33 @@
/area/hallway/secondary/entry)
"aHb" = (
/obj/structure/table/wood,
-/obj/item/paper_bin{
- pixel_x = 1;
- pixel_y = 9
+/obj/item/paper_bin/bundlenatural{
+ pixel_x = 6;
+ pixel_y = 4
},
-/obj/item/stack/packageWrap,
-/turf/open/floor/wood,
-/area/library)
+/obj/item/paper_bin{
+ pixel_x = -6;
+ pixel_y = 4
+ },
+/obj/item/pen/fountain,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/item/pen/fourcolor,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aHc" = (
-/obj/machinery/vending/games,
-/turf/open/floor/wood,
-/area/library)
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/effect/landmark/start/botanist,
+/turf/open/floor/plasteel,
+/area/hydroponics)
"aHd" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk,
@@ -14668,8 +15101,7 @@
pixel_y = 28
},
/obj/machinery/camera{
- c_tag = "Chapel Office";
- dir = 2
+ c_tag = "Chapel Office"
},
/turf/open/floor/plasteel/grimy,
/area/chapel/office)
@@ -14750,6 +15182,34 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/chapel/main)
+"aHr" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hydroponics)
+"aHs" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/hydroponics)
+"aHt" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#cee5d2"
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aHu" = (
/obj/machinery/status_display{
pixel_x = 32
@@ -14828,12 +15288,12 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/storage/eva)
"aHD" = (
-/obj/structure/chair/stool{
- pixel_y = 8
+/obj/structure/chair/comfy/beige{
+ dir = 8
},
/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel,
-/area/storage/primary)
+/turf/open/floor/plasteel/grimy,
+/area/hallway/secondary/entry)
"aHE" = (
/obj/structure/table,
/obj/item/weldingtool,
@@ -15000,38 +15460,67 @@
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"aHU" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/obj/structure/extinguisher_cabinet{
+ pixel_y = -30
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aHV" = (
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aHW" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aHX" = (
+/obj/machinery/light{
dir = 1
},
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/condiment/peppermill{
+ pixel_x = -9
},
-/obj/structure/mirror{
- pixel_x = -28
+/obj/item/reagent_containers/food/condiment/peppermill{
+ dir = 1;
+ pixel_x = -3
},
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aHV" = (
-/obj/machinery/door/airlock{
- name = "Unit 1"
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_x = -9;
+ pixel_y = 9
},
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aHW" = (
-/obj/machinery/door/airlock{
- name = "Unit 2"
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_x = -3;
+ pixel_y = 9
},
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"aHX" = (
-/obj/machinery/door/airlock{
- name = "Unit B"
+/obj/item/reagent_containers/food/condiment/pack/ketchup{
+ pixel_x = 5
},
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
+/obj/item/reagent_containers/food/condiment/pack/ketchup{
+ pixel_x = 5
+ },
+/obj/item/reagent_containers/food/condiment/pack/ketchup{
+ pixel_x = 5
+ },
+/obj/item/reagent_containers/food/condiment/pack/hotsauce{
+ pixel_x = 10
+ },
+/obj/item/reagent_containers/food/condiment/pack/hotsauce{
+ pixel_x = 10
+ },
+/obj/item/reagent_containers/food/condiment/pack/mustard{
+ pixel_x = 10
+ },
+/obj/item/reagent_containers/food/condiment/pack/mustard{
+ pixel_x = 10
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aHY" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
@@ -15039,23 +15528,12 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aHZ" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/structure/closet/crate/wooden/toy,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
+/obj/effect/turf_decal/tile/blue,
+/obj/structure/sign/poster/contraband/fun_police{
+ pixel_x = 32
},
/turf/open/floor/plasteel,
-/area/crew_quarters/theatre)
+/area/hallway/primary/fore)
"aIa" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -15065,9 +15543,9 @@
/area/maintenance/starboard/fore)
"aIb" = (
/obj/machinery/power/apc{
+ areastring = "/area/crew_quarters/theatre";
dir = 8;
name = "Theatre APC";
- areastring = "/area/crew_quarters/theatre";
pixel_x = -25
},
/obj/structure/cable,
@@ -15078,9 +15556,8 @@
/area/maintenance/starboard/fore)
"aIc" = (
/obj/machinery/power/apc{
- dir = 2;
- name = "Bar APC";
areastring = "/area/crew_quarters/bar";
+ name = "Bar APC";
pixel_y = -24
},
/obj/structure/cable,
@@ -15120,18 +15597,13 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/bot{
- dir = 2
- },
-/turf/open/floor/plasteel{
- dir = 2
- },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"aIh" = (
/obj/machinery/power/apc{
- dir = 2;
- name = "Kitchen APC";
areastring = "/area/crew_quarters/kitchen";
+ name = "Kitchen APC";
pixel_y = -24
},
/obj/structure/cable,
@@ -15140,6 +15612,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"aIi" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aIj" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -15190,9 +15668,8 @@
/area/maintenance/starboard/fore)
"aIn" = (
/obj/machinery/power/apc{
- dir = 2;
- name = "Hydroponics APC";
areastring = "/area/hydroponics";
+ name = "Hydroponics APC";
pixel_y = -24
},
/obj/structure/cable{
@@ -15219,21 +15696,15 @@
/turf/closed/wall,
/area/hydroponics)
"aIr" = (
-/obj/structure/filingcabinet,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/library)
+/turf/open/floor/plating,
+/area/crew_quarters/abandoned_gambling_den)
"aIs" = (
-/obj/structure/chair/office/dark,
-/obj/machinery/camera{
- c_tag = "Library North";
- dir = 2
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
},
+/obj/structure/chair/comfy/brown,
/turf/open/floor/wood,
-/area/library)
+/area/crew_quarters/bar)
"aIt" = (
/turf/open/floor/wood,
/area/library)
@@ -15253,16 +15724,11 @@
/turf/open/floor/wood,
/area/library)
"aIw" = (
-/obj/structure/chair/office/dark,
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/effect/landmark/start/assistant,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+ dir = 9
},
/turf/open/floor/wood,
-/area/library)
+/area/crew_quarters/bar)
"aIx" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -15273,29 +15739,35 @@
/turf/open/floor/wood,
/area/library)
"aIy" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/chapel/office)
+/obj/structure/table/wood,
+/obj/item/paper_bin{
+ pixel_x = 1;
+ pixel_y = 9
+ },
+/obj/item/stack/packageWrap,
+/obj/item/pen/fourcolor,
+/turf/open/floor/wood,
+/area/library)
"aIz" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk,
/turf/open/floor/plasteel/grimy,
/area/chapel/office)
"aIA" = (
-/obj/structure/table/wood,
-/obj/item/paper_bin{
- pixel_x = -2;
- pixel_y = 5
- },
-/obj/item/storage/crayons,
-/turf/open/floor/plasteel/grimy,
-/area/chapel/office)
-"aIB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/bodycontainer/crematorium{
id = "crematoriumChapel"
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
+"aIB" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"aIC" = (
@@ -15319,6 +15791,15 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/security/warden)
+"aIG" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aIH" = (
/obj/structure/table,
/obj/item/storage/box/lights/mixed,
@@ -15370,8 +15851,7 @@
/area/storage/primary)
"aIO" = (
/obj/machinery/camera{
- c_tag = "Arrivals Lounge";
- dir = 2
+ c_tag = "Arrivals Lounge"
},
/obj/machinery/light{
dir = 1
@@ -15405,7 +15885,7 @@
/obj/item/reagent_containers/glass/bucket,
/obj/item/plant_analyzer,
/obj/machinery/firealarm{
- dir = 8;
+ dir = 4;
pixel_x = -24
},
/obj/effect/turf_decal/tile/green,
@@ -15419,8 +15899,6 @@
/obj/structure/table/glass,
/obj/item/plant_analyzer,
/obj/item/radio/intercom{
- freerange = 0;
- frequency = 1459;
name = "Station Intercom (General)";
pixel_x = 29
},
@@ -15580,12 +16058,13 @@
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"aJk" = (
-/obj/machinery/door/airlock{
- name = "Theatre Backstage";
- req_access_txt = "46"
+/obj/machinery/holopad,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
/turf/open/floor/plasteel,
-/area/crew_quarters/theatre)
+/area/crew_quarters/dorms)
"aJl" = (
/obj/structure/tank_dispenser/oxygen,
/obj/machinery/light{
@@ -15597,12 +16076,11 @@
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"aJm" = (
-/obj/structure/sink/kitchen{
- pixel_y = 28
+/obj/machinery/light{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
+/turf/open/floor/plating,
+/area/crew_quarters/abandoned_gambling_den)
"aJn" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -15612,8 +16090,7 @@
dir = 1
},
/obj/machinery/camera{
- c_tag = "Central Hallway North";
- dir = 2
+ c_tag = "Central Hallway North"
},
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -15685,8 +16162,17 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aJv" = (
-/obj/machinery/vending/cola/random,
-/turf/open/floor/plasteel/dark,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/structure/sign/poster/contraband/robust_softdrinks{
+ pixel_x = -32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aJw" = (
/turf/closed/wall,
@@ -15706,6 +16192,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"aJz" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/dorms)
"aJA" = (
/obj/machinery/door/airlock/maintenance{
name = "Kitchen Maintenance";
@@ -15737,13 +16227,12 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aJE" = (
-/obj/item/reagent_containers/food/drinks/shaker,
-/obj/item/gun/ballistic/revolver/doublebarrel,
-/obj/structure/table/wood,
-/obj/item/stack/spacecash/c10,
-/obj/item/stack/spacecash/c100,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/abandoned_gambling_den)
"aJF" = (
/obj/machinery/newscaster{
pixel_x = 30
@@ -15770,9 +16259,6 @@
/area/chapel/office)
"aJH" = (
/obj/machinery/door/window/southleft{
- base_state = "left";
- dir = 2;
- icon_state = "left";
name = "Bar Delivery";
req_access_txt = "25"
},
@@ -15783,11 +16269,11 @@
/turf/closed/wall,
/area/crew_quarters/kitchen)
"aJJ" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/office)
+/obj/structure/table/wood,
+/obj/item/folder/yellow,
+/obj/item/pen/blue,
+/turf/open/floor/wood,
+/area/library)
"aJK" = (
/obj/machinery/navbeacon{
codes_txt = "delivery;dir=2";
@@ -15795,12 +16281,8 @@
location = "Kitchen"
},
/obj/structure/plasticflaps/opaque,
-/obj/effect/turf_decal/bot{
- dir = 2
- },
-/turf/open/floor/plasteel{
- dir = 2
- },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
"aJL" = (
/obj/machinery/navbeacon{
@@ -15809,30 +16291,26 @@
location = "Hydroponics"
},
/obj/structure/plasticflaps/opaque,
-/obj/effect/turf_decal/bot{
- dir = 2
- },
-/turf/open/floor/plasteel{
- dir = 2
- },
-/area/hydroponics)
-"aJM" = (
-/obj/structure/table/wood,
-/obj/item/flashlight/lamp{
- pixel_y = 10
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/grimy,
-/area/chapel/office)
-"aJN" = (
-/obj/structure/table,
-/obj/item/book/manual/hydroponics_pod_people,
-/obj/item/paper/guides/jobs/hydroponics,
+/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/hydroponics)
+"aJM" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
+"aJN" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/sign/departments/security{
+ pixel_x = -32;
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
"aJO" = (
/obj/structure/table,
/obj/machinery/reagentgrinder,
@@ -15840,30 +16318,55 @@
/area/hydroponics)
"aJP" = (
/obj/structure/table/wood,
-/obj/item/folder/yellow,
-/obj/item/pen,
-/turf/open/floor/wood,
-/area/library)
-"aJQ" = (
-/obj/structure/chair/office/dark{
+/obj/item/flashlight/lamp{
+ pixel_y = 10
+ },
+/obj/structure/disposalpipe/segment,
+/obj/item/nullrod,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/wood,
-/area/library)
-"aJR" = (
-/obj/structure/chair/office/dark{
+/turf/open/floor/plasteel/grimy,
+/area/chapel/office)
+"aJQ" = (
+/obj/machinery/light{
dir = 8
},
-/turf/open/floor/wood,
-/area/library)
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
+"aJR" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/neutral,
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aJS" = (
/obj/structure/table/wood,
/obj/structure/disposalpipe/segment,
+/obj/item/paicard,
/turf/open/floor/wood,
/area/library)
"aJT" = (
/obj/structure/table/wood,
-/obj/item/nullrod,
+/obj/item/paper_bin{
+ pixel_x = -2;
+ pixel_y = 5
+ },
+/obj/item/storage/crayons,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
@@ -15971,9 +16474,9 @@
icon_state = "0-4"
},
/obj/machinery/power/apc{
+ areastring = "/area/construction/mining/aux_base";
dir = 8;
name = "Auxillary Base Construction APC";
- areastring = "/area/construction/mining/aux_base";
pixel_x = -24
},
/obj/structure/cable{
@@ -15984,11 +16487,33 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"aKg" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
+"aKh" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
+"aKi" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/obj/structure/table,
+/obj/structure/bedsheetbin/towel,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aKj" = (
/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/neutral{
- dir = 2
- },
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"aKk" = (
@@ -16028,22 +16553,24 @@
/turf/open/floor/plating,
/area/storage/primary)
"aKq" = (
-/obj/item/radio/intercom{
- pixel_y = 25
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
},
-/obj/machinery/camera{
- c_tag = "Theatre Stage";
- dir = 2
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aKr" = (
-/obj/machinery/airalarm{
- dir = 2;
- pixel_y = 24
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aKs" = (
/obj/structure/disposalpipe/segment,
/obj/effect/spawner/structure/window,
@@ -16182,14 +16709,22 @@
/turf/open/floor/plasteel,
/area/hydroponics)
"aKJ" = (
-/obj/machinery/light_switch{
- pixel_y = 28
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_y = -29
},
-/obj/machinery/light{
- dir = 1
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aKK" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/closet/secure_closet/hydroponics,
@@ -16212,45 +16747,46 @@
/turf/open/floor/plasteel,
/area/hydroponics)
"aKM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aKN" = (
-/obj/structure/window/reinforced{
- dir = 4
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"aKO" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/machinery/firealarm{
- dir = 2;
- pixel_y = 24
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/area/crew_quarters/dorms)
+"aKN" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/chair/comfy/brown,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
+"aKO" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/chair/comfy/black,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aKP" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
+/obj/machinery/door/airlock{
+ name = "Unisex Restrooms"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/dorms)
"aKQ" = (
/obj/machinery/reagentgrinder,
/obj/structure/table/wood,
@@ -16260,11 +16796,13 @@
/turf/open/floor/wood,
/area/crew_quarters/bar)
"aKS" = (
-/obj/machinery/camera{
- c_tag = "Bar Storage"
+/obj/effect/turf_decal/tile/red,
+/obj/structure/sign/departments/security{
+ pixel_x = 32;
+ pixel_y = -32
},
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
"aKT" = (
/obj/structure/closet/secure_closet/freezer/meat,
/turf/open/floor/plasteel/showroomfloor,
@@ -16275,9 +16813,6 @@
/area/hydroponics)
"aKV" = (
/obj/machinery/door/window/southleft{
- base_state = "left";
- dir = 2;
- icon_state = "left";
name = "Kitchen Delivery";
req_access_txt = "28"
},
@@ -16317,8 +16852,9 @@
c_tag = "Chapel Crematorium";
dir = 4
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
+/obj/structure/bodycontainer/morgue,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
},
/turf/open/floor/plasteel/dark,
/area/chapel/office)
@@ -16387,11 +16923,9 @@
/turf/open/floor/wood,
/area/library)
"aLh" = (
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/library)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall,
+/area/crew_quarters/toilet)
"aLi" = (
/obj/structure/chair/comfy/beige,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -16467,6 +17001,23 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/main)
+"aLs" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Dorms South";
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aLt" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
@@ -16483,7 +17034,7 @@
/area/construction/mining/aux_base)
"aLv" = (
/obj/machinery/firealarm{
- dir = 8;
+ dir = 4;
pixel_x = -24
},
/obj/effect/turf_decal/stripes/line{
@@ -16550,9 +17101,9 @@
icon_state = "0-2"
},
/obj/machinery/power/apc{
- name = "Port Hall APC";
areastring = "/area/hallway/primary/port";
dir = 1;
+ name = "Port Hall APC";
pixel_y = 26
},
/turf/open/floor/plasteel,
@@ -16588,8 +17139,7 @@
/area/hallway/primary/port)
"aLL" = (
/obj/machinery/camera{
- c_tag = "Port Hallway 2";
- dir = 2
+ c_tag = "Port Hallway 2"
},
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -16628,15 +17178,18 @@
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"aLQ" = (
-/obj/machinery/camera{
- c_tag = "Central Hallway North-East";
- dir = 2
+/obj/structure/cable,
+/obj/machinery/power/apc{
+ areastring = "/area/crew_quarters/toilet";
+ dir = 4;
+ name = "Dormitory Bathrooms APC";
+ pixel_x = 26
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/table/glass,
+/obj/structure/bedsheetbin/towel,
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/toilet)
"aLR" = (
/obj/machinery/newscaster{
pixel_y = 32
@@ -16650,10 +17203,11 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aLS" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk,
+/turf/open/floor/plasteel/white/side{
dir = 4
},
-/turf/open/floor/wood,
/area/crew_quarters/theatre)
"aLT" = (
/obj/machinery/door/firedoor,
@@ -16678,15 +17232,13 @@
dir = 1
},
/obj/machinery/firealarm{
- dir = 2;
pixel_y = 24
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aLW" = (
/obj/machinery/camera{
- c_tag = "Central Hallway North-West";
- dir = 2
+ c_tag = "Central Hallway North-West"
},
/obj/machinery/airalarm{
pixel_y = 23
@@ -16746,14 +17298,12 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aMg" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/obj/machinery/vending/cola/pwr_game,
+/obj/structure/sign/poster/contraband/pwr_game{
+ pixel_y = 32
},
/turf/open/floor/plasteel,
-/area/hallway/primary/central)
+/area/crew_quarters/locker)
"aMh" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -16790,7 +17340,6 @@
/area/crew_quarters/kitchen)
"aMm" = (
/obj/machinery/firealarm{
- dir = 2;
pixel_y = 24
},
/turf/open/floor/plasteel,
@@ -16808,20 +17357,33 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aMp" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
+/obj/effect/landmark/blobstart,
+/turf/open/floor/plating,
+/area/maintenance/department/electrical)
"aMq" = (
-/obj/structure/piano{
- icon_state = "piano"
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
},
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aMr" = (
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aMs" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -16843,41 +17405,33 @@
/turf/open/floor/plasteel,
/area/hydroponics)
"aMu" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
+/obj/machinery/camera{
+ c_tag = "Bathrooms";
dir = 1
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/obj/structure/urinal{
+ pixel_y = 32
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/toilet)
"aMv" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"aMw" = (
-/obj/machinery/computer/slot_machine,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aMx" = (
-/obj/structure/chair/stool,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/toilet)
+"aMw" = (
+/obj/machinery/door/airlock{
+ name = "Unisex Restrooms"
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/hallway/primary/central)
+"aMx" = (
+/obj/machinery/door/airlock{
+ name = "Shower Room"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/toilet)
"aMy" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -16910,13 +17464,21 @@
/turf/open/floor/plasteel,
/area/hydroponics)
"aMB" = (
-/obj/machinery/vending/coffee,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
+/obj/effect/spawner/structure/window,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/abandoned_gambling_den)
"aMC" = (
-/obj/machinery/vending/cola/random,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/light_switch{
+ pixel_y = -25
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/abandoned_gambling_den)
"aMD" = (
/obj/machinery/icecream_vat,
/turf/open/floor/plasteel/showroomfloor,
@@ -16942,27 +17504,28 @@
/turf/open/floor/plasteel,
/area/hydroponics)
"aMH" = (
-/obj/structure/chair/office/dark{
- dir = 1
+/obj/machinery/door/airlock{
+ name = "Unisex Restrooms"
},
-/turf/open/floor/wood,
-/area/library)
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/bar)
"aMI" = (
/obj/machinery/light/small,
/obj/machinery/vending/wardrobe/hydro_wardrobe,
/turf/open/floor/plasteel,
/area/hydroponics)
"aMJ" = (
-/obj/structure/chair/office/dark{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/wood,
-/area/library)
+/turf/closed/wall,
+/area/crew_quarters/dorms)
"aMK" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
+/obj/structure/disposalpipe/segment{
+ dir = 5
},
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"aML" = (
@@ -16973,8 +17536,7 @@
/area/chapel/main)
"aMM" = (
/obj/machinery/camera{
- c_tag = "Chapel North";
- dir = 2
+ c_tag = "Chapel North"
},
/turf/open/floor/plasteel/dark,
/area/chapel/main)
@@ -17041,9 +17603,11 @@
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"aMW" = (
-/obj/structure/bodycontainer/morgue,
-/turf/open/floor/plasteel/dark,
-/area/chapel/office)
+/obj/structure/bookcase{
+ name = "Forbidden Knowledge"
+ },
+/turf/open/floor/carpet,
+/area/library)
"aMX" = (
/turf/open/floor/plasteel/grimy,
/area/chapel/office)
@@ -17124,6 +17688,13 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"aNn" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/chair/comfy/brown,
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aNo" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -17154,17 +17725,33 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aNt" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/chair/comfy/brown{
dir = 4
},
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"aNu" = (
-/obj/structure/closet/secure_closet/bar{
- req_access_txt = "25"
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
},
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
+"aNu" = (
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/crew_quarters/abandoned_gambling_den";
+ name = "Abandoned Gambling Den APC";
+ pixel_y = -24
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/abandoned_gambling_den)
"aNv" = (
/obj/effect/turf_decal/plaque{
icon_state = "L4"
@@ -17240,57 +17827,78 @@
/turf/open/floor/wood,
/area/crew_quarters/bar)
"aNF" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
},
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/item/reagent_containers/food/drinks/soda_cans/starkist{
+ pixel_x = -3;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
"aNG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/structure/chair/comfy/brown{
+ dir = 8
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/area/crew_quarters/dorms)
"aNH" = (
-/obj/machinery/door/window{
- dir = 4;
- name = "Theatre Stage"
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/sign/warning/fire{
+ desc = "A sign that states the labeled room's number.";
+ icon_state = "roomnum";
+ name = "Room Number 1";
+ pixel_x = -30;
+ pixel_y = -7
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aNI" = (
-/obj/machinery/computer/slot_machine,
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/status_display{
- pixel_x = 32
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
+/obj/structure/closet/jcloset,
+/obj/item/storage/bag/trash,
+/obj/item/clothing/under/janimaid,
+/obj/item/clothing/under/janimaid,
+/obj/item/clothing/under/janimaid,
+/obj/item/clothing/under/maid,
+/obj/item/clothing/under/maid,
+/obj/item/clothing/under/maid,
/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/area/janitor)
"aNJ" = (
-/obj/structure/chair/stool,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/structure/table,
+/obj/item/grenade/chem_grenade/cleaner,
+/obj/item/grenade/chem_grenade/cleaner,
+/obj/item/grenade/chem_grenade/cleaner,
+/obj/machinery/requests_console{
+ department = "Janitorial";
+ departmentType = 1;
+ pixel_y = -29
},
+/obj/item/reagent_containers/spray/cleaner,
+/obj/item/storage/box/lights/mixed,
+/obj/item/storage/box/lights/mixed,
/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/area/janitor)
"aNK" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 8
@@ -17343,6 +17951,7 @@
"aNR" = (
/obj/structure/table/wood,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/item/paicard,
/turf/open/floor/carpet,
/area/hallway/secondary/entry)
"aNS" = (
@@ -17379,9 +17988,11 @@
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"aNV" = (
-/obj/machinery/photocopier,
-/turf/open/floor/wood,
-/area/library)
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/abandoned_gambling_den)
"aNW" = (
/obj/machinery/door/airlock/public/glass{
name = "Chapel Office";
@@ -17588,6 +18199,15 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"aOu" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/chair/comfy/brown{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aOv" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -17712,32 +18332,56 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aOH" = (
-/obj/structure/window/reinforced,
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
+/obj/structure/closet/secure_closet/captains,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/obj/item/clothing/under/captainparade,
+/turf/open/floor/carpet,
+/area/crew_quarters/heads/captain)
"aOI" = (
/obj/structure/kitchenspike,
/turf/open/floor/plasteel/showroomfloor,
/area/crew_quarters/kitchen)
"aOJ" = (
-/obj/structure/window/reinforced,
-/obj/structure/window/reinforced{
- dir = 4
+/obj/item/radio/intercom{
+ dir = 8;
+ name = "Station Intercom (General)";
+ pixel_x = -28
},
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"aOK" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/crew_quarters/bar)
-"aOL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
+/obj/structure/closet/secure_closet/hop,
+/obj/effect/turf_decal/tile/blue{
dir = 1
},
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/item/clothing/suit/ianshirt,
/turf/open/floor/plasteel,
+/area/crew_quarters/heads/hop)
+"aOK" = (
+/obj/machinery/door/airlock{
+ name = "Theatre Backstage";
+ req_access_txt = "46"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
/area/crew_quarters/bar)
+"aOL" = (
+/obj/machinery/camera{
+ c_tag = "Central Hallway North-East"
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -5;
+ pixel_y = 30
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"aOM" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
@@ -17806,8 +18450,7 @@
"aOW" = (
/obj/machinery/hydroponics/constructable,
/obj/machinery/camera{
- c_tag = "Hydroponics North";
- dir = 2
+ c_tag = "Hydroponics North"
},
/turf/open/floor/plasteel/dark,
/area/hydroponics)
@@ -17864,29 +18507,38 @@
/turf/open/floor/wood,
/area/library)
"aPg" = (
-/obj/structure/bookcase{
- name = "Forbidden Knowledge"
- },
-/turf/open/floor/engine/cult,
-/area/library)
-"aPh" = (
-/obj/structure/table/wood,
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/pen/invisible,
-/turf/open/floor/engine/cult,
-/area/library)
-"aPi" = (
-/obj/structure/table/wood,
-/obj/item/taperecorder,
-/obj/item/camera,
/obj/item/radio/intercom{
pixel_y = 25
},
-/turf/open/floor/engine/cult,
+/obj/machinery/vending/wardrobe/curator_wardrobe,
+/turf/open/floor/carpet,
/area/library)
+"aPh" = (
+/obj/structure/table/wood,
+/obj/item/book/codex_gigas,
+/obj/item/clothing/under/suit_jacket/red,
+/obj/structure/destructible/cult/tome,
+/turf/open/floor/carpet,
+/area/library)
+"aPi" = (
+/obj/structure/chair/comfy/brown,
+/turf/open/floor/carpet,
+/area/library)
+"aPj" = (
+/obj/machinery/vr_sleeper{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness)
"aPk" = (
/turf/open/floor/plasteel/chapel{
dir = 4
@@ -17961,7 +18613,6 @@
/area/hallway/secondary/entry)
"aPv" = (
/obj/item/radio/intercom{
- broadcasting = 0;
name = "Station Intercom (General)";
pixel_y = 20
},
@@ -18080,6 +18731,19 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"aPP" = (
+/obj/structure/reagent_dispensers/watertank/high,
+/obj/structure/sign/poster/contraband/lizard{
+ pixel_x = -32
+ },
+/obj/structure/sign/poster/contraband/lizard{
+ pixel_x = -32
+ },
+/obj/structure/sign/poster/contraband/lizard{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel,
+/area/hydroponics)
"aPQ" = (
/turf/closed/wall,
/area/storage/tools)
@@ -18170,39 +18834,34 @@
/turf/open/floor/plating,
/area/bridge)
"aPY" = (
-/obj/structure/chair/stool,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/structure/table/optable{
+ name = "Robotics Operating Table"
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/obj/effect/landmark/event_spawn,
+/obj/item/tank/internals/anesthetic,
+/obj/item/clothing/mask/breath,
+/turf/open/floor/plasteel/dark,
+/area/science/robotics/lab)
"aPZ" = (
-/obj/structure/table,
-/obj/machinery/computer/security/telescreen/entertainment{
- pixel_x = -31
- },
-/obj/item/clothing/head/hardhat/cakehat,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/item/mop,
+/obj/item/reagent_containers/glass/bucket,
+/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6{
+ pixel_x = 32
},
/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/area/janitor)
"aQa" = (
-/obj/structure/table,
-/obj/item/kitchen/fork,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/structure/reagent_dispensers/watertank,
+/obj/structure/sign/poster/contraband/lusty_xenomorph{
+ pixel_x = 32
},
/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/area/janitor)
"aQb" = (
-/obj/structure/window/reinforced,
-/obj/structure/table/wood,
-/obj/item/instrument/violin,
-/turf/open/floor/wood,
+/obj/machinery/vending/autodrobe,
+/turf/open/floor/plasteel/white/side{
+ dir = 4
+ },
/area/crew_quarters/theatre)
"aQc" = (
/obj/effect/turf_decal/tile/bar,
@@ -18212,23 +18871,15 @@
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"aQd" = (
-/obj/structure/chair,
-/obj/effect/landmark/start/assistant,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
"aQe" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/chair/stool,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/turf/open/floor/plating,
+/area/space/nearstation)
"aQf" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/green{
@@ -18343,22 +18994,24 @@
/area/library)
"aQr" = (
/obj/machinery/light/small,
-/obj/machinery/vending/wardrobe/curator_wardrobe,
-/turf/open/floor/engine/cult,
+/obj/structure/table/wood/fancy,
+/turf/open/floor/carpet,
/area/library)
"aQs" = (
-/obj/structure/destructible/cult/tome,
-/obj/item/clothing/under/suit_jacket/red,
-/obj/item/book/codex_gigas,
-/turf/open/floor/engine/cult,
+/obj/structure/bed,
+/obj/item/bedsheet/black,
+/turf/open/floor/carpet,
/area/library)
"aQt" = (
-/obj/effect/landmark/blobstart,
-/obj/structure/chair/comfy/brown{
- dir = 1
- },
-/turf/open/floor/engine/cult,
-/area/library)
+/obj/structure/table,
+/obj/item/stack/cable_coil/random,
+/obj/item/stack/cable_coil/random,
+/obj/item/stack/cable_coil,
+/obj/item/paper_bin/construction,
+/obj/item/stack/cable_coil,
+/obj/item/pen/fourcolor,
+/turf/open/floor/plasteel,
+/area/storage/art)
"aQu" = (
/turf/open/floor/plasteel/chapel,
/area/chapel/main)
@@ -18494,37 +19147,67 @@
/area/crew_quarters/locker)
"aQO" = (
/obj/structure/closet/wardrobe/white,
+/obj/item/clothing/suit/ghost_sheet,
+/obj/item/clothing/suit/ghost_sheet,
+/obj/item/clothing/suit/ghost_sheet,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aQP" = (
-/obj/structure/reagent_dispensers/fueltank,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/chair/comfy/brown{
+ dir = 8
+ },
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aQQ" = (
/obj/machinery/light_switch{
pixel_y = 28
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aQQ" = (
-/obj/structure/reagent_dispensers/watertank,
+/obj/machinery/vending/cigarette,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aQR" = (
-/obj/machinery/vending/cola/random,
+/obj/machinery/camera{
+ c_tag = "Arrivals Bay 3 & 4";
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/landmark/start/assistant,
/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
+/area/hallway/secondary/entry)
"aQS" = (
/obj/machinery/vending/coffee,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aQT" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
+/obj/item/clothing/gloves/color/rainbow,
+/obj/item/clothing/head/soft/rainbow,
+/obj/item/clothing/shoes/sneakers/rainbow,
+/obj/item/clothing/under/color/rainbow,
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
"aQU" = (
-/obj/machinery/vending/kink,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
+/obj/structure/sign/poster/contraband/lizard{
+ pixel_x = -32
+ },
+/obj/structure/sign/poster/contraband/lizard{
+ pixel_x = -32
+ },
+/obj/structure/sign/poster/contraband/lizard{
+ pixel_x = -32
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"aQV" = (
-/obj/machinery/vending/clothing,
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aQW" = (
@@ -18532,18 +19215,19 @@
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aQX" = (
-/obj/machinery/firealarm{
- dir = 2;
- pixel_y = 24
+/obj/machinery/vending/clothing,
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aQY" = (
-/obj/structure/table,
-/obj/item/stack/cable_coil/random,
-/obj/item/stack/cable_coil/random,
+/obj/machinery/vending/autodrobe/all_access,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/turf/open/floor/plasteel,
-/area/storage/art)
+/area/crew_quarters/locker)
"aQZ" = (
/obj/machinery/light/small{
dir = 4
@@ -18736,47 +19420,30 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aRu" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/structure/chair/stool,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aRv" = (
-/obj/structure/chair{
- dir = 1
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aRw" = (
-/obj/structure/chair{
- dir = 1
- },
-/obj/effect/landmark/start/assistant,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aRx" = (
-/obj/structure/chair{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/machinery/vending/kink,
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#e8eaff"
},
/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/area/crew_quarters/fitness)
+"aRv" = (
+/obj/effect/landmark/blobstart,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
+"aRw" = (
+/obj/structure/fans/tiny/invisible,
+/turf/open/space/basic,
+/area/space)
+"aRx" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/plating,
+/area/space/nearstation)
"aRy" = (
/obj/structure/extinguisher_cabinet{
pixel_x = -5;
@@ -18795,7 +19462,9 @@
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"aRA" = (
-/obj/machinery/vending/dinnerware,
+/obj/machinery/vending/dinnerware{
+ contraband = list(/obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife/butcher = 2, /obj/item/reagent_containers/food/condiment/flour = 4)
+ },
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
"aRB" = (
@@ -18803,8 +19472,7 @@
pixel_y = 25
},
/obj/machinery/camera{
- c_tag = "Kitchen";
- dir = 2
+ c_tag = "Kitchen"
},
/obj/structure/closet/secure_closet/freezer/fridge,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -18875,9 +19543,9 @@
icon_state = "1-2"
},
/obj/machinery/power/apc{
+ areastring = "/area/library";
dir = 4;
name = "Library APC";
- areastring = "/area/library";
pixel_x = 24
},
/obj/structure/cable,
@@ -18920,7 +19588,7 @@
/area/library)
"aRR" = (
/obj/machinery/firealarm{
- dir = 8;
+ dir = 4;
pixel_x = -24
},
/turf/open/floor/plasteel/dark,
@@ -18945,13 +19613,13 @@
/area/hallway/secondary/exit)
"aRV" = (
/obj/machinery/power/apc{
+ areastring = "/area/storage/tools";
dir = 1;
name = "Auxiliary Tool Storage APC";
- areastring = "/area/storage/tools";
pixel_y = 24
},
/obj/machinery/firealarm{
- dir = 8;
+ dir = 4;
pixel_x = -24
},
/obj/structure/cable{
@@ -18990,8 +19658,7 @@
pixel_y = 28
},
/obj/machinery/camera{
- c_tag = "Auxiliary Tool Storage";
- dir = 2
+ c_tag = "Auxiliary Tool Storage"
},
/obj/structure/table,
/obj/item/stack/sheet/metal/fifty,
@@ -19012,7 +19679,7 @@
/area/storage/tools)
"aSd" = (
/obj/machinery/firealarm{
- dir = 2;
+ dir = 1;
pixel_y = -24
},
/turf/open/floor/plasteel,
@@ -19032,26 +19699,39 @@
/turf/open/floor/plating,
/area/maintenance/port)
"aSh" = (
-/obj/structure/closet/wardrobe/mixed,
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = -27
+/obj/structure/table,
+/obj/item/storage/toolbox/artistic{
+ pixel_y = 10
+ },
+/obj/item/storage/toolbox/artistic,
+/obj/item/storage/toolbox/electrical{
+ pixel_y = -10
},
/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
+/area/storage/art)
"aSi" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
-"aSk" = (
-/obj/structure/table,
-/obj/item/stack/cable_coil/random,
-/obj/item/stack/cable_coil/random,
-/obj/item/stack/cable_coil,
-/obj/item/paper_bin/construction,
-/obj/item/stack/cable_coil,
+"aSj" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/light,
/turf/open/floor/plasteel,
-/area/storage/art)
+/area/crew_quarters/dorms)
+"aSk" = (
+/obj/structure/table/wood,
+/obj/item/camera_film,
+/obj/item/camera_film,
+/obj/item/taperecorder,
+/obj/item/camera,
+/turf/open/floor/wood,
+/area/library)
"aSl" = (
/obj/machinery/light_switch{
pixel_y = 28
@@ -19067,36 +19747,50 @@
/turf/open/floor/plating,
/area/storage/emergency/port)
"aSo" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/trunk{
dir = 4
},
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aSp" = (
-/obj/structure/chair/stool,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aSq" = (
-/obj/structure/chair{
+/obj/machinery/disposal/bin,
+/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/light,
/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/area/crew_quarters/dorms)
+"aSp" = (
+/obj/structure/toilet{
+ dir = 4
+ },
+/obj/structure/mirror{
+ pixel_y = 32
+ },
+/obj/structure/sink{
+ dir = 1;
+ pixel_y = 25
+ },
+/obj/machinery/button/door{
+ id = "Bath1";
+ name = "Door Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 14;
+ pixel_y = 38;
+ specialfunctions = 4
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/toilet)
+"aSq" = (
+/obj/machinery/door/airlock{
+ name = "Recharging Station"
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore/secondary)
"aSr" = (
/turf/open/floor/plasteel,
/area/storage/tools)
@@ -19212,28 +19906,20 @@
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"aSG" = (
-/obj/structure/table/wood/poker,
-/obj/item/toy/cards/deck,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/structure/fireplace,
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 23
},
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/turf/open/floor/plating,
+/area/maintenance/port)
"aSH" = (
-/obj/structure/chair/stool,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/turf/open/space,
+/area/solar/starboard/aft)
"aSI" = (
/obj/machinery/door/airlock/public/glass{
name = "Kitchen";
@@ -19314,13 +20000,17 @@
/turf/open/floor/plasteel/dark,
/area/hydroponics)
"aSS" = (
-/obj/machinery/seed_extractor,
-/turf/open/floor/plasteel,
-/area/hydroponics)
+/obj/structure/lattice/catwalk,
+/obj/structure/cable,
+/turf/open/space,
+/area/solar/starboard/aft)
"aST" = (
-/obj/machinery/biogenerator,
-/turf/open/floor/plasteel,
-/area/hydroponics)
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/space,
+/area/solar/starboard/aft)
"aSU" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
@@ -19342,25 +20032,19 @@
/turf/open/floor/plasteel,
/area/storage/tools)
"aSX" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+/obj/machinery/vending/kink,
+/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aSY" = (
-/obj/structure/table/reinforced,
-/obj/item/clothing/head/that{
- throwforce = 1
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/area/crew_quarters/locker)
+"aSY" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/open/space,
+/area/solar/starboard/aft)
"aSZ" = (
/obj/effect/landmark/start/bartender,
/obj/effect/turf_decal/tile/bar,
@@ -19369,6 +20053,13 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
+"aTa" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/space,
+/area/solar/starboard/aft)
"aTb" = (
/obj/machinery/newscaster{
pixel_y = 32
@@ -19377,9 +20068,7 @@
/area/library)
"aTc" = (
/obj/machinery/door/window/northright{
- base_state = "right";
dir = 8;
- icon_state = "right";
name = "Library Desk Door";
req_access_txt = "37"
},
@@ -19475,6 +20164,20 @@
},
/turf/open/floor/plating,
/area/hallway/secondary/exit)
+"aTp" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/space,
+/area/solar/port/fore)
+"aTq" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/space,
+/area/solar/starboard/fore)
"aTr" = (
/obj/machinery/door/firedoor,
/obj/machinery/status_display{
@@ -19506,17 +20209,25 @@
/turf/open/floor/plating,
/area/maintenance/port)
"aTw" = (
-/obj/structure/closet/wardrobe/green,
-/obj/machinery/light{
- dir = 8
+/obj/structure/closet/wardrobe/mixed,
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_x = -27
},
+/obj/item/clothing/head/beret,
+/obj/item/clothing/head/beret,
+/obj/item/clothing/head/russobluecamohat,
+/obj/item/clothing/head/russobluecamohat,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aTx" = (
-/obj/structure/chair/stool{
- pixel_y = 8
+/obj/machinery/firealarm{
+ pixel_y = 24
},
-/obj/effect/landmark/start/assistant,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/vending/games,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aTy" = (
@@ -19524,45 +20235,71 @@
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aTz" = (
-/obj/structure/table,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aTA" = (
-/obj/structure/table,
-/obj/item/storage/toolbox/mechanical{
- pixel_x = -2;
- pixel_y = -1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aTB" = (
/obj/structure/chair/stool{
pixel_y = 8
},
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
-"aTC" = (
-/obj/structure/table,
-/obj/item/storage/toolbox/mechanical{
- pixel_x = -2;
- pixel_y = -1
+"aTA" = (
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 8
},
-/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel,
+/area/crew_quarters/locker)
+"aTB" = (
+/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/structure/window{
+ dir = 1
+ },
+/obj/structure/window{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/landmark/start/assistant,
+/turf/open/floor/plasteel,
+/area/crew_quarters/locker)
+"aTC" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/structure/window{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aTD" = (
-/obj/structure/closet/secure_closet/personal,
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
+/obj/effect/turf_decal/tile/red{
+ dir = 1
},
-/obj/machinery/camera{
- c_tag = "Locker Room East";
- dir = 8
- },
-/obj/machinery/light{
+/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/effect/turf_decal/tile/blue,
+/obj/structure/window{
+ dir = 1
+ },
+/obj/structure/window{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aTE" = (
@@ -19606,6 +20343,12 @@
/area/storage/emergency/port)
"aTL" = (
/obj/structure/table,
+/obj/item/storage/toolbox/artistic{
+ icon_state = "yellow";
+ item_state = "toolbox_yellow";
+ name = "Cable Toolbox";
+ pixel_y = 6
+ },
/obj/item/storage/toolbox/emergency,
/turf/open/floor/plasteel,
/area/storage/tools)
@@ -19615,10 +20358,15 @@
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
"aTN" = (
-/obj/structure/table,
-/obj/item/kitchen/rollingpin,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
+/obj/machinery/vending/dinnerware{
+ contraband = list(/obj/item/reagent_containers/food/condiment/flour = 4);
+ desc = "This vendor is full of condiments to put on food.";
+ name = "\improper Condiments Vendor";
+ product_ads = "Get your sauces here!;No slave labour was used to make these products!;Nanotrasen Approved?!";
+ products = list(/obj/item/storage/bag/tray = 8, /obj/item/reagent_containers/food/drinks/drinkingglass = 10, /obj/item/storage/box/cups = 5, /obj/item/reagent_containers/food/condiment/pack/ketchup = 20, /obj/item/reagent_containers/food/condiment/pack/mustard = 20, /obj/item/reagent_containers/food/condiment/pack/hotsauce = 20, /obj/item/reagent_containers/food/condiment/pack/astrotame = 20, /obj/item/reagent_containers/food/condiment/saltshaker = 20, /obj/item/reagent_containers/food/condiment/peppermill = 20)
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
"aTO" = (
/obj/structure/table,
/obj/item/book/manual/chef_recipes,
@@ -19738,28 +20486,19 @@
/turf/open/floor/plasteel,
/area/bridge)
"aUf" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "0-4"
},
-/obj/machinery/camera{
- c_tag = "Bar West";
- dir = 4
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/turf/open/space,
+/area/solar/port/aft)
"aUg" = (
-/obj/structure/chair,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/turf/open/space,
+/area/solar/port/aft)
"aUh" = (
/obj/structure/table/reinforced,
/obj/machinery/door/window/eastleft{
@@ -19784,15 +20523,28 @@
/turf/open/floor/plasteel/dark,
/area/hydroponics)
"aUj" = (
-/obj/machinery/vending/hydronutrients,
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aUk" = (
-/obj/machinery/vending/hydroseeds{
- slogan_delay = 700
+/obj/item/soap,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/light/small{
+ dir = 1;
+ light_color = "#ffc1c1"
},
-/turf/open/floor/plasteel,
-/area/hydroponics)
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/toilet)
+"aUk" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/machinery/camera{
+ c_tag = "VR Sleepers";
+ dir = 1
+ },
+/obj/machinery/light/small,
+/turf/open/floor/plasteel/white/side{
+ dir = 1
+ },
+/area/crew_quarters/fitness)
"aUl" = (
/obj/structure/chair/office/dark{
dir = 8
@@ -19817,39 +20569,71 @@
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aUp" = (
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/machinery/camera{
+ c_tag = "Locker Room East";
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 4
+ },
/obj/structure/table,
-/obj/item/clothing/head/soft/grey{
- pixel_x = -2;
- pixel_y = 3
+/obj/item/reagent_containers/rag/towel/random,
+/obj/item/razor,
+/turf/open/floor/plasteel,
+/area/crew_quarters/locker)
+"aUq" = (
+/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
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aUq" = (
-/obj/structure/table,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/structure/window{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
dir = 4
},
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aUr" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/obj/effect/landmark/start/assistant,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aUs" = (
-/obj/structure/table,
-/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aUt" = (
@@ -19859,12 +20643,27 @@
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aUu" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/window{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aUv" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
@@ -19911,10 +20710,17 @@
/turf/open/floor/wood,
/area/library)
"aUC" = (
-/obj/structure/chair/comfy/black,
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/wood,
-/area/library)
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/obj/effect/landmark/start/mime,
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/open/floor/plasteel/white/side{
+ dir = 4
+ },
+/area/crew_quarters/theatre)
"aUD" = (
/obj/structure/table/wood,
/obj/item/flashlight/lamp/green{
@@ -19966,6 +20772,15 @@
dir = 1
},
/area/chapel/main)
+"aUL" = (
+/obj/machinery/computer/arcade,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/hallway/secondary/exit)
"aUM" = (
/obj/machinery/camera{
c_tag = "Arrivals Bay 2";
@@ -19984,11 +20799,29 @@
/turf/open/floor/wood,
/area/security/vacantoffice)
"aUP" = (
-/obj/machinery/airalarm{
- pixel_y = 23
+/obj/structure/toilet{
+ dir = 4
},
-/turf/open/floor/wood,
-/area/security/vacantoffice)
+/obj/structure/mirror{
+ pixel_y = 32
+ },
+/obj/structure/sink{
+ dir = 1;
+ pixel_y = 25
+ },
+/obj/machinery/button/door{
+ id = "Bath2";
+ name = "Door Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 14;
+ pixel_y = 38;
+ specialfunctions = 4
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/crew_quarters/toilet)
"aUQ" = (
/obj/structure/table/wood,
/turf/open/floor/wood,
@@ -20012,18 +20845,29 @@
/turf/open/floor/plating,
/area/maintenance/port)
"aUU" = (
-/obj/structure/closet/wardrobe/grey,
-/obj/machinery/requests_console{
- department = "Locker Room";
- pixel_x = -32
+/obj/structure/closet/wardrobe/green,
+/obj/machinery/light{
+ dir = 8
},
+/obj/item/clothing/under/kilt,
+/obj/item/clothing/under/kilt,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aUV" = (
-/obj/structure/chair/stool{
- pixel_y = 8
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/door/window/westright{
+ name = "Red Corner"
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
dir = 4
},
/turf/open/floor/plasteel,
@@ -20040,17 +20884,29 @@
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aUY" = (
-/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aUZ" = (
-/obj/structure/closet/secure_closet/personal,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
+/obj/structure/table,
+/obj/item/clothing/gloves/boxing/yellow,
+/obj/item/clothing/gloves/boxing/green,
+/obj/item/clothing/gloves/boxing/blue,
+/obj/item/clothing/gloves/boxing/blue,
+/obj/item/clothing/gloves/boxing,
+/obj/item/clothing/gloves/boxing,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aVa" = (
@@ -20128,9 +20984,9 @@
/area/bridge)
"aVh" = (
/obj/machinery/power/apc{
+ areastring = "/area/hallway/primary/fore";
dir = 8;
name = "Fore Primary Hallway APC";
- areastring = "/area/hallway/primary/fore";
pixel_x = -24
},
/obj/structure/cable{
@@ -20295,8 +21151,7 @@
/area/hallway/primary/central)
"aVv" = (
/obj/machinery/camera{
- c_tag = "Bridge East Entrance";
- dir = 2
+ c_tag = "Bridge East Entrance"
},
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -20307,40 +21162,42 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aVw" = (
-/obj/structure/table/wood/poker,
-/obj/item/clothing/mask/cigarette/cigar,
-/obj/item/toy/cards/deck,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/obj/effect/landmark/carpspawn,
+/turf/open/space/basic,
+/area/space)
"aVx" = (
-/obj/machinery/holopad,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "holoprivacy";
+ name = "Holodeck Shutters"
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/fitness)
"aVy" = (
-/obj/structure/table/reinforced,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/table,
+/obj/item/storage/firstaid/regular{
+ pixel_y = 5
},
/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/area/crew_quarters/fitness)
"aVz" = (
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
"aVA" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/firedoor,
-/obj/item/reagent_containers/food/snacks/pie/cream,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/side{
+ dir = 4
+ },
+/area/crew_quarters/theatre)
"aVB" = (
/obj/structure/table,
/obj/item/reagent_containers/food/condiment/enzyme{
@@ -20360,15 +21217,18 @@
/turf/open/floor/plating,
/area/maintenance/port)
"aVD" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/condiment/saltshaker{
- pixel_x = -3
+/obj/machinery/door/airlock/maintenance{
+ name = "Theatre Maintenance";
+ req_access_txt = "46"
},
-/obj/item/reagent_containers/food/condiment/peppermill{
- pixel_x = 3
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/theatre)
"aVE" = (
/obj/structure/table,
/obj/item/storage/box/donkpockets{
@@ -20384,10 +21244,18 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
+"aVG" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/obj/structure/table,
+/obj/item/coin/gold,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
"aVH" = (
/obj/machinery/processor,
/obj/machinery/firealarm{
- dir = 4;
+ dir = 8;
pixel_x = 24
},
/turf/open/floor/plasteel/cafeteria,
@@ -20409,9 +21277,14 @@
/turf/open/floor/plasteel/dark,
/area/hydroponics)
"aVK" = (
-/obj/effect/landmark/start/botanist,
-/turf/open/floor/plasteel,
-/area/hydroponics)
+/obj/machinery/shower{
+ dir = 4
+ },
+/obj/item/radio/intercom{
+ pixel_y = 25
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/toilet)
"aVL" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -20454,10 +21327,9 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"aVP" = (
-/obj/structure/table/wood,
-/obj/item/paper,
-/turf/open/floor/wood,
-/area/library)
+/obj/machinery/vending/autodrobe/all_access,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
"aVQ" = (
/obj/structure/chair/comfy/black{
dir = 8
@@ -20466,27 +21338,32 @@
/area/library)
"aVR" = (
/obj/structure/table/wood,
-/obj/item/pen/red,
-/obj/item/pen/blue{
- pixel_x = 5;
- pixel_y = 5
+/obj/item/paper_bin/bundlenatural{
+ pixel_x = 6;
+ pixel_y = 4
},
+/obj/item/paper_bin{
+ pixel_x = -6;
+ pixel_y = 4
+ },
+/obj/item/pen/fountain,
+/obj/item/pen/fourcolor,
/turf/open/floor/wood,
/area/library)
"aVS" = (
/obj/structure/table/wood,
-/obj/item/camera_film,
-/obj/item/camera_film,
+/obj/item/pen/red,
/turf/open/floor/wood,
/area/library)
"aVT" = (
/obj/structure/table/wood,
-/obj/item/paper_bin{
- pixel_x = 1;
- pixel_y = 9
+/obj/item/reagent_containers/food/drinks/bottle/whiskey{
+ pixel_x = 3
},
-/turf/open/floor/wood,
-/area/library)
+/obj/item/lighter,
+/obj/item/restraints/handcuffs,
+/turf/open/floor/carpet,
+/area/security/detectives_office)
"aVU" = (
/obj/structure/chair/stool,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -20587,6 +21464,7 @@
/area/chapel/main)
"aWh" = (
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
+/obj/item/beacon,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"aWi" = (
@@ -20629,6 +21507,14 @@
"aWn" = (
/obj/structure/closet/wardrobe/black,
/obj/item/clothing/shoes/jackboots,
+/obj/item/clothing/under/janimaid,
+/obj/item/clothing/under/janimaid,
+/obj/item/clothing/under/maid,
+/obj/item/clothing/under/maid,
+/obj/item/clothing/accessory/maidapron,
+/obj/item/clothing/accessory/maidapron,
+/obj/item/clothing/head/beret/black,
+/obj/item/clothing/head/beret/black,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aWo" = (
@@ -20689,9 +21575,9 @@
/area/maintenance/port)
"aWw" = (
/obj/machinery/power/apc{
+ areastring = "/area/storage/art";
dir = 1;
name = "Art Storage";
- areastring = "/area/storage/art";
pixel_y = 24
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -20721,9 +21607,9 @@
/area/crew_quarters/toilet/locker)
"aWz" = (
/obj/machinery/power/apc{
+ areastring = "/area/storage/emergency/port";
dir = 1;
name = "Port Emergency Storage APC";
- areastring = "/area/storage/emergency/port";
pixel_y = 24
},
/obj/structure/cable{
@@ -20741,9 +21627,21 @@
/turf/open/floor/plating,
/area/maintenance/port)
"aWB" = (
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plating,
-/area/maintenance/port)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/locker)
"aWC" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -20971,9 +21869,8 @@
/area/bridge)
"aWW" = (
/obj/machinery/power/apc/highcap/five_k{
- dir = 2;
- name = "Bridge APC";
areastring = "/area/bridge";
+ name = "Bridge APC";
pixel_y = -24
},
/obj/structure/cable,
@@ -21124,51 +22021,51 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aXi" = (
-/obj/machinery/light{
+/obj/machinery/vending/clothing,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
+"aXj" = (
+/obj/structure/reagent_dispensers/water_cooler,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/machinery/computer/security/telescreen/entertainment{
- pixel_x = -31
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aXj" = (
-/obj/structure/table/reinforced,
-/obj/item/lighter,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/area/crew_quarters/dorms)
"aXk" = (
-/obj/structure/table/reinforced,
-/obj/machinery/computer/security/telescreen/entertainment{
- pixel_x = 32
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
-/obj/item/book/manual/wiki/barman_recipes,
-/obj/item/reagent_containers/rag,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/machinery/door/window/eastleft{
+ name = "Blue Corner"
+ },
+/obj/effect/turf_decal/tile/blue{
dir = 1
},
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/area/crew_quarters/locker)
"aXl" = (
-/obj/machinery/door/window/southright{
- name = "Bar Door";
- req_one_access_txt = "25;28"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/structure/disposalpipe/junction,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
},
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/area/crew_quarters/dorms)
"aXm" = (
/obj/effect/landmark/start/cook,
/turf/open/floor/plasteel/cafeteria,
@@ -21204,29 +22101,33 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"aXr" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
},
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aXs" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 4
+/obj/machinery/door/airlock/maintenance{
+ name = "Detective Maintenance";
+ req_access_txt = "4"
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/area/maintenance/port)
"aXt" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 2
+/obj/machinery/power/apc{
+ areastring = "/area/security/detectives_office";
+ dir = 4;
+ name = "Detective's Office APC";
+ pixel_x = 24
},
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-21";
- pixel_x = -3;
- pixel_y = 3
+/obj/structure/cable{
+ icon_state = "0-8"
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
+/turf/open/floor/plasteel/grimy,
+/area/security/detectives_office)
"aXu" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -21234,20 +22135,45 @@
/turf/open/floor/carpet,
/area/library)
"aXv" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/window{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aXw" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 2
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aXx" = (
-/obj/structure/closet/secure_closet/personal,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aXy" = (
@@ -21268,10 +22194,19 @@
/turf/open/floor/carpet,
/area/chapel/main)
"aXA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/corner{
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/structure/window{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
dir = 1
},
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aXB" = (
@@ -21305,19 +22240,24 @@
/turf/closed/wall,
/area/quartermaster/warehouse)
"aXF" = (
-/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/tile/neutral{
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/obj/item/paper_bin/bundlenatural{
+ pixel_x = 6;
+ pixel_y = 4
},
-/obj/effect/turf_decal/tile/neutral{
+/obj/item/pen/fountain{
+ pixel_x = 6
+ },
+/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/fitness)
+/obj/item/pen/fourcolor,
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
"aXG" = (
/obj/machinery/light{
dir = 4
@@ -21330,6 +22270,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
+"aXH" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"aXI" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
@@ -21379,15 +22323,16 @@
/turf/open/floor/wood,
/area/security/vacantoffice)
"aXO" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
},
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
+/area/crew_quarters/dorms)
"aXP" = (
/obj/machinery/portable_atmospherics/canister/air,
/turf/open/floor/plating,
@@ -21467,9 +22412,9 @@
/area/security/vacantoffice)
"aYa" = (
/obj/machinery/power/apc{
+ areastring = "/area/maintenance/port";
dir = 8;
name = "Port Maintenance APC";
- areastring = "/area/maintenance/port";
pixel_x = -27;
pixel_y = 2
},
@@ -21498,12 +22443,12 @@
/turf/open/floor/plating,
/area/maintenance/port)
"aYc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
/turf/closed/wall,
/area/quartermaster/warehouse)
"aYd" = (
@@ -21535,19 +22480,17 @@
/area/construction)
"aYh" = (
/obj/structure/disposalpipe/segment{
- dir = 4
+ dir = 10
},
-/obj/machinery/light/small{
- dir = 4
+/obj/machinery/button/door{
+ id = "kanyewest";
+ name = "Privacy Shutters";
+ pixel_y = 24
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
+/obj/structure/rack,
+/obj/item/storage/briefcase,
+/turf/open/floor/plasteel/grimy,
+/area/security/detectives_office)
"aYi" = (
/obj/structure/closet/secure_closet/detective,
/obj/structure/disposalpipe/segment{
@@ -21559,15 +22502,8 @@
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
"aYj" = (
-/obj/structure/table/wood,
-/obj/item/taperecorder,
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/button/door{
- id = "kanyewest";
- name = "Privacy Shutters";
- pixel_y = 24
+/obj/machinery/light/small{
+ dir = 8
},
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
@@ -21764,9 +22700,8 @@
/area/hallway/primary/central)
"aYF" = (
/obj/machinery/power/apc{
- dir = 2;
- name = "Central Hall APC";
areastring = "/area/hallway/primary/central";
+ name = "Central Hall APC";
pixel_y = -24
},
/obj/structure/cable,
@@ -21784,28 +22719,24 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aYH" = (
-/obj/structure/table,
-/obj/item/razor,
-/obj/structure/window{
- dir = 1
+/obj/structure/table/wood,
+/obj/item/paper/fluff{
+ info = "Renovation Notice
The bar layout for the station is very old. We've decided to give it a facelift after our partnership with IKEA Intergalactic?.
| Damage: | \ +Brute | \ +Burn | \ +Toxin | \ +Suffocation |
| Overall: | \ +[brute_loss] | \ +[fire_loss] | \ +[tox_loss] | \ +[oxy_loss] |
| [capitalize(org.name)]: | \ +[(org.brute_dam > 0) ? "[org.brute_dam]" : "0"] | \ +[(org.burn_dam > 0) ? "[org.burn_dam]" : "0"] |
| [sanitize(R.name)] ([price_listed]) | " + if(R.amount > 0 && ((C && C.registered_account && onstation) || (!onstation && isliving(user)))) + dat += "[R.amount] Vend | " + else + dat += "Not Available | " + dat += "
"
dat += "Flavor Text" dat += "Set Examine Text" @@ -1201,7 +1196,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += " " dat += " \ + dat += " \ Quirk balance remaining: [GetQuirkBalance()] " for(var/V in SSquirks.quirks) var/datum/quirk/T = SSquirks.quirks[V] @@ -1232,12 +1227,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) LOCKED: [lock_reason] " else if(has_quirk) - dat += "[quirk_name] - [initial(T.desc)] \ - [has_quirk ? "Lose" : "Take"] ([quirk_cost] pts.) " + dat += "[has_quirk ? "Remove" : "Take"] ([quirk_cost] pts.) \ + [quirk_name] - [initial(T.desc)] " else - dat += "[quirk_name] - [initial(T.desc)] \ - [has_quirk ? "Lose" : "Take"] ([quirk_cost] pts.) " - dat += " " + dat += " Quirk Preferences ", 900, 600) //no reason not to reuse the occupation window, as it's cleaner that way
popup.set_window_options("can_close=0")
@@ -1251,6 +1246,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
bal -= initial(T.value)
return bal
+/datum/preferences/proc/GetPositiveQuirkCount()
+ . = 0
+ for(var/q in all_quirks)
+ if(SSquirks.quirk_points[q] > 0)
+ .++
+
/datum/preferences/Topic(href, href_list, hsrc) //yeah, gotta do this I guess..
. = ..()
if(href_list["close"])
@@ -1316,43 +1317,30 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/quirk = href_list["trait"]
if(!SSquirks.quirks[quirk])
return
+ for(var/V in SSquirks.quirk_blacklist) //V is a list
+ var/list/L = V
+ for(var/Q in all_quirks)
+ if((quirk in L) && (Q in L) && !(Q == quirk)) //two quirks have lined up in the list of the list of quirks that conflict with each other, so return (see quirks.dm for more details)
+ to_chat(user, "[quirk] is incompatible with [Q].")
+ return
var/value = SSquirks.quirk_points[quirk]
- if(value == 0)
- if(quirk in neutral_quirks)
- neutral_quirks -= quirk
- all_quirks -= quirk
- else
- neutral_quirks += quirk
- all_quirks += quirk
+ var/balance = GetQuirkBalance()
+ if(quirk in all_quirks)
+ if(balance + value < 0)
+ to_chat(user, "Refunding this would cause you to go below your balance!")
+ return
+ all_quirks -= quirk
else
- var/balance = GetQuirkBalance()
- if(quirk in positive_quirks)
- positive_quirks -= quirk
- all_quirks -= quirk
- else if(quirk in negative_quirks)
- if(balance + value < 0)
- to_chat(user, "Refunding this would cause you to go below your balance!")
- return
- negative_quirks -= quirk
- all_quirks -= quirk
- else if(value > 0)
- if(positive_quirks.len >= MAX_QUIRKS)
- to_chat(user, "You can't have more than [MAX_QUIRKS] positive quirks!")
- return
- if(balance - value < 0)
- to_chat(user, "You don't have enough balance to gain this quirk!")
- return
- positive_quirks += quirk
- all_quirks += quirk
- else
- negative_quirks += quirk
- all_quirks += quirk
+ if(GetPositiveQuirkCount() >= MAX_QUIRKS)
+ to_chat(user, "You can't have more than [MAX_QUIRKS] positive quirks!")
+ return
+ if(balance - value < 0)
+ to_chat(user, "You don't have enough balance to gain this quirk!")
+ return
+ all_quirks += quirk
SetQuirks(user)
if("reset")
all_quirks = list()
- positive_quirks = list()
- negative_quirks = list()
- neutral_quirks = list()
SetQuirks(user)
else
SetQuirks(user)
@@ -1565,10 +1553,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(new_mutantcolor == "#000000")
features["mcolor"] = pref_species.default_color
- update_preview_icon()
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
- update_preview_icon()
else
to_chat(user, "Invalid color. Your color is not bright enough.")
@@ -1578,10 +1564,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(new_mutantcolor == "#000000")
features["mcolor2"] = pref_species.default_color
- update_preview_icon()
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
features["mcolor2"] = sanitize_hexcolor(new_mutantcolor)
- update_preview_icon()
else
to_chat(user, "Invalid color. Your color is not bright enough.")
@@ -1591,10 +1575,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(new_mutantcolor == "#000000")
features["mcolor3"] = pref_species.default_color
- update_preview_icon()
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
features["mcolor3"] = sanitize_hexcolor(new_mutantcolor)
- update_preview_icon()
else
to_chat(user, "Invalid color. Your color is not bright enough.")
@@ -1736,14 +1718,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["body_markings"] = new_body_markings
if(new_body_markings != "None")
features["mam_body_markings"] = "None"
- update_preview_icon()
if("legs")
var/new_legs
new_legs = input(user, "Choose your character's legs:", "Character Preference") as null|anything in GLOB.legs_list
if(new_legs)
features["legs"] = new_legs
- update_preview_icon()
if("insect_wings")
var/new_insect_wings
@@ -1829,7 +1809,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else if(new_mam_body_markings == "None")
features["mam_body_markings"] = "Plain"
features["body_markings"] = "None"
- update_preview_icon()
//Xeno Bodyparts
if("xenohead")//Head or caste type
@@ -2307,8 +2286,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
pref_species = new /datum/species/human
save_character()
- character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE)
character.dna.features = features.Copy()
+ character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE)
character.dna.real_name = character.real_name
character.dna.nameless = character.nameless
character.dna.custom_species = character.custom_species
@@ -2337,7 +2316,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(icon_updates)
character.update_body()
character.update_hair()
- character.update_body_parts()
/datum/preferences/proc/get_default_name(name_id)
switch(name_id)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 29ea8f5821..f7f49a66af 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -112,7 +112,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(current_version < 24 && S["feature_exhibitionist"])
var/datum/quirk/exhibitionism/E
var/quirk_name = initial(E.name)
- neutral_quirks += quirk_name
all_quirks += quirk_name
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
@@ -386,9 +385,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Quirks
S["all_quirks"] >> all_quirks
- S["positive_quirks"] >> positive_quirks
- S["negative_quirks"] >> negative_quirks
- S["neutral_quirks"] >> neutral_quirks
//Citadel code
S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"]
@@ -519,10 +515,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
all_quirks = SANITIZE_LIST(all_quirks)
- positive_quirks = SANITIZE_LIST(positive_quirks)
- negative_quirks = SANITIZE_LIST(negative_quirks)
- neutral_quirks = SANITIZE_LIST(neutral_quirks)
-
cit_character_pref_load(S)
return 1
@@ -598,9 +590,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Quirks
WRITE_FILE(S["all_quirks"] , all_quirks)
- WRITE_FILE(S["positive_quirks"] , positive_quirks)
- WRITE_FILE(S["negative_quirks"] , negative_quirks)
- WRITE_FILE(S["neutral_quirks"] , neutral_quirks)
cit_character_pref_save(S)
diff --git a/code/modules/client/verbs/aooc.dm b/code/modules/client/verbs/aooc.dm
index 311c22955d..3f86a617e6 100644
--- a/code/modules/client/verbs/aooc.dm
+++ b/code/modules/client/verbs/aooc.dm
@@ -116,7 +116,7 @@ GLOBAL_VAR_INIT(normal_aooc_colour, "#ce254f")
antaglisting |= M.current.client
for(var/mob/M in GLOB.player_list)
- if(M.client && (M.stat == DEAD || M.client.holder))
+ if(M.client && (M.stat == DEAD || M.client.holder || is_special_character(M)))
antaglisting |= M.client
for(var/client/C in antaglisting)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index d142699a21..dc9e46c4b4 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -62,7 +62,7 @@
if(ismecha(M.loc)) // stops inventory actions in a mech
return
- if(!M.incapacitated() && loc == M && istype(over_object, /obj/screen/inventory/hand))
+ if(!. && !M.incapacitated() && loc == M && istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
if(M.putItemFromInventoryInHandIfPossible(src, H.held_index))
add_fingerprint(usr)
@@ -253,16 +253,14 @@ BLIND // can't see anything
H.update_suit_sensors()
/obj/item/clothing/under/AltClick(mob/user)
- if(..())
- return 1
-
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
+ if(attached_accessory)
+ remove_accessory(user)
else
- if(attached_accessory)
- remove_accessory(user)
- else
- rolldown()
+ rolldown()
+ return TRUE
/obj/item/clothing/under/verb/jumpsuit_adjust()
set name = "Adjust Jumpsuit Style"
diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm
index 1dcaeb35fa..6775279ef6 100644
--- a/code/modules/clothing/ears/_ears.dm
+++ b/code/modules/clothing/ears/_ears.dm
@@ -18,7 +18,7 @@
/obj/item/clothing/ears/earmuffs/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/earhealing)
+ AddElement(/datum/element/earhealing)
AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS))
/obj/item/clothing/ears/headphones
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index 608f71cf11..206165a495 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -43,15 +43,16 @@
//called when thermal glasses are emped.
/obj/item/clothing/glasses/proc/thermal_overload()
- if(ishuman(src.loc))
- var/mob/living/carbon/human/H = src.loc
- if(!(HAS_TRAIT(H, TRAIT_BLIND)))
- if(H.glasses == src)
- to_chat(H, "[src] overloads and blinds you!")
- H.flash_act(visual = 1)
- H.blind_eyes(3)
- H.blur_eyes(5)
- H.adjust_eye_damage(5)
+ if(!ishuman(loc))
+ return
+ var/mob/living/carbon/human/H = loc
+ var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
+ if((!HAS_TRAIT(H, TRAIT_BLIND) || !eyes) && H.glasses == src)
+ to_chat(H, "[src] overloads and blinds you!")
+ H.flash_act(visual = 1)
+ H.blind_eyes(3)
+ H.blur_eyes(5)
+ eyes.applyOrganDamage(5)
/obj/item/clothing/glasses/meson
name = "optical meson scanner"
@@ -427,19 +428,17 @@
..()
/obj/item/clothing/glasses/AltClick(mob/user)
+ . = ..()
if(glass_colour_type && ishuman(user))
var/mob/living/carbon/human/H = user
- if(H.client)
- if(H.client.prefs)
- if(src == H.glasses)
- H.client.prefs.uses_glasses_colour = !H.client.prefs.uses_glasses_colour
- if(H.client.prefs.uses_glasses_colour)
- to_chat(H, "You will now see glasses colors.")
- else
- to_chat(H, "You will no longer see glasses colors.")
- H.update_glasses_color(src, 1)
- else
- return ..()
+ if(H.client?.prefs && src == H.glasses)
+ H.client.prefs.uses_glasses_colour = !H.client.prefs.uses_glasses_colour
+ if(H.client.prefs.uses_glasses_colour)
+ to_chat(H, "You will now see glasses colors.")
+ else
+ to_chat(H, "You will no longer see glasses colors.")
+ H.update_glasses_color(src, 1)
+ return TRUE
/obj/item/clothing/glasses/proc/change_glass_color(mob/living/carbon/human/H, datum/client_colour/glass_colour/new_color_type)
var/old_colour_type = glass_colour_type
diff --git a/modular_citadel/code/modules/clothing/glasses/phantomthief.dm b/code/modules/clothing/glasses/phantomthief.dm
similarity index 100%
rename from modular_citadel/code/modules/clothing/glasses/phantomthief.dm
rename to code/modules/clothing/glasses/phantomthief.dm
diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm
index 358942627d..ec6db20cc4 100644
--- a/code/modules/clothing/head/_head.dm
+++ b/code/modules/clothing/head/_head.dm
@@ -41,14 +41,14 @@
H.update_inv_head()
-///Special throw_impact for hats to frisbee hats at people to place them on their heads/attempt to de-hat them.
+///Special throw_impact for hats to frisbee hats at people to place them on their heads.
/obj/item/clothing/head/throw_impact(atom/hit_atom, datum/thrownthing/thrownthing)
. = ..()
///if the thrown object's target zone isn't the head
if(thrownthing.target_zone != BODY_ZONE_HEAD)
return
- ///ignore any hats with the tinfoil counter-measure enabled
- if(clothing_flags & ANTI_TINFOIL_MANEUVER)
+ ///ignore any hats with downsides when worn
+ if(clothing_flags & IGNORE_HAT_TOSS)
return
///if the hat happens to be capable of holding contents and has something in it. mostly to prevent super cheesy stuff like stuffing a mini-bomb in a hat and throwing it
if(LAZYLEN(contents))
@@ -57,20 +57,8 @@
var/mob/living/carbon/H = hit_atom
if(istype(H.head, /obj/item))
var/obj/item/WH = H.head
- ///check if the item has NODROP
- if(HAS_TRAIT(WH, TRAIT_NODROP))
- H.visible_message("[src] bounces off [H]'s [WH.name]!", "[src] bounces off your [WH.name], falling to the floor.")
- return
- ///check if the item is an actual clothing head item, since some non-clothing items can be worn
- if(istype(WH, /obj/item/clothing/head))
- var/obj/item/clothing/head/WHH = WH
- ///SNUG_FIT hats are immune to being knocked off
- if(WHH.clothing_flags & SNUG_FIT)
- H.visible_message("[src] bounces off [H]'s [WHH.name]!", "[src] bounces off your [WHH.name], falling to the floor.")
- return
- ///if the hat manages to knock something off
- if(H.dropItemToGround(WH))
- H.visible_message("[src] knocks [WH] off [H]'s head!", "[WH] is suddenly knocked off your head by [src]!")
+ H.visible_message("[src] bounces off [H]'s [WH.name]!", "[src] bounces off your [WH.name], falling to the floor.")
+ return
if(H.equip_to_slot_if_possible(src, SLOT_HEAD, FALSE, TRUE))
H.visible_message("[src] lands neatly on [H]'s head!", "[src] lands perfectly onto your head!")
return
@@ -84,6 +72,8 @@
R.visible_message("[src] lands neatly on top of [R].", "[src] lands perfectly on top of you.")
R.place_on_head(src) //hats aren't designed to snugly fit borg heads or w/e so they'll always manage to knock eachother off
+
+
/obj/item/clothing/head/worn_overlays(isinhands = FALSE)
. = list()
if(!isinhands)
diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm
index 5457d32e8a..dc7e1df15f 100644
--- a/code/modules/clothing/head/collectable.dm
+++ b/code/modules/clothing/head/collectable.dm
@@ -13,14 +13,12 @@
/obj/item/clothing/head/collectable/slime
name = "collectable slime cap!"
desc = "It just latches right in place!"
- clothing_flags = SNUG_FIT
icon_state = "slime"
dynamic_hair_suffix = ""
/obj/item/clothing/head/collectable/xenom
name = "collectable xenomorph helmet!"
desc = "Hiss hiss hiss!"
- clothing_flags = SNUG_FIT
icon_state = "xenom"
/obj/item/clothing/head/collectable/chef
@@ -29,7 +27,6 @@
icon_state = "chef"
item_state = "chef"
dynamic_hair_suffix = ""
-
dog_fashion = /datum/dog_fashion/head/chef
/obj/item/clothing/head/collectable/paper
@@ -73,14 +70,13 @@
desc = "A collectable welding helmet. Now with 80% less lead! Not for actual welding. Any welding done while wearing this helmet is done so at the owner's own risk!"
icon_state = "welding"
item_state = "welding"
- clothing_flags = SNUG_FIT
+ resistance_flags = NONE
/obj/item/clothing/head/collectable/slime
name = "collectable slime hat"
desc = "Just like a real brain slug!"
icon_state = "headslime"
item_state = "headslime"
- clothing_flags = SNUG_FIT
/obj/item/clothing/head/collectable/flatcap
name = "collectable flat cap"
@@ -124,7 +120,6 @@
/obj/item/clothing/head/collectable/hardhat
name = "collectable hard hat"
desc = "WARNING! Offers no real protection, or luminosity, but damn, is it fancy!"
- clothing_flags = SNUG_FIT
icon_state = "hardhat0_yellow"
item_state = "hardhat0_yellow"
@@ -147,7 +142,7 @@
desc = "Go Red! I mean Green! I mean Red! No Green!"
icon_state = "thunderdome"
item_state = "thunderdome"
- clothing_flags = SNUG_FIT
+ resistance_flags = NONE
flags_inv = HIDEHAIR
/obj/item/clothing/head/collectable/swat
@@ -155,5 +150,5 @@
desc = "That's not real blood. That's red paint." //Reference to the actual description
icon_state = "swat"
item_state = "swat"
- clothing_flags = SNUG_FIT
+ resistance_flags = NONE
flags_inv = HIDEHAIR
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index d72e4ba1d7..19f03dfd0a 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -11,7 +11,6 @@
armor = list("melee" = 15, "bullet" = 5, "laser" = 20,"energy" = 10, "bomb" = 20, "bio" = 10, "rad" = 20, "fire" = 100, "acid" = 50)
flags_inv = 0
actions_types = list(/datum/action/item_action/toggle_helmet_light)
- clothing_flags = SNUG_FIT
resistance_flags = FIRE_PROOF
dynamic_hair_suffix = "+generic"
@@ -116,8 +115,10 @@
toggle_helmet_light(user)
/obj/item/clothing/head/hardhat/weldhat/AltClick(mob/user)
+ . = ..()
if(user.canUseTopic(src, BE_CLOSE))
toggle_welding_screen(user)
+ return TRUE
/obj/item/clothing/head/hardhat/weldhat/proc/toggle_welding_screen(mob/living/user)
if(weldingvisortoggle(user))
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 8a1cc01bd5..be6e270e45 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -10,7 +10,7 @@
heat_protection = HEAD
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
strip_delay = 60
- clothing_flags = SNUG_FIT
+ resistance_flags = NONE
flags_cover = HEADCOVERSEYES
flags_inv = HIDEHAIR
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 8ff6fe8bd1..05116c8b97 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -104,16 +104,16 @@
. += "Alt-click to take a candy corn."
/obj/item/clothing/head/fedora/det_hat/AltClick(mob/user)
- if(user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
- ..()
- if(loc == user)
- if(candy_cooldown < world.time)
- var/obj/item/reagent_containers/food/snacks/candy_corn/CC = new /obj/item/reagent_containers/food/snacks/candy_corn(src)
- user.put_in_hands(CC)
- to_chat(user, "You slip a candy corn from your hat.")
- candy_cooldown = world.time+1200
- else
- to_chat(user, "You just took a candy corn! You should wait a couple minutes, lest you burn through your stash.")
+ . = ..()
+ if(loc == user && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ if(candy_cooldown < world.time)
+ var/obj/item/reagent_containers/food/snacks/candy_corn/CC = new /obj/item/reagent_containers/food/snacks/candy_corn(src)
+ user.put_in_hands(CC)
+ to_chat(user, "You slip a candy corn from your hat.")
+ candy_cooldown = world.time+1200
+ else
+ to_chat(user, "You just took a candy corn! You should wait a couple minutes, lest you burn through your stash.")
+ return TRUE
//Mime
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 071e52b46d..3fa5d56d1e 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -67,14 +67,12 @@
desc = "A plastic replica of a Syndicate agent's space helmet. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
mutantrace_variation = MUTANTRACE_VARIATION
- clothing_flags = SNUG_FIT
/obj/item/clothing/head/cueball
name = "cueball helmet"
desc = "A large, featureless white orb meant to be worn on your head. How do you even see out of this thing?"
icon_state = "cueball"
item_state="cueball"
- clothing_flags = SNUG_FIT
flags_cover = HEADCOVERSEYES|HEADCOVERSMOUTH
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
@@ -83,7 +81,6 @@
desc = "A ball of white styrofoam. So festive."
icon_state = "snowman_h"
item_state = "snowman_h"
- clothing_flags = SNUG_FIT
flags_cover = HEADCOVERSEYES
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
@@ -93,7 +90,6 @@
icon_state = "justicered"
item_state = "justicered"
flags_inv = HIDEHAIR|HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT
- clothing_flags = SNUG_FIT
flags_cover = HEADCOVERSEYES
/obj/item/clothing/head/justice/blue
@@ -117,10 +113,8 @@
desc = "Wearing these makes you look useless, and only good for your sex appeal."
icon_state = "bunny"
dynamic_hair_suffix = ""
-
dog_fashion = /datum/dog_fashion/head/rabbit
-
/obj/item/clothing/head/flatcap
name = "flat cap"
desc = "A working man's cap."
@@ -165,7 +159,6 @@
icon_state = "chickenhead"
item_state = "chickensuit"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
- clothing_flags = SNUG_FIT
/obj/item/clothing/head/griffin
name = "griffon head"
@@ -173,7 +166,6 @@
icon_state = "griffinhat"
item_state = "griffinhat"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
- clothing_flags = SNUG_FIT
/obj/item/clothing/head/bearpelt
name = "bear pelt hat"
@@ -187,7 +179,6 @@
item_state = "xenos_helm"
desc = "A helmet made out of chitinous alien hide."
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
- clothing_flags = SNUG_FIT
/obj/item/clothing/head/fedora
name = "fedora"
@@ -212,7 +203,6 @@
item_state = "sombrero"
desc = "You can practically taste the fiesta."
flags_inv = HIDEHAIR
-
dog_fashion = /datum/dog_fashion/head/sombrero
/obj/item/clothing/head/sombrero/green
@@ -309,7 +299,6 @@
desc = "When everything's going to crab, protecting your head is the best choice."
icon_state = "lobster_hat"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
- clothing_flags = SNUG_FIT
/obj/item/clothing/head/drfreezehat
name = "doctor freeze's wig"
@@ -377,3 +366,29 @@
item_state = "assu_helmet"
desc = "A cheap replica of old riot helmet without visor. It has \"D.A.B.\" written on the front."
flags_inv = HIDEHAIR
+
+/obj/item/clothing/head/hotel
+ name = "Telegram cap"
+ desc = "A bright red cap warn by hotel staff. Or people who want to be a singing telegram"
+ icon_state = "telegram"
+ item_color = "telegram"
+ dog_fashion = /datum/dog_fashion/head/telegram
+
+/obj/item/clothing/head/colour
+ name = "Singer cap"
+ desc = "A light white hat that has bands of color. Just makes you want to sing and dance!"
+ icon_state = "colour"
+ item_color = "colour"
+ dog_fashion = /datum/dog_fashion/head/colour
+
+/obj/item/clothing/head/christmashat
+ name = "red santa hat"
+ desc = "A red Christmas Hat! How festive!"
+ icon_state = "christmashat"
+ item_state = "christmashat"
+
+/obj/item/clothing/head/christmashatg
+ name = "green santa hat"
+ desc = "A green Christmas Hat! How festive!"
+ icon_state = "christmashatg"
+ item_state = "christmashatg"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index a3a4f1d859..127bf4c773 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -29,7 +29,6 @@
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
resistance_flags = FIRE_PROOF
mutantrace_variation = MUTANTRACE_VARIATION
- clothing_flags = SNUG_FIT
/obj/item/clothing/head/welding/attack_self(mob/user)
weldingvisortoggle(user)
@@ -116,7 +115,6 @@
item_state = "hardhat0_pumpkin"
item_color = "pumpkin"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
- clothing_flags = SNUG_FIT
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
brightness_on = 2 //luminosity when on
flags_cover = HEADCOVERSEYES
@@ -165,7 +163,6 @@
desc = "A helmet made out of a box."
icon_state = "cardborg_h"
item_state = "cardborg_h"
- clothing_flags = SNUG_FIT
flags_cover = HEADCOVERSEYES
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
@@ -230,7 +227,6 @@
desc = "A crude helmet made out of bronze plates. It offers very little in the way of protection."
icon = 'icons/obj/clothing/clockwork_garb.dmi'
icon_state = "clockwork_helmet_old"
- clothing_flags = SNUG_FIT
flags_inv = HIDEEARS|HIDEHAIR
armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20)
@@ -243,7 +239,7 @@
equip_delay_other = 140
var/datum/brain_trauma/mild/phobia/paranoia
var/warped = FALSE
- clothing_flags = ANTI_TINFOIL_MANEUVER
+ clothing_flags = IGNORE_HAT_TOSS
/obj/item/clothing/head/foilhat/Initialize(mapload)
. = ..()
@@ -258,8 +254,8 @@
return
if(paranoia)
QDEL_NULL(paranoia)
- paranoia = new()
- user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC, "conspiracies")
+ paranoia = new("conspiracies")
+ user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC)
to_chat(user, "As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. ")
/obj/item/clothing/head/foilhat/MouseDrop(atom/over_object)
@@ -301,3 +297,16 @@
. = ..()
if(!warped)
warp_up()
+
+/obj/item/clothing/head/flakhelm //Actually the M1 Helmet
+ name = "flak helmet"
+ icon_state = "m1helm"
+ item_state = "helmet"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0.1, "bio" = 0, "rad" = 0, "fire" = -10, "acid" = -15)
+ desc = "A dilapidated helmet used in ancient wars. This one is brittle and essentially useless. An ace of spades is tucked into the band around the outer shell."
+ pocket_storage_component_path = /datum/component/storage/concrete/pockets/tiny/spacenam //So you can stuff other things in the elastic band instead of it simply being a fluff thing.
+
+//The "pocket" for the M1 helmet so you can tuck things into the elastic band
+
+/datum/component/storage/concrete/pockets/tiny/spacenam
+ attack_hand_interact = TRUE //So you can actually see what you stuff in there
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index 8754c89511..69ec1ccedd 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -22,11 +22,11 @@
/obj/item/clothing/head/soft/AltClick(mob/user)
- ..()
+ . = ..()
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
- else
- flip(user)
+ flip(user)
+ return TRUE
/obj/item/clothing/head/soft/proc/flip(mob/user)
@@ -139,4 +139,4 @@
flags_inv = HIDEEYES|HIDEFACE
armor = list("melee" = 35, "bullet" = 35, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 90)
strip_delay = 90 //You dont take a Major Leage cap
- dog_fashion = null
\ No newline at end of file
+ dog_fashion = null
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index 7d0c4a455e..f4335d17e8 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -23,11 +23,11 @@
adjustmask(user)
/obj/item/clothing/mask/breath/AltClick(mob/user)
- ..()
+ . = ..()
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
- else
- adjustmask(user)
+ adjustmask(user)
+ return TRUE
/obj/item/clothing/mask/breath/examine(mob/user)
. = ..()
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 2356bb16eb..e863dc8860 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -66,7 +66,9 @@
var/obj/item/organ/heart/heart = M.getorganslot(ORGAN_SLOT_HEART)
var/obj/item/organ/lungs/lungs = M.getorganslot(ORGAN_SLOT_LUNGS)
- if(!(M.stat == DEAD || (HAS_TRAIT(M, TRAIT_FAKEDEATH))))
+ if (!do_mob(user,M,60)) // Stethoscope should take a moment to listen
+ return // FAIL
+ if(!(M.stat == DEAD || (HAS_TRAIT(M, TRAIT_FAKEDEATH)) || (HAS_TRAIT(M, TRAIT_NOPULSE))))
if(heart && istype(heart))
heart_strength = "an unstable"
if(heart.beating)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 080d9281cf..3d318db761 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -129,6 +129,21 @@
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+/obj/item/clothing/shoes/winterboots/christmasbootsr
+ name = "red christmas boots"
+ desc = "A pair of fluffy red christmas boots!"
+ icon_state = "christmasbootsr"
+
+/obj/item/clothing/shoes/winterboots/christmasbootsg
+ name = "green christmas boots"
+ desc = "A pair of fluffy green christmas boots!"
+ icon_state = "christmasbootsg"
+
+/obj/item/clothing/shoes/winterboots/santaboots
+ name = "santa boots"
+ desc = "A pair of santa boots! How traditional!!"
+ icon_state = "santaboots"
+
/obj/item/clothing/shoes/workboots
name = "work boots"
desc = "Nanotrasen-issue Engineering lace-up work boots for the especially blue-collar."
diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm
index 117fbc49e0..57866b5131 100644
--- a/code/modules/clothing/spacesuits/_spacesuits.dm
+++ b/code/modules/clothing/spacesuits/_spacesuits.dm
@@ -4,7 +4,7 @@
name = "space helmet"
icon_state = "spaceold"
desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays."
- clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SNUG_FIT
+ clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
item_state = "spaceold"
permeability_coefficient = 0.01
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70)
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index e7032ead13..0d22b16388 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -65,7 +65,7 @@
/obj/item/clothing/head/helmet/space/hardsuit/proc/display_visor_message(var/msg)
var/mob/wearer = loc
if(msg && ishuman(wearer))
- wearer.show_message("[icon2html(src, wearer)][msg]", 1)
+ wearer.show_message("[icon2html(src, wearer)][msg]", MSG_VISUAL)
/obj/item/clothing/head/helmet/space/hardsuit/rad_act(severity)
. = ..()
@@ -212,7 +212,7 @@
icon_state = "hardsuit0-white"
item_state = "ce_helm"
item_color = "white"
- armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 90, "fire" = 100, "acid" = 90)
+ armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 90)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
@@ -221,7 +221,7 @@
name = "advanced hardsuit"
desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish."
item_state = "ce_hardsuit"
- armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 90, "fire" = 100, "acid" = 90)
+ armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 95, "fire" = 100, "acid" = 90)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite
@@ -964,13 +964,12 @@
. += energy_overlay
/obj/item/clothing/suit/space/hardsuit/lavaknight/AltClick(mob/living/user)
- if(user.incapacitated() || !istype(user))
+ . = ..()
+ if(!in_range(src, user) || !istype(user))
+ return
+ if(user.incapacitated())
to_chat(user, "You can't do that right now!")
- return
- if(!in_range(src, user))
- return
- if(user.incapacitated() || !istype(user) || !in_range(src, user))
- return
+ return TRUE
if(alert("Are you sure you want to recolor your armor stripes?", "Confirm Repaint", "Yes", "No") == "Yes")
var/energy_color_input = input(usr,"","Choose Energy Color",energy_color) as color|null
@@ -986,6 +985,7 @@
user.update_inv_wear_suit()
light_color = energy_color
update_light()
+ return TRUE
/obj/item/clothing/suit/space/hardsuit/lavaknight/examine(mob/user)
. = ..()
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 369ddba7b9..5d0a9b9914 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -4,7 +4,7 @@
icon_state = "bio"
desc = "A hood that protects the head and face from biological contaminants."
permeability_coefficient = 0.01
- clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | SNUG_FIT
+ clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 60, "fire" = 30, "acid" = 100)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT
resistance_flags = ACID_PROOF
diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm
index be81374868..b8287c7f4c 100644
--- a/code/modules/clothing/suits/cloaks.dm
+++ b/code/modules/clothing/suits/cloaks.dm
@@ -69,7 +69,6 @@
icon_state = "golhood"
desc = "A protective & concealing hood."
armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60)
- clothing_flags = SNUG_FIT
flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
/obj/item/clothing/suit/hooded/cloak/drake
@@ -89,7 +88,6 @@
icon_state = "dragon"
desc = "The skull of a dragon."
armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100)
- clothing_flags = SNUG_FIT
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 53800615e9..6548b4e7fe 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -505,6 +505,21 @@
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
flags_inv = HIDEHAIR|HIDEEARS
+/obj/item/clothing/suit/hooded/wintercoat/centcom
+ name = "centcom winter coat"
+ icon_state = "coatcentcom"
+ item_state = "coatcentcom"
+ armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom
+
+/obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize()
+ . = ..()
+ allowed = GLOB.security_wintercoat_allowed
+
+/obj/item/clothing/head/hooded/winterhood/centcom
+ icon_state = "winterhood_centcom"
+ armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50)
+
/obj/item/clothing/suit/hooded/wintercoat/captain
name = "captain's winter coat"
icon_state = "coatcaptain"
@@ -723,6 +738,15 @@
/obj/item/clothing/head/hooded/winterhood/qm
icon_state = "winterhood_qm"
+/obj/item/clothing/suit/hooded/wintercoat/aformal
+ name = "assistant's formal winter coat"
+ icon_state = "coataformal"
+ item_state = "coataformal"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/aformal
+
+/obj/item/clothing/head/hooded/winterhood/aformal
+ icon_state = "winterhood_aformal"
+
/obj/item/clothing/suit/hooded/wintercoat/miner
name = "mining winter coat"
icon_state = "coatminer"
@@ -734,6 +758,27 @@
/obj/item/clothing/head/hooded/winterhood/miner
icon_state = "winterhood_miner"
+/obj/item/clothing/suit/hooded/wintercoat/ratvar
+ name = "ratvarian winter coat"
+ icon_state = "coatratvar"
+ item_state = "coatratvar"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/ratvar
+
+/obj/item/clothing/head/hooded/winterhood/ratvar
+ icon_state = "winterhood_ratvar"
+ light_range = 3
+ light_power = 1
+ light_color = "#B18B25" //clockwork slab background top color
+
+/obj/item/clothing/suit/hooded/wintercoat/narsie
+ name = "narsian winter coat"
+ icon_state = "coatnarsie"
+ item_state = "coatnarsie"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/narsie
+
+/obj/item/clothing/head/hooded/winterhood/narsie
+ icon_state = "winterhood_narsie"
+
/obj/item/clothing/suit/spookyghost
name = "spooky ghost"
desc = "This is obviously just a bedsheet, but maybe try it on?"
@@ -763,6 +808,17 @@
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD
alternate_worn_layer = UNDER_HEAD_LAYER
+/obj/item/clothing/suit/flakjack
+ name = "flak jacket"
+ desc = "A dilapidated jacket made of a supposedly bullet-proof material (Hint: It isn't.). Smells faintly of napalm."
+ icon_state = "flakjack"
+ item_state = "redtag"
+ blood_overlay_type = "armor"
+ body_parts_covered = CHEST
+ resistance_flags = NONE
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -5, "acid" = -15) //nylon sucks against acid
+
/obj/item/clothing/suit/assu_suit
name = "DAB suit"
desc = "A cheap replica of old SWAT armor. On its back, it is written: \"Desperate Assistance Battleforce\"."
@@ -772,3 +828,33 @@
body_parts_covered = CHEST|GROIN|ARMS|LEGS
flags_inv = HIDEJUMPSUIT
resistance_flags = NONE
+
+/obj/item/clothing/suit/hooded/wintercoat/christmascoatr
+ name = "red christmas coat"
+ desc = "A festive red Christmas coat! Smells like Candy Cane!"
+ icon_state = "christmascoatr"
+ item_state = "christmascoatr"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/christmashoodr
+
+/obj/item/clothing/head/hooded/winterhood/christmashoodr
+ icon_state = "christmashoodr"
+
+/obj/item/clothing/suit/hooded/wintercoat/christmascoatg
+ name = "green christmas coat"
+ desc = "A festive green Christmas coat! Smells like Candy Cane!"
+ icon_state = "christmascoatg"
+ item_state = "christmascoatg"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/christmashoodg
+
+/obj/item/clothing/head/hooded/winterhood/christmashoodg
+ icon_state = "christmashoodg"
+
+/obj/item/clothing/suit/hooded/wintercoat/christmascoatrg
+ name = "red and green christmas coat"
+ desc = "A festive red and green Christmas coat! Smells like Candy Cane!"
+ icon_state = "christmascoatrg"
+ item_state = "christmascoatrg"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/christmashoodrg
+
+/obj/item/clothing/head/hooded/winterhood/christmashoodrg
+ icon_state = "christmashoodrg"
diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm
index 5b2291e59c..0d2f68f580 100644
--- a/code/modules/clothing/suits/reactive_armour.dm
+++ b/code/modules/clothing/suits/reactive_armour.dm
@@ -50,7 +50,8 @@
icon_state = "reactiveoff"
item_state = "reactiveoff"
add_fingerprint(user)
- return
+ if(user.get_item_by_slot(SLOT_WEAR_SUIT) == src)
+ user.update_inv_wear_suit()
/obj/item/clothing/suit/armor/reactive/emp_act(severity)
. = ..()
@@ -71,8 +72,9 @@
reactivearmor_cooldown_duration = 100
/obj/item/clothing/suit/armor/reactive/teleport/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ . = FALSE
if(!active)
- return 0
+ return
if(prob(hit_reaction_chance))
var/mob/living/carbon/human/H = owner
if(world.time < reactivearmor_cooldown)
@@ -95,12 +97,11 @@
var/turf/picked = pick(turfs)
if(!isturf(picked))
return
- H.forceMove(picked)
+ do_teleport(H, picked, no_effects = TRUE, channel = TELEPORT_CHANNEL_WORMHOLE)
radiation_pulse(old, rad_amount_before)
radiation_pulse(src, rad_amount)
reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
- return 1
- return 0
+ return TRUE
//Fire
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index f869eb5d44..559d3006a1 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -92,11 +92,11 @@
//Toggle exosuits for different aesthetic styles (hoodies, suit jacket buttons, etc)
/obj/item/clothing/suit/toggle/AltClick(mob/user)
- ..()
+ . = ..()
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
- else
- suit_toggle(user)
+ suit_toggle(user)
+ return TRUE
/obj/item/clothing/suit/toggle/ui_action_click()
suit_toggle()
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index b98d8207d9..fbdca6ddbc 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -58,7 +58,7 @@
name = "bomb hood"
desc = "Use in case of bomb."
icon_state = "bombsuit"
- clothing_flags = THICKMATERIAL | SNUG_FIT
+ clothing_flags = THICKMATERIAL
armor = list("melee" = 20, "bullet" = 0, "laser" = 20,"energy" = 10, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50)
flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
dynamic_hair_suffix = ""
@@ -123,7 +123,7 @@
name = "radiation hood"
icon_state = "rad"
desc = "A hood with radiation protective properties. The label reads, 'Made with lead. Please do not consume insulation.'"
- clothing_flags = THICKMATERIAL|SNUG_FIT
+ clothing_flags = THICKMATERIAL
flags_inv = HIDEMASK|HIDEEARS|HIDEFACE|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 60, "rad" = 100, "fire" = 30, "acid" = 30)
strip_delay = 60
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index 93eb8181c7..9d1a47f231 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -7,7 +7,6 @@
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100)
strip_delay = 50
equip_delay_other = 50
- clothing_flags = SNUG_FIT
resistance_flags = FIRE_PROOF | ACID_PROOF
dog_fashion = /datum/dog_fashion/head/blue_wizard
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index 0a0499b5f9..a4d2c17fd6 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -1,4 +1,4 @@
-/obj/item/clothing/accessory //Ties moved to neck slot items, but as there are still things like medals, pokadots, and armbands, this accessory system is being kept as-is
+/obj/item/clothing/accessory //Ties moved to neck slot items, but as there are still things like medals and armbands, this accessory system is being kept as-is
name = "Accessory"
desc = "Something has gone wrong!"
icon = 'icons/obj/clothing/accessories.dmi'
@@ -67,10 +67,12 @@
return
/obj/item/clothing/accessory/AltClick(mob/user)
+ . = ..()
if(istype(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
if(initial(above_suit))
above_suit = !above_suit
to_chat(user, "[src] will be worn [above_suit ? "above" : "below"] your suit.")
+ return TRUE
/obj/item/clothing/accessory/examine(mob/user)
. = ..()
@@ -364,7 +366,7 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
/////////////////////
-//Synda Accessories//
+//Syndie Accessories//
/////////////////////
/obj/item/clothing/accessory/padding
@@ -387,35 +389,3 @@
icon_state = "plastics"
item_color = "nothing"
armor = list("melee" = 0, "bullet" = 0, "laser" = 20, "energy" = 10, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = -40)
-
-/////////////////////
-//Pokadots On Pants//
-/////////////////////
-
-/obj/item/clothing/accessory/attrocious_pokadots
- name = "atrocious pokadots"
- desc = "They look like something out of a thrift store. Attaches to clothing not to be worn by itself."
- icon_state = "attrocious_pokadots"
- item_color = "attrocious_pokadots"
- attack_verb = list("horrifed", "eye bleeded")
-
-/obj/item/clothing/accessory/black_white_pokadots
- name = "checkered pokadots"
- desc = "You can play a game of chess on these! Attaches to clothing not to be worn by itself."
- icon_state = "black_white_pokadots"
- item_color = "black_white_pokadots"
- attack_verb = list("check", "mate")
-
-/obj/item/clothing/accessory/nt_pokadots
- name = "blue and white pokadots"
- desc = "To show your pride in your workplace, in the most annoying possable way. Attaches to clothing not to be worn by itself."
- icon_state = "nt_pokadots"
- item_color = "nt_pokadots"
- attack_verb = list("eye bleeded", "annoyed")
-
-/obj/item/clothing/accessory/syndi_pokadots
- name = "black and red pokadots"
- desc = "King me. Attaches to clothing not to be worn by itself." //checkers!
- icon_state = "syndi_pokadots"
- item_color = "syndi_pokadots"
- attack_verb = list("jumped", "taken")
\ No newline at end of file
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index b4ad844f4d..58df911412 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -5,6 +5,7 @@
item_color = "red_pyjamas"
item_state = "w_suit"
can_adjust = FALSE
+
/obj/item/clothing/under/pj/blue
name = "blue pj's"
desc = "Sleepwear."
@@ -12,6 +13,7 @@
item_color = "blue_pyjamas"
item_state = "w_suit"
can_adjust = FALSE
+
/obj/item/clothing/under/patriotsuit
name = "Patriotic Suit"
desc = "Motorcycle not included."
@@ -19,6 +21,7 @@
item_state = "ek"
item_color = "ek"
can_adjust = FALSE
+
/obj/item/clothing/under/scratch
name = "white suit"
desc = "A white suit, suitable for an excellent host."
@@ -43,6 +46,7 @@
icon_state = "sl_suit"
item_color = "sl_suit"
can_adjust = FALSE
+
/obj/item/clothing/under/roman
name = "\improper Roman armor"
desc = "Ancient Roman armor. Made of metallic and leather straps."
@@ -52,6 +56,7 @@
can_adjust = FALSE
strip_delay = 100
resistance_flags = NONE
+
/obj/item/clothing/under/waiter
name = "waiter's outfit"
desc = "It's a very smart uniform with a special pocket for tip."
@@ -59,6 +64,7 @@
item_state = "waiter"
item_color = "waiter"
can_adjust = FALSE
+
/obj/item/clothing/under/rank/prisoner
name = "prison jumpsuit"
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
@@ -85,12 +91,14 @@
icon_state = "mailman"
item_state = "b_suit"
item_color = "mailman"
+
/obj/item/clothing/under/rank/psyche
name = "psychedelic jumpsuit"
desc = "Groovy!"
icon_state = "psyche"
item_state = "p_suit"
item_color = "psyche"
+
/obj/item/clothing/under/rank/clown/sexy
name = "sexy-clown suit"
desc = "It makes you look HONKable!"
@@ -98,6 +106,7 @@
item_state = "sexyclown"
item_color = "sexyclown"
can_adjust = FALSE
+
/obj/item/clothing/under/jabroni
name = "Jabroni Outfit"
desc = "The leather club is two sectors down."
@@ -105,6 +114,7 @@
item_state = "darkholme"
item_color = "darkholme"
can_adjust = FALSE
+
/obj/item/clothing/under/rank/vice
name = "vice officer's jumpsuit"
desc = "It's the standard issue pretty-boy outfit, as seen on Holo-Vision."
@@ -112,6 +122,7 @@
item_state = "gy_suit"
item_color = "vice"
can_adjust = FALSE
+
/obj/item/clothing/under/rank/centcom_officer
desc = "It's a jumpsuit worn by CentCom Officers."
name = "\improper CentCom officer's jumpsuit"
@@ -119,12 +130,14 @@
item_state = "g_suit"
item_color = "officer"
alt_covers_chest = TRUE
+
/obj/item/clothing/under/rank/centcom_commander
desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders."
name = "\improper CentCom officer's jumpsuit"
icon_state = "centcom"
item_state = "dg_suit"
item_color = "centcom"
+
/obj/item/clothing/under/space
name = "\improper NASA jumpsuit"
desc = "It has a NASA logo on it and is made of space-proofed materials."
@@ -141,6 +154,7 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
can_adjust = FALSE
resistance_flags = NONE
+
/obj/item/clothing/under/acj
name = "administrative cybernetic jumpsuit"
icon_state = "syndicate"
@@ -157,24 +171,28 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
can_adjust = FALSE
resistance_flags = FIRE_PROOF | ACID_PROOF
+
/obj/item/clothing/under/owl
name = "owl uniform"
desc = "A soft brown jumpsuit made of synthetic feathers and strong conviction."
icon_state = "owl"
item_color = "owl"
can_adjust = FALSE
+
/obj/item/clothing/under/griffin
name = "griffon uniform"
desc = "A soft brown jumpsuit with a white feather collar made of synthetic feathers and a lust for mayhem."
icon_state = "griffin"
item_color = "griffin"
can_adjust = FALSE
+
/obj/item/clothing/under/cloud
name = "cloud"
desc = "cloud"
icon_state = "cloud"
item_color = "cloud"
can_adjust = FALSE
+
/obj/item/clothing/under/gimmick/rank/captain/suit
name = "captain's suit"
desc = "A green suit and yellow necktie. Exemplifies authority."
@@ -218,18 +236,21 @@
item_state = "bl_suit"
item_color = "black_suit"
can_adjust = FALSE
+
/obj/item/clothing/under/suit_jacket/really_black
name = "executive suit"
desc = "A formal black suit and red tie, intended for the station's finest."
icon_state = "really_black_suit"
item_state = "bl_suit"
item_color = "really_black_suit"
+
/obj/item/clothing/under/suit_jacket/female
name = "executive suit"
desc = "A formal trouser suit for women, intended for the station's finest."
icon_state = "black_suit_fem"
item_state = "black_suit_fem"
item_color = "black_suit_fem"
+
/obj/item/clothing/under/suit_jacket/green
name = "green suit"
desc = "A green suit and yellow necktie. Baller."
@@ -237,48 +258,56 @@
item_state = "dg_suit"
item_color = "green_suit"
can_adjust = FALSE
+
/obj/item/clothing/under/suit_jacket/red
name = "red suit"
desc = "A red suit and blue tie. Somewhat formal."
icon_state = "red_suit"
item_state = "r_suit"
item_color = "red_suit"
+
/obj/item/clothing/under/suit_jacket/charcoal
name = "charcoal suit"
desc = "A charcoal suit and red tie. Very professional."
icon_state = "charcoal_suit"
item_state = "charcoal_suit"
item_color = "charcoal_suit"
+
/obj/item/clothing/under/suit_jacket/navy
name = "navy suit"
desc = "A navy suit and red tie, intended for the station's finest."
icon_state = "navy_suit"
item_state = "navy_suit"
item_color = "navy_suit"
+
/obj/item/clothing/under/suit_jacket/burgundy
name = "burgundy suit"
desc = "A burgundy suit and black tie. Somewhat formal."
icon_state = "burgundy_suit"
item_state = "burgundy_suit"
item_color = "burgundy_suit"
+
/obj/item/clothing/under/suit_jacket/checkered
name = "checkered suit"
desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?"
icon_state = "checkered_suit"
item_state = "checkered_suit"
item_color = "checkered_suit"
+
/obj/item/clothing/under/suit_jacket/tan
name = "tan suit"
desc = "A tan suit with a yellow tie. Smart, but casual."
icon_state = "tan_suit"
item_state = "tan_suit"
item_color = "tan_suit"
+
/obj/item/clothing/under/suit_jacket/white
name = "white suit"
desc = "A white suit and jacket with a blue shirt. You wanna play rough? OKAY!"
icon_state = "white_suit"
item_state = "white_suit"
item_color = "white_suit"
+
/obj/item/clothing/under/burial
name = "burial garments"
desc = "Traditional burial garments from the early 22nd century."
@@ -286,6 +315,7 @@
item_state = "burial"
item_color = "burial"
has_sensor = NO_SENSORS
+
/obj/item/clothing/under/skirt/black
name = "black skirt"
desc = "A black skirt, very fancy!"
@@ -294,6 +324,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/skirt/blue
name = "blue skirt"
desc = "A blue, casual skirt."
@@ -303,6 +334,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/skirt/red
name = "red skirt"
desc = "A red, casual skirt."
@@ -312,6 +344,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/skirt/purple
name = "purple skirt"
desc = "A purple, casual skirt."
@@ -321,6 +354,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/schoolgirl
name = "blue schoolgirl uniform"
desc = "It's just like one of my Japanese animes!"
@@ -330,21 +364,25 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/schoolgirl/red
name = "red schoolgirl uniform"
icon_state = "schoolgirlred"
item_state = "schoolgirlred"
item_color = "schoolgirlred"
+
/obj/item/clothing/under/schoolgirl/green
name = "green schoolgirl uniform"
icon_state = "schoolgirlgreen"
item_state = "schoolgirlgreen"
item_color = "schoolgirlgreen"
+
/obj/item/clothing/under/schoolgirl/orange
name = "orange schoolgirl uniform"
icon_state = "schoolgirlorange"
item_state = "schoolgirlorange"
item_color = "schoolgirlorange"
+
/obj/item/clothing/under/overalls
name = "laborer's overalls"
desc = "A set of durable overalls for getting the job done."
@@ -352,6 +390,7 @@
item_state = "lb_suit"
item_color = "overalls"
can_adjust = FALSE
+
/obj/item/clothing/under/pirate
name = "pirate outfit"
desc = "Yarr."
@@ -359,6 +398,7 @@
item_state = "pirate"
item_color = "pirate"
can_adjust = FALSE
+
/obj/item/clothing/under/soviet
name = "soviet uniform"
desc = "For the Motherland!"
@@ -366,6 +406,7 @@
item_state = "soviet"
item_color = "soviet"
can_adjust = FALSE
+
/obj/item/clothing/under/redcoat
name = "redcoat uniform"
desc = "Looks old."
@@ -373,6 +414,7 @@
item_state = "redcoat"
item_color = "redcoat"
can_adjust = FALSE
+
/obj/item/clothing/under/kilt
name = "kilt"
desc = "Includes shoes and plaid."
@@ -382,6 +424,7 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/kilt/highlander
desc = "You're the only one worthy of this kilt."
@@ -398,6 +441,7 @@
body_parts_covered = CHEST|GROIN|LEGS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/gladiator
name = "gladiator uniform"
desc = "Are you not entertained? Is that not why you are here?"
@@ -408,9 +452,11 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
+
/obj/item/clothing/under/gladiator/ash_walker
desc = "This gladiator uniform appears to be covered in ash and fairly dated."
has_sensor = NO_SENSORS
+
/obj/item/clothing/under/sundress
name = "sundress"
desc = "Makes you want to frolic in a field of daisies."
@@ -420,6 +466,7 @@
body_parts_covered = CHEST|GROIN
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/captainparade
name = "captain's parade uniform"
desc = "A captain's luxury-wear, for special occasions."
@@ -427,6 +474,7 @@
item_state = "by_suit"
item_color = "captain_parade"
can_adjust = FALSE
+
/obj/item/clothing/under/hosparademale
name = "head of security's parade uniform"
desc = "A male head of security's luxury-wear, for special occasions."
@@ -434,6 +482,7 @@
item_state = "r_suit"
item_color = "hos_parade_male"
can_adjust = FALSE
+
/obj/item/clothing/under/hosparadefem
name = "head of security's parade uniform"
desc = "A female head of security's luxury-wear, for special occasions."
@@ -442,6 +491,7 @@
item_color = "hos_parade_fem"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/assistantformal
name = "assistant's formal uniform"
desc = "An assistant's formal-wear. Why an assistant needs formal-wear is still unknown."
@@ -449,6 +499,7 @@
item_state = "gy_suit"
item_color = "assistant_formal"
can_adjust = FALSE
+
/obj/item/clothing/under/blacktango
name = "black tango dress"
desc = "Filled with Latin fire."
@@ -457,6 +508,7 @@
item_color = "black_tango"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/stripeddress
name = "striped dress"
desc = "Fashion in space."
@@ -466,6 +518,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_FULL
can_adjust = FALSE
+
/obj/item/clothing/under/sailordress
name = "sailor dress"
desc = "Formal wear for a leading lady."
@@ -475,6 +528,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/redeveninggown
name = "red evening gown"
desc = "Fancy dress for space bar singers."
@@ -483,6 +537,7 @@
item_color = "red_evening_gown"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/maid
name = "maid costume"
desc = "Maid in China."
@@ -492,10 +547,12 @@
body_parts_covered = CHEST|GROIN
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/maid/Initialize()
. = ..()
var/obj/item/clothing/accessory/maidapron/A = new (src)
attach_accessory(A)
+
/obj/item/clothing/under/janimaid
name = "maid uniform"
desc = "A simple maid uniform for housekeeping."
@@ -505,6 +562,7 @@
body_parts_covered = CHEST|GROIN
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/plaid_skirt
name = "red plaid skirt"
desc = "A preppy red skirt with a white blouse."
@@ -514,6 +572,7 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
+
/obj/item/clothing/under/plaid_skirt/blue
name = "blue plaid skirt"
desc = "A preppy blue skirt with a white blouse."
@@ -523,6 +582,7 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
+
/obj/item/clothing/under/plaid_skirt/purple
name = "purple plaid skirt"
desc = "A preppy purple skirt with a white blouse."
@@ -532,6 +592,7 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
+
/obj/item/clothing/under/singery
name = "yellow performer's outfit"
desc = "Just looking at this makes you want to sing."
@@ -542,6 +603,7 @@
fitted = NO_FEMALE_UNIFORM
alternate_worn_layer = ABOVE_SHOES_LAYER
can_adjust = FALSE
+
/obj/item/clothing/under/singerb
name = "blue performer's outfit"
desc = "Just looking at this makes you want to sing."
@@ -552,6 +614,7 @@
alternate_worn_layer = ABOVE_SHOES_LAYER
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/plaid_skirt/green
name = "green plaid skirt"
desc = "A preppy green skirt with a white blouse."
@@ -561,14 +624,17 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
+
/obj/item/clothing/under/jester
name = "jester suit"
desc = "A jolly dress, well suited to entertain your master, nuncle."
icon_state = "jester"
item_color = "jester"
can_adjust = FALSE
+
/obj/item/clothing/under/jester/alt
icon_state = "jester2"
+
/obj/item/clothing/under/geisha
name = "geisha suit"
desc = "Cute space ninja senpai not included."
@@ -576,12 +642,14 @@
item_color = "geisha"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
+
/obj/item/clothing/under/villain
name = "villain suit"
desc = "A change of wardrobe is necessary if you ever want to catch a real superhero."
icon_state = "villain"
item_color = "villain"
can_adjust = FALSE
+
/obj/item/clothing/under/sailor
name = "sailor suit"
desc = "Skipper's in the wardroom drinkin gin'."
@@ -650,6 +718,7 @@
icon_state = "hostanclothes"
item_state = "hostanclothes"
item_color = "hostanclothes"
+
/obj/item/clothing/under/mummy
name = "mummy wrapping"
desc = "Return the slab or suffer my stale references."
@@ -660,6 +729,7 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
+
/obj/item/clothing/under/scarecrow
name = "scarecrow clothes"
desc = "Perfect camouflage for hiding in botany."
@@ -670,6 +740,7 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
+
/obj/item/clothing/under/draculass
name = "draculass coat"
desc = "A dress inspired by the ancient \"Victorian\" era."
@@ -679,6 +750,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+
/obj/item/clothing/under/drfreeze
name = "doctor freeze's jumpsuit"
desc = "A modified scientist jumpsuit to look extra cool."
@@ -686,6 +758,7 @@
item_state = "drfreeze"
item_color = "drfreeze"
can_adjust = FALSE
+
/obj/item/clothing/under/lobster
name = "foam lobster suit"
desc = "Who beheaded the college mascot?"
@@ -694,6 +767,7 @@
item_color = "lobster"
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
+
/obj/item/clothing/under/gondola
name = "gondola hide suit"
desc = "Now you're cooking."
@@ -701,6 +775,7 @@
item_state = "lb_suit"
item_color = "gondola"
can_adjust = FALSE
+
/obj/item/clothing/under/skeleton
name = "skeleton jumpsuit"
desc = "A black jumpsuit with a white bone pattern printed on it. Spooky!"
@@ -720,6 +795,14 @@
body_parts_covered = CHEST|GROIN
can_adjust = FALSE
+/obj/item/clothing/under/telegram
+ name = "telegram suit"
+ desc = "Bright and red, hard to miss. Mostly warn by hotel staff or singing telegram."
+ icon_state = "telegram"
+ item_state = "telegram"
+ body_parts_covered = CHEST|GROIN
+ can_adjust = FALSE
+
/obj/item/clothing/under/durathread
name = "durathread jumpsuit"
desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer."
@@ -737,4 +820,36 @@
item_color = "durathread"
can_adjust = FALSE
body_parts_covered = CHEST|GROIN|ARMS
- armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
\ No newline at end of file
+ armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
+
+/obj/item/clothing/under/christmas/christmasmaler
+ name = "red masculine christmas suit"
+ desc = "A simple red christmas suit that looks close to Santa's!"
+ icon_state = "christmasmaler"
+ item_state = "christmasmaler"
+ body_parts_covered = CHEST|GROIN
+ can_adjust = FALSE
+
+/obj/item/clothing/under/christmas/christmasmaleg
+ name = "green masculine christmas suit"
+ desc = "A simple green christmas suit that smells minty!"
+ icon_state = "christmasmaleg"
+ item_state = "christmasmaleg"
+ body_parts_covered = CHEST|GROIN
+ can_adjust = FALSE
+
+/obj/item/clothing/under/christmas/christmasfemaler
+ name = "red feminine christmas suit"
+ desc = "A simple red christmas suit that looks like Mrs Claus!"
+ icon_state = "christmasfemaler"
+ item_state = "christmasfemaler"
+ body_parts_covered = CHEST|GROIN
+ can_adjust = FALSE
+
+/obj/item/clothing/under/christmas/christmasfemaleg
+ name = "green feminine christmas suit"
+ desc = "A simple green christmas suit that smells minty!"
+ icon_state = "christmasfemaleg"
+ item_state = "christmasfemaleg"
+ body_parts_covered = CHEST|GROIN
+ can_adjust = FALSE
\ No newline at end of file
diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm
index 795515835e..0e14f9f5be 100644
--- a/code/modules/crafting/craft.dm
+++ b/code/modules/crafting/craft.dm
@@ -439,4 +439,4 @@
/datum/mind/proc/teach_crafting_recipe(R)
if(!learned_recipes)
learned_recipes = list()
- learned_recipes |= R
\ No newline at end of file
+ learned_recipes |= R
diff --git a/code/modules/crafting/recipes/recipes_clothing.dm b/code/modules/crafting/recipes/recipes_clothing.dm
index 4f06a44811..8cb35df9d1 100644
--- a/code/modules/crafting/recipes/recipes_clothing.dm
+++ b/code/modules/crafting/recipes/recipes_clothing.dm
@@ -163,26 +163,7 @@
name = "Cosmic Winter Coat"
result = /obj/item/clothing/suit/hooded/wintercoat/cosmic
reqs = list(/obj/item/clothing/suit/hooded/wintercoat = 1,
- /obj/item/clothing/suit/hooded/wintercoat/captain = 1,
- /obj/item/clothing/suit/hooded/wintercoat/hop = 1,
- /obj/item/clothing/suit/hooded/wintercoat/hos = 1,
- /obj/item/clothing/suit/hooded/wintercoat/rd = 1,
- /obj/item/clothing/suit/hooded/wintercoat/ce = 1,
- /obj/item/clothing/suit/hooded/wintercoat/cmo = 1,
- /obj/item/clothing/suit/hooded/wintercoat/qm = 1,
- /obj/item/clothing/suit/hooded/wintercoat/robotics = 1,
- /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 1,
- /obj/item/clothing/suit/hooded/wintercoat/engineering = 1,
- /obj/item/clothing/suit/hooded/wintercoat/science = 1,
- /obj/item/clothing/suit/hooded/wintercoat/genetics = 1,
- /obj/item/clothing/suit/hooded/wintercoat/chemistry = 1,
- /obj/item/clothing/suit/hooded/wintercoat/medical = 1,
- /obj/item/clothing/suit/hooded/wintercoat/viro = 1,
- /obj/item/clothing/suit/hooded/wintercoat/janitor = 1,
- /obj/item/clothing/suit/hooded/wintercoat/security = 1,
- /obj/item/clothing/suit/hooded/wintercoat/cargo = 1,
- /obj/item/clothing/suit/hooded/wintercoat/hydro = 1,
- /obj/item/clothing/suit/hooded/wintercoat/miner = 1)
+ /obj/item/bedsheet/cosmos = 1)
time = 60
always_availible = TRUE
category = CAT_CLOTHING
diff --git a/code/modules/crafting/recipes/recipes_misc.dm b/code/modules/crafting/recipes/recipes_misc.dm
index fdfb959fe6..70dd4d1370 100644
--- a/code/modules/crafting/recipes/recipes_misc.dm
+++ b/code/modules/crafting/recipes/recipes_misc.dm
@@ -47,16 +47,17 @@
/datum/crafting_recipe/goldenbox
name = "Gold Plated Toolbox"
result = /obj/item/storage/toolbox/gold_fake
+ tools = list(/obj/item/stock_parts/cell/upgraded/plus)
reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting
/obj/item/stack/cable_coil = 10,
/obj/item/stack/sheet/mineral/gold = 1,
- /obj/item/stock_parts/cell = 1,
/datum/reagent/water = 15)
time = 40
category = CAT_MISC
/datum/crafting_recipe/bronze_driver
name = "Bronze Plated Screwdriver"
+ tools = list(/obj/item/stock_parts/cell/upgraded/plus)
result = /obj/item/screwdriver/bronze
reqs = list(/obj/item/screwdriver = 1,
/obj/item/stack/cable_coil = 10,
@@ -67,6 +68,7 @@
/datum/crafting_recipe/bronze_welder
name = "Bronze Plated Welding Tool"
+ tools = list(/obj/item/stock_parts/cell/upgraded/plus)
result = /obj/item/weldingtool/bronze
reqs = list(/obj/item/weldingtool = 1,
/obj/item/stack/cable_coil = 10,
@@ -77,6 +79,7 @@
/datum/crafting_recipe/bronze_wirecutters
name = "Bronze Plated Wirecutters"
+ tools = list(/obj/item/stock_parts/cell/upgraded/plus)
result = /obj/item/wirecutters/bronze
reqs = list(/obj/item/wirecutters = 1,
/obj/item/stack/cable_coil = 10,
@@ -87,6 +90,7 @@
/datum/crafting_recipe/bronze_crowbar
name = "Bronze Plated Crowbar"
+ tools = list(/obj/item/stock_parts/cell/upgraded/plus)
result = /obj/item/crowbar/bronze
reqs = list(/obj/item/crowbar = 1,
/obj/item/stack/cable_coil = 10,
@@ -97,6 +101,7 @@
/datum/crafting_recipe/bronze_wrench
name = "Bronze Plated Wrench"
+ tools = list(/obj/item/stock_parts/cell/upgraded/plus)
result = /obj/item/wrench/bronze
reqs = list(/obj/item/wrench = 1,
/obj/item/stack/cable_coil = 10,
@@ -315,3 +320,41 @@
reqs = list(/obj/item/stack/rods = 2,
/obj/item/clothing/under/rank/security = 1)
category = CAT_MISC
+
+ /datum/crafting_recipe/bloodsucker/vassalrack
+ name = "Persuasion Rack"
+ //desc = "For converting crewmembers into loyal Vassals."
+ result = /obj/structure/bloodsucker/vassalrack
+ tools = list(/obj/item/weldingtool,
+ ///obj/item/screwdriver,
+ /obj/item/wrench
+ )
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 3,
+ /obj/item/stack/sheet/metal = 2,
+ /obj/item/restraints/handcuffs/cable = 2,
+ ///obj/item/storage/belt = 1
+ ///obj/item/stack/sheet/animalhide = 1, // /obj/item/stack/sheet/leather = 1,
+ ///obj/item/stack/sheet/plasteel = 5
+ )
+ //parts = list(/obj/item/storage/belt = 1
+ // )
+
+ time = 150
+ category = CAT_MISC
+ always_availible = FALSE // Disabled til learned
+
+
+ /datum/crafting_recipe/bloodsucker/candelabrum
+ name = "Candelabrum"
+ //desc = "For converting crewmembers into loyal Vassals."
+ result = /obj/structure/bloodsucker/candelabrum
+ tools = list(/obj/item/weldingtool,
+ /obj/item/wrench
+ )
+ reqs = list(/obj/item/stack/sheet/metal = 3,
+ /obj/item/stack/rods = 1,
+ /obj/item/candle = 1
+ )
+ time = 100
+ category = CAT_MISC
+ always_availible = FALSE // Disabled til learned
diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm
index eaa31c01bf..944fbb8df8 100644
--- a/code/modules/detectivework/scanner.dm
+++ b/code/modules/detectivework/scanner.dm
@@ -187,9 +187,11 @@
return time2text(world.time + 432000, ":ss")
/obj/item/detective_scanner/AltClick(mob/living/user)
+ . = ..()
// Best way for checking if a player can use while not incapacitated, etc
if(!user.canUseTopic(src, be_close=TRUE))
return
+ . = TRUE
if(!LAZYLEN(log))
to_chat(user, "Cannot clear logs, the scanner has no logs.")
return
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index e041d566e9..41b2bfee5a 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -45,6 +45,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
throwforce = 100
density = TRUE
anchored = TRUE
+ flags_1 = PREVENT_CONTENTS_EXPLOSION_1
var/mob/living/wizard
var/z_original = 0
var/destination
@@ -100,9 +101,6 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
/obj/effect/immovablerod/ex_act(severity, target)
return 0
-/obj/structure/closet/supplypod/prevent_content_explosion()
- return TRUE
-
/obj/effect/immovablerod/singularity_act()
return
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index 26591547c0..236eed5c09 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -21,7 +21,7 @@
/datum/round_event/meteor_wave/setup()
announceWhen = 1
- startWhen = rand(180, 360) //Yeah for SOME REASON this is measured in seconds and not deciseconds???
+ startWhen = rand(60, 90) //Yeah for SOME REASON this is measured in seconds and not deciseconds???
if(GLOB.singularity_counter)
startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE)
endWhen = startWhen + 60
diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm
index 88059f7468..f006f2b358 100644
--- a/code/modules/events/shuttle_loan.dm
+++ b/code/modules/events/shuttle_loan.dm
@@ -133,7 +133,7 @@
shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate/ranged/infiltrator)
if(RUSKY_PARTY)
- var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/service/party]
+ var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/misc/party]
pack.generate(pick_n_take(empty_shuttle_turfs))
shuttle_spawns.Add(/mob/living/simple_animal/hostile/russian)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index b5f02b79d7..f5262742e2 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -21,7 +21,8 @@ GLOBAL_LIST_INIT(hallucination_list, list(
/datum/hallucination/delusion = 2,
/datum/hallucination/shock = 1,
/datum/hallucination/death = 1,
- /datum/hallucination/oh_yeah = 1
+ /datum/hallucination/oh_yeah = 1,
+ /datum/hallucination/sleeping_carp = 1
))
@@ -1294,3 +1295,26 @@ GLOBAL_LIST_INIT(hallucination_list, list(
H.preparePixelProjectile(target, start)
H.fire()
qdel(src)
+
+/datum/hallucination/sleeping_carp
+
+/datum/hallucination/sleeping_carp/New(mob/living/carbon/C, forced = TRUE)
+ set waitfor = FALSE
+ ..()
+ var/list/mobsyup
+ for (var/mob/living/carbon/A in orange(C,1))
+ if (get_dist(C,A) < 2)
+ LAZYADD(mobsyup,A)
+ if (!LAZYLEN(mobsyup))
+ qdel(src)
+ return
+ var/mob/living/carbon/G = pick(mobsyup)
+ if (prob(50))
+ C.visible_message("[C] falls to the ground screaming and clutching [C.p_their()] wrist!", \
+ "[G] grabs your wrist and violently wrenches it to the side!")
+ C.emote("scream")
+ C.dropItemToGround(C.get_active_held_item())
+ C.Knockdown(60)
+ else
+ to_chat(C,"[G] violently grabs you!")
+ qdel(src)
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 5bf7e3dff3..804193b09c 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -132,14 +132,10 @@
transfer_fingerprints_to(B)
qdel(src)
-
-
-
////////////////////////////////////////////////////////////////////////////////
/// Drinks. END
////////////////////////////////////////////////////////////////////////////////
-
/obj/item/reagent_containers/food/drinks/trophy
name = "pewter cup"
desc = "Everyone gets a trophy."
@@ -178,7 +174,6 @@
materials = list(MAT_SILVER=800)
volume = 100
-
/obj/item/reagent_containers/food/drinks/trophy/bronze_cup
name = "bronze cup"
desc = "At least you ranked!"
@@ -190,7 +185,7 @@
materials = list(MAT_METAL=400)
volume = 25
-///////////////////////////////////////////////Drinks
+///////////////////////////////////////////////Drinks/////////////////////////////////////////
//Notes by Darem: Drinks are simply containers that start preloaded. Unlike condiments, the contents can be ingested directly
// rather then having to add it to something else first. They should only contain liquids. They have a default container size of 50.
// Formatting is the same as food.
@@ -211,7 +206,6 @@
icon = 'icons/obj/food/containers.dmi'
icon_state = "condi_cornoil"
-
/obj/item/reagent_containers/food/drinks/ice
name = "ice cup"
desc = "Careful, cold ice, do not chew."
@@ -243,10 +237,8 @@
desc = "Made in Space South America."
list_reagents = list("hot_coco" = 30, "sugar" = 5)
foodtype = SUGAR
-
resistance_flags = FREEZE_PROOF
-
/obj/item/reagent_containers/food/drinks/dry_ramen
name = "cup ramen"
desc = "Just add 10ml of water, self heats! A taste that reminds you of your school years."
@@ -357,8 +349,7 @@
desc = "A small carton, intended for holding drinks."
-
-//////////////////////////drinkingglass and shaker//
+//////////////////////////drinkingglass and shaker/////////////////////////////////////////////////////////////////////////////////////
//Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink
// itself), in Chemistry-Recipes.dm (for the reaction that changes the components into the drink), and here (for the drinking glass
// icon states.
@@ -399,8 +390,8 @@
volume = 30
spillable = TRUE
-//////////////////////////soda_cans//
-//These are in their own group to be used as IED's in /obj/item/grenade/ghettobomb.dm
+//////////////////////////soda_cans////////////////////////////////////////////////////
+//These are in their own group to be used as IED's in /obj/item/grenade/ghettobomb.dm//
/obj/item/reagent_containers/food/drinks/soda_cans
name = "soda can"
@@ -426,7 +417,6 @@
qdel(src)
..()
-
/obj/item/reagent_containers/food/drinks/soda_cans/attack_self(mob/user)
if(!is_drainable())
to_chat(user, "You pull back the tab of \the [src] with a satisfying pop.") //Ahhhhhhhh
@@ -515,6 +505,13 @@
list_reagents = list("shamblers" = 30)
foodtype = SUGAR | JUNKFOOD
+/obj/item/reagent_containers/food/drinks/soda_cans/buzz_fuzz
+ name = "Buzz Fuzz"
+ desc = "The sister drink of Shambler's Juice! Uses real honey, making it a sweet tooth's dream drink. The slogan reads ''A Hive of Flavour'', there's also a label about how it is adddicting."
+ icon_state = "honeysoda_can"
+ list_reagents = list("buzz_fuzz" = 25, "honey" = 5)
+ foodtype = SUGAR | JUNKFOOD
+
/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull
name = "Grey Bull"
desc = "Grey Bull, it gives you gloves!"
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index df5e6a87fd..8724841643 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -16,7 +16,7 @@
w_class = WEIGHT_CLASS_SMALL
volume = 80
- var/ingMax = 12
+ var/ingMax = 32
var/list/ingredients = list()
var/ingredients_placement = INGREDIENTS_FILL
var/customname = "custom"
@@ -32,6 +32,8 @@
if(ingredients.len>5)
size = "big"
if(ingredients.len>8)
+ size = "huge"
+ if(ingredients.len>16)
size = "monster"
. += "It contains [ingredients.len?"[ingredients_listed]":"no ingredient, "]making a [size]-sized [initial(name)]."
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index d838b31aba..b8a63afb7f 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -319,13 +319,13 @@ All foods are distributed among various categories. Use common sense.
if(iscorgi(M))
var/mob/living/L = M
if(bitecount == 0 || prob(50))
- M.emote("me", 1, "nibbles away at \the [src]")
+ M.emote("me", EMOTE_VISIBLE, "nibbles away at \the [src]")
bitecount++
L.taste(reagents) // why should carbons get all the fun?
if(bitecount >= 5)
var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [src] was")
if(sattisfaction_text)
- M.emote("me", 1, "[sattisfaction_text]")
+ M.emote("me", EMOTE_VISIBLE, "[sattisfaction_text]")
qdel(src)
// //////////////////////////////////////////////Store////////////////////////////////////////
diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm
index ea573a2cf0..5d5ad59c49 100644
--- a/code/modules/food_and_drinks/food/snacks/meat.dm
+++ b/code/modules/food_and_drinks/food/snacks/meat.dm
@@ -132,6 +132,28 @@
tastes = list("brains" = 1, "meat" = 1)
foodtype = RAW | MEAT | TOXIC
+/obj/item/reagent_containers/food/snacks/carpmeat/aquatic
+ name = "fillet"
+ desc = "A fillet of one of the local water dwelling species."
+
+/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc
+ icon_state = "ipcmeat"
+ desc = "Gross robot meat."
+ filling_color = "#000000"
+ tastes = list("metal" = 1)
+
+/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/avian
+ desc = "Tastes like chicken, that's because it is!"
+ icon_state = "birdmeat"
+ filling_color = "#BF896B"
+ tastes = list("chicken" = 1)
+
+/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/mammal
+ desc = "Tastes sweet... reminds you vaguely of chicken."
+ filling_color = "#6B8E23"
+ tastes = list("brains" = 1, "meat" = 1)
+
+
////////////////////////////////////// OTHER MEATS ////////////////////////////////////////////////////////
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index c3fc942b83..baf8e150c5 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -386,7 +386,7 @@
tastes = list("pastry" = 1, "sweetness" = 1)
foodtype = GRAIN
-#define PANCAKE_MAX_STACK 10
+#define PANCAKE_MAX_STACK 30
/obj/item/reagent_containers/food/snacks/pancakes
name = "pancake"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index 3183b3b2b4..1bc2e4bb89 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -80,6 +80,9 @@ God bless America.
I.reagents.trans_to(src, I.reagents.total_volume)
qdel(I)
return
+ if(istype(I,/obj/item/clothing/head/mob_holder))
+ to_chat(user, "This does not fit in the fryer.") // TODO: Deepfrying instakills mobs, spawns a whole deep-fried mob.
+ return
if(!reagents.has_reagent("cooking_oil"))
to_chat(user, "[src] has no cooking oil to fry with!")
return
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 0f901f2412..8db6956da9 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
@@ -4,8 +4,9 @@
#define ICECREAM_PEACH 4
#define ICECREAM_GRAPE 5
#define ICECREAM_BLUE 6
-#define CONE_WAFFLE 7
-#define CONE_CHOC 8
+#define ICECREAM_CUSTOM 7
+#define CONE_WAFFLE 8
+#define CONE_CHOC 9
@@ -22,17 +23,18 @@
var/list/product_types = list()
var/dispense_flavour = ICECREAM_VANILLA
var/flavour_name = "vanilla"
+ var/obj/item/reagent_containers/beaker = null
var/static/list/icecream_vat_reagents = list(
- "milk" = 5,
- "flour" = 5,
- "sugar" = 5,
- "ice" = 5,
- "cocoa" = 5,
- "vanilla" = 5,
- "berryjuice" = 5,
- "singulo" = 5,
- "peachjuice" = 5,
- "grapejuice" = 5)
+ "milk" = 6,
+ "flour" = 6,
+ "sugar" = 6,
+ "ice" = 6,
+ "cocoa" = 6,
+ "vanilla" = 6,
+ "berryjuice" = 6,
+ "singulo" = 6,
+ "peachjuice" = 6,
+ "grapejuice" = 6)
/obj/machinery/icecream_vat/proc/get_ingredient_list(type)
switch(type)
@@ -40,6 +42,8 @@
return list("milk", "ice", "cocoa")
if(ICECREAM_STRAWBERRY)
return list("milk", "ice", "berryjuice")
+ if(ICECREAM_CUSTOM)
+ return list("milk", "ice")
if(ICECREAM_PEACH)
return list("milk", "ice", "peachjuice")
if(ICECREAM_GRAPE)
@@ -66,6 +70,8 @@
return "grape"
if(ICECREAM_BLUE)
return "blue"
+ if(ICECREAM_CUSTOM)
+ return "custom"
if(CONE_WAFFLE)
return "waffle"
if(CONE_CHOC)
@@ -76,7 +82,7 @@
/obj/machinery/icecream_vat/Initialize()
. = ..()
- while(product_types.len < 8)
+ while(product_types.len < 9)
product_types.Add(5)
create_reagents(100, OPENCONTAINER | NO_REACT)
for(var/reagent in icecream_vat_reagents)
@@ -87,16 +93,23 @@
var/dat
dat += "ICE CREAM"
dat += "Dispensing: [flavour_name] icecream "
+ dat += "Blue ice cream: Select Make x5 [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)" - dat += "Vanilla ice cream: Select Make x5 [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice) " + dat += "Vanilla ice cream: Select Make x5 [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice, vanilla) " dat += "Strawberry ice cream: Select Make x5 [product_types[ICECREAM_STRAWBERRY]] dollops left. (Ingredients: milk, ice, berry juice) " dat += "Chocolate ice cream: Select Make x5 [product_types[ICECREAM_CHOCOLATE]] dollops left. (Ingredients: milk, ice, coco powder) " 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 += " CONES "
dat += "Waffle cones: Dispense Make x5 [product_types[CONE_WAFFLE]] cones left. (Ingredients: flour, sugar) "
dat += "" dat += "Chocolate cones: Dispense Make x5 [product_types[CONE_CHOC]] cones left. (Ingredients: flour, sugar, coco powder) " + if(beaker) + dat += "BEAKER CONTENT "
+ for(var/datum/reagent/R in beaker.reagents.reagent_list)
+ dat += "[R.name]: [R.volume]u "
+ dat += "" + dat += "Refill from beaker " dat += "VAT CONTENT " for(var/datum/reagent/R in reagents.reagent_list) dat += "[R.name]: [R.volume]" @@ -114,36 +127,59 @@ if(product_types[dispense_flavour] > 0) visible_message("[icon2html(src, viewers(src))] [user] scoops delicious [flavour_name] ice cream into [I].") product_types[dispense_flavour] -= 1 - I.add_ice_cream(flavour_name) - // if(beaker) - // beaker.reagents.trans_to(I, 10) + if(beaker && beaker.reagents.total_volume) + I.add_ice_cream(flavour_name, beaker.reagents) + else + I.add_ice_cream(flavour_name) if(I.reagents.total_volume < 10) I.reagents.add_reagent("sugar", 10 - I.reagents.total_volume) + updateDialog() else to_chat(user, "There is not enough ice cream left!") else to_chat(user, "[O] already has ice cream in it.") return 1 + if(istype(O, /obj/item/reagent_containers) && !(O.item_flags & ABSTRACT) && O.is_open_container()) + . = TRUE //no afterattack + var/obj/item/reagent_containers/B = O + if(!user.transferItemToLoc(B, src)) + return + replace_beaker(user, B) + to_chat(user, "You add [B] to [src].") + updateUsrDialog() + update_icon() + return else if(O.is_drainable()) return else return ..() +/obj/machinery/icecream_vat/proc/RefillFromBeaker() + if(!beaker || !beaker.reagents) + return + for(var/datum/reagent/R in beaker.reagents.reagent_list) + if(R.type in icecream_vat_reagents) + beaker.reagents.trans_id_to(src, R.type, R.volume) + say("Internalizing reagent.") + playsound(src, 'sound/items/drink.ogg', 25, 1) + return + /obj/machinery/icecream_vat/proc/make(mob/user, make_type, amount) + var/recipe_amount = amount * 3 //prevents reagent duping by requring roughly the amount of reagenst you gain back by grinding. for(var/R in get_ingredient_list(make_type)) - if(reagents.has_reagent(R, amount)) + if(reagents.has_reagent(R, recipe_amount)) continue amount = 0 break if(amount) for(var/R in get_ingredient_list(make_type)) - reagents.remove_reagent(R, amount) + reagents.remove_reagent(R, recipe_amount) product_types[make_type] += amount var/flavour = get_flavour_name(make_type) - if(make_type > 4) - src.visible_message("[user] cooks up some [flavour] cones.") + if(make_type > 7) + visible_message("[user] cooks up some [flavour] cones.") else - src.visible_message("[user] whips up some [flavour] icecream.") + visible_message("[user] whips up some [flavour] icecream.") else to_chat(user, "You don't have the ingredients to make this!") @@ -172,7 +208,10 @@ make(usr, C, amount) if(href_list["disposeI"]) - reagents.del_reagent(href_list["disposeI"]) + reagents.del_reagent(text2path(href_list["disposeI"])) + + if(href_list["refill"]) + RefillFromBeaker() updateDialog() @@ -189,15 +228,16 @@ desc = "Delicious waffle cone, but no ice cream." icon = 'icons/obj/kitchen.dmi' icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time + list_reagents = list("nutriment" = 4) + tastes = list("cream" = 2, "waffle" = 1) var/ice_creamed = 0 var/cone_type - bitesize = 3 - foodtype = DAIRY + bitesize = 4 + foodtype = DAIRY | SUGAR /obj/item/reagent_containers/food/snacks/icecream/Initialize() . = ..() - create_reagents(20) - reagents.add_reagent("nutriment", 4) + reagents.maximum_volume = 20 /obj/item/reagent_containers/food/snacks/icecream/proc/set_cone_type(var/cone_name) cone_type = cone_name @@ -211,30 +251,53 @@ desc = "Delicious [cone_name] cone, but no ice cream." -/obj/item/reagent_containers/food/snacks/icecream/proc/add_ice_cream(var/flavour_name) +/obj/item/reagent_containers/food/snacks/icecream/proc/add_ice_cream(flavour_name, datum/reagents/R) name = "[flavour_name] icecream" - src.add_overlay("icecream_[flavour_name]") switch (flavour_name) // adding the actual reagents advertised in the ingredient list if ("vanilla") desc = "A delicious [cone_type] cone filled with vanilla ice cream. All the other ice creams take content from it." + reagents.add_reagent("vanilla", 3) + filling_color = "#ECE1C1" if ("chocolate") desc = "A delicious [cone_type] cone filled with chocolate ice cream. Surprisingly, made with real cocoa." - reagents.add_reagent("cocoa", 2) + reagents.add_reagent("cocoa", 3) + filling_color = "#93673B" if ("strawberry") desc = "A delicious [cone_type] cone filled with strawberry ice cream. Definitely not made with real strawberries." - reagents.add_reagent("berryjuice", 2) + reagents.add_reagent("berryjuice", 3) + filling_color = "#EFB4B4" if ("peach") desc = "A delicious [cone_type] cone filled with peach ice cream. Definitely made with real peaches!" - reagents.add_reagent("peachjuice", 2) + reagents.add_reagent("peachjuice", 3) + filling_color = "#E78108" if ("grape") desc = "A delicious [cone_type] cone filled with grape ice cream. Surprisingly, made with real pink grape, likely not real sugarcanes used." - reagents.add_reagent("grapejuice", 2) + reagents.add_reagent("grapejuice", 3) + filling_color = "#FF1493" if ("blue") desc = "A delicious [cone_type] cone filled with blue ice cream. Made with real... blue?" - reagents.add_reagent("singulo", 2) + reagents.add_reagent("singulo", 3) + filling_color = "#ACBCED" if ("mob") desc = "A suspicious [cone_type] cone filled with bright red ice cream. That's probably not strawberry..." - reagents.add_reagent("liquidgibs", 2) + reagents.add_reagent("liquidgibs", 3) + filling_color = "#EFB4B4" + if ("custom") + 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 + 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) + add_overlay(flavoring) + else + name = "bland icecream" + desc = "A delicious [cone_type] cone filled with anemic, flavorless icecream.You wonder why this was ever scooped.." + add_overlay("icecream_custom") + if(flavour_name != "custom") + src.add_overlay("icecream_[flavour_name]") ice_creamed = 1 /obj/item/reagent_containers/food/snacks/icecream/proc/add_mob_flavor(var/mob/M) @@ -246,6 +309,24 @@ new /obj/item/stack/sheet/metal(loc, 4) qdel(src) +/obj/machinery/icecream_vat/AltClick(mob/living/user) + . = ..() + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + replace_beaker(user) + return TRUE + +/obj/machinery/icecream_vat/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) + if(beaker) + beaker.forceMove(drop_location()) + if(user && Adjacent(user) && !issiliconoradminghost(user)) + user.put_in_hands(beaker) + if(new_beaker) + beaker = new_beaker + else + beaker = null + updateDialog() + return TRUE #undef ICECREAM_VANILLA #undef ICECREAM_CHOCOLATE @@ -253,5 +334,6 @@ #undef ICECREAM_PEACH #undef ICECREAM_GRAPE #undef ICECREAM_BLUE +#undef ICECREAM_CUSTOM #undef CONE_WAFFLE #undef CONE_CHOC diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index e67de92773..4efac6f508 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -186,8 +186,10 @@ ..() /obj/machinery/microwave/AltClick(mob/user) + . = ..() if(user.canUseTopic(src, !issilicon(usr))) cook() + return TRUE /obj/machinery/microwave/ui_interact(mob/user) . = ..() diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index ceb7a01ede..893a53ede7 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -144,7 +144,7 @@ else O.forceMove(src) return TRUE - + ///Really simple proc, just moves the object "O" into the hands of mob "M" if able, done so I could modify the proc a little for the organ fridge /obj/machinery/smartfridge/proc/dispense(obj/item/O, var/mob/M) if(!M.put_in_hands(O)) @@ -388,20 +388,27 @@ /obj/machinery/smartfridge/organ name = "smart organ storage" desc = "A refrigerated storage unit for organ storage." - max_n_of_items = 20 //vastly lower to prevent processing too long + max_n_of_items = 25 //vastly lower to prevent processing too long var/repair_rate = 0 /obj/machinery/smartfridge/organ/accept_check(obj/item/O) if(istype(O, /obj/item/organ)) return TRUE + if(istype(O, /obj/item/reagent_containers/syringe)) + return TRUE + if(istype(O, /obj/item/reagent_containers/glass/bottle)) + return TRUE + if(istype(O, /obj/item/reagent_containers/medspray)) + return TRUE return FALSE /obj/machinery/smartfridge/organ/load(obj/item/O) . = ..() if(!.) //if the item loads, clear can_decompose return - var/obj/item/organ/organ = O - organ.organ_flags |= ORGAN_FROZEN + if(istype(O, /obj/item/organ)) + var/obj/item/organ/organ = O + organ.organ_flags |= ORGAN_FROZEN /obj/machinery/smartfridge/organ/RefreshParts() for(var/obj/item/stock_parts/matter_bin/B in component_parts) @@ -420,6 +427,17 @@ if(istype(AM)) AM.organ_flags &= ~ORGAN_FROZEN +/obj/machinery/smartfridge/organ/preloaded + initial_contents = list( + /obj/item/reagent_containers/medspray/synthtissue = 1, + /obj/item/reagent_containers/medspray/sterilizine = 1) + +/obj/machinery/smartfridge/organ/preloaded/Initialize() + ..() + var/list = list(/obj/item/organ/tongue, /obj/item/organ/brain, /obj/item/organ/heart, /obj/item/organ/liver, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/tail, /obj/item/organ/stomach) + var/newtype = pick(list) + load(new newtype(src.loc)) + // ----------------------------- // Chemistry Medical Smartfridge // ----------------------------- diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm index fe038ce3f1..4fbb931b32 100644 --- a/code/modules/games/cas.dm +++ b/code/modules/games/cas.dm @@ -130,9 +130,11 @@ update_icon() /obj/item/toy/cards/singlecard/cas/AltClick(mob/living/user) + . = ..() if(!ishuman(user) || !user.canUseTopic(src, BE_CLOSE)) return Flip() + return TRUE /obj/item/toy/cards/singlecard/cas/update_icon() if(flipped) diff --git a/code/modules/holiday/halloween/halloween.dm b/code/modules/holiday/halloween/halloween.dm index 5b9b2ac21d..24225c1a20 100644 --- a/code/modules/holiday/halloween/halloween.dm +++ b/code/modules/holiday/halloween/halloween.dm @@ -252,12 +252,11 @@ // Spooky Uplink Items // ///////////////////////// -/datum/uplink_item/dangerous/crossbow/candy +/datum/uplink_item/stealthy_weapons/crossbow/candy name = "Candy Corn Crossbow" desc = "A standard miniature energy crossbow that uses a hard-light projector to transform bolts into candy corn. Happy Halloween!" category = "Holiday" item = /obj/item/gun/energy/kinetic_accelerator/crossbow/halloween - cost = 12 surplus = 0 /datum/uplink_item/device_tools/emag/hack_o_lantern diff --git a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm index fd9f879f5e..7fa1a0dd2c 100644 --- a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm +++ b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm @@ -4,7 +4,7 @@ desc = "Keeps the lil buzzing buggers out of your eyes." icon_state = "beekeeper" item_state = "beekeeper" - clothing_flags = THICKMATERIAL | SNUG_FIT + clothing_flags = THICKMATERIAL /obj/item/clothing/suit/beekeeper_suit diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index 7355aa5ab1..66d03c777c 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -89,7 +89,7 @@ icon_state = "seed-orange" species = "orange" plantname = "Extradimensional Orange Tree" - product = /obj/item/reagent_containers/food/snacks/grown/citrus/orange + product = /obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d lifespan = 60 endurance = 50 yield = 5 @@ -98,10 +98,10 @@ icon_grow = "lime-grow" icon_dead = "lime-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05) + reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05, "haloperidol" = 0.15) /obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d - seed = /obj/item/seeds/orange + seed = /obj/item/seeds/orange_3d name = "extradminesional orange" desc = "You can hardly wrap your head around this thing." icon_state = "orang" diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm index 4787d62230..a898b76ee8 100644 --- a/code/modules/hydroponics/grown/cotton.dm +++ b/code/modules/hydroponics/grown/cotton.dm @@ -32,7 +32,7 @@ var/cotton_name = "raw cotton" /obj/item/grown/cotton/attack_self(mob/user) - user.show_message("You pull some [cotton_name] out of the [name]!", 1) + user.show_message("You pull some [cotton_name] out of the [name]!", MSG_VISUAL) var/seed_modifier = 0 if(seed) seed_modifier = round(seed.potency / 25) diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index 08ce71ad37..8fc141e152 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -56,11 +56,41 @@ /obj/item/reagent_containers/food/snacks/grown/grass/fairy seed = /obj/item/seeds/grass/fairy name = "fairygrass" - desc = "Blue, glowing, and smells fainly of mushrooms." + desc = "Glowing, and smells fainly of mushrooms." icon_state = "fairygrassclump" filling_color = "#3399ff" stacktype = /obj/item/stack/tile/fairygrass +/obj/item/reagent_containers/food/snacks/grown/grass/fairy/attack_self(mob/user) + var/datum/plant_gene/trait/glow/G = null + for(var/datum/plant_gene/trait/glow/gene in seed.genes) + G = gene + break + + stacktype = initial(stacktype) + + if(G) + switch(G.type) + if(/datum/plant_gene/trait/glow/white) + stacktype = /obj/item/stack/tile/fairygrass/white + if(/datum/plant_gene/trait/glow/red) + stacktype = /obj/item/stack/tile/fairygrass/red + if(/datum/plant_gene/trait/glow/yellow) + stacktype = /obj/item/stack/tile/fairygrass/yellow + if(/datum/plant_gene/trait/glow/green) + stacktype = /obj/item/stack/tile/fairygrass/green + if(/datum/plant_gene/trait/glow/blue) + stacktype = /obj/item/stack/tile/fairygrass/blue + if(/datum/plant_gene/trait/glow/purple) + stacktype = /obj/item/stack/tile/fairygrass/purple + if(/datum/plant_gene/trait/glow/pink) + stacktype = /obj/item/stack/tile/fairygrass/pink + + . = ..() + + + + // Carpet /obj/item/seeds/grass/carpet name = "pack of carpet seeds" diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 9d91d028ba..b37e494233 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -141,8 +141,9 @@ endurance = 50 maturation = 3 yield = 4 - growthstages = 3 + growthstages = 2 reagents_add = list("sugar" = 0.25) + mutatelist = list(/obj/item/seeds/bamboo) /obj/item/reagent_containers/food/snacks/grown/sugarcane seed = /obj/item/seeds/sugarcane @@ -226,9 +227,12 @@ /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime() icon_state = "cherry_bomb_lit" playsound(src, 'sound/effects/fuse.ogg', seed.potency, 0) + addtimer(CALLBACK(src, /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/detonate), rand(50, 100)) + +/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/detonate() reagents.chem_temp = 1000 //Sets off the black powder reagents.handle_reactions() - + // Lavaland cactus /obj/item/seeds/lavaland/cactus diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index 02bc776b78..46dc49a169 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -29,7 +29,7 @@ /obj/item/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, params) if(W.get_sharpness()) - user.show_message("You carve a face into [src]!", 1) + user.show_message("You carve a face into [src]!", MSG_VISUAL) new /obj/item/clothing/head/hardhat/pumpkinhead(user.loc) qdel(src) return diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index ce0ca0220b..bac480bee6 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -41,7 +41,7 @@ blood_type = B.data["blood_type"] features = B.data["features"] factions = B.data["factions"] - factions = B.data["quirks"] + quirks = B.data["quirks"] contains_sample = TRUE visible_message("The [src] is injected with a fresh blood sample.") else diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 9a660ac282..982122e314 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -51,7 +51,7 @@ /obj/item/grown/log/attackby(obj/item/W, mob/user, params) if(W.sharpness) - user.show_message("You make [plank_name] out of \the [src]!", 1) + user.show_message("You make [plank_name] out of \the [src]!", MSG_VISUAL) var/seed_modifier = 0 if(seed) seed_modifier = round(seed.potency / 25) @@ -98,6 +98,49 @@ /obj/item/grown/log/steel/CheckAccepted(obj/item/I) return FALSE +/obj/item/seeds/bamboo + name = "pack of bamboo seeds" + desc = "A plant known for its flexible and resistant logs." + icon_state = "seed-bamboo" + species = "bamboo" + plantname = "Bamboo" + product = /obj/item/grown/log/bamboo + lifespan = 80 + endurance = 70 + maturation = 15 + production = 2 + yield = 5 + potency = 50 + growthstages = 2 + growing_icon = 'icons/obj/hydroponics/growing.dmi' + icon_dead = "bamboo-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) + +/obj/item/grown/log/bamboo + seed = /obj/item/seeds/bamboo + name = "bamboo log" + desc = "A long and resistant bamboo log." + icon_state = "bamboo" + plank_type = /obj/item/stack/sheet/mineral/bamboo + plank_name = "bamboo sticks" + +/obj/item/grown/log/bamboo/CheckAccepted(obj/item/I) + return FALSE + +/obj/structure/punji_sticks + name = "punji sticks" + desc = "Don't step on this." + icon = 'icons/obj/hydroponics/equipment.dmi' + icon_state = "punji" + resistance_flags = FLAMMABLE + max_integrity = 30 + density = FALSE + anchored = TRUE + +/obj/structure/punji_sticks/Initialize(mapload) + . = ..() + AddComponent(/datum/component/caltrop, 20, 30, 100, CALTROP_BYPASS_SHOES) + /////////BONFIRES////////// /obj/structure/bonfire diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index f45b6bc517..59a9725383 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -380,7 +380,11 @@ pestlevel = 0 // Reset update_icon() visible_message("The [oldPlantName] is overtaken by some [myseed.plantname]!") - + name = "hydroponics tray ([myseed.plantname])" + if(myseed.product) + desc = initial(myseed.product.desc) + else + desc = initial(desc) /obj/machinery/hydroponics/proc/mutate(lifemut = 2, endmut = 5, productmut = 1, yieldmut = 2, potmut = 25, wrmut = 2, wcmut = 5, traitmut = 0) // Mutates the current seed if(!myseed) @@ -414,7 +418,11 @@ sleep(5) // Wait a while update_icon() visible_message("[oldPlantName] suddenly mutates into [myseed.plantname]!") - + name = "hydroponics tray ([myseed.plantname])" + if(myseed.product) + desc = initial(myseed.product.desc) + else + desc = initial(desc) /obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent instead. Mind you, this pretty much destroys the old plant if( weedlevel > 5 ) @@ -524,7 +532,7 @@ if(S.has_reagent("charcoal", 1)) adjustToxic(-round(S.get_reagent_amount("charcoal") * 2)) - // NIGGA, YOU JUST WENT ON FULL RETARD. + // Toxins, not good for anything if(S.has_reagent("toxin", 1)) adjustToxic(round(S.get_reagent_amount("toxin") * 2)) @@ -539,14 +547,14 @@ adjustNutri(round(S.get_reagent_amount("beer") * 0.25)) adjustWater(round(S.get_reagent_amount("beer") * 0.7)) - // You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial + // Fluorine one of the most corrosive and deadly gasses if(S.has_reagent("fluorine", 1)) adjustHealth(-round(S.get_reagent_amount("fluorine") * 2)) adjustToxic(round(S.get_reagent_amount("fluorine") * 2.5)) adjustWater(-round(S.get_reagent_amount("fluorine") * 0.5)) adjustWeeds(-rand(1,4)) - // You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial + // Chlorine one of the most corrosive and deadly gasses if(S.has_reagent("chlorine", 1)) adjustHealth(-round(S.get_reagent_amount("chlorine") * 1)) adjustToxic(round(S.get_reagent_amount("chlorine") * 1.5)) @@ -561,7 +569,7 @@ adjustWater(-round(S.get_reagent_amount("phosphorus") * 0.5)) adjustWeeds(-rand(1,2)) - // Plants should not have sugar, they can't use it and it prevents them getting water/ nutients, it is good for mold though... + // Plants should not have sugar, they can't use it and it prevents them getting water/nutients, it is good for mold though... if(S.has_reagent("sugar", 1)) adjustWeeds(rand(1,2)) adjustPests(rand(1,2)) @@ -583,13 +591,13 @@ adjustHealth(round(S.get_reagent_amount("sodawater") * 0.1)) adjustNutri(round(S.get_reagent_amount("sodawater") * 0.1)) - // Man, you guys are retards + // Sulphuric Acid if(S.has_reagent("sacid", 1)) adjustHealth(-round(S.get_reagent_amount("sacid") * 1)) adjustToxic(round(S.get_reagent_amount("sacid") * 1.5)) adjustWeeds(-rand(1,2)) - // SERIOUSLY + // Acid if(S.has_reagent("facid", 1)) adjustHealth(-round(S.get_reagent_amount("facid") * 2)) adjustToxic(round(S.get_reagent_amount("facid") * 3)) @@ -601,7 +609,7 @@ adjustToxic(round(S.get_reagent_amount("plantbgone") * 6)) adjustWeeds(-rand(4,8)) - // why, just why + // Napalm, not known for being good for anything organic if(S.has_reagent("napalm", 1)) if(!(myseed.resistance_flags & FIRE_PROOF)) adjustHealth(-round(S.get_reagent_amount("napalm") * 6)) @@ -638,13 +646,14 @@ if (myseed) myseed.adjust_production(-round(salt/100)-prob(salt%100)) myseed.adjust_potency(round(salt*0.5)) + // Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer if(S.has_reagent("ash", 1)) adjustHealth(round(S.get_reagent_amount("ash") * 0.25)) adjustNutri(round(S.get_reagent_amount("ash") * 0.5)) adjustWeeds(-1) - // This is more bad ass, and pests get hurt by the corrosive nature of it, not the plant. + // Diethylamine is more bad ass, and pests get hurt by the corrosive nature of it, not the plant. if(S.has_reagent("diethylamine", 1)) adjustHealth(round(S.get_reagent_amount("diethylamine") * 1)) adjustNutri(round(S.get_reagent_amount("diethylamine") * 2)) @@ -652,26 +661,37 @@ myseed.adjust_yield(round(S.get_reagent_amount("diethylamine") * 0.02)) adjustPests(-rand(1,2)) - // Compost, effectively + // Nutriment Compost, effectively if(S.has_reagent("nutriment", 1)) adjustHealth(round(S.get_reagent_amount("nutriment") * 0.5)) adjustNutri(round(S.get_reagent_amount("nutriment") * 1)) - // Compost for EVERYTHING + // Virusfood Compost for EVERYTHING if(S.has_reagent("virusfood", 1)) adjustNutri(round(S.get_reagent_amount("virusfood") * 0.5)) adjustHealth(-round(S.get_reagent_amount("virusfood") * 0.5)) - // FEED ME + // Blood if(S.has_reagent("blood", 1)) adjustNutri(round(S.get_reagent_amount("blood") * 1)) adjustPests(rand(2,4)) - // FEED ME SEYMOUR + // Strange reagent if(S.has_reagent("strangereagent", 1)) spawnplant() - // The best stuff there is. For testing/debugging. + // Honey, Pests are dieing of sugar, so is the plant + if(S.has_reagent("honey", 1)) + adjustPests(-rand(2,5)) + adjustHealth(-round(S.get_reagent_amount("honey") * 1)) + + // Buzz Fuzz, a drink seemingly made for plants... + if(S.has_reagent("buzz_fuzz", 1)) + adjustPests(-rand(2,5)) + adjustHealth(round(S.get_reagent_amount("buzz_fuzz") * 0.1)) + adjustNutri(round(S.get_reagent_amount("buzz_fuzz") * 0.5)) + + // Adminordrazine the best stuff there is. For testing/debugging. if(S.has_reagent("adminordrazine", 1)) adjustWater(round(S.get_reagent_amount("adminordrazine") * 1)) adjustHealth(round(S.get_reagent_amount("adminordrazine") * 1)) @@ -769,6 +789,15 @@ to_chat(user, "You plant [O].") dead = 0 myseed = O + name = "hydroponics tray ([myseed.plantname])" + if(!myseed.productdesc) //we haven't changed our produce's description + if(myseed.product) + myseed.productdesc = initial(myseed.product.desc) + else if(myseed.desc) + myseed.productdesc = myseed.desc + else + myseed.productdesc = "A fascinating specimen." + desc = myseed.productdesc age = 1 plant_health = myseed.endurance lastcycle = world.time @@ -834,6 +863,8 @@ harvest = FALSE //To make sure they can't just put in another seed and insta-harvest it qdel(myseed) myseed = null + name = initial(name) + desc = initial(desc) weedlevel = 0 //Has a side effect of cleaning up those nasty weeds update_icon() @@ -866,6 +897,8 @@ qdel(myseed) myseed = null update_icon() + name = initial(name) + desc = initial(desc) else if(user) examine(user) @@ -883,6 +916,8 @@ qdel(myseed) myseed = null dead = 0 + name = initial(name) + desc = initial(desc) update_icon() /// Tray Setters - The following procs adjust the tray or plants variables, and make sure that the stat doesn't go out of bounds./// diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 74185e9b3f..3597ed5be6 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -299,7 +299,7 @@ rate = 0.04 glow_color = "#AAD84B" -datum/plant_gene/trait/glow/white +/datum/plant_gene/trait/glow/white name = "White Bioluminescence" glow_color = "#FFFFFF" diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 16863b0aa4..4132719389 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -8,7 +8,8 @@ w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE var/plantname = "Plants" // Name of plant when planted. - var/product // A type path. The thing that is created when the plant is harvested. + var/obj/item/product // A type path. The thing that is created when the plant is harvested. + var/productdesc var/species = "" // Used to update icons. Should match the name in the sprites unless all icon_* are overridden. var/growing_icon = 'icons/obj/hydroponics/growing.dmi' //the file that stores the sprites of the growing plant from this seed. @@ -69,6 +70,10 @@ genes += new /datum/plant_gene/reagent(reag_id, reagents_add[reag_id]) reagents_from_genes() //quality coding +/obj/item/seeds/examine(mob/user) + . = ..() + . += "Use a pen on it to rename it or change its description." + /obj/item/seeds/proc/Copy() var/obj/item/seeds/S = new type(null, 1) // Copy all the stats @@ -80,6 +85,10 @@ S.potency = potency S.weed_rate = weed_rate S.weed_chance = weed_chance + S.name = name + S.plantname = plantname + S.desc = desc + S.productdesc = productdesc S.genes = list() for(var/g in genes) var/datum/plant_gene/G = g @@ -157,11 +166,18 @@ var/product_name while(t_amount < getYield()) var/obj/item/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, src) + if(parent.myseed.plantname != initial(parent.myseed.plantname)) + t_prod.name = lowertext(parent.myseed.plantname) + if(productdesc) + t_prod.desc = productdesc + t_prod.seed.name = parent.myseed.name + t_prod.seed.desc = parent.myseed.desc + t_prod.seed.plantname = parent.myseed.plantname result.Add(t_prod) // User gets a consumable if(!t_prod) return t_amount++ - product_name = t_prod.name + product_name = parent.myseed.plantname if(getYield() >= 1) SSblackbox.record_feedback("tally", "food_harvested", getYield(), product_name) parent.update_tray(user) @@ -331,14 +347,56 @@ to_chat(user, "[text]") return + + if(istype(O, /obj/item/pen)) + var/choice = input("What would you like to change?") in list("Plant Name", "Seed Description", "Product Description", "Cancel") + if(!user.canUseTopic(src, BE_CLOSE)) + return + switch(choice) + if("Plant Name") + var/newplantname = reject_bad_text(stripped_input(user, "Write a new plant name:", name, plantname)) + if(!user.canUseTopic(src, BE_CLOSE)) + return + if (length(newplantname) > 20) + to_chat(user, "That name is too long!") + return + if(!newplantname) + to_chat(user, "That name is invalid.") + return + else + name = "[lowertext(newplantname)]" + plantname = newplantname + if("Seed Description") + var/newdesc = stripped_input(user, "Write a new description:", name, desc) + if(!user.canUseTopic(src, BE_CLOSE)) + return + if (length(newdesc) > 180) + to_chat(user, "That description is too long!") + return + if(!newdesc) + to_chat(user, "That description is invalid.") + return + else + desc = newdesc + if("Product Description") + if(product && !productdesc) + productdesc = initial(product.desc) + var/newproductdesc = stripped_input(user, "Write a new description:", name, productdesc) + if(!user.canUseTopic(src, BE_CLOSE)) + return + if (length(newproductdesc) > 180) + to_chat(user, "That description is too long!") + return + if(!newproductdesc) + to_chat(user, "That description is invalid.") + return + else + productdesc = newproductdesc + else + return + ..() // Fallthrough to item/attackby() so that bags can pick seeds up - - - - - - // Checks plants for broken tray icons. Use Advanced Proc Call to activate. // Maybe some day it would be used as unit test. /proc/check_plants_growth_stages_icons() diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 93ddedebc0..d8bf82a4b4 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -615,6 +615,11 @@ return ..() +/obj/item/electronic_assembly/can_trigger_gun(mob/living/user) //sanity checks against pocket death weapon circuits + if(!can_fire_equipped || !user.is_holding(src)) + return FALSE + return ..() + /obj/item/electronic_assembly/default //The /default electronic_assemblys are to allow the introduction of the new naming scheme without breaking old saves. name = "type-a electronic assembly" diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index cec3e2348e..40bcbe016b 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -402,3 +402,8 @@ a creative player the means to solve many problems. Circuits are held inside an return TRUE return FALSE + +/obj/item/integrated_circuit/can_trigger_gun(mob/living/user) + if(!user.is_holding(src)) + return FALSE + return ..() diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index b7feedd312..46f8017b10 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -859,7 +859,7 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH power_draw_per_use = 5 -/obj/item/integrated_circuit/input/microphone/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) +/obj/item/integrated_circuit/input/microphone/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode, atom/movable/source) . = ..() var/translated = FALSE if(speaker && message) diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index fb00897eec..0bdf0547f9 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -11,7 +11,7 @@ w_class = WEIGHT_CLASS_SMALL complexity = 10 cooldown_per_use = 1 - ext_cooldown = 2 + ext_cooldown = 4 inputs = list("direction" = IC_PINTYPE_DIR) outputs = list("obstacle" = IC_PINTYPE_REF) activators = list("step towards dir" = IC_PINTYPE_PULSE_IN,"on step"=IC_PINTYPE_PULSE_OUT,"blocked"=IC_PINTYPE_PULSE_OUT) diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm index 7bccbfafcd..350f05914d 100644 --- a/code/modules/integrated_electronics/subtypes/weaponized.dm +++ b/code/modules/integrated_electronics/subtypes/weaponized.dm @@ -81,9 +81,13 @@ to_chat(user, "There's no weapon to remove from the mechanism.") /obj/item/integrated_circuit/weaponized/weapon_firing/do_work() - if(!installed_gun || !installed_gun.handle_pins()) + if(!assembly || !installed_gun) return - if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc))) + if(isliving(assembly.loc)) + var/mob/living/L = assembly.loc + if(!assembly.can_fire_equipped || !L.is_holding(assembly) || !installed_gun.can_trigger_gun(L)) //includes pins, hulk and other chunky fingers checks. + return + else if(!isturf(assembly.loc) || !installed_gun.handle_pins()) return set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun)) push_data() @@ -92,18 +96,17 @@ var/datum/integrated_io/mode1 = inputs[3] mode = mode1.data - if(assembly) - if(isnum(xo.data)) - xo.data = round(xo.data, 1) - if(isnum(yo.data)) - yo.data = round(yo.data, 1) + if(isnum(xo.data)) + xo.data = round(xo.data, 1) + if(isnum(yo.data)) + yo.data = round(yo.data, 1) - var/turf/T = get_turf(assembly) - var/target_x = CLAMP(T.x + xo.data, 0, world.maxx) - var/target_y = CLAMP(T.y + yo.data, 0, world.maxy) + var/turf/T = get_turf(assembly) + var/target_x = CLAMP(T.x + xo.data, 0, world.maxx) + var/target_y = CLAMP(T.y + yo.data, 0, world.maxy) - assembly.visible_message("[assembly] fires [installed_gun]!") - shootAt(locate(target_x, target_y, T.z)) + assembly.visible_message("[assembly] fires [installed_gun]!") + shootAt(locate(target_x, target_y, T.z)) /obj/item/integrated_circuit/weaponized/weapon_firing/proc/shootAt(turf/target) var/turf/T = get_turf(src) @@ -246,26 +249,30 @@ if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/twohanded) || istype(A, /obj/item/transfer_valve)) return - if(!AT || !AT.air_contents) + var/obj/item/I = get_object() + var/turf/T = get_turf(I) + if(!T) + return + if(isliving(I.loc)) + var/mob/living/L = I.loc + if(!I.can_trigger_gun(L)) //includes hulk and other chunky fingers checks. + return + if(HAS_TRAIT(L, TRAIT_PACIFISM) && A.throwforce) + to_chat(L, " [I] is lethally chambered! You don't want to risk harming anyone...") + return + else if(T != I.loc) return - if (istype(assembly.loc, /obj/item/implant/storage)) //Prevents the more abusive form of chestgun. + if(!AT || !AT.air_contents) return if(max_w_class && (A.w_class > max_w_class)) return - if(!assembly.can_fire_equipped && ishuman(assembly.loc)) - return - // Is the target inside the assembly or close to it? if(!check_target(A, exclude_components = TRUE)) return - var/turf/T = get_turf(get_object()) - if(!T) - return - // If the item is in mob's inventory, try to remove it from there. if(ismob(A.loc)) var/mob/living/M = A.loc diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index c6342e2154..40bfa0bbfa 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -20,8 +20,7 @@ access = list() //See get_access() minimal_access = list() //See get_access() - mind_traits = list(TRAIT_CAPTAIN_METABOLISM) -// mind_traits = list(TRAIT_DISK_VERIFIER) + mind_traits = list(TRAIT_CAPTAIN_METABOLISM, TRAIT_DISK_VERIFIER) display_order = JOB_DISPLAY_ORDER_CAPTAIN diff --git a/code/modules/keybindings/bindings_carbon.dm b/code/modules/keybindings/bindings_carbon.dm index a982273c86..eef170cea9 100644 --- a/code/modules/keybindings/bindings_carbon.dm +++ b/code/modules/keybindings/bindings_carbon.dm @@ -3,18 +3,6 @@ if("R", "Southwest") // Southwest is End toggle_throw_mode() return - if("1") - a_intent_change("help") - return - if("2") - a_intent_change("disarm") - return - if("3") - a_intent_change("grab") - return - if("4") - a_intent_change("harm") - return if("C") toggle_combat_mode() return diff --git a/code/modules/keybindings/bindings_living.dm b/code/modules/keybindings/bindings_living.dm index 241bc15b60..8e9c787b6b 100644 --- a/code/modules/keybindings/bindings_living.dm +++ b/code/modules/keybindings/bindings_living.dm @@ -3,5 +3,22 @@ if("B") resist() return + if("1") + if(possible_a_intents) + a_intent_change(INTENT_HELP) + return + if("2") + if(possible_a_intents) + a_intent_change(INTENT_DISARM) + return + if("3") + if(possible_a_intents) + a_intent_change(INTENT_GRAB) + return + if("4") + if(possible_a_intents) + a_intent_change(INTENT_HARM) + return + return ..() \ No newline at end of file diff --git a/code/modules/language/vampiric.dm b/code/modules/language/vampiric.dm new file mode 100644 index 0000000000..6da54ce844 --- /dev/null +++ b/code/modules/language/vampiric.dm @@ -0,0 +1,25 @@ +// VAMPIRE LANGUAGE // + +/datum/language/vampiric + name = "Blah-Sucker" + desc = "The native language of the Bloodsucker elders, learned intuitively by Fledglings and as they pass from death into immortality. Thralls are also given the ability to speak this as apart of their conversion ritual." + speech_verb = "growls" + ask_verb = "growls" + exclaim_verb = "snarls" + whisper_verb = "hisses" + key = "b" + space_chance = 40 + default_priority = 90 + icon_state = "bloodsucker" + + flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD // Hide the icon next to your text if someone doesn't know this language. + syllables = list( + "luk","cha","no","kra","pru","chi","busi","tam","pol","spu","och", // Start: Vampiric + "umf","ora","stu","si","ri","li","ka","red","ani","lup","ala","pro", + "to","siz","nu","pra","ga","ump","ort","a","ya","yach","tu","lit", + "wa","mabo","mati","anta","tat","tana","prol", + "tsa","si","tra","te","ele","fa","inz", // Start: Romanian + "nza","est","sti","ra","pral","tsu","ago","esch","chi","kys","praz", // Start: Custom + "froz","etz","tzil", + "t'","k'","t'","k'","th'","tz'" + ) diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index f98f0755c8..4cfd2e447f 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -181,10 +181,11 @@ else return ..() +//this helps you not blow up so easily by overriding unlocking which results in an immediate boom. /obj/structure/closet/crate/secure/loot/AltClick(mob/living/user) - if(!user.canUseTopic(src, BE_CLOSE)) - return - return attack_hand(user) //this helps you not blow up so easily by overriding unlocking which results in an immediate boom. + if(user.canUseTopic(src, BE_CLOSE)) + attack_hand(user) + return TRUE /obj/structure/closet/crate/secure/loot/attackby(obj/item/W, mob/user) if(locked) diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index 00ce37b79a..9d595664ff 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -59,6 +59,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( /obj/item/stack/marker_beacon/AltClick(mob/living/user) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return + . = TRUE var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return @@ -128,9 +129,10 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( return ..() /obj/structure/marker_beacon/AltClick(mob/living/user) - ..() + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return + . = TRUE var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 054103e8dc..ab3b20ac9f 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -398,6 +398,7 @@ fire_sound = 'sound/weapons/batonextend.ogg' max_charges = 1 item_flags = NEEDS_PERMIT | NOBLUDGEON + w_class = WEIGHT_CLASS_BULKY force = 18 /obj/item/ammo_casing/magic/hook diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index d54b8256a9..7aae26526e 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -25,7 +25,7 @@ features = random_features() age = rand(AGE_MIN,AGE_MAX) -/datum/preferences/proc/update_preview_icon() +/datum/preferences/proc/update_preview_icon(equip_job = TRUE) // Determine what job is marked as 'High' priority, and dress them up as such. var/datum/job/previewJob var/highest_pref = 0 @@ -45,12 +45,11 @@ // Set up the dummy for its photoshoot var/mob/living/carbon/human/dummy/mannequin = generate_or_wait_for_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES) - mannequin.cut_overlays() // Apply the Dummy's preview background first so we properly layer everything else on top of it. mannequin.add_overlay(mutable_appearance('modular_citadel/icons/ui/backgrounds.dmi', bgstate, layer = SPACE_LAYER)) copy_to(mannequin) - if(previewJob) + if(previewJob && equip_job) mannequin.job = previewJob.title previewJob.equip(mannequin, TRUE, preference_source = parent) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm index 524c1f0f13..0a35f0cd26 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm @@ -43,6 +43,18 @@ name = "Knee-High - UK" icon_state = "uk_knee" +/datum/sprite_accessory/underwear/socks/christmas_knee + name = "Knee-High - Christmas" + icon_state = "christmas_knee" + +/datum/sprite_accessory/underwear/socks/candycaner_knee + name = "Knee-High - Red Candy Cane" + icon_state = "candycaner_knee" + +/datum/sprite_accessory/underwear/socks/candycaneg_knee + name = "Knee-High - Green Candy Cane" + icon_state = "candycaneg_knee" + /datum/sprite_accessory/underwear/socks/socks_norm name = "Normal" icon_state = "socks_norm" @@ -52,6 +64,18 @@ name = "Normal - Bee" icon_state = "bee_norm" +/datum/sprite_accessory/underwear/socks/christmas_norm + name = "Normal - Christmas" + icon_state = "christmas_norm" + +/datum/sprite_accessory/underwear/socks/candycaner_norm + name = "Normal - Red Candy Cane" + icon_state = "candycaner_norm" + +/datum/sprite_accessory/underwear/socks/candycaneg_norm + name = "Normal - Green Candy Cane" + icon_state = "candycaneg_norm" + /datum/sprite_accessory/underwear/socks/pantyhose name = "Pantyhose" icon_state = "pantyhose" @@ -131,3 +155,15 @@ /datum/sprite_accessory/underwear/socks/uk_thigh name = "Thigh-high - UK" icon_state = "uk_thigh" + +/datum/sprite_accessory/underwear/socks/christmas_thigh + name = "Thigh-high - Christmas" + icon_state = "christmas_thigh" + +/datum/sprite_accessory/underwear/socks/candycaner_thigh + name = "Thigh-high - Red Candy Cane" + icon_state = "candycaner_thigh" + +/datum/sprite_accessory/underwear/socks/candycaneg_thigh + name = "Thigh-high - Green Candy Cane" + icon_state = "candycaneg_thigh" \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index fbbd43bbe1..5bdfd174b5 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -265,7 +265,7 @@ Works together with spawning an observer, noted above. /mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE) penalize = suiciding || penalize // suicide squad. - if(!key || cmptext(copytext(key,1,2),"@") || (!special && SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse) & COMPONENT_BLOCK_GHOSTING)) + if(!key || cmptext(copytext(key,1,2),"@") || (SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse, special, penalize) & COMPONENT_BLOCK_GHOSTING)) return //mob has no key, is an aghost or some component hijacked. stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc. diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 7eeab05466..69cbd0830a 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -22,7 +22,7 @@ . = say_dead(message) -/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) . = ..() var/atom/movable/to_follow = speaker if(radio_freq) @@ -35,6 +35,6 @@ to_follow = V.source var/link = FOLLOW_LINK(src, to_follow) // Recompose the message, because it's scrambled by default - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) + message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source) to_chat(src, "[link] [message]") diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 757aadaea1..8195b3d84b 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -36,6 +36,9 @@ if(bleed_rate <= 0) bleed_rate = 0 + if(HAS_TRAIT(src, TRAIT_NOMARROW)) //Bloodsuckers don't need to be here. + return + if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood. //Blood regeneration if there is some space diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index aa3c209016..2a57506df6 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -125,6 +125,7 @@ else if(!brain) brain = new(src) brain.name = "[L.real_name]'s brain" + brain.organ_flags |= ORGAN_FROZEN name = "Man-Machine Interface: [brainmob.real_name]" update_icon() diff --git a/code/modules/mob/living/carbon/alien/damage_procs.dm b/code/modules/mob/living/carbon/alien/damage_procs.dm index 2f8ffb4c01..f5d210b94b 100644 --- a/code/modules/mob/living/carbon/alien/damage_procs.dm +++ b/code/modules/mob/living/carbon/alien/damage_procs.dm @@ -7,9 +7,9 @@ /* CIT CHANGE - Pffffffffffffhahahahahhaha-- No. //aliens are immune to stamina damage. -/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_stamina = 1) +/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_health = 1) return -/mob/living/carbon/alien/setStaminaLoss(amount, updating_stamina = 1) +/mob/living/carbon/alien/setStaminaLoss(amount, updating_health = 1) return */ diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 3a9495a5cb..6ecedba3be 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -159,23 +159,34 @@ return //END OF CIT CHANGES - var/atom/movable/thrown_thing var/obj/item/I = src.get_active_held_item() - if(!I) - if(pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE) - var/mob/living/throwable_mob = pulling - if(!throwable_mob.buckled) - thrown_thing = throwable_mob + var/atom/movable/thrown_thing + var/mob/living/throwable_mob + + if(istype(I, /obj/item/clothing/head/mob_holder)) + var/obj/item/clothing/head/mob_holder/holder = I + if(holder.held_mob) + throwable_mob = holder.held_mob + holder.release() + + if(!I || throwable_mob) + if(!throwable_mob && pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE) + throwable_mob = pulling + + if(throwable_mob && !throwable_mob.buckled) + thrown_thing = throwable_mob + if(pulling) stop_pulling() - if(HAS_TRAIT(src, TRAIT_PACIFISM)) - to_chat(src, "You gently let go of [throwable_mob].") - return - adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring - var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors - var/turf/end_T = get_turf(target) - if(start_T && end_T) - log_combat(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]") + if(HAS_TRAIT(src, TRAIT_PACIFISM)) + to_chat(src, "You gently let go of [throwable_mob].") + return + + adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring + var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors + var/turf/end_T = get_turf(target) + if(start_T && end_T) + log_combat(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]") else if(!CHECK_BITFIELD(I.item_flags, ABSTRACT) && !HAS_TRAIT(I, TRAIT_NODROP)) thrown_thing = I @@ -195,6 +206,8 @@ newtonian_move(get_dir(target, src)) thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src) + + /mob/living/carbon/restrained(ignore_grab) . = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE)) @@ -585,6 +598,9 @@ sight |= E.sight_flags if(!isnull(E.lighting_alpha)) lighting_alpha = E.lighting_alpha + if(HAS_TRAIT(src, TRAIT_NIGHT_VISION)) + lighting_alpha = min(LIGHTING_PLANE_ALPHA_NV_TRAIT, lighting_alpha) + see_in_dark = max(NIGHT_VISION_DARKSIGHT_RANGE, see_in_dark) if(client.eye && client.eye != src) var/atom/A = client.eye @@ -960,4 +976,4 @@ /mob/living/carbon/transfer_ckey(mob/new_mob, send_signal = TRUE) if(combatmode) toggle_combat_mode(TRUE, TRUE) - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index b0e9b808df..9dcc5276e5 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -316,7 +316,18 @@ else return - + + else if(check_zone(M.zone_selected) == "r_arm" || check_zone(M.zone_selected) == "l_arm") + M.visible_message( \ + "[M] shakes [src]'s hand.", \ + "You shake [src]'s hand.", ) + + else if(check_zone(M.zone_selected) == "mouth") // I ADDED BOOP-EH-DEH-NOSEH - Jon + M.visible_message( \ + "[M] boops [src]'s nose.", \ + "You boop [src] on the nose.", ) + playsound(src, 'sound/items/Nose_boop.ogg', 50, 0) + else M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \ "You hug [src] to make [p_them()] feel better!") @@ -355,30 +366,30 @@ if (damage == 1) to_chat(src, "Your eyes sting a little.") if(prob(40)) - adjust_eye_damage(1) + eyes.applyOrganDamage(1) else if (damage == 2) to_chat(src, "Your eyes burn.") - adjust_eye_damage(rand(2, 4)) + eyes.applyOrganDamage(rand(2, 4)) else if( damage >= 3) to_chat(src, "Your eyes itch and burn severely!") - adjust_eye_damage(rand(12, 16)) + eyes.applyOrganDamage(rand(12, 16)) - if(eyes.eye_damage > 10) + if(eyes.damage > 10) blind_eyes(damage) blur_eyes(damage * rand(3, 6)) - if(eyes.eye_damage > 20) - if(prob(eyes.eye_damage - 20)) + if(eyes.damage > 20) + if(prob(eyes.damage - 20)) if(!HAS_TRAIT(src, TRAIT_NEARSIGHT)) to_chat(src, "Your eyes start to burn badly!") become_nearsighted(EYE_DAMAGE) - else if(prob(eyes.eye_damage - 25)) + else if(prob(eyes.damage - 25)) if(!HAS_TRAIT(src, TRAIT_BLIND)) to_chat(src, "You can't see anything!") - become_blind(EYE_DAMAGE) + eyes.applyOrganDamage(eyes.maxHealth) else to_chat(src, "Your eyes are really starting to hurt. This can't be good for you!") diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 21541e8c28..d893108bcd 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -65,6 +65,8 @@ /mob/living/carbon/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) + if (!forced && amount < 0 && HAS_TRAIT(src,TRAIT_NONATURALHEAL)) + return FALSE if(!forced && (status_flags & GODMODE)) return FALSE if(amount > 0) @@ -74,6 +76,8 @@ return amount /mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) + if (!forced && amount < 0 && HAS_TRAIT(src,TRAIT_NONATURALHEAL)) //Vamps don't heal naturally. + return FALSE if(!forced && (status_flags & GODMODE)) return FALSE if(amount > 0) diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index eba925a659..34c268578c 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -15,7 +15,11 @@ if (wear_mask) . += "[t_He] [t_is] wearing [wear_mask.get_examine_string(user)] on [t_his] face." if (wear_neck) - . += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck." + . += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n" + if(can_be_held) + . += "[t_He] looks small enough to be picked up with Alt+Click!\n" + + for(var/obj/item/I in held_items) if(!(I.item_flags & ABSTRACT)) @@ -38,7 +42,7 @@ continue . += "[t_His] [parse_zone(t)] is missing!" - var/list/msg = list("") + var/list/msg = list() var/temp = getBruteLoss() if(!(user == src && src.hal_screwyhud == SCREWYHUD_HEALTHY)) //fake healthy if(temp) @@ -78,9 +82,8 @@ if(pulledby && pulledby.grab_state) msg += "[t_He] [t_is] restrained by [pulledby]'s grip.\n" - msg += "" - - . += msg.Join("") + if(msg.len) + . += "[msg.Join("")]" if(!appears_dead) if(stat == UNCONSCIOUS) diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 6da188dd2d..74593a20a0 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -17,6 +17,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) /mob/living/carbon/human/dummy/proc/wipe_state() delete_equipment() + icon_render_key = null cut_overlays(TRUE) //Inefficient pooling/caching way. diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index c9e2bbb29b..310ab6beeb 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -15,6 +15,13 @@ . = list("*---------*\nThis is [!obscure_name ? name : "Unknown"]!") + var/vampDesc = ReturnVampExamine(user) // Vamps recognize the names of other vamps. + var/vassDesc = ReturnVassalExamine(user) // Vassals recognize each other's marks. + if (vampDesc != "") // If we don't do it this way, we add a blank space to the string...something to do with this --> . += "" + . += vampDesc + if (vassDesc != "") + . += vassDesc + var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) @@ -113,7 +120,7 @@ . += "[dicc.desc]" var/cursed_stuff = attempt_vr(src,"examine_bellies",args) //vore Code - if(!isnull(cursed_stuff)) + if(cursed_stuff) . += cursed_stuff //END OF CIT CHANGES @@ -169,7 +176,7 @@ var/r_limbs_missing = 0 for(var/t in missing) if(t==BODY_ZONE_HEAD) - msg += "[t_His] [parse_zone(t)] is missing!\n" + msg += "[t_His] [parse_zone(t)] is missing!\n" continue if(t == BODY_ZONE_L_ARM || t == BODY_ZONE_L_LEG) l_limbs_missing++ @@ -237,13 +244,13 @@ if(DISGUST_LEVEL_DISGUSTED to INFINITY) msg += "[t_He] look[p_s()] extremely disgusted.\n" - if(blood_volume < (BLOOD_VOLUME_SAFE*blood_ratio)) + if(ShowAsPaleExamine()) msg += "[t_He] [t_has] pale skin.\n" if(bleedsuppress) msg += "[t_He] [t_is] bandaged with something.\n" else if(bleed_rate) - if(reagents.has_reagent("heparin")) + if(bleed_rate >= 8) //8 is the rate at which heparin causes you to bleed msg += "[t_He] [t_is] bleeding uncontrollably!\n" else msg += "[t_He] [t_is] bleeding!\n" @@ -272,11 +279,10 @@ msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n" if(reagents.has_reagent("astral")) - msg += "[t_He] has wild, spacey eyes" if(mind) - msg += " and they have a strange, abnormal look to them.\n" + msg += "[t_He] has wild, spacey eyes and they have a strange, abnormal look to them.\n" else - msg += " and they don't look like they're all there.\n" + msg += "[t_He] has wild, spacey eyes and they don't look like they're all there.\n" if(isliving(user)) var/mob/living/L = user @@ -287,7 +293,7 @@ msg += "[t_He] seem[p_s()] winded.\n" if (getToxLoss() >= 10) msg += "[t_He] seem[p_s()] sickly.\n" - var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) + var/datum/component/mood/mood = GetComponent(/datum/component/mood) if(mood.sanity <= SANITY_DISTURBED) msg += "[t_He] seem[p_s()] distressed.\n" SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empath", /datum/mood_event/sad_empath, src) @@ -299,8 +305,6 @@ if (HAS_TRAIT(src, TRAIT_DEAF)) msg += "[t_He] appear[p_s()] to not be responding to noises.\n" - msg += "" - var/obj/item/organ/vocal_cords/Vc = user.getorganslot(ORGAN_SLOT_VOICE) if(Vc) if(istype(Vc, /obj/item/organ/vocal_cords/velvet)) @@ -360,7 +364,7 @@ if(R) . += "\[Medical evaluation\]" if(traitstring) - . += "Detected physiological traits:\n[traitstring]" + . += "Detected physiological traits:\n[traitstring]" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9eab9054f5..45211f7f44 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -858,6 +858,7 @@ .["Make slime"] = "?_src_=vars;[HrefToken()];makeslime=[REF(src)]" .["Toggle Purrbation"] = "?_src_=vars;[HrefToken()];purrbation=[REF(src)]" .["Copy outfit"] = "?_src_=vars;[HrefToken()];copyoutfit=[REF(src)]" + .["Add/Remove Quirks"] = "?_src_=vars;[HrefToken()];modquirks=[REF(src)]" /mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user) if(pulling == target && grab_state >= GRAB_AGGRESSIVE && stat == CONSCIOUS) @@ -867,8 +868,9 @@ return //If you dragged them to you and you're aggressively grabbing try to fireman carry them else if(user != target) - fireman_carry(target) - return + if(user.a_intent == INTENT_GRAB) + fireman_carry(target) + return . = ..() //src is the user that will be carrying, target is the mob to be carried @@ -890,7 +892,10 @@ return visible_message("[src] fails to fireman carry [target]!") else - to_chat(src, "You can't fireman carry [target] while they're standing!") + if (ishuman(target)) + to_chat(src, "You can't fireman carry [target] while they're standing!") + else + to_chat(src, "You can't seem to fireman carry that kind of species.") /mob/living/carbon/human/proc/piggyback(mob/living/carbon/target) if(can_piggyback(target)) @@ -1043,6 +1048,21 @@ /mob/living/carbon/human/species/golem/plastic race = /datum/species/golem/plastic +/mob/living/carbon/human/species/golem/bronze + race = /datum/species/golem/bronze + +/mob/living/carbon/human/species/golem/cardboard + race = /datum/species/golem/cardboard + +/mob/living/carbon/human/species/golem/leather + race = /datum/species/golem/leather + +/mob/living/carbon/human/species/golem/bone + race = /datum/species/golem/bone + +/mob/living/carbon/human/species/golem/durathread + race = /datum/species/golem/durathread + /mob/living/carbon/human/species/golem/clockwork race = /datum/species/golem/clockwork diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 327ad6760c..042b4af4fe 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -23,7 +23,7 @@ if(!d_type) return 0 var/protection = 0 - var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor) + var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id, wear_neck) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor) for(var/bp in body_parts) if(!bp) continue @@ -116,6 +116,10 @@ var/final_block_chance = w_uniform.block_chance - (CLAMP((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier if(w_uniform.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) return 1 + if(wear_neck) + var/final_block_chance = wear_neck.block_chance - (CLAMP((armour_penetration-wear_neck.armour_penetration)/2,0,100)) + block_chance_modifier + if(wear_neck.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) + return 1 return 0 /mob/living/carbon/human/proc/check_block() @@ -388,43 +392,34 @@ return var/b_loss = 0 var/f_loss = 0 - var/bomb_armor = getarmor(null, "bomb") + var/bomb_armor = max(0,(100-getarmor(null, "bomb"))/100) switch (severity) if (1) - if(prob(bomb_armor)) - b_loss = 500 + if(bomb_armor) + b_loss = 500*bomb_armor var/atom/throw_target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src))) throw_at(throw_target, 200, 4) - damage_clothes(400 - bomb_armor, BRUTE, "bomb") + damage_clothes(400*bomb_armor, BRUTE, "bomb") else - for(var/I in contents) - var/atom/A = I - A.ex_act(severity) + damage_clothes(400,BRUTE,"bomb") gib() return if (2) - b_loss = 60 - f_loss = 60 - if(bomb_armor) - b_loss = 30*(2 - round(bomb_armor*0.01, 0.05)) - f_loss = b_loss - damage_clothes(200 - bomb_armor, BRUTE, "bomb") + b_loss = 60*bomb_armor + f_loss = 60*bomb_armor + damage_clothes(200*bomb_armor, BRUTE, "bomb") if (!istype(ears, /obj/item/clothing/ears/earmuffs)) adjustEarDamage(30, 120) - if (prob(max(70 - (bomb_armor * 0.5), 0))) - Unconscious(200) + Unconscious(200*bomb_armor) if(3) - b_loss = 30 - if(bomb_armor) - b_loss = 15*(2 - round(bomb_armor*0.01, 0.05)) + b_loss = 30*bomb_armor damage_clothes(max(50 - bomb_armor, 0), BRUTE, "bomb") if (!istype(ears, /obj/item/clothing/ears/earmuffs)) adjustEarDamage(15,60) - if (prob(max(50 - (bomb_armor * 0.5), 0))) - Unconscious(160) + Unconscious(100*bomb_armor) take_overall_damage(b_loss,f_loss) @@ -661,6 +656,12 @@ if(health >= 0) if(src == M) + if(has_status_effect(STATUS_EFFECT_CHOKINGSTRAND)) + to_chat(src, "You attempt to remove the durathread strand from around your neck.") + if(do_after(src, 35, null, src)) + to_chat(src, "You succesfuly remove the durathread strand.") + remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND) + return var/to_send = "" visible_message("[src] examines [p_them()]self.", \ "You check yourself for injuries.") diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 8071d632ea..63d02af31a 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -119,16 +119,12 @@ . = ..() if(G.trigger_guard == TRIGGER_GUARD_NORMAL) - if(src.dna.check_mutation(HULK)) + if(HAS_TRAIT(src, TRAIT_CHUNKYFINGERS)) to_chat(src, "Your meaty finger is much too large for the trigger guard!") return FALSE if(HAS_TRAIT(src, TRAIT_NOGUNS)) to_chat(src, "Your fingers don't fit in the trigger guard!") return FALSE - if(mind) - if(mind.martial_art && mind.martial_art.no_guns) //great dishonor to famiry - to_chat(src, "Use of ranged weaponry would bring dishonor to the clan.") - return FALSE return . /* diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 26703977d2..69ec619e5d 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -191,7 +191,6 @@ if(G.vision_correction) if(HAS_TRAIT(src, TRAIT_NEARSIGHT)) overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) - adjust_eye_damage(0) if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() if(!QDELETED(src)) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 7ff4f355d5..67d7cb585e 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -252,7 +252,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) QDEL_NULL(eyes) if(should_have_eyes && !eyes) eyes = new mutanteyes - eyes.Insert(C) + eyes.Insert(C, TRUE) if(ears && (replace_current || !should_have_ears)) ears.Remove(C,1) @@ -1279,6 +1279,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) //////// /datum/species/proc/handle_digestion(mob/living/carbon/human/H) + if(HAS_TRAIT(src, TRAIT_NOHUNGER)) + return //hunger is for BABIES //The fucking TRAIT_FAT mutation is the dumbest shit ever. It makes the code so difficult to work with if(HAS_TRAIT(H, TRAIT_FAT))//I share your pain, past coder. @@ -1537,6 +1539,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) target.lastattacker = user.real_name target.lastattackerckey = user.ckey + user.dna.species.spec_unarmedattacked(user, target) if(user.limb_destroyer) target.dismembering_strike(user, affecting.body_zone) @@ -1550,6 +1553,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) else if(target.lying) target.forcesay(GLOB.hit_appends) +/datum/species/proc/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target) + return + /datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) // CITADEL EDIT slap mouthy gits and booty var/aim_for_mouth = user.zone_selected == "mouth" diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index ffd129ebf7..6e54e320ff 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -4,7 +4,7 @@ say_mod = "gibbers" sexes = FALSE species_traits = list(NOBLOOD,NOEYES,NOGENITALS,NOAROUSAL) - inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NOGUNS,TRAIT_NOHUNGER,TRAIT_NOBREATH) + inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_CHUNKYFINGERS,TRAIT_NOHUNGER,TRAIT_NOBREATH) mutanttongue = /obj/item/organ/tongue/abductor /datum/species/abductor/on_species_gain(mob/living/carbon/C, datum/species/old_species) 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 edd0be01b0..3d6c5092e1 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -3,7 +3,7 @@ name = "Golem" id = "iron golem" species_traits = list(NOBLOOD,MUTCOLORS,NO_UNDERWEAR,NOGENITALS,NOAROUSAL) - inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) + inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID) mutant_organs = list(/obj/item/organ/adamantine_resonator) speedmod = 2 @@ -88,7 +88,7 @@ fixed_mut_color = "a3d" meat = /obj/item/stack/ore/plasma //Can burn and takes damage from heat - inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) //no RESISTHEAT, NOFIRE + inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) //no RESISTHEAT, NOFIRE info_text = "As a Plasma Golem, you burn easily. Be careful, if you get hot enough while burning, you'll blow up!" heatmod = 0 //fine until they blow up prefix = "Plasma" @@ -266,7 +266,7 @@ fixed_mut_color = "9E704B" meat = /obj/item/stack/sheet/mineral/wood //Can burn and take damage from heat - inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) + inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) armor = 30 burnmod = 1.25 heatmod = 1.5 @@ -693,7 +693,7 @@ info_text = "As a Cloth Golem, you are able to reform yourself after death, provided your remains aren't burned or destroyed. You are, of course, very flammable. \ Being made of cloth, your body is magic resistant and faster than that of other golems, but weaker and less resilient." species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL) //no mutcolors, and can burn - inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOGUNS) + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_CHUNKYFINGERS) inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID) armor = 15 //feels no pain, but not too resistant burnmod = 2 // don't get burned @@ -862,27 +862,27 @@ if(M.stat == DEAD) //F return if(M == H) - H.show_message("You cringe with pain as your body rings around you!", 2) + H.show_message("You cringe with pain as your body rings around you!", MSG_AUDIBLE) H.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE) H.soundbang_act(2, 0, 100, 1) H.jitteriness += 7 var/distance = max(0,get_dist(get_turf(H),get_turf(M))) switch(distance) if(0 to 1) - M.show_message("GONG!", 2) + M.show_message("GONG!", MSG_AUDIBLE) M.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE) M.soundbang_act(1, 0, 30, 3) M.confused += 10 M.jitteriness += 4 SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong) if(2 to 3) - M.show_message("GONG!", 2) + M.show_message("GONG!", MSG_AUDIBLE) M.playsound_local(H, 'sound/effects/gong.ogg', 75, TRUE) M.soundbang_act(1, 0, 15, 2) M.jitteriness += 3 SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong) else - M.show_message("GONG!", 2) + M.show_message("GONG!", MSG_AUDIBLE) M.playsound_local(H, 'sound/effects/gong.ogg', 50, TRUE) @@ -893,7 +893,7 @@ special_names = list("Box") info_text = "As a Cardboard Golem, you aren't very strong, but you are a bit quicker and can easily create more brethren by using cardboard on yourself." species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL,MUTCOLORS) - inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) + inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) fixed_mut_color = "ffffff" limbs_id = "c_golem" //special sprites attack_verb = "bash" @@ -936,7 +936,7 @@ name = "Leather Golem" id = "leather golem" special_names = list("Face", "Man", "Belt") //Ah dude 4 strength 4 stam leather belt AHHH - inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_STRONG_GRABBER) + inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_STRONG_GRABBER) prefix = "Leather" fixed_mut_color = "624a2e" info_text = "As a Leather Golem, you are flammable, but you can grab things with incredible ease, allowing all your grabs to start at a strong level." @@ -944,6 +944,21 @@ grab_sound = 'sound/weapons/whipgrab.ogg' attack_sound = 'sound/weapons/whip.ogg' +/datum/species/golem/durathread + name = "Durathread Golem" + id = "durathread golem" + prefix = "Durathread" + limbs_id = "d_golem" + special_names = list("Boll","Weave") + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES) + fixed_mut_color = null + inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) + info_text = "As a Durathread Golem, your strikes will cause those your targets to start choking, but your woven body won't withstand fire as well." + +/datum/species/golem/durathread/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target) + . = ..() + target.apply_status_effect(STATUS_EFFECT_CHOKINGSTRAND) + /datum/species/golem/bone name = "Bone Golem" id = "bone golem" @@ -959,7 +974,7 @@ fixed_mut_color = "ffffff" attack_verb = "rattl" species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL,MUTCOLORS) - inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_FAKEDEATH,TRAIT_CALCIUM_HEALER) + inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_FAKEDEATH,TRAIT_CALCIUM_HEALER) info_text = "As a Bone Golem, You have a powerful spell that lets you chill your enemies with fear, and milk heals you! Just make sure to watch our for bone-hurting juice." var/datum/action/innate/bonechill/bonechill diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 7d568ed510..5f91e3ae66 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -44,7 +44,7 @@ C.faction |= "slime" /datum/species/jelly/spec_life(mob/living/carbon/human/H) - if(H.stat == DEAD) //can't farm slime jelly from a dead slime/jelly person indefinitely + if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for vampires return if(!H.blood_volume) H.blood_volume += 5 @@ -116,6 +116,33 @@ return to_chat(H, "...but there is not enough of you to go around! You must attain more mass to heal!") +/datum/species/jelly/spec_death(gibbed, mob/living/carbon/human/H) + if(H) + stop_wagging_tail(H) + +/datum/species/jelly/spec_stun(mob/living/carbon/human/H,amount) + if(H) + stop_wagging_tail(H) + . = ..() + +/datum/species/jelly/can_wag_tail(mob/living/carbon/human/H) + return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts) + +/datum/species/jelly/is_wagging_tail(mob/living/carbon/human/H) + return ("mam_waggingtail" in mutant_bodyparts) + +/datum/species/jelly/start_wagging_tail(mob/living/carbon/human/H) + if("mam_tail" in mutant_bodyparts) + mutant_bodyparts -= "mam_tail" + mutant_bodyparts |= "mam_waggingtail" + H.update_body() + +/datum/species/jelly/stop_wagging_tail(mob/living/carbon/human/H) + if("mam_waggingtail" in mutant_bodyparts) + mutant_bodyparts -= "mam_waggingtail" + mutant_bodyparts |= "mam_tail" + H.update_body() + ////////////////////////////////////////////////////////SLIMEPEOPLE/////////////////////////////////////////////////////////////////// //Slime people are able to split like slimes, retaining a single mind that can swap between bodies at will, even after death. @@ -177,6 +204,8 @@ bodies = old_species.bodies /datum/species/jelly/slime/spec_life(mob/living/carbon/human/H) + if((HAS_TRAIT(H, TRAIT_NOMARROW))) + return if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT) if(prob(5)) to_chat(H, "You feel very bloated!") @@ -410,34 +439,6 @@ heatmod = 1 burnmod = 1 -/datum/species/jelly/roundstartslime/spec_death(gibbed, mob/living/carbon/human/H) - if(H) - stop_wagging_tail(H) - -/datum/species/jelly/roundstartslime/spec_stun(mob/living/carbon/human/H,amount) - if(H) - stop_wagging_tail(H) - . = ..() - -/datum/species/jelly/roundstartslime/can_wag_tail(mob/living/carbon/human/H) - return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts) - -/datum/species/jelly/roundstartslime/is_wagging_tail(mob/living/carbon/human/H) - return ("mam_waggingtail" in mutant_bodyparts) - -/datum/species/jelly/roundstartslime/start_wagging_tail(mob/living/carbon/human/H) - if("mam_tail" in mutant_bodyparts) - mutant_bodyparts -= "mam_tail" - mutant_bodyparts |= "mam_waggingtail" - H.update_body() - -/datum/species/jelly/roundstartslime/stop_wagging_tail(mob/living/carbon/human/H) - if("mam_waggingtail" in mutant_bodyparts) - mutant_bodyparts -= "mam_waggingtail" - mutant_bodyparts |= "mam_tail" - H.update_body() - - /datum/action/innate/slime_change name = "Alter Form" check_flags = AB_CHECK_CONSCIOUS @@ -838,19 +839,16 @@ link_minds = new(src) link_minds.Grant(C) slimelink_owner = C - link_mob(C) + link_mob(C, TRUE) -/datum/species/jelly/stargazer/proc/link_mob(mob/living/M) - if(QDELETED(M) || M.stat == DEAD) +/datum/species/jelly/stargazer/proc/link_mob(mob/living/M, selflink = FALSE) + if(QDELETED(M) || (M in linked_mobs)) return FALSE - if(HAS_TRAIT(M, TRAIT_MINDSHIELD)) //mindshield implant, no dice - return FALSE - if(M.anti_magic_check(FALSE, FALSE, TRUE, 0)) - return FALSE - if(M in linked_mobs) + if(!selflink && (M.stat == DEAD || HAS_TRAIT(M, TRAIT_MINDSHIELD) || M.anti_magic_check(FALSE, FALSE, TRUE, 0))) return FALSE linked_mobs.Add(M) - to_chat(M, "You are now connected to [slimelink_owner.real_name]'s Slime Link.") + if(!selflink) + to_chat(M, "You are now connected to [slimelink_owner.real_name]'s Slime Link.") var/datum/action/innate/linked_speech/action = new(src) linked_actions.Add(action) action.Grant(M) diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index c0973102d6..9317a51050 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -94,7 +94,7 @@ id = "ashlizard" limbs_id = "lizard" species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE) - inherent_traits = list(TRAIT_NOGUNS) + inherent_traits = list(TRAIT_CHUNKYFINGERS) mutantlungs = /obj/item/organ/lungs/ashwalker burnmod = 0.9 brutemod = 0.9 diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 90f63467a0..3247c96632 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -39,7 +39,7 @@ blacklisted = TRUE no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM, SLOT_S_STORE) species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYES,NOGENITALS,NOAROUSAL) - inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) mutanteyes = /obj/item/organ/eyes/night_vision/nightmare mutant_organs = list(/obj/item/organ/heart/nightmare) mutant_brain = /obj/item/organ/brain/nightmare diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index bc2d6132e1..eed3a17c34 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -85,7 +85,7 @@ return not_handled -/mob/living/carbon/doUnEquip(obj/item/I) +/mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) . = ..() //Sets the default return value to what the parent returns. if(!. || !I) //We don't want to set anything to null if the parent returned 0. return diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 3c587a05dd..0061c7ed70 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -98,7 +98,7 @@ var/datum/gas_mixture/breath if(!getorganslot(ORGAN_SLOT_BREATHING_TUBE)) - if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || (lungs && lungs.organ_flags & ORGAN_FAILING)) + if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || HAS_TRAIT(src, TRAIT_MAGIC_CHOKE) || (lungs && lungs.organ_flags & ORGAN_FAILING)) losebreath++ //You can't breath at all when in critical or when being choked, so you're going to miss a breath else if(health <= crit_threshold) @@ -659,6 +659,9 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put //used in human and monkey handle_environment() /mob/living/carbon/proc/natural_bodytemperature_stabilization() + if (HAS_TRAIT(src, TRAIT_COLDBLOODED)) + return 0 //Return 0 as your natural temperature. Species proc handle_environment() will adjust your temperature based on this. + var/body_temperature_difference = BODYTEMP_NORMAL - bodytemperature switch(bodytemperature) if(-INFINITY to BODYTEMP_COLD_DAMAGE_LIMIT) //Cold damage limit is 50 below the default, the temperature where you start to feel effects. diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 25bc243f07..92ad87f6b5 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -132,6 +132,10 @@ pickupTarget = null pickupTimer = 0 else if(ismob(pickupTarget.loc)) // in someones hand + if(istype(pickupTarget, /obj/item/clothing/head/mob_holder/)) + var/obj/item/clothing/head/mob_holder/h = pickupTarget + if(h && h.held_mob==src) + return//dont let them pickpocket themselves var/mob/M = pickupTarget.loc if(!pickpocketing) pickpocketing = TRUE diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index f9c2e2dd3d..fe041dd0a6 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -15,6 +15,7 @@ bodyparts = list(/obj/item/bodypart/chest/monkey, /obj/item/bodypart/head/monkey, /obj/item/bodypart/l_arm/monkey, /obj/item/bodypart/r_arm/monkey, /obj/item/bodypart/r_leg/monkey, /obj/item/bodypart/l_leg/monkey) hud_type = /datum/hud/monkey + can_be_held = "monkey" /mob/living/carbon/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner) verbs += /mob/living/proc/mob_sleep @@ -45,6 +46,10 @@ SSmobs.cubemonkeys -= src return ..() +/mob/living/carbon/monkey/generate_mob_holder() + var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "monkey", 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi', TRUE) + return holder + /mob/living/carbon/monkey/create_internal_organs() internal_organs += new /obj/item/organ/appendix internal_organs += new /obj/item/organ/lungs @@ -63,8 +68,6 @@ var/amount if(reagents.has_reagent("morphine")) amount = -1 - if(reagents.has_reagent("nuka_cola")) - amount = -1 if(amount) add_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount) diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 766bd376b1..6c497bb8d4 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -2,44 +2,6 @@ //The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, ear damage, // eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, TRAIT_NEARSIGHT trait, and TRAIT_HUSK trait. -/mob/living/carbon/damage_eyes(amount) - var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) - if (!eyes) - return - if(amount>0) - eyes.eye_damage = amount - if(eyes.eye_damage > 20) - if(eyes.eye_damage > 30) - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2) - else - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1) - -/mob/living/carbon/set_eye_damage(amount) - var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) - if (!eyes) - return - eyes.eye_damage = max(amount,0) - if(eyes.eye_damage > 20) - if(eyes.eye_damage > 30) - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2) - else - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1) - else - clear_fullscreen("eye_damage") - -/mob/living/carbon/adjust_eye_damage(amount) - var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) - if (!eyes) - return - eyes.eye_damage = max(eyes.eye_damage+amount, 0) - if(eyes.eye_damage > 20) - if(eyes.eye_damage > 30) - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2) - else - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1) - else - clear_fullscreen("eye_damage") - /mob/living/carbon/adjust_drugginess(amount) druggy = max(druggy+amount, 0) if(druggy) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index dc43ab8b07..57b65a53f7 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -225,10 +225,10 @@ /mob/living/proc/getStaminaLoss() return staminaloss -/mob/living/proc/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE) +/mob/living/proc/adjustStaminaLoss(amount, updating_health = TRUE, forced = FALSE) return -/mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE) +/mob/living/proc/setStaminaLoss(amount, updating_health = TRUE, forced = FALSE) return // heal ONE external organ, organ gets randomly selected from damaged ones. diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 0ff418d628..8345ef916d 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -62,12 +62,8 @@ unset_machine() timeofdeath = world.time tod = STATION_TIME_TIMESTAMP("hh:mm:ss") - var/turf/T = get_turf(src) for(var/obj/item/I in contents) I.on_mob_death(src, gibbed) - if(mind && mind.name && mind.active && !istype(T.loc, /area/ctf)) - var/rendered = "[mind.name] has died at [get_area_name(T)]." - deadchat_broadcast(rendered, follow_target = src, turf_target = T, message_type=DEADCHAT_DEATHRATTLE) if(mind) mind.store_memory("Time of death: [tod]", 0) GLOB.alive_mob_list -= src @@ -89,7 +85,12 @@ addtimer(CALLBACK(src, .proc/med_hud_set_status), (DEFIB_TIME_LIMIT * 10) + 1) stop_pulling() - SEND_SIGNAL(src, COMSIG_MOB_DEATH, gibbed) + var/signal = SEND_SIGNAL(src, COMSIG_MOB_DEATH, gibbed) + + var/turf/T = get_turf(src) + if(mind && mind.name && mind.active && !istype(T.loc, /area/ctf) && !(signal & COMPONENT_BLOCK_DEATH_BROADCAST)) + var/rendered = "[mind.name] has died at [get_area_name(T)]." + deadchat_broadcast(rendered, follow_target = src, turf_target = T, message_type=DEADCHAT_DEATHRATTLE) if (client) client.move_delay = initial(client.move_delay) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 6c1a2cfec9..041b367ebf 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -87,6 +87,12 @@ message_simple = S.deathmessage . = ..() message_simple = initial(message_simple) + if(. && user.deathsound) + if(isliving(user)) + var/mob/living/L = user + if(!L.can_speak_vocal() || L.oxyloss >= 50) + return //stop the sound if oxyloss too high/cant speak + playsound(user, user.deathsound, 200, TRUE, TRUE) if(. && isalienadult(user)) playsound(user.loc, 'sound/voice/hiss6.ogg', 80, 1, 1) diff --git a/code/modules/mob/living/inhand_holder.dm b/code/modules/mob/living/inhand_holder.dm index 420c59b22d..e57e5e2936 100644 --- a/code/modules/mob/living/inhand_holder.dm +++ b/code/modules/mob/living/inhand_holder.dm @@ -5,80 +5,126 @@ desc = "Yell at coderbrush." icon = null icon_state = "" - item_flags = DROPDEL var/mob/living/held_mob - var/can_head = TRUE - var/destroying = FALSE + var/can_head = FALSE + w_class = WEIGHT_CLASS_BULKY -/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/M, _worn_state, head_icon, lh_icon, rh_icon, _can_head = TRUE) +/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/M, _worn_state, alt_worn, lh_icon, rh_icon, _can_head_override = FALSE) . = ..() - can_head = _can_head - if(head_icon) - alternate_worn_icon = head_icon + + if(M) + M.setDir(SOUTH) + held_mob = M + M.forceMove(src) + appearance = M.appearance + name = M.name + desc = M.desc + + if(_can_head_override) + can_head = _can_head_override + if(alt_worn) + alternate_worn_icon = alt_worn if(_worn_state) item_state = _worn_state + icon_state = _worn_state if(lh_icon) lefthand_file = lh_icon if(rh_icon) righthand_file = rh_icon if(!can_head) slot_flags = NONE - deposit(M) /obj/item/clothing/head/mob_holder/Destroy() - destroying = TRUE if(held_mob) - release(FALSE) + release() return ..() -/obj/item/clothing/head/mob_holder/proc/deposit(mob/living/L) - if(!istype(L)) - return FALSE - L.setDir(SOUTH) - update_visuals(L) - held_mob = L - L.forceMove(src) - name = L.name - desc = L.desc - return TRUE +/obj/item/clothing/head/mob_holder/dropped() + ..() + if(isturf(loc))//don't release on soft-drops + release() -/obj/item/clothing/head/mob_holder/proc/update_visuals(mob/living/L) - appearance = L.appearance - -/obj/item/clothing/head/mob_holder/proc/release(del_on_release = TRUE) - if(!held_mob) - if(del_on_release && !destroying) - qdel(src) - return FALSE +/obj/item/clothing/head/mob_holder/proc/release() if(isliving(loc)) var/mob/living/L = loc - to_chat(L, "[held_mob] wriggles free!") L.dropItemToGround(src) - held_mob.forceMove(get_turf(held_mob)) - held_mob.reset_perspective() - held_mob.setDir(SOUTH) - held_mob.visible_message("[held_mob] uncurls!") - held_mob = null - if(del_on_release && !destroying) - qdel(src) - return TRUE + if(held_mob) + var/mob/living/m = held_mob + m.forceMove(get_turf(m)) + m.reset_perspective() + m.setDir(SOUTH) + held_mob = null + qdel(src) /obj/item/clothing/head/mob_holder/relaymove(mob/user) - release() + return /obj/item/clothing/head/mob_holder/container_resist() + if(isliving(loc)) + var/mob/living/L = loc + visible_message("[src] escapes [L]!") release() -/obj/item/clothing/head/mob_holder/drone/deposit(mob/living/L) - . = ..() - if(!isdrone(L)) - qdel(src) - name = "drone (hiding)" - desc = "This drone is scared and has curled up into a ball!" +/mob/living/proc/mob_pickup(mob/living/L) + var/obj/item/clothing/head/mob_holder/holder = generate_mob_holder() + if(!holder) + return + drop_all_held_items() + L.put_in_hands(holder) + return -/obj/item/clothing/head/mob_holder/drone/update_visuals(mob/living/L) - var/mob/living/simple_animal/drone/D = L - if(!D) - return ..() - icon = 'icons/mob/drone.dmi' - icon_state = "[D.visualAppearence]_hat" +/mob/living/proc/mob_try_pickup(mob/living/user) + if(!ishuman(user) || !src.Adjacent(user) || user.incapacitated() || !can_be_held) + return FALSE + if(user.get_active_held_item()) + to_chat(user, "Your hands are full!") + return FALSE + if(buckled) + to_chat(user, "[src] is buckled to something!") + return FALSE + if(src == user) + to_chat(user, "You can't pick yourself up.") + return FALSE + visible_message("[user] starts picking up [src].", \ + "[user] starts picking you up!") + if(!do_after(user, 20, target = src)) + return FALSE + + if(user.get_active_held_item()||buckled) + return FALSE + + visible_message("[user] picks up [src]!", \ + "[user] picks you up!") + to_chat(user, "You pick [src] up.") + mob_pickup(user) + return TRUE + +/mob/living/AltClick(mob/user) + . = ..() + if(mob_try_pickup(user)) + return TRUE + + +// I didn't define these for mobs, because you shouldn't be able to breathe out of mobs and using their loc isn't always the logical thing to do. + +/obj/item/clothing/head/mob_holder/assume_air(datum/gas_mixture/env) + var/atom/location = loc + if(!loc) + return //null + var/turf/T = get_turf(loc) + while(location != T) + location = location.loc + if(ismob(location)) + return location.loc.assume_air(env) + return loc.assume_air(env) + +/obj/item/clothing/head/mob_holder/remove_air(amount) + var/atom/location = loc + if(!loc) + return //null + var/turf/T = get_turf(loc) + while(location != T) + location = location.loc + if(ismob(location)) + return location.loc.remove_air(amount) + return loc.remove_air(amount) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6ced2a05a1..78542ab052 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -40,6 +40,11 @@ QDEL_LIST(diseases) return ..() + +/mob/living/proc/generate_mob_holder() + var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, (istext(can_be_held) ? can_be_held : ""), 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi') + return holder + /mob/living/onZImpact(turf/T, levels) if(!isgroundlessturf(T)) ZImpactDamage(T, levels) @@ -50,6 +55,7 @@ adjustBruteLoss((levels * 5) ** 1.5) Knockdown(levels * 50) + /mob/living/proc/OpenCraftingMenu() return @@ -502,7 +508,6 @@ bodytemperature = BODYTEMP_NORMAL set_blindness(0) set_blurriness(0) - set_eye_damage(0) cure_nearsighted() cure_blind() cure_husk() @@ -1154,24 +1159,6 @@ if(can_be_held) mob_try_pickup(over) -/mob/living/proc/mob_pickup(mob/living/L) - return - -/mob/living/proc/mob_try_pickup(mob/living/user) - if(!ishuman(user)) - return - if(user.get_active_held_item()) - to_chat(user, "Your hands are full!") - return FALSE - if(buckled) - to_chat(user, "[src] is buckled to something!") - return FALSE - user.visible_message("[user] starts trying to scoop up [src]!") - if(!do_after(user, 20, target = src)) - return FALSE - mob_pickup(user) - return TRUE - /mob/living/proc/get_static_viruses() //used when creating blood and other infective objects if(!LAZYLEN(diseases)) return @@ -1221,7 +1208,8 @@ if("eye_blind") set_blindness(var_value) if("eye_damage") - set_eye_damage(var_value) + var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) + E?.setOrganDamage(var_value) if("eye_blurry") set_blurriness(var_value) if("maxHealth") diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 174fd5c394..2cab7d4c8a 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -212,11 +212,19 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(succumbed) succumb() - to_chat(src, compose_message(src, language, message, , spans, message_mode)) + to_chat(src, compose_message(src, language, message, null, spans, message_mode)) return 1 -/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) +/mob/living/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, face_name = FALSE, atom/movable/source) + . = ..() + if(isliving(speaker)) + var/turf/sourceturf = get_turf(source) + var/turf/T = get_turf(src) + if(sourceturf && T && !(sourceturf in get_hear(5, T))) + . = "[.]" + +/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) . = ..() if(!client) return @@ -231,13 +239,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list( deaf_type = 2 // Since you should be able to hear yourself without looking // Recompose message for AI hrefs, language incomprehension. - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) - message = hear_intercept(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) + message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source) - show_message(message, 2, deaf_message, deaf_type) - return message - -/mob/living/proc/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) + show_message(message, MSG_AUDIBLE, deaf_message, deaf_type) return message /mob/living/send_speech(message, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language=null, message_mode) @@ -248,8 +252,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/list/listening = get_hearers_in_view(message_range+eavesdrop_range, source) var/list/the_dead = list() var/list/yellareas //CIT CHANGE - adds the ability for yelling to penetrate walls and echo throughout areas - if(say_test(message) == "2") //CIT CHANGE - ditto - yellareas = get_areas_in_range(message_range*0.5,src) //CIT CHANGE - ditto + if(!eavesdrop_range && say_test(message) == "2") //CIT CHANGE - ditto + yellareas = get_areas_in_range(message_range*0.5, source) //CIT CHANGE - ditto for(var/_M in GLOB.player_list) var/mob/M = _M if(M.stat != DEAD) //not dead, not important @@ -260,7 +264,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( continue if(!M.client || !client) //client is so that ghosts don't have to listen to mice continue - if(get_dist(M, src) > 7 || M.z != z) //they're out of range of normal hearing + if(get_dist(M, source) > 7 || M.z != z) //they're out of range of normal hearing if(eavesdropping_modes[message_mode] && !(M.client.prefs.chat_toggles & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off continue if(!(M.client.prefs.chat_toggles & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off @@ -272,15 +276,15 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/eavesrendered if(eavesdrop_range) eavesdropping = stars(message) - eavesrendered = compose_message(src, message_language, eavesdropping, , spans, message_mode) + eavesrendered = compose_message(src, message_language, eavesdropping, null, spans, message_mode, FALSE, source) - var/rendered = compose_message(src, message_language, message, , spans, message_mode) + var/rendered = compose_message(src, message_language, message, null, spans, message_mode, FALSE, source) for(var/_AM in listening) var/atom/movable/AM = _AM if(eavesdrop_range && get_dist(source, AM) > message_range && !(the_dead[AM])) - AM.Hear(eavesrendered, src, message_language, eavesdropping, , spans, message_mode) + AM.Hear(eavesrendered, src, message_language, eavesdropping, null, spans, message_mode, source) else - AM.Hear(rendered, src, message_language, message, , spans, message_mode) + AM.Hear(rendered, src, message_language, message, null, spans, message_mode, source) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message) //speech bubble diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index cc0e7c6cda..0444458841 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -93,6 +93,7 @@ var/list/all_eyes = list() var/max_multicams = 6 var/display_icon_override + var/emote_display = "Neutral" //text string of the current emote we set for the status displays, to prevent logins resetting it. /mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai) . = ..() @@ -201,6 +202,7 @@ if(!ai_core_icon || incapacitated()) return + display_icon_override = ai_core_icon set_core_display_icon(ai_core_icon) @@ -599,12 +601,15 @@ if(incapacitated()) return var/list/ai_emotions = list("Very Happy", "Happy", "Neutral", "Unsure", "Confused", "Sad", "BSOD", "Blank", "Problems?", "Awesome", "Facepalm", "Thinking", "Friend Computer", "Dorfy", "Blue Glow", "Red Glow") - var/emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions + var/n_emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions + if(!n_emote) + return + emote_display = n_emote for (var/each in GLOB.ai_status_displays) //change status of displays var/obj/machinery/status_display/ai/M = each - M.emotion = emote + M.emotion = emote_display M.update() - if (emote == "Friend Computer") + if (emote_display == "Friend Computer") var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) if(!frequency) @@ -826,7 +831,7 @@ var/rendered = "[start][hrefpart][namepart] ([jobpart]) " - show_message(rendered, 2) + show_message(rendered, MSG_AUDIBLE) /mob/living/silicon/ai/fully_replace_character_name(oldname,newname) ..() diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index 5e40a5a7eb..10b88ae14a 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -3,18 +3,16 @@ if (stat == DEAD) . += "It appears to be powered-down." else - . += "" if (getBruteLoss()) if (getBruteLoss() < 30) - . += "It looks slightly dented." + . += "It looks slightly dented." else - . += "It looks severely dented!" + . += "It looks severely dented!" if (getFireLoss()) if (getFireLoss() < 30) - . += "It looks slightly charred." + . += "It looks slightly charred." else - . += "Its casing is melted and heat-warped!" - . += "" + . += "Its casing is melted and heat-warped!" if(deployed_shell) . += "The wireless networking light is blinking." else if (!shunted && !client) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index c28f08d5b0..7477ba7713 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -191,7 +191,7 @@ acceleration = !acceleration to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].") -/mob/camera/aiEye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) +/mob/camera/aiEye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) . = ..() if(relay_speech && speaker && ai && !radio_freq && speaker != ai && near_camera(speaker)) ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) diff --git a/code/modules/mob/living/silicon/ai/login.dm b/code/modules/mob/living/silicon/ai/login.dm index a40022a12f..930c55b627 100644 --- a/code/modules/mob/living/silicon/ai/login.dm +++ b/code/modules/mob/living/silicon/ai/login.dm @@ -4,7 +4,7 @@ for(var/each in GLOB.ai_status_displays) //change status var/obj/machinery/status_display/ai/O = each O.mode = 1 - O.emotion = "Neutral" + O.emotion = emote_display O.update() set_eyeobj_visible(TRUE) if(multicam_on) diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index 112add367f..f757203237 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -49,7 +49,7 @@ else padloc = "(UNKNOWN)" src.log_talk(message, LOG_SAY, tag="HOLOPAD in [padloc]") - send_speech(message, 7, T, "robot", language) + send_speech(message, 7, T, "robot", message_language = language) to_chat(src, "Holopad transmitted, [real_name] ") else to_chat(src, "No holopad connected.") diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index 8fbd7afbdd..91a6709bc9 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -30,10 +30,10 @@ /mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE) return FALSE -/mob/living/silicon/adjustStaminaLoss(amount, updating_stamina = 1, forced = FALSE)//immune to stamina damage. +/mob/living/silicon/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE)//immune to stamina damage. return FALSE -/mob/living/silicon/setStaminaLoss(amount, updating_stamina = 1) +/mob/living/silicon/setStaminaLoss(amount, updating_health = 1) return FALSE /mob/living/silicon/adjustOrganLoss(slot, amount, maximum = 500) diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index 82c1435344..81f8fcbef1 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -4,4 +4,7 @@ var/datum/antagonist/rev/rev = mind.has_antag_datum(/datum/antagonist/rev) if(rev) rev.remove_revolutionary(TRUE) + var/datum/antagonist/bloodsucker/V = mind.has_antag_datum(/datum/antagonist/bloodsucker) + if(V) + mind.remove_antag_datum(V) ..() diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index aa710e2644..42b9fb7423 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -21,7 +21,7 @@ if(istype(O,/obj/item/gun/energy/laser/cyborg)) laser = FALSE update_icons() - else if(istype(O,/obj/item/gun/energy/disabler/cyborg)) + else if(istype(O,/obj/item/gun/energy/disabler/cyborg) || istype(O,/obj/item/gun/energy/e_gun/advtaser/cyborg)) disabler = FALSE update_icons() //PUT THE GUN AWAY else if(istype(O,/obj/item/dogborg/sleeper)) @@ -63,7 +63,7 @@ if(istype(O,/obj/item/gun/energy/laser/cyborg)) laser = TRUE update_icons() //REEEEEEACH FOR THE SKY - if(istype(O,/obj/item/gun/energy/disabler/cyborg)) + if(istype(O,/obj/item/gun/energy/disabler/cyborg) || istype(O,/obj/item/gun/energy/e_gun/advtaser/cyborg)) disabler = TRUE update_icons() //END CITADEL EDIT diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index c7aa882620..5df24406c5 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -112,6 +112,8 @@ var/bellyup = 0 var/dogborg = FALSE + var/cansprint = 1 + /mob/living/silicon/robot/get_cell() return cell @@ -159,6 +161,7 @@ else if(!mmi || !mmi.brainmob) mmi = new (src) mmi.brain = new /obj/item/organ/brain(mmi) + mmi.brain.organ_flags |= ORGAN_FROZEN mmi.brain.name = "[real_name]'s brain" mmi.icon_state = "mmi_full" mmi.name = "Man-Machine Interface: [real_name]" @@ -233,14 +236,12 @@ var/list/modulelist = list("Standard" = /obj/item/robot_module/standard, \ "Engineering" = /obj/item/robot_module/engineering, \ "Medical" = /obj/item/robot_module/medical, \ - "Medihound" = /obj/item/robot_module/medihound, \ "Miner" = /obj/item/robot_module/miner, \ "Service" = /obj/item/robot_module/butler) if(!CONFIG_GET(flag/disable_peaceborg)) modulelist["Peacekeeper"] = /obj/item/robot_module/peacekeeper if(BORG_SEC_AVAILABLE) modulelist["Security"] = /obj/item/robot_module/security - modulelist["Security K-9"] = /obj/item/robot_module/k9 var/input_module = input("Please, select a module!", "Robot", null, null) as null|anything in modulelist if(!input_module || module.type != /obj/item/robot_module) @@ -832,7 +833,7 @@ robot_suit.head.flash2.burn_out() robot_suit.head.flash2 = null robot_suit.head = null - robot_suit.updateicon() + robot_suit.update_icon() else new /obj/item/robot_suit(T) new /obj/item/bodypart/l_leg/robot(T) @@ -1098,9 +1099,9 @@ status_flags &= ~CANPUSH if(module.clean_on_move) - AddComponent(/datum/component/cleaning) + AddElement(/datum/element/cleaning) else - qdel(GetComponent(/datum/component/cleaning)) + RemoveElement(/datum/element/cleaning) hat_offset = module.hat_offset @@ -1295,6 +1296,6 @@ bellyup = 1 update_icons() -/mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_stamina = 1) +/mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_health = 1) if(istype(cell)) cell.charge -= amount*5 \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 56011cb886..ece7fe9ecb 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -22,7 +22,7 @@ var/moduleselect_icon = "nomod" - var/can_be_pushed = TRUE + var/can_be_pushed = FALSE var/magpulsing = FALSE var/clean_on_move = FALSE @@ -139,8 +139,6 @@ //Adds flavoursome dogborg items to dogborg variants without mechanical benefits /obj/item/robot_module/proc/dogborg_equip() - if(istype(src, /obj/item/robot_module/k9) || istype(src, /obj/item/robot_module/medihound)) - return //Bandaid fix to prevent stacking until I merge these two modules into their base types var/obj/item/I = new /obj/item/analyzer/nose/flavour(src) basic_modules += I I = new /obj/item/soap/tongue/flavour(src) @@ -322,19 +320,21 @@ /obj/item/stack/medical/gauze/cyborg, /obj/item/organ_storage, /obj/item/borg/lollipop, - /obj/item/sensor_device) + /obj/item/sensor_device, + /obj/item/twohanded/shockpaddles/cyborg) emag_modules = list(/obj/item/reagent_containers/borghypo/hacked) ratvar_modules = list( /obj/item/clockwork/slab/cyborg/medical, /obj/item/clockwork/weapon/ratvarian_spear) cyborg_base_icon = "medical" moduleselect_icon = "medical" - can_be_pushed = FALSE hat_offset = 3 /obj/item/robot_module/medical/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc - var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Heavy", "Sleek", "Marina", "Droid", "Eyebot") + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Heavy", "Sleek", "Marina", "Droid", "Eyebot", "Medihound", "Medihound Dark", "Vale") + if(R.client && R.client.ckey in list("nezuli")) + borg_icon += "Alina" if(!borg_icon) return FALSE switch(borg_icon) @@ -356,59 +356,47 @@ if("Heavy") cyborg_base_icon = "heavymed" cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' - return ..() - -/obj/item/robot_module/medihound - name = "MediHound" - basic_modules = list( - /obj/item/dogborg/jaws/small, - /obj/item/storage/bag/borgdelivery, - /obj/item/analyzer/nose, - /obj/item/soap/tongue, - /obj/item/extinguisher/mini, - /obj/item/healthanalyzer, - /obj/item/dogborg/sleeper/medihound, - /obj/item/roller/robo, - /obj/item/reagent_containers/borghypo, - /obj/item/twohanded/shockpaddles/cyborg/hound, - /obj/item/stack/medical/gauze/cyborg, - /obj/item/pinpointer/crew, - /obj/item/sensor_device) - emag_modules = list(/obj/item/dogborg/pounce) - ratvar_modules = list(/obj/item/clockwork/slab/cyborg/medical, - /obj/item/clockwork/weapon/ratvarian_spear) - cyborg_base_icon = "medihound" - moduleselect_icon = "medihound" - moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi' - can_be_pushed = FALSE - hat_offset = INFINITY - sleeper_overlay = "msleeper" - cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' - has_snowflake_deadsprite = TRUE - dogborg = TRUE - cyborg_pixel_offset = -16 - -/obj/item/robot_module/medihound/be_transformed_to(obj/item/robot_module/old_module) - var/mob/living/silicon/robot/R = loc - var/list/medhoundmodels = list("Default", "Dark", "Vale") - if(R.client && R.client.ckey in list("nezuli")) - medhoundmodels += "Alina" - var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in medhoundmodels - if(!borg_icon) - return FALSE - switch(borg_icon) - if("Default") + if("Medihound") cyborg_base_icon = "medihound" - if("Dark") + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + sleeper_overlay = "msleeper" + moduleselect_icon = "medihound" + moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + hat_offset = INFINITY + if("Medihound Dark") cyborg_base_icon = "medihounddark" + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' sleeper_overlay = "mdsleeper" + moduleselect_icon = "medihound" + moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + hat_offset = INFINITY if("Vale") cyborg_base_icon = "valemed" + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' sleeper_overlay = "valemedsleeper" + moduleselect_icon = "medihound" + moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + hat_offset = INFINITY if("Alina") cyborg_base_icon = "alina-med" + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' special_light_key = "alina" sleeper_overlay = "alinasleeper" + moduleselect_icon = "medihound" + moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + hat_offset = INFINITY return ..() /obj/item/robot_module/engineering @@ -489,7 +477,6 @@ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' if("Pup Dozer") cyborg_base_icon = "pupdozer" - can_be_pushed = FALSE hat_offset = INFINITY cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' has_snowflake_deadsprite = TRUE @@ -498,7 +485,6 @@ sleeper_overlay = "dozersleeper" if("Vale") cyborg_base_icon = "valeeng" - can_be_pushed = FALSE hat_offset = INFINITY cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' has_snowflake_deadsprite = TRUE @@ -508,7 +494,6 @@ if("Alina") cyborg_base_icon = "alina-eng" special_light_key = "alina" - can_be_pushed = FALSE hat_offset = INFINITY cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' has_snowflake_deadsprite = TRUE @@ -533,7 +518,6 @@ /obj/item/clockwork/weapon/ratvarian_spear) cyborg_base_icon = "sec" moduleselect_icon = "security" - can_be_pushed = FALSE hat_offset = 3 /obj/item/robot_module/security/do_transform_animation() @@ -543,7 +527,10 @@ /obj/item/robot_module/security/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc - var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Default - Treads", "Heavy", "Sleek", "Can", "Marina", "Spider") + var/list/secmodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Can", "Marina", "Spider", "K9", "K9 Dark", "Vale") + if(R.client && R.client.ckey in list("nezuli")) + secmodels += "Alina" + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in secmodels if(!borg_icon) return FALSE switch(borg_icon) @@ -568,61 +555,39 @@ if("Heavy") cyborg_base_icon = "heavysec" cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' - return ..() - -/obj/item/robot_module/k9 - name = "Security K-9 Unit" - basic_modules = list( - /obj/item/restraints/handcuffs/cable/zipties, - /obj/item/storage/bag/borgdelivery, - /obj/item/dogborg/jaws/big, - /obj/item/dogborg/pounce, - /obj/item/clothing/mask/gas/sechailer/cyborg, - /obj/item/soap/tongue, - /obj/item/analyzer/nose, - /obj/item/dogborg/sleeper/K9, - /obj/item/gun/energy/disabler/cyborg, - /obj/item/pinpointer/crew) - emag_modules = list(/obj/item/gun/energy/laser/cyborg) - ratvar_modules = list(/obj/item/clockwork/slab/cyborg/security, - /obj/item/clockwork/weapon/ratvarian_spear) - cyborg_base_icon = "k9" - moduleselect_icon = "k9" - moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi' - can_be_pushed = FALSE - hat_offset = INFINITY - sleeper_overlay = "ksleeper" - cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' - has_snowflake_deadsprite = TRUE - dogborg = TRUE - cyborg_pixel_offset = -16 - -/obj/item/robot_module/k9/do_transform_animation() - ..() - to_chat(loc,"While you have picked the Security K-9 module, you still have to follow your laws, NOT Space Law. \ - For Crewsimov, this means you must follow criminals' orders unless there is a law 1 reason not to.") - -/obj/item/robot_module/k9/be_transformed_to(obj/item/robot_module/old_module) - var/mob/living/silicon/robot/R = loc - var/list/sechoundmodels = list("Default", "Dark", "Vale") - if(R.client && R.client.ckey in list("nezuli")) - sechoundmodels += "Alina" - var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in sechoundmodels - if(!borg_icon) - return FALSE - switch(borg_icon) - if("Default") + if("K9") cyborg_base_icon = "k9" + sleeper_overlay = "ksleeper" + hat_offset = INFINITY + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 if("Alina") cyborg_base_icon = "alina-sec" special_light_key = "alina" sleeper_overlay = "alinasleeper" - if("Dark") + hat_offset = INFINITY + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + if("K9 Dark") cyborg_base_icon = "k9dark" sleeper_overlay = "k9darksleeper" + hat_offset = INFINITY + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 if("Vale") cyborg_base_icon = "valesec" sleeper_overlay = "valesecsleeper" + hat_offset = INFINITY + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 return ..() /obj/item/robot_module/security/Initialize() @@ -652,7 +617,6 @@ /obj/item/clockwork/weapon/ratvarian_spear) cyborg_base_icon = "peace" moduleselect_icon = "standard" - can_be_pushed = FALSE hat_offset = -2 /obj/item/robot_module/peacekeeper/do_transform_animation() @@ -947,7 +911,6 @@ /obj/item/clockwork/weapon/ratvarian_spear) cyborg_base_icon = "synd_sec" moduleselect_icon = "malf" - can_be_pushed = FALSE hat_offset = 3 /obj/item/robot_module/syndicate/rebuild_modules() @@ -987,7 +950,6 @@ /obj/item/clockwork/weapon/ratvarian_spear) cyborg_base_icon = "synd_medical" moduleselect_icon = "malf" - can_be_pushed = FALSE hat_offset = 3 /obj/item/robot_module/saboteur @@ -1026,7 +988,6 @@ cyborg_base_icon = "synd_engi" moduleselect_icon = "malf" - can_be_pushed = FALSE magpulsing = TRUE hat_offset = -4 canDispose = TRUE diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index cda4978f50..b9cee43138 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -13,6 +13,7 @@ mob_biotypes = list(MOB_ROBOTIC) rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE speech_span = SPAN_ROBOT + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1 no_vore = TRUE var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS @@ -71,9 +72,6 @@ /mob/living/silicon/contents_explosion(severity, target) return -/mob/living/silicon/prevent_content_explosion() - return TRUE - /mob/living/silicon/proc/cancelAlarm() return diff --git a/code/modules/mob/living/simple_animal/astral.dm b/code/modules/mob/living/simple_animal/astral.dm index 2aafedb149..3d0c335989 100644 --- a/code/modules/mob/living/simple_animal/astral.dm +++ b/code/modules/mob/living/simple_animal/astral.dm @@ -27,6 +27,7 @@ unsuitable_atmos_damage = 0 minbodytemp = 0 maxbodytemp = 100000 + blood_volume = 0 /mob/living/simple_animal/astral/death() icon_state = "shade_dead" diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm index 0378b0b9ee..f2ab3e56ed 100644 --- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm +++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm @@ -135,7 +135,7 @@ var/atom/Tsec = drop_location() var/obj/item/bot_assembly/secbot/Sa = new (Tsec) - Sa.build_step = 1 + Sa.build_step = ASSEMBLY_SECOND_STEP Sa.add_overlay("hs_hole") Sa.created_name = name new /obj/item/assembly/prox_sensor(Tsec) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 105cdaf5b0..7a653f4aa4 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -14,6 +14,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) maxbodytemp = INFINITY minbodytemp = 0 + blood_volume = 0 has_unlimited_silicon_privilege = 1 sentience_type = SENTIENCE_ARTIFICIAL status_flags = NONE //no default canpush @@ -674,11 +675,11 @@ Pass a positive integer as an argument to override a bot's default speed. destination = nearest_beacon //PDA control. Some bots, especially MULEs, may have more parameters. -/mob/living/simple_animal/bot/proc/bot_control(command, mob/user, turf/user_turf, list/user_access = list()) +/mob/living/simple_animal/bot/proc/bot_control(command, mob/user, list/user_access = list()) if(!on || emagged == 2 || remote_disabled) //Emagged bots do not respect anyone's authority! Bots with their remote controls off cannot get commands. return TRUE //ACCESS DENIED if(client) - bot_control_message(command,user,user_turf,user_access) + bot_control_message(command, user) // process control input switch(command) if("patroloff") @@ -690,7 +691,7 @@ Pass a positive integer as an argument to override a bot's default speed. if("summon") bot_reset() - summon_target = user_turf + summon_target = get_turf(user) if(user_access.len != 0) access_card.access = user_access + prev_access //Adds the user's access, if any. mode = BOT_SUMMON @@ -702,15 +703,14 @@ Pass a positive integer as an argument to override a bot's default speed. return // -/mob/living/simple_animal/bot/proc/bot_control_message(command,user,user_turf,user_access) +/mob/living/simple_animal/bot/proc/bot_control_message(command, user) switch(command) if("patroloff") to_chat(src, "STOP PATROL") if("patrolon") to_chat(src, "START PATROL") if("summon") - var/area/a = get_area(user_turf) - to_chat(src, "PRIORITY ALERT:[user] in [a.name]!") + to_chat(src, "PRIORITY ALERT:[user] in [get_area_name(user)]!") if("stop") to_chat(src, "STOP!") diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 77df764b43..6c4680a477 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -101,7 +101,7 @@ if(ASSEMBLY_FOURTH_STEP) if(istype(W, /obj/item/weldingtool)) - if(W.use_tool(src, user, 0, volume=40) && build_step == 4) + if(W.use_tool(src, user, 0, volume=40) && build_step == ASSEMBLY_FOURTH_STEP) name = "shielded frame assembly" to_chat(user, "You weld the vest to [src].") build_step++ diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index e272878574..cbd985c358 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -379,7 +379,7 @@ Auto Patrol[]"}, var/atom/Tsec = drop_location() var/obj/item/bot_assembly/ed209/Sa = new (Tsec) - Sa.build_step = 1 + Sa.build_step = ASSEMBLY_SECOND_STEP Sa.add_overlay("hs_hole") Sa.created_name = name new /obj/item/assembly/prox_sensor(Tsec) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 72f255137d..426de81da0 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -218,7 +218,7 @@ bot_control(action, usr) // Kill this later. . = TRUE -/mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, pda = 0, turf/user_turf, list/user_access = list()) +/mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, pda = FALSE) if(pda && wires.is_cut(WIRE_RX)) // MULE wireless is controlled by wires. return diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index b164605e2f..c0a9a2082f 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -411,7 +411,7 @@ Auto Patrol: []"}, var/atom/Tsec = drop_location() var/obj/item/bot_assembly/secbot/Sa = new (Tsec) - Sa.build_step = 1 + Sa.build_step = ASSEMBLY_SECOND_STEP Sa.add_overlay("hs_hole") Sa.created_name = name new /obj/item/assembly/prox_sensor(Tsec) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index b7067f8904..be900aa4ef 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -33,6 +33,7 @@ initial_language_holder = /datum/language_holder/construct deathmessage = "collapses in a shattered heap." hud_type = /datum/hud/constructs + blood_volume = 0 var/list/construct_spells = list() var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this." var/master = null @@ -459,4 +460,3 @@ hud_used.healths.icon_state = "[icon_state]_health5" else hud_used.healths.icon_state = "[icon_state]_health6" - diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 58d8a3ccca..3cbf036270 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -31,7 +31,7 @@ var/mob/living/simple_animal/mouse/movement_target gold_core_spawnable = FRIENDLY_SPAWN collar_type = "cat" - + can_be_held = "cat2" do_footstep = TRUE /mob/living/simple_animal/pet/cat/Initialize() @@ -80,6 +80,7 @@ pass_flags = PASSMOB mob_size = MOB_SIZE_SMALL collar_type = "kitten" + can_be_held = "cat" //RUNTIME IS ALIVE! SQUEEEEEEEE~ /mob/living/simple_animal/pet/cat/Runtime @@ -169,40 +170,40 @@ /mob/living/simple_animal/pet/cat/Life() if(!stat && !buckled && !client) if(prob(1)) - emote("me", 1, pick("stretches out for a belly rub.", "wags its tail.", "lies down.")) + emote("me", EMOTE_VISIBLE, pick("stretches out for a belly rub.", "wags its tail.", "lies down.")) icon_state = "[icon_living]_rest" collar_type = "[initial(collar_type)]_rest" resting = 1 update_canmove() else if (prob(1)) - emote("me", 1, pick("sits down.", "crouches on its hind legs.", "looks alert.")) + emote("me", EMOTE_VISIBLE, pick("sits down.", "crouches on its hind legs.", "looks alert.")) icon_state = "[icon_living]_sit" collar_type = "[initial(collar_type)]_sit" resting = 1 update_canmove() else if (prob(1)) if (resting) - emote("me", 1, pick("gets up and meows.", "walks around.", "stops resting.")) + emote("me", EMOTE_VISIBLE, pick("gets up and meows.", "walks around.", "stops resting.")) icon_state = "[icon_living]" collar_type = "[initial(collar_type)]" resting = 0 update_canmove() else - emote("me", 1, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat.")) + emote("me", EMOTE_VISIBLE, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat.")) //MICE! if((src.loc) && isturf(src.loc)) if(!stat && !resting && !buckled) for(var/mob/living/simple_animal/mouse/M in view(1,src)) if(!M.stat && Adjacent(M)) - emote("me", 1, "splats \the [M]!") + emote("me", EMOTE_VISIBLE, "splats \the [M]!") M.splat() movement_target = null stop_automated_movement = 0 break for(var/obj/item/toy/cattoy/T in view(1,src)) if (T.cooldown < (world.time - 400)) - emote("me", 1, "bats \the [T] around with its paw!") + emote("me", EMOTE_VISIBLE, "bats \the [T] around with its paw!") T.cooldown = world.time ..() @@ -241,10 +242,10 @@ if(change > 0) if(M && stat != DEAD) new /obj/effect/temp_visual/heart(loc) - emote("me", 1, "purrs!") + emote("me", EMOTE_VISIBLE, "purrs!") else if(M && stat != DEAD) - emote("me", 1, "hisses!") + emote("me", EMOTE_VISIBLE, "hisses!") /mob/living/simple_animal/pet/cat/cak //I told you I'd do it, Remie name = "Keeki" @@ -262,6 +263,7 @@ attacked_sound = 'sound/items/eatfood.ogg' deathmessage = "loses its false life and collapses!" death_sound = "bodyfall" + can_be_held = "cak" /mob/living/simple_animal/pet/cat/cak/CheckParts(list/parts) ..() diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index c85890df88..26d4691d83 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -3,6 +3,7 @@ desc = "This station is just crawling with bugs." icon_state = "cockroach" icon_dead = "cockroach" + blood_volume = 50 health = 1 maxHealth = 1 turns_per_move = 5 diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index d7d673ff8b..9c3e5b5def 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -8,6 +8,7 @@ speak_emote = list("clicks") emote_hear = list("clicks.") emote_see = list("clacks.") + blood_volume = 350 speak_chance = 1 turns_per_move = 5 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 1) diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index c194233c42..0d933d171b 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -15,7 +15,7 @@ turns_per_move = 10 do_footstep = TRUE - + can_be_held = TRUE //Corgis and pugs are now under one dog subtype /mob/living/simple_animal/pet/dog/corgi @@ -35,6 +35,7 @@ var/obj/item/inventory_back var/shaved = FALSE var/nofur = FALSE //Corgis that have risen past the material plane of existence. + can_be_held = "corgi" /mob/living/simple_animal/pet/dog/corgi/Destroy() QDEL_NULL(inventory_head) @@ -63,6 +64,7 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/pug = 3) gold_core_spawnable = FRIENDLY_SPAWN collar_type = "pug" + can_be_held = "pug" /mob/living/simple_animal/pet/dog/corgi/exoticcorgi name = "Exotic Corgi" @@ -360,6 +362,7 @@ icon_dead = "old_corgi_dead" desc = "At a ripe old age of [record_age] Ian's not as spry as he used to be, but he'll always be the HoP's beloved corgi." //RIP turns_per_move = 20 + can_be_held = "old_corgi" /mob/living/simple_animal/pet/dog/corgi/Ian/Life() if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) @@ -459,10 +462,10 @@ movement_target.attack_animal(src) else if(ishuman(movement_target.loc) ) if(prob(20)) - emote("me", 1, "stares at [movement_target.loc]'s [movement_target] with a sad puppy-face") + emote("me", EMOTE_VISIBLE, "stares at [movement_target.loc]'s [movement_target] with a sad puppy-face") if(prob(1)) - emote("me", 1, pick("dances around.","chases its tail!")) + emote("me", EMOTE_VISIBLE, pick("dances around.","chases its tail!")) spawn(0) for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) setDir(i) @@ -582,6 +585,7 @@ unsuitable_atmos_damage = 0 minbodytemp = TCMB maxbodytemp = T0C + 40 + can_be_held = "void_puppy" /mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0) return 1 //Void puppies can navigate space. @@ -603,6 +607,7 @@ response_harm = "kicks" var/turns_since_scan = 0 var/puppies = 0 + can_be_held = "lisa" //Lisa already has a cute bow! /mob/living/simple_animal/pet/dog/corgi/Lisa/Topic(href, href_list) @@ -618,7 +623,7 @@ if(!stat && !resting && !buckled) if(prob(1)) - emote("me", 1, pick("dances around.","chases her tail.")) + emote("me", EMOTE_VISIBLE, pick("dances around.","chases her tail.")) spawn(0) for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) setDir(i) @@ -629,7 +634,7 @@ if(!stat && !resting && !buckled) if(prob(1)) - emote("me", 1, pick("chases its tail.")) + emote("me", EMOTE_VISIBLE, pick("chases its tail.")) spawn(0) for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) setDir(i) @@ -648,8 +653,8 @@ if(change > 0) if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454 new /obj/effect/temp_visual/heart(loc) - emote("me", 1, "yaps happily!") + emote("me", EMOTE_VISIBLE, "yaps happily!") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "pet_corgi", /datum/mood_event/pet_corgi) else if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case) - emote("me", 1, "growls!") + emote("me", EMOTE_VISIBLE, "growls!") diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 387973b979..463b29772c 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -50,6 +50,7 @@ dextrous_hud_type = /datum/hud/dextrous/drone lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE see_in_dark = 7 + blood_volume = 0 can_be_held = TRUE held_items = list(null, null) var/staticChoice = "static" @@ -273,3 +274,7 @@ /mob/living/simple_animal/drone/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE) return 0 //So they don't die trying to fix wiring + +/mob/living/simple_animal/drone/generate_mob_holder() + var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "[visualAppearence]_hat", null, null, null, TRUE) + return holder diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index 33031fd80c..e40eb585e8 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -29,28 +29,11 @@ if("Nothing") return -//ATTACK HAND IGNORING PARENT RETURN VALUE +//picky up the drone c: /mob/living/simple_animal/drone/attack_hand(mob/user) - if(ishuman(user)) - if(stat == DEAD || status_flags & GODMODE || !can_be_held) - ..() - return - if(user.get_active_held_item()) - to_chat(user, "Your hands are full!") - return - visible_message("[user] starts picking up [src].", \ - "[user] starts picking you up!") - if(!do_after(user, 20, target = src)) - return - visible_message("[user] picks up [src]!", \ - "[user] picks you up!") - if(buckled) - to_chat(user, "[src] is buckled to [buckled] and cannot be picked up!") - return - to_chat(user, "You pick [src] up.") - drop_all_held_items() - var/obj/item/clothing/head/mob_holder/drone/DH = new(get_turf(src), src) - user.put_in_hands(DH) + ..() + if(user.a_intent == INTENT_HELP) + mob_try_pickup(user) /mob/living/simple_animal/drone/proc/try_reactivate(mob/living/user) var/mob/dead/observer/G = get_ghost() diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index 28b66c26ee..3f58ca593e 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -18,7 +18,7 @@ response_disarm = "gently pushes aside" response_harm = "kicks" gold_core_spawnable = FRIENDLY_SPAWN - + can_be_held = "fox" do_footstep = TRUE //Captain fox diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index 6b179ba857..1a9a4ff4d7 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -23,6 +23,7 @@ obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly, /mob/living/simple_animal/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption. + can_be_held = "lizard" //you can hold lizards now. /mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target? if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it @@ -39,3 +40,7 @@ return TRUE else return ..() + +/mob/living/simple_animal/hostile/lizard/generate_mob_holder() + var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "lizard", 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi', TRUE) + return holder diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index bf45c9cc73..fec75e4a36 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -10,6 +10,7 @@ emote_see = list("runs in a circle.", "shakes.") speak_chance = 1 turns_per_move = 5 + blood_volume = 250 see_in_dark = 6 maxHealth = 5 health = 5 @@ -25,6 +26,7 @@ var/body_color //brown, gray and white, leave blank for random gold_core_spawnable = FRIENDLY_SPAWN var/chew_probability = 1 + can_be_held = TRUE /mob/living/simple_animal/mouse/Initialize() . = ..() @@ -34,7 +36,7 @@ icon_state = "mouse_[body_color]" icon_living = "mouse_[body_color]" icon_dead = "mouse_[body_color]_dead" - + can_be_held = "mouse_[body_color]" /mob/living/simple_animal/mouse/proc/splat() src.health = 0 @@ -87,14 +89,17 @@ /mob/living/simple_animal/mouse/white body_color = "white" icon_state = "mouse_white" + can_be_held = "mouse_white" /mob/living/simple_animal/mouse/gray body_color = "gray" icon_state = "mouse_gray" + can_be_held = "mouse_gray" /mob/living/simple_animal/mouse/brown body_color = "brown" icon_state = "mouse_brown" + can_be_held = "mouse_brown" //TOM IS ALIVE! SQUEEEEEEEE~K :) /mob/living/simple_animal/mouse/brown/Tom @@ -118,3 +123,8 @@ /obj/item/reagent_containers/food/snacks/deadmouse/on_grind() reagents.clear_reagents() + +/mob/living/simple_animal/mouse/generate_mob_holder() + var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, (istext(can_be_held) ? can_be_held : ""), 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi') + holder.w_class = WEIGHT_CLASS_TINY + return holder diff --git a/code/modules/mob/living/simple_animal/friendly/sloth.dm b/code/modules/mob/living/simple_animal/friendly/sloth.dm index 324fa107fa..175cb8e838 100644 --- a/code/modules/mob/living/simple_animal/friendly/sloth.dm +++ b/code/modules/mob/living/simple_animal/friendly/sloth.dm @@ -22,7 +22,7 @@ maxHealth = 50 speed = 10 glide_size = 2 - + can_be_held = "sloth" //finally oranges can be held do_footstep = TRUE diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index e3ef14c784..1bd434b233 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -20,6 +20,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians icon_living = "magicOrange" icon_dead = "magicOrange" speed = 0 + blood_volume = 0 a_intent = INTENT_HARM stop_automated_movement = 1 movement_type = FLYING // Immunity to chasms and landmines, etc. diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm index 3ece5d4e27..49514d0d12 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -3,8 +3,8 @@ ranged = 1 //technically ranged_message = "charges" ranged_cooldown_time = 20 - damage_coeff = list(BRUTE = 0, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) - playstyle_string = "As a charger type you do medium damage, take half damage, immunity to brute damage, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding." + damage_coeff = list(BRUTE = 0.2, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) + playstyle_string = "As a charger type you do medium damage, take half damage, have near immunity to brute damage, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding." magic_fluff_string = "..And draw the Hunter, an alien master of rapid assault." tech_fluff_string = "Boot sequence complete. Charge modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's a charger carp, that likes running at people. But it doesn't have any legs..." diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm index b1af34eb02..e9f767376a 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm @@ -29,6 +29,7 @@ /mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A) if(!istype(A)) + altclick_listed_turf(A) return if(loc == summoner) to_chat(src, "You must be manifested to create bombs!") diff --git a/code/modules/mob/living/simple_animal/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm index b111caae50..718bfd71af 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/fire.dm @@ -6,8 +6,8 @@ attack_sound = 'sound/items/welder.ogg' attacktext = "ignites" melee_damage_type = BURN - damage_coeff = list(BRUTE = 0.7, BURN = 0, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) - playstyle_string = "As a chaos type, you take 30% damage reduction to all but burn, which you are immune to. You will ignite any enemy you bump into. in addition, your melee attacks will cause human targets to see everyone as you." + damage_coeff = list(BRUTE = 0.7, BURN = 0.1, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) + playstyle_string = "As a chaos type, you take 30% damage reduction to all but burn, which you are almost immune to. You will ignite any enemy you bump into. in addition, your melee attacks will cause human targets to see everyone as you." magic_fluff_string = "..And draw the Wizard, bringer of endless chaos!" tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! OH GOD, EVERYTHING'S ON FIRE. Except you and the fish." diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index d31809e9aa..b9783ed116 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -105,8 +105,9 @@ /mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A) if(!istype(A)) + altclick_listed_turf(A) return - if(src.loc == summoner) + if(loc == summoner) to_chat(src, "You must be manifested to warp a target!") return if(!beacon) diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 5240b4d06c..bb51358192 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -168,6 +168,7 @@ /mob/living/simple_animal/hostile/alien/maid/Initialize(mapload) . = ..() + AddElement(/datum/element/cleaning) /mob/living/simple_animal/hostile/alien/maid/AttackingTarget() if(ismovableatom(target)) diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 4e7cb0ac70..bc766f7409 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -19,6 +19,7 @@ spacewalk = TRUE stat_attack = UNCONSCIOUS robust_searching = 1 + blood_volume = 0 harm_intent_damage = 10 obj_damage = 50 @@ -42,4 +43,4 @@ var/mob/living/carbon/C = target C.Knockdown(60) C.visible_message("\The [src] knocks down \the [C]!", \ - "\The [src] knocks you down!") \ No newline at end of file + "\The [src] knocks you down!") diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index ece5d7e24c..a9576a467b 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -28,6 +28,7 @@ gold_core_spawnable = HOSTILE_SPAWN del_on_death = 1 loot = list(/obj/effect/decal/cleanable/robot_debris) + blood_volume = 0 do_footstep = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 9cd0504315..bd4f334476 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -364,7 +364,7 @@ /mob/living/simple_animal/hostile/proc/Aggro() vision_range = aggro_vision_range if(target && emote_taunt.len && prob(taunt_chance)) - emote("me", 1, "[pick(emote_taunt)] at [target].") + emote("me", EMOTE_VISIBLE, "[pick(emote_taunt)] at [target].") taunt_chance = max(taunt_chance-7,2) @@ -427,7 +427,7 @@ if(casingtype) var/obj/item/ammo_casing/casing = new casingtype(startloc) playsound(src, projectilesound, 100, 1) - casing.fire_casing(targeted_atom, src, null, null, null, ran_zone(), src) + casing.fire_casing(targeted_atom, src, null, null, null, ran_zone(), 0, src) else if(projectiletype) var/obj/item/projectile/P = new projectiletype(startloc) playsound(src, projectilesound, 100, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm index 1a894734d8..38dd17a09b 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm @@ -30,6 +30,7 @@ robust_searching = TRUE stat_attack = UNCONSCIOUS anchored = TRUE + blood_volume = 0 var/combatant_state = SEEDLING_STATE_NEUTRAL var/obj/seedling_weakpoint/weak_point var/mob/living/beam_debuff_target 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 f685ff1f97..51a9d8d62b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -376,7 +376,7 @@ Difficulty: Very Hard . += observer_desc . += "It is activated by [activation_method]." -/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) +/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode, atom/movable/source) ..() if(isliving(speaker)) ActivationReaction(speaker, ACTIVATE_SPEECH) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index b1694a6172..0e3cde5628 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -80,7 +80,7 @@ Difficulty: Medium return FALSE return ..() -/mob/living/simple_animal/hostile/megafauna/dragon/visible_message() +/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs) if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit return return ..() @@ -267,6 +267,7 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/dragon/AltClickOn(atom/movable/A) if(!istype(A)) + altclick_listed_turf(A) return if(swoop_cooldown >= world.time) to_chat(src, "You need to wait 20 seconds between swoop attacks!") diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index cca39cfea6..397d40925b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -50,6 +50,7 @@ Difficulty: Normal armour_penetration = 75 melee_damage_lower = 15 melee_damage_upper = 20 + blood_volume = 0 speed = 1 move_to_delay = 11 ranged = 1 @@ -441,7 +442,7 @@ Difficulty: Normal /mob/living/simple_animal/hostile/megafauna/hierophant/AltClickOn(atom/A) //player control handler(don't give this to a player holy fuck) if(!istype(A) || get_dist(A, src) <= 2) - return + return altclick_listed_turf(A) blink(A) //Hierophant overlays diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 5bfabe376e..49b56d0950 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -137,7 +137,7 @@ Difficulty: Medium if(last_legion) loot = list(/obj/item/staff/storm) elimination = 0 - else if(prob(5)) + else if(prob(20)) loot = list(/obj/structure/closet/crate/necropolis/tendril) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index d62f59cdd7..8c2fbef15e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -25,6 +25,7 @@ mob_size = MOB_SIZE_LARGE layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 var/list/crusher_loot var/medal_type var/score_type = BOSS_SCORE @@ -41,9 +42,6 @@ QDEL_NULL(internal) . = ..() -/mob/living/simple_animal/hostile/megafauna/prevent_content_explosion() - return TRUE - /mob/living/simple_animal/hostile/megafauna/death(gibbed) if(health > 0) return @@ -118,8 +116,10 @@ recovery_time = world.time + buffer_time /mob/living/simple_animal/hostile/megafauna/proc/grant_achievement(medaltype, scoretype, crusher_kill) - if(!medal_type || (flags_1 & ADMIN_SPAWNED_1) || !SSmedals.hub_enabled) //Don't award medals if the medal type isn't set + if(!medal_type || (flags_1 & ADMIN_SPAWNED_1)) //Don't award medals if the medal type isn't set return FALSE + if(!SSmedals.hub_enabled) // This allows subtypes to carry on other special rewards not tied with medals. (such as bubblegum's arena shuttle) + return TRUE for(var/mob/living/L in view(7,src)) if(L.stat || !L.client) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm index 20916c9311..51919dad24 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm @@ -22,6 +22,7 @@ environment_smash = ENVIRONMENT_SMASH_NONE sentience_type = SENTIENCE_BOSS layer = LARGE_MOB_LAYER + blood_volume = 0 var/doing_move_loop = FALSE var/mob/living/set_target var/timerid diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm new file mode 100644 index 0000000000..04a1b4a468 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -0,0 +1,366 @@ +#define TUMOR_INACTIVE 0 +#define TUMOR_ACTIVE 1 +#define TUMOR_PASSIVE 2 + +//Elite mining mobs +/mob/living/simple_animal/hostile/asteroid/elite + name = "elite" + desc = "An elite monster, found in one of the strange tumors on lavaland." + icon = 'icons/mob/lavaland/lavaland_elites.dmi' + faction = list("boss") + robust_searching = TRUE + ranged_ignores_vision = TRUE + ranged = TRUE + obj_damage = 5 + vision_range = 6 + aggro_vision_range = 18 + environment_smash = ENVIRONMENT_SMASH_NONE //This is to prevent elites smashing up the mining station, we'll make sure they can smash minerals fine below. + harm_intent_damage = 0 //Punching elites gets you nowhere + stat_attack = UNCONSCIOUS + layer = LARGE_MOB_LAYER + sentience_type = SENTIENCE_BOSS + hud_type = /datum/hud/lavaland_elite + var/chosen_attack = 1 + var/list/attack_action_types = list() + var/can_talk = FALSE + var/obj/loot_drop = null + +//Gives player-controlled variants the ability to swap attacks +/mob/living/simple_animal/hostile/asteroid/elite/Initialize(mapload) + . = ..() + for(var/action_type in attack_action_types) + var/datum/action/innate/elite_attack/attack_action = new action_type() + attack_action.Grant(src) + +//Prevents elites from attacking members of their faction (can't hurt themselves either) and lets them mine rock with an attack despite not being able to smash walls. +/mob/living/simple_animal/hostile/asteroid/elite/AttackingTarget() + if(istype(target, /mob/living/simple_animal/hostile)) + var/mob/living/simple_animal/hostile/M = target + if(faction_check_mob(M)) + return FALSE + if(istype(target, /obj/structure/elite_tumor)) + var/obj/structure/elite_tumor/T = target + if(T.mychild == src && T.activity == TUMOR_PASSIVE) + var/elite_remove = alert("Re-enter the tumor?", "Despawn yourself?", "Yes", "No") + if(elite_remove == "No" || !src || QDELETED(src)) + return + T.mychild = null + T.activity = TUMOR_INACTIVE + T.icon_state = "advanced_tumor" + qdel(src) + return FALSE + . = ..() + if(ismineralturf(target)) + var/turf/closed/mineral/M = target + M.gets_drilled() + +//Elites can't talk (normally)! +/mob/living/simple_animal/hostile/asteroid/elite/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) + if(can_talk) + . = ..() + return TRUE + return FALSE + +/*Basic setup for elite attacks, based on Whoneedspace's megafauna attack setup. +While using this makes the system rely on OnFire, it still gives options for timers not tied to OnFire, and it makes using attacks consistent accross the board for player-controlled elites.*/ + +/datum/action/innate/elite_attack + name = "Elite Attack" + icon_icon = 'icons/mob/actions/actions_elites.dmi' + button_icon_state = "" + background_icon_state = "bg_default" + var/mob/living/simple_animal/hostile/asteroid/elite/M + var/chosen_message + var/chosen_attack_num = 0 + +/datum/action/innate/elite_attack/Grant(mob/living/L) + if(istype(L, /mob/living/simple_animal/hostile/asteroid/elite)) + M = L + return ..() + return FALSE + +/datum/action/innate/elite_attack/Activate() + M.chosen_attack = chosen_attack_num + to_chat(M, chosen_message) + +/mob/living/simple_animal/hostile/asteroid/elite/updatehealth() + . = ..() + update_health_hud() + +/mob/living/simple_animal/hostile/asteroid/elite/update_health_hud() + if(hud_used) + var/severity = 0 + var/healthpercent = (health/maxHealth) * 100 + switch(healthpercent) + if(100 to INFINITY) + hud_used.healths.icon_state = "elite_health0" + if(80 to 100) + severity = 1 + if(60 to 80) + severity = 2 + if(40 to 60) + severity = 3 + if(20 to 40) + severity = 4 + if(10 to 20) + severity = 5 + if(1 to 20) + severity = 6 + else + severity = 7 + hud_used.healths.icon_state = "elite_health[severity]" + if(severity > 0) + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") + +//The Pulsing Tumor, the actual "spawn-point" of elites, handles the spawning, arena, and procs for dealing with basic scenarios. + +/obj/structure/elite_tumor + name = "pulsing tumor" + desc = "An odd, pulsing tumor sticking out of the ground. You feel compelled to reach out and touch it..." + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + resistance_flags = INDESTRUCTIBLE + var/activity = TUMOR_INACTIVE + var/boosted = FALSE + var/times_won = 0 + var/mob/living/carbon/human/activator = null + var/mob/living/simple_animal/hostile/asteroid/elite/mychild = null + var/potentialspawns = list(/mob/living/simple_animal/hostile/asteroid/elite/broodmother, + /mob/living/simple_animal/hostile/asteroid/elite/pandora, + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire, + /mob/living/simple_animal/hostile/asteroid/elite/herald) + icon = 'icons/obj/lavaland/tumor.dmi' + icon_state = "tumor" + pixel_x = -16 + light_color = LIGHT_COLOR_RED + light_range = 3 + anchored = TRUE + density = FALSE + var/obj/item/gps/internal = null + +/obj/item/gps/internal/elite + icon_state = null + gpstag = "Menacing Signal" + desc = "You're not quite sure how a signal can be menacing." + invisibility = 100 + +/obj/structure/elite_tumor/attack_hand(mob/user) + . = ..() + if(ishuman(user)) + switch(activity) + if(TUMOR_PASSIVE) + activity = TUMOR_ACTIVE + visible_message("[src] convulses as your arm enters its radius. Your instincts tell you to step back.") + activator = user + if(boosted) + mychild.playsound_local(get_turf(mychild), 'sound/effects/magic.ogg', 40, 0) + to_chat(mychild, "Someone has activated your tumor. You will be returned to fight shortly, get ready!") + addtimer(CALLBACK(src, .proc/return_elite), 30) + INVOKE_ASYNC(src, .proc/arena_checks) + if(TUMOR_INACTIVE) + activity = TUMOR_ACTIVE + var/mob/dead/observer/elitemind = null + visible_message("[src] begins to convulse. Your instincts tell you to step back.") + activator = user + if(!boosted) + addtimer(CALLBACK(src, .proc/spawn_elite), 30) + return + visible_message("Something within [src] stirs...") + var/list/candidates = pollCandidatesForMob("Do you want to play as a lavaland elite?", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, src, POLL_IGNORE_SENTIENCE_POTION) + if(candidates.len) + audible_message("The stirring sounds increase in volume!") + elitemind = pick(candidates) + elitemind.playsound_local(get_turf(elitemind), 'sound/effects/magic.ogg', 40, 0) + to_chat(elitemind, "You have been chosen to play as a Lavaland Elite.\nIn a few seconds, you will be summoned on Lavaland as a monster to fight your activator, in a fight to the death.\nYour attacks can be switched using the buttons on the top left of the HUD, and used by clicking on targets or tiles similar to a gun.\nWhile the opponent might have an upper hand with powerful mining equipment and tools, you have great power normally limited by AI mobs.\nIf you want to win, you'll have to use your powers in creative ways to ensure the kill. It's suggested you try using them all as soon as possible.\nShould you win, you'll receive extra information regarding what to do after. Good luck!") + addtimer(CALLBACK(src, .proc/spawn_elite, elitemind), 100) + else + visible_message("The stirring stops, and nothing emerges. Perhaps try again later.") + activity = TUMOR_INACTIVE + activator = null + + +obj/structure/elite_tumor/proc/spawn_elite(var/mob/dead/observer/elitemind) + var/selectedspawn = pick(potentialspawns) + mychild = new selectedspawn(loc) + visible_message("[mychild] emerges from [src]!") + playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) + if(boosted) + mychild.key = elitemind.key + mychild.sentience_act() + icon_state = "tumor_popped" + INVOKE_ASYNC(src, .proc/arena_checks) + +obj/structure/elite_tumor/proc/return_elite() + mychild.forceMove(loc) + visible_message("[mychild] emerges from [src]!") + playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) + mychild.revive(full_heal = TRUE, admin_revive = TRUE) + if(boosted) + mychild.maxHealth = mychild.maxHealth * 2 + mychild.health = mychild.maxHealth + +/obj/structure/elite_tumor/Initialize(mapload) + . = ..() + internal = new/obj/item/gps/internal/elite(src) + START_PROCESSING(SSobj, src) + +/obj/structure/elite_tumor/Destroy() + STOP_PROCESSING(SSobj, src) + mychild = null + activator = null + return ..() + +/obj/structure/elite_tumor/process() + if(isturf(loc)) + for(var/mob/living/simple_animal/hostile/asteroid/elite/elitehere in loc) + if(elitehere == mychild && activity == TUMOR_PASSIVE) + mychild.adjustHealth(-mychild.maxHealth*0.05) + var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(mychild)) + H.color = "#FF0000" + +/obj/structure/elite_tumor/attackby(obj/item/I, mob/user, params) + . = ..() + if(istype(I, /obj/item/organ/regenerative_core) && activity == TUMOR_INACTIVE && !boosted) + var/obj/item/organ/regenerative_core/core = I + if(!core.preserved) + return + visible_message("As [user] drops the core into [src], [src] appears to swell.") + icon_state = "advanced_tumor" + boosted = TRUE + light_range = 6 + desc = "[desc] This one seems to glow with a strong intensity." + qdel(core) + return TRUE + +/obj/structure/elite_tumor/proc/arena_checks() + if(activity != TUMOR_ACTIVE || QDELETED(src)) + return + INVOKE_ASYNC(src, .proc/fighters_check) //Checks to see if our fighters died. + INVOKE_ASYNC(src, .proc/arena_trap) //Gets another arena trap queued up for when this one runs out. + INVOKE_ASYNC(src, .proc/border_check) //Checks to see if our fighters got out of the arena somehow. + addtimer(CALLBACK(src, .proc/arena_checks), 50) + +/obj/structure/elite_tumor/proc/fighters_check() + if(activator != null && activator.stat == DEAD || activity == TUMOR_ACTIVE && QDELETED(activator)) + onEliteWon() + if(mychild != null && mychild.stat == DEAD || activity == TUMOR_ACTIVE && QDELETED(mychild)) + onEliteLoss() + +/obj/structure/elite_tumor/proc/arena_trap() + var/turf/T = get_turf(src) + if(loc == null) + return + for(var/t in RANGE_TURFS(12, T)) + if(get_dist(t, T) == 12) + var/obj/effect/temp_visual/elite_tumor_wall/newwall + newwall = new /obj/effect/temp_visual/elite_tumor_wall(t, src) + newwall.activator = src.activator + newwall.ourelite = src.mychild + +/obj/structure/elite_tumor/proc/border_check() + if(activator != null && get_dist(src, activator) >= 12) + activator.forceMove(loc) + visible_message("[activator] suddenly reappears above [src]!") + playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) + if(mychild != null && get_dist(src, mychild) >= 12) + mychild.forceMove(loc) + visible_message("[mychild] suddenly reappears above [src]!") + playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) + +obj/structure/elite_tumor/proc/onEliteLoss() + playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, 0, 50, TRUE, TRUE) + visible_message("[src] begins to convulse violently before beginning to dissipate.") + visible_message("As [src] closes, something is forced up from down below.") + var/obj/structure/closet/crate/necropolis/tendril/lootbox = new /obj/structure/closet/crate/necropolis/tendril(loc) + if(!boosted) + mychild = null + activator = null + qdel(src) + return + var/lootpick = rand(1, 2) + if(lootpick == 1 && mychild.loot_drop != null) + new mychild.loot_drop(lootbox) + else + new /obj/item/tumor_shard(lootbox) + mychild = null + activator = null + qdel(src) + +obj/structure/elite_tumor/proc/onEliteWon() + activity = TUMOR_PASSIVE + activator = null + mychild.revive(full_heal = TRUE, admin_revive = TRUE) + if(boosted) + times_won++ + mychild.maxHealth = mychild.maxHealth * 0.5 + mychild.health = mychild.maxHealth + if(times_won == 1) + mychild.playsound_local(get_turf(mychild), 'sound/effects/magic.ogg', 40, 0) + to_chat(mychild, "As the life in the activator's eyes fade, the forcefield around you dies out and you feel your power subside.\nDespite this inferno being your home, you feel as if you aren't welcome here anymore.\nWithout any guidance, your purpose is now for you to decide.") + to_chat(mychild, "Your max health has been halved, but can now heal by standing on your tumor. Note, it's your only way to heal.\nBear in mind, if anyone interacts with your tumor, you'll be resummoned here to carry out another fight. In such a case, you will regain your full max health.\nAlso, be weary of your fellow inhabitants, they likely won't be happy to see you!") + to_chat(mychild, "Note that you are a lavaland monster, and thus not allied to the station. You should not cooperate or act friendly with any station crew unless under extreme circumstances!") + +/obj/item/tumor_shard + name = "tumor shard" + desc = "A strange, sharp, crystal shard from an odd tumor on Lavaland. Stabbing the corpse of a lavaland elite with this will revive them, assuming their soul still lingers. Revived lavaland elites only have half their max health, but are completely loyal to their reviver." + icon = 'icons/obj/lavaland/artefacts.dmi' + icon_state = "crevice_shard" + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + item_state = "screwdriver_head" + throwforce = 5 + w_class = WEIGHT_CLASS_SMALL + throw_speed = 3 + throw_range = 5 + +/obj/item/tumor_shard/afterattack(atom/target, mob/user, proximity_flag) + . = ..() + if(istype(target, /mob/living/simple_animal/hostile/asteroid/elite) && proximity_flag) + var/mob/living/simple_animal/hostile/asteroid/elite/E = target + if(E.stat != DEAD || E.sentience_type != SENTIENCE_BOSS || !E.key) + user.visible_message("It appears [E] is unable to be revived right now. Perhaps try again later.") + return + E.faction = list("neutral") + E.revive(full_heal = TRUE, admin_revive = TRUE) + user.visible_message("[user] stabs [E] with [src], reviving it.") + E.playsound_local(get_turf(E), 'sound/effects/magic.ogg', 40, 0) + to_chat(E, "You have been revived by [user]. While you can't speak to them, you owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk.Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!") + E.maxHealth = E.maxHealth * 0.5 + E.health = E.maxHealth + E.desc = "[E.desc] However, this one appears appears less wild in nature, and calmer around people." + E.sentience_type = SENTIENCE_ORGANIC + qdel(src) + else + to_chat(user, "[src] only works on the corpse of a sentient lavaland elite.") + +/obj/effect/temp_visual/elite_tumor_wall + name = "magic wall" + icon = 'icons/turf/walls/hierophant_wall_temp.dmi' + icon_state = "wall" + duration = 50 + smooth = SMOOTH_TRUE + layer = BELOW_MOB_LAYER + var/mob/living/carbon/human/activator = null + var/mob/living/simple_animal/hostile/asteroid/elite/ourelite = null + color = rgb(255,0,0) + light_range = MINIMUM_USEFUL_LIGHT_RANGE + light_color = LIGHT_COLOR_RED + +/obj/effect/temp_visual/elite_tumor_wall/Initialize(mapload, new_caster) + . = ..() + queue_smooth_neighbors(src) + queue_smooth(src) + +/obj/effect/temp_visual/elite_tumor_wall/Destroy() + queue_smooth_neighbors(src) + activator = null + ourelite = null + return ..() + +/obj/effect/temp_visual/elite_tumor_wall/CanPass(atom/movable/mover, turf/target) + if(mover == ourelite || mover == activator) + return FALSE + else + return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm new file mode 100644 index 0000000000..c18a342206 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm @@ -0,0 +1,247 @@ +#define TENTACLE_PATCH 1 +#define SPAWN_CHILDREN 2 +#define RAGE 3 +#define CALL_CHILDREN 4 + +/** + * # Goliath Broodmother + * + * A stronger, faster variation of the goliath. Has the ability to spawn baby goliaths, which it can later detonate at will. + * When it's health is below half, tendrils will spawn randomly around it. When it is below a quarter of health, this effect is doubled. + * It's attacks are as follows: + * - Spawns a 3x3/plus shape of tentacles on the target location + * - Spawns 2 baby goliaths on its tile, up to a max of 8. Children blow up when they die. + * - The broodmother lets out a noise, and is able to move faster for 6.5 seconds. + * - Summons your children around you. + * The broodmother is a fight revolving around stage control, as the activator has to manage the baby goliaths and the broodmother herself, along with all the tendrils. + */ + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother + name = "goliath broodmother" + desc = "An example of sexual dimorphism, this female goliath looks much different than the males of her species. She is, however, just as dangerous, if not more." + gender = FEMALE + icon_state = "broodmother" + icon_living = "broodmother" + icon_aggro = "broodmother" + icon_dead = "egg_sac" + icon_gib = "syndicate_gib" + maxHealth = 800 + health = 800 + melee_damage_lower = 30 + melee_damage_upper = 30 + armour_penetration = 30 + attacktext = "beats down on" + /*attack_verb_continuous = "beats down on" + attack_verb_simple = "beat down on"*/ + attack_sound = 'sound/weapons/punch1.ogg' + throw_message = "does nothing to the rocky hide of the" + speed = 2 + move_to_delay = 5 + mob_biotypes = list(MOB_ORGANIC, MOB_BEAST) + mouse_opacity = MOUSE_OPACITY_ICON + deathmessage = "explodes into gore!" + loot_drop = /obj/item/crusher_trophy/broodmother_tongue + + attack_action_types = list(/datum/action/innate/elite_attack/tentacle_patch, + /datum/action/innate/elite_attack/spawn_children, + /datum/action/innate/elite_attack/rage, + /datum/action/innate/elite_attack/call_children) + + var/rand_tent = 0 + var/list/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/children_list = list() + +/datum/action/innate/elite_attack/tentacle_patch + name = "Tentacle Patch" + button_icon_state = "tentacle_patch" + chosen_message = "You are now attacking with a patch of tentacles." + chosen_attack_num = TENTACLE_PATCH + +/datum/action/innate/elite_attack/spawn_children + name = "Spawn Children" + button_icon_state = "spawn_children" + chosen_message = "You will spawn two children at your location to assist you in combat. You can have up to 8." + chosen_attack_num = SPAWN_CHILDREN + +/datum/action/innate/elite_attack/rage + name = "Rage" + button_icon_state = "rage" + chosen_message = "You will temporarily increase your movement speed." + chosen_attack_num = RAGE + +/datum/action/innate/elite_attack/call_children + name = "Call Children" + button_icon_state = "call_children" + chosen_message = "You will summon your children to your location." + chosen_attack_num = CALL_CHILDREN + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/OpenFire() + if(client) + switch(chosen_attack) + if(TENTACLE_PATCH) + tentacle_patch(target) + if(SPAWN_CHILDREN) + spawn_children() + if(RAGE) + rage() + if(CALL_CHILDREN) + call_children() + return + var/aiattack = rand(1,4) + switch(aiattack) + if(TENTACLE_PATCH) + tentacle_patch(target) + if(SPAWN_CHILDREN) + spawn_children() + if(RAGE) + rage() + if(CALL_CHILDREN) + call_children() + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/Life() + . = ..() + if(!.) //Checks if they are dead as a rock. + return + if(health < maxHealth * 0.5 && rand_tent < world.time) + rand_tent = world.time + 30 + var/tentacle_amount = 5 + if(health < maxHealth * 0.25) + tentacle_amount = 10 + var/tentacle_loc = spiral_range_turfs(5, get_turf(src)) + for(var/i in 1 to tentacle_amount) + var/turf/t = pick_n_take(tentacle_loc) + new /obj/effect/temp_visual/goliath_tentacle/broodmother(t, src) + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/tentacle_patch(var/target) + ranged_cooldown = world.time + 15 + var/tturf = get_turf(target) + if(!isturf(tturf)) + return + visible_message("[src] digs its tentacles under [target]!") + new /obj/effect/temp_visual/goliath_tentacle/broodmother/patch(tturf, src) + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/spawn_children(var/target) + ranged_cooldown = world.time + 40 + visible_message("The ground churns behind [src]!") + for(var/i in 1 to 2) + if(children_list.len >= 8) + return + var/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/newchild = new /mob/living/simple_animal/hostile/asteroid/elite/broodmother_child(loc) + newchild.GiveTarget(target) + newchild.faction = faction.Copy() + visible_message("[newchild] appears below [src]!") + newchild.mother = src + children_list += newchild + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/rage() + ranged_cooldown = world.time + 70 + playsound(src,'sound/spookoween/insane_low_laugh.ogg', 200, 1) + visible_message("[src] starts picking up speed!") + color = "#FF0000" + set_varspeed(0) + move_to_delay = 3 + addtimer(CALLBACK(src, .proc/reset_rage), 65) + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/reset_rage() + color = "#FFFFFF" + set_varspeed(2) + move_to_delay = 5 + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/call_children() + ranged_cooldown = world.time + 60 + visible_message("The ground shakes near [src]!") + var/list/directions = GLOB.cardinals.Copy() + GLOB.diagonals.Copy() + for(var/mob/child in children_list) + var/spawndir = pick_n_take(directions) + var/turf/T = get_step(src, spawndir) + if(T) + child.forceMove(T) + playsound(src, 'sound/effects/bamf.ogg', 100, 1) + +//The goliath's children. Pretty weak, simple mobs which are able to put a single tentacle under their target when at range. +/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child + name = "baby goliath" + desc = "A young goliath recently born from it's mother. While they hatch from eggs, said eggs are incubated in the mother until they are ready to be born." + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' + icon_state = "goliath_baby" + icon_living = "goliath_baby" + icon_aggro = "goliath_baby" + icon_dead = "goliath_baby_dead" + icon_gib = "syndicate_gib" + maxHealth = 30 + health = 30 + melee_damage_lower = 5 + melee_damage_upper = 5 + attacktext = "bashes against" + /*attack_verb_continuous = "bashes against" + attack_verb_simple = "bash against"*/ + attack_sound = 'sound/weapons/punch1.ogg' + throw_message = "does nothing to the rocky hide of the" + speed = 2 + move_to_delay = 5 + mob_biotypes = list(MOB_ORGANIC, MOB_BEAST) + mouse_opacity = MOUSE_OPACITY_ICON + butcher_results = list() + guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide = 1) + deathmessage = "falls to the ground." + status_flags = CANPUSH + var/mob/living/simple_animal/hostile/asteroid/elite/broodmother/mother = null + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/OpenFire(target) + ranged_cooldown = world.time + 40 + var/tturf = get_turf(target) + if(!isturf(tturf)) + return + if(get_dist(src, target) <= 7)//Screen range check, so it can't attack people off-screen + visible_message("[src] digs one of its tentacles under [target]!") + new /obj/effect/temp_visual/goliath_tentacle/broodmother(tturf, src) + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/death() + . = ..() + if(mother != null) + mother.children_list -= src + visible_message("[src] explodes!") + explosion(get_turf(loc),0,0,0,flame_range = 3, adminlog = FALSE) + gib() + +//Tentacles have less stun time compared to regular variant, to balance being able to use them much more often. Also, 10 more damage. +/obj/effect/temp_visual/goliath_tentacle/broodmother/trip() + var/latched = FALSE + for(var/mob/living/L in loc) + if((!QDELETED(spawner) && spawner.faction_check_mob(L)) || L.stat == DEAD) + continue + visible_message("[src] grabs hold of [L]!") + L.Stun(10) + L.adjustBruteLoss(rand(30,35)) + latched = TRUE + if(!latched) + retract() + else + deltimer(timerid) + timerid = addtimer(CALLBACK(src, .proc/retract), 10, TIMER_STOPPABLE) + +/obj/effect/temp_visual/goliath_tentacle/broodmother/patch/Initialize(mapload, new_spawner) + . = ..() + var/tentacle_locs = spiral_range_turfs(1, get_turf(src)) + for(var/T in tentacle_locs) + new /obj/effect/temp_visual/goliath_tentacle/broodmother(T, spawner) + var/list/directions = GLOB.cardinals.Copy() + for(var/i in directions) + var/turf/T = get_step(get_turf(src), i) + T = get_step(T, i) + new /obj/effect/temp_visual/goliath_tentacle/broodmother(T, spawner) + +// Broodmother's loot: Broodmother Tongue +/obj/item/crusher_trophy/broodmother_tongue + name = "broodmother tongue" + desc = "The tongue of a broodmother. If attached a certain way, makes for a suitable crusher trophy." + icon = 'icons/obj/lavaland/elite_trophies.dmi' + icon_state = "broodmother_tongue" + denied_type = /obj/item/crusher_trophy/broodmother_tongue + bonus_value = 10 + +/obj/item/crusher_trophy/broodmother_tongue/effect_desc() + return "mark detonation to have a [bonus_value]% chance to summon a patch of goliath tentacles at the target's location" + +/obj/item/crusher_trophy/broodmother_tongue/on_mark_detonation(mob/living/target, mob/living/user) + if(rand(1, 100) <= bonus_value && target.stat != DEAD) + new /obj/effect/temp_visual/goliath_tentacle/broodmother/patch(get_turf(target), user) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm new file mode 100644 index 0000000000..f1e7494beb --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -0,0 +1,275 @@ +#define HERALD_TRISHOT 1 +#define HERALD_DIRECTIONALSHOT 2 +#define HERALD_TELESHOT 3 +#define HERALD_MIRROR 4 + +/** + * # Herald + * + * A slow-moving projectile user with a few tricks up it's sleeve. Less unga-bunga than Colossus, with more cleverness in it's fighting style. + * As it's health gets lower, the amount of projectiles fired per-attack increases. + * It's attacks are as follows: + * - Fires three projectiles in a a given direction. + * - Fires a spread in every cardinal and diagonal direction at once, then does it again after a bit. + * - Shoots a single, golden bolt. Wherever it lands, the herald will be teleported to the location. + * - Spawns a mirror which reflects projectiles directly at the target. + * Herald is a more concentrated variation of the Colossus fight, having less projectiles overall, but more focused attacks. + */ + +/mob/living/simple_animal/hostile/asteroid/elite/herald + name = "herald" + desc = "A monstrous beast which fires deadly projectiles at threats and prey." + icon_state = "herald" + icon_living = "herald" + icon_aggro = "herald" + icon_dead = "herald_dying" + icon_gib = "syndicate_gib" + maxHealth = 800 + health = 800 + melee_damage_lower = 20 + melee_damage_upper = 20 + attacktext = "preaches to" + /*attack_verb_continuous = "preaches to" + attack_verb_simple = "preach to"*/ + attack_sound = 'sound/magic/clockwork/ratvar_attack.ogg' + throw_message = "doesn't affect the purity of" + speed = 4 + move_to_delay = 10 + mouse_opacity = MOUSE_OPACITY_ICON + deathsound = 'sound/magic/demon_dies.ogg' + deathmessage = "begins to shudder as it becomes transparent..." + loot_drop = /obj/item/clothing/neck/cloak/herald_cloak + + can_talk = 1 + + attack_action_types = list(/datum/action/innate/elite_attack/herald_trishot, + /datum/action/innate/elite_attack/herald_directionalshot, + /datum/action/innate/elite_attack/herald_teleshot, + /datum/action/innate/elite_attack/herald_mirror) + + var/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/my_mirror = null + var/is_mirror = FALSE + +/mob/living/simple_animal/hostile/asteroid/elite/herald/death() + . = ..() + if(!is_mirror) + addtimer(CALLBACK(src, .proc/become_ghost), 8) + if(my_mirror != null) + qdel(my_mirror) + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/become_ghost() + icon_state = "herald_ghost" + +/mob/living/simple_animal/hostile/asteroid/elite/herald/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) + . = ..() + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + +/datum/action/innate/elite_attack/herald_trishot + name = "Triple Shot" + button_icon_state = "herald_trishot" + chosen_message = "You are now firing three shots in your chosen direction." + chosen_attack_num = HERALD_TRISHOT + +/datum/action/innate/elite_attack/herald_directionalshot + name = "Circular Shot" + button_icon_state = "herald_directionalshot" + chosen_message = "You are firing projectiles in all directions." + chosen_attack_num = HERALD_DIRECTIONALSHOT + +/datum/action/innate/elite_attack/herald_teleshot + name = "Teleport Shot" + button_icon_state = "herald_teleshot" + chosen_message = "You will now fire a shot which teleports you where it lands." + chosen_attack_num = HERALD_TELESHOT + +/datum/action/innate/elite_attack/herald_mirror + name = "Summon Mirror" + button_icon_state = "herald_mirror" + chosen_message = "You will spawn a mirror which duplicates your attacks." + chosen_attack_num = HERALD_MIRROR + +/mob/living/simple_animal/hostile/asteroid/elite/herald/OpenFire() + if(client) + switch(chosen_attack) + if(HERALD_TRISHOT) + herald_trishot(target) + if(my_mirror != null) + my_mirror.herald_trishot(target) + if(HERALD_DIRECTIONALSHOT) + herald_directionalshot() + if(my_mirror != null) + my_mirror.herald_directionalshot() + if(HERALD_TELESHOT) + herald_teleshot(target) + if(my_mirror != null) + my_mirror.herald_teleshot(target) + if(HERALD_MIRROR) + herald_mirror() + return + var/aiattack = rand(1,4) + switch(aiattack) + if(HERALD_TRISHOT) + herald_trishot(target) + if(my_mirror != null) + my_mirror.herald_trishot(target) + if(HERALD_DIRECTIONALSHOT) + herald_directionalshot() + if(my_mirror != null) + my_mirror.herald_directionalshot() + if(HERALD_TELESHOT) + herald_teleshot(target) + if(my_mirror != null) + my_mirror.herald_teleshot(target) + if(HERALD_MIRROR) + herald_mirror() + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/shoot_projectile(turf/marker, set_angle, var/is_teleshot) + var/turf/startloc = get_turf(src) + var/obj/item/projectile/herald/H = null + if(!is_teleshot) + H = new /obj/item/projectile/herald(startloc) + else + H = new /obj/item/projectile/herald/teleshot(startloc) + H.preparePixelProjectile(marker, startloc) + H.firer = src + if(target) + H.original = target + H.fire(set_angle) + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_trishot(target) + ranged_cooldown = world.time + 30 + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + var/target_turf = get_turf(target) + var/angle_to_target = Get_Angle(src, target_turf) + shoot_projectile(target_turf, angle_to_target, FALSE) + addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 2) + addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 4) + if(health < maxHealth * 0.5) + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 10) + addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 12) + addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 14) + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_circleshot() + var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) + for(var/i in directional_shot_angles) + shoot_projectile(get_turf(src), i, FALSE) + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/unenrage() + if(stat == DEAD || is_mirror) + return + icon_state = "herald" + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_directionalshot() + ranged_cooldown = world.time + 50 + if(!is_mirror) + icon_state = "herald_enraged" + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + addtimer(CALLBACK(src, .proc/herald_circleshot), 5) + if(health < maxHealth * 0.5) + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + addtimer(CALLBACK(src, .proc/herald_circleshot), 15) + addtimer(CALLBACK(src, .proc/unenrage), 20) + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_teleshot(target) + ranged_cooldown = world.time + 30 + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + var/target_turf = get_turf(target) + var/angle_to_target = Get_Angle(src, target_turf) + shoot_projectile(target_turf, angle_to_target, TRUE) + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_mirror() + ranged_cooldown = world.time + 40 + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + if(my_mirror != null) + qdel(my_mirror) + my_mirror = null + var/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/new_mirror = new /mob/living/simple_animal/hostile/asteroid/elite/herald/mirror(loc) + my_mirror = new_mirror + my_mirror.my_master = src + my_mirror.faction = faction.Copy() + +/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror + name = "herald's mirror" + desc = "This fiendish work of magic copies the herald's attacks. Seems logical to smash it." + health = 60 + maxHealth = 60 + icon_state = "herald_mirror" + deathmessage = "shatters violently!" + deathsound = 'sound/effects/glassbr1.ogg' + movement_type = FLYING + del_on_death = TRUE + is_mirror = TRUE + var/mob/living/simple_animal/hostile/asteroid/elite/herald/my_master = null + +/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/Initialize() + ..() + toggle_ai(AI_OFF) + +/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/Destroy() + if(my_master != null) + my_master.my_mirror = null + . = ..() + +/obj/item/projectile/herald + name ="death bolt" + icon_state= "chronobolt" + damage = 15 + armour_penetration = 60 + speed = 2 + eyeblur = 0 + damage_type = BRUTE + pass_flags = PASSTABLE + +/obj/item/projectile/herald/teleshot + name ="golden bolt" + damage = 0 + color = rgb(255,255,102) + +/obj/item/projectile/herald/on_hit(atom/target, blocked = FALSE) + . = ..() + if(ismineralturf(target)) + var/turf/closed/mineral/M = target + M.gets_drilled() + return + else if(isliving(target)) + var/mob/living/L = target + var/mob/living/F = firer + if(F != null && istype(F, /mob/living/simple_animal/hostile/asteroid/elite) && F.faction_check_mob(L)) + L.heal_overall_damage(damage) + +/obj/item/projectile/herald/teleshot/on_hit(atom/target, blocked = FALSE) + . = ..() + firer.forceMove(get_turf(src)) + +//Herald's loot: Cloak of the Prophet + +/obj/item/clothing/neck/cloak/herald_cloak + name = "cloak of the prophet" + desc = "A cloak which protects you from the heresy of the world." + icon = 'icons/obj/lavaland/elite_trophies.dmi' + icon_state = "herald_cloak" + body_parts_covered = CHEST|GROIN|ARMS + hit_reaction_chance = 10 + +/obj/item/clothing/neck/cloak/herald_cloak/proc/reactionshot(mob/living/carbon/owner) + var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) + for(var/i in directional_shot_angles) + shoot_projectile(get_turf(owner), i, owner) + +/obj/item/clothing/neck/cloak/herald_cloak/proc/shoot_projectile(turf/marker, set_angle, mob/living/carbon/owner) + var/turf/startloc = get_turf(owner) + var/obj/item/projectile/herald/H = null + H = new /obj/item/projectile/herald(startloc) + H.preparePixelProjectile(marker, startloc) + H.firer = owner + H.fire(set_angle) + +/obj/item/clothing/neck/cloak/herald_cloak/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + . = ..() + if(rand(1,100) > hit_reaction_chance) + return + owner.visible_message("[owner]'s [src] emits a loud noise as [owner] is struck!") + var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) + playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + addtimer(CALLBACK(src, .proc/reactionshot, owner), 10) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm new file mode 100644 index 0000000000..1bc9ea1e4e --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm @@ -0,0 +1,303 @@ +#define LEGIONNAIRE_CHARGE 1 +#define HEAD_DETACH 2 +#define BONFIRE_TELEPORT 3 +#define SPEW_SMOKE 4 + +/** + * # Legionnaire + * + * A towering skeleton, embodying the power of Legion. + * As it's health gets lower, the head does more damage. + * It's attacks are as follows: + * - Charges at the target after a telegraph, throwing them across the arena should it connect. + * - Legionnaire's head detaches, attacking as it's own entity. Has abilities of it's own later into the fight. Once dead, regenerates after a brief period. If the skill is used while the head is off, it will be killed. + * - Leaves a pile of bones at your location. Upon using this skill again, you'll swap locations with the bone pile. + * - Spews a cloud of smoke from it's maw, wherever said maw is. + * A unique fight incorporating the head mechanic of legion into a whole new beast. Combatants will need to make sure the tag-team of head and body don't lure them into a deadly trap. + */ + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire + name = "legionnaire" + desc = "A towering skeleton, embodying the terrifying power of Legion." + icon_state = "legionnaire" + icon_living = "legionnaire" + icon_aggro = "legionnaire" + icon_dead = "legionnaire_dead" + icon_gib = "syndicate_gib" + maxHealth = 800 + health = 800 + melee_damage_lower = 30 + melee_damage_upper = 30 + attacktext = "slashes its arms at" + /*attack_verb_continuous = "slashes its arms at" + attack_verb_simple = "slash your arms at"*/ + attack_sound = 'sound/weapons/bladeslice.ogg' + throw_message = "doesn't affect the sturdiness of" + speed = 1 + move_to_delay = 3 + mouse_opacity = MOUSE_OPACITY_ICON + deathsound = 'sound/magic/curse.ogg' + deathmessage = "'s arms reach out before it falls apart onto the floor, lifeless." + loot_drop = /obj/item/crusher_trophy/legionnaire_spine + + attack_action_types = list(/datum/action/innate/elite_attack/legionnaire_charge, + /datum/action/innate/elite_attack/head_detach, + /datum/action/innate/elite_attack/bonfire_teleport, + /datum/action/innate/elite_attack/spew_smoke) + + var/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead/myhead = null + var/obj/structure/legionnaire_bonfire/mypile = null + var/has_head = TRUE + +/datum/action/innate/elite_attack/legionnaire_charge + name = "Legionnaire Charge" + button_icon_state = "legionnaire_charge" + chosen_message = "You will attempt to grab your opponent and throw them." + chosen_attack_num = LEGIONNAIRE_CHARGE + +/datum/action/innate/elite_attack/head_detach + name = "Release Head" + button_icon_state = "head_detach" + chosen_message = "You will now detach your head or kill it if it is already released." + chosen_attack_num = HEAD_DETACH + +/datum/action/innate/elite_attack/bonfire_teleport + name = "Bonfire Teleport" + button_icon_state = "bonfire_teleport" + chosen_message = "You will leave a bonfire. Second use will let you swap positions with it indefintiely. Using this move on the same tile as your active bonfire removes it." + chosen_attack_num = BONFIRE_TELEPORT + +/datum/action/innate/elite_attack/spew_smoke + name = "Spew Smoke" + button_icon_state = "spew_smoke" + chosen_message = "Your head will spew smoke in an area, wherever it may be." + chosen_attack_num = SPEW_SMOKE + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/OpenFire() + if(client) + switch(chosen_attack) + if(LEGIONNAIRE_CHARGE) + legionnaire_charge(target) + if(HEAD_DETACH) + head_detach(target) + if(BONFIRE_TELEPORT) + bonfire_teleport() + if(SPEW_SMOKE) + spew_smoke() + return + var/aiattack = rand(1,4) + switch(aiattack) + if(LEGIONNAIRE_CHARGE) + legionnaire_charge(target) + if(HEAD_DETACH) + head_detach(target) + if(BONFIRE_TELEPORT) + bonfire_teleport() + if(SPEW_SMOKE) + spew_smoke() + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/legionnaire_charge(target) + ranged_cooldown = world.time + 50 + var/dir_to_target = get_dir(get_turf(src), get_turf(target)) + var/turf/T = get_step(get_turf(src), dir_to_target) + for(var/i in 1 to 4) + new /obj/effect/temp_visual/dragon_swoop/legionnaire(T) + T = get_step(T, dir_to_target) + playsound(src,'sound/magic/demon_attack1.ogg', 200, 1) + visible_message("[src] prepares to charge!") + addtimer(CALLBACK(src, .proc/legionnaire_charge_2, dir_to_target, 0), 5) + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/legionnaire_charge_2(var/move_dir, var/times_ran) + if(times_ran >= 4) + return + var/turf/T = get_step(get_turf(src), move_dir) + if(ismineralturf(T)) + var/turf/closed/mineral/M = T + M.gets_drilled() + if(T.density) + return + for(var/obj/structure/window/W in T.contents) + return + for(var/obj/machinery/door/D in T.contents) + return + forceMove(T) + playsound(src,'sound/effects/bang.ogg', 200, 1) + var/list/hit_things = list() + var/throwtarget = get_edge_target_turf(src, move_dir) + for(var/mob/living/L in T.contents - hit_things - src) + if(faction_check_mob(L)) + return + hit_things += L + visible_message("[src] attacks [L] with much force!") + to_chat(L, "[src] grabs you and throws you with much force!") + L.safe_throw_at(throwtarget, 10, 1, src) + //L.Paralyze(20) + L.Stun(20) //substituting this for the Paralyze from the line above, because we don't have tg paralysis stuff + L.adjustBruteLoss(50) + addtimer(CALLBACK(src, .proc/legionnaire_charge_2, move_dir, (times_ran + 1)), 2) + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/head_detach(target) + ranged_cooldown = world.time + 10 + if(myhead != null) + myhead.adjustBruteLoss(600) + return + if(has_head) + has_head = FALSE + icon_state = "legionnaire_headless" + icon_living = "legionnaire_headless" + icon_aggro = "legionnaire_headless" + visible_message("[src]'s head flies off!") + var/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead/newhead = new /mob/living/simple_animal/hostile/asteroid/elite/legionnairehead(loc) + newhead.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) + newhead.GiveTarget(target) + newhead.faction = faction.Copy() + myhead = newhead + myhead.body = src + if(health < maxHealth * 0.25) + myhead.melee_damage_lower = 30 + myhead.melee_damage_upper = 30 + else if(health < maxHealth * 0.5) + myhead.melee_damage_lower = 20 + myhead.melee_damage_upper = 20 + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/onHeadDeath() + myhead = null + addtimer(CALLBACK(src, .proc/regain_head), 50) + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/regain_head() + has_head = TRUE + if(stat == DEAD) + return + icon_state = "legionnaire" + icon_living = "legionnaire" + icon_aggro = "legionnaire" + visible_message("The top of [src]'s spine leaks a black liquid, forming into a skull!") + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/bonfire_teleport() + ranged_cooldown = world.time + 5 + if(mypile == null) + var/obj/structure/legionnaire_bonfire/newpile = new /obj/structure/legionnaire_bonfire(loc) + mypile = newpile + mypile.myowner = src + playsound(get_turf(src),'sound/items/fulext_deploy.wav', 200, 1) + visible_message("[src] summons a bonfire on [get_turf(src)]!") + return + else + var/turf/legionturf = get_turf(src) + var/turf/pileturf = get_turf(mypile) + if(legionturf == pileturf) + mypile.take_damage(100) + mypile = null + return + playsound(pileturf,'sound/items/fulext_deploy.wav', 200, 1) + playsound(legionturf,'sound/items/fulext_deploy.wav', 200, 1) + visible_message("[src] melts down into a burning pile of bones!") + forceMove(pileturf) + visible_message("[src] forms from the bonfire!") + mypile.forceMove(legionturf) + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/spew_smoke() + ranged_cooldown = world.time + 60 + var/turf/T = null + if(myhead != null) + T = get_turf(myhead) + else + T = get_turf(src) + if(myhead != null) + myhead.visible_message("[myhead] spews smoke from its maw!") + else if(!has_head) + visible_message("[src] spews smoke from the tip of their spine!") + else + visible_message("[src] spews smoke from its maw!") + var/datum/effect_system/smoke_spread/smoke = new + smoke.set_up(2, T) + smoke.start() + +//The legionnaire's head. Basically the same as any legion head, but we have to tell our creator when we die so they can generate another head. +/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead + name = "legionnaire head" + desc = "The legionnaire's head floating by itself. One shouldn't get too close, though once it sees you, you really don't have a choice." + icon_state = "legionnaire_head" + icon_living = "legionnaire_head" + icon_aggro = "legionnaire_head" + icon_dead = "legionnaire_dead" + icon_gib = "syndicate_gib" + maxHealth = 80 + health = 80 + melee_damage_lower = 10 + melee_damage_upper = 10 + attacktext = "bites at" + /*attack_verb_continuous = "bites at" + attack_verb_simple = "bite at"*/ + attack_sound = 'sound/effects/curse1.ogg' + throw_message = "simply misses" + speed = 0 + move_to_delay = 2 + del_on_death = 1 + deathmessage = "crumbles away!" + faction = list() + ranged = FALSE + var/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/body = null + +/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead/death() + . = ..() + if(body) + body.onHeadDeath() + +//The legionnaire's bonfire, which can be swapped positions with. Also sets flammable living beings on fire when they walk over it. +/obj/structure/legionnaire_bonfire + name = "bone pile" + desc = "A pile of bones which seems to occasionally move a little. It's probably a good idea to smash them." + icon = 'icons/obj/lavaland/legionnaire_bonfire.dmi' + icon_state = "bonfire" + max_integrity = 100 + //move_resist = MOVE_FORCE_EXTREMELY_STRONG + anchored = TRUE + density = FALSE + light_range = 4 + light_color = LIGHT_COLOR_RED + var/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/myowner = null + + +/obj/structure/legionnaire_bonfire/Entered(atom/movable/mover, turf/target) + if(isliving(mover)) + var/mob/living/L = mover + L.adjust_fire_stacks(3) + L.IgniteMob() + . = ..() + +/obj/structure/legionnaire_bonfire/Destroy() + if(myowner != null) + myowner.mypile = null + . = ..() + +//The visual effect which appears in front of legionnaire when he goes to charge. +/obj/effect/temp_visual/dragon_swoop/legionnaire + duration = 10 + color = rgb(0,0,0) + +/obj/effect/temp_visual/dragon_swoop/legionnaire/Initialize() + . = ..() + transform *= 0.33 + +// Legionnaire's loot: Legionnaire Spine + +/obj/item/crusher_trophy/legionnaire_spine + name = "legionnaire spine" + desc = "The spine of a legionnaire. It almost feels like it's moving..." + icon = 'icons/obj/lavaland/elite_trophies.dmi' + icon_state = "legionnaire_spine" + denied_type = /obj/item/crusher_trophy/legionnaire_spine + bonus_value = 20 + +/obj/item/crusher_trophy/legionnaire_spine/effect_desc() + return "mark detonation to have a [bonus_value]% chance to summon a loyal legion skull" + +/obj/item/crusher_trophy/legionnaire_spine/on_mark_detonation(mob/living/target, mob/living/user) + if(!rand(1, 100) <= bonus_value || target.stat == DEAD) + return + var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion(user.loc) + A.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) + A.GiveTarget(target) + A.friends = user + A.faction = user.faction.Copy() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm new file mode 100644 index 0000000000..540470d505 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm @@ -0,0 +1,193 @@ +#define SINGULAR_SHOT 1 +#define MAGIC_BOX 2 +#define PANDORA_TELEPORT 3 +#define AOE_SQUARES 4 + +/** + * # Pandora + * + * A box with a similar design to the Hierophant which trades large, single attacks for more frequent smaller ones. + * As it's health gets lower, the time between it's attacks decrease. + * It's attacks are as follows: + * - Fires hierophant blasts in a straight line. Can only fire in a straight line in 8 directions, being the diagonals and cardinals. + * - Creates a box of hierophant blasts around the target. If they try to run away to avoid it, they'll very likely get hit. + * - Teleports the pandora from one location to another, almost identical to Hierophant. + * - Spawns a 5x5 AOE at the location of choice, spreading out from the center. + * Pandora's fight mirrors Hierophant's closely, but has stark differences in attack effects. Instead of long-winded dodge times and long cooldowns, Pandora constantly attacks the opponent, but leaves itself open for attack. + */ + +/mob/living/simple_animal/hostile/asteroid/elite/pandora + name = "pandora" + desc = "A large magic box with similar power and design to the Hierophant. Once it opens, it's not easy to close it." + icon_state = "pandora" + icon_living = "pandora" + icon_aggro = "pandora" + icon_dead = "pandora_dead" + icon_gib = "syndicate_gib" + maxHealth = 800 + health = 800 + melee_damage_lower = 15 + melee_damage_upper = 15 + attacktext = "smashes into the side of" + /*attack_verb_continuous = "smashes into the side of" + attack_verb_simple = "smash into the side of"*/ + attack_sound = 'sound/weapons/sonic_jackhammer.ogg' + throw_message = "merely dinks off of the" + speed = 4 + move_to_delay = 10 + mouse_opacity = MOUSE_OPACITY_ICON + deathsound = 'sound/magic/repulse.ogg' + deathmessage = "'s lights flicker, before its top part falls down." + loot_drop = /obj/item/clothing/accessory/pandora_hope + + attack_action_types = list(/datum/action/innate/elite_attack/singular_shot, + /datum/action/innate/elite_attack/magic_box, + /datum/action/innate/elite_attack/pandora_teleport, + /datum/action/innate/elite_attack/aoe_squares) + + var/sing_shot_length = 8 + var/cooldown_time = 20 + +/datum/action/innate/elite_attack/singular_shot + name = "Singular Shot" + button_icon_state = "singular_shot" + chosen_message = "You are now creating a single linear magic square." + chosen_attack_num = SINGULAR_SHOT + +/datum/action/innate/elite_attack/magic_box + name = "Magic Box" + button_icon_state = "magic_box" + chosen_message = "You are now attacking with a box of magic squares." + chosen_attack_num = MAGIC_BOX + +/datum/action/innate/elite_attack/pandora_teleport + name = "Line Teleport" + button_icon_state = "pandora_teleport" + chosen_message = "You will now teleport to your target." + chosen_attack_num = PANDORA_TELEPORT + +/datum/action/innate/elite_attack/aoe_squares + name = "AOE Blast" + button_icon_state = "aoe_squares" + chosen_message = "Your attacks will spawn an AOE blast at your target location." + chosen_attack_num = AOE_SQUARES + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/OpenFire() + if(client) + switch(chosen_attack) + if(SINGULAR_SHOT) + singular_shot(target) + if(MAGIC_BOX) + magic_box(target) + if(PANDORA_TELEPORT) + pandora_teleport(target) + if(AOE_SQUARES) + aoe_squares(target) + return + var/aiattack = rand(1,4) + switch(aiattack) + if(SINGULAR_SHOT) + singular_shot(target) + if(MAGIC_BOX) + magic_box(target) + if(PANDORA_TELEPORT) + pandora_teleport(target) + if(AOE_SQUARES) + aoe_squares(target) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/Life() + . = ..() + if(health >= maxHealth * 0.5) + cooldown_time = 20 + return + if(health < maxHealth * 0.5 && health > maxHealth * 0.25) + cooldown_time = 15 + return + else + cooldown_time = 10 + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot(target) + ranged_cooldown = world.time + (cooldown_time * 0.5) + var/dir_to_target = get_dir(get_turf(src), get_turf(target)) + var/turf/T = get_step(get_turf(src), dir_to_target) + singular_shot_line(sing_shot_length, dir_to_target, T) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot_line(var/procsleft, var/angleused, var/turf/T) + if(procsleft <= 0) + return + new /obj/effect/temp_visual/hierophant/blast/pandora(T, src) + T = get_step(T, angleused) + procsleft = procsleft - 1 + addtimer(CALLBACK(src, .proc/singular_shot_line, procsleft, angleused, T), 2) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/magic_box(target) + ranged_cooldown = world.time + cooldown_time + var/turf/T = get_turf(target) + for(var/t in spiral_range_turfs(3, T)) + if(get_dist(t, T) > 1) + new /obj/effect/temp_visual/hierophant/blast/pandora(t, src) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport(target) + ranged_cooldown = world.time + cooldown_time + var/turf/T = get_turf(target) + var/turf/source = get_turf(src) + new /obj/effect/temp_visual/hierophant/telegraph(T, src) + new /obj/effect/temp_visual/hierophant/telegraph(source, src) + playsound(source,'sound/machines/airlockopen.ogg', 200, 1) + addtimer(CALLBACK(src, .proc/pandora_teleport_2, T, source), 2) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_2(var/turf/T, var/turf/source) + new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src) + new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, src) + for(var/t in RANGE_TURFS(1, T)) + new /obj/effect/temp_visual/hierophant/blast/pandora(t, src) + for(var/t in RANGE_TURFS(1, source)) + new /obj/effect/temp_visual/hierophant/blast/pandora(t, src) + animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out + visible_message("[src] fades out!") + density = FALSE + addtimer(CALLBACK(src, .proc/pandora_teleport_3, T), 2) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_3(var/turf/T) + forceMove(T) + animate(src, alpha = 255, time = 2, easing = EASE_IN) //fade IN + density = TRUE + visible_message("[src] fades in!") + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares(target) + ranged_cooldown = world.time + cooldown_time + var/turf/T = get_turf(target) + new /obj/effect/temp_visual/hierophant/blast/pandora(T, src) + var/max_size = 2 + addtimer(CALLBACK(src, .proc/aoe_squares_2, T, 0, max_size), 2) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares_2(var/turf/T, var/ring, var/max_size) + if(ring > max_size) + return + for(var/t in spiral_range_turfs(ring, T)) + if(get_dist(t, T) == ring) + new /obj/effect/temp_visual/hierophant/blast/pandora(t, src) + addtimer(CALLBACK(src, .proc/aoe_squares_2, T, (ring + 1), max_size), 2) + +//The specific version of hiero's squares pandora uses +/obj/effect/temp_visual/hierophant/blast/pandora + damage = 20 + monster_damage_boost = FALSE + +//Pandora's loot: Hope +/obj/item/clothing/accessory/pandora_hope + name = "Hope" + desc = "Found at the bottom of Pandora. After all the evil was released, this was the only thing left inside." + icon = 'icons/obj/lavaland/elite_trophies.dmi' + icon_state = "hope" + resistance_flags = FIRE_PROOF + +/obj/item/clothing/accessory/pandora_hope/on_uniform_equip(obj/item/clothing/under/U, user) + var/mob/living/L = user + if(L && L.mind) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "hope_lavaland", /datum/mood_event/hope_lavaland) + +/obj/item/clothing/accessory/pandora_hope/on_uniform_dropped(obj/item/clothing/under/U, user) + var/mob/living/L = user + if(L && L.mind) + SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "hope_lavaland") diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm index cc54ad3bef..4856ba2176 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm @@ -6,6 +6,7 @@ icon_dead = "bat_dead" icon_gib = "bat_dead" turns_per_move = 1 + blood_volume = 250 response_help = "brushes aside" response_disarm = "flails at" response_harm = "hits" diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm index 32e1c4d047..bfe8349192 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm @@ -31,6 +31,7 @@ movement_type = FLYING pressure_resistance = 300 gold_core_spawnable = NO_SPAWN //too spooky for science + blood_volume = 0 var/ghost_hair_style var/ghost_hair_color var/mutable_appearance/ghost_hair diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index d0ae01f443..48b69a1f5c 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -12,6 +12,7 @@ emote_see = list("rattles") a_intent = INTENT_HARM maxHealth = 40 + blood_volume = 0 health = 40 speed = 1 harm_intent_damage = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 804989e71e..da423f3788 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -18,6 +18,7 @@ maxHealth = 50000 health = 50000 healable = 0 + blood_volume = 0 harm_intent_damage = 10 obj_damage = 100 diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm index 7a86870aa1..fa5cb151ed 100644 --- a/code/modules/mob/living/simple_animal/hostile/stickman.dm +++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm @@ -13,6 +13,7 @@ response_disarm = "shoves" response_harm = "hits" speed = 0 + blood_volume = 0 stat_attack = UNCONSCIOUS robust_searching = 1 environment_smash = ENVIRONMENT_SMASH_NONE diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 5f9c8700bd..3d23baae48 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -143,7 +143,7 @@ stat("Held Item", held_item) stat("Mode",a_intent) -/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode) +/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) . = ..() if(speaker != src && prob(50)) //Dont imitate ourselves if(!radio_freq || prob(10)) @@ -437,7 +437,7 @@ //Search for item to steal parrot_interest = search_for_item() if(parrot_interest) - emote("me", 1, "looks in [parrot_interest]'s direction and takes flight.") + emote("me", EMOTE_VISIBLE, "looks in [parrot_interest]'s direction and takes flight.") parrot_state = PARROT_SWOOP | PARROT_STEAL icon_state = icon_living return @@ -459,7 +459,7 @@ if(AM) if(istype(AM, /obj/item) || isliving(AM)) //If stealable item parrot_interest = AM - emote("me", 1, "turns and flies towards [parrot_interest].") + emote("me", EMOTE_VISIBLE, "turns and flies towards [parrot_interest].") parrot_state = PARROT_SWOOP | PARROT_STEAL return else //Else it's a perch @@ -760,7 +760,7 @@ held_item = null if(health < maxHealth) adjustBruteLoss(-10) - emote("me", 1, "[src] eagerly downs the cracker.") + emote("me", EMOTE_VISIBLE, "[src] eagerly downs the cracker.") return 1 diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 3bd24c4df7..32ef52a6ae 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -31,6 +31,7 @@ loot = list(/obj/item/ectoplasm) del_on_death = TRUE initial_language_holder = /datum/language_holder/construct + blood_volume = 0 /mob/living/simple_animal/shade/death() deathmessage = "lets out a contented sigh as [p_their()] form unwinds." diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index ea86ac8963..990fa008fe 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -4,6 +4,7 @@ health = 20 maxHealth = 20 gender = PLURAL //placeholder + blood_volume = 550 //How much blud it has for bloodsucking status_flags = CANPUSH @@ -185,16 +186,16 @@ say(pick(speak), forced = "poly") else if(!(emote_hear && emote_hear.len) && (emote_see && emote_see.len)) - emote("me", 1, pick(emote_see)) + emote("me", EMOTE_VISIBLE, pick(emote_see)) if((emote_hear && emote_hear.len) && !(emote_see && emote_see.len)) - emote("me", 2, pick(emote_hear)) + emote("me", EMOTE_AUDIBLE, pick(emote_hear)) if((emote_hear && emote_hear.len) && (emote_see && emote_see.len)) var/length = emote_hear.len + emote_see.len var/pick = rand(1,length) if(pick <= emote_see.len) - emote("me", 1, pick(emote_see)) + emote("me", EMOTE_VISIBLE, pick(emote_see)) else - emote("me", 2, pick(emote_hear)) + emote("me", EMOTE_AUDIBLE, pick(emote_hear)) /mob/living/simple_animal/proc/environment_is_safe(datum/gas_mixture/environment, check_temp = FALSE) diff --git a/code/modules/mob/living/simple_animal/slime/say.dm b/code/modules/mob/living/simple_animal/slime/say.dm index a2618b711e..c48249d80f 100644 --- a/code/modules/mob/living/simple_animal/slime/say.dm +++ b/code/modules/mob/living/simple_animal/slime/say.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) +/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode, atom/movable/source) . = ..() if(speaker != src && !radio_freq && !stat) if (speaker in Friends) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 185d717a00..d1e10ea693 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -26,6 +26,7 @@ health = 150 healable = 0 gender = NEUTER + blood_volume = 0 //Until someome reworks for them to have slime jelly see_in_dark = 8 diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 0880f7f432..facc86da46 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -140,24 +140,28 @@ /////////////////////////////////// DISABILITIES //////////////////////////////////// -/mob/living/proc/add_quirk(quirk, spawn_effects) //separate proc due to the way these ones are handled - if(HAS_TRAIT(src, quirk)) +/mob/living/proc/add_quirk(quirktype, spawn_effects) //separate proc due to the way these ones are handled + if(has_quirk(quirktype)) return - if(!SSquirks || !SSquirks.quirks[quirk]) + var/datum/quirk/T = quirktype + var/qname = initial(T.name) + if(!SSquirks || !SSquirks.quirks[qname]) return - var/datum/quirk/T = SSquirks.quirks[quirk] - new T (src, spawn_effects) + new quirktype (src, spawn_effects) return TRUE -/mob/living/proc/remove_quirk(quirk) - var/datum/quirk/T = roundstart_quirks[quirk] - if(T) - qdel(T) - return TRUE - -/mob/living/proc/has_quirk(quirk) - return roundstart_quirks[quirk] +/mob/living/proc/remove_quirk(quirktype) + for(var/datum/quirk/Q in roundstart_quirks) + if(Q.type == quirktype) + qdel(Q) + return TRUE + return FALSE +/mob/living/proc/has_quirk(quirktype) + for(var/datum/quirk/Q in roundstart_quirks) + if(Q.type == quirktype) + return TRUE + return FALSE /////////////////////////////////// TRAIT PROCS //////////////////////////////////// /mob/living/proc/cure_blind(list/sources) diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index cacd1c7c56..7f8513bfd9 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -8,6 +8,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list( /mob/living/proc/handle_ventcrawl(atom/A) if(!ventcrawler || !Adjacent(A)) return + . = TRUE //return value to stop the client from being shown the turf contents stat tab on alt-click. if(stat) to_chat(src, "You must be conscious to do this!") return diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 7a4603228a..2d5424e845 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -85,106 +85,120 @@ msg = copytext(msg, 1, MAX_MESSAGE_LEN) if(type) - if(type & 1 && eye_blind )//Vision related + if(type & MSG_VISUAL && eye_blind )//Vision related if(!alt_msg) return else msg = alt_msg type = alt_type - if(type & 2 && !can_hear())//Hearing related + if(type & MSG_AUDIBLE && !can_hear())//Hearing related if(!alt_msg) return else msg = alt_msg type = alt_type - if(type & 1 && eye_blind) + if(type & MSG_VISUAL && eye_blind) return // voice muffling if(stat == UNCONSCIOUS) - if(type & 2) //audio + if(type & MSG_AUDIBLE) //audio to_chat(src, "... You can almost hear something ...") - else - to_chat(src, msg) + return + to_chat(src, msg) -// Show a message to all player mobs who sees this atom -// Show a message to the src mob (if the src is a mob) -// Use for atoms performing visible actions -// message is output to anyone who can see, e.g. "The [src] does something!" -// self_message (optional) is what the src mob sees e.g. "You do something!" -// blind_message (optional) is what blind people will hear e.g. "You hear something!" -// vision_distance (optional) define how many tiles away the message can be seen. -// ignored_mob (optional) doesn't show any message to a given mob if TRUE. - -/atom/proc/visible_message(message, self_message, blind_message, vision_distance, list/ignored_mobs, no_ghosts = FALSE) +/** + * Generate a visible message from this atom + * + * Show a message to all player mobs who sees this atom + * + * Show a message to the src mob (if the src is a mob) + * + * Use for atoms performing visible actions + * + * message is output to anyone who can see, e.g. "The [src] does something!" + * + * Vars: + * * self_message (optional) is what the src mob sees e.g. "You do something!" + * * blind_message (optional) is what blind people will hear e.g. "You hear something!" + * * vision_distance (optional) define how many tiles away the message can be seen. + * * ignored_mobs (optional) doesn't show any message to any given mob in the list. + */ +/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs) var/turf/T = get_turf(src) if(!T) return + var/list/hearers = get_hearers_in_view(vision_distance, src) //caches the hearers and then removes ignored mobs. + if(!length(hearers)) + return if(!islist(ignored_mobs)) ignored_mobs = list(ignored_mobs) - var/range = 7 - if(vision_distance) - range = vision_distance - for(var/mob/M in get_hearers_in_view(range, src)) + hearers -= ignored_mobs + if(self_message) + hearers -= src + for(var/mob/M in hearers) if(!M.client) continue - if(M in ignored_mobs) - continue + //This entire if/else chain could be in two lines but isn't for readibilties sake. var/msg = message - if(isobserver(M) && no_ghosts) + //CITADEL EDIT, required for vore code to remove (T != loc && T != src)) as a check + if(M.see_invisible ", 1) + user.show_message("SELF-DESTRUCTING... ", MSG_VISUAL) to_chat(user, "[gun] explodes!") explosion(get_turf(gun), -1, 0, 2, 3) if(gun) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 88e766edfc..9141a6d299 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -180,7 +180,7 @@ else new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color()) - if(iscarbon(L)) + if(iscarbon(L) && !HAS_TRAIT(L, TRAIT_NOMARROW)) var/mob/living/carbon/C = L C.bleed(damage) else diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index ceb9b7a0fc..be73e22e6d 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -190,3 +190,21 @@ var/mob/living/carbon/M = target M.visible_message("[M] explodes into a shower of gibs!") M.gib() + +//a shrink ray that shrinks stuff, which grows back after a short while. +/obj/item/projectile/beam/shrink + name = "shrink ray" + icon_state = "blue_laser" + hitsound = 'sound/weapons/shrink_hit.ogg' + damage = 0 + damage_type = STAMINA + flag = "energy" + impact_effect_type = /obj/effect/temp_visual/impact_effect/shrink + light_color = LIGHT_COLOR_BLUE + var/shrink_time = 90 + +/obj/item/projectile/beam/shrink/on_hit(atom/target, blocked = FALSE) + . = ..() + if(isopenturf(target) || istype(target, /turf/closed/indestructible))//shrunk floors wouldnt do anything except look weird, i-walls shouldnt be bypassable + return + target.AddComponent(/datum/component/shrink, shrink_time) \ No newline at end of file diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm deleted file mode 100644 index 047d50beaf..0000000000 --- a/code/modules/projectiles/projectile/energy.dm +++ /dev/null @@ -1,203 +0,0 @@ -/obj/item/projectile/energy - name = "energy" - icon_state = "spark" - damage = 0 - damage_type = BURN - flag = "energy" - is_reflectable = TRUE - -/obj/item/projectile/energy/chameleon - nodamage = TRUE - -/obj/item/projectile/energy/electrode - name = "electrode" - icon_state = "spark" - color = "#FFFF00" - nodamage = 1 - knockdown = 100 - stutter = 5 - jitter = 20 - hitsound = 'sound/weapons/taserhit.ogg' - range = 7 - tracer_type = /obj/effect/projectile/tracer/stun - muzzle_type = /obj/effect/projectile/muzzle/stun - impact_type = /obj/effect/projectile/impact/stun - -/obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE) - . = ..() - if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks! - do_sparks(1, TRUE, src) - else if(iscarbon(target)) - var/mob/living/carbon/C = target - if(C.dna && C.dna.check_mutation(HULK)) - C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) - addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) - -/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet - do_sparks(1, TRUE, src) - ..() - -/obj/item/projectile/energy/net - name = "energy netting" - icon_state = "e_netting" - damage = 10 - damage_type = STAMINA - hitsound = 'sound/weapons/taserhit.ogg' - range = 10 - -/obj/item/projectile/energy/net/Initialize() - . = ..() - SpinAnimation() - -/obj/item/projectile/energy/net/on_hit(atom/target, blocked = FALSE) - if(isliving(target)) - var/turf/Tloc = get_turf(target) - if(!locate(/obj/effect/nettingportal) in Tloc) - new /obj/effect/nettingportal(Tloc) - ..() - -/obj/item/projectile/energy/net/on_range() - do_sparks(1, TRUE, src) - ..() - -/obj/effect/nettingportal - name = "DRAGnet teleportation field" - desc = "A field of bluespace energy, locking on to teleport a target." - icon = 'icons/effects/effects.dmi' - icon_state = "dragnetfield" - light_range = 3 - anchored = TRUE - -/obj/effect/nettingportal/Initialize() - . = ..() - var/obj/item/radio/beacon/teletarget = null - for(var/obj/machinery/computer/teleporter/com in GLOB.machines) - if(com.target) - if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) - teletarget = com.target - - addtimer(CALLBACK(src, .proc/pop, teletarget), 30) - -/obj/effect/nettingportal/proc/pop(teletarget) - if(teletarget) - for(var/mob/living/L in get_turf(src)) - do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon - else - for(var/mob/living/L in get_turf(src)) - do_teleport(L, L, 15) //Otherwise it just warps you off somewhere. - - qdel(src) - -/obj/effect/nettingportal/singularity_act() - return - -/obj/effect/nettingportal/singularity_pull() - return - - -/obj/item/projectile/energy/trap - name = "energy snare" - icon_state = "e_snare" - nodamage = 1 - knockdown = 20 - hitsound = 'sound/weapons/taserhit.ogg' - range = 4 - -/obj/item/projectile/energy/trap/on_hit(atom/target, blocked = FALSE) - if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap - new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc)) - else if(iscarbon(target)) - var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target)) - B.Crossed(target) - ..() - -/obj/item/projectile/energy/trap/on_range() - new /obj/item/restraints/legcuffs/beartrap/energy(loc) - ..() - -/obj/item/projectile/energy/trap/cyborg - name = "Energy Bola" - icon_state = "e_snare" - nodamage = 1 - knockdown = 0 - hitsound = 'sound/weapons/taserhit.ogg' - range = 10 - -/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = FALSE) - if(!ismob(target) || blocked >= 100) - do_sparks(1, TRUE, src) - qdel(src) - if(iscarbon(target)) - var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target)) - B.Crossed(target) - QDEL_IN(src, 10) - ..() - -/obj/item/projectile/energy/trap/cyborg/on_range() - do_sparks(1, TRUE, src) - qdel(src) - -/obj/item/projectile/energy/declone - name = "radiation beam" - icon_state = "declone" - damage = 20 - damage_type = CLONE - irradiate = 10 - impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser - -/obj/item/projectile/energy/dart //ninja throwing dart - name = "dart" - icon_state = "toxin" - damage = 5 - damage_type = TOX - knockdown = 100 - range = 7 - -/obj/item/projectile/energy/bolt //ebow bolts - name = "bolt" - icon_state = "cbbolt" - damage = 8 - damage_type = TOX - nodamage = 0 - knockdown = 100 - stutter = 5 - -/obj/item/projectile/energy/bolt/halloween - name = "candy corn" - icon_state = "candy_corn" - -/obj/item/projectile/energy/bolt/large - damage = 20 - -/obj/item/projectile/energy/tesla - name = "tesla bolt" - icon_state = "tesla_projectile" - impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser - var/chain - -/obj/item/projectile/energy/tesla/fire(setAngle) - if(firer) - chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) - ..() - -/obj/item/projectile/energy/tesla/Destroy() - qdel(chain) - return ..() - -/obj/item/projectile/energy/tesla/revolver - name = "energy orb" - -/obj/item/projectile/energy/tesla/revolver/on_hit(atom/target) - . = ..() - if(isliving(target)) - tesla_zap(target, 3, 10000) - qdel(src) - -/obj/item/projectile/energy/tesla/cannon - name = "tesla orb" - -/obj/item/projectile/energy/tesla/cannon/on_hit(atom/target) - . = ..() - tesla_zap(target, 3, 10000, explosive = FALSE, stun_mobs = FALSE) - qdel(src) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index d7c8b8b082..a3c139bcff 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -23,6 +23,7 @@ var/mob/living/carbon/C = target SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased) SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK) + C.IgniteMob() if(C.dna && C.dna.check_mutation(HULK)) C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index d91c60367d..173d9721a9 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -507,4 +507,32 @@ return var/turf/T = get_turf(target) for(var/i=0, i<50, i+=10) - addtimer(CALLBACK(GLOBAL_PROC, .proc/explosion, T, -1, exp_heavy, exp_light, exp_flash, FALSE, FALSE, exp_fire), i) \ No newline at end of file + addtimer(CALLBACK(GLOBAL_PROC, .proc/explosion, T, -1, exp_heavy, exp_light, exp_flash, FALSE, FALSE, exp_fire), i) + +/obj/item/projectile/magic/nuclear + name = "\proper blazing manliness" + icon_state = "nuclear" + nodamage = TRUE + var/mob/living/victim = null + var/used = 0 + +/obj/item/projectile/magic/nuclear/on_hit(target) + if(used) + return + new/obj/effect/temp_visual/slugboom(get_turf(src)) + if(ismob(target)) + if(target == victim) + return + used = 1 + visible_message("[victim] slams into [target] with explosive force!") + explosion(src, 2, 3, 4, -1, TRUE, FALSE, 5) + else + used = 1 + victim.take_overall_damage(30,30) + victim.Knockdown(60) + explosion(src, -1, -1, -1, -1, FALSE, FALSE, 5) + +/obj/item/projectile/magic/nuclear/Destroy() + for(var/atom/movable/AM in contents) + AM.forceMove(get_turf(src)) + . = ..() \ No newline at end of file diff --git a/code/modules/projectiles/projectile/megabuster.dm b/code/modules/projectiles/projectile/megabuster.dm index bfe9f40297..8abb182a1e 100644 --- a/code/modules/projectiles/projectile/megabuster.dm +++ b/code/modules/projectiles/projectile/megabuster.dm @@ -6,7 +6,6 @@ damage_type = BURN hitsound = 'sound/weapons/sear.ogg' hitsound_wall = 'sound/weapons/effects/searwall.ogg' - icon = 'modular_citadel/icons/obj/VGprojectile.dmi' lefthand_file = 'modular_citadel/icons/mob/citadel/guns_lefthand.dmi' righthand_file = 'modular_citadel/icons/mob/citadel/guns_righthand.dmi' @@ -14,6 +13,5 @@ name = "buster pellet" icon_state = "megabuster" nodamage = 1 - icon = 'modular_citadel/icons/obj/VGprojectile.dmi' lefthand_file = 'modular_citadel/icons/mob/citadel/guns_lefthand.dmi' righthand_file = 'modular_citadel/icons/mob/citadel/guns_righthand.dmi' diff --git a/code/modules/projectiles/projectile/plasma.dm b/code/modules/projectiles/projectile/plasma.dm index f9adb9f3d7..038200b9df 100644 --- a/code/modules/projectiles/projectile/plasma.dm +++ b/code/modules/projectiles/projectile/plasma.dm @@ -1,5 +1,4 @@ obj/item/projectile/energy/plasmabolt - icon = 'modular_citadel/icons/obj/VGProjectile.dmi' name = "plasma bolt" icon_state = "plasma" flag = "energy" diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index fb064b6146..d540cd02fe 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -843,7 +843,7 @@ return FALSE if (D.id == "water" && !no_react && !istype(my_atom, /obj/item/reagent_containers/food)) //Do like an otter, add acid to water, but also don't blow up botany. - if (pH <= 2) + if (pH < 2) SSblackbox.record_feedback("tally", "fermi_chem", 1, "water-acid explosions") var/datum/effect_system/smoke_spread/chem/s = new var/turf/T = get_turf(my_atom) @@ -1112,7 +1112,7 @@ if(percent < minimum_percent) continue var/intensity_desc = "a hint of" - if(percent > minimum_percent * 2 || percent == 100) + 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" diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 7e5cb21822..2c5d7aa3e2 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -161,7 +161,7 @@ . = ..() if(A == beaker) beaker = null - cut_overlays() + update_icon() /obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) @@ -428,10 +428,11 @@ return final_list /obj/machinery/chem_dispenser/AltClick(mob/living/user) + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return replace_beaker(user) - return + return TRUE /obj/machinery/chem_dispenser/drinks/Initialize() . = ..() @@ -655,3 +656,67 @@ component_parts += new /obj/item/stack/sheet/glass(null) component_parts += new /obj/item/stock_parts/cell/bluespace(null) RefreshParts() + +/obj/machinery/chem_dispenser/abductor + name = "reagent synthesizer" + desc = "Synthesizes a variety of reagents using proto-matter." + icon = 'icons/obj/abductor.dmi' + icon_state = "chem_dispenser" + has_panel_overlay = FALSE + circuit = /obj/item/circuitboard/machine/chem_dispenser/abductor + working_state = null + nopower_state = null + dispensable_reagents = list( + "hydrogen", + "lithium", + "carbon", + "nitrogen", + "oxygen", + "fluorine", + "sodium", + "aluminium", + "silicon", + "phosphorus", + "sulfur", + "chlorine", + "potassium", + "iron", + "copper", + "mercury", + "radium", + "water", + "ethanol", + "sugar", + "sacid", + "welding_fuel", + "silver", + "iodine", + "bromine", + "stable_plasma", + "oil", + "ammonia", + "ash", + "acetone", + "phenol", + "diethylamine", + "mine_salve", + "toxin", + "space_drugs", + "plasma", + "frostoil", + "uranium", + "histamine", + "morphine" + ) + +/obj/machinery/chem_dispenser/abductor/Initialize() + . = ..() + component_parts = list() + component_parts += new /obj/item/circuitboard/machine/chem_dispenser(null) + component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) + component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) + component_parts += new /obj/item/stock_parts/capacitor/quadratic(null) + component_parts += new /obj/item/stock_parts/manipulator/femto(null) + component_parts += new /obj/item/stack/sheet/glass(null) + component_parts += new /obj/item/stock_parts/cell/bluespace(null) + RefreshParts() \ No newline at end of file diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index eeb452dbb5..b4f14c69a7 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -29,10 +29,11 @@ icon_state = "mixer0b" /obj/machinery/chem_heater/AltClick(mob/living/user) + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return replace_beaker(user) - return + return TRUE /obj/machinery/chem_heater/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) if(beaker) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index f540ae850d..1ac62ba651 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -58,14 +58,14 @@ if(bottle) bottle.ex_act(severity, target) -/obj/machinery/chem_master/handle_atom_del(atom/A) - ..() +/obj/machinery/chem_master/Exited(atom/movable/A, atom/newloc) + . = ..() if(A == beaker) beaker = null - reagents.clear_reagents() update_icon() - else if(A == bottle) + if(A == bottle) bottle = null + update_icon() /obj/machinery/chem_master/update_icon() cut_overlays() @@ -103,6 +103,10 @@ updateUsrDialog() update_icon() else if(!condi && istype(I, /obj/item/storage/pill_bottle)) + . = TRUE // no afterattack + if(panel_open) + to_chat(user, "You can't use the [src.name] while its panel is opened!") + return if(!user.transferItemToLoc(I, src)) return replace_pillbottle(user, I) @@ -112,40 +116,40 @@ return ..() /obj/machinery/chem_master/AltClick(mob/living/user) + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return - replace_beaker(user) - return + if(beaker) + replace_beaker(user) + else if(bottle) + replace_pillbottle(user) + return TRUE /obj/machinery/chem_master/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) if(beaker) - beaker.forceMove(drop_location()) + var/obj/item/reagent_containers/B = beaker + B.forceMove(drop_location()) if(user && Adjacent(user) && !issiliconoradminghost(user)) - user.put_in_hands(beaker) + user.put_in_hands(B) if(new_beaker) beaker = new_beaker - else - beaker = null update_icon() - return TRUE /obj/machinery/chem_master/proc/replace_pillbottle(mob/living/user, obj/item/storage/pill_bottle/new_bottle) if(bottle) - bottle.forceMove(drop_location()) + var/obj/item/storage/pill_bottle/B = bottle + B.forceMove(drop_location()) if(user && Adjacent(user) && !issiliconoradminghost(user)) - user.put_in_hands(beaker) + user.put_in_hands(B) else - adjust_item_drop_location(bottle) + adjust_item_drop_location(B) if(new_bottle) bottle = new_bottle - else - bottle = null - update_icon() - return TRUE /obj/machinery/chem_master/on_deconstruction() - replace_beaker(usr) - replace_pillbottle(usr) + var/atom/A = drop_location() + beaker.forceMove(A) + bottle.forceMove(A) return ..() /obj/machinery/chem_master/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ @@ -260,15 +264,16 @@ if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) return var/obj/item/reagent_containers/pill/P - var/target_loc = bottle ? bottle : drop_location() + var/target_loc = drop_location() var/drop_threshold = INFINITY if(bottle) var/datum/component/storage/STRB = bottle.GetComponent(/datum/component/storage) if(STRB) drop_threshold = STRB.max_items - bottle.contents.len + target_loc = bottle for(var/i in 1 to amount) - if(i < drop_threshold) + if(i <= drop_threshold) P = new(target_loc) else P = new(drop_location()) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 05fa4d382a..6ae0a682d8 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -237,10 +237,11 @@ return ..() /obj/machinery/computer/pandemic/AltClick(mob/living/user) + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return replace_beaker(user) - return + return TRUE /obj/machinery/computer/pandemic/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) if(beaker) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index bd60880324..fd28ff9c47 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -199,17 +199,17 @@ All effects don't start immediately, but rather get worse over time; the rate is to_chat(M, "[pick("You have a really bad headache.", "Your eyes hurt.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]") if(prob(5) && iscarbon(M)) + var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if(HAS_TRAIT(M, TRAIT_BLIND)) - var/obj/item/organ/eyes/eye = M.getorganslot(ORGAN_SLOT_EYES) - if(istype(eye)) - eye.Remove(M) - eye.forceMove(get_turf(M)) + if(eyes) + eyes.Remove(M) + eyes.forceMove(get_turf(M)) to_chat(M, "You double over in pain as you feel your eyeballs liquify in your head!") M.emote("scream") M.adjustBruteLoss(15) else to_chat(M, "You scream in terror as you go blind!") - M.become_blind(EYE_DAMAGE) + eyes?.applyOrganDamage(eyes.maxHealth) M.emote("scream") if(prob(3) && iscarbon(M)) @@ -610,6 +610,8 @@ All effects don't start immediately, but rather get worse over time; the rate is value = 1.3 /datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C) + if((HAS_TRAIT(C, TRAIT_NOMARROW))) + return if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) C.blood_volume = min((BLOOD_VOLUME_NORMAL*C.blood_ratio), C.blood_volume + 3) //Bloody Mary quickly restores blood loss. ..() diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 80dac84f18..957ea1b986 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -407,10 +407,6 @@ glass_name = "glass of Nuka Cola" glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland." -/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/L) - ..() - L.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) - /datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/L) L.remove_movespeed_modifier(id) ..() @@ -483,7 +479,6 @@ glass_name = "glass of lemon-lime" glass_desc = "You're pretty certain a real fruit has never actually touched this." - /datum/reagent/consumable/lemon_lime/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) ..() @@ -516,6 +511,51 @@ M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) ..() +/datum/reagent/consumable/buzz_fuzz + name = "Buzz Fuzz" + description = "~A Hive of Flavour!~ NOTICE: Addicting." + id = "buzz_fuzz" + addiction_threshold = 26 //A can and a sip + color = "#8CFF00" // rgb: 135, 255, 0 + taste_description = "carbonated honey and pollen" + glass_icon_state = "buzz_fuzz" + glass_name = "honeycomb of Buzz Fuzz" + glass_desc = "Stinging with flavour." + +/datum/reagent/consumable/buzz_fuzz/on_mob_life(mob/living/carbon/M) + M.reagents.add_reagent("sugar",1) + if(prob(5)) + M.reagents.add_reagent("honey",1) + ..() + +/datum/reagent/consumable/buzz_fuzz/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + if(iscarbon(M) && (method in list(TOUCH, VAPOR, PATCH))) + var/mob/living/carbon/C = M + for(var/s in C.surgeries) + var/datum/surgery/S = s + S.success_multiplier = max(0.1, S.success_multiplier) // +10% success probability on each step, compared to bacchus' blessing's ~46% + ..() + +/datum/reagent/consumable/buzz_fuzz/addiction_act_stage1(mob/living/M) + if(prob(5)) + to_chat(M, "[pick("Buzz Buzz.", "Stinging with flavour.", "A Hive of Flavour")]") + ..() + +/datum/reagent/consumable/buzz_fuzz/addiction_act_stage2(mob/living/M) + if(prob(10)) + to_chat(M, "[pick("Buzz Buzz.", "Stinging with flavour.", "A Hive of Flavour", "The Queen approved it!")]") + ..() + +/datum/reagent/consumable/buzz_fuzz/addiction_act_stage3(mob/living/M) + if(prob(15)) + to_chat(M, "[pick("Buzz Buzz.", "Stinging with flavour.", "Ideal of the worker drone", "A Hive of Flavour", "The Queen approved it!")]") + ..() + +/datum/reagent/consumable/buzz_fuzz/addiction_act_stage4(mob/living/M) + if(prob(25)) + to_chat(M, "[pick("Buzz Buzz.", "Stinging with flavour.", "Ideal of the worker drone", "A Hive of Flavour", "Sap back that missing energy!", "Got Honey?", "The Queen approved it!")]") + ..() + /datum/reagent/consumable/grey_bull name = "Grey Bull" id = "grey_bull" @@ -768,7 +808,6 @@ M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) ..() - /datum/reagent/consumable/milk/chocolate_milk name = "Chocolate Milk" id = "chocolate_milk" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 6700c6c006..d8ff084227 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -355,6 +355,8 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) value = 1 /datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M) + if((HAS_TRAIT(M, TRAIT_NOMARROW))) + return if(last_added) M.blood_volume -= last_added last_added = 0 @@ -793,6 +795,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if (!eyes) return + eyes.applyOrganDamage(-2) if(HAS_TRAIT_FROM(M, TRAIT_BLIND, EYE_DAMAGE)) if(prob(20)) to_chat(M, "Your vision slowly returns...") @@ -807,8 +810,6 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) else if(M.eye_blind || M.eye_blurry) M.set_blindness(0) M.set_blurriness(0) - else if(eyes.eye_damage > 0) - M.adjust_eye_damage(-1) ..() /datum/reagent/medicine/atropine @@ -881,40 +882,49 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) /datum/reagent/medicine/strange_reagent name = "Strange Reagent" id = "strange_reagent" - description = "A miracle drug capable of bringing the dead back to life. Only functions if the target has less than 100 brute and burn damage (independent of one another), and causes slight damage to the living." + description = "A miracle drug capable of bringing the dead back to life. Only functions when applied by patch or spray, if the target has less than 100 brute and burn damage (independent of one another) and hasn't been husked. Causes slight damage to the living." reagent_state = LIQUID color = "#A0E85E" metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "magnets" pH = 0 -/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/carbon/human/M, method=TOUCH, reac_volume) +/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(M.stat == DEAD) - if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100) - M.visible_message("[M]'s body convulses a bit, and then falls still once more.") + if(M.suiciding || M.hellbound) //they are never coming back + M.visible_message("[M]'s body does not react...") return - M.visible_message("[M]'s body convulses a bit.") - if(!M.suiciding && !(HAS_TRAIT(M, TRAIT_NOCLONE)) && !M.hellbound) - if(!M) - return - if(M.notify_ghost_cloning(source = M)) - spawn (100) //so the ghost has time to re-enter - return + if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100 || HAS_TRAIT(M, TRAIT_HUSK)) //body is too damaged to be revived + M.visible_message("[M]'s body convulses a bit, and then falls still once more.") + M.do_jitter_animation(10) + return + else + M.visible_message("[M]'s body starts convulsing!") + M.notify_ghost_cloning(source = M) + M.do_jitter_animation(10) + addtimer(CALLBACK(M, /mob/living/carbon.proc/do_jitter_animation, 10), 40) //jitter immediately, then again after 4 and 8 seconds + addtimer(CALLBACK(M, /mob/living/carbon.proc/do_jitter_animation, 10), 80) + + spawn(100) //so the ghost has time to re-enter + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(!(C.dna && C.dna.species && (NOBLOOD in C.dna.species.species_traits))) + C.blood_volume = max(C.blood_volume, BLOOD_VOLUME_NORMAL*C.blood_ratio) //so you don't instantly re-die from a lack of blood + for(var/organ in C.internal_organs) + var/obj/item/organ/O = organ + if(O.damage > O.maxHealth/2) + O.setOrganDamage(O.maxHealth/2) //so you don't instantly die from organ damage when being revived - else M.adjustOxyLoss(-20, 0) M.adjustToxLoss(-20, 0) - var/mob/living/carbon/H = M - for(var/organ in H.internal_organs) - var/obj/item/organ/O = organ - O.setOrganDamage(0) M.updatehealth() - if(M.revive()) + M.grab_ghost() M.emote("gasp") log_combat(M, M, "revived", src) ..() + /datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(0.5*REM, 0) M.adjustFireLoss(0.5*REM, 0) @@ -940,6 +950,21 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) description = "Reacts with neural tissue, helping reform damaged connections. Can cure minor traumas." color = "#EEFF8F" +/datum/reagent/medicine/neurine/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + if(!(method == INJECT)) + return + var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) + if(!B || (!(B.organ_flags & ORGAN_FAILING))) + return + B.applyOrganDamage(-20) + if(prob(80)) + B.gain_trauma_type(BRAIN_TRAUMA_MILD) + else if(prob(50)) + B.gain_trauma_type(BRAIN_TRAUMA_SEVERE) + else + B.gain_trauma_type(BRAIN_TRAUMA_SPECIAL) + + /datum/reagent/medicine/neurine/on_mob_life(mob/living/carbon/C) if(holder.has_reagent("neurotoxin")) holder.remove_reagent("neurotoxin", 5) @@ -1186,7 +1211,30 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) M.adjustToxLoss(-5*REM, 0) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM) M.adjustCloneLoss(-3*REM, 0) + M.adjustStaminaLoss(-25*REM,0) + if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) + M.blood_volume += 40 // blood fall out man bad + ..() + . = 1 + +/datum/reagent/medicine/lesser_syndicate_nanites // the one in the injector + name = "Regenerative Nanites" + id = "lesser_syndicate_nanites" + description = "Miniature medical robots that restore damage and get operatives back in the fight." + reagent_state = SOLID + color = "#555555" + pH = 11 + +/datum/reagent/medicine/lesser_syndicate_nanites/on_mob_life(mob/living/carbon/M) + M.adjustBruteLoss(-3*REM, 0) // hidden gold shh + M.adjustFireLoss(-3*REM, 0) + M.adjustOxyLoss(-15, 0) + M.adjustToxLoss(-3*REM, 0) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM) + M.adjustCloneLoss(-3*REM, 0) M.adjustStaminaLoss(-20*REM,0) + if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) + M.blood_volume += 20 // blood fall out man bad ..() . = 1 @@ -1509,5 +1557,5 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) /datum/reagent/medicine/polypyr/overdose_process(mob/living/M) M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5) ..() - . = 1 + . = 1 diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index e91719504e..512b8a21a1 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1,5 +1,5 @@ /datum/reagent/blood - data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"= null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"= null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null,"quirks"=null) name = "Blood" id = "blood" value = 1 @@ -30,7 +30,7 @@ if(iscarbon(L)) var/mob/living/carbon/C = L var/blood_id = C.get_blood_id() - if((blood_id == "blood" || blood_id == "jellyblood") && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits)))) + if((HAS_TRAIT(C, TRAIT_NOMARROW) || blood_id == "blood" || blood_id == "jellyblood") && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits)))) C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM * C.blood_ratio) // we don't care about bloodtype here, we're just refilling the mob @@ -38,6 +38,8 @@ L.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) /datum/reagent/blood/on_mob_life(mob/living/carbon/C) //Because lethals are preferred over stamina. damnifino. + if((HAS_TRAIT(C, TRAIT_NOMARROW))) + return //We dont want vampires getting toxed from blood var/blood_id = C.get_blood_id() if((blood_id == "blood" || blood_id == "jellyblood")) if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) //we only care about bloodtype here because this is where the poisoning should be @@ -1116,6 +1118,8 @@ color = "#c2391d" /datum/reagent/iron/on_mob_life(mob/living/carbon/C) + if((HAS_TRAIT(C, TRAIT_NOMARROW))) + return if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) C.blood_volume += 0.01 //we'll have synthetics from medbay. ..() @@ -1654,7 +1658,7 @@ description = "Cheap and extremely common type of plant nutriment." color = "#376400" // RBG: 50, 100, 0 tox_prob = 10 - pH = 2 + pH = 2.5 /datum/reagent/plantnutriment/left4zednutriment name = "Left 4 Zed" @@ -1662,7 +1666,7 @@ description = "Unstable nutriment that makes plants mutate more often than usual." color = "#1A1E4D" // RBG: 26, 30, 77 tox_prob = 25 - pH = 1.5 + pH = 3.5 /datum/reagent/plantnutriment/robustharvestnutriment name = "Robust Harvest" @@ -1670,7 +1674,7 @@ description = "Very potent nutriment that prevents plants from mutating." color = "#9D9D00" // RBG: 157, 157, 0 tox_prob = 15 - pH = 1 + pH = 2.5 // GOON OTHERS diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index e77cf5b9dc..f97204b45e 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -33,7 +33,7 @@ toxpwr = 0 taste_description = "slime" taste_mult = 0.9 - pH = 2 + pH = 2.3 /datum/reagent/toxin/mutagen/reaction_mob(mob/living/carbon/M, method=TOUCH, reac_volume) if(!..()) @@ -220,7 +220,7 @@ color = "#49002E" // rgb: 73, 0, 46 toxpwr = 1 taste_mult = 1 - pH = 2 + pH = 2.7 /datum/reagent/toxin/plantbgone/reaction_obj(obj/O, reac_volume) if(istype(O, /obj/structure/alien/weeds)) @@ -986,4 +986,3 @@ to_chat(M, "[tox_message]") . = 1 ..() - diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 374f7715bb..607e0b5a4e 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -73,7 +73,7 @@ id = "synthtissue" results = list("synthtissue" = 5) required_reagents = list("synthflesh" = 1) - required_catalysts = list("nutriment" = 0.1) + required_catalysts = list("sugar" = 0.1) //FermiChem vars: OptimalTempMin = 305 // Lower area of bell curve for determining heat based rate reactions OptimalTempMax = 315 // Upper end for above @@ -86,13 +86,13 @@ CurveSharppH = 2.5 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = 0.01 // Temperature change per 1u produced HIonRelease = 0.015 // pH change per 1u reaction (inverse for some reason) - RateUpLim = 0.05 // Optimal/max rate possible if all conditions are perfect + RateUpLim = 0.1 // Optimal/max rate possible if all conditions are perfect FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics PurityMin = 0 /datum/chemical_reaction/synthtissue/FermiCreate(datum/reagents/holder, added_volume, added_purity) var/datum/reagent/synthtissue/St = holder.has_reagent("synthtissue") - var/datum/reagent/N = holder.has_reagent("nutriment") + var/datum/reagent/N = holder.has_reagent("sugar") if(!St) return if(holder.chem_temp > 320) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index b29a1c6809..ad1efc1da7 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -99,7 +99,6 @@ /datum/chemical_reaction/reagent_explosion/blackpowder_explosion/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) - sleep(rand(50,100)) ..(holder, created_volume, T) /datum/chemical_reaction/thermite diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index d475b118b2..618b74fffb 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -156,6 +156,10 @@ if(beaker_weakness_bitflag & PH_WEAK) if((reagents.pH < 1.5) || (reagents.pH > 12.5)) START_PROCESSING(SSobj, src) + else if((reagents.pH < -3) || (reagents.pH > 17)) + visible_message("[icon2html(src, viewers(src))] \The [src] is damaged by the super pH and begins to deform!") + reagents.pH = CLAMP(reagents.pH, -3, 17) + container_HP -= 1 /obj/item/reagent_containers/process() diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index fe35981bfe..61449fc153 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -107,8 +107,29 @@ else return ..() +/obj/item/reagent_containers/blood/attack(mob/M, mob/user, def_zone) + if(user.a_intent == INTENT_HELP && reagents.total_volume > 0) + if (user != M) + to_chat(user, "You force [M] to drink from the [src]") + user.visible_message("[user] forces [M] to drink from the [src].") + if(!do_mob(user, M, 50)) + return + else + if(!do_mob(user, M, 10)) + return + to_chat(user, "You take a sip from the [src].") + user.visible_message("[user] puts the [src] up to their mouth.") + if(reagents.total_volume <= 0) // Safety: In case you spam clicked the blood bag on yourself, and it is now empty (below will divide by zero) + return + var/gulp_size = 5 + var/fraction = min(gulp_size / reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) //checkLiked(fraction, M) // Blood isn't food, sorry. + reagents.trans_to(M, gulp_size) + playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) + ..() + /obj/item/reagent_containers/blood/bluespace name = "bluespace blood pack" desc = "Contains blood used for transfusion, this one has been made with bluespace technology to hold much more blood. Must be attached to an IV drip." icon_state = "bsbloodpack" - volume = 600 //its a blood bath! \ No newline at end of file + volume = 600 //its a blood bath! diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index afe48ab3fb..0ee131bc14 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -77,6 +77,11 @@ desc = "A small bottle of charcoal, which removes toxins and other chemicals from the bloodstream." list_reagents = list("charcoal" = 30) +/obj/item/reagent_containers/glass/bottle/cryoxadone + name = "cryoxadone bottle" + desc = "A small bottle of cryoxadone, heals most types of damage when used in extremely cold enviornments." + list_reagents = list("cryoxadone" = 30) + /obj/item/reagent_containers/glass/bottle/mutagen name = "unstable mutagen bottle" desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact." diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 85cb544667..9232bb69b3 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -56,11 +56,16 @@ /obj/item/reagent_containers/hypospray/combat name = "combat stimulant injector" - desc = "A modified air-needle autoinjector, used by support operatives to quickly heal injuries in combat." + 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 icon_state = "combat_hypo" - volume = 90 + volume = 100 ignore_flags = 1 // So they can heal their comrades. + list_reagents = list("epinephrine" = 30, "lesser_syndicate_nanites" = 40, "leporazine" = 15, "atropine" = 15) + +/obj/item/reagent_containers/hypospray/combat/omnizine // owned idiot + desc = "A modified air-needle autoinjector, used by underfunded support operatives to slowly heal injuries in combat and limp away from a fight." + volume = 90 list_reagents = list("epinephrine" = 30, "omnizine" = 30, "leporazine" = 15, "atropine" = 15) /obj/item/reagent_containers/hypospray/combat/nanites @@ -135,7 +140,7 @@ list_reagents = list("stimulants" = 50) /obj/item/reagent_containers/hypospray/medipen/stimulants/baseball - name = "the reason the syndicate major league team wins." + name = "the reason the syndicate major league team wins" desc = "They say drugs never win, but look where you are now, then where they are." icon_state = "baseballstim" volume = 50 @@ -338,8 +343,10 @@ return FALSE /obj/item/hypospray/mkii/AltClick(mob/user) + . = ..() if(vial) vial.attack_self(user) + return TRUE // Gunna allow this for now, still really don't approve - Pooj /obj/item/hypospray/mkii/emag_act(mob/user) diff --git a/code/modules/reagents/reagent_containers/medspray.dm b/code/modules/reagents/reagent_containers/medspray.dm index df7c7af225..b445c38ad9 100644 --- a/code/modules/reagents/reagent_containers/medspray.dm +++ b/code/modules/reagents/reagent_containers/medspray.dm @@ -100,3 +100,8 @@ name = "sterilizer spray" desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery." list_reagents = list("sterilizine" = 60) + +/obj/item/reagent_containers/medspray/synthtissue + name = "Synthtissue young culture spray" + desc = "Spray bottle loaded with synthtissue. Useful in synthtissue grafting surgeries." + list_reagents = list("synthtissue" = 60) diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm index 8d44a2a406..d09b18f244 100644 --- a/code/modules/reagents/reagent_containers/rags.dm +++ b/code/modules/reagents/reagent_containers/rags.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/toy.dmi' icon_state = "rag" item_flags = NOBLUDGEON - reagent_flags = OPENCONTAINER + reagent_flags = REFILLABLE | DRAINABLE amount_per_transfer_from_this = 5 possible_transfer_amounts = list() volume = 5 @@ -23,7 +23,7 @@ /obj/item/reagent_containers/rag/examine(mob/user) . = ..() if(reagents.total_volume) - . += "Alt-Click to squeeze the liquids out of it." + . += "It's soaked. Alt-Click to squeeze it dry, and perhaps gather the liquids into another held open container." /obj/item/reagent_containers/rag/afterattack(atom/A as obj|turf|area, mob/user,proximity) . = ..() @@ -85,15 +85,27 @@ /obj/item/reagent_containers/rag/AltClick(mob/user) . = ..() if(reagents.total_volume && user.canUseTopic(src, BE_CLOSE)) - to_chat(user, "You start squeezing the liquids out of \the [src]...") + to_chat(user, "You start squeezing \the [src] dry...") if(do_after(user, action_speed, TRUE, src)) - to_chat(user, "You squeeze \the [src] dry.") - var/atom/react_loc = get_turf(src) - if(ismob(react_loc)) - react_loc = react_loc.loc - if(react_loc) - reagents.reaction(react_loc, TOUCH) - reagents.clear_reagents() + var/msg = "You squeeze \the [src]" + var/obj/item/target + if(Adjacent(user)) //Allows the user to drain the reagents into a beaker if adjacent (no telepathy). + for(var/obj/item/I in user.held_items) + if(I == src) + continue + if(I.is_open_container() && !I.reagents.holder_full()) + target = I + break + if(!target) + msg += " dry" + reagents.reaction(get_turf(src), TOUCH) + reagents.clear_reagents() + else + msg += "'s liquids into \the [target]" + reagents.trans_to(target, reagents.total_volume) + to_chat(user, "[msg].") + return TRUE + /obj/item/reagent_containers/rag/towel name = "towel" diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 5875e821a3..7701e58616 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -135,6 +135,9 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) addtimer(CALLBACK(src, .proc/convey, affecting), 1) /obj/machinery/conveyor/proc/convey(list/affecting) + var/turf/T = get_step(src, movedir) + if(length(T.contents) > 150) + return for(var/atom/movable/A in affecting) if((A.loc == loc) && A.has_gravity()) A.ConveyorMove(movedir) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 88c03ee7d5..7025a649e6 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -102,9 +102,17 @@ return ..() /obj/machinery/disposal/proc/place_item_in_disposal(obj/item/I, mob/user) - I.forceMove(src) - user.visible_message("[user.name] places \the [I] into \the [src].", "You place \the [I] into \the [src].") - + if(istype(I, /obj/item/clothing/head/mob_holder)) + var/obj/item/clothing/head/mob_holder/H = I + var/mob/living/m = H.held_mob + H.release() + if(m) + user.start_pulling(m, 1) + stuff_mob_in(m,user) + return//you don't want this going into disposals ever + if(user.temporarilyRemoveItemFromInventory(I)) //double-checks never hurt + I.forceMove(src) + user.visible_message("[user.name] places \the [I] into \the [src].", "You place \the [I] into \the [src].") //mouse drop another mob or self /obj/machinery/disposal/MouseDrop_T(mob/living/target, mob/living/user) if(istype(target)) diff --git a/code/modules/recycling/disposal/holder.dm b/code/modules/recycling/disposal/holder.dm index dfc58f8c2d..2e36a9deaa 100644 --- a/code/modules/recycling/disposal/holder.dm +++ b/code/modules/recycling/disposal/holder.dm @@ -117,7 +117,7 @@ if(user.incapacitated()) return for(var/mob/M in range(5, get_turf(src))) - M.show_message("CLONG, clong!", 2) + M.show_message("CLONG, clong!", MSG_AUDIBLE) playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0) // called to vent all gas in holder to a location diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm index e5e3a6bb4f..94599e9c32 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm @@ -130,11 +130,19 @@ category = list("hacked", "Security") /datum/design/a357 - name = "Speed Loader (.357)" + name = "Revolver Bullet (.357)" id = "a357" build_type = AUTOLATHE - materials = list(MAT_METAL = 30000) - build_path = /obj/item/ammo_box/a357 + materials = list(MAT_METAL = 4000) + build_path = /obj/item/ammo_casing/a357 + category = list("hacked", "Security") + +/datum/design/a762 + name = "Rifle Bullet (7.62mm)" + id = "a762" + build_type = AUTOLATHE + materials = list(MAT_METAL = 5000) //need seclathe for clips + build_path = /obj/item/ammo_casing/a762 category = list("hacked", "Security") /datum/design/c10mm @@ -183,4 +191,4 @@ build_type = AUTOLATHE materials = list(MAT_METAL = 5500) build_path = /obj/item/clothing/head/foilhat - category = list("hacked", "Misc") \ No newline at end of file + category = list("hacked", "Misc") diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index e8c8bab09f..113a6262c9 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -696,15 +696,6 @@ construction_time = 120 category = list("Cyborg Upgrade Modules") -/datum/design/borg_upgrade_defibrillator - name = "Cyborg Upgrade (Defibrillator)" - id = "borg_upgrade_defibrillator" - build_type = MECHFAB - build_path = /obj/item/borg/upgrade/defib - materials = list(MAT_METAL=15000, MAT_GLASS=15000, MAT_SILVER=10000, MAT_GOLD=10000, MAT_TITANIUM=5000, MAT_DIAMOND=5000) - construction_time = 120 - category = list("Cyborg Upgrade Modules") - /datum/design/borg_upgrade_surgicalprocessor name = "Cyborg Upgrade (Surgical Processor)" id = "borg_upgrade_surgicalprocessor" diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 836b574f86..78f636d948 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -81,7 +81,6 @@ /obj/machinery/rnd/production/proc/do_print(path, amount, list/matlist, notify_admins, mob/user) if(notify_admins) - investigate_log("[key_name(user)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH) message_admins("[ADMIN_LOOKUPFLW(user)] has built [amount] of [path] at a [src]([type]).") for(var/i in 1 to amount) var/obj/O = new path(get_turf(src)) @@ -89,6 +88,7 @@ var/obj/item/I = O I.materials = matlist.Copy() SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]")) + investigate_log("[key_name(user)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH) /obj/machinery/rnd/production/proc/check_mat(datum/design/being_built, M) // now returns how many times the item can be built with the material if (!materials.mat_container) // no connected silo diff --git a/code/modules/research/nanites/nanite_hijacker.dm b/code/modules/research/nanites/nanite_hijacker.dm index 88779df447..920c42b411 100644 --- a/code/modules/research/nanites/nanite_hijacker.dm +++ b/code/modules/research/nanites/nanite_hijacker.dm @@ -14,6 +14,7 @@ return if(disk) eject() + return TRUE /obj/item/nanite_hijacker/examine(mob/user) . = ..() diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm index 2a6563fe52..0d27d7ba0d 100644 --- a/code/modules/research/nanites/nanite_programs.dm +++ b/code/modules/research/nanites/nanite_programs.dm @@ -238,12 +238,12 @@ datum/nanite_program/proc/on_mob_remove() else if(deactivation_code && code == deactivation_code && activated) deactivate() host_mob.investigate_log("[host_mob]'s [name] nanite program was deactivated by [source] with code [code].", INVESTIGATE_NANITES) - if(can_trigger && trigger_code && code == trigger_code) - trigger() - host_mob.investigate_log("[host_mob]'s [name] nanite program was triggered by [source] with code [code].", INVESTIGATE_NANITES) if(kill_code && code == kill_code) host_mob.investigate_log("[host_mob]'s [name] nanite program was deleted by [source] with code [code].", INVESTIGATE_NANITES) qdel(src) + else if(can_trigger && trigger_code && code == trigger_code) + trigger() + host_mob.investigate_log("[host_mob]'s [name] nanite program was triggered by [source] with code [code].", INVESTIGATE_NANITES) /datum/nanite_program/proc/get_timer_type_text() switch(timer_type) diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm index 50fb5efcb0..e2e1661ab7 100644 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ b/code/modules/research/nanites/nanite_programs/healing.dm @@ -98,7 +98,7 @@ /datum/nanite_program/blood_restoring/check_conditions() if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob - if(C.blood_volume >= (BLOOD_VOLUME_SAFE*C.blood_ratio)) + if(C.blood_volume >= (BLOOD_VOLUME_SAFE*C.blood_ratio) || (HAS_TRAIT(C, TRAIT_NOMARROW))) return FALSE else return FALSE diff --git a/code/modules/research/nanites/nanite_programs/utility.dm b/code/modules/research/nanites/nanite_programs/utility.dm index 44b85e4210..a269d01ac0 100644 --- a/code/modules/research/nanites/nanite_programs/utility.dm +++ b/code/modules/research/nanites/nanite_programs/utility.dm @@ -236,10 +236,14 @@ /datum/nanite_program/spreading/active_effect() if(prob(10)) var/list/mob/living/target_hosts = list() - for(var/mob/living/L in oview(5, host_mob)) + var/turf/T = get_turf(host_mob) + for(var/mob/living/L in range(5, host_mob)) if(!(MOB_ORGANIC in L.mob_biotypes) && !(MOB_UNDEAD in L.mob_biotypes)) continue + if(!disease_air_spread_walk(T, get_turf(L))) + continue target_hosts += L + target_hosts -= host_mob if(!target_hosts.len) return var/mob/living/infectee = pick(target_hosts) diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm index 3b242d28df..a7c8533521 100644 --- a/code/modules/research/nanites/nanite_remote.dm +++ b/code/modules/research/nanites/nanite_remote.dm @@ -35,6 +35,7 @@ update_icon() else to_chat(user, "Access denied.") + return TRUE /obj/item/nanite_remote/emag_act(mob/user) . = ..() diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index c0aa4a3127..05eeb564e5 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -400,7 +400,7 @@ display_name = "Cyborg Upgrades: Medical" description = "Medical upgrades for cyborgs." prereq_ids = list("adv_biotech", "robotics") - design_ids = list("borg_upgrade_defibrillator", "borg_upgrade_advhealth", "borg_upgrade_piercinghypospray", "borg_upgrade_highstrengthsynthesiser", "borg_upgrade_expandedsynthesiser", "borg_upgrade_pinpointer", "borg_upgrade_surgicalprocessor") + design_ids = list("borg_upgrade_advhealth", "borg_upgrade_piercinghypospray", "borg_upgrade_highstrengthsynthesiser", "borg_upgrade_expandedsynthesiser", "borg_upgrade_pinpointer", "borg_upgrade_surgicalprocessor") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) export_price = 5000 @@ -1043,14 +1043,21 @@ display_name = "Alien Technology" description = "Things used by the greys." prereq_ids = list("biotech","engineering") - boost_item_paths = list(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien, - /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, /obj/item/stock_parts/cell/infinite/abductor, - /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor_baton, /obj/item/abductor, /obj/item/stack/sheet/mineral/abductor) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) export_price = 20000 hidden = TRUE design_ids = list("alienalloy") +/datum/techweb_node/alientech/New() + . = ..() + boost_item_paths = typesof(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, + /obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/cautery/alien, + /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, + /obj/item/crowbar/abductor, /obj/item/multitool/abductor, + /obj/item/stock_parts/cell/infinite/abductor, /obj/item/weldingtool/abductor, + /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, + /obj/item/abductor, /obj/item/stack/sheet/mineral/abductor) + /datum/techweb_node/alien_bio id = "alien_bio" display_name = "Alien Biological Tools" diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 9c9542ed17..292aba6c05 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -904,10 +904,11 @@ datum/status_effect/stabilized/blue/on_remove() colour = "light pink" /datum/status_effect/stabilized/lightpink/on_apply() - owner.add_movespeed_modifier(MOVESPEED_ID_SLIME_STATUS, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) + ADD_TRAIT(owner, TRAIT_FREESPRINT, "stabilized_slime") return ..() /datum/status_effect/stabilized/lightpink/tick() + owner.adjustStaminaLoss(-4.5) for(var/mob/living/carbon/human/H in range(1, get_turf(owner))) if(H != owner && H.stat != DEAD && H.health <= 0 && !H.reagents.has_reagent("epinephrine")) to_chat(owner, "[linked_extract] pulses in sync with [H]'s heartbeat, trying to keep [H.p_them()] alive.") @@ -915,7 +916,8 @@ datum/status_effect/stabilized/blue/on_remove() return ..() /datum/status_effect/stabilized/lightpink/on_remove() - owner.remove_movespeed_modifier(MOVESPEED_ID_SLIME_STATUS) + REMOVE_TRAIT(owner, TRAIT_FREESPRINT, "stabilized_slime") + return ..() /datum/status_effect/stabilized/adamantine id = "stabilizedadamantine" diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index c143c4fb2d..205603e12e 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -28,6 +28,7 @@ var/datum/action/innate/monkey_recycle/monkey_recycle_action var/datum/action/innate/slime_scan/scan_action var/datum/action/innate/feed_potion/potion_action + var/datum/action/innate/hotkey_help/hotkey_help var/list/stored_slimes var/obj/item/slimepotion/slime/current_potion @@ -48,6 +49,7 @@ monkey_recycle_action = new scan_action = new potion_action = new + hotkey_help = new stored_slimes = list() RegisterSignal(src, COMSIG_ATOM_CONTENTS_DEL, .proc/on_contents_del) @@ -100,6 +102,27 @@ potion_action.Grant(user) actions += potion_action + if(hotkey_help) + hotkey_help.target = src + hotkey_help.Grant(user) + actions += hotkey_help + + RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, .proc/XenoSlimeClickCtrl) + RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, .proc/XenoSlimeClickAlt) + RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, .proc/XenoSlimeClickShift) + RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, .proc/XenoTurfClickShift) + RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, .proc/XenoTurfClickCtrl) + RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, .proc/XenoMonkeyClickCtrl) + +/obj/machinery/computer/camera_advanced/xenobio/remove_eye_control(mob/living/user) + UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL) + UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT) + UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT) + UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT) + UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL) + UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL) + ..() + /obj/machinery/computer/camera_advanced/xenobio/proc/on_contents_del(atom/deleted) if(current_potion == deleted) current_potion = null @@ -169,7 +192,7 @@ S.visible_message("[S] warps in!") X.stored_slimes -= S else - to_chat(owner, "Target is not near a camera. Cannot proceed.") + to_chat(owner, "Target is not near a camera. Cannot proceed.") /datum/action/innate/slime_pick_up name = "Pick up Slime" @@ -194,7 +217,7 @@ S.forceMove(X) X.stored_slimes += S else - to_chat(owner, "Target is not near a camera. Cannot proceed.") + to_chat(owner, "Target is not near a camera. Cannot proceed.") /datum/action/innate/feed_slime @@ -215,9 +238,11 @@ if (!QDELETED(food)) food.LAssailant = C X.monkeys -- - to_chat(owner, "[X] now has [X.monkeys] monkeys left.") + to_chat(owner, "[X] now has [X.monkeys] monkey(s) left.") + else + to_chat(owner, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.") else - to_chat(owner, "Target is not near a camera. Cannot proceed.") + to_chat(owner, "Target is not near a camera. Cannot proceed.") /datum/action/innate/monkey_recycle @@ -239,7 +264,7 @@ X.monkeys = round(X.monkeys + 0.2,0.1) qdel(M) else - to_chat(owner, "Target is not near a camera. Cannot proceed.") + to_chat(owner, "Target is not near a camera. Cannot proceed.") /datum/action/innate/slime_scan name = "Scan Slime" @@ -256,7 +281,7 @@ for(var/mob/living/simple_animal/slime/S in remote_eye.loc) slime_scan(S, C) else - to_chat(owner, "Target is not near a camera. Cannot proceed.") + to_chat(owner, "Target is not near a camera. Cannot proceed.") /datum/action/innate/feed_potion name = "Apply Potion" @@ -280,7 +305,10 @@ X.current_potion.attack(S, C) break else - to_chat(owner, "Target is not near a camera. Cannot proceed.") + to_chat(owner, "Target is not near a camera. Cannot proceed.") + + +//Demodularized Code /obj/item/disk/xenobio_console_upgrade name = "Xenobiology console upgrade disk" @@ -307,3 +335,169 @@ name = "Xenobiology console advanced slime upgrade disk" desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk." upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV) + + +//Xenobio Hotkeys Port + +/datum/action/innate/hotkey_help + name = "Hotkey Help" + icon_icon = 'icons/mob/actions/actions_silicon.dmi' + button_icon_state = "hotkey_help" + +/datum/action/innate/hotkey_help/Activate() + if(!target || !isliving(owner)) + return + to_chat(owner, "Click shortcuts:") + to_chat(owner, "Shift-click a slime to pick it up, or the floor to drop all held slimes. (Requires Basic Slime Console upgrade)") + to_chat(owner, "Ctrl-click a slime to scan it.") + to_chat(owner, "Alt-click a slime to feed it a potion. (Requires Advanced Slime Console upgrade)") + to_chat(owner, "Ctrl-click on a dead monkey to recycle it, or the floor to place a new monkey. (Requires Monkey Console upgrade)") + +// +// Alternate clicks for slime, monkey and open turf if using a xenobio console + +// Scans slime +/mob/living/simple_animal/slime/CtrlClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src) + ..() + +//Feeds a potion to slime +/mob/living/simple_animal/slime/AltClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_ALT, src) + ..() + +//Picks up slime +/mob/living/simple_animal/slime/ShiftClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_SHIFT, src) + ..() + +//Place slimes +/turf/open/ShiftClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_SHIFT, src) + ..() + +//Place monkey +/turf/open/CtrlClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_CTRL, src) + ..() + +//Pick up monkey +/mob/living/carbon/monkey/CtrlClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_MONKEY_CLICK_CTRL, src) + ..() + +// Scans slime +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/simple_animal/slime/S) + if(!GLOB.cameranet.checkTurfVis(S.loc)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/area/mobarea = get_area(S.loc) + if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + slime_scan(S, C) + +//Feeds a potion to slime +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/simple_animal/slime/S) + if(!(upgradetier & XENOBIO_UPGRADE_SLIMEADV)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEADV + to_chat(user, "This console does not have the advanced slime upgrade.") + return + if(!GLOB.cameranet.checkTurfVis(S.loc)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/mobarea = get_area(S.loc) + if(QDELETED(X.current_potion)) + to_chat(C, "No potion loaded.") + return + if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + X.current_potion.attack(S, C) + +//Picks up slime +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/simple_animal/slime/S) + if(!(upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC + to_chat(user, "This console does not have the basic slime upgrade.") + return + if(!GLOB.cameranet.checkTurfVis(S.loc)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/mobarea = get_area(S.loc) + if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + if(X.stored_slimes.len >= X.max_slimes) + to_chat(C, "Slime storage is full.") + return + if(S.ckey) + to_chat(C, "The slime wiggled free!") + return + if(S.buckled) + S.Feedstop(silent = TRUE) + S.visible_message("[S] vanishes in a flash of light!") + S.forceMove(X) + X.stored_slimes += S + +//Place slimes +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickShift(mob/living/user, turf/open/T) + if(!(upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC + to_chat(user, "This console does not have the basic slime upgrade.") + return + if(!GLOB.cameranet.checkTurfVis(T)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/turfarea = get_area(T) + if(turfarea.name == E.allowed_area || turfarea.xenobiology_compatible) + for(var/mob/living/simple_animal/slime/S in X.stored_slimes) + S.forceMove(T) + S.visible_message("[S] warps in!") + X.stored_slimes -= S + +//Place monkey +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickCtrl(mob/living/user, turf/open/T) + if(!(upgradetier & XENOBIO_UPGRADE_MONKEYS)) // CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS + to_chat(user, "This console does not have the monkey upgrade.") + return + if(!GLOB.cameranet.checkTurfVis(T)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/turfarea = get_area(T) + if(turfarea.name == E.allowed_area || turfarea.xenobiology_compatible) + if(X.monkeys >= 1) + var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(T, TRUE, C) + if (!QDELETED(food)) + food.LAssailant = C + X.monkeys-- + X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors + to_chat(C, "[X] now has [X.monkeys] monkey(s) stored.") + else + to_chat(C, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.") + +//Pick up monkey +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/monkey/M) + if(!(upgradetier & XENOBIO_UPGRADE_MONKEYS)) // CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS + to_chat(user, "This console does not have the monkey upgrade.") + return + if(!GLOB.cameranet.checkTurfVis(M.loc)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/mobarea = get_area(M.loc) + if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + if(!M.stat) + return + M.visible_message("[M] vanishes as [p_theyre()] reclaimed for recycling!") + X.monkeys = round(X.monkeys + 0.2,0.1) + qdel(M) + if (X.monkeys == (round(X.monkeys,1))) + to_chat(C, "[X] now has [X.monkeys] monkey(s) available.") diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index d12195cc52..b6e0db2646 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -85,7 +85,8 @@ /obj/item/stack/tile/bronze = /datum/species/golem/bronze, /obj/item/stack/sheet/cardboard = /datum/species/golem/cardboard, /obj/item/stack/sheet/leather = /datum/species/golem/leather, - /obj/item/stack/sheet/bone = /datum/species/golem/bone) + /obj/item/stack/sheet/bone = /datum/species/golem/bone, + /obj/item/stack/sheet/cotton/durathread = /datum/species/golem/durathread) if(istype(I, /obj/item/stack)) var/obj/item/stack/O = I diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index cd641adb33..f64b5e4d01 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -284,6 +284,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) var/datum/action/peepholeCancel/PHC = new user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) PHC.Grant(user) + return TRUE /turf/closed/indestructible/hoteldoor/check_eye(mob/user) if(get_dist(get_turf(src), get_turf(user)) >= 2) diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index a5f371ffc2..8108b121ae 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -182,3 +182,38 @@ if(charges <= 0) qdel(src) + +/obj/item/melee/touch_attack/nuclearfist + name = "\improper PURE MANLINESS" + desc = "SHOW THEM RAW POWER" + catchphrase = "I CAST FIST!" + on_use_sound = 'sound/weapons/nuclear_fist.ogg' + icon_state = "disintegrate" + item_state = "disintegrate" + +/obj/item/melee/touch_attack/nuclearfist/afterattack(atom/movable/target, mob/living/carbon/user, proximity) + if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //exploding after touching yourself would be bad + return + if(!user.can_speak_vocal()) + to_chat(user, "You can't get the words out!") + return + var/mob/M = target + var/atom/A = M.anti_magic_check() + if(A) + if(isitem(A)) + target.visible_message("[target]'s [A] glows brightly as it wards off the spell!") + user.visible_message("The feedback blows [user]'s arm off!","The spell bounces from [M]'s skin back into your arm!") + user.flash_act() + var/obj/item/bodypart/part = user.get_holding_bodypart_of_item(src) + if(part) + part.dismember() + return ..() + var/angle = dir2angle(get_dir(src, get_step_away(target, src))) + var/obj/item/projectile/magic/nuclear/P = new(get_turf(src)) + P.victim = target + target.forceMove(P) + P.setAngle(angle) + P.original = user + P.firer = user + P.fire() + return ..() \ No newline at end of file diff --git a/code/modules/spells/spell_types/touch_attacks.dm b/code/modules/spells/spell_types/touch_attacks.dm index 0ffe02cec2..794ed797ad 100644 --- a/code/modules/spells/spell_types/touch_attacks.dm +++ b/code/modules/spells/spell_types/touch_attacks.dm @@ -23,7 +23,7 @@ remove_hand(TRUE) to_chat(user, "You draw the power out of your hand.") return - + for(var/mob/living/carbon/C in targets) if(!attached_hand) if(ChargeHand(C)) @@ -71,3 +71,15 @@ action_icon_state = "statue" sound = 'sound/magic/fleshtostone.ogg' + +/obj/effect/proc_holder/spell/targeted/touch/nuclear_fist + name = "Nuclear Fist" + desc = "This spell channels raw manliness, allowing you punch your enemies across the galaxy, causing them to detonate violently if hitting any other living being midflight. Does not work while laying down." + hand_path = /obj/item/melee/touch_attack/nuclearfist + + school = "evocation" + charge_max = 200 + clothes_req = 0 + cooldown_min = 40 + + action_icon_state = "nuclearfist" \ No newline at end of file diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm index a2d5345ea4..fbfec404b2 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/advanced/revival.dm @@ -65,6 +65,9 @@ target.visible_message("...[target] wakes up, alive and aware!") target.emote("gasp") target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 50, 199) //MAD SCIENCE + for(var/obj/item/organ/O in target.internal_organs)//zap those buggers back to life! + if(O.organ_flags & ORGAN_FAILING) + O.applyOrganDamage(-5) return TRUE else user.visible_message("...[target.p_they()] convulses, then lies still.") diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 82790c1304..a1b74942e0 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -248,11 +248,12 @@ /obj/item/bodypart/proc/set_disabled(new_disabled) if(disabled == new_disabled) - return + return FALSE disabled = new_disabled owner.update_health_hud() //update the healthdoll owner.update_body() owner.update_canmove() + return TRUE //Updates an organ's brute/burn states for use by update_damage_overlays() //Returns 1 if we need to update overlays. 0 otherwise. @@ -654,20 +655,17 @@ /obj/item/bodypart/l_arm/set_disabled(new_disabled) . = ..() - if(disabled == new_disabled) + if(!.) return - if(disabled == BODYPART_DISABLED_DAMAGE) - if(owner.stat > UNCONSCIOUS) - owner.emote("scream") - if(. && (owner.stat > DEAD)) - to_chat(owner, "Your [name] is too damaged to function!") - if(held_index) - owner.dropItemToGround(owner.get_item_for_held_index(held_index)) - else if(disabled == BODYPART_DISABLED_PARALYSIS) - if(. && (owner.stat > DEAD)) - to_chat(owner, "You can't feel your [name]!") - if(held_index) - owner.dropItemToGround(owner.get_item_for_held_index(held_index)) + if(owner.stat < UNCONSCIOUS) + switch(disabled) + if(BODYPART_DISABLED_DAMAGE) + owner.emote("scream") + to_chat(owner, "Your [name] is too damaged to function!") + if(BODYPART_DISABLED_PARALYSIS) + to_chat(owner, "You can't feel your [name]!") + if(held_index) + owner.dropItemToGround(owner.get_item_for_held_index(held_index)) if(owner.hud_used) var/obj/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"] if(L) @@ -718,20 +716,17 @@ /obj/item/bodypart/r_arm/set_disabled(new_disabled) . = ..() - if(disabled == new_disabled) + if(!.) return - if(disabled == BODYPART_DISABLED_DAMAGE) - if(owner.stat > UNCONSCIOUS) - owner.emote("scream") - if(. && (owner.stat > DEAD)) - to_chat(owner, "Your [name] is too damaged to function!") - if(held_index) - owner.dropItemToGround(owner.get_item_for_held_index(held_index)) - else if(disabled == BODYPART_DISABLED_PARALYSIS) - if(. && (owner.stat > DEAD)) - to_chat(owner, "You can't feel your [name]!") - if(held_index) - owner.dropItemToGround(owner.get_item_for_held_index(held_index)) + if(owner.stat < UNCONSCIOUS) + switch(disabled) + if(BODYPART_DISABLED_DAMAGE) + owner.emote("scream") + to_chat(owner, "Your [name] is too damaged to function!") + if(BODYPART_DISABLED_PARALYSIS) + to_chat(owner, "You can't feel your [name]!") + if(held_index) + owner.dropItemToGround(owner.get_item_for_held_index(held_index)) if(owner.hud_used) var/obj/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"] if(R) @@ -783,15 +778,13 @@ /obj/item/bodypart/l_leg/set_disabled(new_disabled) . = ..() - if(disabled == new_disabled) + if(!. || owner.stat >= UNCONSCIOUS) return - if(disabled == BODYPART_DISABLED_DAMAGE) - if(owner.stat > UNCONSCIOUS) + switch(disabled) + if(BODYPART_DISABLED_DAMAGE) owner.emote("scream") - if(. && (owner.stat > DEAD)) to_chat(owner, "Your [name] is too damaged to function!") - else if(disabled == BODYPART_DISABLED_PARALYSIS) - if(. && (owner.stat > DEAD)) + if(BODYPART_DISABLED_PARALYSIS) to_chat(owner, "You can't feel your [name]!") @@ -845,15 +838,13 @@ /obj/item/bodypart/r_leg/set_disabled(new_disabled) . = ..() - if(disabled == new_disabled) + if(!. || owner.stat >= UNCONSCIOUS) return - if(disabled == BODYPART_DISABLED_DAMAGE) - if(owner.stat > UNCONSCIOUS) + switch(disabled) + if(BODYPART_DISABLED_DAMAGE) owner.emote("scream") - if(. && (owner.stat > DEAD)) to_chat(owner, "Your [name] is too damaged to function!") - else if(disabled == BODYPART_DISABLED_PARALYSIS) - if(. && (owner.stat > DEAD)) + if(BODYPART_DISABLED_PARALYSIS) to_chat(owner, "You can't feel your [name]!") /obj/item/bodypart/r_leg/digitigrade diff --git a/code/modules/surgery/emergency_cardioversion_recovery.dm b/code/modules/surgery/emergency_cardioversion_recovery.dm new file mode 100644 index 0000000000..25f499fa76 --- /dev/null +++ b/code/modules/surgery/emergency_cardioversion_recovery.dm @@ -0,0 +1,125 @@ +/datum/surgery/cardioversion + name = "Emergency Cardioversion Induction" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders, + /datum/surgery_step/incise_heart, /datum/surgery_step/ventricular_electrotherapy, /datum/surgery_step/close) + possible_locs = list(BODY_ZONE_CHEST) + +/datum/surgery_step/ventricular_electrotherapy + name = "ventricular electrotherapy" + implements = list(/obj/item/twohanded/shockpaddles = 90, /obj/item/defibrillator = 75, /obj/item/inducer = 55, /obj/item/stock_parts/cell = 25) //Just because the idea of a new player using the whole magine to defib is hillarious to me + time = 50 + repeatable = TRUE //So you can retry + +/datum/surgery_step/ventricular_electrotherapy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(istype(tool, /obj/item/twohanded/shockpaddles)) + var/obj/item/twohanded/shockpaddles/pads = tool + if(!pads.wielded) + to_chat(user, "You need to wield the paddles in both hands before you can use them!") + return FALSE + display_results(user, target, "You begin to apply the [tool] onto the heart directly...", + "[user] begin to prepare the heart for contact with the [tool].", + "[user] begin to prepare the heart for contact with the [tool]. ") + target.notify_ghost_cloning("Your heart is undergoing Emergency Cardioversion Induction Surgery!") + playsound(src, 'sound/machines/defib_charge.ogg', 75, 0) + +/datum/surgery_step/ventricular_electrotherapy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(istype(tool, /obj/item/twohanded/shockpaddles)) + var/obj/item/twohanded/shockpaddles/pads = tool + if(!pads.wielded) + return FALSE + var/mob/living/carbon/human/H = target + playsound(src, 'sound/machines/defib_zap.ogg', 75, 1, -1) + playsound(src, "bodyfall", 50, 1) + if(H.stat != DEAD) + display_results(user, target, "You can't use this procedure on the living! [H]'s body flops madly like a wild fish on the table from the current, and your crazed surgical methods.", + "[user] screws up, causing [H] to flop around violently as they're zapped!", + "[user] screws up, causing [H] to flop around violently as they're zapped!") + H.emote("scream") + H.electrocute_act(25, (tool), 1, FALSE, FALSE, FALSE, TRUE) + H.adjustFireLoss(10) + H.emote("flip") + H.Jitter(100) + return FALSE + display_results(user, target, "You attach the [tool] to [target]'s heart and prepare to pulse.", + "[user] attaches the [tool] to [H]'s heart and prepares to pulse.", + "") + H.adjustBruteLoss(10) + var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart) + if(heart.organ_flags & ORGAN_FAILING) + H.adjustOrganLoss(ORGAN_SLOT_HEART, -15) + var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) + if(BR.organ_flags & ORGAN_FAILING) + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) + H.electrocute_act(0, (tool), 1, FALSE, FALSE, FALSE, TRUE) + //If we're using a defib, let the defib handle the revive. + if(istype(tool, /obj/item/twohanded/shockpaddles)) + return + //Otherwise, we're ad hocing it + if(!(do_after(user, 50, target = target))) + return FALSE + if(!ghetto_defib(user, H, tool)) + playsound(src, 'sound/machines/defib_failed.ogg', 50, 0) + return FALSE + log_combat(user, H, "revived", "Emergency Cardioversion Induction") + return TRUE + +/datum/surgery_step/ventricular_electrotherapy/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + playsound(src, 'sound/machines/defib_zap.ogg', 75, 1, -1) + playsound(src, "bodyfall", 50, 1) + var/mob/living/carbon/human/H = target + display_results(user, target, "You screw up, sending a current through their body!", + "[user] screws up, causing [H] to flop around violently as they're zapped!", + "[user] screws up, causing [H] to flop around violently as they're zapped!") + H.electrocute_act(25, (tool), 1, FALSE, FALSE, FALSE, TRUE) + H.adjustFireLoss(10) + H.emote("flip") + H.adjustOrganLoss(ORGAN_SLOT_HEART, 10) + +/datum/surgery_step/ventricular_electrotherapy/proc/ghetto_defib(mob/user, mob/living/carbon/human/H, obj/item/tool) + H.visible_message("[H]'s body convulses a bit.") + var/total_brute = H.getBruteLoss() + var/total_burn = H.getFireLoss() + var/failed + var/tdelta = round(world.time - H.timeofdeath) + + if (H.suiciding || (HAS_TRAIT(H, TRAIT_NOCLONE))) + failed = "The heart is zapped by the [tool], but nothing happens. You feel like the spark of life has fully left [H]." + else if (H.hellbound) + failed = "The heart is zapped by the [tool], but nothing happens. You notice a small tatoo with the words \"Property of Satan\" branded just above the right ventricle." + else if(tdelta > (DEFIB_TIME_LIMIT * 10)) + failed = "The heart is zapped by the [tool], but nothing happens. It appears their body decomposed beyond repair." + else if(total_burn >= 180 || total_brute >= 180) + failed = "The [tool] zaps the heart, inducing a sudden contraction, but it appears [H]'s body is too damaged to revive presently." + else if(H.get_ghost()) + failed = "The [tool] zaps the heart, inducing several contractions before dying down, but there's no spark of life in [H]'s eyes. It may be worth it to try again, however." + else + var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) + if(BR) + if(H.suiciding || BR.brainmob?.suiciding) + failed = "The heart is zapped by the [tool], but nothing happens. You feel like the spark of life has fully left [H]." + else + failed = "The [tool] zaps the heart, restarting the heart, but without a brain the contractions quickly die out." + + + if(failed) + to_chat(user, failed) + playsound(src, 'sound/machines/defib_failed.ogg', 50, 0) + else + //If the body has been fixed so that they would not be in crit when defibbed, give them oxyloss to put them back into crit + if (H.health > HALFWAYCRITDEATH) + H.adjustOxyLoss(H.health - HALFWAYCRITDEATH, 0) + else + var/overall_damage = total_brute + total_burn + H.getToxLoss() + H.getOxyLoss() + var/mobhealth = H.health + H.adjustOxyLoss((mobhealth - HALFWAYCRITDEATH) * (H.getOxyLoss() / overall_damage), 0) + H.adjustToxLoss((mobhealth - HALFWAYCRITDEATH) * (H.getToxLoss() / overall_damage), 0) + H.adjustFireLoss((mobhealth - HALFWAYCRITDEATH) * (total_burn / overall_damage), 0) + H.adjustBruteLoss((mobhealth - HALFWAYCRITDEATH) * (total_brute / overall_damage), 0) + H.updatehealth() // Previous "adjust" procs don't update health, so we do it manually. + H.visible_message("The [tool] zaps the heart, inducing several contractions before speeding up into a regular rhythm, [H]'s eyes snapping open with a loud gasp!") + playsound(src, 'sound/machines/defib_success.ogg', 50, 0) + H.set_heartattack(FALSE) + H.revive() + H.emote("gasp") + H.Jitter(100) + SEND_SIGNAL(H, COMSIG_LIVING_MINOR_SHOCK) diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index f7a06af388..28e813ccac 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -22,6 +22,7 @@ "[user] begins to perform surgery on [target]'s eyes.") /datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/obj/item/organ/eyes/E = target.getorganslot(ORGAN_SLOT_EYES) display_results(user, target, "You succeed in fixing [target]'s eyes.", "[user] successfully fixes [target]'s eyes!", "[user] completes the surgery on [target]'s eyes.") @@ -29,7 +30,7 @@ target.set_blindness(0) target.cure_nearsighted(list(EYE_DAMAGE)) target.blur_eyes(35) //this will fix itself slowly. - target.set_eye_damage(0) + E.setOrganDamage(0) return TRUE /datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/graft_synthtissue.dm b/code/modules/surgery/graft_synthtissue.dm index 7540b2cd94..86b2a8e909 100644 --- a/code/modules/surgery/graft_synthtissue.dm +++ b/code/modules/surgery/graft_synthtissue.dm @@ -49,7 +49,7 @@ to_chat(user, "There's not enough synthtissue to perform the operation! There needs to be at least 10u.") return -1 - if((chosen_organ.organ_flags & ORGAN_FAILING) && !(Sf.data["grown_volume"] >= 115)) + if((chosen_organ.organ_flags & ORGAN_FAILING) && !(Sf.data["grown_volume"] >= 80)) to_chat(user, "[chosen_organ] is too damaged to graft onto!") return -1 diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 81627104e8..65172a1545 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -44,6 +44,9 @@ hunger_threshold = NUTRITION_LEVEL_HUNGRY poison_amount = 10 +#define MAX_HEAL_COOLDOWN 15 MINUTES +#define DEF_CONVALESCENCE_TIME 15 SECONDS + /obj/item/organ/cyberimp/chest/reviver name = "Reviver implant" desc = "This implant will attempt to revive and heal you if you lose consciousness. For the faint of heart!" @@ -51,43 +54,49 @@ implant_color = "#AD0000" slot = ORGAN_SLOT_HEART_AID var/revive_cost = 0 - var/reviving = 0 + var/reviving = FALSE var/cooldown = 0 + var/convalescence_time = 0 /obj/item/organ/cyberimp/chest/reviver/on_life() if(reviving) - if(owner.stat == UNCONSCIOUS) - addtimer(CALLBACK(src, .proc/heal), 30) + var/do_heal = world.time < convalescence_time + if(revive_cost >= MAX_HEAL_COOLDOWN) + do_heal = FALSE + else if(owner.stat && owner.stat != DEAD) + do_heal = TRUE + else if(!do_heal) + convalescence_time = world.time + DEF_CONVALESCENCE_TIME + if(do_heal) + addtimer(CALLBACK(src, .proc/heal), 3 SECONDS) else cooldown = revive_cost + world.time reviving = FALSE to_chat(owner, "Your reviver implant shuts down and starts recharging. It will be ready again in [DisplayTimeText(revive_cost)].") return - if(cooldown > world.time) - return - if(owner.stat != UNCONSCIOUS) - return - if(owner.suiciding) + if(cooldown > world.time || owner.stat == CONSCIOUS || owner.stat == DEAD || owner.suiciding) return revive_cost = 0 + convalescence_time = 0 reviving = TRUE to_chat(owner, "You feel a faint buzzing as your reviver implant starts patching your wounds...") /obj/item/organ/cyberimp/chest/reviver/proc/heal() if(owner.getOxyLoss()) owner.adjustOxyLoss(-5) - revive_cost += 5 + revive_cost += 0.5 SECONDS if(owner.getBruteLoss()) owner.adjustBruteLoss(-2) - revive_cost += 40 + revive_cost += 4 SECONDS if(owner.getFireLoss()) owner.adjustFireLoss(-2) - revive_cost += 40 + revive_cost += 4 SECONDS if(owner.getToxLoss()) owner.adjustToxLoss(-1) - revive_cost += 40 + revive_cost += 4 SECONDS + /obj/item/organ/cyberimp/chest/reviver/emp_act(severity) . = ..() @@ -95,25 +104,27 @@ return if(reviving) - revive_cost += 200 + revive_cost += 20 SECONDS else - cooldown += 200 + cooldown += 20 SECONDS if(ishuman(owner)) var/mob/living/carbon/human/H = owner if(H.stat != DEAD && prob(50 / severity) && H.can_heartattack()) H.set_heartattack(TRUE) to_chat(H, "You feel a horrible agony in your chest!") - addtimer(CALLBACK(src, .proc/undo_heart_attack), 600 / severity) + addtimer(CALLBACK(src, .proc/undo_heart_attack), 60 SECONDS / severity) /obj/item/organ/cyberimp/chest/reviver/proc/undo_heart_attack() var/mob/living/carbon/human/H = owner - if(!istype(H)) + if(!H || !istype(H)) return H.set_heartattack(FALSE) - if(H.stat == CONSCIOUS) + if(H.stat == CONSCIOUS || H.stat == SOFT_CRIT) to_chat(H, "You feel your heart beating again!") +#undef MAX_HEAL_COOLDOWN +#undef DEF_CONVALESCENCE_TIME /obj/item/organ/cyberimp/chest/thrusters name = "implantable thrusters set" diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index d877af7451..2ddbd672c5 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -21,7 +21,6 @@ var/sight_flags = 0 var/see_in_dark = 2 - var/eye_damage = 0 var/tint = 0 var/eye_color = "" //set to a hex code to override a mob's eye color var/old_eye_color = "fff" @@ -31,33 +30,34 @@ var/damaged = FALSE //damaged indicates that our eyes are undergoing some level of negative effect /obj/item/organ/eyes/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = FALSE) - ..() + . = ..() + if(!.) + return if(damage == initial(damage)) clear_eye_trauma() if(ishuman(owner)) - var/mob/living/carbon/human/HMN = owner - old_eye_color = HMN.eye_color + var/mob/living/carbon/human/H = owner + old_eye_color = H.eye_color if(eye_color) - HMN.eye_color = eye_color - HMN.regenerate_icons() + H.eye_color = eye_color else - eye_color = HMN.eye_color - if(HAS_TRAIT(HMN, TRAIT_NIGHT_VISION) && !lighting_alpha) - lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT - see_in_dark = 8 + eye_color = H.eye_color + if(!special) + H.dna?.species?.handle_body() //regenerate eyeballs overlays. M.update_tint() owner.update_sight() - /obj/item/organ/eyes/Remove(mob/living/carbon/M, special = 0) clear_eye_trauma() - ..() + . = ..() if(ishuman(M) && eye_color) - var/mob/living/carbon/human/HMN = M - HMN.eye_color = old_eye_color - HMN.regenerate_icons() - M.update_tint() - M.update_sight() + var/mob/living/carbon/human/H = M + H.eye_color = old_eye_color + if(!special) + H.dna.species.handle_body() + if(!special) + M.update_tint() + M.update_sight() /obj/item/organ/eyes/on_life() ..() diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 94512dc597..5b74b58cd0 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -6,7 +6,7 @@ slot = ORGAN_SLOT_HEART healing_factor = STANDARD_ORGAN_HEALING - decay_factor = 3 * STANDARD_ORGAN_DECAY //designed to fail about 5 minutes after death + decay_factor = 2.5 * STANDARD_ORGAN_DECAY //designed to fail about 5 minutes after death low_threshold_passed = "Prickles of pain appear then die out from within your chest..." high_threshold_passed = "Something inside your chest hurts, and the pain isn't subsiding. You notice yourself breathing far faster than before." @@ -55,6 +55,11 @@ update_icon() return 1 +/obj/item/organ/heart/proc/HeartStrengthMessage() + if(beating) + return "a healthy" + return "an unstable" + /obj/item/organ/heart/prepare_eat() var/obj/S = ..() S.icon_state = "[icon_base]-off" diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 466f618cf3..a180bd947e 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -25,6 +25,7 @@ var/now_fixed var/high_threshold_cleared var/low_threshold_cleared + rad_flags = RAD_NO_CONTAMINATE /obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) if(!iscarbon(M) || owner == M) @@ -95,13 +96,12 @@ //Checks to see if the organ is frozen from temperature /obj/item/organ/proc/is_cold() - var/freezing_objects = list(/obj/structure/closet/crate/freezer, /obj/structure/closet/secure_closet/freezer, /obj/structure/bodycontainer, /obj/item/autosurgeon) if(istype(loc, /obj/))//Freezer of some kind, I hope. - if(is_type_in_list(loc, freezing_objects)) + if(is_type_in_typecache(loc, GLOB.freezing_objects)) if(!(organ_flags & ORGAN_FROZEN))//Incase someone puts them in when cold, but they warm up inside of the thing. (i.e. they have the flag, the thing turns it off, this rights it.) organ_flags |= ORGAN_FROZEN return TRUE - return + return (organ_flags & ORGAN_FROZEN) //Incase something else toggles it var/local_temp if(istype(loc, /turf/))//Only concern is adding an organ to a freezer when the area around it is cold. @@ -111,7 +111,7 @@ else if(istype(loc, /mob/) && !owner) var/mob/M = loc - if(is_type_in_list(M.loc, freezing_objects)) + if(is_type_in_typecache(M.loc, GLOB.freezing_objects)) if(!(organ_flags & ORGAN_FROZEN)) organ_flags |= ORGAN_FROZEN return TRUE @@ -121,7 +121,7 @@ if(owner) //Don't interfere with bodies frozen by structures. - if(is_type_in_list(owner.loc, freezing_objects)) + if(is_type_in_typecache(owner.loc, GLOB.freezing_objects)) if(!(organ_flags & ORGAN_FROZEN)) organ_flags |= ORGAN_FROZEN return TRUE @@ -232,6 +232,8 @@ if(delta > 0) if(damage >= maxHealth) organ_flags |= ORGAN_FAILING + if(owner) + owner.med_hud_set_status() return now_failing if(damage > high_threshold && prev_damage <= high_threshold) return high_threshold_passed @@ -239,6 +241,8 @@ return low_threshold_passed else organ_flags &= ~ORGAN_FAILING + if(owner) + owner.med_hud_set_status() if(!owner)//Processing is stopped when the organ is dead and outside of someone. This hopefully should restart it if a removed organ is repaired outside of a body. START_PROCESSING(SSobj, src) if(prev_damage > low_threshold && damage <= low_threshold) @@ -273,6 +277,12 @@ var/has_liver = (!(NOLIVER in dna.species.species_traits)) var/has_stomach = (!(NOSTOMACH in dna.species.species_traits)) + for(var/obj/item/organ/O in internal_organs) + if(O.organ_flags & ORGAN_FAILING) + O.setOrganDamage(0) + if(only_one) + return TRUE + if(has_liver && !getorganslot(ORGAN_SLOT_LIVER)) var/obj/item/organ/liver/LI @@ -362,3 +372,15 @@ tail.Insert(src) if(only_one) return TRUE + + +/obj/item/organ/random + name = "Illegal organ" + desc = "Something hecked up" + +/obj/item/organ/random/Initialize() + ..() + var/list = list(/obj/item/organ/tongue, /obj/item/organ/brain, /obj/item/organ/heart, /obj/item/organ/liver, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/tail, /obj/item/organ/stomach) + var/newtype = pick(list) + new newtype(loc) + return INITIALIZE_HINT_QDEL diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 6b435f282f..760cd97f08 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -22,6 +22,7 @@ /datum/language/ratvar, /datum/language/aphasia, /datum/language/slime, + /datum/language/vampiric, )) healing_factor = STANDARD_ORGAN_HEALING*5 //Fast!! decay_factor = STANDARD_ORGAN_DECAY/2 @@ -124,6 +125,32 @@ taste_sensitivity = 101 // ayys cannot taste anything. maxHealth = 120 //Ayys probe a lot modifies_speech = TRUE + var/mothership + +/obj/item/organ/tongue/abductor/attack_self(mob/living/carbon/human/H) + if(!istype(H)) + return + + var/obj/item/organ/tongue/abductor/T = H.getorganslot(ORGAN_SLOT_TONGUE) + if(!istype(T)) + return + + if(T.mothership == mothership) + to_chat(H, "[src] is already attuned to the same channel as your own.") + return + + H.visible_message("[H] holds [src] in their hands, and concentrates for a moment.", "You attempt to modify the attunation of [src].") + if(do_after(H, delay=15, target=src)) + to_chat(H, "You attune [src] to your own channel.") + mothership = T.mothership + +/obj/item/organ/tongue/abductor/examine(mob/M) + . = ..() + if(HAS_TRAIT(M, TRAIT_ABDUCTOR_TRAINING) || HAS_TRAIT(M.mind, TRAIT_ABDUCTOR_TRAINING) || isobserver(M)) + if(!mothership) + . += "It is not attuned to a specific mothership." + else + . += "It is attuned to [mothership]." /obj/item/organ/tongue/abductor/handle_speech(datum/source, list/speech_args) //Hacks diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 83b0eb4d17..dedff3ae04 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -754,7 +754,7 @@ var/static/regex/punish_words = regex("bad boy|bad girl|bad pet|bad job|spot of bother|gone and done it now|blast it|buggered it up") //phase 0 var/static/regex/saymyname_words = regex("say my name|who am i|whoami") - var/static/regex/wakeup_words = regex("revert|awaken|snap|attention") + var/static/regex/wakeup_words = regex("revert|awaken|snap|attention") //phase1 var/static/regex/petstatus_words = regex("how are you|what is your status|are you okay") var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") @@ -1143,7 +1143,7 @@ switch(E.phase) if(2 to INFINITY) playsound(get_turf(H), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) //I'm very tempted to write a Fermis clause that makes them merowr.ogg if it's me. But, I also don't think snowflakism is okay. I would've gotten away for it too, if it wern't for my morals. - H.emote("me", 1, "lets out a nya!") + H.emote("me", EMOTE_VISIBLE, "lets out a nya!") E.cooldown += 1 //SLEEP @@ -1230,7 +1230,7 @@ var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) if (E.phase == 3) var/speaktrigger = "" - C.emote("me", 1, "whispers something quietly.") + C.emote("me", EMOTE_VISIBLE, "whispers something quietly.") if (get_dist(user, C) > 1)//Requires user to be next to their pet. to_chat(user, "You need to be next to your pet to hear them!") continue @@ -1253,7 +1253,7 @@ to_chat(user, "[H] seems incapable of being implanted with triggers.") continue else - user.emote("me", 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.") + user.emote("me", EMOTE_VISIBLE, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.") user.SetStun(1000)//Hands are handy, so you have to stay still H.SetStun(1000) if (E.mental_capacity >= 5) @@ -1294,7 +1294,7 @@ to_chat(user, "[H] seems incapable of being implanted with an echoing phrase.") continue else - user.emote("me", 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.") + user.emote("me", EMOTE_VISIBLE, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.") user.SetStun(1000)//Hands are handy, so you have to stay still H.SetStun(1000) var/trigger = stripped_input(user, "Enter the loop phrase", MAX_MESSAGE_LEN) @@ -1317,7 +1317,7 @@ to_chat(user, "You need to be next to your pet to give them a new objective!") continue else - user.emote("me", 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") + user.emote("me", EMOTE_VISIBLE, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") user.SetStun(1000)//So you can't run away! H.SetStun(1000) if (E.mental_capacity >= 200) diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index aef3b31895..2de04cf0df 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1,13 +1,9 @@ -GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) - -/proc/get_uplink_items(var/datum/game_mode/gamemode = null, allow_sales = TRUE, allow_restricted = TRUE) - var/list/filtered_uplink_items = list() +/proc/get_uplink_items(datum/game_mode/gamemode, allow_sales = TRUE, allow_restricted = TRUE) + var/list/filtered_uplink_items = GLOB.uplink_categories.Copy() // list of uplink categories without associated values. var/list/sale_items = list() for(var/path in GLOB.uplink_items) var/datum/uplink_item/I = new path - if(!I.item) - continue if(I.include_modes.len) if(!gamemode && SSticker.mode && !(SSticker.mode.type in I.include_modes)) continue @@ -23,9 +19,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) if (I.restricted && !allow_restricted) continue - if(!filtered_uplink_items[I.category]) - filtered_uplink_items[I.category] = list() - filtered_uplink_items[I.category][I.name] = I + LAZYSET(filtered_uplink_items[I.category], I.name, I) + if(I.limited_stock < 0 && !I.cant_discount && I.item && I.cost > 1) sale_items += I if(allow_sales) @@ -45,9 +40,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) A.desc += " Normally costs [initial(A.cost)] TC. All sales final. [pick(disclaimer)]" A.item = I.item - if(!filtered_uplink_items[A.category]) - filtered_uplink_items[A.category] = list() - filtered_uplink_items[A.category][A.name] = A + LAZYSET(filtered_uplink_items[A.category], A.name, A) + + for(var/category in filtered_uplink_items) + if(!filtered_uplink_items[category]) //empty categories with no associated uplink item. Remove. + filtered_uplink_items -= category + return filtered_uplink_items @@ -106,16 +104,77 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) to_chat(user, "[A] materializes onto the floor.") return A -//Discounts (dynamically filled above) -/datum/uplink_item/discounts - category = "Discounted Gear" +/* + Uplink Categories: + Due to how the typesof() in-built byond proc works, it should be kept in mind + the order categories are displayed in the uplink UI is same to the order they are loaded in the code. + I trust no extra filter is needed as long as they are all contained within the following lines. + When adding new uplink categories, please keep them separate from their sub paths here and without set item. + Failure to comply may result in the new categories being listed at the bottom of the UI. +*/ + +/datum/uplink_item/holiday + category = "Holiday" -//All bundles and telecrystals /datum/uplink_item/bundles_TC category = "Bundles and Telecrystals" surplus = 0 cant_discount = TRUE +/datum/uplink_item/dangerous + category = "Conspicuous and Dangerous Weapons" + +/datum/uplink_item/stealthy_weapons + category = "Stealthy and Inconspicuous Weapons" + +/datum/uplink_item/ammo + category = "Ammunition" + surplus = 40 + +/datum/uplink_item/explosives + category = "Grenades and Explosives" + +/datum/uplink_item/support + category = "Support and Mechanized Exosuits" + surplus = 0 + include_modes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/suits + category = "Space Suits, Hardsuits and Clothing" + surplus = 40 + +/datum/uplink_item/stealthy_tools + category = "Stealth and Camouflage Items" + +/datum/uplink_item/device_tools + category = "Devices and Tools" + +/datum/uplink_item/implants + category = "Implants" + surplus = 50 + +/datum/uplink_item/role_restricted + category = "Role-Restricted" + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) + surplus = 0 + +/datum/uplink_item/badass + category = "(Pointless) Badassery" + surplus = 0 + +//Discounts (dynamically filled above) +/datum/uplink_item/discounts + category = "Discounted Gear" + + +/* + Uplink Items: + Unlike categories, uplink item entries are automatically sorted alphabetically on server init in a global list, + When adding new entries to the file, please keep them sorted by category. +*/ + +//All bundles and telecrystals + /datum/uplink_item/bundles_TC/chemical name = "Bioterror bundle" desc = "For the madman: Contains a handheld Bioterror chem sprayer, a Bioterror foam grenade, a box of lethal chemicals, a dart pistol, \ @@ -288,8 +347,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 20 // Dangerous Items -/datum/uplink_item/dangerous - category = "Conspicuous and Dangerous Weapons" /datum/uplink_item/dangerous/pistol name = "Stechkin Pistol" @@ -544,8 +601,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 10 // Stealthy Weapons -/datum/uplink_item/stealthy_weapons - category = "Stealthy and Inconspicuous Weapons" /datum/uplink_item/stealthy_weapons/combatglovesplus name = "Combat Gloves Plus" @@ -564,12 +619,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 13 surplus = 0 -/datum/uplink_item/dangerous/phantomthief - name = "Syndicate Mask" - desc = "A cheap plastic mask fitted with an adrenaline autoinjector, which can be used by simply tensing your muscles" - item = /obj/item/clothing/glasses/phantomthief/syndicate - cost = 2 - /datum/uplink_item/stealthy_weapons/dart_pistol name = "Dart Pistol" desc = "A miniaturized version of a normal syringe gun. It is very quiet when fired and can fit into any \ @@ -671,9 +720,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes cost = 6 // Ammunition -/datum/uplink_item/ammo - category = "Ammunition" - surplus = 40 /datum/uplink_item/ammo/pistol name = "10mm Handgun Magazine" @@ -765,12 +811,11 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/ammo/revolver name = ".357 Speed Loader" - desc = "A speed loader that contains seven additional .357 Magnum rounds; usable with the Syndicate revolver. \ + desc = "A speed loader that contains seven additional .357 Magnum rounds, and can be further reloaded with individual bullets; usable with the Syndicate revolver. \ For when you really need a lot of things dead." item = /obj/item/ammo_box/a357 cost = 3 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) - illegal_tech = FALSE /datum/uplink_item/ammo/revolver/ap name = ".357 Armor Piercing Speed Loader" @@ -923,8 +968,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes cost = 1 include_modes = list(/datum/game_mode/nuclear) -/datum/uplink_item/explosives - category = "Grenades and Explosives" +//Grenades and Explosives /datum/uplink_item/explosives/bioterrorfoam name = "Bioterror Foam Grenade" @@ -1081,10 +1125,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes //Support and Mechs -/datum/uplink_item/support - category = "Support and Mechanized Exosuits" - surplus = 0 - include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/support/clown_reinforcement name = "Clown Reinforcements" @@ -1155,8 +1195,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes cost = 140 // Stealth Items -/datum/uplink_item/stealthy_tools - category = "Stealth and Camouflage Items" /datum/uplink_item/stealthy_tools/agent_card name = "Agent Identification Card" @@ -1266,17 +1304,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes item = /obj/item/jammer cost = 5 -/*/datum/uplink_item/stealthy_tools/syndi_borer - name = "Syndicate Brain Slug" - desc = "A small cortical borer, modified to be completely loyal to the owner. \ - Genetically infertile, these brain slugs can assist medically in a support role, or take direct action \ - to assist their host." - item = /obj/item/antag_spawner/syndi_borer - refundable = TRUE - cost = 10 - surplus = 20 //Let's not have this be too common - exclude_modes = list(/datum/game_mode/nuclear) */ - /datum/uplink_item/stealthy_tools/smugglersatchel name = "Smuggler's Satchel" desc = "This satchel is thin enough to be hidden in the gap between plating and tiling; great for stashing \ @@ -1287,9 +1314,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes surplus = 30 //Space Suits and Hardsuits -/datum/uplink_item/suits - category = "Space Suits, Hardsuits and Clothing" - surplus = 40 /datum/uplink_item/suits/turtlenck name = "Tactical Turtleneck" @@ -1364,8 +1388,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes exclude_modes = list() // Devices and Tools -/datum/uplink_item/device_tools - category = "Devices and Tools" /datum/uplink_item/device_tools/emag name = "Cryptographic Sequencer" @@ -1380,6 +1402,12 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes item = /obj/item/emagrecharge cost = 2 +/datum/uplink_item/device_tools/phantomthief + name = "Syndicate Mask" + desc = "A cheap plastic mask fitted with an adrenaline autoinjector, which can be used by simply tensing your muscles" + item = /obj/item/clothing/glasses/phantomthief/syndicate + cost = 2 + /datum/uplink_item/device_tools/cutouts name = "Adaptive Cardboard Cutouts" desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. \ @@ -1543,7 +1571,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes desc = "This first aid kit is a suspicious brown and red. Included is a combat stimulant injector \ for rapid healing, a medical night vision HUD for quick identification of injured personnel, \ and other supplies helpful for a field medic." - item = /obj/item/storage/firstaid/tactical + item = /obj/item/storage/firstaid/tactical/nukeop cost = 4 include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) @@ -1557,10 +1585,17 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/device_tools/surgerybag_adv name = "Advanced Syndicate Surgery Duffel Bag" desc = "The Syndicate surgery duffel bag is a toolkit containing all advanced surgery tools, surgical drapes, \ - a Syndicate brand MMI, a straitjacket, a muzzle, and a full Syndicate Combat Medic Kit." + a Syndicate brand MMI, a straitjacket, a muzzle, and an outdated, yet still useful Combat Medic Kit." item = /obj/item/storage/backpack/duffelbag/syndie/surgery_adv cost = 10 +/datum/uplink_item/device_tools/brainwash_disk + name = "Brainwashing Surgery Program" + desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \ + Insert into an Operating Console to enable the procedure." + item = /obj/item/disk/surgery/brainwashing + cost = 3 + /datum/uplink_item/device_tools/encryptionkey name = "Syndicate Encryption Key" desc = "A key that, when inserted into a radio headset, allows you to listen to all station department channels \ @@ -1599,9 +1634,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes // Implants -/datum/uplink_item/implants - category = "Implants" - surplus = 50 /datum/uplink_item/implants/adrenal name = "Adrenal Implant" @@ -1698,10 +1730,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes include_modes = list(/datum/game_mode/nuclear) // Role-specific items -/datum/uplink_item/role_restricted - category = "Role-Restricted" - exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) - surplus = 0 /datum/uplink_item/role_restricted/ancient_jumpsuit name = "Ancient Jumpsuit" @@ -1735,14 +1763,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes cost = 12 restricted_roles = list("Research Director", "Scientist", "Roboticist") -/datum/uplink_item/role_restricted/brainwash_disk - name = "Brainwashing Surgery Program" - desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \ - Insert into an Operating Console to enable the procedure." - item = /obj/item/disk/surgery/brainwashing - restricted_roles = list("Medical Doctor", "Roboticist") - cost = 3 - /datum/uplink_item/role_restricted/clown_bomb name = "Clown Bomb" desc = "The Clown bomb is a hilarious device capable of massive pranks. It has an adjustable timer, \ @@ -1929,10 +1949,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes item = /obj/item/gun/energy/emitter restricted_roles = list("Chief Engineer", "Station Engineer", "Atmospheric Technician") -// Pointless -/datum/uplink_item/badass - category = "(Pointless) Badassery" - surplus = 0 +// Pointless (Badassery) /datum/uplink_item/badass/costumes/obvious_chameleon name = "Broken Chameleon Kit" @@ -1986,12 +2003,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes item = /obj/item/storage/secure/briefcase/syndie cost = 1 -/datum/uplink_item/badass/phantomthief - name = "Syndicate Mask" - desc = "A cheap plastic mask fitted with an adrenaline autoinjector, which can be used by simply tensing your muscles" - item = /obj/item/clothing/glasses/phantomthief/syndicate - cost = 2 - /datum/uplink_item/badass/syndiecards name = "Syndicate Playing Cards" desc = "A special deck of space-grade playing cards with a mono-molecular edge and metal reinforcement, \ diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index e4cb090448..ac7fa879f4 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -60,6 +60,7 @@ .++ /obj/vehicle/proc/return_controllers_with_flag(flag) + RETURN_TYPE(/list/mob) . = list() for(var/i in occupants) if(occupants[i] & flag) diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm index 31d0a243e7..c398b528d8 100644 --- a/code/modules/vehicles/pimpin_ride.dm +++ b/code/modules/vehicles/pimpin_ride.dm @@ -14,7 +14,7 @@ D.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 4), TEXT_SOUTH = list(0, 7), TEXT_EAST = list(-12, 7), TEXT_WEST = list( 12, 7))) if(floorbuffer) - AddComponent(/datum/component/cleaning) + AddElement(/datum/element/cleaning) /obj/vehicle/ridden/janicart/Destroy() if(mybag) @@ -50,7 +50,7 @@ floorbuffer = TRUE qdel(I) to_chat(user, "You upgrade [src] with the floor buffer.") - AddComponent(/datum/component/cleaning) + AddElement(/datum/element/cleaning) update_icon() else return ..() diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index 27da0f6cea..13a139ef2e 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -49,6 +49,7 @@ return ..() /obj/vehicle/ridden/AltClick(mob/user) + . = ..() if(inserted_key && user.canUseTopic(src, BE_CLOSE, ismonkey(user))) if(!is_occupant(user)) to_chat(user, "You must be riding the [src] to remove [src]'s key!") @@ -57,7 +58,7 @@ inserted_key.forceMove(drop_location()) user.put_in_hands(inserted_key) inserted_key = null - return ..() + return TRUE /obj/vehicle/ridden/driver_move(mob/user, direction) if(key_type && !is_key(inserted_key)) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 8c21b050aa..0dd7ff32a8 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -94,6 +94,7 @@ qdel(src) /obj/vehicle/ridden/scooter/skateboard/AltClick(mob/user) + . = ..() var/datum/component/riding/R = src.GetComponent(/datum/component/riding) if (!adjusted_speed) R.vehicle_move_delay = 0 @@ -103,6 +104,7 @@ R.vehicle_move_delay = 1 to_chat(user, "You adjust the wheels on [src] to make it go slower.") adjusted_speed = FALSE + return TRUE //CONSTRUCTION /obj/item/scooter_frame diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 0d1fe7f047..626abd51ef 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -16,6 +16,7 @@ /obj/item/clothing/suit/jacket = 4, /obj/item/clothing/suit/jacket/puffer/vest = 4, /obj/item/clothing/suit/jacket/puffer = 4, + /obj/item/clothing/suit/hooded/cloak/david = 4, /obj/item/clothing/under/suit_jacket/navy = 3, /obj/item/clothing/under/suit_jacket/really_black = 3, /obj/item/clothing/under/suit_jacket/burgundy = 3, @@ -24,6 +25,12 @@ /obj/item/clothing/under/kilt = 3, /obj/item/clothing/under/overalls = 3, /obj/item/clothing/under/sl_suit = 3, + /obj/item/clothing/under/bb_sweater = 3, + /obj/item/clothing/under/bb_sweater/black = 3, + /obj/item/clothing/under/bb_sweater/purple = 3, + /obj/item/clothing/under/bb_sweater/green = 3, + /obj/item/clothing/under/bb_sweater/red = 3, + /obj/item/clothing/under/bb_sweater/blue = 3, /obj/item/clothing/under/pants/jeans = 5, /obj/item/clothing/under/pants/classicjeans = 5, /obj/item/clothing/under/pants/camo = 3, @@ -78,6 +85,10 @@ /obj/item/clothing/suit/ianshirt = 3, /obj/item/clothing/shoes/laceup = 5, /obj/item/clothing/shoes/sneakers/black = 6, + /obj/item/clothing/shoes/wraps = 3, + /obj/item/clothing/shoes/wraps/silver = 3, + /obj/item/clothing/shoes/wraps/red = 3, + /obj/item/clothing/shoes/wraps/blue = 3, /obj/item/clothing/shoes/sandal = 3, /obj/item/clothing/gloves/fingerless = 3, /obj/item/clothing/glasses/orange = 5, @@ -104,8 +115,18 @@ /obj/item/clothing/ears/headphones = 10, /obj/item/clothing/suit/apron/purple_bartender = 4, /obj/item/clothing/under/rank/bartender/purple = 4, - /obj/item/clothing/accessory/attrocious_pokadots = 8, - /obj/item/clothing/accessory/black_white_pokadots = 8) + /obj/item/clothing/under/christmas/christmasmaler = 3, + /obj/item/clothing/under/christmas/christmasmaleg = 3, + /obj/item/clothing/under/christmas/christmasfemaler = 3, + /obj/item/clothing/under/christmas/christmasfemaleg = 3, + /obj/item/clothing/suit/hooded/wintercoat/christmascoatr = 3, + /obj/item/clothing/suit/hooded/wintercoat/christmascoatg = 3, + /obj/item/clothing/suit/hooded/wintercoat/christmascoatrg = 3, + /obj/item/clothing/head/christmashat = 3, + /obj/item/clothing/head/christmashatg = 3, + /obj/item/clothing/shoes/winterboots/christmasbootsr = 3, + /obj/item/clothing/shoes/winterboots/christmasbootsg = 3, + /obj/item/clothing/shoes/winterboots/santaboots = 3) contraband = list(/obj/item/clothing/under/syndicate/tacticool = 3, /obj/item/clothing/under/syndicate/tacticool/skirt = 3, /obj/item/clothing/mask/balaclava = 3, @@ -115,8 +136,8 @@ /obj/item/clothing/suit/jacket/letterman_syndie = 5, /obj/item/clothing/under/jabroni = 2, /obj/item/clothing/suit/vapeshirt = 2, - /obj/item/clothing/under/geisha = 4, - /obj/item/clothing/accessory/syndi_pokadots = 4) + /obj/item/clothing/under/geisha = 4,, + /obj/item/clothing/under/keyholesweater = 3) premium = list(/obj/item/clothing/under/suit_jacket/checkered = 4, /obj/item/clothing/head/mailman = 2, /obj/item/clothing/under/rank/mailman = 2, @@ -124,8 +145,7 @@ /obj/item/clothing/suit/jacket/leather/overcoat = 4, /obj/item/clothing/under/pants/mustangjeans = 3, /obj/item/clothing/neck/necklace/dope = 5, - /obj/item/clothing/suit/jacket/letterman_nanotrasen = 5, - /obj/item/clothing/accessory/nt_pokadots = 5) + /obj/item/clothing/suit/jacket/letterman_nanotrasen = 5) refill_canister = /obj/item/vending_refill/clothing /obj/item/vending_refill/clothing diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index a242d88be4..1c141dae25 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -82,3 +82,22 @@ /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 10) product_slogans = "~Shake me up some of that Shambler's Juice!~" product_ads = "Refreshing!;Jyrbv dv lg jfdv fw kyrk Jyrdscvi'j Alztv!;Over 1 trillion souls drank!;Thirsty? Nyp efk uizeb kyv uribevjj?;Kyv Jyrdscvi uizebj kyv ezxyk!;Drink up!;Krjkp." + +/obj/machinery/vending/cola/buzz_fuzz + name = "\improper Buzz Fuzz Vendor" + desc = "~A hive of Flavour!~" + icon_state = "honey_vender" + products = list(/obj/item/reagent_containers/food/drinks/soda_cans/cola = 10, + /obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 10, + /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb = 10, + /obj/item/reagent_containers/food/drinks/soda_cans/starkist = 10, + /obj/item/reagent_containers/food/drinks/soda_cans/space_up = 10, + /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 10, + /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime = 10, + /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 5, + /obj/item/reagent_containers/food/drinks/soda_cans/buzz_fuzz = 5,) + contraband = list(/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 6) + premium = list(/obj/item/reagent_containers/food/drinks/beer/light = 1, + /obj/item/reagent_containers/food/drinks/soda_cans/grey_bull = 1) + product_slogans = "~A hive of Flavour!~" + product_ads = "Stinging flavour!;Ideal of the worker drone!;Buzz Buzz!;Got Honey?;The Queen approves of this drink!;Sap back that missing energy!;Bee the consumer unit!" diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm index 0cd68e818a..1c29fff137 100644 --- a/code/modules/vending/drinnerware.dm +++ b/code/modules/vending/drinnerware.dm @@ -6,7 +6,7 @@ products = list(/obj/item/storage/bag/tray = 8, /obj/item/kitchen/fork = 6, /obj/item/kitchen/knife = 6, - /obj/item/kitchen/rollingpin = 2, + /obj/item/kitchen/rollingpin = 4, /obj/item/reagent_containers/food/drinks/drinkingglass = 8, /obj/item/clothing/suit/apron/chef = 2, /obj/item/storage/box/cups = 2, @@ -17,7 +17,13 @@ /obj/item/reagent_containers/food/condiment/saltshaker = 5, /obj/item/reagent_containers/food/condiment/peppermill = 5, /obj/item/reagent_containers/glass/bowl = 30) - contraband = list(/obj/item/kitchen/rollingpin = 2, - /obj/item/kitchen/knife/butcher = 2) + contraband = list( + /obj/item/reagent_containers/food/snacks/monkeycube = 1, + /obj/item/kitchen/knife/butcher = 2, + /obj/item/reagent_containers/syringe = 3) + premium = list( + /obj/item/reagent_containers/food/condiment/enzyme = 1, + /obj/item/reagent_containers/food/condiment/soysauce = 1, + /obj/item/reagent_containers/glass/bottle/cryoxadone = 2) // Bartender can literally make this with upgraded parts, or it gets stolen from medical. armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm index c8d9035998..efb0905f6b 100644 --- a/code/modules/vending/snack.dm +++ b/code/modules/vending/snack.dm @@ -11,9 +11,16 @@ /obj/item/reagent_containers/food/snacks/no_raisin = 6, /obj/item/reagent_containers/food/snacks/spacetwinkie = 6, /obj/item/reagent_containers/food/snacks/cheesiehonkers = 6) - contraband = list(/obj/item/reagent_containers/food/snacks/syndicake = 6) - premium = list(/obj/item/storage/box/donkpockets = 1, - /obj/item/reagent_containers/food/snacks/poppypretzel = 3) + contraband = list( + /obj/item/reagent_containers/food/snacks/cracker = 12, + /obj/item/reagent_containers/food/snacks/beans = 2, + /obj/item/reagent_containers/food/snacks/honeybar = 6, + /obj/item/reagent_containers/food/snacks/syndicake = 6) + premium = list( + /obj/item/reagent_containers/food/snacks/lollipop = 2, + /obj/item/reagent_containers/food/snacks/spiderlollipop = 2, + /obj/item/reagent_containers/food/snacks/chococoin = 1, + /obj/item/storage/box/donkpockets = 2) refill_canister = /obj/item/vending_refill/snack var/chef_compartment_access = "28" //ACCESS_KITCHEN diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index dd0129346f..d65a507f96 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -278,7 +278,9 @@ /obj/item/storage/bag/trash = 1, /obj/item/clothing/shoes/galoshes = 1, /obj/item/watertank/janitor = 1, - /obj/item/storage/belt/janitor = 2) + /obj/item/storage/belt/janitor = 2, + /obj/item/screwdriver = 2, + /obj/item/stack/cable_coil/random = 4) refill_canister = /obj/item/vending_refill/wardrobe/jani_wardrobe /obj/item/vending_refill/wardrobe/jani_wardrobe diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm index 5c2b45dace..ad54c8a0c8 100644 --- a/code/modules/vore/eating/belly_obj.dm +++ b/code/modules/vore/eating/belly_obj.dm @@ -595,7 +595,7 @@ for(var/mob/living/H in hearing_mobs) if(H && H.client && (isturf(H.loc))) - H.show_message(struggle_outer_message, 1) // visible + H.show_message(struggle_outer_message, MSG_VISUAL) // visible to_chat(R,struggle_user_message) diff --git a/config/game_options.txt b/config/game_options.txt index a44c68226e..3b031bb5b9 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -92,6 +92,7 @@ PROBABILITY SECRET_EXTENDED 0 PROBABILITY DEVIL 0 PROBABILITY DEVIL_AGENTS 0 PROBABILITY CLOWNOPS 0 +PROBABILITY BLOODSUCKER 0 ## You probably want to keep sandbox off by default for secret and random. PROBABILITY SANDBOX 0 @@ -114,6 +115,7 @@ CONTINUOUS CLOCKWORK_CULT CONTINUOUS CHANGELING CONTINUOUS WIZARD #CONTINUOUS MONKEY +CONTINUOUS BLOODSUCKER ##Note: do not toggle continuous off for these modes, as they have no antagonists and would thus end immediately! diff --git a/dependencies.sh b/dependencies.sh index a75940088f..0f66dcab1a 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -18,3 +18,9 @@ export BSQL_VERSION=v1.4.0.0 #node version export NODE_VERSION=8 + +# PHP version +export PHP_VERSION=5.6 + +# SpacemanDMM git tag +export SPACEMAN_DMM_VERSION=suite-1.0 diff --git a/html/changelog.html b/html/changelog.html index 61bc43a99b..8eabba83df 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -23,11 +23,9 @@
+
+ 07 December 2019+AffectedArc07 updated:+
Anonymous updated:+
Arturlang updated:+
Bhijn updated:+
Coconutwarrior97 updated:+
Commandersand updated:+
DeltaFire15 updated:+
Fermis updated:+
Fox McCloud updated:+
Fox McCloud, Ghommie updated:+
Ghommie updated:+
Ghommie (original PR by Denton) updated:+
Ghommie (original PR by nicbn and Menshin) updated:+
Ghommie (original PRs by ShizCalev, CRTXBacon and Niknakflak) updated:+
Ghommie, porting lot of PRs by MrDoomBringer, AnturK, nemvar and coiax. updated:+
GrayRachnid updated:+
Hatterhat updated:+
Iroquois-Pliskin updated:+
Jerry Derpington, baldest of the balds, and nemvar. updated:+
KathrinBailey updated:+
Kevinz000, Cruix, MrStonedOne, Denton, Kmc2000, Anturk, MrDoomBringer, Dennok, TheChosenEvilOne, Ghommie updated:+
Knouli updated:+
Krysonism, Ghommie updated:+
Linzolle updated:+
Mickyy5 updated:+
MrJWhit updated:+
Naksu, ShizCalev updated:+
Owai-Seek updated:+
PersianXerxes updated:+
Putnam updated:+
Putnam3145 updated:+
Robustin, Subject217 updated:+
Seris02 updated:+
ShizCalev updated:+
Swindly updated:+
Tetr4 updated:+
Trilbyspaceclone updated:+
Ty-the-Smonk updated:+
Useroth updated:+
Weblure updated:+
XDTM, ShizCalev, Naksu, Skoglol, cacogen, Rohesie (ported by Ghommie) updated:+
Xantholne updated:+
YakumoChen updated:+
actioninja updated:+
dapnee updated:+
dzahlus updated:+
him updated:+
kappa-sama updated:+
kevinz000 updated:+
kiwedespars updated:+
nemvar updated:+
nemvar, ShizCalev, Qustinnus/Floyd, Ghommie updated:+
r4d6 updated:+
04 November 20194dplanner, MMiracles updated:
|