diff --git a/.gitattributes b/.gitattributes
index e0aa6c276486..4670f2f01348 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -42,3 +42,5 @@
## Force tab indents on dm files
*.dm whitespace=indent-with-non-tab
+# Mark compiled behavior trees as generated files, to avoid clogging up github diff. We have the actual thingy to give a useful BT diff anyways.
+build/behavior_trees/**/*.compiled.json linguist-generated
diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml
index 9e862bf4664f..03bfea23e24c 100644
--- a/.github/workflows/generate_documentation.yml
+++ b/.github/workflows/generate_documentation.yml
@@ -27,7 +27,7 @@ jobs:
touch dmdoc/.nojekyll
echo codedocs.tgstation13.org > dmdoc/CNAME
- name: Deploy
- uses: JamesIves/github-pages-deploy-action@v4.8.0
+ uses: JamesIves/github-pages-deploy-action@v4.9.0
with:
branch: gh-pages
clean: true
diff --git a/.github/workflows/run_integration_tests.yml b/.github/workflows/run_integration_tests.yml
index 320a49f8dccc..2b45b3a931a9 100644
--- a/.github/workflows/run_integration_tests.yml
+++ b/.github/workflows/run_integration_tests.yml
@@ -71,6 +71,7 @@ jobs:
name: test_artifacts_${{ inputs.map }}_${{ inputs.major || env.BYOND_MAJOR }}_${{ inputs.minor || env.BYOND_MINOR }}
path: data/screenshots_new/
retention-days: 1
+ if-no-files-found: ignore
- name: On test fail, write a step summary
if: always() && steps.run_tests.outcome == 'failure'
run: |
diff --git a/README.md b/README.md
index 77ea01de5206..be77d2f26db4 100644
--- a/README.md
+++ b/README.md
@@ -2,11 +2,12 @@
[](.github/images/comics/131-bug-free.png) [](.github/images/comics/106-tech-debt-modified.png) [](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a)
-| Website | Link |
-| ----------------------- | -------------------------------------------- |
+| Website | Link |
+| ----------------------- | -----------------------------------------|
| Code | https://github.com/ApocryphaXIII/Apocrypha13 |
-| The Second City Discord | https://discord.gg/rmAbJcuChD |
-| Coderbus Discord | https://discord.gg/Vh8TJp9 |
+| The Second City Discord | https://discord.gg/rmAbJcuChD |
+| Coderbus Discord | https://discord.gg/Vh8TJp9 |
+| Getting Started With Development | https://hackmd.io/@tgstation/HJ8OdjNBc#tgstation-Development-Guide |
This is the codebase for Apocrypha13, a downstream/fork for the Darkpack13 Project, a fork of TGstation 2025
@@ -28,16 +29,6 @@ We are based on the Paradox Interactive World of Darkness(c) gamelines, with adm
**[How to compile in VSCode and other build options](tools/build/README.md).**
-If you'd like to contribute to this codebase, consider uncommenting line 1 @ \_maps_basemap.dm for faster initialization.
-
-## Getting started
-
-For contribution guidelines refer to the [Guides for Contributors](.github/CONTRIBUTING.md).
-
-For getting started (dev env, compilation) see the HackMD document [here](https://hackmd.io/@tgstation/HJ8OdjNBc#tgstation-Development-Guide).
-
-For overall design documentation see [HackMD](https://hackmd.io/@tgstation).
-
## LICENSE
All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/12/31 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.html).
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index 5bc3b534fa68..081c77c3965f 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -69677,6 +69677,7 @@
dir = 4
},
/obj/machinery/power/apc/auto_name/directional/west,
+/obj/structure/cable,
/turf/open/floor/iron/dark/textured_edge,
/area/station/security/execution/education)
"tFs" = (
diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm
index b37b1385b0aa..8ee6a032ea92 100644
--- a/_maps/map_files/Mining/Lavaland.dmm
+++ b/_maps/map_files/Mining/Lavaland.dmm
@@ -4924,6 +4924,10 @@
},
/turf/open/misc/hay/lavaland,
/area/lavaland/surface/outdoors)
+"AH" = (
+/obj/structure/candela_beacon,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"AI" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -46595,7 +46599,7 @@ pU
pU
pU
pU
-pU
+AH
pU
aj
aj
diff --git a/_maps/map_files/Vampire/generic/forest.dmm b/_maps/map_files/Vampire/generic/forest.dmm
index 87286dd435fc..fd9168ac5e36 100644
--- a/_maps/map_files/Vampire/generic/forest.dmm
+++ b/_maps/map_files/Vampire/generic/forest.dmm
@@ -2795,7 +2795,7 @@
/obj/effect/turf_decal/darkpack/rough{
dir = 4
},
-/obj/effect/realistic_fog/dense,
+/obj/effect/realistic_fog/bawn/gaia,
/turf/open/water/river,
/area/vtm/interior/forest/cave)
"rp" = (
@@ -2864,6 +2864,10 @@
dir = 4
},
/area/vtm/interior/forest)
+"rO" = (
+/obj/effect/realistic_fog/bawn/gaia,
+/turf/open/floor/plating/rough,
+/area/vtm/interior/forest/cave)
"rR" = (
/obj/effect/turf_decal/darkpack/rough/corner{
dir = 4
@@ -4454,6 +4458,13 @@
},
/turf/open/misc/dirt,
/area/vtm/outside/forest/sept)
+"Bo" = (
+/obj/effect/turf_decal/darkpack/cave/corner{
+ dir = 8
+ },
+/obj/effect/realistic_fog/bawn/gaia,
+/turf/open/water/river,
+/area/vtm/interior/forest/cave)
"Bq" = (
/obj/effect/turf_decal/darkpack/rough{
dir = 5
@@ -4664,7 +4675,7 @@
/obj/effect/turf_decal/darkpack/rough/corner{
dir = 1
},
-/obj/effect/realistic_fog/dense,
+/obj/effect/realistic_fog/bawn/gaia,
/turf/open/water/river,
/area/vtm/interior/forest/cave)
"Cq" = (
@@ -5110,7 +5121,7 @@
/obj/effect/turf_decal/bordur{
dir = 4
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/misc/dirt,
/area/vtm/outside/forest)
"Fy" = (
@@ -5320,7 +5331,7 @@
/turf/open/water/beach/vamp/deep,
/area/vtm/outside/forest)
"GP" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/misc/dirt,
/area/vtm/outside/forest)
"GQ" = (
@@ -5460,7 +5471,7 @@
/obj/effect/turf_decal/darkpack/cave{
dir = 10
},
-/obj/effect/realistic_fog/dense,
+/obj/effect/realistic_fog/bawn/gaia,
/turf/open/water/river,
/area/vtm/interior/forest/cave)
"Hz" = (
@@ -5671,7 +5682,7 @@
/area/vtm/interior/forest/cave)
"IP" = (
/obj/effect/realistic_fog/dense,
-/obj/structure/werewolf_totem/generic,
+/obj/structure/werewolf_totem/generic/gaia,
/turf/open/floor/plating/rough/cave{
icon_state = "cave3"
},
@@ -5792,6 +5803,12 @@
icon_state = "sand3"
},
/area/vtm/outside/forest/sept)
+"JL" = (
+/obj/effect/landmark/bawn_entrance/gaia,
+/turf/open/floor/plating/rough/cave{
+ icon_state = "cave3"
+ },
+/area/vtm/interior/forest/cave)
"JP" = (
/obj/effect/turf_decal/darkpack/grass{
dir = 5
@@ -5847,7 +5864,7 @@
/turf/open/misc/grass,
/area/vtm/outside/forest)
"Kc" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/obj/effect/turf_decal/bordur{
dir = 8
},
@@ -6759,6 +6776,12 @@
},
/turf/open/misc/dirt,
/area/vtm/outside/forest)
+"PU" = (
+/obj/effect/realistic_fog/bawn/gaia,
+/turf/open/floor/plating/rough/cave{
+ icon_state = "cave3"
+ },
+/area/vtm/interior/forest/cave)
"PV" = (
/obj/effect/turf_decal/darkpack/rough/corner{
dir = 4
@@ -6817,6 +6840,10 @@
/obj/structure/flora/rock/darkpack_big,
/turf/open/misc/grass/random,
/area/vtm/outside/forest)
+"Qn" = (
+/obj/effect/realistic_fog/bawn/gaia,
+/turf/open/water/river,
+/area/vtm/interior/forest/cave)
"Qp" = (
/obj/effect/landmark/start/darkpack/forest_wolves/catcher,
/turf/open/misc/dirt,
@@ -7067,7 +7094,7 @@
/area/vtm/interior/forest/sept)
"RJ" = (
/obj/structure/glowshroom,
-/obj/effect/realistic_fog/dense,
+/obj/effect/realistic_fog/bawn/gaia,
/turf/open/floor/plating/rough/cave{
icon_state = "cave3"
},
@@ -8110,7 +8137,7 @@
/area/vtm/interior/forest/cave)
"YL" = (
/obj/structure/flora/rock/darkpack_big,
-/obj/effect/realistic_fog/dense,
+/obj/effect/realistic_fog/bawn/gaia,
/turf/open/floor/plating/rough,
/area/vtm/interior/forest/cave)
"YN" = (
@@ -34141,7 +34168,7 @@ yh
Nr
Nr
dn
-Nr
+JL
Nr
Nr
wK
@@ -37681,7 +37708,7 @@ ZF
FK
Wa
yh
-Wf
+PU
Nr
RJ
hl
@@ -37878,7 +37905,7 @@ Sr
Sb
ZF
FK
-Wa
+Bo
tF
Hv
aU
@@ -38075,9 +38102,9 @@ Ys
ye
qV
FK
-ZF
+Qn
FK
-ZF
+Qn
Hm
mB
tF
@@ -38274,7 +38301,7 @@ Ys
CO
Cp
FK
-ZF
+Qn
FK
ZF
FK
@@ -38469,7 +38496,7 @@ EH
EH
bv
ye
-Ys
+rO
CO
rn
Sb
@@ -38668,7 +38695,7 @@ EH
EH
YL
ye
-Ys
+rO
ye
Sr
Sb
@@ -38865,7 +38892,7 @@ EH
EH
EH
EH
-Ys
+rO
iG
nZ
ye
diff --git a/_maps/map_files/Vampire/runtimetown.dmm b/_maps/map_files/Vampire/runtimetown.dmm
index 8cb8bb00248a..e839cdef38d3 100644
--- a/_maps/map_files/Vampire/runtimetown.dmm
+++ b/_maps/map_files/Vampire/runtimetown.dmm
@@ -1,4 +1,13 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ad" = (
+/obj/effect/turf_decal/bordur{
+ dir = 4
+ },
+/obj/machinery/light/floor/lamppost/one{
+ dir = 4
+ },
+/turf/open/floor/plating/sidewalk/rich,
+/area/vtm/outside/pacificheights)
"ah" = (
/obj/effect/turf_decal/bordur/corner,
/turf/open/floor/plating/sidewalk,
@@ -17,13 +26,14 @@
/obj/item/gun/ballistic/automatic/pistol/darkpack/m1911,
/turf/open/floor/plating/rough,
/area/vtm/interior/anarch)
-"aw" = (
-/obj/machinery/light/directional/north,
-/obj/structure/rack/tall/store_shelf_metal{
- dir = 4
- },
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
+"aI" = (
+/obj/machinery/light/floor/lamppost/one,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/outside/pacificheights)
+"aL" = (
+/obj/machinery/light/directional/west,
+/turf/open/floor/wood/smooth/old,
+/area/vtm/interior/shop/gunshop)
"aM" = (
/obj/effect/spawner/random/trash/rat,
/turf/open/misc/beach/vamp,
@@ -34,10 +44,6 @@
},
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
-"bj" = (
-/obj/structure/closet/secure_closet/freezer,
-/turf/open/floor/city/toilet,
-/area/vtm/interior/shop)
"bo" = (
/obj/item/paper_bin,
/obj/item/pen,
@@ -56,6 +62,13 @@
/obj/effect/abstract/cargo_landing_spot,
/turf/open/misc/dirt,
/area/vtm/outside/supply)
+"by" = (
+/obj/structure/retail/pharmacy{
+ dir = 8
+ },
+/obj/structure/table/countertop/purple,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/pharmacy)
"bB" = (
/obj/structure/chair/wood/darkpack/red,
/turf/open/floor/plating/rough,
@@ -80,17 +93,6 @@
/obj/structure/table/wood,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
-"bL" = (
-/obj/item/gas_can{
- anchored = 1;
- pixel_y = 7
- },
-/obj/item/gas_can{
- anchored = 1
- },
-/obj/structure/rack,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"bU" = (
/obj/structure/table,
/obj/machinery/cell_charger{
@@ -106,6 +108,13 @@
"ca" = (
/turf/closed/wall/vampwall/old,
/area/vtm/outside/ghetto)
+"cd" = (
+/obj/structure/retail/smoke_menu{
+ dir = 4
+ },
+/obj/structure/table/countertop/teal,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/gasstation)
"cf" = (
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/outside/pacificheights)
@@ -115,16 +124,6 @@
},
/turf/open/misc/grass,
/area/vtm/outside/pacificheights)
-"ci" = (
-/obj/underplate/stuff{
- pixel_y = 8
- },
-/obj/structure/table/countertop/bacotell,
-/obj/structure/retail/red_dragon_menu{
- dir = 1
- },
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"cj" = (
/obj/effect/turf_decal/bordur,
/turf/open/floor/plating/sidewalk/poor,
@@ -148,6 +147,12 @@
},
/turf/open/floor/plating/asphalt,
/area/vtm/outside/pacificheights)
+"cH" = (
+/obj/structure/table,
+/obj/lombard,
+/obj/structure/platform/lowwall/rich/old,
+/turf/open/floor/plating/rough,
+/area/vtm/interior/cog/pantry)
"cQ" = (
/obj/structure/table,
/obj/item/storage/medkit/darkpack/ifak,
@@ -163,6 +168,10 @@
},
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/pacificheights)
+"cY" = (
+/obj/structure/closet/crate/wooden/communitygardens/tools,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/pantry)
"cZ" = (
/obj/effect/landmark/npcbeacon,
/obj/effect/turf_decal/bordur/corner{
@@ -170,6 +179,12 @@
},
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
+"dh" = (
+/obj/machinery/light/floor/lamppost/one{
+ dir = 8
+ },
+/turf/open/floor/plating/sidewalk,
+/area/vtm/outside/pacificheights)
"dA" = (
/obj/structure/table,
/obj/item/storage/medkit/darkpack/doctor,
@@ -188,6 +203,15 @@
/obj/machinery/radio_tranceiver/anarch,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"dZ" = (
+/turf/closed/wall/vampwall/brick,
+/area/vtm/interior/shop/bubway)
+"ea" = (
+/obj/structure/vampdoor{
+ dir = 4
+ },
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/pharmacy)
"ef" = (
/obj/structure/roofstuff/vent_end{
dir = 4
@@ -202,6 +226,10 @@
/obj/item/vamp/keys/camarilla,
/turf/open/floor/plating/asphalt,
/area/vtm/outside/pacificheights)
+"eq" = (
+/obj/machinery/light/directional/east,
+/turf/open/floor/wood/smooth/old,
+/area/vtm/interior/shop/gunshop)
"et" = (
/obj/structure/retail/library{
dir = 8
@@ -209,16 +237,14 @@
/obj/structure/table/countertop/red,
/turf/open/floor/plating/concrete,
/area/vtm/interior/shop)
+"eE" = (
+/obj/effect/decal/wallpaper/red,
+/turf/closed/wall/vampwall/market,
+/area/vtm/interior/shop/pharmacy)
"eG" = (
/obj/machinery/light/directional/north,
/turf/open/floor/plating/rough,
/area/vtm/interior/clinic)
-"eJ" = (
-/obj/effect/decal/cleanable/trash{
- icon_state = "trash5"
- },
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"eL" = (
/obj/structure/table/wood,
/obj/item/scythe/vamp,
@@ -231,10 +257,6 @@
/obj/structure/platform/lowwall/rich/old/window,
/turf/open/floor/plating/rough,
/area/vtm/outside/pacificheights)
-"eU" = (
-/mob/living/carbon/human/npc/shop,
-/turf/open/floor/wood/smooth/old,
-/area/vtm/interior/shop)
"fc" = (
/obj/machinery/fax/glasswalker,
/obj/structure/table/wood,
@@ -247,6 +269,13 @@
},
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/pacificheights)
+"fg" = (
+/obj/effect/turf_decal/bordur{
+ dir = 10
+ },
+/obj/machinery/light/floor/lamppost/four,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/outside/pacificheights)
"fh" = (
/obj/structure/chair/stool/bar/directional/west,
/turf/open/misc/beach/vamp,
@@ -263,10 +292,13 @@
/obj/effect/mapping_helpers/door/lock,
/turf/open/floor/plating/concrete,
/area/vtm/interior/shop)
-"fI" = (
-/obj/machinery/light/directional/west,
-/turf/open/floor/wood/smooth/old,
-/area/vtm/interior/shop)
+"fK" = (
+/obj/machinery/smartfridge/drying/rack,
+/obj/item/food/grown/cannabis,
+/obj/item/food/grown/cannabis,
+/obj/item/food/grown/cannabis,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/pantry)
"fV" = (
/obj/effect/spawner/random/trash/hobo_squat,
/turf/open/floor/plating/sidewalk/poor,
@@ -276,6 +308,10 @@
/obj/structure/closet/cardboard,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"gc" = (
+/mob/living/carbon/human/npc/shop,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/bubway)
"gj" = (
/obj/effect/landmark/npcbeacon,
/obj/effect/turf_decal/bordur/corner{
@@ -283,15 +319,10 @@
},
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/outside/pacificheights)
-"gs" = (
-/obj/effect/turf_decal/bordur{
- dir = 1
- },
-/obj/structure/lamppost/one{
- dir = 1
- },
-/turf/open/floor/plating/sidewalk/rich,
-/area/vtm/outside/pacificheights)
+"gr" = (
+/mob/living/carbon/human/npc/shop,
+/turf/open/floor/wood/smooth/old,
+/area/vtm/interior/shop/gunshop)
"gA" = (
/obj/machinery/fax/admin/aasimites,
/obj/structure/table/wood,
@@ -300,14 +331,29 @@
"gF" = (
/turf/open/floor/plating/rough,
/area/vtm/interior/shop)
-"gN" = (
-/turf/open/floor/wood/smooth/old,
-/area/vtm/interior/shop)
-"gS" = (
+"gZ" = (
/obj/effect/turf_decal/bordur{
dir = 8
},
-/obj/structure/lamppost/four,
+/obj/machinery/light/floor/lamppost/one{
+ dir = 8
+ },
+/turf/open/floor/plating/sidewalk/rich,
+/area/vtm/outside/pacificheights)
+"hd" = (
+/obj/structure/table/wood,
+/obj/item/soil_sack,
+/obj/item/soil_sack/coir,
+/obj/item/soil_sack/gel,
+/obj/item/soil_sack/rich,
+/obj/item/soil_sack/vermaculite,
+/obj/item/soil_sack/worm,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/pantry)
+"hf" = (
+/obj/machinery/light/floor/lamppost/three{
+ dir = 8
+ },
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
"hi" = (
@@ -345,28 +391,10 @@
/obj/structure/table/countertop/beige,
/turf/open/floor/plating/rough,
/area/vtm/interior/shop)
-"hD" = (
-/obj/structure/table,
-/obj/lombard/blackmarket,
-/obj/structure/platform/lowwall/rich/old,
-/turf/open/floor/plating/rough,
-/area/vtm/interior/cog)
-"hF" = (
-/obj/structure/table,
-/obj/structure/platform/lowwall/brick,
-/obj/structure/retail/costume_store{
- pixel_x = 2;
- pixel_y = -4;
- dir = 8;
- icon_state = "menu"
- },
-/obj/structure/retail/hot_ishu{
- pixel_y = 10;
- dir = 8;
- icon_state = "menu"
- },
+"hC" = (
+/obj/structure/platform/lowwall/brick/window,
/turf/open/floor/plating/rough,
-/area/vtm/interior/shop)
+/area/vtm/interior/shop/clothing_store)
"hH" = (
/obj/effect/decal/cleanable/trash{
icon_state = "trash5"
@@ -394,10 +422,6 @@
/obj/effect/decal/graffiti,
/turf/open/floor/plating/rough,
/area/vtm/interior/shop)
-"ie" = (
-/obj/structure/closet/cardboard,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"ih" = (
/obj/structure/chair/darkpack/green,
/turf/open/floor/plating/rough,
@@ -405,6 +429,18 @@
"ik" = (
/turf/open/floor/plating/asphalt,
/area/vtm/outside/pacificheights)
+"in" = (
+/turf/closed/wall/vampwall/painted,
+/area/vtm/interior/shop/pharmacy)
+"ix" = (
+/obj/effect/turf_decal/bordur{
+ dir = 1
+ },
+/obj/machinery/light/floor/lamppost/one{
+ dir = 1
+ },
+/turf/open/floor/plating/sidewalk/rich,
+/area/vtm/outside/pacificheights)
"iA" = (
/obj/effect/decal/cleanable/garbage,
/obj/effect/decal/cleanable/trash{
@@ -463,6 +499,13 @@
},
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"jg" = (
+/obj/effect/turf_decal/bordur{
+ dir = 8
+ },
+/obj/machinery/light/floor/lamppost/four,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/outside/pacificheights)
"ji" = (
/obj/structure/table/wood,
/obj/item/paper_bin,
@@ -477,13 +520,18 @@
/obj/item/liquid_flamethrower,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
+"jn" = (
+/obj/structure/vampdoor/simple{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/door/access/camarilla,
+/obj/effect/mapping_helpers/door/lock,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/pharmacy)
"jp" = (
/obj/structure/platform/lowwall/brick,
/turf/open/floor/plating/rough,
/area/vtm/interior/supply)
-"jr" = (
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/techshop)
"jw" = (
/obj/effect/decal/cleanable/trash{
icon_state = "trash7"
@@ -536,10 +584,6 @@
},
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
-"jW" = (
-/obj/effect/decal/wallpaper/paper/stripe,
-/turf/closed/wall/vampwall/market,
-/area/vtm/interior/shop)
"kb" = (
/obj/effect/landmark/start{
jobspawn_override = 1;
@@ -559,17 +603,6 @@
},
/turf/open/misc/grass,
/area/vtm/graveyard)
-"ki" = (
-/obj/structure/fluff/tv/order/three{
- pixel_x = -10;
- pixel_y = 12
- },
-/obj/structure/fluff/tv/order/four{
- pixel_y = 12;
- pixel_x = 6
- },
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"kj" = (
/obj/effect/turf_decal/stripes/line,
/turf/open/misc/dirt,
@@ -589,21 +622,47 @@
/obj/item/molotov,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
+"kG" = (
+/mob/living/carbon/human/npc/shop,
+/turf/open/floor/city/toilet,
+/area/vtm/interior/shop/gummaguts)
"kN" = (
/obj/effect/turf_decal/bordur{
dir = 4
},
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/pacificheights)
-"kS" = (
-/turf/closed/wall/vampwall/market,
-/area/vtm/interior/shop)
+"kO" = (
+/obj/structure/closet/secure_closet/freezer,
+/obj/machinery/light/directional/west,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/pharmacy)
+"kP" = (
+/turf/closed/wall/vampwall/brick,
+/area/vtm/interior/shop/clothing_store)
+"kQ" = (
+/obj/structure/table/countertop/bubway,
+/obj/structure/retail/otolleys_menu{
+ dir = 1
+ },
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/bubway)
"kX" = (
/obj/effect/turf_decal/crosswalk{
dir = 4
},
/turf/open/floor/plating/asphalt,
/area/vtm/outside/pacificheights)
+"lh" = (
+/obj/structure/table/wood,
+/obj/item/seeds/cannabis,
+/obj/item/seeds/cannabis,
+/obj/item/seeds/cannabis,
+/obj/item/seeds/cannabis,
+/obj/item/seeds/cannabis,
+/obj/item/seeds/cannabis,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/pantry)
"lk" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -621,9 +680,15 @@
},
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
-"lv" = (
-/turf/closed/wall/vampwall/rich/old,
-/area/vtm/interior/cog)
+"ls" = (
+/obj/machinery/light/floor/lamppost/one,
+/turf/open/misc/beach/vamp,
+/area/vtm/outside/pacificheights)
+"lt" = (
+/obj/effect/turf_decal/bordur,
+/obj/machinery/light/floor/lamppost/one,
+/turf/open/floor/plating/sidewalk/poor,
+/area/vtm/outside/pacificheights)
"lC" = (
/obj/structure/railing,
/obj/structure/lattice/grate,
@@ -660,6 +725,10 @@
},
/turf/open/floor/plating/asphalt,
/area/vtm/outside/pacificheights)
+"ma" = (
+/obj/structure/closet/secure_closet/freezer/meat,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/bubway)
"md" = (
/obj/structure/vampdoor{
dir = 4
@@ -674,16 +743,46 @@
/obj/structure/ladder/manhole/up,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"my" = (
+/obj/underplate/stuff{
+ pixel_y = 8
+ },
+/obj/structure/table/countertop/bacotell,
+/obj/structure/retail/red_dragon_menu{
+ dir = 1
+ },
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/pharmacy)
+"mA" = (
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/bubway)
+"mB" = (
+/obj/machinery/oven,
+/obj/machinery/light/directional/north,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/pharmacy)
+"mE" = (
+/obj/structure/table/wood,
+/obj/item/food/grown/cannabis,
+/obj/item/food/grown/cannabis,
+/obj/item/food/grown/cannabis,
+/obj/item/food/grown/cannabis,
+/obj/item/food/grown/cannabis,
+/obj/item/food/grown/cannabis,
+/obj/item/bong{
+ pixel_y = 10;
+ pixel_x = 10
+ },
+/obj/item/bong{
+ pixel_y = 2;
+ pixel_x = 10
+ },
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/pantry)
"mG" = (
/obj/machinery/light/directional/west,
/turf/open/floor/plating/rough/cave,
/area/vtm/interior/techshop)
-"mL" = (
-/obj/structure/rack/tall/store_shelf_metal{
- dir = 8
- },
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"mW" = (
/obj/item/storage/box/syringes,
/obj/item/storage/box/masks,
@@ -704,6 +803,13 @@
"nj" = (
/turf/open/openspace,
/area/vtm/interior/techshop)
+"nl" = (
+/obj/structure/table/countertop/bubway,
+/obj/structure/retail/bubway_menu{
+ dir = 1
+ },
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/bubway)
"nm" = (
/obj/effect/decal/pallet,
/obj/item/ammo_box/darkpack/c9mm/silver,
@@ -714,17 +820,18 @@
/obj/item/ammo_box/darkpack/c46pdw,
/turf/open/floor/plating/rough,
/area/vtm/interior/anarch)
-"nq" = (
-/obj/structure/lamppost/three{
- dir = 8
- },
+"nt" = (
+/obj/machinery/hydroponics/simple/plastic,
/turf/open/floor/plating/sidewalk,
-/area/vtm/outside/pacificheights)
+/area/vtm/interior/cog/pantry)
"nA" = (
/obj/effect/decal/cleanable/garbage,
/obj/effect/decal/cleanable/cardboard,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"nB" = (
+/turf/closed/wall/vampwall/market,
+/area/vtm/interior/shop/gummaguts)
"nC" = (
/obj/structure/table/wood,
/obj/structure/retail/flower_shop{
@@ -732,18 +839,6 @@
},
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
-"nD" = (
-/obj/structure/fluff/tv/order/one{
- pixel_y = 12;
- pixel_x = -10
- },
-/obj/structure/fluff/tv/order/two{
- pixel_y = 12;
- pixel_x = 6
- },
-/obj/structure/sign/city/store/bacotell/directional/north,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"nT" = (
/obj/structure/vampfence/rich,
/turf/open/misc/grass,
@@ -755,10 +850,17 @@
/obj/structure/table,
/turf/open/floor/plating/rough,
/area/vtm/interior/clinic)
+"oj" = (
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/pharmacy)
"ok" = (
/obj/effect/decal/cleanable/litter,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"om" = (
+/obj/structure/closet/secure_closet/freezer,
+/turf/open/floor/city/toilet,
+/area/vtm/interior/shop/gummaguts)
"op" = (
/obj/machinery/door/poddoor/shutters{
elevator_mode = 1;
@@ -766,6 +868,14 @@
},
/turf/open/floor/iron/smooth_large,
/area/vtm/outside/pacificheights)
+"or" = (
+/obj/structure/retail/clothing_store{
+ dir = 8
+ },
+/obj/structure/table,
+/obj/structure/platform/lowwall/brick,
+/turf/open/floor/plating/rough,
+/area/vtm/interior/shop/clothing_store)
"ov" = (
/obj/effect/turf_decal/crosswalk{
dir = 8
@@ -786,17 +896,15 @@
/obj/machinery/light/directional/north,
/turf/open/floor/plating/canal,
/area/vtm/interior/techshop)
+"oR" = (
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/pantry)
"oT" = (
/obj/structure/vampfence/corner/rich{
dir = 4
},
/turf/open/misc/dirt,
/area/vtm/graveyard)
-"oV" = (
-/obj/weapon_showcase,
-/obj/structure/sign/flag/usa/directional/north,
-/turf/open/floor/wood/smooth/old,
-/area/vtm/interior/shop)
"oW" = (
/turf/open/floor/plating/concrete,
/area/vtm/interior/shop)
@@ -869,24 +977,15 @@
},
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/outside/pacificheights)
+"qs" = (
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/gasstation)
"qt" = (
/obj/machinery/computer/cargo/express{
dir = 4
},
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/supply)
-"qv" = (
-/obj/structure/vampdoor/simple{
- dir = 4
- },
-/obj/effect/mapping_helpers/door/access/camarilla,
-/obj/effect/mapping_helpers/door/lock,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
-"qz" = (
-/obj/structure/lamppost/one,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/outside/pacificheights)
"qC" = (
/obj/machinery/door/poddoor/shutters/preopen{
transport_linked_id = "DebugElevator3";
@@ -912,11 +1011,6 @@
/obj/structure/chair/comfy/shuttle,
/turf/open/floor/plating/rough,
/area/vtm/interior/clinic)
-"qR" = (
-/obj/structure/closet/secure_closet/freezer,
-/obj/machinery/light/directional/west,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"qV" = (
/turf/closed/wall/vampwall/brick,
/area/vtm/outside/pacificheights)
@@ -932,18 +1026,22 @@
},
/turf/open/floor/wood/smooth/old,
/area/vtm/interior/sewer)
-"ri" = (
-/obj/structure/table/countertop/purple,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
-"rn" = (
-/obj/structure/retail/clothing_store{
- dir = 8
- },
+"rm" = (
/obj/structure/table,
/obj/structure/platform/lowwall/brick,
+/obj/structure/retail/costume_store{
+ pixel_x = 2;
+ pixel_y = -4;
+ dir = 8;
+ icon_state = "menu"
+ },
+/obj/structure/retail/hot_ishu{
+ pixel_y = 10;
+ dir = 8;
+ icon_state = "menu"
+ },
/turf/open/floor/plating/rough,
-/area/vtm/interior/shop)
+/area/vtm/interior/shop/clothing_store)
"rs" = (
/obj/machinery/fax/camarilla,
/obj/structure/table/wood,
@@ -953,16 +1051,9 @@
/obj/effect/landmark/observer_start,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
-"rx" = (
-/obj/structure/table/wood,
-/obj/item/soil_sack,
-/obj/item/soil_sack/coir,
-/obj/item/soil_sack/gel,
-/obj/item/soil_sack/rich,
-/obj/item/soil_sack/vermaculite,
-/obj/item/soil_sack/worm,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
+"rA" = (
+/turf/closed/wall/vampwall/brick,
+/area/vtm/interior/shop/pharmacy)
"rB" = (
/turf/closed/indestructible/the_matrix,
/area/vtm)
@@ -1002,10 +1093,19 @@
/obj/structure/stairs/north,
/turf/open/floor/plating/rough,
/area/vtm/interior/techshop)
+"rV" = (
+/obj/effect/turf_decal/trimline/brown/filled/warning,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/caern/bawn)
"rW" = (
/obj/effect/turf_decal/crosswalk,
/turf/open/floor/plating/asphalt,
/area/vtm/outside/pacificheights)
+"se" = (
+/obj/effect/turf_decal/bordur,
+/obj/machinery/light/floor/lamppost/one,
+/turf/open/floor/plating/sidewalk/poor,
+/area/vtm/outside/financialdistrict)
"sg" = (
/obj/item/kirbyplants/darkpack/random{
pixel_x = -9;
@@ -1045,17 +1145,25 @@
/obj/machinery/light/directional/east,
/turf/open/floor/plating/rough,
/area/vtm/interior/techshop)
-"sy" = (
-/mob/living/carbon/human/npc/shop,
-/obj/effect/decal/cleanable/trash{
- icon_state = "trash7"
- },
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
+"sB" = (
+/obj/effect/decal/wallpaper/paper/stripe,
+/turf/closed/wall/vampwall/market,
+/area/vtm/interior/shop/gunshop)
+"sG" = (
+/obj/structure/table,
+/obj/lombard/blackmarket,
+/obj/structure/platform/lowwall/rich/old,
+/turf/open/floor/plating/rough,
+/area/vtm/interior/cog/pantry)
"sR" = (
/obj/effect/decal/pallet,
/turf/open/misc/dirt,
/area/vtm/outside/supply)
+"sT" = (
+/obj/effect/gibspawner/human,
+/obj/machinery/light/directional/west,
+/turf/open/floor/city/toilet,
+/area/vtm/interior/shop/gummaguts)
"sU" = (
/obj/item/kirbyplants/darkpack/random{
pixel_x = -7;
@@ -1089,22 +1197,10 @@
/obj/structure/lattice/grate,
/turf/open/openspace,
/area/vtm/interior/techshop)
-"tf" = (
-/obj/effect/turf_decal/bordur{
- dir = 10
- },
-/obj/structure/lamppost/four,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/outside/pacificheights)
"tg" = (
/obj/structure/vampdoor,
/turf/open/floor/plating/rough/cave,
/area/vtm/interior/techshop)
-"ti" = (
-/obj/machinery/smartfridge/drying/rack,
-/obj/machinery/light/directional/north,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
"tu" = (
/obj/darkpack_car/track/volkswagen{
dir = 4;
@@ -1122,26 +1218,14 @@
},
/turf/open/floor/plating/asphalt,
/area/vtm/outside/pacificheights)
-"tO" = (
-/obj/effect/gibspawner/human,
-/obj/structure/sign/city/store/gummaguts/directional/north,
-/turf/open/floor/city/toilet,
-/area/vtm/interior/shop)
"tP" = (
/mob/living/carbon/human/npc/shop,
/obj/effect/decal/carpet{
pixel_x = 5;
pixel_y = -14
},
-/turf/open/misc/beach/vamp,
-/area/vtm/outside/pacificheights)
-"tU" = (
-/obj/structure/retail/bacotell_menu{
- dir = 1
- },
-/obj/structure/table/countertop/bacotell,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
+/turf/open/misc/beach/vamp,
+/area/vtm/outside/pacificheights)
"tW" = (
/obj/darkpack_car/police/ranger,
/turf/open/floor/plating/asphalt,
@@ -1160,6 +1244,16 @@
},
/turf/open/floor/iron/smooth_large,
/area/vtm/outside/pacificheights)
+"uj" = (
+/obj/structure/platform/lowwall/market/window,
+/turf/open/floor/plating/rough,
+/area/vtm/interior/shop/gunshop)
+"ul" = (
+/obj/machinery/light/floor/lamppost/one{
+ dir = 1
+ },
+/turf/open/floor/plating/sidewalk,
+/area/vtm/outside/pacificheights)
"ut" = (
/obj/structure/chair/comfy/darkpack/green{
dir = 1
@@ -1179,6 +1273,9 @@
/obj/fusebox/transformer,
/turf/open/floor/plating/rough,
/area/vtm/interior/clinic)
+"uH" = (
+/turf/closed/wall/vampwall/brick,
+/area/vtm/interior/shop/gasstation)
"uJ" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -1186,22 +1283,9 @@
/obj/effect/spawner/random/vending/colavend,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
-"uK" = (
-/obj/effect/turf_decal/bordur{
- dir = 4
- },
-/obj/structure/lamppost/one{
- dir = 4
- },
-/turf/open/floor/plating/sidewalk/rich,
-/area/vtm/outside/pacificheights)
-"uL" = (
-/obj/structure/table/countertop/bubway,
-/obj/structure/retail/otolleys_menu{
- dir = 1
- },
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
+"uQ" = (
+/turf/open/floor/city/toilet,
+/area/vtm/interior/shop/gummaguts)
"uX" = (
/obj/effect/landmark/navigate_destination,
/turf/open/floor/plating/rough,
@@ -1235,19 +1319,10 @@
},
/turf/open/floor/plating/rough,
/area/vtm/interior/graveyard)
-"vl" = (
-/obj/effect/turf_decal/bordur{
- dir = 8
- },
-/obj/structure/lamppost/one{
- dir = 8
- },
-/turf/open/floor/plating/sidewalk/rich,
-/area/vtm/outside/pacificheights)
-"vm" = (
-/obj/machinery/hydroponics/simple/wooden,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
+"vj" = (
+/obj/structure/table/countertop/purple,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/pharmacy)
"vs" = (
/obj/effect/landmark/npcbeacon,
/obj/effect/turf_decal/bordur/corner,
@@ -1261,39 +1336,41 @@
},
/turf/open/floor/plating/rough,
/area/vtm/interior/graveyard)
+"vz" = (
+/obj/effect/turf_decal/bordur{
+ dir = 4
+ },
+/obj/machinery/light/floor/lamppost/three{
+ dir = 4
+ },
+/turf/open/floor/plating/sidewalk,
+/area/vtm/outside/pacificheights)
"vA" = (
/obj/transfer_point_vamp{
id = "test_5"
},
/turf/open/floor/plating/asphalt,
/area/vtm/outside/pacificheights)
-"vD" = (
-/mob/living/carbon/human/npc/shop,
-/turf/open/floor/city/toilet,
-/area/vtm/interior/shop)
+"vG" = (
+/obj/structure/toiletbong,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/pantry)
"vH" = (
/obj/structure/sign/city/police_department/directional/north{
icon_state = "police3"
},
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
-"vJ" = (
-/obj/effect/decal/cleanable/litter,
-/obj/structure/rack/tall/store_shelf_metal{
- dir = 8
- },
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"vO" = (
/obj/structure/chair/darkpack{
dir = 8
},
/turf/open/floor/plating/rough/cave,
/area/vtm/interior/techshop)
-"vT" = (
-/obj/machinery/hydroponics/soil,
+"vS" = (
+/obj/machinery/light/floor/lamppost/three,
/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
+/area/vtm/outside/pacificheights)
"wb" = (
/obj/structure/table,
/obj/item/storage/medkit/darkpack/brute,
@@ -1301,6 +1378,11 @@
/obj/item/storage/medkit/darkpack/brute,
/turf/open/floor/plating/rough,
/area/vtm/interior/clinic)
+"wi" = (
+/obj/machinery/griddle,
+/obj/structure/sign/city/store/bubway/directional/north,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/bubway)
"wj" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -1319,6 +1401,17 @@
},
/turf/open/floor/wood/smooth/old,
/area/vtm/interior/sewer)
+"wD" = (
+/turf/closed/wall/vampwall/market,
+/area/vtm/interior/shop/pharmacy)
+"wE" = (
+/obj/structure/table/countertop/yellow,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/clothing_store)
+"wG" = (
+/obj/structure/table/countertop/green,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/gasstation)
"wO" = (
/obj/effect/decal/cleanable/trash,
/turf/open/misc/beach/vamp,
@@ -1327,14 +1420,11 @@
/obj/structure/bonfire/prelit/fire_barrel,
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/ghetto)
-"xc" = (
-/obj/weapon_showcase,
-/turf/open/floor/wood/smooth/old,
-/area/vtm/interior/shop)
-"xd" = (
-/obj/structure/closet/crate/wooden/communitygardens/tools,
+"xf" = (
+/obj/machinery/smartfridge/drying/rack,
+/obj/machinery/light/directional/north,
/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
+/area/vtm/interior/cog/pantry)
"xh" = (
/obj/effect/turf_decal/bordur{
dir = 1
@@ -1354,6 +1444,10 @@
},
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
+"xv" = (
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood/smooth/old,
+/area/vtm/interior/shop/gunshop)
"xC" = (
/obj/effect/turf_decal/bordur/corner{
dir = 8
@@ -1378,6 +1472,11 @@
/obj/structure/table/countertop/beige,
/turf/open/floor/plating/rough,
/area/vtm/interior/shop)
+"xQ" = (
+/obj/structure/retail/gas_station,
+/obj/structure/table/countertop/yellow,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/clothing_store)
"xU" = (
/obj/structure/table,
/obj/item/ammo_box/magazine/darkpackthompson,
@@ -1432,24 +1531,6 @@
},
/turf/open/misc/grass,
/area/vtm/outside/pacificheights)
-"yX" = (
-/obj/structure/table/wood,
-/obj/item/food/grown/cannabis,
-/obj/item/food/grown/cannabis,
-/obj/item/food/grown/cannabis,
-/obj/item/food/grown/cannabis,
-/obj/item/food/grown/cannabis,
-/obj/item/food/grown/cannabis,
-/obj/item/bong{
- pixel_y = 10;
- pixel_x = 10
- },
-/obj/item/bong{
- pixel_y = 2;
- pixel_x = 10
- },
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
"zd" = (
/turf/open/floor/wood/smooth/old,
/area/vtm/interior/sewer)
@@ -1469,10 +1550,6 @@
/obj/machinery/light/directional/north,
/turf/open/floor/plating/concrete,
/area/vtm/interior/shop)
-"zx" = (
-/obj/structure/platform/lowwall/market/window,
-/turf/open/floor/plating/rough,
-/area/vtm/interior/shop)
"zA" = (
/obj/effect/decal/cleanable/trash{
icon_state = "trash5"
@@ -1493,13 +1570,13 @@
/obj/structure/table/wood,
/turf/open/floor/wood/smooth/old,
/area/vtm/interior/sewer)
-"zQ" = (
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
-"zX" = (
-/obj/effect/decal/wallpaper/red,
-/turf/closed/wall/vampwall/market,
-/area/vtm/interior/shop)
+"zV" = (
+/obj/effect/decal/cleanable/litter,
+/obj/structure/rack/tall/store_shelf_metal{
+ dir = 8
+ },
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/gasstation)
"Ag" = (
/obj/effect/decal/cleanable/litter,
/obj/effect/spawner/random/stray_animal,
@@ -1523,15 +1600,6 @@
/obj/structure/bookcase/random/adult,
/turf/open/floor/plating/concrete,
/area/vtm/interior/shop)
-"AU" = (
-/obj/effect/turf_decal/bordur{
- dir = 4
- },
-/obj/structure/lamppost/three{
- dir = 4
- },
-/turf/open/floor/plating/sidewalk,
-/area/vtm/outside/pacificheights)
"Be" = (
/obj/structure/vampdoor/simple,
/obj/effect/mapping_helpers/door/access/supply,
@@ -1545,15 +1613,6 @@
},
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
-"Bp" = (
-/obj/structure/vampdoor,
-/turf/open/floor/city/toilet,
-/area/vtm/interior/shop)
-"Bq" = (
-/obj/effect/turf_decal/bordur,
-/obj/structure/lamppost/one,
-/turf/open/floor/plating/sidewalk/poor,
-/area/vtm/outside/pacificheights)
"Bs" = (
/obj/structure/transport/linear/public,
/obj/effect/landmark/transport/transport_id{
@@ -1585,11 +1644,6 @@
/obj/structure/closet/crate/bin,
/turf/open/floor/plating/rough,
/area/vtm/interior/techshop)
-"BX" = (
-/obj/structure/table,
-/obj/structure/platform/lowwall/market,
-/turf/open/floor/plating/rough,
-/area/vtm/interior/shop)
"Ca" = (
/obj/structure/table,
/obj/item/gun/ballistic/automatic/darkpack/sniper,
@@ -1608,12 +1662,6 @@
},
/turf/open/floor/plating/asphalt,
/area/vtm/outside/pacificheights)
-"Ct" = (
-/obj/structure/lamppost/one{
- dir = 1
- },
-/turf/open/floor/plating/sidewalk,
-/area/vtm/outside/pacificheights)
"Cz" = (
/obj/effect/turf_decal/asphaltline{
dir = 8
@@ -1628,6 +1676,9 @@
/obj/structure/chair/wood/darkpack,
/turf/open/floor/plating/rough,
/area/vtm/interior/techshop)
+"CC" = (
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/caern)
"CF" = (
/obj/structure/guncase,
/obj/item/gun/ballistic/shotgun/vampire,
@@ -1699,10 +1750,6 @@
/obj/structure/table/wood,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
-"Dw" = (
-/obj/machinery/stove,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"Dx" = (
/obj/machinery/button/elevator/directional/north{
id = "DebugElevator3";
@@ -1716,32 +1763,23 @@
},
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
-"DG" = (
-/obj/structure/retail/gas_station,
-/obj/structure/table/countertop/yellow,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
+"Dz" = (
+/obj/structure/retail/gun_store{
+ dir = 1
+ },
+/obj/structure/table,
+/obj/structure/platform/lowwall/market,
+/turf/open/floor/plating/rough,
+/area/vtm/interior/shop/gunshop)
"DJ" = (
/obj/item/vamp/keys/anarch,
/turf/open/floor/plating/asphalt,
/area/vtm/outside/pacificheights)
-"DN" = (
-/obj/structure/rack/clothing/rand{
- dir = 8
- },
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
-"DP" = (
-/obj/structure/table/wood,
-/obj/item/storage/fancy/rollingpapers{
- pixel_x = -6
- },
-/obj/item/storage/box/matches{
- pixel_x = 6;
- pixel_y = 10
- },
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
+"DM" = (
+/obj/structure/table,
+/obj/structure/platform/lowwall/market,
+/turf/open/floor/plating/rough,
+/area/vtm/interior/shop/gummaguts)
"DS" = (
/obj/effect/decal/pallet,
/obj/effect/abstract/cargo_landing_spot,
@@ -1752,26 +1790,14 @@
/obj/structure/table/wood,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
-"DV" = (
-/obj/structure/closet/secure_closet/freezer/meat,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
+"DU" = (
+/obj/machinery/hydroponics/soil,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/pantry)
"DW" = (
/obj/structure/roofstuff/vent/south,
/turf/open/misc/grass,
/area/vtm/outside/pacificheights)
-"DY" = (
-/obj/structure/lamppost/one,
-/turf/open/floor/plating/sidewalk/rich,
-/area/vtm/outside/pacificheights)
-"Eb" = (
-/obj/structure/retail/gun_store{
- dir = 1
- },
-/obj/structure/table,
-/obj/structure/platform/lowwall/market,
-/turf/open/floor/plating/rough,
-/area/vtm/interior/shop)
"Ef" = (
/turf/closed/wall/vampwall/rich/old,
/area/vtm/interior/sewer)
@@ -1779,6 +1805,12 @@
/obj/structure/cargo_put,
/turf/open/misc/dirt,
/area/vtm/outside/supply)
+"En" = (
+/obj/structure/rack/tall/store_shelf_metal{
+ dir = 4
+ },
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/clothing_store)
"Ep" = (
/obj/item/flashlight/lantern/on{
pixel_x = -8;
@@ -1799,12 +1831,6 @@
},
/turf/open/floor/plating/rough,
/area/vtm/interior/techshop)
-"Ew" = (
-/obj/structure/vampdoor{
- dir = 4
- },
-/turf/open/floor/wood/smooth/old,
-/area/vtm/interior/shop)
"EE" = (
/obj/machinery/light/directional/west,
/turf/open/misc/dirt,
@@ -1813,25 +1839,12 @@
/obj/structure/platform/lowwall/rich/old/window,
/turf/open/floor/plating/rough,
/area/vtm/interior/clinic)
+"EU" = (
+/turf/closed/wall/vampwall/rich/old,
+/area/vtm/interior/cog/pantry)
"EY" = (
/turf/closed/wall/vampwall/rich,
/area/vtm/outside/pacificheights)
-"Fa" = (
-/obj/structure/table/wood,
-/obj/item/seeds/cannabis,
-/obj/item/seeds/cannabis,
-/obj/item/seeds/cannabis,
-/obj/item/seeds/cannabis,
-/obj/item/seeds/cannabis,
-/obj/item/seeds/cannabis,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
-"Fe" = (
-/obj/structure/table,
-/obj/lombard,
-/obj/structure/platform/lowwall/rich/old,
-/turf/open/floor/plating/rough,
-/area/vtm/interior/cog)
"Ff" = (
/obj/effect/spawner/random/trash/grime{
spawn_loot_count = 30;
@@ -1893,14 +1906,13 @@
/obj/cargocrate,
/turf/open/misc/dirt/rails,
/area/vtm/outside/supply)
-"Gf" = (
-/obj/machinery/hydroponics/simple/plastic,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
-"Gj" = (
-/obj/effect/gibspawner/human,
-/turf/open/floor/city/toilet,
-/area/vtm/interior/shop)
+"FZ" = (
+/obj/structure/retail/bacotell_menu{
+ dir = 1
+ },
+/obj/structure/table/countertop/bacotell,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/pharmacy)
"Gm" = (
/obj/structure/vampdoor/prison,
/turf/open/floor/plating/rough,
@@ -1915,13 +1927,14 @@
/obj/item/storage/medkit/darkpack/tox,
/turf/open/floor/plating/rough,
/area/vtm/interior/clinic)
-"Gu" = (
-/obj/structure/platform/lowwall/brick/window,
-/turf/open/floor/plating/rough,
-/area/vtm/interior/shop)
"GF" = (
/turf/cordon,
/area/misc/cordon)
+"GG" = (
+/obj/effect/gibspawner/human,
+/obj/structure/sign/city/store/gummaguts/directional/north,
+/turf/open/floor/city/toilet,
+/area/vtm/interior/shop/gummaguts)
"GH" = (
/obj/structure/table/reinforced,
/obj/structure/platform/lowwall/brick,
@@ -1938,15 +1951,6 @@
},
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
-"GM" = (
-/obj/structure/table,
-/obj/machinery/microwave{
- desc = "Cooks and boils stuff, somehow.";
- pixel_x = -3;
- pixel_y = 5
- },
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"GN" = (
/turf/closed/wall/vampwall/rich/old,
/area/vtm/outside/ghetto)
@@ -2012,16 +2016,21 @@
},
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
-"Hp" = (
-/obj/effect/decal/wallpaper,
-/turf/closed/wall/vampwall/brick,
-/area/vtm/interior/shop)
+"Ht" = (
+/obj/weapon_showcase,
+/obj/structure/sign/flag/usa/directional/north,
+/turf/open/floor/wood/smooth/old,
+/area/vtm/interior/shop/gunshop)
"Hu" = (
/obj/structure/sign/city/police_department/directional/north{
icon_state = "police2"
},
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"Hw" = (
+/obj/structure/werewolf_totem/children_of_gaia,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/caern)
"Hy" = (
/obj/machinery/atm{
dir = 8;
@@ -2052,6 +2061,13 @@
/obj/effect/landmark/npcbeacon,
/turf/open/floor/plating/asphalt,
/area/vtm/outside/pacificheights)
+"HR" = (
+/obj/structure/platform/lowwall/market/window,
+/turf/open/floor/plating/rough,
+/area/vtm/interior/shop/gummaguts)
+"HU" = (
+/turf/closed/wall/vampwall/rich/old,
+/area/vtm/interior/cog/caern/bawn)
"Id" = (
/turf/open/floor/plating/rough,
/area/vtm/interior/techshop)
@@ -2072,13 +2088,6 @@
/obj/structure/roadblock,
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/pacificheights)
-"Ii" = (
-/obj/machinery/smartfridge/drying/rack,
-/obj/item/food/grown/cannabis,
-/obj/item/food/grown/cannabis,
-/obj/item/food/grown/cannabis,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
"IA" = (
/obj/structure/railing{
dir = 10
@@ -2111,6 +2120,10 @@
/obj/structure/table/wood,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"Jc" = (
+/obj/machinery/light/floor/lamppost/one,
+/turf/open/floor/plating/sidewalk/rich,
+/area/vtm/outside/pacificheights)
"Jf" = (
/obj/machinery/door/airlock/elevator/left{
dir = 8;
@@ -2141,19 +2154,6 @@
/obj/item/reagent_containers/blood,
/turf/open/floor/plating/rough,
/area/vtm/interior/clinic)
-"Ju" = (
-/obj/effect/gibspawner/human,
-/obj/machinery/light/directional/west,
-/turf/open/floor/city/toilet,
-/area/vtm/interior/shop)
-"JB" = (
-/obj/machinery/light/directional/east,
-/turf/open/floor/wood/smooth/old,
-/area/vtm/interior/shop)
-"JE" = (
-/obj/structure/closet/crate/wooden/communitygardens/seeds,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
"JG" = (
/obj/structure/table,
/obj/item/ammo_box/magazine/glock9mm,
@@ -2199,13 +2199,6 @@
},
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
-"Kp" = (
-/obj/structure/retail/junkfood_menu{
- dir = 4
- },
-/obj/structure/table/countertop/teal,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"Kr" = (
/obj/structure/table,
/obj/item/stack/dollar/thousand,
@@ -2230,21 +2223,18 @@
/obj/item/ammo_box/magazine/darkpack545,
/obj/item/ammo_box/magazine/darkpack545,
/obj/item/ammo_box/magazine/darkpack545,
-/obj/item/gun/ballistic/automatic/darkpack/ak74,
-/obj/fusebox,
-/turf/open/floor/plating/rough,
-/area/vtm/interior/anarch)
-"KD" = (
-/obj/structure/retail/pharmacy{
- dir = 8
- },
-/obj/structure/table/countertop/purple,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
+/obj/item/gun/ballistic/automatic/darkpack/ak74,
+/obj/fusebox,
+/turf/open/floor/plating/rough,
+/area/vtm/interior/anarch)
"KF" = (
/mob/living/carbon/human/npc/shop,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
+"KL" = (
+/obj/machinery/light/directional/west,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/pharmacy)
"KR" = (
/obj/structure/transport/linear/public,
/obj/structure/railing/corner/end/flip{
@@ -2258,10 +2248,6 @@
},
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
-"KW" = (
-/obj/structure/table/countertop/yellow,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"La" = (
/obj/structure/chair/darkpack/blue,
/turf/open/floor/plating/rough,
@@ -2275,12 +2261,23 @@
/obj/item/storage/cans/sixbeer,
/turf/open/floor/plating/elevatorshaft,
/area/vtm/outside/pacificheights)
+"Lh" = (
+/mob/living/carbon/human/npc/shop,
+/obj/effect/decal/cleanable/trash{
+ icon_state = "trash7"
+ },
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/clothing_store)
"Lj" = (
/obj/structure/roadblock{
dir = 4
},
/turf/open/misc/dirt,
/area/vtm/outside/supply)
+"Lm" = (
+/obj/effect/decal/wallpaper,
+/turf/closed/wall/vampwall/brick,
+/area/vtm/interior/shop/bubway)
"Lw" = (
/obj/structure/table,
/obj/item/gas_can,
@@ -2303,6 +2300,10 @@
/obj/effect/abstract/cargo_landing_spot,
/turf/open/misc/dirt,
/area/vtm/outside/supply)
+"LE" = (
+/obj/effect/gibspawner/human,
+/turf/open/floor/city/toilet,
+/area/vtm/interior/shop/gummaguts)
"LG" = (
/obj/structure/table/wood,
/obj/item/occult_artifact/werewolf/dagger_of_retribution{
@@ -2391,6 +2392,10 @@
},
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"Mb" = (
+/obj/structure/sink/directional/east,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/pantry)
"Mf" = (
/obj/structure/vampdoor{
dir = 4
@@ -2417,11 +2422,6 @@
},
/turf/open/misc/dirt,
/area/vtm/outside/supply)
-"Mr" = (
-/obj/structure/table/wood,
-/obj/machinery/light/directional/south,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
"MF" = (
/obj/structure/table/wood,
/obj/machinery/radio_tranceiver/camarilla,
@@ -2501,6 +2501,12 @@
"NR" = (
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"NS" = (
+/obj/structure/rack/clothing/rand{
+ dir = 8
+ },
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/clothing_store)
"NX" = (
/obj/effect/decal/pallet,
/obj/machinery/light/directional/west,
@@ -2543,11 +2549,6 @@
/obj/effect/mapping_helpers/door/access/graveyard,
/turf/open/floor/plating/rough,
/area/vtm/interior/graveyard)
-"OA" = (
-/obj/effect/turf_decal/bordur,
-/obj/structure/lamppost/one,
-/turf/open/floor/plating/sidewalk/poor,
-/area/vtm/outside/baywalk)
"OB" = (
/obj/darkpack_car/police{
locked = 0
@@ -2567,15 +2568,12 @@
/obj/item/vamp/keys/police,
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/pacificheights)
-"OL" = (
-/obj/machinery/light/directional/west,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
-"ON" = (
-/obj/machinery/oven,
-/obj/machinery/light/directional/north,
+"OJ" = (
+/obj/effect/decal/cleanable/trash{
+ icon_state = "trash5"
+ },
/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
+/area/vtm/interior/shop/clothing_store)
"OO" = (
/obj/structure/table/wood,
/obj/item/storage/box/drinkingglasses{
@@ -2588,6 +2586,11 @@
/obj/structure/vampdoor,
/turf/open/floor/wood/smooth/old,
/area/vtm/interior/sewer)
+"OT" = (
+/obj/structure/retail/grocery_store,
+/obj/structure/table/countertop/green,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/gasstation)
"OU" = (
/obj/effect/spawner/random/trash/grime{
spawn_loot_count = 20;
@@ -2595,6 +2598,17 @@
},
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"OW" = (
+/obj/item/gas_can{
+ anchored = 1;
+ pixel_y = 7
+ },
+/obj/item/gas_can{
+ anchored = 1
+ },
+/obj/structure/rack,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/clothing_store)
"OZ" = (
/obj/structure/table,
/obj/item/ammo_box/magazine/darkpackaug,
@@ -2603,10 +2617,17 @@
/obj/item/gun/ballistic/automatic/darkpack/aug,
/turf/open/floor/plating/rough,
/area/vtm/interior/anarch)
-"Pa" = (
-/obj/item/kirbyplants/random,
+"Pd" = (
+/obj/machinery/recycler/deathtrap,
+/turf/open/floor/city/toilet,
+/area/vtm/interior/shop/gummaguts)
+"Pf" = (
+/turf/closed/wall/vampwall/brick,
+/area/vtm/interior/shop/gummaguts)
+"Ph" = (
+/obj/weapon_showcase,
/turf/open/floor/wood/smooth/old,
-/area/vtm/interior/shop)
+/area/vtm/interior/shop/gunshop)
"Po" = (
/obj/structure/platform/lowwall/brick/window/reinforced,
/turf/open/floor/plating/rough,
@@ -2619,6 +2640,11 @@
/obj/machinery/computer/operating,
/turf/open/floor/plating/rough,
/area/vtm/interior/clinic)
+"Pv" = (
+/obj/structure/table/wood,
+/obj/machinery/light/directional/south,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/pantry)
"Pz" = (
/obj/structure/transport/linear/public,
/obj/machinery/elevator_control_panel/directional/north{
@@ -2634,6 +2660,10 @@
/obj/structure/roofstuff/vent,
/turf/open/misc/grass,
/area/vtm/outside/pacificheights)
+"PI" = (
+/mob/living/carbon/human/npc/shop,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/clothing_store)
"PL" = (
/obj/effect/landmark/latejoin,
/turf/open/misc/beach/vamp,
@@ -2641,32 +2671,34 @@
"PO" = (
/turf/open/floor/plating/rough,
/area/vtm/interior/anarch)
-"PR" = (
-/obj/structure/vampdoor{
- dir = 4
- },
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"PW" = (
/obj/effect/turf_decal/bordur/corner,
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/outside/pacificheights)
+"PZ" = (
+/obj/structure/fluff/tv/order/three{
+ pixel_x = -10;
+ pixel_y = 12
+ },
+/obj/structure/fluff/tv/order/four{
+ pixel_y = 12;
+ pixel_x = 6
+ },
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/pharmacy)
"Qe" = (
/obj/effect/spawner/random/stray_animal,
/obj/structure/sign/city/chinese/alt4/directional/east,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"Qf" = (
+/obj/structure/closet/crate/wooden/communitygardens/seeds,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/pantry)
"Qi" = (
/obj/effect/turf_decal/asphaltline/alt,
/turf/open/floor/plating/asphalt,
/area/vtm/outside/pacificheights)
-"Qj" = (
-/obj/structure/table/countertop/bubway,
-/obj/structure/retail/bubway_menu{
- dir = 1
- },
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"Qk" = (
/obj/effect/landmark/teleport_mark/alltribes,
/turf/open/floor/plating/rough/cave,
@@ -2689,6 +2721,10 @@
/obj/structure/table/countertop/black,
/turf/open/floor/plating/rough,
/area/vtm/interior/shop)
+"Qx" = (
+/obj/effect/realistic_fog/bawn/children_of_gaia,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/caern/bawn)
"QD" = (
/obj/machinery/light/directional/north,
/obj/effect/decal/cleanable/trash,
@@ -2728,11 +2764,6 @@
},
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
-"QU" = (
-/obj/effect/turf_decal/bordur,
-/obj/structure/lamppost/one,
-/turf/open/floor/plating/sidewalk/poor,
-/area/vtm/outside/financialdistrict)
"QW" = (
/obj/machinery/light/directional/north,
/obj/effect/spawner/random/vending/snackvend,
@@ -2747,14 +2778,6 @@
},
/turf/open/misc/dirt/rails,
/area/vtm/outside/supply)
-"Rh" = (
-/obj/structure/table,
-/obj/structure/retail/gummaguts_menu{
- dir = 8
- },
-/obj/structure/platform/lowwall/market,
-/turf/open/floor/plating/rough,
-/area/vtm/interior/shop)
"Ri" = (
/obj/structure/table,
/obj/item/surgery_tray/full,
@@ -2768,6 +2791,23 @@
/obj/machinery/radio_tranceiver/clinic,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"Rp" = (
+/obj/structure/vampdoor{
+ dir = 4
+ },
+/turf/open/floor/wood/smooth/old,
+/area/vtm/interior/shop/gunshop)
+"Ru" = (
+/obj/structure/table/wood,
+/obj/item/storage/fancy/rollingpapers{
+ pixel_x = -6
+ },
+/obj/item/storage/box/matches{
+ pixel_x = 6;
+ pixel_y = 10
+ },
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/pantry)
"Rx" = (
/obj/effect/landmark/npcbeacon,
/obj/effect/turf_decal/bordur/corner{
@@ -2775,22 +2815,37 @@
},
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/outside/pacificheights)
+"RE" = (
+/obj/machinery/stove,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/bubway)
+"RH" = (
+/obj/structure/rack/tall/store_shelf_metal{
+ dir = 8
+ },
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/gasstation)
"RP" = (
/obj/effect/decal/cleanable/trash{
icon_state = "trash7"
},
/turf/open/floor/wood/smooth/old,
/area/vtm/interior/sewer)
-"RV" = (
-/obj/structure/werewolf_totem/generic/weaver,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/techshop)
"Sf" = (
/obj/structure/sign/city/police_department/directional/north{
icon_state = "police4"
},
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"Si" = (
+/obj/structure/table,
+/obj/machinery/microwave{
+ desc = "Cooks and boils stuff, somehow.";
+ pixel_x = -3;
+ pixel_y = 5
+ },
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/bubway)
"Sj" = (
/obj/effect/landmark/latejoin_masquerade,
/turf/open/misc/beach/vamp,
@@ -2801,6 +2856,10 @@
/obj/item/clothing/gloves/vampire/latex,
/turf/open/floor/plating/rough,
/area/vtm/interior/clinic)
+"Su" = (
+/obj/structure/closet/cardboard,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/gasstation)
"Sv" = (
/obj/effect/turf_decal/bordur,
/obj/structure/barrels/rand,
@@ -2873,6 +2932,13 @@
},
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"Tz" = (
+/turf/closed/wall/vampwall/market,
+/area/vtm/interior/shop/gunshop)
+"TF" = (
+/obj/effect/landmark/bawn_entrance/gaia/children_of_gaia,
+/turf/open/openspace,
+/area/vtm/interior/techshop)
"TL" = (
/obj/structure/table,
/obj/item/ammo_box/magazine/m44,
@@ -2881,6 +2947,10 @@
/obj/item/gun/ballistic/automatic/pistol/darkpack/deagle,
/turf/open/floor/plating/rough,
/area/vtm/interior/anarch)
+"Ug" = (
+/mob/living/carbon/human/npc/shop,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/pharmacy)
"Uq" = (
/obj/machinery/fax/admin/anarch,
/obj/structure/table/wood,
@@ -2900,10 +2970,6 @@
/obj/item/gun/ballistic/automatic/darkpack/mp5,
/turf/open/floor/plating/rough,
/area/vtm/interior/anarch)
-"Uw" = (
-/obj/structure/sink/directional/east,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
"UC" = (
/obj/effect/turf_decal/bordur{
dir = 8
@@ -2928,6 +2994,13 @@
/obj/structure/transport/linear/public,
/turf/open/floor/plating/elevatorshaft,
/area/vtm/outside/pacificheights)
+"UX" = (
+/obj/structure/retail/junkfood_menu{
+ dir = 4
+ },
+/obj/structure/table/countertop/teal,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/gasstation)
"Vg" = (
/obj/structure/table,
/obj/item/melee/vamp/tire,
@@ -2941,6 +3014,18 @@
},
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/outside/pacificheights)
+"Vo" = (
+/obj/structure/fluff/tv/order/one{
+ pixel_y = 12;
+ pixel_x = -10
+ },
+/obj/structure/fluff/tv/order/two{
+ pixel_y = 12;
+ pixel_x = 6
+ },
+/obj/structure/sign/city/store/bacotell/directional/north,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/pharmacy)
"Vr" = (
/obj/machinery/fax/tremere,
/obj/structure/table/wood,
@@ -2950,11 +3035,10 @@
/obj/structure/closet/cardboard,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
-"Vv" = (
-/obj/machinery/griddle,
-/obj/structure/sign/city/store/bubway/directional/north,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
+"VB" = (
+/obj/structure/vampdoor,
+/turf/open/floor/city/toilet,
+/area/vtm/interior/shop/gummaguts)
"VD" = (
/obj/effect/turf_decal/bordur{
dir = 1
@@ -2992,16 +3076,16 @@
},
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
+"VP" = (
+/mob/living/carbon/human/npc/shop,
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/gasstation)
"VQ" = (
/obj/effect/turf_decal/asphaltline{
dir = 8
},
/turf/open/floor/plating/asphalt,
/area/vtm/outside/pacificheights)
-"VW" = (
-/obj/structure/toiletbong,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
"Wa" = (
/turf/open/misc/dirt,
/area/vtm/outside/supply)
@@ -3035,15 +3119,18 @@
/obj/vampire_computer,
/turf/open/floor/plating/rough,
/area/vtm/interior/techshop)
-"Wy" = (
-/obj/structure/retail/grocery_store,
-/obj/structure/table/countertop/green,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"Wz" = (
/obj/structure/sink/directional/east,
/turf/open/floor/plating/rough,
/area/vtm/interior/clinic)
+"WA" = (
+/obj/structure/table,
+/obj/structure/retail/gummaguts_menu{
+ dir = 8
+ },
+/obj/structure/platform/lowwall/market,
+/turf/open/floor/plating/rough,
+/area/vtm/interior/shop/gummaguts)
"WB" = (
/obj/structure/table/wood,
/obj/item/occult_artifact/vampire/mummywrap_fetish{
@@ -3072,19 +3159,14 @@
/obj/structure/transport/linear/public,
/turf/open/floor/plating/elevatorshaft,
/area/vtm/outside/pacificheights)
-"WR" = (
-/obj/structure/lamppost/one,
-/turf/open/misc/beach/vamp,
-/area/vtm/outside/pacificheights)
"WW" = (
/turf/open/floor/plating/canal,
/area/vtm/interior/techshop)
-"WZ" = (
-/obj/structure/lamppost/one{
- dir = 8
- },
-/turf/open/floor/plating/sidewalk,
-/area/vtm/outside/pacificheights)
+"WY" = (
+/obj/effect/turf_decal/bordur,
+/obj/machinery/light/floor/lamppost/one,
+/turf/open/floor/plating/sidewalk/poor,
+/area/vtm/outside/baywalk)
"Xc" = (
/obj/machinery/button/elevator/directional/north{
id = "DebugElevator3";
@@ -3110,10 +3192,6 @@
/obj/machinery/bookbinder,
/turf/open/floor/plating/concrete,
/area/vtm/interior/shop)
-"Xw" = (
-/obj/machinery/recycler/deathtrap,
-/turf/open/floor/city/toilet,
-/area/vtm/interior/shop)
"Xz" = (
/obj/effect/decal/pallet,
/obj/item/ammo_box/darkpack/c556/silver,
@@ -3129,6 +3207,13 @@
/obj/structure/sign/city/anarch,
/turf/open/floor/plating/rough,
/area/vtm/interior/techshop)
+"XB" = (
+/obj/machinery/light/directional/north,
+/obj/structure/rack/tall/store_shelf_metal{
+ dir = 4
+ },
+/turf/open/floor/plating/concrete,
+/area/vtm/interior/shop/clothing_store)
"XD" = (
/obj/machinery/door/airlock/elevator/right{
dir = 4;
@@ -3141,13 +3226,6 @@
/obj/structure/fence/door,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
-"XG" = (
-/obj/structure/retail/smoke_menu{
- dir = 4
- },
-/obj/structure/table/countertop/teal,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"XJ" = (
/obj/effect/turf_decal/bordur,
/turf/open/floor/plating/sidewalk,
@@ -3172,21 +3250,11 @@
/obj/machinery/light/dim/directional/east,
/turf/open/floor/plating/rough,
/area/vtm/interior/graveyard)
-"XY" = (
-/obj/structure/lamppost/three,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/outside/pacificheights)
"XZ" = (
/obj/structure/chair/stool/bar/directional/west,
/mob/living/carbon/human/npc/incel,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
-"Yk" = (
-/obj/structure/rack/tall/store_shelf_metal{
- dir = 4
- },
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
"Ys" = (
/turf/open/openspace,
/area/vtm/outside/pacificheights)
@@ -3201,13 +3269,15 @@
/obj/structure/table/wood,
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
-"YH" = (
-/turf/open/floor/city/toilet,
-/area/vtm/interior/shop)
-"YJ" = (
-/obj/structure/table/countertop/green,
-/turf/open/floor/plating/concrete,
-/area/vtm/interior/shop)
+"YC" = (
+/obj/machinery/light/directional/north,
+/obj/structure/werewolf_totem/generic/gaia,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/pantry)
+"YF" = (
+/obj/machinery/hydroponics/simple/wooden,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/interior/cog/pantry)
"YL" = (
/obj/effect/turf_decal/bordur{
dir = 1
@@ -3239,11 +3309,6 @@
"Zi" = (
/turf/open/floor/wood/rough,
/area/vtm/interior/techshop)
-"Zj" = (
-/obj/machinery/light/directional/north,
-/obj/structure/werewolf_totem/children_of_gaia,
-/turf/open/floor/plating/sidewalk,
-/area/vtm/interior/cog)
"Zs" = (
/turf/closed/wall/vampwall/brick_old,
/area/vtm/outside/pacificheights)
@@ -3255,6 +3320,9 @@
/obj/structure/roadsign/street,
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/pacificheights)
+"ZE" = (
+/turf/open/floor/wood/smooth/old,
+/area/vtm/interior/shop/gunshop)
"ZF" = (
/obj/structure/railing,
/turf/open/floor/plating/canal,
@@ -3642,7 +3710,7 @@ Bt
NR
NR
NR
-Bq
+lt
Hh
VQ
ik
@@ -4186,7 +4254,7 @@ je
NR
kb
NR
-Bq
+lt
tF
VQ
ik
@@ -4798,7 +4866,7 @@ QW
NR
NR
NR
-Bq
+lt
ik
VQ
tu
@@ -4990,9 +5058,9 @@ iD
iD
fo
iD
-qv
-iD
-iD
+jn
+in
+in
NR
Fg
Fg
@@ -5058,9 +5126,9 @@ iD
AE
oW
NO
-oW
-OL
-iD
+oj
+KL
+in
NR
Gm
gF
@@ -5126,9 +5194,9 @@ iD
AE
BL
Xr
-oW
-BL
-iD
+oj
+Ug
+in
NR
Fg
Nw
@@ -5194,9 +5262,9 @@ iD
bo
et
iD
-ri
-KD
-iD
+vj
+by
+in
NR
Fg
sY
@@ -5323,10 +5391,10 @@ GF
"}
(31,1,1) = {"
GF
-kS
-PR
-kS
-kS
+wD
+ea
+wD
+wD
NR
NR
NR
@@ -5391,10 +5459,10 @@ GF
"}
(32,1,1) = {"
GF
-zX
-oW
-qR
-kS
+eE
+oj
+kO
+wD
NR
NR
NR
@@ -5410,7 +5478,7 @@ NR
NR
NR
NR
-Bq
+lt
ik
VQ
ik
@@ -5459,17 +5527,17 @@ GF
"}
(33,1,1) = {"
GF
-zX
-nD
-BL
-tU
+eE
+Vo
+Ug
+FZ
NR
NR
NR
-Fg
-XG
-Kp
-Fg
+uH
+cd
+UX
+uH
GH
GH
Fg
@@ -5527,17 +5595,17 @@ GF
"}
(34,1,1) = {"
GF
-zX
-ki
-oW
-ci
+eE
+PZ
+oj
+my
NR
NR
NR
-YJ
-BL
-ie
-oW
+wG
+VP
+Su
+qs
BL
oW
Fg
@@ -5595,17 +5663,17 @@ GF
"}
(35,1,1) = {"
GF
-Fg
-ON
-oW
-Fg
+rA
+mB
+oj
+rA
eg
NR
NR
-Wy
-vJ
-mL
-Fg
+OT
+zV
+RH
+uH
dA
oW
oW
@@ -5663,23 +5731,23 @@ GF
"}
(36,1,1) = {"
GF
-Hp
-Dw
-oW
-uL
+Lm
+RE
+mA
+kQ
NR
NR
NR
-Fg
-aw
-Yk
-Fg
-kS
-kS
-kS
-kS
-kS
-Fg
+kP
+XB
+En
+kP
+nB
+nB
+nB
+nB
+nB
+Pf
vH
NR
Dh
@@ -5731,23 +5799,23 @@ GF
"}
(37,1,1) = {"
GF
-Hp
-Vv
-BL
-Qj
+Lm
+wi
+gc
+nl
NR
NR
NR
-DG
-sy
-eJ
-DN
-kS
-bj
-Ju
-Gj
-YH
-Fg
+xQ
+Lh
+OJ
+NS
+nB
+om
+sT
+LE
+uQ
+Pf
Sf
NR
cj
@@ -5799,23 +5867,23 @@ GF
"}
(38,1,1) = {"
GF
-Hp
-GM
-DV
-Fg
+Lm
+Si
+ma
+dZ
NR
NR
NR
-KW
-bL
-BL
-DN
-kS
-tO
-vD
-Xw
-YH
-Bp
+wE
+OW
+PI
+NS
+nB
+GG
+kG
+Pd
+uQ
+VB
NR
NR
cj
@@ -5867,23 +5935,23 @@ GF
"}
(39,1,1) = {"
GF
-Fg
-Fg
-Fg
-Fg
+dZ
+dZ
+dZ
+dZ
NR
NR
NR
-Fg
-hF
-rn
-Gu
-kS
-BX
-Rh
-zx
-kS
-kS
+kP
+rm
+or
+hC
+nB
+DM
+WA
+HR
+nB
+nB
NR
NR
cj
@@ -5935,10 +6003,10 @@ GF
"}
(40,1,1) = {"
GF
-jW
-oV
-fI
-zx
+sB
+Ht
+aL
+uj
NR
NR
NR
@@ -6003,10 +6071,10 @@ GF
"}
(41,1,1) = {"
GF
-jW
-xc
-eU
-Eb
+sB
+Ph
+gr
+Dz
NR
NR
NR
@@ -6022,7 +6090,7 @@ NR
NR
NR
NR
-OA
+WY
Gr
VQ
ik
@@ -6071,10 +6139,10 @@ GF
"}
(42,1,1) = {"
GF
-jW
-oV
-gN
-zx
+sB
+Ht
+ZE
+uj
NR
NR
NR
@@ -6139,15 +6207,15 @@ GF
"}
(43,1,1) = {"
GF
-jW
-gN
-gN
-kS
-zx
-zx
-kS
+sB
+ZE
+ZE
+Tz
+uj
+uj
+Tz
NR
-WR
+ls
XZ
fh
fh
@@ -6207,13 +6275,13 @@ GF
"}
(44,1,1) = {"
GF
-jW
-gN
-gN
-gN
-xc
-xc
-kS
+sB
+ZE
+ZE
+ZE
+Ph
+Ph
+Tz
NR
OO
VJ
@@ -6275,13 +6343,13 @@ GF
"}
(45,1,1) = {"
GF
-jW
-Pa
-gN
-gN
-JB
-gN
-kS
+sB
+xv
+ZE
+ZE
+eq
+ZE
+Tz
NR
Nd
NR
@@ -6343,13 +6411,13 @@ GF
"}
(46,1,1) = {"
GF
-kS
-kS
-Ew
-kS
-kS
-kS
-kS
+Tz
+Tz
+Rp
+Tz
+Tz
+Tz
+Tz
NR
FC
NR
@@ -6634,7 +6702,7 @@ NR
NR
NR
NR
-QU
+se
ik
VQ
ik
@@ -7246,7 +7314,7 @@ Op
Op
Op
Op
-Bq
+lt
ik
VQ
ik
@@ -7930,7 +7998,7 @@ lX
lX
lX
Kk
-qz
+aI
XJ
FB
ik
@@ -7938,7 +8006,7 @@ VQ
ik
HJ
KU
-Ct
+ul
Zs
Ys
Ys
@@ -8112,12 +8180,12 @@ GJ
"}
(6,1,2) = {"
GJ
-ZU
-ZU
-ZU
-ZU
-ZU
-ZU
+HU
+HU
+HU
+HU
+HU
+HU
md
ZU
ZU
@@ -8180,12 +8248,12 @@ GJ
"}
(7,1,2) = {"
GJ
-ZU
-jr
-jr
-jr
-jr
-ZU
+HU
+CC
+CC
+CC
+CC
+Qx
WW
ZF
nj
@@ -8248,16 +8316,16 @@ GJ
"}
(8,1,2) = {"
GJ
-ZU
-jr
-RV
-jr
-jr
-ZU
+HU
+Hw
+CC
+CC
+CC
+Qx
Au
lC
nj
-nj
+TF
nj
nj
nj
@@ -8316,12 +8384,12 @@ GJ
"}
(9,1,2) = {"
GJ
-ZU
-jr
-jr
-jr
-jr
-ZU
+HU
+CC
+CC
+CC
+CC
+HU
tc
lC
nj
@@ -8384,12 +8452,12 @@ GJ
"}
(10,1,2) = {"
GJ
-ZU
-jr
-jr
-jr
-jr
-jr
+HU
+CC
+CC
+CC
+CC
+rV
Au
lC
nj
@@ -8406,7 +8474,7 @@ Kk
lX
lX
Kk
-qz
+aI
XJ
ik
ik
@@ -8452,12 +8520,12 @@ GJ
"}
(11,1,2) = {"
GJ
-lv
-lv
-lv
-lv
-lv
-lv
+HU
+HU
+HU
+HU
+HU
+HU
Au
lC
nj
@@ -8520,12 +8588,12 @@ GJ
"}
(12,1,2) = {"
GJ
-lv
-VW
-Uw
-Uw
-rx
-lv
+EU
+vG
+Mb
+Mb
+hd
+EU
Au
lC
nj
@@ -8588,12 +8656,12 @@ GJ
"}
(13,1,2) = {"
GJ
-lv
-vm
-zQ
-zQ
-vT
-lv
+EU
+YF
+oR
+oR
+DU
+EU
WW
ZF
nj
@@ -8656,12 +8724,12 @@ GJ
"}
(14,1,2) = {"
GJ
-lv
-vm
-zQ
-zQ
-vT
-lv
+EU
+YF
+oR
+oR
+DU
+EU
WW
NM
Zi
@@ -8686,7 +8754,7 @@ VQ
ik
ik
KU
-nq
+hf
eQ
eQ
eQ
@@ -8724,12 +8792,12 @@ GJ
"}
(15,1,2) = {"
GJ
-lv
-Zj
-zQ
-zQ
-Mr
-lv
+EU
+YC
+oR
+oR
+Pv
+EU
oP
ZF
nj
@@ -8792,12 +8860,12 @@ GJ
"}
(16,1,2) = {"
GJ
-lv
-vm
-zQ
-zQ
-Gf
-lv
+EU
+YF
+oR
+oR
+nt
+EU
Au
lC
nj
@@ -8860,12 +8928,12 @@ GJ
"}
(17,1,2) = {"
GJ
-lv
-vm
-zQ
-zQ
-Gf
-lv
+EU
+YF
+oR
+oR
+nt
+EU
Au
lC
nj
@@ -8882,7 +8950,7 @@ ca
pU
fV
ca
-qz
+aI
XJ
ik
ik
@@ -8928,12 +8996,12 @@ GJ
"}
(18,1,2) = {"
GJ
-lv
-Fa
-zQ
-zQ
-JE
-lv
+EU
+lh
+oR
+oR
+Qf
+EU
Au
FE
nj
@@ -8996,12 +9064,12 @@ GJ
"}
(19,1,2) = {"
GJ
-lv
-Fa
-zQ
-zQ
-JE
-lv
+EU
+lh
+oR
+oR
+Qf
+EU
Au
lC
nj
@@ -9064,12 +9132,12 @@ GJ
"}
(20,1,2) = {"
GJ
-lv
-Ii
-zQ
-zQ
-xd
-lv
+EU
+fK
+oR
+oR
+cY
+EU
Au
lC
nj
@@ -9132,12 +9200,12 @@ GJ
"}
(21,1,2) = {"
GJ
-lv
-ti
-zQ
-zQ
-xd
-lv
+EU
+xf
+oR
+oR
+cY
+EU
oP
ZF
nj
@@ -9200,12 +9268,12 @@ GJ
"}
(22,1,2) = {"
GJ
-lv
-yX
-zQ
-zQ
-zQ
-zQ
+EU
+mE
+oR
+oR
+oR
+oR
WW
WW
nj
@@ -9268,12 +9336,12 @@ GJ
"}
(23,1,2) = {"
GJ
-lv
-DP
-zQ
-zQ
-zQ
-zQ
+EU
+Ru
+oR
+oR
+oR
+oR
WW
WW
nj
@@ -9336,12 +9404,12 @@ GJ
"}
(24,1,2) = {"
GJ
-lv
-Fe
-hD
-lv
-lv
-lv
+EU
+cH
+sG
+EU
+EU
+EU
md
md
ZU
@@ -9358,7 +9426,7 @@ ca
ca
eQ
eQ
-XY
+vS
XJ
ik
ik
@@ -9570,7 +9638,7 @@ VQ
ik
ik
Dr
-AU
+vz
QS
QS
QS
@@ -9626,7 +9694,7 @@ Ie
qn
qn
qn
-vl
+gZ
qn
qn
qn
@@ -9894,7 +9962,7 @@ ik
ik
HQ
ik
-gs
+ix
eR
Ys
Ys
@@ -9902,7 +9970,7 @@ Ys
Ys
Ys
eR
-DY
+Jc
ty
FB
ik
@@ -10158,7 +10226,7 @@ eQ
eQ
eQ
eQ
-tf
+fg
Zc
Zc
Zc
@@ -10182,7 +10250,7 @@ VQ
ik
ik
so
-gS
+jg
XM
Ys
Ys
@@ -10238,7 +10306,7 @@ Rx
We
We
We
-uK
+ad
We
We
We
@@ -10510,7 +10578,7 @@ gj
qn
qn
qn
-vl
+gZ
qn
qn
qn
@@ -10590,7 +10658,7 @@ VQ
ik
ik
KU
-nq
+hf
XM
Ys
Ys
@@ -11118,7 +11186,7 @@ Hd
XJ
ik
ik
-gs
+ix
MS
Ys
Ys
@@ -11126,7 +11194,7 @@ Ys
Ys
Ys
MS
-DY
+Jc
ty
ik
ik
@@ -11134,7 +11202,7 @@ VQ
ik
ik
KU
-Ct
+ul
XM
Ys
Ys
@@ -11814,7 +11882,7 @@ VQ
ik
ik
KU
-Ct
+ul
XM
Ys
Ys
@@ -12068,13 +12136,13 @@ Ys
Ys
MS
eQ
-WZ
+dh
eQ
eQ
eQ
eQ
eQ
-WZ
+dh
eQ
eQ
eQ
diff --git a/_maps/map_files/Vampire/special_fran/endron_ruin.dmm b/_maps/map_files/Vampire/special_fran/endron_ruin.dmm
index 072a82bffc3d..4f5f9e1c705f 100644
--- a/_maps/map_files/Vampire/special_fran/endron_ruin.dmm
+++ b/_maps/map_files/Vampire/special_fran/endron_ruin.dmm
@@ -2682,9 +2682,9 @@
"Mx" = (
/obj/structure/werewolf_totem/spiral{
pixel_x = -16;
- tribes = list();
name = "desecrated spiral totem";
- desc = "Doesn't do much of anything anymore."
+ desc = "Doesn't do much of anything anymore.";
+ friendly_tribes = list()
},
/turf/open/indestructible/necropolis/air,
/area/vtm/interior/forest/cave/bane)
diff --git a/_maps/map_files/Vampire/special_fran/residential.dmm b/_maps/map_files/Vampire/special_fran/residential.dmm
index ae5d4e480fde..11b0f90e3a70 100644
--- a/_maps/map_files/Vampire/special_fran/residential.dmm
+++ b/_maps/map_files/Vampire/special_fran/residential.dmm
@@ -188,7 +188,7 @@
/turf/open/floor/iron/stairs/right,
/area/vtm)
"bl" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 4
},
/obj/effect/turf_decal/bordur{
@@ -287,7 +287,7 @@
/obj/effect/turf_decal/bordur{
dir = 1
},
-/obj/structure/lamppost/one,
+/obj/machinery/light/floor/lamppost/one,
/turf/open/floor/plating/sidewalk/old,
/area/vtm/outside/fishermanswharf)
"bZ" = (
@@ -898,7 +898,7 @@
/turf/open/floor/plating/asphalt,
/area/vtm/outside/fishermanswharf)
"gu" = (
-/obj/structure/lamppost/one,
+/obj/machinery/light/floor/lamppost/one,
/obj/effect/turf_decal/bordur,
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/fishermanswharf/ghetto)
@@ -1139,7 +1139,7 @@
/turf/open/floor/wood/smooth/old,
/area/vtm/interior/apartment)
"ic" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/old,
/area/vtm/outside/fishermanswharf)
"id" = (
@@ -1443,7 +1443,7 @@
/turf/open/floor/wood/old,
/area/vtm/interior/shop)
"kz" = (
-/obj/structure/lamppost/four,
+/obj/machinery/light/floor/lamppost/four,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/fishermanswharf)
"kC" = (
@@ -1693,7 +1693,7 @@
/obj/effect/turf_decal/bordur{
dir = 1
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk,
/area/vtm)
"lT" = (
@@ -2349,7 +2349,7 @@
/obj/effect/turf_decal/bordur{
dir = 8
},
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 4
},
/obj/effect/landmark/npcability,
@@ -2367,7 +2367,7 @@
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/fishermanswharf/ghetto)
"qL" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/obj/effect/turf_decal/bordur/corner{
dir = 4
},
@@ -2382,7 +2382,7 @@
/turf/open/floor/wood/smooth/old,
/area/vtm/interior/ghetto)
"qQ" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk,
/area/vtm)
"qR" = (
@@ -2812,7 +2812,7 @@
/obj/effect/turf_decal/bordur/corner{
dir = 4
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk,
/area/vtm)
"tH" = (
@@ -3181,7 +3181,7 @@
/obj/effect/turf_decal/bordur{
dir = 8
},
-/obj/structure/lamppost/one,
+/obj/machinery/light/floor/lamppost/one,
/obj/structure/railing{
dir = 8
},
@@ -3219,7 +3219,7 @@
/obj/effect/turf_decal/bordur{
dir = 6
},
-/obj/structure/lamppost/four,
+/obj/machinery/light/floor/lamppost/four,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/fishermanswharf)
"wq" = (
@@ -3615,7 +3615,7 @@
/turf/open/floor/city/bacotell,
/area/vtm/interior/apartment)
"yT" = (
-/obj/structure/lamppost/one,
+/obj/machinery/light/floor/lamppost/one,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/fishermanswharf/ghetto)
"yW" = (
@@ -4240,7 +4240,7 @@
/turf/open/misc/beach/vamp,
/area/vtm/interior)
"Dd" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 1
},
/obj/effect/turf_decal/bordur,
@@ -4294,7 +4294,7 @@
/obj/effect/turf_decal/bordur{
dir = 8
},
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 4
},
/turf/open/floor/plating/sidewalk,
@@ -4327,7 +4327,7 @@
/turf/open/floor/plating/sidewalkalt,
/area/vtm)
"DE" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/obj/effect/landmark/npcwall,
/obj/effect/turf_decal/bordur{
dir = 5
@@ -4436,7 +4436,7 @@
/obj/effect/turf_decal/bordur{
dir = 1
},
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 1
},
/turf/open/floor/plating/sidewalk,
@@ -5080,11 +5080,11 @@
/obj/effect/turf_decal/bordur{
dir = 9
},
-/obj/structure/lamppost/four,
+/obj/machinery/light/floor/lamppost/four,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/fishermanswharf)
"IS" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 1
},
/turf/open/floor/plating/sidewalk,
@@ -5908,7 +5908,7 @@
/obj/effect/turf_decal/siding/wood{
dir = 1
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/obj/structure/railing{
dir = 1
},
@@ -6163,7 +6163,7 @@
/area/vtm/interior/ghetto)
"Qp" = (
/obj/effect/turf_decal/bordur,
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 1
},
/turf/open/floor/plating/sidewalk/old,
@@ -6230,7 +6230,7 @@
/obj/structure/railing{
dir = 10
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/wood/old,
/area/vtm/outside/northbeach)
"QP" = (
@@ -6441,7 +6441,7 @@
/area/vtm)
"RN" = (
/obj/effect/turf_decal/bordur,
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk,
/area/vtm)
"RO" = (
@@ -6513,7 +6513,7 @@
/obj/effect/turf_decal/siding/wood{
dir = 9
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/wood/old,
/area/vtm/outside/northbeach)
"St" = (
@@ -6965,7 +6965,7 @@
/turf/open/floor/carpet/purple,
/area/vtm/interior/ghetto)
"Vr" = (
-/obj/structure/lamppost/one,
+/obj/machinery/light/floor/lamppost/one,
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/fishermanswharf/ghetto)
"Vt" = (
@@ -7523,7 +7523,7 @@
/obj/effect/turf_decal/bordur{
dir = 10
},
-/obj/structure/lamppost/four,
+/obj/machinery/light/floor/lamppost/four,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/fishermanswharf)
"Zr" = (
diff --git a/_maps/map_files/Vampire/special_fran/special_fran_umbra.dmm b/_maps/map_files/Vampire/special_fran/special_fran_umbra.dmm
index c65ffc110a1f..953b48d3fe76 100644
--- a/_maps/map_files/Vampire/special_fran/special_fran_umbra.dmm
+++ b/_maps/map_files/Vampire/special_fran/special_fran_umbra.dmm
@@ -29,7 +29,7 @@
/turf/open/floor/wood/smooth/old,
/area/vtm/outside/penumbra)
"aC" = (
-/obj/structure/lamppost/four,
+/obj/machinery/light/floor/lamppost/four,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/penumbra)
"aQ" = (
@@ -205,7 +205,7 @@
/turf/open/floor/eighties,
/area/vtm/outside/penumbra)
"gL" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 1
},
/turf/open/floor/plating/sidewalkalt,
@@ -484,7 +484,7 @@
/turf/open/misc/beach/vamp,
/area/vtm/outside/penumbra)
"rP" = (
-/obj/structure/lamppost/one,
+/obj/machinery/light/floor/lamppost/one,
/turf/open/floor/plating/sidewalk/old,
/area/vtm/outside/penumbra)
"si" = (
@@ -575,7 +575,7 @@
/turf/open/floor/carpet/darkpack/old,
/area/vtm/outside/penumbra)
"wg" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalkalt,
/area/vtm/outside/penumbra)
"wt" = (
@@ -617,7 +617,7 @@
/obj/structure/railing{
dir = 1
},
-/obj/structure/lamppost/one,
+/obj/machinery/light/floor/lamppost/one,
/turf/open/floor/plating/sidewalk/old,
/area/vtm/outside/penumbra)
"ye" = (
@@ -710,7 +710,7 @@
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/penumbra)
"BM" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
light_power = 0
},
/turf/open/floor/plating/sidewalk,
@@ -729,7 +729,7 @@
/turf/closed/wall/vampwall/rich/old,
/area/vtm/outside/penumbra)
"Cf" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 1
},
/turf/open/floor/plating/sidewalk,
@@ -997,7 +997,7 @@
/turf/open/floor/carpet/black,
/area/vtm/outside/penumbra)
"Km" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 4
},
/turf/open/floor/plating/sidewalk/rich,
@@ -1018,7 +1018,7 @@
/turf/open/floor/plating/sidewalk/old,
/area/vtm/outside/penumbra)
"KS" = (
-/obj/structure/lamppost/sidewalk/chinese{
+/obj/machinery/light/floor/lamppost/sidewalk/chinese{
dir = 8
},
/turf/open/floor/plating/sidewalkalt,
@@ -1124,7 +1124,7 @@
/turf/open/umbra,
/area/vtm/outside/penumbra)
"PP" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/obj/effect/turf_decal/siding/wood{
dir = 1
},
@@ -1194,7 +1194,7 @@
/turf/open/floor/city/plating_mono,
/area/vtm/outside/penumbra)
"RG" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/misc/grass,
/area/vtm/outside/penumbra)
"RQ" = (
@@ -1400,7 +1400,7 @@
/turf/open/floor/plating/canalplating,
/area/vtm/outside/penumbra)
"WO" = (
-/obj/structure/lamppost/four,
+/obj/machinery/light/floor/lamppost/four,
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/outside/penumbra)
"WP" = (
diff --git a/_maps/map_files/Vampire/special_fran/special_francisco.dmm b/_maps/map_files/Vampire/special_fran/special_francisco.dmm
index 126f15a5cada..4a0da94b461e 100644
--- a/_maps/map_files/Vampire/special_fran/special_francisco.dmm
+++ b/_maps/map_files/Vampire/special_fran/special_francisco.dmm
@@ -253,7 +253,7 @@
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/interior/sewer/nosferatu_town)
"aiR" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/obj/effect/turf_decal/bordur/corner{
dir = 1
},
@@ -552,7 +552,7 @@
/turf/open/floor/city/plating_mono,
/area/vtm/interior/endron_facility/restricted)
"asz" = (
-/obj/structure/lamppost/one,
+/obj/machinery/light/floor/lamppost/one,
/obj/effect/turf_decal/bordur/inverse,
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/outside/financialdistrict)
@@ -617,7 +617,7 @@
/turf/open/floor/city/toilet/large,
/area/vtm/interior/police)
"atL" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 4
},
/obj/effect/landmark/npcactivity,
@@ -734,7 +734,7 @@
/obj/effect/turf_decal/bordur{
dir = 5
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/voivodate)
"ayD" = (
@@ -1009,7 +1009,7 @@
/turf/open/floor/plating/granite,
/area/vtm/interior/millennium_tower/f2)
"aGB" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 4
},
/obj/structure/sign/city/hotel/directional/west,
@@ -1948,7 +1948,7 @@
/area/vtm/interior/sewer/nosferatu_town)
"biQ" = (
/obj/effect/turf_decal/bordur/corner,
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/old,
/area/vtm/voivodate)
"biY" = (
@@ -2184,7 +2184,7 @@
/turf/open/floor/plating/sidewalk/old,
/area/vtm/voivodate)
"bpT" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 1
},
/turf/open/floor/plating/sidewalk,
@@ -2631,7 +2631,7 @@
/turf/open/misc/dirt,
/area/vtm/interior/voivodate/cave)
"bCw" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/obj/effect/turf_decal/bordur/corner{
dir = 8
},
@@ -3515,7 +3515,7 @@
/turf/open/floor/iron/showroomfloor,
/area/vtm/interior/clinic)
"ccK" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/financialdistrict)
"ccP" = (
@@ -3531,7 +3531,7 @@
dir = 8
},
/obj/effect/landmark/npcwall,
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/misc/grass/random/bushes,
/area/vtm/outside/park)
"cdc" = (
@@ -4633,7 +4633,7 @@
/turf/open/floor/carpet/darkpack/greengold,
/area/vtm/interior/endron_facility)
"cIC" = (
-/obj/structure/lamppost/four,
+/obj/machinery/light/floor/lamppost/four,
/obj/effect/landmark/npcability,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/unionsquare)
@@ -4794,7 +4794,7 @@
/obj/effect/turf_decal/bordur{
dir = 6
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/voivodate)
"cMy" = (
@@ -5443,7 +5443,7 @@
dir = 8;
pixel_x = -1
},
-/obj/structure/lamppost/sidewalk/chinese,
+/obj/machinery/light/floor/lamppost/sidewalk/chinese,
/turf/open/floor/plating/sidewalkalt,
/area/vtm/outside/chinatown)
"dhf" = (
@@ -5791,7 +5791,7 @@
/obj/effect/turf_decal/bordur{
dir = 10
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/voivodate)
"dtY" = (
@@ -6072,7 +6072,7 @@
/turf/open/floor/plating/concrete,
/area/vtm/interior/gangbasement)
"dDy" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 8
},
/turf/open/floor/plating/sidewalk,
@@ -6695,7 +6695,7 @@
/turf/open/floor/wood/smooth/old,
/area/vtm/interior/police)
"dYt" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 8
},
/turf/open/floor/plating/sidewalk/rich,
@@ -6990,7 +6990,7 @@
/turf/open/water/beach/vamp/deep,
/area/vtm/interior/voivodate/cave)
"egl" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/interior/sewer/nosferatu_town)
"egD" = (
@@ -7848,7 +7848,7 @@
/turf/open/floor/wood/smooth/old,
/area/vtm/interior/apartment)
"eIG" = (
-/obj/structure/lamppost/one,
+/obj/machinery/light/floor/lamppost/one,
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/outside/financialdistrict)
"eIH" = (
@@ -8472,7 +8472,7 @@
/turf/open/floor/city/plating_mono,
/area/vtm/interior/endron_facility/restricted)
"fap" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/obj/effect/turf_decal/bordur/corner{
dir = 8
},
@@ -9828,7 +9828,7 @@
/turf/open/floor/plating/canal,
/area/vtm/interior/sewer)
"fJD" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 4
},
/turf/open/floor/plating/sidewalk,
@@ -10228,7 +10228,7 @@
/turf/open/floor/carpet/darkpack,
/area/vtm/interior/chantry)
"fXc" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 4
},
/turf/open/floor/plating/sidewalk,
@@ -11573,7 +11573,7 @@
/turf/closed/wall/vampwall/rock,
/area/vtm)
"gKz" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 8
},
/turf/open/floor/plating/sidewalk,
@@ -12671,7 +12671,7 @@
/turf/open/floor/city/plating_mono,
/area/vtm/interior/smoke)
"hsF" = (
-/obj/structure/lamppost/one,
+/obj/machinery/light/floor/lamppost/one,
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/chinatown)
"hsM" = (
@@ -13893,7 +13893,7 @@
/obj/structure/railing{
dir = 8
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/outside/financialdistrict)
"ibp" = (
@@ -16242,7 +16242,7 @@
/obj/effect/turf_decal/bordur/corner{
dir = 4
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/old,
/area/vtm/voivodate)
"juv" = (
@@ -16707,7 +16707,7 @@
/turf/open/floor/city/plating_mono,
/area/vtm/interior/millennium_tower/f4)
"jJx" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/obj/effect/turf_decal/bordur/corner{
dir = 1
},
@@ -18078,7 +18078,7 @@
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/financialdistrict)
"kxx" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 1
},
/turf/open/floor/plating/sidewalk/rich,
@@ -18276,7 +18276,7 @@
/turf/open/floor/plating/elevatorshaft,
/area/vtm/interior)
"kCZ" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalkalt,
/area/vtm/outside/financialdistrict)
"kDe" = (
@@ -20159,7 +20159,7 @@
},
/area/vtm/voivodate)
"lNo" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/outside/financialdistrict)
"lNw" = (
@@ -20588,7 +20588,7 @@
/turf/open/floor/carpet/darkpack/redsilver,
/area/vtm/interior/voivodate)
"lZt" = (
-/obj/structure/lamppost/four,
+/obj/machinery/light/floor/lamppost/four,
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/outside/financialdistrict)
"lZy" = (
@@ -21075,7 +21075,7 @@
/turf/open/floor/plating/asphalt,
/area/vtm/interior/millennium_tower)
"mnP" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/obj/structure/railing,
/turf/open/floor/plating/sidewalkalt,
/area/vtm/outside/financialdistrict)
@@ -21195,7 +21195,7 @@
/turf/open/floor/plating/rough,
/area/vtm/interior/anarch/basement)
"mso" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 1
},
/turf/open/floor/plating/sidewalk,
@@ -21581,7 +21581,7 @@
/obj/effect/turf_decal/bordur{
dir = 9
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/voivodate)
"mDr" = (
@@ -22081,7 +22081,7 @@
/turf/open/floor/plating/rough,
/area/vtm/interior/millennium_tower)
"mOM" = (
-/obj/structure/lamppost/one,
+/obj/machinery/light/floor/lamppost/one,
/turf/open/floor/plating/sidewalkalt,
/area/vtm/outside/financialdistrict)
"mOP" = (
@@ -23715,7 +23715,7 @@
/turf/open/floor/wood/smooth/old,
/area/vtm/interior/hotel)
"nSN" = (
-/obj/structure/lamppost/one,
+/obj/machinery/light/floor/lamppost/one,
/mob/living/carbon/human/npc/walkby,
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/outside/financialdistrict)
@@ -24295,7 +24295,7 @@
/obj/effect/turf_decal/bordur{
dir = 8
},
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 8
},
/turf/open/floor/plating/sidewalk,
@@ -24535,7 +24535,7 @@
/turf/open/indestructible/necropolis/air,
/area/vtm/interior/wyrm_corrupted)
"opu" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 8
},
/turf/open/floor/plating/sidewalk,
@@ -25544,7 +25544,7 @@
/turf/open/floor/plating/rough,
/area/vtm/interior/ghetto)
"oRS" = (
-/obj/structure/lamppost/four,
+/obj/machinery/light/floor/lamppost/four,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/financialdistrict)
"oRY" = (
@@ -25652,7 +25652,7 @@
/turf/open/misc/dirt,
/area/vtm/outside/pacificheights)
"oUB" = (
-/obj/structure/lamppost/sidewalk/chinese{
+/obj/machinery/light/floor/lamppost/sidewalk/chinese{
dir = 8
},
/obj/effect/landmark/npcactivity,
@@ -25985,7 +25985,7 @@
/turf/open/floor/wood/ornate,
/area/vtm/interior/coffee)
"pdW" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/obj/effect/turf_decal/bordur/corner{
dir = 1
},
@@ -26581,7 +26581,7 @@
/turf/open/floor/city/factory,
/area/vtm/interior/radio)
"pwH" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/obj/effect/landmark/npcwall,
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/interior/millennium_tower)
@@ -27440,7 +27440,7 @@
dir = 6;
pixel_y = 2
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/roofwalk,
/area/vtm)
"pXh" = (
@@ -28997,7 +28997,7 @@
/turf/open/floor/plating/rough,
/area/vtm/interior)
"qNu" = (
-/obj/structure/lamppost/sidewalk/chinese{
+/obj/machinery/light/floor/lamppost/sidewalk/chinese{
dir = 8
},
/turf/open/floor/plating/sidewalkalt,
@@ -30476,7 +30476,7 @@
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/financialdistrict)
"rzW" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalkalt,
/area/vtm/voivodate)
"rAq" = (
@@ -31170,7 +31170,7 @@
/turf/open/floor/plating/granite/black,
/area/vtm/interior/strip)
"rVO" = (
-/obj/structure/lamppost/sidewalk/chinese{
+/obj/machinery/light/floor/lamppost/sidewalk/chinese{
dir = 8
},
/turf/open/floor/plating/sidewalkalt,
@@ -31780,7 +31780,7 @@
dir = 4
},
/obj/effect/turf_decal/darkpack/dirt/corner,
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/obj/effect/spawner/random/flora/grass,
/turf/open/misc/grass/nosmooth,
/area/vtm/outside/financialdistrict)
@@ -32146,7 +32146,7 @@
/turf/open/floor/city/toilet/large,
/area/vtm/interior/police)
"szY" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 4
},
/obj/structure/trafficlight,
@@ -32223,7 +32223,7 @@
/turf/open/floor/plating/concrete,
/area/vtm/interior/police)
"sCE" = (
-/obj/structure/lamppost/sidewalk/chinese{
+/obj/machinery/light/floor/lamppost/sidewalk/chinese{
dir = 1
},
/turf/open/floor/plating/sidewalkalt,
@@ -33563,7 +33563,7 @@
/turf/open/floor/wood/rough,
/area/vtm)
"tpQ" = (
-/obj/structure/lamppost/four,
+/obj/machinery/light/floor/lamppost/four,
/turf/open/floor/plating/sidewalkalt,
/area/vtm/outside/chinatown)
"tpV" = (
@@ -34556,7 +34556,7 @@
/turf/open/floor/city/plating,
/area/vtm/interior/endron_facility/restricted)
"tPH" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 8
},
/obj/effect/turf_decal/bordur,
@@ -34590,7 +34590,7 @@
/turf/open/floor/city/circled/large,
/area/vtm/interior/endron_facility/restricted)
"tPP" = (
-/obj/structure/lamppost/sidewalk{
+/obj/machinery/light/floor/lamppost/sidewalk{
pixel_y = 1
},
/turf/open/misc/grass,
@@ -35125,7 +35125,7 @@
/obj/effect/turf_decal/bordur{
dir = 4
},
-/obj/structure/lamppost/sidewalk/chinese{
+/obj/machinery/light/floor/lamppost/sidewalk/chinese{
dir = 8
},
/turf/open/floor/plating/sidewalkalt,
@@ -37914,7 +37914,7 @@
/obj/effect/turf_decal/bordur{
dir = 10
},
-/obj/structure/lamppost/one,
+/obj/machinery/light/floor/lamppost/one,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/financialdistrict)
"vOC" = (
@@ -38339,7 +38339,7 @@
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/interior/shop/gasstation)
"wcc" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 8
},
/turf/open/floor/plating/sidewalk,
@@ -38945,7 +38945,7 @@
/turf/open/floor/plating/asphalt,
/area/vtm/outside/unionsquare)
"wvf" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk,
/area/vtm/interior/voivodate/sanctum)
"wvg" = (
@@ -39961,7 +39961,7 @@
/obj/effect/turf_decal/bordur/corner{
dir = 8
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/misc/grass/nosmooth,
/area/vtm/outside/financialdistrict)
"wYB" = (
@@ -40400,11 +40400,11 @@
/turf/open/floor/wood/smooth,
/area/vtm/interior/endron_facility/restricted)
"xmC" = (
-/obj/structure/lamppost/four,
+/obj/machinery/light/floor/lamppost/four,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/unionsquare)
"xmH" = (
-/obj/structure/lamppost/one,
+/obj/machinery/light/floor/lamppost/one,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/financialdistrict)
"xmP" = (
@@ -40636,7 +40636,7 @@
/turf/open/floor/city/plating_mono,
/area/vtm/interior/strip)
"xtM" = (
-/obj/structure/lamppost/one{
+/obj/machinery/light/floor/lamppost/one{
dir = 1
},
/turf/open/floor/plating/sidewalk,
@@ -41123,7 +41123,7 @@
/turf/open/floor/city/plating_mono,
/area/vtm/interior/voivodate)
"xKn" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/obj/effect/turf_decal/bordur/corner,
/turf/open/floor/plating/granite/black,
/area/vtm/outside/park)
@@ -50634,7 +50634,7 @@ lFH
hxj
xJp
wdj
-wbR
+wdj
wdj
wdj
wdj
diff --git a/_maps/map_files/Vampire/westfield_mall/westfield_mall.dmm b/_maps/map_files/Vampire/westfield_mall/westfield_mall.dmm
index 14ff8d7383f5..c64f2973eb19 100644
--- a/_maps/map_files/Vampire/westfield_mall/westfield_mall.dmm
+++ b/_maps/map_files/Vampire/westfield_mall/westfield_mall.dmm
@@ -268,7 +268,7 @@
/turf/open/misc/dirt/rails,
/area/vtm/westfield_mall/interior/supply)
"aaW" = (
-/obj/structure/lamppost/four{
+/obj/machinery/light/floor/lamppost/four{
pixel_y = 8
},
/turf/open/floor/plating/sidewalk/old,
@@ -1990,7 +1990,7 @@
/obj/effect/turf_decal/bordur{
dir = 1
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/old,
/area/vtm/westfield_mall)
"agU" = (
@@ -3253,7 +3253,7 @@
/obj/effect/turf_decal/bordur/corner{
dir = 4
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/old,
/area/vtm/westfield_mall)
"akV" = (
@@ -10115,7 +10115,7 @@
/turf/open/floor/city/plating,
/area/vtm/interior/bianchiBank)
"aHl" = (
-/obj/structure/lamppost/four{
+/obj/machinery/light/floor/lamppost/four{
pixel_y = 8
},
/obj/structure/platform/lowwall/brick_old,
@@ -10518,7 +10518,7 @@
/obj/effect/turf_decal/bordur/corner{
dir = 8
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/old,
/area/vtm/westfield_mall)
"aID" = (
@@ -13829,7 +13829,7 @@
/obj/effect/turf_decal/bordur/corner{
dir = 1
},
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/old,
/area/vtm/westfield_mall)
"aTE" = (
@@ -14218,7 +14218,7 @@
/area/vtm/westfield_mall)
"aUX" = (
/obj/effect/turf_decal/bordur/corner,
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/floor/plating/sidewalk/old,
/area/vtm/westfield_mall)
"aUY" = (
diff --git a/_maps/map_files/Vampire/westfield_mall/westfield_umbra.dmm b/_maps/map_files/Vampire/westfield_mall/westfield_umbra.dmm
index a710d8fd19f7..d292c9e59e79 100644
--- a/_maps/map_files/Vampire/westfield_mall/westfield_umbra.dmm
+++ b/_maps/map_files/Vampire/westfield_mall/westfield_umbra.dmm
@@ -176,7 +176,7 @@
/turf/open/misc/dirt,
/area/vtm/outside/penumbra)
"cm" = (
-/obj/structure/lamppost/sidewalk,
+/obj/machinery/light/floor/lamppost/sidewalk,
/turf/open/umbra,
/area/vtm/outside/penumbra)
"cr" = (
@@ -577,7 +577,7 @@
/turf/open/misc/grass,
/area/vtm/outside/penumbra)
"hO" = (
-/obj/structure/lamppost/sidewalk/chinese{
+/obj/machinery/light/floor/lamppost/sidewalk/chinese{
dir = 8
},
/turf/open/umbra,
@@ -2611,7 +2611,7 @@
/turf/open/floor/plating/sidewalk/rich,
/area/vtm/outside/penumbra)
"KB" = (
-/obj/structure/lamppost/sidewalk/chinese{
+/obj/machinery/light/floor/lamppost/sidewalk/chinese{
dir = 4
},
/turf/open/floor/plating/sidewalkalt,
diff --git a/_maps/shuttles/emergency/emergency_dep_cap.dmm b/_maps/shuttles/emergency/emergency_dep_cap.dmm
new file mode 100644
index 000000000000..6222b0aadad7
--- /dev/null
+++ b/_maps/shuttles/emergency/emergency_dep_cap.dmm
@@ -0,0 +1,2482 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ax" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"aJ" = (
+/obj/effect/turf_decal/trimline/red/filled/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 1
+ },
+/obj/structure/rack,
+/obj/item/storage/toolbox/emergency{
+ pixel_x = 3;
+ pixel_y = 5
+ },
+/obj/item/storage/toolbox/drone{
+ pixel_x = 0;
+ pixel_y = 2
+ },
+/obj/item/wrench{
+ pixel_x = 0;
+ pixel_y = 3
+ },
+/obj/item/multitool,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/obj/item/radio/intercom/directional/north,
+/obj/machinery/light/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"aU" = (
+/obj/machinery/computer/crew,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"bk" = (
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/structure/closet/crate/internals,
+/obj/effect/turf_decal/bot,
+/obj/structure/sign/nanotrasen/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"bl" = (
+/obj/structure/table/wood/fancy/blue,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/item/food/baguette,
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"bD" = (
+/obj/structure/table/reinforced,
+/obj/item/paper_bin,
+/obj/item/pen,
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/obj/structure/extinguisher_cabinet/directional/south,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"bS" = (
+/obj/structure/dresser,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"bY" = (
+/obj/structure/chair/office{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"cj" = (
+/obj/item/kirbyplants/organic/plant21,
+/obj/effect/turf_decal/box,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"cl" = (
+/obj/item/kirbyplants/organic/plant21,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 5
+ },
+/obj/structure/sign/nanotrasen/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"cm" = (
+/obj/machinery/shower/directional/west{
+ name = "emergency shower"
+ },
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"cM" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 4
+ },
+/obj/structure/sign/nanotrasen/directional/west,
+/obj/machinery/camera/autoname/directional/west,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"cQ" = (
+/obj/machinery/door/airlock/command{
+ name = "Captain's Quarters"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/command/captain,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"de" = (
+/obj/machinery/shieldgen,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"dj" = (
+/obj/structure/table/reinforced,
+/obj/machinery/computer/records/security/laptop,
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"dz" = (
+/obj/effect/turf_decal/trimline/red/filled/warning{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/obj/machinery/status_display/ai/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"dZ" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/bot_white/right,
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"eo" = (
+/obj/structure/chair/comfy/beige{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"ey" = (
+/obj/structure/table/wood/fancy/blue,
+/obj/effect/turf_decal/siding/wood,
+/obj/item/food/beef_wellington_slice{
+ pixel_x = -2;
+ pixel_y = 10
+ },
+/obj/item/reagent_containers/cup/glass/drinkingglass{
+ pixel_x = 8;
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/cup/glass/bottle/wine{
+ pixel_x = -14;
+ pixel_y = 23
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"eM" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 4
+ },
+/obj/machinery/wall_healer/free/directional/east{
+ use_power = 0
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"eR" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/obj/structure/sign/nanotrasen/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"eY" = (
+/obj/effect/mapping_helpers/airlock/access/any/command/general,
+/obj/effect/mapping_helpers/airlock/access/any/security/general,
+/obj/machinery/door/airlock/multi_tile/public/glass{
+ name = "Cockpit"
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"fp" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"fs" = (
+/obj/structure/tank_dispenser/oxygen,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"fw" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/medkit/toxin,
+/obj/item/storage/medkit/o2{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 8
+ },
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"fy" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"fC" = (
+/obj/structure/chair/comfy/beige{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"fS" = (
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/structure/closet/crate/internals,
+/obj/effect/turf_decal/bot,
+/obj/structure/sign/nanotrasen/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"gg" = (
+/obj/machinery/light/directional/north,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"gj" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/item/kirbyplants/organic/plant21,
+/obj/structure/sign/nanotrasen/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"gk" = (
+/obj/machinery/power/shuttle_engine/propulsion{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"gI" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/light/directional/east,
+/obj/machinery/button/door/directional/east{
+ id = "l_escapeshuttlebridge";
+ name = "Left Wing Bridge Shutters";
+ req_access = list("command")
+ },
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"gQ" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"gR" = (
+/obj/structure/table/reinforced,
+/obj/machinery/recharger{
+ pixel_x = -6;
+ pixel_y = 0
+ },
+/obj/item/storage/box/handcuffs{
+ pixel_x = 8;
+ pixel_y = 3
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"gS" = (
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"gY" = (
+/obj/effect/spawner/random/vending/snackvend,
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/obj/machinery/camera/autoname/directional/south,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"ho" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"hI" = (
+/obj/structure/closet/crate{
+ name = "emergency supplies crate"
+ },
+/obj/item/storage/toolbox/emergency,
+/obj/item/storage/toolbox/emergency,
+/obj/item/flashlight/flare{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/flashlight/flare{
+ pixel_x = -6;
+ pixel_y = -2
+ },
+/obj/item/crowbar,
+/obj/item/wrench,
+/obj/item/radio,
+/obj/effect/turf_decal/bot,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"im" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/obj/structure/fireaxecabinet/directional/south,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"iq" = (
+/obj/effect/turf_decal/trimline/red/filled/warning{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"iF" = (
+/obj/machinery/door/airlock/vault{
+ name = "Vault"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/supply/vault,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"jm" = (
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"jK" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 5
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"ke" = (
+/obj/machinery/computer/security,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"km" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"kn" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"kD" = (
+/obj/structure/chair/comfy/shuttle,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"kH" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"kW" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/button/door/directional/east{
+ id = "l_escapeshuttlebridge";
+ name = "Left Wing Bridge Shutters";
+ req_access = list("command")
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"kY" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"lP" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"ma" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"mA" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"mE" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Brig"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"mI" = (
+/turf/template_noop,
+/area/template_noop)
+"mV" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"mZ" = (
+/obj/structure/table/wood/fancy/blue,
+/obj/effect/turf_decal/siding/wood,
+/obj/item/food/big_baked_rice{
+ pixel_x = -3;
+ pixel_y = 8
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"nk" = (
+/obj/structure/table/wood,
+/obj/item/camera{
+ pixel_y = 8;
+ pixel_x = 3
+ },
+/obj/item/storage/photo_album/captain{
+ pixel_x = -3;
+ pixel_y = -4
+ },
+/obj/structure/extinguisher_cabinet/directional/south,
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"nG" = (
+/obj/structure/chair/comfy/beige{
+ dir = 1
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"nI" = (
+/obj/structure/filingcabinet,
+/obj/item/folder/documents,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/item/poster/traitor,
+/obj/effect/turf_decal/bot_white,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"nT" = (
+/obj/structure/table/reinforced,
+/obj/machinery/computer/records/medical/laptop{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"oi" = (
+/obj/effect/spawner/random/vending/colavend,
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"oj" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"oF" = (
+/obj/machinery/greenscreen_camera{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"oG" = (
+/obj/effect/turf_decal/trimline/red/filled/warning/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"oU" = (
+/obj/machinery/light/directional/south,
+/obj/machinery/status_display/evac/directional/south,
+/obj/structure/chair/comfy/carp{
+ dir = 1
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"oX" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"pB" = (
+/obj/structure/hedge,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"pN" = (
+/obj/machinery/door/poddoor/shutters/window/preopen{
+ id = "l_escapeshuttlebridge"
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"pT" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"qf" = (
+/obj/machinery/computer/records/medical{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"qn" = (
+/obj/structure/closet/crate/medical,
+/obj/item/storage/medkit/regular,
+/obj/item/storage/medkit/o2{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/medkit/toxin{
+ pixel_x = -4;
+ pixel_y = 3
+ },
+/obj/item/healthanalyzer{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/lazarus_injector,
+/obj/effect/turf_decal/bot,
+/mob/living/basic/bot/medbot{
+ name = "\improper emergency medibot";
+ pixel_x = -3;
+ pixel_y = 2
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"rm" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/anticorner/contrasted,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"rr" = (
+/obj/machinery/door/airlock/command{
+ name = "Banquet Room"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"sz" = (
+/obj/machinery/recharge_station,
+/obj/effect/turf_decal/bot,
+/obj/item/radio/intercom/directional/south,
+/obj/machinery/light/directional/south,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"sF" = (
+/obj/structure/sign/poster/greenscreen/directional/west,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"sR" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"sW" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"tl" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/light/directional/west,
+/obj/machinery/button/door/directional/west{
+ req_access = list("command");
+ name = "Right Wing Bridge Shutters";
+ id = "r_escapeshuttlebridge"
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"tE" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"ug" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 4
+ },
+/obj/structure/sign/nanotrasen/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"uj" = (
+/obj/structure/bed,
+/obj/item/bedsheet/captain,
+/obj/machinery/light/directional/east,
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"up" = (
+/obj/machinery/door/airlock/external/ruin{
+ name = "Emergency Recovery Airlock"
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"uC" = (
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"vk" = (
+/obj/effect/turf_decal/delivery,
+/obj/machinery/door/poddoor/shutters/window/preopen{
+ id = "r_escapeshuttlebridge"
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"vr" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"vD" = (
+/obj/structure/table/wood/fancy/blue,
+/obj/effect/turf_decal/siding/wood,
+/obj/item/reagent_containers/cup/glass/drinkingglass{
+ pixel_x = -1;
+ pixel_y = 14
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"vL" = (
+/obj/item/kirbyplants/organic/plant2,
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"vY" = (
+/obj/structure/chair/office{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"we" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"wn" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"wt" = (
+/obj/structure/table/reinforced,
+/obj/item/phone{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/obj/item/storage/medkit/regular{
+ pixel_x = 4;
+ pixel_y = -5
+ },
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"wM" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 5
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"xq" = (
+/obj/effect/spawner/surgery_tray/full/deployed,
+/obj/effect/turf_decal/tile/blue/opposingcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"xN" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"xO" = (
+/obj/machinery/door/airlock/maintenance/glass{
+ name = "Escape Shuttle Storage"
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"yd" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/fancy/donut_box{
+ pixel_x = -2;
+ pixel_y = 6
+ },
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"yj" = (
+/obj/structure/safe/vault,
+/obj/item/clothing/neck/stethoscope,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/item/gun/ballistic/automatic/pistol/deagle/regal/no_mag{
+ color = "#2e2e2e";
+ pixel_x = -2;
+ pixel_y = 1;
+ name = "\improper Ebony"
+ },
+/obj/item/gun/ballistic/automatic/pistol/deagle{
+ pixel_x = 1;
+ pixel_y = -3;
+ name = "\improper Ivory";
+ spawnwithmagazine = 0
+ },
+/obj/item/claymore,
+/obj/item/clothing/suit/armor/vest/warden/alt,
+/obj/effect/turf_decal/bot_white,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"ym" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/obj/machinery/wall_healer/free/directional/west{
+ use_power = 0
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"yn" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"yU" = (
+/obj/machinery/light/small/directional/west,
+/obj/structure/extinguisher_cabinet/directional/west,
+/obj/structure/sign/nanotrasen/directional/south,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"zD" = (
+/obj/machinery/computer/communications,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"zJ" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"zK" = (
+/obj/structure/chair/comfy/shuttle,
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Ah" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/obj/structure/sign/nanotrasen/directional/east,
+/obj/machinery/camera/autoname/directional/east,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Aj" = (
+/obj/machinery/computer/emergency_shuttle,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/obj/machinery/light/directional/north,
+/obj/structure/sign/nanotrasen/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Ap" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/escape)
+"AB" = (
+/obj/structure/bed/medical/emergency{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"AE" = (
+/obj/structure/table/reinforced,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/power_store/cell/high,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"AH" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Be" = (
+/obj/machinery/door/airlock/medical/glass{
+ name = "Escape Shuttle Infirmary"
+ },
+/obj/effect/turf_decal/tile/blue/opposingcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Bm" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"BR" = (
+/obj/structure/chair/comfy/beige{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"BV" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 6
+ },
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"BZ" = (
+/obj/machinery/door/poddoor/shutters/window/preopen{
+ id = "r_escapeshuttlebridge"
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"CY" = (
+/obj/machinery/door/airlock/medical/glass{
+ name = "Escape Shuttle Infirmary"
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"CZ" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/item/radio/intercom/directional/east,
+/obj/machinery/light/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Dq" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/obj/machinery/light/directional/south,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Dy" = (
+/obj/structure/rack,
+/obj/item/storage/toolbox/electrical{
+ pixel_x = -3;
+ pixel_y = 1
+ },
+/obj/item/storage/toolbox/mechanical{
+ pixel_y = -1
+ },
+/obj/item/storage/toolbox/emergency{
+ pixel_x = 3;
+ pixel_y = -5
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"DN" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"DO" = (
+/obj/machinery/vending/boozeomat,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"Eg" = (
+/obj/effect/turf_decal/trimline/red/filled/warning{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/obj/structure/sign/nanotrasen/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Eh" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 6
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Er" = (
+/obj/structure/table/optable,
+/obj/effect/turf_decal/tile/blue/opposingcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"EM" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 10
+ },
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"EQ" = (
+/obj/effect/turf_decal/tile/blue/opposingcorners,
+/obj/machinery/status_display/evac/directional/north,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Fe" = (
+/obj/structure/flora/bush/grassy/style_random,
+/obj/structure/flora/bush/lavendergrass/style_random,
+/obj/structure/flora/bush/flowers_yw/style_random,
+/obj/structure/flora/bush/generic/style_random,
+/obj/structure/window/reinforced/shuttle,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Fu" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Fz" = (
+/obj/machinery/vending/cigarette,
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"FF" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/bot_white/right,
+/obj/machinery/computer/bank_machine{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"FJ" = (
+/obj/machinery/iv_drip,
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/obj/machinery/camera/autoname/directional/east,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"FP" = (
+/obj/machinery/space_heater,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"FR" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Gb" = (
+/obj/structure/chair/comfy/beige,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"Gh" = (
+/obj/machinery/door/airlock/external/ruin{
+ name = "Emergency Recovery Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Gv" = (
+/obj/structure/table/wood/fancy/blue,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/item/food/bbqribs{
+ pixel_x = -5;
+ pixel_y = 5
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"Gx" = (
+/obj/effect/turf_decal/trimline/red/filled/warning{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 4
+ },
+/obj/structure/rack,
+/obj/item/aicard,
+/obj/item/radio/off,
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/light/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"GM" = (
+/obj/structure/table/wood/fancy/blue,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/item/food/bread/meat{
+ pixel_x = -12;
+ pixel_y = -1
+ },
+/obj/item/reagent_containers/cup/glass/drinkingglass/filled/irish_cream{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"GT" = (
+/obj/effect/turf_decal/trimline/red/filled/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Hy" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"HJ" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/obj/structure/extinguisher_cabinet/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"HN" = (
+/obj/effect/turf_decal/trimline/red/filled/warning/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/anticorner/contrasted,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Ik" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner,
+/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"In" = (
+/obj/structure/table/reinforced,
+/obj/item/defibrillator/loaded{
+ pixel_x = 0;
+ pixel_y = 14
+ },
+/obj/item/storage/medkit/regular{
+ pixel_x = 1;
+ pixel_y = 0
+ },
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Jd" = (
+/obj/machinery/nuclearbomb/beer,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Jm" = (
+/obj/structure/table/reinforced,
+/obj/machinery/recharger,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Jn" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Jo" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"JP" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/medkit/fire,
+/obj/item/storage/medkit/brute{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/obj/machinery/light/directional/east,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Kl" = (
+/obj/item/kirbyplants/organic/plant21,
+/obj/effect/turf_decal/trimline/red/filled/warning{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 4
+ },
+/obj/machinery/light/directional/north,
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Kp" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 1
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet/directional/north,
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"KV" = (
+/obj/machinery/vending/coffee,
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"LH" = (
+/obj/structure/table/wood,
+/obj/machinery/computer/security/wooden_tv,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"LO" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/light/directional/east,
+/obj/effect/turf_decal/bot_white/left,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Mc" = (
+/obj/structure/chair/office{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"MD" = (
+/obj/structure/table,
+/obj/item/stock_parts/power_store/cell/high,
+/obj/machinery/cell_charger,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"MW" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/escape)
+"Nb" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 9
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Nm" = (
+/obj/machinery/stasis{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 4
+ },
+/obj/machinery/vitals_reader/directional/west,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Nz" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/closet/crate/goldcrate/stocked,
+/obj/effect/turf_decal/bot_white,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"NA" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/sign/nanotrasen/directional/south,
+/obj/machinery/light/directional/south,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"NP" = (
+/obj/structure/table/reinforced,
+/obj/item/restraints/handcuffs,
+/obj/item/assembly/flash/handheld,
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"NS" = (
+/obj/structure/reagent_dispensers/watertank,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Od" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Og" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Oi" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 10
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Ou" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/obj/effect/turf_decal/delivery,
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"OK" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"OL" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"OV" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/closet/crate/silvercrate,
+/obj/effect/turf_decal/bot_white,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Pl" = (
+/obj/structure/reagent_dispensers/fueltank,
+/obj/effect/turf_decal/bot,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"PK" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Qt" = (
+/obj/structure/chair/office{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Qv" = (
+/obj/structure/rack,
+/obj/item/clothing/suit/utility/fire/firefighter,
+/obj/item/tank/internals/oxygen/red,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/head/utility/hardhat/red,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Qy" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/command/general,
+/obj/effect/mapping_helpers/airlock/access/any/security/general,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Rv" = (
+/obj/structure/chair/comfy/shuttle,
+/obj/effect/turf_decal/bot,
+/obj/machinery/status_display/evac/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"RK" = (
+/turf/open/floor/circuit/green{
+ luminosity = 2
+ },
+/area/shuttle/escape)
+"RY" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"RZ" = (
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/structure/closet/crate/internals,
+/obj/machinery/light/small/directional/south,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Sq" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/button/door/directional/west{
+ req_access = list("command");
+ name = "Right Wing Bridge Shutters";
+ id = "r_escapeshuttlebridge"
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Th" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/obj/machinery/camera/autoname/directional/south,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"TL" = (
+/obj/effect/turf_decal/tile/blue/opposingcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"TQ" = (
+/obj/item/kirbyplants/organic/plant2,
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"TS" = (
+/obj/item/kirbyplants/organic/plant21,
+/obj/effect/turf_decal/trimline/red/filled/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 1
+ },
+/obj/machinery/light/directional/north,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Ul" = (
+/obj/machinery/computer/station_alert,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"US" = (
+/obj/effect/turf_decal/trimline/red/filled/warning{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/obj/machinery/status_display/evac/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Vy" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/bot_white/left,
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"VU" = (
+/obj/effect/turf_decal/trimline/red/filled/warning{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"We" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Wi" = (
+/obj/machinery/door/airlock/command/glass{
+ name = "Cockpit"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"WS" = (
+/obj/structure/chair/comfy/shuttle,
+/obj/effect/turf_decal/bot,
+/obj/machinery/camera/autoname/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"WX" = (
+/obj/machinery/light/small/directional/east,
+/obj/structure/sign/nanotrasen/directional/south,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"Xe" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Emergency Shuttle Airlock"
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Xj" = (
+/obj/machinery/power/shuttle_engine/heater{
+ dir = 1
+ },
+/obj/structure/window/reinforced/spawner/directional/south,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"XE" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 8
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/item/radio/intercom/directional/south,
+/obj/effect/turf_decal/box/corners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"XX" = (
+/obj/structure/chair/comfy/beige{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"Ys" = (
+/obj/machinery/computer/operating{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue/opposingcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Yz" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/light/directional/west,
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"YH" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"YM" = (
+/obj/effect/turf_decal/delivery,
+/obj/machinery/door/poddoor/shutters/window/preopen{
+ id = "l_escapeshuttlebridge"
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"YX" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ name = "Command emergency shuttle"
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Ze" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Zk" = (
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"ZP" = (
+/obj/machinery/iv_drip,
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 4
+ },
+/obj/item/radio/intercom/directional/west,
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+MW
+Ap
+yn
+kn
+kn
+up
+kn
+kn
+xN
+xN
+xN
+kn
+xN
+xN
+kn
+xN
+Qy
+kn
+YX
+kn
+xN
+xN
+xN
+kn
+Xe
+xN
+Xe
+kn
+kn
+mI
+mI
+mI
+mI
+"}
+(2,1,1) = {"
+gk
+Xj
+xN
+WS
+Yz
+Od
+RZ
+kn
+dj
+wt
+yd
+kn
+Fz
+KV
+kn
+PK
+AH
+kn
+PK
+ug
+lP
+eM
+lP
+cM
+lP
+lP
+lP
+bk
+kn
+kn
+kn
+kn
+kn
+"}
+(3,1,1) = {"
+gk
+Xj
+xN
+kD
+Bm
+wn
+fs
+kn
+gj
+Mc
+gQ
+pN
+Nb
+Oi
+Wi
+kH
+FR
+eY
+kH
+we
+Ze
+kn
+kD
+we
+we
+we
+we
+sz
+kn
+Nm
+ZP
+Nm
+kn
+"}
+(4,1,1) = {"
+gk
+Xj
+kn
+kn
+Gh
+kn
+kn
+yn
+HJ
+Ik
+kW
+YM
+mV
+gI
+Wi
+kH
+FR
+uC
+kH
+we
+Ze
+Fe
+kD
+we
+mA
+mA
+mA
+cj
+kn
+TL
+TL
+TL
+xN
+"}
+(5,1,1) = {"
+gk
+Xj
+xN
+Ou
+fp
+EM
+Wi
+We
+rm
+Dq
+yn
+kn
+rr
+kn
+yn
+aJ
+GT
+kn
+TS
+oG
+Ze
+kn
+Rv
+we
+yn
+xN
+xN
+xN
+kn
+EQ
+TL
+Ys
+xN
+"}
+(6,1,1) = {"
+gk
+Xj
+xN
+zJ
+jK
+BV
+xN
+ke
+Qt
+FR
+kn
+TQ
+gS
+yU
+yn
+kn
+mE
+kn
+yn
+US
+Ze
+Fe
+kD
+we
+kn
+In
+zK
+qf
+xN
+TL
+TL
+Er
+xN
+"}
+(7,1,1) = {"
+MW
+MW
+kn
+kn
+cQ
+kn
+kn
+Jm
+we
+FR
+Fe
+gS
+eo
+XX
+gS
+Fe
+Zk
+Hy
+xN
+VU
+Ze
+kn
+kD
+we
+CY
+TL
+TL
+TL
+Be
+TL
+TL
+xq
+xN
+"}
+(8,1,1) = {"
+gk
+Xj
+xN
+sF
+jm
+nk
+kn
+zD
+we
+FR
+Fe
+Gb
+bl
+vD
+nG
+Fe
+Zk
+fy
+xN
+VU
+we
+oX
+we
+we
+kn
+cm
+JP
+fw
+xN
+AB
+FJ
+AB
+kn
+"}
+(9,1,1) = {"
+gk
+Xj
+xN
+oF
+jm
+LH
+kn
+Aj
+Qt
+im
+kn
+Gb
+Gv
+ey
+oU
+kn
+gg
+gR
+kn
+Eg
+pB
+pB
+pB
+NA
+kn
+kn
+kn
+kn
+kn
+kn
+kn
+kn
+kn
+"}
+(10,1,1) = {"
+gk
+Xj
+xN
+bS
+uj
+DO
+kn
+Ul
+we
+FR
+Fe
+Gb
+GM
+mZ
+nG
+Fe
+Zk
+fy
+xN
+VU
+we
+sR
+we
+we
+kn
+qn
+hI
+de
+kn
+MD
+Pl
+NS
+kn
+"}
+(11,1,1) = {"
+MW
+MW
+kn
+kn
+kn
+kn
+kn
+AE
+bY
+FR
+Fe
+gS
+BR
+fC
+gS
+Fe
+Zk
+ax
+xN
+VU
+Ze
+kn
+kD
+we
+xO
+ho
+Jn
+Jn
+oj
+Jn
+Jn
+Fu
+xN
+"}
+(12,1,1) = {"
+gk
+Xj
+kn
+nI
+dZ
+FF
+kn
+aU
+we
+Th
+kn
+vL
+gS
+WX
+yn
+kn
+mE
+kn
+yn
+dz
+Ze
+Fe
+kD
+we
+kn
+Og
+DN
+DN
+kY
+DN
+sW
+km
+xN
+"}
+(13,1,1) = {"
+gk
+Xj
+xN
+RK
+RK
+ma
+iF
+wM
+pT
+Dq
+yn
+kn
+rr
+kn
+yn
+Gx
+iq
+kn
+Kl
+HN
+Ze
+kn
+Rv
+we
+yn
+xN
+xN
+xN
+yn
+FP
+vr
+km
+xN
+"}
+(14,1,1) = {"
+gk
+Xj
+xN
+Jd
+RK
+ma
+yn
+yn
+OK
+tE
+Sq
+BZ
+We
+tl
+Wi
+kH
+FR
+eY
+kH
+we
+Ze
+Fe
+kD
+we
+OL
+OL
+OL
+cj
+kn
+Dy
+vr
+km
+xN
+"}
+(15,1,1) = {"
+gk
+Xj
+xN
+RK
+RK
+ma
+OV
+kn
+cl
+vY
+Eh
+vk
+mV
+Eh
+Wi
+kH
+FR
+uC
+kH
+we
+Ze
+kn
+kD
+we
+we
+we
+we
+sz
+kn
+Qv
+CZ
+YH
+kn
+"}
+(16,1,1) = {"
+gk
+Xj
+kn
+yj
+Vy
+LO
+Nz
+kn
+NP
+nT
+bD
+kn
+oi
+gY
+kn
+Kp
+XE
+kn
+RY
+eR
+Jo
+ym
+Jo
+Ah
+Jo
+Jo
+Jo
+fS
+kn
+kn
+kn
+kn
+kn
+"}
+(17,1,1) = {"
+MW
+Ap
+yn
+kn
+kn
+kn
+kn
+kn
+xN
+xN
+xN
+kn
+xN
+xN
+kn
+xN
+xN
+kn
+kn
+kn
+xN
+xN
+xN
+kn
+xN
+xN
+xN
+kn
+kn
+mI
+mI
+mI
+mI
+"}
diff --git a/_maps/shuttles/emergency/emergency_dep_civ.dmm b/_maps/shuttles/emergency/emergency_dep_civ.dmm
new file mode 100644
index 000000000000..de7c2946f711
--- /dev/null
+++ b/_maps/shuttles/emergency/emergency_dep_civ.dmm
@@ -0,0 +1,1516 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"an" = (
+/obj/effect/spawner/random/structure/chair_maintenance{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"at" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/computer/records/medical{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"bl" = (
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"bt" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/computer/station_alert{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"bL" = (
+/obj/machinery/biogenerator,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bX" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/trimline/yellow/filled/line{
+ dir = 10
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"cj" = (
+/obj/effect/turf_decal/trimline/yellow/filled/line{
+ dir = 6
+ },
+/obj/machinery/portable_atmospherics/scrubber,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"cl" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"cD" = (
+/obj/effect/spawner/random/trash/graffiti,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"cH" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"cT" = (
+/obj/effect/spawner/random/structure/chair_maintenance{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"cZ" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"de" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/computer/records/security{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/obj/machinery/light/directional/south,
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"df" = (
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"di" = (
+/obj/structure/chair/office{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"dt" = (
+/obj/machinery/computer/emergency_shuttle,
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"dC" = (
+/obj/machinery/hydroponics/soil,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/effect/spawner/random/food_or_drink/seed,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"dM" = (
+/obj/structure/bed/medical,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"dQ" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"em" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 9
+ },
+/obj/effect/spawner/random/vending/colavend,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"eo" = (
+/obj/machinery/nuclearbomb/beer,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"eR" = (
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/escape/brig)
+"eY" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"fr" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/turf/open/floor/plating,
+/area/shuttle/escape/brig)
+"fC" = (
+/obj/effect/spawner/random/structure/grille,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"gd" = (
+/obj/structure/rack,
+/obj/item/restraints/handcuffs,
+/obj/item/assembly/flash/handheld,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 5
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"gA" = (
+/obj/effect/spawner/random/structure/closet_maintenance,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"gI" = (
+/obj/effect/spawner/random/structure/closet_maintenance,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"gR" = (
+/obj/machinery/power/shuttle_engine/propulsion,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"gS" = (
+/obj/structure/rack,
+/obj/effect/spawner/random/maintenance,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"hc" = (
+/obj/effect/spawner/random/structure/table_or_rack,
+/obj/effect/spawner/random/engineering/toolbox,
+/obj/effect/decal/cleanable/plasma,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"hp" = (
+/obj/structure/chair/office{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"ht" = (
+/obj/structure/rack,
+/obj/item/storage/toolbox/drone,
+/obj/item/multitool,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 9
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"hw" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/escape/brig)
+"hD" = (
+/obj/structure/table,
+/obj/machinery/recharger,
+/obj/machinery/light/directional/north,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"hG" = (
+/obj/machinery/seed_extractor,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"hI" = (
+/obj/effect/spawner/random/structure/chair_maintenance{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"hO" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"hT" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"iq" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/door/airlock/command/glass{
+ name = "Compact Atmospherics"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"iV" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/tank_holder/extinguisher,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"je" = (
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/components/unary/passive_vent/layer2,
+/turf/template_noop,
+/area/shuttle/escape)
+"jy" = (
+/obj/effect/mapping_helpers/broken_floor,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"jF" = (
+/obj/machinery/door/airlock/external/ruin{
+ name = "Emergency Recovery Airlock"
+ },
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"jS" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/shuttle/escape/brig)
+"km" = (
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/machinery/power/shuttle_engine/heater,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"kn" = (
+/obj/effect/spawner/random/structure/chair_maintenance,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"kD" = (
+/obj/structure/table,
+/obj/item/surgical_drapes,
+/obj/item/hemostat,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"kY" = (
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Emergency Shuttle Hatch"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"lP" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/plasma,
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"lR" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"mv" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"mE" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"oi" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/closed/wall/r_wall,
+/area/shuttle/escape)
+"ok" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/obj/machinery/wall_healer/free/directional/north{
+ use_power = 0
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"oL" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"oU" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Storage Closet"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"oX" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/computer/crew{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/obj/machinery/light/directional/south,
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"pz" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/spawner/random/trash/graffiti,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"pB" = (
+/obj/effect/mapping_helpers/broken_floor,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"pD" = (
+/obj/machinery/atmospherics/components/binary/pump/on/layer4{
+ dir = 8;
+ name = "Ventilation Pump";
+ target_pressure = 300;
+ hide = 1
+ },
+/obj/effect/turf_decal/trimline/yellow/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"pN" = (
+/obj/machinery/hydroponics/soil,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/effect/spawner/random/food_or_drink/seed,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"qf" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"ql" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet/directional/north,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"qB" = (
+/obj/effect/spawner/random/structure/chair_maintenance{
+ dir = 1
+ },
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"qC" = (
+/obj/machinery/digital_clock/directional/north,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"ro" = (
+/obj/effect/spawner/random/structure/crate,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"rr" = (
+/obj/structure/chair/office{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/cobweb,
+/turf/open/floor/plating,
+/area/shuttle/escape/brig)
+"rN" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"sz" = (
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"sD" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"sQ" = (
+/obj/structure/table,
+/obj/item/circular_saw{
+ pixel_x = 0;
+ pixel_y = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"sT" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/table/glass,
+/obj/machinery/recharger,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/obj/machinery/status_display/evac/directional/south,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"te" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/effect/spawner/random/structure/barricade/crude,
+/turf/open/floor/plating,
+/area/shuttle/escape/brig)
+"tq" = (
+/obj/machinery/atmospherics/components/tank/air/layer4{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/yellow/filled/line{
+ dir = 5
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"tN" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"uu" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/escape/brig)
+"uD" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"uK" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/decal/cleanable/plasma,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"uO" = (
+/obj/effect/spawner/random/engineering/tank,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"vd" = (
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"vw" = (
+/obj/effect/turf_decal/trimline/yellow/filled/corner{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"vY" = (
+/obj/structure/table/glass,
+/obj/machinery/cell_charger{
+ pixel_y = 4
+ },
+/obj/item/stock_parts/power_store/cell/high,
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"we" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"wM" = (
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/yellow/filled/line{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"xN" = (
+/obj/effect/spawner/random/structure/girder,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"xO" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"yk" = (
+/obj/effect/spawner/random/structure/chair_maintenance{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"ym" = (
+/obj/effect/spawner/random/engineering/atmospherics_portable,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"zd" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"zJ" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/machinery/light/directional/east,
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/trimline/yellow/filled/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Ai" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/computer/security{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"AE" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/trimline/yellow/filled/line{
+ dir = 6
+ },
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Bi" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/effect/spawner/random/structure/barricade/crude,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Bv" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/light/directional/west,
+/obj/effect/turf_decal/trimline/yellow/filled/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"BG" = (
+/obj/structure/punji_sticks,
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"BM" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 8
+ },
+/obj/effect/spawner/random/vending/snackvend,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"BV" = (
+/obj/structure/sink/directional/east,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"BZ" = (
+/obj/structure/rack,
+/obj/effect/spawner/random/trash/food_packaging,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Cv" = (
+/obj/effect/spawner/random/maintenance/two,
+/obj/structure/table,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"DB" = (
+/obj/structure/chair/office,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"DJ" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"DL" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 4
+ },
+/obj/machinery/vending/coffee,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Ef" = (
+/obj/effect/spawner/random/structure/crate,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Ek" = (
+/obj/effect/decal/cleanable/plasma,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Ep" = (
+/obj/structure/table/glass,
+/obj/machinery/recharger,
+/obj/item/restraints/handcuffs,
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"EM" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/trimline/yellow/filled/corner,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"ER" = (
+/obj/effect/decal/cleanable/ants,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Fe" = (
+/obj/machinery/door/window/brigdoor/left/directional/south{
+ name = "Command Desk";
+ req_access = list("command")
+ },
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"FJ" = (
+/obj/structure/fireaxecabinet/directional/north,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"FP" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/trimline/yellow/filled/line{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"FQ" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/table/glass,
+/obj/item/storage/medkit/regular,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/obj/machinery/status_display/ai/directional/south,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Gd" = (
+/obj/structure/extinguisher_cabinet/directional/east,
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Gq" = (
+/obj/machinery/hydroponics/soil,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/effect/spawner/random/food_or_drink/seed,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Gr" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/grille/broken,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Gx" = (
+/obj/machinery/door/airlock/maintenance_hatch,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"GT" = (
+/obj/machinery/door/airlock/maintenance,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"GV" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"HO" = (
+/turf/closed/wall,
+/area/shuttle/escape)
+"HP" = (
+/obj/machinery/computer/operating{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"In" = (
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"ID" = (
+/turf/closed/wall/r_wall,
+/area/shuttle/escape)
+"IL" = (
+/obj/structure/bed/medical,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Jl" = (
+/turf/template_noop,
+/area/template_noop)
+"Jm" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Jr" = (
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"JB" = (
+/obj/machinery/door/airlock/external/ruin{
+ name = "Emergency Recovery Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"JP" = (
+/obj/docking_port/mobile/emergency{
+ name = "Assistants emergency shuttle"
+ },
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Emergency Shuttle Hatch"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Kg" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"KG" = (
+/obj/effect/turf_decal/trimline/yellow/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"KR" = (
+/obj/item/storage/bag/plants{
+ pixel_x = 3;
+ pixel_y = 2
+ },
+/obj/item/reagent_containers/cup/watering_can{
+ pixel_x = -1;
+ pixel_y = -2
+ },
+/obj/machinery/light/directional/west,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"KV" = (
+/obj/structure/closet/bombcloset/security,
+/obj/machinery/light/directional/north,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"Lh" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/trimline/yellow/filled/line{
+ dir = 9
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"LH" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"Mf" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/computer/rdconsole/unlocked{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Mx" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Brig"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/plating,
+/area/shuttle/escape/brig)
+"MD" = (
+/obj/structure/chair/office{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape/brig)
+"MW" = (
+/obj/effect/turf_decal/trimline/yellow/filled/line{
+ dir = 10
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Nm" = (
+/obj/effect/spawner/random/structure/chair_maintenance{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Nu" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"NA" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"NS" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"OK" = (
+/obj/structure/table/optable,
+/obj/item/scalpel{
+ pixel_x = 0;
+ pixel_y = 5
+ },
+/obj/effect/decal/cleanable/blood,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Pu" = (
+/obj/effect/spawner/random/structure/chair_maintenance,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"PM" = (
+/obj/structure/table,
+/obj/item/retractor,
+/obj/item/surgicaldrill,
+/obj/item/cautery,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"PP" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"Qn" = (
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Rv" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"RY" = (
+/obj/effect/decal/cleanable/glass,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"SJ" = (
+/obj/item/kirbyplants/organic/plant21,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 10
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Up" = (
+/obj/machinery/hydroponics/soil,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"UW" = (
+/obj/machinery/iv_drip,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Vf" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 5
+ },
+/obj/machinery/vending/cigarette,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Vh" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"VC" = (
+/obj/effect/decal/cleanable/blood/splatter,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/directional/south,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Xs" = (
+/obj/effect/spawner/random/structure/closet_empty/crate,
+/obj/effect/spawner/random/trash/garbage,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"XJ" = (
+/obj/machinery/door/airlock/maintenance,
+/obj/effect/mapping_helpers/airlock/abandoned,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"XR" = (
+/obj/item/radio/intercom/directional/west,
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"XS" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/computer/communications{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/obj/machinery/light/directional/south,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"XY" = (
+/obj/effect/spawner/random/engineering/atmospherics_portable,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"YH" = (
+/obj/effect/spawner/random/structure/closet_empty,
+/obj/effect/spawner/random/maintenance/two,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"YU" = (
+/obj/effect/spawner/random/structure/table_or_rack,
+/obj/effect/spawner/random/engineering/toolbox,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Zk" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Zo" = (
+/obj/item/kirbyplants/organic/plant21,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 6
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Zv" = (
+/obj/effect/turf_decal/trimline/yellow/filled/line{
+ dir = 10
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"ZA" = (
+/obj/structure/chair/comfy/black{
+ dir = 1
+ },
+/obj/machinery/light/floor,
+/turf/open/floor/carpet/blue,
+/area/shuttle/escape)
+"ZR" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/trimline/yellow/filled/line{
+ dir = 9
+ },
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"ZS" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/decal/cleanable/plasma,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+Jl
+Jl
+Jl
+je
+oi
+ID
+NS
+ID
+ID
+kY
+ID
+JP
+ID
+ID
+ID
+ID
+ID
+kY
+ID
+kY
+ID
+ID
+ID
+ID
+ID
+ID
+Jl
+"}
+(2,1,1) = {"
+ID
+ID
+ID
+ID
+oi
+em
+BM
+SJ
+ID
+sD
+mE
+Nu
+Rv
+sD
+HO
+we
+In
+Rv
+Zk
+sD
+we
+Qn
+HO
+Cv
+Jr
+ID
+ID
+"}
+(3,1,1) = {"
+NS
+ZR
+Bv
+Zv
+oi
+ql
+bl
+NA
+Gx
+Rv
+YU
+gA
+HO
+rN
+HO
+Ek
+HO
+Jm
+HO
+Gr
+HO
+jy
+HO
+HO
+vd
+km
+gR
+"}
+(4,1,1) = {"
+NS
+pD
+EM
+FP
+iq
+cH
+Kg
+oX
+ID
+ID
+ID
+ID
+ID
+Rv
+sD
+sD
+Rv
+sD
+mE
+Nu
+sz
+uO
+HO
+Ek
+we
+km
+gR
+"}
+(5,1,1) = {"
+NS
+tq
+cj
+ID
+ID
+FJ
+DB
+at
+ID
+rr
+hp
+hT
+ID
+xN
+Rv
+HO
+HO
+ro
+gI
+sD
+HO
+HO
+HO
+ER
+sz
+ID
+ID
+"}
+(6,1,1) = {"
+ID
+ID
+ID
+ID
+ht
+eY
+dQ
+FQ
+ID
+hD
+eR
+LH
+NS
+Pu
+sD
+Nm
+HO
+HO
+HO
+GT
+HO
+iV
+fC
+we
+yk
+km
+gR
+"}
+(7,1,1) = {"
+NS
+vY
+XR
+df
+qf
+bl
+bl
+Mf
+ID
+hI
+MD
+hw
+Mx
+sD
+Rv
+qB
+HO
+kn
+sD
+Rv
+we
+cD
+we
+pB
+cT
+km
+gR
+"}
+(8,1,1) = {"
+NS
+dt
+ZA
+Fe
+qf
+bl
+DB
+XS
+ID
+fr
+jS
+PP
+ID
+Pu
+Rv
+BZ
+HO
+Pu
+uD
+HO
+Ef
+HO
+HO
+HO
+HO
+ID
+ID
+"}
+(9,1,1) = {"
+NS
+Ep
+mv
+Gd
+qf
+bl
+bl
+bt
+ID
+te
+oU
+ID
+ID
+HO
+sD
+iV
+HO
+hc
+cl
+HO
+HO
+HO
+dM
+UW
+IL
+km
+gR
+"}
+(10,1,1) = {"
+ID
+ID
+ID
+ID
+gd
+zd
+DJ
+sT
+ID
+KV
+uu
+ID
+gI
+pz
+Rv
+Rv
+sD
+sD
+Nu
+sz
+XY
+HO
+xO
+uK
+Vh
+km
+gR
+"}
+(11,1,1) = {"
+NS
+Lh
+bX
+ID
+ID
+qC
+di
+Ai
+ID
+eo
+oL
+ID
+cZ
+Rv
+sz
+an
+YH
+HO
+sD
+Rv
+cl
+GT
+GV
+OK
+VC
+ID
+ID
+"}
+(12,1,1) = {"
+NS
+KG
+vw
+MW
+JB
+qf
+bl
+de
+ID
+Bi
+Bi
+ID
+Rv
+Xs
+HO
+HO
+HO
+HO
+HO
+BG
+HO
+HO
+hO
+HP
+tN
+km
+gR
+"}
+(13,1,1) = {"
+NS
+wM
+zJ
+AE
+ID
+ok
+bl
+NA
+Gx
+Nu
+ZS
+GT
+Rv
+HO
+HO
+dC
+Gq
+KR
+BV
+Jr
+hG
+HO
+lP
+lR
+RY
+km
+gR
+"}
+(14,1,1) = {"
+ID
+jF
+ID
+ID
+ID
+Vf
+DL
+Zo
+ID
+ym
+gS
+HO
+Zk
+XJ
+Qn
+Zk
+Jr
+RY
+pN
+Up
+bL
+HO
+kD
+sQ
+PM
+ID
+ID
+"}
+(15,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+ID
+ID
+NS
+ID
+ID
+NS
+NS
+ID
+ID
+ID
+ID
+ID
+NS
+NS
+NS
+ID
+ID
+ID
+ID
+ID
+ID
+ID
+Jl
+"}
diff --git a/_maps/shuttles/emergency/emergency_dep_eng.dmm b/_maps/shuttles/emergency/emergency_dep_eng.dmm
new file mode 100644
index 000000000000..a99c3105750a
--- /dev/null
+++ b/_maps/shuttles/emergency/emergency_dep_eng.dmm
@@ -0,0 +1,2609 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"am" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"bl" = (
+/obj/structure/closet/radiation,
+/obj/item/clothing/glasses/meson/engine,
+/obj/effect/turf_decal/delivery,
+/obj/structure/sign/warning/secure_area/directional/west,
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"cl" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"cD" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Cooling Loop Bypass"
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"cH" = (
+/obj/machinery/recharge_station,
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"cM" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/turf/open/floor/engine/air,
+/area/shuttle/escape)
+"cT" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"cZ" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"de" = (
+/obj/structure/lattice,
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 5
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"df" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"dg" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/drone{
+ pixel_x = 0;
+ pixel_y = 3
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"dt" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"dM" = (
+/obj/structure/lattice,
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 10
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"eo" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold/orange/visible{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"et" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"eG" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/structure/cable,
+/obj/structure/extinguisher_cabinet/directional/south,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"eR" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/fancy/donut_box{
+ pixel_x = 0;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"eY" = (
+/obj/structure/cable,
+/obj/structure/sign/warning/vacuum/external/directional/north,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"eZ" = (
+/obj/machinery/door/poddoor/incinerator_atmos_main{
+ id = "shuttle_mainvent"
+ },
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"fr" = (
+/obj/machinery/air_sensor{
+ chamber_id = "shuttle_mixcham"
+ },
+/turf/open/floor/engine/vacuum,
+/area/shuttle/escape)
+"fC" = (
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"gA" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible,
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"gR" = (
+/obj/machinery/power/shuttle_engine/propulsion,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"gS" = (
+/obj/machinery/space_heater,
+/obj/machinery/light/floor,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"hc" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/sign/warning/radiation/directional/south,
+/obj/machinery/light/directional/south,
+/obj/machinery/camera/autoname/directional/south,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"ht" = (
+/obj/structure/cable,
+/obj/machinery/power/terminal{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"hC" = (
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"hG" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"hO" = (
+/obj/machinery/computer/security,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/machinery/status_display/evac/directional/north,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"hR" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
+ dir = 9
+ },
+/obj/item/stack/sheet/glass/fifty{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/stack/sheet/iron/fifty{
+ pixel_x = 4;
+ pixel_y = 6
+ },
+/obj/structure/table,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"jz" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/machinery/vending/engivend,
+/obj/machinery/light/small/directional/east,
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"km" = (
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/machinery/power/shuttle_engine/heater,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"kn" = (
+/obj/structure/table,
+/obj/item/book/manual/wiki/security_space_law{
+ pixel_x = 14;
+ pixel_y = 9
+ },
+/obj/machinery/recharger{
+ pixel_x = 0;
+ pixel_y = 4
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape/brig)
+"kD" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"kH" = (
+/obj/item/holosign_creator/atmos,
+/obj/machinery/door/window/brigdoor/left/directional/north{
+ name = "Shuttle Supermatter Chamber";
+ req_access = list("engineering")
+ },
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"kO" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"kY" = (
+/obj/structure/window/reinforced/plasma/spawner/directional/east,
+/obj/structure/window/reinforced/plasma/spawner/directional/north,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/shuttle/escape/engine)
+"lb" = (
+/obj/machinery/vending/tool,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"lc" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
+ dir = 8
+ },
+/turf/open/floor/engine/o2,
+/area/shuttle/escape)
+"ls" = (
+/obj/machinery/computer/emergency_shuttle,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"lw" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"lG" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 5
+ },
+/obj/machinery/button/flasher{
+ id = "shuttle_flasher";
+ pixel_x = 0;
+ pixel_y = -25
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"lP" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "Gas to Filter"
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"lZ" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 9
+ },
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"mf" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ color = "#69ffff";
+ dir = 9
+ },
+/obj/machinery/shower/directional/west,
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"mw" = (
+/obj/structure/window/reinforced/plasma/spawner/directional/west,
+/obj/structure/window/reinforced/plasma/spawner/directional/north,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/shuttle/escape/engine)
+"mE" = (
+/obj/machinery/stasis{
+ dir = 4
+ },
+/obj/machinery/vitals_reader/directional/west,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ color = "#69ffff";
+ dir = 6
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"mX" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"na" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Gas to Chamber";
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"nR" = (
+/obj/machinery/air_sensor{
+ chamber_id = "shuttle_turbine"
+ },
+/turf/open/floor/engine/vacuum,
+/area/shuttle/escape)
+"nU" = (
+/obj/structure/window/reinforced/plasma/spawner/directional/west,
+/obj/structure/window/reinforced/plasma/spawner/directional/south,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/shuttle/escape/engine)
+"oh" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/button/flasher{
+ id = "shuttle_flasher";
+ pixel_x = 0;
+ pixel_y = 25
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"oi" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"ok" = (
+/obj/structure/filingcabinet/chestdrawer,
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"ol" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Emergency Shuttle Brig"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/obj/structure/cable,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"or" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Technical Room"
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"oY" = (
+/obj/machinery/power/turbine/inlet_compressor{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"pI" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{
+ dir = 8
+ },
+/obj/structure/window/reinforced/plasma/spawner/directional/south,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/computer/atmos_control/noreconnect{
+ atmos_chambers = list("shuttle_turbine" = "Incinerator Chamber");
+ dir = 4
+ },
+/obj/structure/window/reinforced/plasma/spawner/directional/west,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"pN" = (
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/closet/crate/eva,
+/obj/item/radio/intercom/directional/east,
+/obj/machinery/light/directional/east,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"pS" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/duct,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"qf" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable,
+/obj/machinery/light/small/directional/south,
+/obj/machinery/camera/autoname/directional/south,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"qB" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"qF" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{
+ dir = 1
+ },
+/turf/open/floor/engine/vacuum,
+/area/shuttle/escape)
+"rb" = (
+/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Brig"
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"ro" = (
+/obj/machinery/atmospherics/components/trinary/mixer/flipped{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"rr" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Pure to Mix Chamber"
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible,
+/obj/machinery/door/window/brigdoor/right/directional/west{
+ name = "Turbine Chamber";
+ req_access = list("atmospherics")
+ },
+/obj/machinery/door/window/brigdoor/right/directional/east{
+ name = "Turbine Chamber";
+ req_access = list("atmospherics")
+ },
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"ry" = (
+/obj/structure/table,
+/obj/item/storage/medkit/fire{
+ pixel_x = 5;
+ pixel_y = 3
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"rF" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"rQ" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ color = "#69ffff";
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"so" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"sr" = (
+/obj/structure/window/reinforced/plasma/spawner/directional/west,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2,
+/obj/machinery/portable_atmospherics/canister,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"sz" = (
+/obj/machinery/computer/monitor{
+ dir = 8
+ },
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"sD" = (
+/obj/structure/bed,
+/obj/item/bedsheet/ce,
+/obj/structure/curtain/cloth,
+/obj/machinery/light/floor,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"sQ" = (
+/obj/machinery/power/energy_accumulator/grounding_rod/anchored,
+/obj/structure/window/reinforced/plasma/spawner/directional/south,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
+ dir = 9
+ },
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"sR" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
+ dir = 10
+ },
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"sU" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/red/line,
+/obj/structure/cable,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"tu" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Cockpit"
+ },
+/obj/machinery/duct,
+/obj/effect/mapping_helpers/airlock/access/any/command/general,
+/obj/effect/mapping_helpers/airlock/access/any/engineering/general,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"uz" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "O2 To Pure"
+ },
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"uK" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible,
+/obj/machinery/airalarm/directional/west,
+/obj/effect/mapping_helpers/airalarm/link{
+ chamber_id = "shuttle_mixcham"
+ },
+/obj/effect/mapping_helpers/airalarm/all_access,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/airalarm/tlv_no_checks,
+/obj/machinery/computer/turbine_computer{
+ mapping_id = "shuttle_turbine";
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"uO" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"uQ" = (
+/obj/machinery/status_display/ai/directional/south,
+/obj/structure/cable,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"uY" = (
+/obj/structure/cable,
+/obj/machinery/power/emitter/welded{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"vn" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{
+ dir = 9
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"vz" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/obj/machinery/atmospherics/pipe/heat_exchanging/junction{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"vK" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"vY" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 1
+ },
+/obj/structure/window/reinforced/plasma/spawner/directional/west,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"we" = (
+/obj/machinery/air_sensor{
+ chamber_id = "shuttlesm"
+ },
+/obj/machinery/door/window/brigdoor/left/directional/north{
+ name = "Shuttle Supermatter Chamber";
+ req_access = list("engineering")
+ },
+/turf/open/floor/engine,
+/area/shuttle/escape/engine)
+"wL" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 6
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"wM" = (
+/obj/machinery/power/energy_accumulator/grounding_rod/anchored,
+/obj/structure/window/reinforced/plasma/spawner/directional/south,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 5
+ },
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"xn" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/sign/warning/radiation/directional/north,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"xq" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 6
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/light/directional/north,
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"xO" = (
+/obj/structure/closet/toolcloset,
+/obj/effect/turf_decal/delivery,
+/obj/item/clothing/glasses/meson/engine,
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"xU" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/components/trinary/filter/critical{
+ filter_type = list(/datum/gas/nitrogen);
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"yk" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 6
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"ym" = (
+/obj/machinery/status_display/evac/directional/south,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"yy" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/light/directional/south,
+/obj/machinery/camera/autoname/directional/south,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"yI" = (
+/obj/structure/cable,
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"yP" = (
+/obj/machinery/power/turbine/core_rotor{
+ mapping_id = "shuttle_turbine";
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"za" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Air to Pure"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/machinery/camera/autoname/directional/north,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"zu" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/structure/sign/warning/vacuum/external/directional/west,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"zJ" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"zK" = (
+/obj/item/radio/intercom/directional/north,
+/obj/structure/rack,
+/obj/item/storage/toolbox/electrical{
+ pixel_x = -1;
+ pixel_y = 4
+ },
+/obj/item/storage/toolbox/emergency{
+ pixel_x = 1;
+ pixel_y = 2
+ },
+/obj/item/storage/toolbox/drone{
+ pixel_x = 4;
+ pixel_y = -1
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"zM" = (
+/obj/machinery/power/port_gen/pacman/pre_loaded,
+/obj/item/wrench,
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"zN" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/components/trinary/filter/critical{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"zO" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 5
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"zQ" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"zS" = (
+/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Af" = (
+/obj/structure/window/reinforced/plasma/spawner/directional/east,
+/obj/structure/window/reinforced/plasma/spawner/directional/south,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/shuttle/escape/engine)
+"AE" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Emergency Shuttle Infirmary"
+ },
+/obj/machinery/duct,
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"Bm" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"BL" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"BV" = (
+/obj/machinery/stasis{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ color = "#69ffff";
+ dir = 5
+ },
+/obj/machinery/vitals_reader/directional/west,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"BZ" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/structure/cable,
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Ca" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"Cl" = (
+/obj/machinery/power/turbine/turbine_outlet{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"Cm" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Cold Loop to Gas"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Cp" = (
+/obj/structure/lattice,
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 9
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"Cr" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/structure/closet/radiation,
+/obj/item/clothing/glasses/meson/engine,
+/obj/structure/extinguisher_cabinet/directional/north,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"CG" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 10
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"CZ" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible,
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"DB" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"DZ" = (
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/components/unary/passive_vent{
+ dir = 8
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"Ed" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/green/visible,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Ef" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Em" = (
+/obj/machinery/light/small/directional/east,
+/obj/structure/closet/crate/engineering{
+ name = "engineering modsuits crate"
+ },
+/obj/item/mod/control/pre_equipped/engineering{
+ pixel_x = -6;
+ pixel_y = 0
+ },
+/obj/item/mod/control/pre_equipped/engineering,
+/obj/item/mod/control/pre_equipped/atmospheric{
+ pixel_x = 6;
+ pixel_y = 0
+ },
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Er" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
+ dir = 8
+ },
+/turf/open/floor/engine/n2,
+/area/shuttle/escape)
+"Es" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{
+ dir = 8
+ },
+/obj/machinery/portable_atmospherics/canister,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/window/reinforced/plasma/spawner/directional/north,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"ED" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2,
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"ER" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Fe" = (
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Fo" = (
+/obj/machinery/power/supermatter_crystal/shard,
+/obj/structure/closet/crate/engineering{
+ name = "supermatter crate"
+ },
+/obj/structure/window/reinforced/plasma/spawner/directional/south,
+/obj/machinery/light/floor,
+/turf/open/floor/engine,
+/area/shuttle/escape/engine)
+"FJ" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/structure/closet/radiation,
+/obj/item/clothing/glasses/meson/engine,
+/obj/machinery/airalarm/directional/north,
+/obj/effect/mapping_helpers/airalarm/engine_access,
+/obj/effect/mapping_helpers/airalarm/tlv_no_checks,
+/obj/effect/mapping_helpers/airalarm/link{
+ chamber_id = "shuttlesm"
+ },
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"FN" = (
+/obj/effect/turf_decal/bot,
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"FO" = (
+/obj/item/gun/ballistic/revolver/russian,
+/obj/structure/cable,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"FP" = (
+/obj/structure/table,
+/obj/item/scalpel{
+ pixel_y = 12
+ },
+/obj/item/circular_saw,
+/obj/item/retractor{
+ pixel_x = 4
+ },
+/obj/item/hemostat{
+ pixel_x = -4
+ },
+/obj/item/clothing/gloves/latex,
+/obj/item/clothing/mask/surgical,
+/obj/item/surgicaldrill,
+/obj/item/cautery,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ color = "#69ffff";
+ dir = 10
+ },
+/obj/machinery/defibrillator_mount/loaded{
+ pixel_x = 28;
+ pixel_y = 0
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"FR" = (
+/obj/machinery/door/airlock/external/ruin{
+ name = "Atmos Shuttle"
+ },
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/obj/machinery/atmos_shield_gen/active{
+ use_power = 0
+ },
+/obj/machinery/atmos_shield_gen/active{
+ dir = 1;
+ use_power = 0
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Gq" = (
+/obj/machinery/portable_atmospherics/canister/nitrogen,
+/turf/open/floor/engine/n2,
+/area/shuttle/escape)
+"Gw" = (
+/obj/machinery/door/window/brigdoor/left/directional/north{
+ req_access = list("atmospherics");
+ name = "Mix Chamber"
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Gx" = (
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable,
+/obj/machinery/light/floor,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"GG" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"GT" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"GU" = (
+/obj/structure/lattice,
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
+/turf/template_noop,
+/area/shuttle/escape)
+"Ht" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Technical Room"
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"HD" = (
+/obj/machinery/portable_atmospherics/canister/plasma,
+/turf/open/floor/engine/plasma,
+/area/shuttle/escape)
+"HF" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/machinery/duct,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"HJ" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/sign/warning/radiation/directional/south,
+/obj/machinery/light/directional/south,
+/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"HO" = (
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"HU" = (
+/obj/structure/tank_dispenser{
+ pixel_x = -1
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"In" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Iq" = (
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/closet/crate/internals,
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"It" = (
+/obj/structure/window/reinforced/plasma/spawner/directional/east,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 1
+ },
+/obj/machinery/portable_atmospherics/canister/nitrogen,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"IA" = (
+/obj/structure/table,
+/obj/item/storage/box/handcuffs{
+ pixel_x = -1;
+ pixel_y = 8
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape/brig)
+"IB" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
+/obj/structure/cable,
+/obj/machinery/button/ignition/incinerator/atmos{
+ pixel_x = 26;
+ pixel_y = -5;
+ id = "shuttle_mixcham_igniter";
+ name = "mixing chamber gnition switch"
+ },
+/obj/machinery/button/door/directional/east{
+ pixel_x = 26;
+ pixel_y = 5;
+ id = "shuttle_mixcham_shutters";
+ name = "mixing chamber vent control"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/light/small/directional/east,
+/obj/machinery/camera/autoname/directional/east,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"IE" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/computer/communications,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"IF" = (
+/obj/structure/table/optable,
+/obj/item/bedsheet/yellow{
+ pixel_x = 2;
+ pixel_y = 5
+ },
+/obj/machinery/vitals_reader/directional/east,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ color = "#69ffff";
+ dir = 4
+ },
+/obj/machinery/light/directional/east,
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"IL" = (
+/obj/structure/cable,
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Technical Room"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"IN" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"IT" = (
+/obj/machinery/door/poddoor/incinerator_atmos_aux{
+ id = "shuttle_auxvent"
+ },
+/turf/open/floor/engine/vacuum,
+/area/shuttle/escape)
+"Jc" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ name = "Engineering emergency shuttle"
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Jl" = (
+/turf/template_noop,
+/area/template_noop)
+"Jm" = (
+/obj/structure/lattice,
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 4
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"Jp" = (
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
+/obj/structure/cable,
+/turf/template_noop,
+/area/shuttle/escape)
+"JO" = (
+/obj/structure/closet/firecloset,
+/obj/item/clothing/glasses/meson/engine,
+/obj/effect/turf_decal/delivery,
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"JP" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ name = "Engine Coolant Bypass";
+ dir = 4
+ },
+/obj/machinery/duct,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"KB" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
+/obj/structure/lattice/catwalk,
+/obj/structure/cable,
+/turf/template_noop,
+/area/shuttle/escape)
+"KC" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Gas to Chamber"
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"KP" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
+ dir = 8
+ },
+/turf/open/floor/engine/plasma,
+/area/shuttle/escape)
+"KR" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/wall_healer/free/directional/south{
+ use_power = 0
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"KV" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"KX" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Plasma to Pure"
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible,
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"La" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/item/radio/intercom/directional/west,
+/obj/structure/window/reinforced/plasma/spawner/directional/north,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Lo" = (
+/obj/structure/table,
+/obj/item/storage/medkit/brute{
+ pixel_x = -6;
+ pixel_y = 3
+ },
+/obj/item/storage/medkit/toxin{
+ pixel_x = -16;
+ pixel_y = 9
+ },
+/obj/structure/extinguisher_cabinet/directional/north,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"LE" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
+/obj/machinery/airalarm/directional/east,
+/obj/effect/mapping_helpers/airalarm/link{
+ chamber_id = "shuttle_mixcham"
+ },
+/obj/effect/mapping_helpers/airalarm/all_access,
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/obj/machinery/light/directional/east,
+/obj/effect/mapping_helpers/airalarm/tlv_no_checks,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"LH" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/decal/remains/human,
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 10
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"LN" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/duct,
+/obj/structure/sign/warning/radiation/directional/north,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"LX" = (
+/obj/machinery/power/shuttle_engine/heater,
+/obj/structure/window/reinforced/plasma/spawner/directional/north,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"MD" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"MI" = (
+/obj/machinery/door/airlock/external/ruin,
+/obj/structure/cable,
+/obj/machinery/atmos_shield_gen/active{
+ dir = 1;
+ use_power = 0
+ },
+/obj/machinery/atmos_shield_gen/active{
+ use_power = 0
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"MW" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Cockpit"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/command/general,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Ni" = (
+/obj/effect/turf_decal/stripes/corner,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Nm" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"NA" = (
+/obj/structure/cable,
+/obj/machinery/power/smes,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"NJ" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/obj/machinery/light/directional/south,
+/obj/structure/fireaxecabinet/directional/south,
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"Oa" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/white/line{
+ color = "#69ffff"
+ },
+/obj/machinery/duct,
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"OC" = (
+/obj/machinery/computer/crew,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"OT" = (
+/obj/machinery/igniter/incinerator_atmos{
+ id = "shuttle_incinerator_igniter"
+ },
+/turf/open/floor/engine/vacuum,
+/area/shuttle/escape)
+"Pu" = (
+/obj/structure/reagent_dispensers/plumbed{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/end{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"PC" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/duct,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
+ dir = 10
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"PI" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible,
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/table,
+/obj/item/holosign_creator/atmos{
+ pixel_x = 9;
+ pixel_y = 8
+ },
+/obj/item/clothing/suit/utility/fire/atmos{
+ pixel_x = -7;
+ pixel_y = 0
+ },
+/obj/item/clothing/head/utility/hardhat/welding/atmos{
+ pixel_x = -6;
+ pixel_y = 6
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Qi" = (
+/obj/structure/chair/office/light{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/machinery/light/floor,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Qn" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Rl" = (
+/obj/structure/window/reinforced/plasma/spawner/directional/east,
+/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Pure to Fuel Pipe"
+ },
+/obj/machinery/door/window/brigdoor/right/directional/west{
+ name = "Mix Chamber";
+ req_access = list("atmospherics")
+ },
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"Rv" = (
+/obj/machinery/shower/directional/east,
+/obj/effect/turf_decal/stripes/end{
+ dir = 8
+ },
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"RY" = (
+/obj/structure/table,
+/obj/item/storage/medkit/regular{
+ pixel_x = 0;
+ pixel_y = 6
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/item/stack/medical/ointment{
+ pixel_x = -4;
+ pixel_y = -3
+ },
+/obj/item/reagent_containers/spray/hercuri{
+ pixel_x = 5;
+ pixel_y = 4
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ color = "#69ffff";
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"Sc" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "N2 to Pure"
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible,
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"SN" = (
+/obj/effect/turf_decal/bot,
+/obj/machinery/duct,
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Te" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
+ dir = 8
+ },
+/turf/open/floor/engine/air,
+/area/shuttle/escape)
+"Tr" = (
+/obj/machinery/button/door/incinerator_vent_atmos_aux{
+ pixel_x = 26;
+ pixel_y = -5;
+ id = "shuttle_auxvent"
+ },
+/obj/machinery/button/door/incinerator_vent_atmos_main{
+ pixel_x = 26;
+ pixel_y = 5;
+ id = "shuttle_mainvent"
+ },
+/obj/structure/cable,
+/obj/machinery/button/ignition/incinerator/atmos{
+ pixel_x = 37;
+ pixel_y = 0;
+ id = "shuttle_incinerator_igniter"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/light/directional/east,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"TX" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ name = "Gas to Cold Loop";
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Ui" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/duct,
+/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
+ dir = 4
+ },
+/obj/machinery/wall_healer/free/directional/north{
+ use_power = 0
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Up" = (
+/obj/machinery/power/energy_accumulator/tesla_coil/anchored,
+/obj/structure/window/reinforced/plasma/spawner/directional/north,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{
+ dir = 8
+ },
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"UC" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/rack,
+/obj/item/storage/belt/utility,
+/obj/item/storage/toolbox/drone,
+/obj/item/clothing/shoes/magboots{
+ pixel_x = 0;
+ pixel_y = -4
+ },
+/obj/item/clothing/gloves/color/yellow{
+ pixel_x = 0;
+ pixel_y = 5
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/obj/machinery/light/directional/west,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"UO" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"UW" = (
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Va" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{
+ dir = 4
+ },
+/turf/open/floor/engine/vacuum,
+/area/shuttle/escape)
+"Vg" = (
+/obj/machinery/light/small/directional/west,
+/obj/machinery/camera/autoname/directional/west,
+/obj/structure/cable,
+/obj/machinery/microwave/engineering/cell_included{
+ pixel_x = 0;
+ pixel_y = 8
+ },
+/obj/structure/table/reinforced,
+/obj/effect/spawner/random/food_or_drink/donkpockets,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Wb" = (
+/obj/effect/turf_decal/delivery,
+/obj/structure/closet/secure_closet/engineering_electrical,
+/obj/structure/sign/warning/secure_area/directional/east,
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"WG" = (
+/obj/machinery/igniter/incinerator_atmos{
+ id = "shuttle_mixcham_igniter"
+ },
+/turf/open/floor/engine/vacuum,
+/area/shuttle/escape)
+"WW" = (
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/turf/open/floor/engine/o2,
+/area/shuttle/escape)
+"Xs" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/machinery/portable_atmospherics/scrubber/huge/movable,
+/obj/machinery/camera/autoname/directional/south,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Xx" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2,
+/turf/open/floor/engine/vacuum,
+/area/shuttle/escape)
+"XD" = (
+/obj/machinery/door/poddoor{
+ name = "Mixing Chamber Vent";
+ id = "shuttle_mixcham_shutters"
+ },
+/turf/open/floor/engine/vacuum,
+/area/shuttle/escape)
+"XS" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"XY" = (
+/obj/machinery/power/energy_accumulator/tesla_coil/anchored,
+/obj/structure/window/reinforced/plasma/spawner/directional/north,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{
+ dir = 4
+ },
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"Yl" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 8
+ },
+/obj/machinery/flasher/directional/west{
+ id = "shuttle_flasher"
+ },
+/obj/machinery/light/directional/west,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"YH" = (
+/turf/closed/wall/r_wall/plastitanium,
+/area/shuttle/escape)
+"YM" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/computer/station_alert,
+/obj/machinery/status_display/ai/directional/north,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"YT" = (
+/obj/structure/window/reinforced/plasma/spawner/directional/south,
+/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{
+ dir = 8
+ },
+/obj/machinery/computer/atmos_control/noreconnect{
+ atmos_chambers = list("shuttle_mixcham" = "Mix Chamber");
+ dir = 4
+ },
+/obj/structure/window/reinforced/plasma/spawner/directional/west,
+/obj/effect/turf_decal/stripes/end{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Zq" = (
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"ZH" = (
+/obj/structure/lattice,
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 6
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+Jl
+KV
+zJ
+zJ
+rb
+zJ
+Jc
+zJ
+MD
+MD
+MD
+zJ
+oi
+zJ
+or
+zJ
+zJ
+zJ
+Jl
+"}
+(2,1,1) = {"
+Jl
+zJ
+MD
+MD
+zJ
+KV
+yk
+Yl
+lG
+zJ
+DB
+UC
+hG
+hG
+Qn
+Iq
+KR
+zJ
+UW
+Vg
+zM
+zJ
+YH
+"}
+(3,1,1) = {"
+zJ
+KV
+sD
+ok
+zJ
+kn
+Ca
+FO
+sU
+ol
+wL
+XS
+XS
+XS
+zO
+df
+lw
+Ht
+kD
+kD
+am
+km
+gR
+"}
+(4,1,1) = {"
+zJ
+YM
+Ef
+eG
+zJ
+IA
+LH
+rF
+lZ
+zJ
+oh
+UW
+UW
+UW
+HO
+Ni
+jz
+zJ
+zK
+kD
+am
+km
+gR
+"}
+(5,1,1) = {"
+MD
+OC
+UW
+kO
+zJ
+zJ
+zJ
+MD
+zJ
+KV
+xn
+KC
+Up
+wM
+na
+hc
+yI
+zJ
+zJ
+kD
+am
+km
+gR
+"}
+(6,1,1) = {"
+MD
+dg
+UW
+Nm
+MD
+bl
+Rv
+JO
+zJ
+Cr
+uO
+It
+mw
+nU
+In
+zN
+uQ
+zJ
+Zq
+kD
+cT
+km
+gR
+"}
+(7,1,1) = {"
+MD
+ls
+Qi
+Nm
+MW
+FN
+Gx
+SN
+tu
+pS
+JP
+kH
+we
+Fo
+cZ
+qB
+uY
+zJ
+Zq
+NJ
+zJ
+zJ
+YH
+"}
+(8,1,1) = {"
+MD
+eR
+UW
+Nm
+MD
+Wb
+Pu
+xO
+zJ
+FJ
+HF
+vY
+kY
+Af
+CG
+xU
+ym
+zJ
+Zq
+kD
+vK
+km
+gR
+"}
+(9,1,1) = {"
+MD
+IE
+UW
+qf
+zJ
+zJ
+zJ
+MD
+zJ
+KV
+LN
+lP
+XY
+sQ
+fC
+HJ
+zJ
+zJ
+zJ
+kD
+am
+km
+gR
+"}
+(10,1,1) = {"
+zJ
+hO
+GT
+BZ
+zJ
+ry
+mE
+RY
+BV
+zJ
+Ui
+UW
+UW
+UW
+fC
+IN
+lb
+zJ
+NA
+kD
+am
+km
+gR
+"}
+(11,1,1) = {"
+zJ
+KV
+gS
+cH
+zJ
+Lo
+rQ
+hC
+Oa
+AE
+PC
+Ed
+zQ
+cD
+eo
+vn
+so
+IL
+ht
+dt
+am
+km
+gR
+"}
+(12,1,1) = {"
+Jl
+zJ
+MD
+MD
+zJ
+KV
+FP
+IF
+mf
+zJ
+Fe
+pN
+TX
+mX
+Cm
+sz
+Xs
+zJ
+eY
+Em
+HU
+zJ
+YH
+"}
+(13,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+Jl
+KV
+zJ
+zJ
+zJ
+zJ
+zJ
+zJ
+vz
+cl
+vz
+zJ
+zJ
+zJ
+MI
+zJ
+zJ
+zJ
+Jl
+"}
+(14,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+Jl
+ZH
+GU
+GU
+GU
+GU
+GU
+GU
+Cp
+DZ
+dM
+GU
+KB
+KB
+Jp
+GU
+de
+Jl
+Jl
+"}
+(15,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+Jl
+Jm
+KV
+zJ
+et
+zJ
+IT
+zJ
+KV
+XD
+zS
+zJ
+FR
+zJ
+zJ
+gR
+Jm
+Jl
+Jl
+"}
+(16,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+Jl
+Jm
+eZ
+Cl
+yP
+oY
+OT
+nR
+zJ
+WG
+Xx
+La
+Bm
+zu
+LX
+gR
+Jm
+Jl
+Jl
+"}
+(17,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+Jl
+Jm
+zJ
+sr
+UO
+ED
+qF
+Va
+zJ
+fr
+Va
+Es
+fC
+yy
+zJ
+YH
+Jm
+Jl
+Jl
+"}
+(18,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+Jl
+Jm
+zJ
+xq
+gA
+uK
+pI
+rr
+CZ
+YT
+Rl
+Gw
+ro
+PI
+LX
+gR
+Jm
+Jl
+Jl
+"}
+(19,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+Jl
+Jm
+zJ
+za
+BL
+Tr
+uz
+sR
+IB
+Sc
+GG
+LE
+KX
+hR
+LX
+gR
+Jm
+Jl
+Jl
+"}
+(20,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+Jl
+Jm
+zJ
+ER
+et
+zJ
+ER
+et
+zJ
+ER
+et
+zJ
+ER
+et
+zJ
+YH
+Jm
+Jl
+Jl
+"}
+(21,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+Jl
+Jm
+zJ
+Te
+cM
+et
+lc
+WW
+et
+Er
+Gq
+et
+KP
+HD
+LX
+gR
+Jm
+Jl
+Jl
+"}
+(22,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+Jl
+Jm
+KV
+zJ
+zJ
+zJ
+zJ
+zJ
+zJ
+zJ
+zJ
+zJ
+zJ
+zJ
+zJ
+gR
+Jm
+Jl
+Jl
+"}
+(23,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+Jl
+dM
+GU
+GU
+GU
+GU
+GU
+GU
+GU
+GU
+GU
+GU
+GU
+GU
+GU
+GU
+Cp
+Jl
+Jl
+"}
diff --git a/_maps/shuttles/emergency/emergency_dep_med.dmm b/_maps/shuttles/emergency/emergency_dep_med.dmm
new file mode 100644
index 000000000000..18ed086e314a
--- /dev/null
+++ b/_maps/shuttles/emergency/emergency_dep_med.dmm
@@ -0,0 +1,1295 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"bl" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"ce" = (
+/turf/closed/wall/r_wall/plastitanium/nodiagonal,
+/area/shuttle/escape)
+"cl" = (
+/obj/effect/turf_decal/tile/yellow/half{
+ dir = 4
+ },
+/obj/item/kirbyplants/random,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"cD" = (
+/obj/structure/extinguisher_cabinet/directional/west,
+/obj/structure/closet/emcloset/anchored,
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"cH" = (
+/obj/structure/table/glass,
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"cZ" = (
+/obj/effect/turf_decal/tile/yellow/half,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"de" = (
+/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"df" = (
+/obj/machinery/door/airlock/medical/glass{
+ name = "Chemistry Lab"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/medical/pharmacy,
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"dg" = (
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/structure/closet/crate/internals,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"dt" = (
+/obj/effect/turf_decal/tile/green/anticorner,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"dM" = (
+/obj/structure/table/glass,
+/obj/item/defibrillator/loaded,
+/obj/machinery/vitals_reader/directional/north,
+/obj/machinery/light/directional/west,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"eo" = (
+/obj/machinery/chem_master,
+/obj/effect/turf_decal/tile/yellow/half,
+/obj/item/radio/intercom/directional/south,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"eR" = (
+/obj/effect/turf_decal/tile/blue/half,
+/obj/structure/closet/firecloset,
+/obj/machinery/camera/autoname/directional/south,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"eY" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/structure/reagent_dispensers/wall/peppertank/directional/south,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"fC" = (
+/obj/structure/window/reinforced/spawner/directional/west,
+/mob/living/carbon/human/species/monkey,
+/turf/open/floor/mineral/titanium/white{
+ color = "#62ff57"
+ },
+/area/shuttle/escape)
+"fS" = (
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/structure/closet/crate/internals,
+/obj/machinery/light/directional/west,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"gI" = (
+/obj/machinery/light/directional/east,
+/obj/machinery/status_display/evac/directional/east,
+/obj/structure/bed/medical/anchored{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"gR" = (
+/obj/machinery/power/shuttle_engine/propulsion,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"gS" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"hc" = (
+/obj/structure/bodycontainer/morgue/beeper_off,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"ht" = (
+/obj/effect/turf_decal/tile/green/anticorner{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"hG" = (
+/obj/structure/closet/crate/bin,
+/obj/effect/turf_decal/tile/blue/half{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"hI" = (
+/obj/machinery/light/directional/east,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"hO" = (
+/obj/machinery/defibrillator_mount/loaded{
+ pixel_x = 0;
+ pixel_y = -28
+ },
+/obj/effect/turf_decal/tile/blue/half,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"iq" = (
+/obj/machinery/light/directional/west,
+/obj/structure/bed/medical/anchored,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"km" = (
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/machinery/power/shuttle_engine/heater,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"kn" = (
+/obj/machinery/door/airlock/titanium/glass{
+ name = "Emergency Shuttle Brig"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"kD" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
+/obj/item/kirbyplants/random,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"kH" = (
+/obj/item/radio/intercom/directional/east,
+/obj/machinery/light/directional/east,
+/obj/structure/bed/medical/anchored{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"ls" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
+/turf/closed/wall/r_wall/plastitanium/nodiagonal,
+/area/shuttle/escape)
+"lP" = (
+/obj/effect/turf_decal/tile/yellow/anticorner{
+ dir = 1
+ },
+/obj/structure/closet/secure_closet/chemical,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"mE" = (
+/obj/machinery/stasis{
+ dir = 4
+ },
+/obj/machinery/defibrillator_mount/directional/north,
+/obj/machinery/iv_drip,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"mX" = (
+/obj/structure/chair/office/light,
+/obj/effect/turf_decal/tile/green/half,
+/obj/item/stack/sheet/mineral/plasma{
+ pixel_x = -2;
+ pixel_y = -2
+ },
+/obj/machinery/light/floor,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"na" = (
+/obj/effect/turf_decal/tile/yellow/half{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet/directional/north,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"oi" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"ok" = (
+/obj/structure/table/glass,
+/obj/effect/spawner/surgery_tray/full,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"pB" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 1
+ },
+/obj/machinery/portable_atmospherics/canister/anesthetic_mix,
+/obj/machinery/light/directional/east,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"pN" = (
+/obj/structure/chair/office/light{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow/half{
+ dir = 1
+ },
+/obj/machinery/camera/autoname/directional/north,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"qf" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"qB" = (
+/obj/structure/table,
+/obj/machinery/light/directional/north,
+/obj/item/storage/box/zipties{
+ pixel_x = 7;
+ pixel_y = 13
+ },
+/obj/item/book/manual/wiki/security_space_law{
+ pixel_x = -3;
+ pixel_y = 2
+ },
+/obj/machinery/status_display/evac/directional/north,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"rb" = (
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"ro" = (
+/obj/machinery/door/airlock/virology/glass{
+ name = "Virology Lab"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/medical/virology,
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"rQ" = (
+/obj/structure/extinguisher_cabinet/directional/north,
+/obj/effect/turf_decal/tile/blue/half{
+ dir = 1
+ },
+/obj/structure/closet/crate/freezer/blood,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"sz" = (
+/obj/machinery/smartfridge/chemistry/preloaded,
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"sD" = (
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"sQ" = (
+/obj/structure/chair/office/light{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/yellow/half{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"sU" = (
+/obj/machinery/power/shuttle_engine/propulsion,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"tu" = (
+/obj/effect/turf_decal/tile/blue/half{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"uK" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"uQ" = (
+/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"vz" = (
+/obj/structure/table/glass,
+/obj/machinery/reagentgrinder{
+ pixel_x = 0;
+ pixel_y = 9
+ },
+/obj/effect/turf_decal/tile/yellow/anticorner,
+/obj/item/stack/sheet/mineral/plasma,
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"vY" = (
+/obj/machinery/stasis,
+/obj/machinery/vitals_reader/directional/south,
+/obj/machinery/iv_drip,
+/obj/machinery/light/directional/east,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"we" = (
+/obj/structure/bed/medical/anchored{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"wM" = (
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"xN" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/medical/pharmacy,
+/obj/effect/mapping_helpers/airlock/access/any/medical/virology,
+/obj/effect/mapping_helpers/airlock/access/any/medical/morgue,
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"xO" = (
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"xU" = (
+/obj/effect/turf_decal/tile/blue/anticorner{
+ dir = 8
+ },
+/obj/structure/closet/emcloset,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"yk" = (
+/obj/item/kirbyplants/random,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"ym" = (
+/obj/machinery/chem_dispenser,
+/obj/effect/turf_decal/tile/yellow/anticorner{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"zJ" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"zM" = (
+/obj/structure/table/glass,
+/obj/item/reagent_containers/cup/beaker/cryoxadone{
+ pixel_x = -6;
+ pixel_y = 10
+ },
+/obj/item/reagent_containers/cup/beaker/cryoxadone{
+ pixel_x = 6;
+ pixel_y = 10
+ },
+/obj/item/reagent_containers/cup/beaker/cryoxadone{
+ pixel_x = -6;
+ pixel_y = 3
+ },
+/obj/item/reagent_containers/cup/beaker/cryoxadone{
+ pixel_x = 6;
+ pixel_y = 3
+ },
+/obj/machinery/light/directional/west,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"zN" = (
+/obj/machinery/computer/communications{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue/half{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"zO" = (
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/machinery/power/shuttle_engine/heater,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"zQ" = (
+/obj/machinery/chem_heater/withbuffer,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"Af" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/window/right/directional/east{
+ name = "Chemistry Desk";
+ req_access = list("plumbing")
+ },
+/obj/machinery/door/window/left/directional/west{
+ name = "Chemistry Desk"
+ },
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"AE" = (
+/obj/effect/turf_decal/tile/blue/half,
+/obj/structure/closet/crate/freezer/blood,
+/obj/item/radio/intercom/directional/south,
+/obj/machinery/camera/autoname/directional/south,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"BV" = (
+/obj/structure/table/glass,
+/obj/effect/turf_decal/tile/blue/half,
+/obj/machinery/light/directional/south,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"BZ" = (
+/turf/open/floor/mineral/titanium/white{
+ color = "#62ff57"
+ },
+/area/shuttle/escape)
+"Cp" = (
+/obj/structure/bed/medical,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"CG" = (
+/obj/machinery/chem_dispenser,
+/obj/effect/turf_decal/tile/yellow/anticorner{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"DB" = (
+/obj/effect/turf_decal/tile/blue/half{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"Ef" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"Eh" = (
+/obj/machinery/door/airlock/multi_tile/public/glass{
+ dir = 4;
+ name = "Escape Shuttle Infirmary"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"ER" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 1
+ },
+/obj/machinery/portable_atmospherics/canister/anesthetic_mix,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"Fe" = (
+/obj/machinery/computer/emergency_shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue/half{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"FJ" = (
+/obj/structure/table/glass,
+/obj/item/clothing/gloves/latex,
+/obj/item/healthanalyzer,
+/obj/item/clothing/glasses/hud/health,
+/obj/item/restraints/handcuffs/cable/zipties,
+/obj/item/clothing/glasses/science,
+/obj/effect/turf_decal/tile/green/anticorner{
+ dir = 8
+ },
+/obj/structure/reagent_dispensers/wall/virusfood/directional/west,
+/obj/machinery/reagentgrinder{
+ pixel_x = 0;
+ pixel_y = 9
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"FP" = (
+/obj/machinery/defibrillator_mount/loaded{
+ pixel_x = 0;
+ pixel_y = 28
+ },
+/obj/effect/turf_decal/tile/blue/half{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"Gx" = (
+/obj/structure/sign/departments/medbay/alt/directional/east,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"GT" = (
+/obj/structure/chair/comfy{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"GU" = (
+/obj/machinery/cryo_cell{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"HJ" = (
+/obj/effect/turf_decal/tile/yellow/half{
+ dir = 4
+ },
+/obj/machinery/chem_master,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"HO" = (
+/obj/structure/bodycontainer/morgue/beeper_off{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"HU" = (
+/obj/machinery/door/window/left/directional/west{
+ name = "Monkey Pen";
+ req_access = list("medical")
+ },
+/turf/open/floor/mineral/titanium/white{
+ color = "#62ff57"
+ },
+/area/shuttle/escape)
+"In" = (
+/obj/machinery/wall_healer/free/directional/east,
+/obj/structure/bed/medical/anchored{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"Iq" = (
+/obj/item/radio/intercom/directional/west,
+/obj/machinery/light/directional/west,
+/obj/structure/bed/medical/anchored,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"IE" = (
+/obj/effect/turf_decal/tile/blue/anticorner{
+ dir = 1
+ },
+/obj/item/kirbyplants/random,
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"IL" = (
+/mob/living/carbon/human/species/monkey,
+/turf/open/floor/mineral/titanium/white{
+ color = "#62ff57"
+ },
+/area/shuttle/escape)
+"Jc" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ name = "Medical emergency shuttle"
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"Jl" = (
+/turf/template_noop,
+/area/template_noop)
+"Jm" = (
+/obj/structure/table/glass,
+/obj/machinery/computer/records/medical/laptop{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue/half,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"JO" = (
+/obj/structure/table/optable,
+/obj/machinery/vitals_reader/directional/north,
+/obj/machinery/iv_drip,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"JP" = (
+/obj/machinery/vending/coffee,
+/obj/machinery/status_display/evac/directional/east,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"KR" = (
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/components/unary/passive_vent{
+ dir = 4
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"KV" = (
+/obj/structure/table/glass,
+/obj/item/defibrillator/loaded,
+/obj/machinery/vitals_reader/directional/south,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"LH" = (
+/obj/structure/bodycontainer/morgue/beeper_off{
+ dir = 2
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"MD" = (
+/obj/structure/chair/comfy/beige{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"MW" = (
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"Nm" = (
+/obj/machinery/door/airlock/titanium/glass{
+ name = "Cockpit"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"Nx" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"NA" = (
+/obj/machinery/computer/pandemic,
+/obj/effect/turf_decal/tile/green/half{
+ dir = 1
+ },
+/obj/item/radio/intercom/directional/north,
+/obj/machinery/camera/autoname/directional/north,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"NS" = (
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"Pu" = (
+/obj/machinery/light/small/directional/south,
+/obj/structure/bodycontainer/crematorium{
+ dir = 8;
+ id = "shuttle_crematorium"
+ },
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"Qn" = (
+/obj/structure/bed/medical/anchored,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"Rv" = (
+/obj/effect/turf_decal/tile/blue/half{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"RY" = (
+/obj/machinery/stasis{
+ dir = 4
+ },
+/obj/machinery/defibrillator_mount/directional/south,
+/obj/machinery/iv_drip,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"Up" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/item/radio/intercom/directional/south,
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"UC" = (
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"UQ" = (
+/obj/machinery/holopad{
+ pixel_x = -16;
+ pixel_y = 0
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"UW" = (
+/obj/machinery/smartfridge/chemistry/virology/preloaded,
+/obj/effect/turf_decal/tile/green/anticorner{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"Va" = (
+/obj/structure/table/glass,
+/obj/item/storage/medkit/fire{
+ pixel_x = -1;
+ pixel_y = 0
+ },
+/obj/item/storage/medkit/brute{
+ pixel_x = 1;
+ pixel_y = 5
+ },
+/obj/item/storage/medkit/o2{
+ pixel_x = 0;
+ pixel_y = 11
+ },
+/obj/item/storage/medkit/toxin{
+ pixel_x = -1;
+ pixel_y = 16
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"Vf" = (
+/obj/machinery/light/small/directional/north,
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"Xe" = (
+/obj/machinery/medical_kiosk,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"Xs" = (
+/obj/machinery/button/crematorium{
+ id = "shuttle_crematorium";
+ pixel_y = -26
+ },
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"Xx" = (
+/obj/effect/turf_decal/tile/yellow/half{
+ dir = 1
+ },
+/obj/machinery/chem_mass_spec,
+/obj/machinery/light/directional/north,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"XS" = (
+/obj/effect/turf_decal/tile/blue/anticorner{
+ dir = 4
+ },
+/obj/machinery/suit_storage_unit/standard_unit,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"XY" = (
+/obj/effect/turf_decal/tile/yellow/half{
+ dir = 8
+ },
+/obj/machinery/chem_heater/withbuffer,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"Yl" = (
+/obj/machinery/wall_healer/free/directional/west,
+/obj/effect/turf_decal/tile/blue/half{
+ dir = 8
+ },
+/obj/machinery/light/directional/west,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"YH" = (
+/turf/closed/wall/r_wall/plastitanium,
+/area/shuttle/escape)
+"YM" = (
+/obj/structure/table,
+/obj/item/storage/lockbox/loyalty{
+ pixel_x = -6;
+ pixel_y = 1
+ },
+/obj/machinery/recharger{
+ pixel_x = 0;
+ pixel_y = 7
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"Zk" = (
+/obj/effect/spawner/random/vending/snackvend,
+/obj/machinery/camera/autoname/directional/east,
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"Zq" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
+/obj/effect/turf_decal/tile/blue/half{
+ dir = 4
+ },
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"ZH" = (
+/obj/machinery/computer/crew{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue/anticorner,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+zJ
+zJ
+qf
+qf
+zJ
+zJ
+zJ
+zJ
+oi
+zJ
+Jc
+zJ
+qf
+qf
+qf
+zJ
+oi
+zJ
+oi
+zJ
+zJ
+KR
+"}
+(2,1,1) = {"
+zJ
+bl
+Cp
+gS
+Up
+zJ
+yk
+Yl
+DB
+Xe
+DB
+iq
+Qn
+hG
+Qn
+Iq
+DB
+cD
+DB
+zM
+zJ
+ls
+"}
+(3,1,1) = {"
+zJ
+qB
+sD
+sD
+sD
+kn
+xO
+wM
+wM
+wM
+wM
+wM
+wM
+wM
+wM
+wM
+wM
+wM
+uK
+ER
+km
+sU
+"}
+(4,1,1) = {"
+zJ
+YM
+Ef
+Ef
+eY
+zJ
+LH
+wM
+HO
+HO
+wM
+HO
+HO
+wM
+HO
+HO
+wM
+uK
+uK
+GU
+km
+sU
+"}
+(5,1,1) = {"
+zJ
+zJ
+qf
+qf
+zJ
+Nx
+LH
+wM
+hc
+hc
+wM
+hc
+hc
+wM
+hc
+hc
+wM
+uK
+de
+kD
+zO
+sU
+"}
+(6,1,1) = {"
+zJ
+fS
+xO
+xO
+UC
+xO
+xO
+wM
+wM
+wM
+wM
+wM
+wM
+wM
+wM
+wM
+wM
+uK
+uK
+GU
+km
+gR
+"}
+(7,1,1) = {"
+zJ
+dg
+xO
+UQ
+MW
+hI
+Gx
+tu
+tu
+Zk
+JP
+kH
+we
+tu
+In
+gI
+tu
+uQ
+Zq
+pB
+zJ
+YH
+"}
+(8,1,1) = {"
+zJ
+zJ
+qf
+Nm
+zJ
+zJ
+zJ
+xO
+Eh
+zJ
+zJ
+zJ
+zJ
+Af
+zJ
+zJ
+xN
+zJ
+zJ
+zJ
+zJ
+YH
+"}
+(9,1,1) = {"
+zJ
+IE
+DB
+DB
+xU
+zJ
+dM
+DB
+DB
+KV
+zJ
+lP
+XY
+sQ
+CG
+zJ
+Vf
+zJ
+UW
+FJ
+km
+gR
+"}
+(10,1,1) = {"
+qf
+Rv
+GT
+GT
+eR
+zJ
+mE
+wM
+wM
+RY
+zJ
+na
+wM
+wM
+eo
+zJ
+NS
+zJ
+NA
+mX
+km
+gR
+"}
+(11,1,1) = {"
+qf
+Rv
+cH
+cH
+BV
+zJ
+rQ
+wM
+wM
+AE
+zJ
+Xx
+zQ
+wM
+cZ
+df
+NS
+ro
+ht
+dt
+km
+gR
+"}
+(12,1,1) = {"
+qf
+Rv
+rb
+MD
+Jm
+zJ
+FP
+wM
+wM
+hO
+zJ
+pN
+wM
+wM
+cZ
+sz
+Xs
+zJ
+fC
+HU
+km
+gR
+"}
+(13,1,1) = {"
+zJ
+XS
+zN
+Fe
+ZH
+zJ
+JO
+ok
+Va
+vY
+zJ
+ym
+HJ
+cl
+vz
+zJ
+Pu
+zJ
+IL
+BZ
+zJ
+ce
+"}
+(14,1,1) = {"
+zJ
+zJ
+qf
+qf
+zJ
+zJ
+zJ
+qf
+qf
+zJ
+zJ
+zJ
+qf
+qf
+zJ
+zJ
+qf
+zJ
+zJ
+qf
+zJ
+Jl
+"}
diff --git a/_maps/shuttles/emergency/emergency_dep_sci.dmm b/_maps/shuttles/emergency/emergency_dep_sci.dmm
new file mode 100644
index 000000000000..62990e0d7cfb
--- /dev/null
+++ b/_maps/shuttles/emergency/emergency_dep_sci.dmm
@@ -0,0 +1,2798 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aa" = (
+/obj/machinery/recharge_station,
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"an" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aJ" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/computer/operating{
+ dir = 1
+ },
+/obj/machinery/vitals_reader/directional/south,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"aU" = (
+/mob/living/basic/slime,
+/turf/open/misc/asteroid,
+/area/shuttle/escape/xenobio)
+"bk" = (
+/obj/effect/mapping_helpers/airlock/access/all/science/general,
+/obj/machinery/door/airlock/research/glass,
+/obj/effect/turf_decal/tile/purple/fourcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"bl" = (
+/obj/machinery/bci_implanter,
+/obj/effect/turf_decal/trimline/purple/filled/line,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"bq" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/turf/open/floor/engine,
+/area/shuttle/escape/xenobio)
+"bB" = (
+/obj/effect/turf_decal/trimline/purple/filled/corner,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"bD" = (
+/obj/structure/rack,
+/obj/effect/turf_decal/bot,
+/obj/item/storage/toolbox/mechanical,
+/obj/item/toy/crayon/spraycan/roboticist,
+/obj/item/clothing/head/utility/welding,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"bT" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/components/trinary/filter,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bU" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/portable_atmospherics/pump,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"cj" = (
+/obj/structure/table,
+/obj/item/storage/medkit/fire,
+/obj/item/storage/medkit/toxin{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"cl" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/obj/machinery/light/directional/west,
+/obj/machinery/rnd/production/circuit_imprinter/department/science,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"cm" = (
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/turf_decal/tile/yellow/opposingcorners{
+ dir = 1
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"cs" = (
+/obj/machinery/door/airlock/research{
+ glass = 1;
+ name = "Slime Euthanization Chamber";
+ opacity = 0
+ },
+/obj/effect/mapping_helpers/airlock/access/all/science/xenobio,
+/obj/structure/plasticflaps/kitchen,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
+/turf/open/floor/iron/white,
+/area/shuttle/escape/xenobio)
+"cM" = (
+/obj/machinery/processor/slime/fullupgrade,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 10
+ },
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/iron/white,
+/area/shuttle/escape/xenobio)
+"cQ" = (
+/obj/structure/table/reinforced,
+/obj/item/phone,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 9
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"de" = (
+/obj/machinery/door/poddoor/incinerator_ordmix{
+ id = "shuttle_ordmix_vent"
+ },
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/engine/vacuum,
+/area/shuttle/escape)
+"dP" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/computer/pod/old/mass_driver_controller/ordnancedriver{
+ pixel_x = 28;
+ pixel_y = 0;
+ id = "shuttle_ordnance"
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"eh" = (
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/turf_decal/tile/yellow/opposingcorners{
+ dir = 1
+ },
+/obj/structure/table,
+/obj/machinery/computer/security/telescreen/entertainment/directional/east,
+/obj/effect/spawner/random/food_or_drink/donkpockets{
+ pixel_x = -3;
+ pixel_y = 6
+ },
+/obj/effect/spawner/random/food_or_drink/donkpockets{
+ pixel_x = 3;
+ pixel_y = 0
+ },
+/obj/machinery/light/directional/east,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"eo" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/medkit/regular,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"eM" = (
+/obj/machinery/component_printer,
+/obj/effect/turf_decal/trimline/purple/filled/line,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"eR" = (
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"eY" = (
+/obj/machinery/rnd/destructive_analyzer,
+/obj/effect/turf_decal/siding{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"fp" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/siding{
+ dir = 8
+ },
+/turf/open/floor/iron/dark/side,
+/area/shuttle/escape)
+"fw" = (
+/obj/effect/turf_decal/trimline/blue/filled/corner,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"fy" = (
+/turf/open/floor/iron/recharge_floor,
+/area/shuttle/escape)
+"fC" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ name = "Research emergency shuttle"
+ },
+/obj/effect/turf_decal/tile/purple/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"fS" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet/directional/north,
+/obj/machinery/computer/operating,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"gj" = (
+/obj/structure/table,
+/obj/item/storage/box/bodybags{
+ pixel_x = 5;
+ pixel_y = 12
+ },
+/obj/item/storage/medkit/regular,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 6
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"gk" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 6
+ },
+/obj/machinery/rnd/server,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"gI" = (
+/obj/machinery/gizmo/toggle/tucker_tubes,
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"gQ" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/obj/machinery/vending/modularpc,
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"gR" = (
+/obj/machinery/power/shuttle_engine/propulsion,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"gS" = (
+/obj/machinery/status_display/evac/directional/south,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"gY" = (
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/structure/closet/crate/internals,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/structure/window/spawner/directional/south,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"hc" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/structure/table,
+/obj/item/transfer_valve{
+ pixel_x = 4;
+ pixel_y = 0
+ },
+/obj/item/transfer_valve{
+ pixel_x = -5;
+ pixel_y = 0
+ },
+/obj/item/transfer_valve,
+/obj/item/assembly/signaler{
+ pixel_x = 10;
+ pixel_y = 0
+ },
+/obj/item/assembly/signaler{
+ pixel_x = 10;
+ pixel_y = 4
+ },
+/obj/item/assembly/signaler{
+ pixel_x = 10;
+ pixel_y = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"ho" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"hH" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"hI" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 1
+ },
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"hZ" = (
+/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{
+ dir = 8;
+ name = "euthanization chamber freezer"
+ },
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/structure/window/reinforced/spawner/directional/east,
+/obj/effect/turf_decal/tile/purple/fourcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape/xenobio)
+"il" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/arrows{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"im" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/fancy/donut_box,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 5
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"iq" = (
+/obj/machinery/computer/security{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"iF" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 6
+ },
+/obj/structure/tank_dispenser/oxygen,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"iM" = (
+/obj/machinery/monkey_recycler,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 6
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape/xenobio)
+"jE" = (
+/obj/effect/turf_decal/trimline/purple/filled/corner{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"jT" = (
+/obj/effect/turf_decal/trimline/purple/filled/line,
+/turf/open/floor/iron/white,
+/area/shuttle/escape/xenobio)
+"ki" = (
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/turf_decal/tile/yellow/opposingcorners{
+ dir = 1
+ },
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"km" = (
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/machinery/power/shuttle_engine/heater,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"kn" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"kD" = (
+/obj/structure/rack,
+/obj/item/storage/toolbox/mechanical{
+ pixel_y = 6;
+ pixel_x = -1
+ },
+/obj/item/storage/toolbox/emergency{
+ pixel_x = 2;
+ pixel_y = 12
+ },
+/obj/item/storage/toolbox/electrical{
+ pixel_x = 5;
+ pixel_y = 3
+ },
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"kH" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark/side{
+ dir = 1
+ },
+/area/shuttle/escape)
+"kU" = (
+/obj/machinery/portable_atmospherics/canister/plasma,
+/obj/machinery/light/floor,
+/turf/open/misc/asteroid,
+/area/shuttle/escape)
+"kW" = (
+/obj/structure/chair/office/light{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"kY" = (
+/obj/machinery/door/airlock/medical/glass{
+ name = "Escape Shuttle Infirmary"
+ },
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"lb" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"lp" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 1
+ },
+/obj/machinery/status_display/evac/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"lP" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/obj/structure/sign/nanotrasen/directional/west,
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"lX" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape/xenobio)
+"ma" = (
+/obj/effect/turf_decal/trimline/purple/filled/corner{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"mg" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 1
+ },
+/obj/machinery/portable_atmospherics/scrubber,
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"mj" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/obj/structure/sign/departments/science/directional/west,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"mA" = (
+/obj/machinery/computer/rdconsole/unlocked{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"mE" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Brig"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"mI" = (
+/turf/template_noop,
+/area/template_noop)
+"nG" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 6
+ },
+/obj/machinery/light/floor,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"nT" = (
+/obj/machinery/mecha_part_fabricator{
+ drop_direction = 8
+ },
+/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"oi" = (
+/obj/machinery/mech_bay_recharge_port{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/corners,
+/obj/structure/window/spawner/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"oj" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"op" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"ot" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron/dark/side,
+/area/shuttle/escape)
+"oG" = (
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"oU" = (
+/obj/effect/turf_decal/stripes/asteroid/line,
+/obj/machinery/portable_atmospherics/canister/plasma,
+/turf/open/misc/asteroid,
+/area/shuttle/escape)
+"oX" = (
+/obj/structure/table,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/power_store/cell/high,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"pa" = (
+/turf/closed/wall/rock,
+/area/shuttle/escape)
+"pB" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"pJ" = (
+/obj/effect/turf_decal/stripes/asteroid/line,
+/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
+/turf/open/misc/asteroid,
+/area/shuttle/escape)
+"pN" = (
+/obj/item/kirbyplants/organic/plant18,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 10
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"qf" = (
+/obj/structure/table,
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/stack/sheet/glass/fifty,
+/obj/item/wrench,
+/obj/item/clothing/glasses/welding,
+/obj/effect/turf_decal/siding{
+ dir = 9
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"qk" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 10
+ },
+/obj/structure/tank_holder/extinguisher,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"qn" = (
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/structure/closet/crate/internals,
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 5
+ },
+/obj/structure/window/spawner/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"qt" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/light/small/directional/east,
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron/large,
+/area/shuttle/escape)
+"rr" = (
+/obj/machinery/door/airlock/command/glass{
+ name = "Cockpit"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"st" = (
+/obj/effect/turf_decal/trimline/purple/filled/corner{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape/xenobio)
+"sz" = (
+/obj/structure/table,
+/obj/item/storage/medkit/brute,
+/obj/item/storage/medkit/o2{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/machinery/camera/autoname/directional/north,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/obj/machinery/light/directional/north,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"sE" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 4
+ },
+/turf/closed/wall/rock,
+/area/shuttle/escape)
+"sR" = (
+/obj/machinery/door/airlock/research/glass,
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/turf_decal/tile/yellow/opposingcorners{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/airlock/access/all/science/general,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"sW" = (
+/turf/closed/mineral/random/stationside/asteroid,
+/area/shuttle/escape/xenobio)
+"sX" = (
+/obj/effect/turf_decal/trimline/purple/filled/line,
+/obj/effect/turf_decal/arrows,
+/obj/machinery/wall_healer/free/directional/north{
+ use_power = 0
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"tw" = (
+/obj/machinery/rnd/production/circuit_imprinter,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"ty" = (
+/obj/effect/turf_decal/trimline/purple/filled/corner{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"tB" = (
+/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
+/turf/open/misc/asteroid,
+/area/shuttle/escape)
+"tE" = (
+/obj/machinery/computer/emergency_shuttle,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"ug" = (
+/turf/open/misc/asteroid,
+/area/shuttle/escape/xenobio)
+"uk" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 1
+ },
+/obj/machinery/button/door/incinerator_vent_ordmix{
+ pixel_x = 26;
+ id = "shuttle_ordmix_vent";
+ pixel_y = 5
+ },
+/obj/machinery/button/ignition/incinerator/ordmix{
+ pixel_x = 26;
+ pixel_y = -5;
+ dir = 4;
+ id = "shuttle_ordmix_igniter"
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"up" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/obj/structure/table,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/power_store/cell/high,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"us" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"vk" = (
+/obj/machinery/camera/autoname/directional/south,
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"vr" = (
+/obj/machinery/light/floor,
+/turf/open/misc/asteroid,
+/area/shuttle/escape/xenobio)
+"vv" = (
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/turf_decal/tile/yellow/opposingcorners{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/obj/item/kirbyplants/fern,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"vA" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/igniter/incinerator_ordmix{
+ id = "shuttle_ordmix_igniter"
+ },
+/turf/open/floor/engine/vacuum,
+/area/shuttle/escape)
+"vB" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape/xenobio)
+"vY" = (
+/obj/machinery/light/directional/north,
+/obj/item/robot_suit/prebuilt,
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"we" = (
+/obj/machinery/wall_healer/free/directional/south{
+ use_power = 0
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"wh" = (
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/turf_decal/tile/yellow/opposingcorners{
+ dir = 1
+ },
+/obj/machinery/door/airlock/research/glass,
+/obj/effect/mapping_helpers/airlock/access/all/science/general,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"wn" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot,
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/iron/large,
+/area/shuttle/escape)
+"wt" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 5
+ },
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron/white,
+/area/shuttle/escape/xenobio)
+"wB" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 8
+ },
+/obj/machinery/portable_atmospherics/canister,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"wI" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"wM" = (
+/obj/machinery/computer/rdconsole/unlocked,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"xp" = (
+/obj/machinery/atmospherics/components/unary/passive_vent{
+ dir = 8;
+ name = "killroom vent"
+ },
+/turf/open/floor/circuit/telecomms,
+/area/shuttle/escape/xenobio)
+"xq" = (
+/obj/machinery/rnd/production/protolathe/department/science,
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"xy" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"xF" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/components/unary/outlet_injector/monitored,
+/turf/open/floor/engine/vacuum,
+/area/shuttle/escape)
+"xN" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"xO" = (
+/obj/machinery/space_heater,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"yi" = (
+/obj/machinery/vatgrower,
+/obj/effect/turf_decal/trimline/dark_red/filled/warning{
+ dir = 9
+ },
+/obj/structure/window/reinforced/spawner/directional/west,
+/turf/open/floor/iron/dark/textured_corner,
+/area/shuttle/escape)
+"yj" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron/large,
+/area/shuttle/escape)
+"ym" = (
+/obj/structure/window/reinforced/spawner/directional/north,
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"yw" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/light/floor,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"yS" = (
+/obj/effect/turf_decal/stripes/asteroid/full,
+/obj/machinery/door/airlock/external/glass/ruin{
+ name = "Ordnance Lab"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/science/ordnance,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"yU" = (
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/turf_decal/tile/yellow/opposingcorners{
+ dir = 1
+ },
+/obj/structure/chair/stool/directional/east,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"zj" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle/indestructible,
+/turf/open/floor/engine,
+/area/shuttle/escape/xenobio)
+"zD" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding{
+ dir = 8
+ },
+/turf/open/floor/iron/dark/side{
+ dir = 1
+ },
+/area/shuttle/escape)
+"zJ" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Ah" = (
+/obj/structure/rack,
+/obj/item/tank/internals/oxygen/red,
+/obj/item/clothing/suit/utility/fire/firefighter,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/head/utility/hardhat/red,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/machinery/light/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Aj" = (
+/obj/machinery/computer/camera_advanced/xenobio,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 9
+ },
+/obj/structure/sign/xenobio_guide/directional/north,
+/turf/open/floor/iron/white,
+/area/shuttle/escape/xenobio)
+"Ak" = (
+/obj/effect/turf_decal/stripes/asteroid/line,
+/obj/machinery/portable_atmospherics/canister/nitrogen,
+/turf/open/misc/asteroid,
+/area/shuttle/escape)
+"AB" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/obj/structure/window/spawner/directional/south,
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/structure/closet/emcloset/anchored,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"AE" = (
+/obj/machinery/computer/crew{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 8
+ },
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"AH" = (
+/obj/machinery/defibrillator_mount/directional/south,
+/obj/effect/turf_decal/trimline/blue/filled/line,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"AM" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"AQ" = (
+/turf/closed/mineral/random/stationside/asteroid,
+/area/shuttle/escape)
+"Be" = (
+/obj/structure/table/reinforced,
+/obj/machinery/camera/autoname/directional/east,
+/obj/item/storage/box/handcuffs{
+ pixel_x = -4;
+ pixel_y = 14
+ },
+/obj/item/storage/box/evidence{
+ pixel_x = 4;
+ pixel_y = 7
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"BK" = (
+/obj/effect/turf_decal/trimline/purple/filled/line,
+/obj/machinery/status_display/evac/directional/south,
+/obj/machinery/light/directional/south,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"BO" = (
+/obj/machinery/light/directional/south,
+/obj/machinery/rnd/experimentor,
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"BV" = (
+/obj/machinery/stasis{
+ dir = 4
+ },
+/obj/machinery/vitals_reader/directional/south,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 10
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"BZ" = (
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Ce" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/components/binary/tank_compressor{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"CY" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/door/poddoor/massdriver_ordnance{
+ id = "shuttle_ordnance";
+ name = "Shuttle Ordnance Launcher Bay Door"
+ },
+/obj/machinery/atmos_shield_gen/active,
+/obj/machinery/atmos_shield_gen/active{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Dq" = (
+/obj/structure/table/reinforced,
+/obj/machinery/recharger,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/obj/machinery/light/directional/north,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Dy" = (
+/obj/machinery/stasis,
+/obj/machinery/vitals_reader/directional/south,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 6
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"DN" = (
+/obj/structure/table/reinforced,
+/obj/item/reagent_containers/cup/beaker{
+ pixel_x = -8;
+ pixel_y = 9
+ },
+/obj/structure/microscope{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 6
+ },
+/obj/item/petri_dish/random{
+ pixel_x = 9;
+ pixel_y = 0
+ },
+/obj/item/biopsy_tool{
+ pixel_x = 10;
+ pixel_y = 8
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"DQ" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/airalarm/directional/north,
+/obj/effect/mapping_helpers/airalarm/mixingchamber_access,
+/obj/effect/mapping_helpers/airalarm/link{
+ chamber_id = "shuttle_burnchamber"
+ },
+/obj/effect/mapping_helpers/airalarm/tlv_no_checks,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Eh" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/iron/large,
+/area/shuttle/escape)
+"Ek" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/open/floor/engine/vacuum,
+/area/shuttle/escape)
+"Er" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"EM" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 9
+ },
+/obj/item/kirbyplants/organic/plant10,
+/obj/effect/turf_decal/box/corners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"EQ" = (
+/obj/effect/turf_decal/trimline/purple/filled/line,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Fe" = (
+/obj/machinery/door/window/right/directional/north{
+ name = "Research Test Chamber";
+ req_access = list("science")
+ },
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"Fu" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/components/tank,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Fz" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/iron/large,
+/area/shuttle/escape)
+"FJ" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/iron/dark/side,
+/area/shuttle/escape)
+"FP" = (
+/obj/structure/table,
+/obj/item/reagent_containers/cup/bottle/epinephrine{
+ pixel_x = 6
+ },
+/obj/item/reagent_containers/cup/bottle/multiver{
+ pixel_x = -3
+ },
+/obj/item/reagent_containers/cup/bottle/epinephrine{
+ pixel_x = -3;
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/cup/bottle/multiver{
+ pixel_x = 6;
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/syringe/epinephrine{
+ pixel_x = 3;
+ pixel_y = -2
+ },
+/obj/item/reagent_containers/syringe/epinephrine{
+ pixel_x = 4;
+ pixel_y = 1
+ },
+/obj/item/reagent_containers/syringe/epinephrine{
+ pixel_x = -2;
+ pixel_y = 5
+ },
+/obj/item/reagent_containers/syringe/epinephrine{
+ pixel_x = 2;
+ pixel_y = 8
+ },
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 10
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"FR" = (
+/mob/living/basic/slime,
+/turf/open/floor/engine,
+/area/shuttle/escape/xenobio)
+"FZ" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/components/trinary/mixer/flipped{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Gb" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/obj/structure/extinguisher_cabinet/directional/south,
+/obj/machinery/light/directional/south,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Gh" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Gx" = (
+/obj/machinery/door/window/brigdoor/left/directional/west{
+ name = "Cytology Pen";
+ req_access = list("research")
+ },
+/obj/effect/turf_decal/trimline/dark_red/filled/warning{
+ dir = 8
+ },
+/turf/open/floor/iron/dark/textured_edge{
+ dir = 8
+ },
+/area/shuttle/escape)
+"GM" = (
+/obj/structure/chair/comfy/shuttle,
+/obj/item/radio/intercom/directional/north,
+/obj/machinery/light/directional/north,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"GT" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/large,
+/area/shuttle/escape)
+"He" = (
+/obj/machinery/computer/mech_bay_power_console,
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Hl" = (
+/obj/machinery/portable_atmospherics/canister/plasma,
+/turf/open/misc/asteroid,
+/area/shuttle/escape)
+"Ho" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 1
+ },
+/obj/machinery/light/directional/north,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Hq" = (
+/obj/machinery/portable_atmospherics/canister/nitrogen,
+/turf/open/misc/asteroid,
+/area/shuttle/escape)
+"In" = (
+/obj/machinery/recharge_station,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Ir" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/structure/closet/emcloset/anchored,
+/obj/structure/window/spawner/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"IH" = (
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/turf_decal/tile/yellow/opposingcorners{
+ dir = 1
+ },
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Jk" = (
+/obj/structure/chair/office/light{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/white,
+/area/shuttle/escape/xenobio)
+"Jm" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/window/left/directional/east{
+ name = "Research Lab Desk";
+ req_access = list("science")
+ },
+/obj/effect/turf_decal/tile/purple/fourcorners,
+/obj/structure/desk_bell{
+ pixel_x = 0;
+ pixel_y = 9
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Jn" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 1
+ },
+/obj/structure/fans/tiny/invisible,
+/obj/machinery/door/airlock/sandstone/glass{
+ name = "Ordnance Chamber"
+ },
+/obj/machinery/light/floor,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Jo" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/obj/structure/table,
+/obj/item/clipboard,
+/obj/item/toy/figure/scientist,
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Jp" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 9
+ },
+/obj/machinery/computer/atmos_control/noreconnect{
+ atmos_chambers = list("shuttle_burnchamber" = "Burn Chamber");
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"JA" = (
+/obj/machinery/atmospherics/components/unary/passive_vent{
+ dir = 4;
+ name = "killroom vent"
+ },
+/turf/open/floor/circuit/telecomms,
+/area/shuttle/escape/xenobio)
+"JP" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 10
+ },
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"JT" = (
+/obj/machinery/door/airlock/research/glass{
+ name = "Xenobiology Lab"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/science/xenobio,
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/turf_decal/tile/yellow/opposingcorners{
+ dir = 1
+ },
+/obj/structure/sign/departments/science/directional/east,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Kp" = (
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"KR" = (
+/obj/effect/turf_decal/trimline/purple/filled/corner,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"KV" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 5
+ },
+/obj/machinery/suit_storage_unit/standard_unit,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Lq" = (
+/obj/structure/closet/secure_closet/cytology,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 9
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"LH" = (
+/obj/structure/table,
+/obj/item/storage/toolbox/electrical{
+ pixel_x = -1;
+ pixel_y = 7
+ },
+/obj/item/storage/toolbox/drone{
+ pixel_x = 2;
+ pixel_y = 1
+ },
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 5
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Mx" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/mass_driver{
+ dir = 4;
+ id = "shuttle_ordnance"
+ },
+/obj/machinery/door/window/left/directional/west{
+ name = "Mass Driver Door";
+ req_access = list("ordnance")
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"MD" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/components/tank/oxygen{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"MJ" = (
+/obj/structure/table,
+/obj/item/flatpack{
+ board = /obj/item/circuitboard/machine/flatpacker
+ },
+/obj/item/multitool,
+/obj/effect/turf_decal/siding{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"MW" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 10
+ },
+/obj/item/kirbyplants/organic/plant10,
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Nk" = (
+/obj/effect/turf_decal/box/corners,
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"Nm" = (
+/obj/effect/turf_decal/trimline/purple/filled/corner{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Nt" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/arrows{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Nv" = (
+/obj/machinery/light/floor,
+/turf/open/floor/engine,
+/area/shuttle/escape/xenobio)
+"NA" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 9
+ },
+/obj/structure/closet/emcloset/anchored,
+/obj/structure/window/spawner/directional/north,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"NN" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/arrows{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"NP" = (
+/obj/structure/table,
+/obj/item/paper_bin,
+/obj/item/pen,
+/obj/effect/turf_decal/siding{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"NS" = (
+/obj/machinery/shower/directional/south{
+ name = "emergency shower"
+ },
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 9
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Og" = (
+/obj/structure/table/reinforced,
+/obj/machinery/recharger,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"Op" = (
+/obj/machinery/door/airlock/research/glass{
+ name = "Robotics Lab"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/science/robotics,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"OE" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"OL" = (
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"OM" = (
+/obj/machinery/light/directional/east,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/obj/effect/spawner/random/vending/snackvend,
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"OO" = (
+/obj/effect/spawner/surgery_tray/full,
+/obj/structure/table/optable,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Pl" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/air_sensor{
+ chamber_id = "shuttle_burnchamber"
+ },
+/obj/machinery/light/floor,
+/turf/open/floor/engine/vacuum,
+/area/shuttle/escape)
+"PJ" = (
+/turf/closed/wall/r_wall/plastitanium/nodiagonal,
+/area/shuttle/escape)
+"PK" = (
+/obj/machinery/module_duplicator,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 6
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"PX" = (
+/obj/machinery/destructive_scanner,
+/obj/effect/turf_decal/tile/purple/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Qr" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/research/anomaly_refinery,
+/obj/item/raw_anomaly_core/random,
+/obj/item/raw_anomaly_core/random,
+/obj/item/raw_anomaly_core/random,
+/obj/machinery/camera/autoname/directional/north,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Qt" = (
+/obj/structure/chair/office/light{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Qv" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/obj/effect/spawner/random/vending/colavend,
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Qy" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"QA" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/box/monkeycubes{
+ pixel_x = 10;
+ pixel_y = 4
+ },
+/obj/item/storage/box/monkeycubes{
+ pixel_x = -7;
+ pixel_y = 3
+ },
+/obj/machinery/reagentgrinder{
+ pixel_y = 5
+ },
+/obj/item/stack/sheet/mineral/plasma/five{
+ pixel_x = 0;
+ pixel_y = 0
+ },
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 5
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape/xenobio)
+"Rv" = (
+/obj/effect/spawner/random/gizmo,
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"RK" = (
+/obj/structure/table/optable,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 5
+ },
+/obj/machinery/vitals_reader/directional/north,
+/obj/effect/spawner/surgery_tray/full,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"RY" = (
+/obj/structure/table,
+/obj/item/multitool/circuit{
+ pixel_x = 7
+ },
+/obj/item/multitool/circuit,
+/obj/item/multitool/circuit{
+ pixel_x = -8
+ },
+/obj/item/controller,
+/obj/item/compact_remote,
+/obj/item/compact_remote,
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Th" = (
+/obj/structure/table,
+/obj/item/stack/sheet/plasteel{
+ amount = 10;
+ pixel_x = -6;
+ pixel_y = 9
+ },
+/obj/item/stack/sheet/iron/fifty{
+ pixel_x = -8;
+ pixel_y = 7
+ },
+/obj/item/stack/sheet/glass/fifty{
+ pixel_x = -10;
+ pixel_y = 5
+ },
+/obj/item/storage/belt/utility/full,
+/obj/item/assembly/flash/handheld,
+/obj/item/assembly/flash/handheld,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Tm" = (
+/obj/item/radio/intercom/directional/south,
+/obj/machinery/recharge_station,
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/corners,
+/obj/structure/window/spawner/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"TL" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/large,
+/area/shuttle/escape)
+"TQ" = (
+/obj/structure/chair/office/light{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"TU" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Chamber Output"
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Ue" = (
+/turf/open/floor/engine,
+/area/shuttle/escape/xenobio)
+"Ul" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/obj/structure/closet/emcloset/anchored,
+/obj/structure/window/spawner/directional/south,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Vt" = (
+/obj/effect/turf_decal/trimline/dark_red/filled/warning{
+ dir = 10
+ },
+/obj/structure/window/reinforced/spawner/directional/west,
+/turf/open/floor/iron/dark/textured_corner{
+ dir = 4
+ },
+/area/shuttle/escape)
+"Vy" = (
+/obj/machinery/computer/communications,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"VI" = (
+/obj/machinery/camera/autoname/directional/south,
+/turf/open/floor/engine,
+/area/shuttle/escape/xenobio)
+"VU" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/obj/structure/chair/office/light{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"We" = (
+/obj/effect/turf_decal/trimline/blue/filled/corner{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Wh" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/structure/tank_dispenser,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Wi" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Wm" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/large,
+/area/shuttle/escape)
+"Xe" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/effect/turf_decal/tile/purple/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Xj" = (
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"XE" = (
+/obj/structure/closet/crate{
+ name = "emergency supplies crate"
+ },
+/obj/item/storage/toolbox/emergency,
+/obj/item/storage/toolbox/emergency,
+/obj/item/flashlight/flare{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/flashlight/flare{
+ pixel_x = -6;
+ pixel_y = -2
+ },
+/obj/item/crowbar,
+/obj/item/wrench,
+/obj/item/radio,
+/obj/machinery/camera/autoname/directional/east,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"XJ" = (
+/obj/machinery/vending/cytopro,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 5
+ },
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"XX" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Ys" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"YH" = (
+/turf/closed/wall/r_wall/plastitanium,
+/area/shuttle/escape)
+"YM" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"YS" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 10
+ },
+/obj/item/kirbyplants/organic/plant10,
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Ze" = (
+/obj/effect/turf_decal/trimline/purple/filled/line,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Zf" = (
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Zj" = (
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/turf_decal/tile/yellow/opposingcorners{
+ dir = 1
+ },
+/obj/structure/table,
+/obj/machinery/microwave,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Zk" = (
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"ZP" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
+/obj/machinery/light/floor,
+/turf/open/floor/circuit/telecomms,
+/area/shuttle/escape/xenobio)
+
+(1,1,1) = {"
+mI
+mI
+mI
+mI
+kn
+kn
+xN
+xN
+kn
+Xe
+kn
+fC
+xN
+xN
+mI
+xN
+xN
+Xe
+kn
+Xe
+kn
+xN
+xN
+kn
+kn
+mI
+mI
+"}
+(2,1,1) = {"
+kn
+xN
+xN
+xN
+kn
+EM
+GT
+GT
+Eh
+Qy
+lP
+Qy
+MW
+xN
+kn
+xN
+EM
+Qy
+lP
+Qy
+GT
+GT
+GT
+YS
+kn
+PJ
+YH
+"}
+(3,1,1) = {"
+kn
+cQ
+AE
+pN
+kn
+lp
+Kp
+Kp
+Kp
+Kp
+Kp
+Kp
+ty
+Qy
+mj
+Qy
+Nm
+Kp
+Kp
+Kp
+Kp
+Kp
+Kp
+EQ
+xN
+km
+gR
+"}
+(4,1,1) = {"
+kn
+Dq
+kW
+YM
+rr
+op
+qt
+TL
+Fz
+Kp
+TL
+TL
+TL
+KR
+il
+jE
+wn
+TL
+TL
+Kp
+TL
+TL
+TL
+EQ
+xN
+km
+gR
+"}
+(5,1,1) = {"
+xN
+wM
+BZ
+YM
+xN
+op
+kn
+xN
+kn
+Kp
+kn
+xN
+kn
+sX
+PX
+NN
+kn
+xN
+kn
+we
+kn
+xN
+kn
+BK
+kn
+YH
+YH
+"}
+(6,1,1) = {"
+xN
+tE
+TQ
+YM
+rr
+op
+Wm
+GT
+GT
+Kp
+Eh
+GT
+GT
+ty
+Nt
+Nm
+Wm
+GT
+yj
+Kp
+GT
+GT
+Eh
+EQ
+xN
+km
+gR
+"}
+(7,1,1) = {"
+xN
+Vy
+BZ
+YM
+kn
+hI
+Kp
+Kp
+Kp
+Kp
+Kp
+Kp
+Kp
+Kp
+Kp
+Kp
+Kp
+Kp
+Kp
+Kp
+Kp
+Kp
+Kp
+EQ
+xN
+km
+gR
+"}
+(8,1,1) = {"
+kn
+eo
+Qt
+Gb
+kn
+qn
+gY
+Gh
+ho
+OM
+Qv
+gQ
+ho
+ho
+Ah
+kD
+XE
+xO
+ho
+ho
+Ir
+AB
+ho
+In
+kn
+YH
+YH
+"}
+(9,1,1) = {"
+kn
+im
+iq
+gk
+kn
+kn
+xN
+Jm
+xN
+kn
+xN
+xN
+bk
+kn
+kn
+kn
+kn
+kn
+xN
+mE
+kn
+xN
+kY
+xN
+kn
+km
+gR
+"}
+(10,1,1) = {"
+kn
+kn
+kn
+kn
+kn
+NA
+Ul
+VU
+up
+Jo
+wI
+wI
+pB
+pB
+qk
+ym
+Rv
+kn
+oG
+Zk
+kn
+NS
+oj
+FP
+kn
+km
+gR
+"}
+(11,1,1) = {"
+kn
+oX
+cl
+aJ
+kn
+Ho
+bB
+zJ
+zJ
+zJ
+zJ
+zJ
+ma
+eR
+Ze
+Fe
+Xj
+kn
+oG
+Zk
+kn
+cj
+fw
+Dy
+kn
+km
+gR
+"}
+(12,1,1) = {"
+kn
+Th
+Kp
+OO
+xN
+OE
+Ze
+qf
+fp
+mA
+eY
+zD
+gI
+eR
+bl
+ym
+BO
+kn
+GM
+gS
+kn
+sz
+AH
+kn
+kn
+YH
+YH
+"}
+(13,1,1) = {"
+xN
+He
+Kp
+Kp
+Op
+OE
+Ze
+NP
+FJ
+BZ
+BZ
+kH
+RY
+eR
+eM
+ym
+Nk
+kn
+oG
+Zk
+kn
+fS
+We
+BV
+kn
+km
+gR
+"}
+(14,1,1) = {"
+xN
+fy
+Kp
+aa
+xN
+KV
+iF
+MJ
+ot
+xq
+tw
+kH
+LH
+zJ
+PK
+ym
+OL
+kn
+Og
+Be
+kn
+RK
+Er
+gj
+kn
+km
+gR
+"}
+(15,1,1) = {"
+xN
+oi
+Kp
+Tm
+kn
+kn
+kn
+kn
+kn
+kn
+xN
+xN
+kn
+sR
+kn
+kn
+kn
+kn
+kn
+kn
+kn
+kn
+kn
+kn
+kn
+YH
+YH
+"}
+(16,1,1) = {"
+kn
+vY
+Kp
+vk
+kn
+Lq
+xy
+JP
+wh
+cm
+cm
+cm
+ki
+IH
+kn
+Aj
+Jk
+cM
+hZ
+JA
+zj
+Ue
+FR
+Ue
+kn
+km
+gR
+"}
+(17,1,1) = {"
+kn
+nT
+bD
+nT
+kn
+XJ
+zJ
+DN
+xN
+yU
+yU
+cm
+cm
+cm
+JT
+wt
+st
+jT
+cs
+ZP
+zj
+Ue
+Nv
+VI
+kn
+km
+gR
+"}
+(18,1,1) = {"
+kn
+xN
+xN
+xN
+kn
+yi
+Gx
+Vt
+xN
+Zj
+eh
+vv
+cm
+AM
+kn
+lX
+QA
+iM
+bq
+xp
+zj
+Ue
+Ue
+Ue
+kn
+PJ
+YH
+"}
+(19,1,1) = {"
+mI
+mI
+mI
+mI
+kn
+kn
+AQ
+AQ
+AQ
+kn
+kn
+kn
+yS
+AM
+AQ
+AQ
+AQ
+zj
+vB
+zj
+vB
+zj
+zj
+zj
+kn
+mI
+mI
+"}
+(20,1,1) = {"
+mI
+mI
+mI
+mI
+mI
+AQ
+AQ
+Hq
+Ak
+us
+Wi
+bU
+Zf
+Fu
+Fu
+AQ
+AQ
+ug
+vr
+ug
+sW
+ug
+vr
+ug
+AQ
+mI
+mI
+"}
+(21,1,1) = {"
+mI
+mI
+mI
+mI
+AQ
+AQ
+AQ
+tB
+pJ
+nG
+XX
+Zf
+yw
+Fu
+MD
+AQ
+AQ
+ug
+ug
+ug
+sW
+ug
+aU
+ug
+AQ
+AQ
+mI
+"}
+(22,1,1) = {"
+mI
+mI
+mI
+mI
+AQ
+AQ
+kU
+Hl
+oU
+TU
+wB
+Zf
+Zf
+Ys
+FZ
+AQ
+AQ
+AQ
+AQ
+AQ
+AQ
+AQ
+AQ
+AQ
+AQ
+AQ
+mI
+"}
+(23,1,1) = {"
+mI
+mI
+mI
+mI
+AQ
+AQ
+AQ
+pa
+pa
+sE
+pa
+pa
+DQ
+Zf
+hH
+yw
+Zf
+dP
+Zf
+yw
+Zf
+lb
+Zf
+yw
+Wh
+AQ
+mI
+"}
+(24,1,1) = {"
+mI
+mI
+mI
+mI
+mI
+AQ
+AQ
+Pl
+vA
+Ek
+xF
+Jn
+uk
+mg
+Jp
+pa
+Mx
+pa
+Qr
+hc
+Ys
+bT
+Ce
+an
+AQ
+AQ
+mI
+"}
+(25,1,1) = {"
+mI
+mI
+mI
+mI
+mI
+mI
+AQ
+de
+de
+de
+de
+pa
+pa
+pa
+pa
+pa
+CY
+pa
+AQ
+AQ
+AQ
+AQ
+AQ
+AQ
+AQ
+mI
+mI
+"}
diff --git a/_maps/shuttles/emergency/emergency_dep_sec.dmm b/_maps/shuttles/emergency/emergency_dep_sec.dmm
new file mode 100644
index 000000000000..88f1e4303095
--- /dev/null
+++ b/_maps/shuttles/emergency/emergency_dep_sec.dmm
@@ -0,0 +1,2213 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aj" = (
+/obj/structure/chair/sofa/left/brown{
+ dir = 4
+ },
+/turf/open/floor/iron/grimy,
+/area/shuttle/escape)
+"au" = (
+/turf/open/floor/iron/grimy,
+/area/shuttle/escape)
+"aI" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/obj/machinery/camera/autoname/directional/east,
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/machinery/light/directional/east,
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"aN" = (
+/obj/item/clothing/suit/jacket/straight_jacket,
+/obj/item/clothing/suit/jacket/straight_jacket,
+/obj/item/clothing/suit/jacket/straight_jacket,
+/obj/structure/closet/secure_closet{
+ req_access = list("psychology");
+ name = "pacification locker"
+ },
+/obj/item/storage/pill_bottle/happy,
+/turf/open/floor/iron/grimy,
+/area/shuttle/escape)
+"bl" = (
+/obj/structure/table/reinforced,
+/obj/item/inspector{
+ pixel_x = -7;
+ pixel_y = 9
+ },
+/obj/item/inspector{
+ pixel_x = 5;
+ pixel_y = 2
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"bq" = (
+/obj/effect/turf_decal/trimline/red/filled/line,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"bx" = (
+/obj/machinery/shower/directional/west,
+/turf/open/floor/iron/freezer,
+/area/shuttle/escape)
+"bL" = (
+/obj/effect/turf_decal/trimline/red/filled/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"cj" = (
+/obj/structure/table/reinforced,
+/obj/item/clothing/glasses/hud/security/sunglasses{
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"cl" = (
+/obj/structure/chair/office{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"cD" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/item/radio/intercom/prison/directional/east,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape/brig)
+"cH" = (
+/obj/machinery/computer/security{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape)
+"cP" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/machinery/camera/autoname/directional/north,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"cX" = (
+/obj/structure/chair/stool/directional/east,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"cZ" = (
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/structure/closet/crate/internals,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 9
+ },
+/obj/item/radio/intercom/directional/south,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"de" = (
+/obj/structure/table,
+/obj/structure/bedsheetbin,
+/obj/effect/turf_decal/tile/blue/opposingcorners{
+ dir = 1
+ },
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"df" = (
+/obj/machinery/vending/sustenance{
+ scan_id = 0
+ },
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 5
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"dl" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Prison Cafeteria"
+ },
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"do" = (
+/obj/structure/table,
+/obj/item/storage/bag/tray/cafeteria,
+/obj/item/kitchen/fork/plastic{
+ pixel_x = 8;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"dt" = (
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"du" = (
+/obj/structure/closet/crate/trashcart/laundry,
+/obj/effect/spawner/random/contraband/prison,
+/obj/item/clothing/under/rank/prisoner,
+/obj/item/clothing/under/rank/prisoner,
+/obj/item/clothing/under/rank/prisoner/skirt,
+/obj/item/clothing/under/rank/prisoner/skirt,
+/obj/effect/turf_decal/tile/blue/opposingcorners{
+ dir = 1
+ },
+/obj/structure/window/spawner/directional/south,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"dA" = (
+/obj/effect/turf_decal/tile/blue/opposingcorners{
+ dir = 1
+ },
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"dM" = (
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"dO" = (
+/obj/structure/table,
+/obj/item/storage/bag/tray/cafeteria,
+/obj/item/kitchen/fork/plastic{
+ pixel_x = -8;
+ pixel_y = 0
+ },
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"eo" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 9
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"ep" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/medkit/fire,
+/obj/item/storage/medkit/brute{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/item/storage/medkit/toxin{
+ pixel_x = 8;
+ pixel_y = 8
+ },
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 5
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"eR" = (
+/obj/machinery/power/shuttle_engine/heater{
+ dir = 1
+ },
+/obj/structure/window/reinforced/spawner/directional/south,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"eY" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"fa" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 1
+ },
+/obj/machinery/status_display/evac/directional/north,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape/brig)
+"fv" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 5
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"fA" = (
+/obj/effect/turf_decal/siding/dark,
+/obj/effect/turf_decal/trimline/red/filled/line,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"fC" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"fS" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"gI" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"gO" = (
+/obj/machinery/door/airlock{
+ name = "Prison Showers"
+ },
+/turf/open/floor/iron/freezer,
+/area/shuttle/escape)
+"gR" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"gS" = (
+/obj/structure/closet/secure_closet/brig{
+ id = "Shuttle Cell 1";
+ name = "Cell 1 locker"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 6
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"ha" = (
+/obj/structure/chair/stool/directional/south,
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"hc" = (
+/obj/structure/chair/stool/directional/west,
+/obj/structure/window/spawner/directional/east,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"hj" = (
+/obj/structure/table,
+/obj/effect/spawner/random/entertainment/gambling,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"ht" = (
+/obj/structure/punching_bag,
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"hG" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"hI" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/escape)
+"hO" = (
+/obj/machinery/door/window/brigdoor/security/holding/right/directional/east,
+/obj/effect/turf_decal/stripes/end{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/red/end{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"io" = (
+/obj/structure/table,
+/obj/effect/spawner/random/entertainment/musical_instrument{
+ pixel_x = 0;
+ pixel_y = 11
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"iq" = (
+/obj/effect/turf_decal/stripes/white/line,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"iG" = (
+/obj/structure/detectiveboard/directional/north,
+/obj/item/radio/intercom/directional/west,
+/obj/machinery/light/directional/north,
+/turf/open/floor/carpet,
+/area/shuttle/escape)
+"jl" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/escape)
+"jn" = (
+/obj/machinery/camera/directional/east{
+ c_tag = "Interrogation room";
+ network = list("ss13", "interrogation")
+ },
+/obj/structure/table,
+/obj/item/flashlight/lamp{
+ pixel_x = -6;
+ pixel_y = 5
+ },
+/obj/item/taperecorder{
+ pixel_x = 8;
+ pixel_y = 0
+ },
+/turf/open/floor/mineral/plastitanium/pod/dark,
+/area/shuttle/escape/brig)
+"jH" = (
+/obj/machinery/light/directional/west,
+/turf/open/floor/mineral/plastitanium/pod/dark,
+/area/shuttle/escape/brig)
+"km" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/box/handcuffs{
+ pixel_x = -1;
+ pixel_y = 6
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"kn" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"kD" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"kH" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"kQ" = (
+/turf/open/floor/iron/freezer,
+/area/shuttle/escape)
+"kY" = (
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/machinery/status_display/ai/directional/north,
+/obj/item/storage/medkit/regular,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape)
+"ls" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"lu" = (
+/obj/structure/closet/crate,
+/obj/item/reagent_containers/cup/bowl,
+/obj/effect/spawner/random/contraband/prison,
+/obj/item/reagent_containers/cup/bowl,
+/obj/item/reagent_containers/cup/bowl,
+/obj/item/reagent_containers/cup/bowl,
+/obj/item/reagent_containers/cup/bowl,
+/obj/item/reagent_containers/cup/bowl,
+/obj/item/reagent_containers/cup/bowl,
+/obj/item/reagent_containers/cup/bowl,
+/obj/item/kitchen/fork/plastic,
+/obj/item/kitchen/fork/plastic,
+/obj/item/kitchen/fork/plastic,
+/obj/item/storage/box/drinkingglasses,
+/obj/item/kitchen/spoon/plastic,
+/obj/item/kitchen/spoon/plastic,
+/obj/item/kitchen/spoon/plastic,
+/obj/item/knife/plastic,
+/obj/item/knife/plastic,
+/obj/item/knife/plastic,
+/obj/item/storage/bag/tray/cafeteria,
+/obj/item/storage/bag/tray/cafeteria,
+/obj/item/storage/bag/tray/cafeteria,
+/obj/item/storage/bag/tray/cafeteria,
+/obj/item/storage/box/drinkingglasses,
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"lA" = (
+/obj/structure/hoop{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"lP" = (
+/obj/structure/table,
+/obj/effect/spawner/random/entertainment/deck,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"lQ" = (
+/obj/machinery/status_display/door_timer{
+ id = "Shuttle Cell 1";
+ name = "Cell 1";
+ pixel_x = 32;
+ pixel_y = 0;
+ use_power = 0
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/red/corner{
+ dir = 1
+ },
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"lY" = (
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/iron/grimy,
+/area/shuttle/escape)
+"mn" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape/brig)
+"mq" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/medkit/regular,
+/obj/item/storage/medkit/o2{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 4
+ },
+/obj/machinery/light/directional/east,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"mE" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 10
+ },
+/obj/item/kirbyplants/organic/plant22,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"mR" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/red/corner{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"nv" = (
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape/brig)
+"nY" = (
+/obj/structure/hoop{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"oe" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Brig"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/command/general,
+/obj/effect/mapping_helpers/airlock/access/any/security/general,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"oi" = (
+/turf/open/floor/carpet,
+/area/shuttle/escape)
+"ok" = (
+/obj/machinery/door/airlock/medical/glass{
+ name = "Escape Shuttle Infirmary"
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"oD" = (
+/obj/machinery/door/airlock/security{
+ name = "Interrogation"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/turf/open/floor/mineral/plastitanium/pod/dark,
+/area/shuttle/escape)
+"oU" = (
+/obj/machinery/power/shuttle_engine/propulsion{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"oX" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 1
+ },
+/obj/structure/chair,
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/obj/machinery/light/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"oZ" = (
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/item/phone,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape)
+"ps" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 1
+ },
+/obj/machinery/camera/autoname/directional/north,
+/obj/machinery/light/directional/north,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"pB" = (
+/obj/effect/turf_decal/stripes/end{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/red/end{
+ dir = 8
+ },
+/obj/machinery/recharge_station,
+/obj/structure/extinguisher_cabinet/directional/west,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"pI" = (
+/obj/machinery/door/window/brigdoor/security/cell/left/directional/north{
+ id = "Shuttle Cell 2";
+ name = "Cell 2"
+ },
+/obj/effect/turf_decal/stripes/end{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/red/end{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"pN" = (
+/obj/machinery/computer/crew{
+ dir = 4
+ },
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape)
+"qf" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"qx" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 1
+ },
+/obj/structure/chair,
+/turf/open/floor/mineral/plastitanium/pod/dark,
+/area/shuttle/escape/brig)
+"qB" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Emergency Shuttle Brig"
+ },
+/obj/effect/mapping_helpers/airlock/unres/delayed{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/airlock/access/any/command/general,
+/obj/effect/mapping_helpers/airlock/access/any/security/general,
+/obj/docking_port/mobile/emergency{
+ name = "Security emergency shuttle"
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"qQ" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 1
+ },
+/obj/machinery/flasher/directional/north{
+ id = "shuttle_brig_entrance"
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"ro" = (
+/obj/machinery/computer/emergency_shuttle,
+/obj/item/radio/intercom/directional/north,
+/obj/machinery/light/directional/north,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape)
+"so" = (
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/freezer,
+/area/shuttle/escape)
+"ss" = (
+/obj/machinery/stasis{
+ dir = 4
+ },
+/obj/machinery/defibrillator_mount/loaded{
+ pixel_x = 0;
+ pixel_y = -28
+ },
+/obj/machinery/vitals_reader/directional/west,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 10
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"sz" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 1
+ },
+/obj/structure/chair,
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"sA" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"sD" = (
+/obj/effect/turf_decal/stripes/end{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/red/end{
+ dir = 1
+ },
+/obj/machinery/door/window/brigdoor/security/cell/right/directional/north{
+ id = "Shuttle Cell 1";
+ name = "Cell 1"
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"sQ" = (
+/obj/structure/chair/office{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"sV" = (
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/decal/cleanable/food/flour,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"sW" = (
+/obj/structure/window/spawner/directional/south,
+/obj/effect/turf_decal/siding/dark,
+/obj/structure/chair/stool/directional/south,
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"tF" = (
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/item/folder/red,
+/obj/item/restraints/handcuffs,
+/obj/item/assembly/flash/handheld,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape)
+"ua" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/red/line,
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"ut" = (
+/obj/effect/turf_decal/trimline/blue/filled/corner{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"uK" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/red/line,
+/obj/machinery/status_display/ai/directional/south,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"uV" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"vg" = (
+/obj/structure/chair/stool/directional/west,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"vs" = (
+/obj/structure/window/spawner/directional/south,
+/obj/effect/turf_decal/siding/dark,
+/obj/structure/chair/stool/directional/south,
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"vz" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/red/line,
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"vC" = (
+/obj/structure/closet/crate,
+/obj/item/food/breadslice/plain,
+/obj/item/food/breadslice/plain,
+/obj/item/food/breadslice/plain,
+/obj/item/food/grown/potato,
+/obj/item/food/grown/potato,
+/obj/item/food/grown/onion,
+/obj/item/food/grown/onion,
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"vL" = (
+/obj/machinery/computer/security/wooden_tv{
+ pixel_x = 0;
+ pixel_y = 18;
+ density = 0
+ },
+/obj/structure/chair/office{
+ dir = 1
+ },
+/turf/open/floor/carpet,
+/area/shuttle/escape)
+"vT" = (
+/obj/machinery/washing_machine,
+/obj/effect/turf_decal/tile/blue/opposingcorners{
+ dir = 1
+ },
+/obj/structure/window/spawner/directional/south,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"we" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/pod/dark,
+/area/shuttle/escape/brig)
+"wM" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"xN" = (
+/obj/structure/table/optable,
+/obj/effect/spawner/surgery_tray/full,
+/obj/machinery/vitals_reader/directional/east,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"xO" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"xY" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/fancy/egg_box,
+/obj/item/reagent_containers/condiment/flour{
+ pixel_x = -3;
+ pixel_y = 7
+ },
+/obj/item/reagent_containers/condiment/rice{
+ pixel_x = 1;
+ pixel_y = 3
+ },
+/obj/item/reagent_containers/condiment/sugar{
+ pixel_x = 6;
+ pixel_y = -1
+ },
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"xZ" = (
+/obj/machinery/door/airlock/security{
+ name = "Detective's Office"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/security/detective,
+/turf/open/floor/iron/grimy,
+/area/shuttle/escape)
+"yk" = (
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"ym" = (
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/machinery/recharger,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape)
+"zc" = (
+/obj/machinery/computer/libraryconsole/bookmanagement{
+ dir = 8
+ },
+/obj/structure/table,
+/obj/effect/turf_decal/tile/red/fourcorners,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"zr" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 8
+ },
+/obj/structure/sign/nanotrasen/directional/west,
+/obj/machinery/light/directional/west,
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"zJ" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"zZ" = (
+/obj/structure/bed,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 1
+ },
+/obj/item/radio/intercom/prison/directional/east,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape/brig)
+"AE" = (
+/obj/effect/turf_decal/stripes/corner,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/red/corner,
+/obj/effect/turf_decal/stripes/red/corner{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"AR" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 10
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Bc" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 9
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/machinery/computer/security/telescreen/interrogation/directional/south,
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"BV" = (
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"BZ" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"CD" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/structure/closet/crate/bin,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"CO" = (
+/obj/machinery/stasis{
+ dir = 4
+ },
+/obj/machinery/defibrillator_mount/loaded{
+ pixel_x = 0;
+ pixel_y = 28
+ },
+/obj/machinery/vitals_reader/directional/west,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 9
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"DB" = (
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"DL" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Brig"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/command/general,
+/obj/effect/mapping_helpers/airlock/access/any/security/general,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"DO" = (
+/obj/structure/bed{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 1
+ },
+/obj/item/radio/intercom/prison/directional/west,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape/brig)
+"DV" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 4
+ },
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"Ef" = (
+/obj/structure/bookcase/random,
+/obj/effect/turf_decal/tile/red/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Er" = (
+/obj/item/kirbyplants/random,
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/sign/departments/psychology/directional/south,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Et" = (
+/obj/effect/turf_decal/trimline/red/filled/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"ER" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 9
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"Fe" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/box/flashes{
+ pixel_x = -3;
+ pixel_y = -4
+ },
+/obj/machinery/recharger{
+ pixel_x = 0;
+ pixel_y = 6
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"Fo" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/white/line,
+/obj/machinery/camera/autoname/directional/south,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape/brig)
+"FJ" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Brig"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"FL" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 6
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"FP" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/red/line,
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"Gd" = (
+/obj/structure/table/wood,
+/obj/item/camera/detective{
+ pixel_x = -5;
+ pixel_y = 5
+ },
+/obj/item/flashlight/lamp/green{
+ pixel_x = 7;
+ pixel_y = 5
+ },
+/turf/open/floor/carpet,
+/area/shuttle/escape)
+"Gr" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Gx" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 6
+ },
+/obj/item/kirbyplants/organic/plant22,
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"Gz" = (
+/obj/structure/filingcabinet,
+/turf/open/floor/iron/grimy,
+/area/shuttle/escape)
+"GO" = (
+/obj/structure/rack,
+/obj/item/clothing/suit/utility/fire/firefighter,
+/obj/item/tank/internals/oxygen/red,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/head/utility/hardhat/red,
+/obj/effect/turf_decal/stripes/end{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/red/end{
+ dir = 4
+ },
+/obj/machinery/light/small/directional/east,
+/obj/machinery/button/flasher{
+ pixel_x = 0;
+ pixel_y = -26;
+ id = "shuttle_brig_entrance"
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"GT" = (
+/obj/structure/chair/office{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"Hf" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 5
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"HD" = (
+/obj/effect/turf_decal/stripes/white/line,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape/brig)
+"HJ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/structure/chair/comfy/beige{
+ dir = 8
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"HL" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 1
+ },
+/obj/machinery/camera/autoname/directional/west,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape/brig)
+"HO" = (
+/obj/structure/closet/secure_closet/brig{
+ id = "Shuttle Cell 2";
+ name = "Cell 2 locker"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 10
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"In" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 4
+ },
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Io" = (
+/obj/structure/table/reinforced,
+/obj/structure/reagent_dispensers/servingdish,
+/obj/structure/reagent_dispensers/servingdish,
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/machinery/light/directional/east,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"IE" = (
+/obj/structure/weightmachine,
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 5
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"IK" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/obj/machinery/suit_storage_unit/security,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"IL" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Emergency Shuttle Airlock"
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"IV" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"Jh" = (
+/obj/structure/table,
+/obj/effect/spawner/random/entertainment/cigarette_pack{
+ pixel_x = -4;
+ pixel_y = -2
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Jl" = (
+/turf/template_noop,
+/area/template_noop)
+"Jm" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 5
+ },
+/obj/structure/tank_dispenser/oxygen{
+ pixel_x = -1;
+ pixel_y = 2
+ },
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"JP" = (
+/obj/structure/table/wood,
+/obj/machinery/computer/records/medical/laptop{
+ dir = 1
+ },
+/obj/machinery/button/curtain{
+ pixel_x = 0;
+ pixel_y = -26;
+ id = "shuttle_curtains";
+ name = "psychology curtains button"
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"Kz" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 5
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"KR" = (
+/obj/machinery/computer/communications,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape)
+"KV" = (
+/obj/machinery/washing_machine,
+/obj/effect/turf_decal/tile/blue/opposingcorners{
+ dir = 1
+ },
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"Lj" = (
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/machinery/status_display/evac/directional/north,
+/obj/item/storage/fancy/donut_box,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape)
+"LH" = (
+/obj/effect/turf_decal/stripes/white/line,
+/turf/open/floor/mineral/plastitanium/pod/dark,
+/area/shuttle/escape/brig)
+"Mr" = (
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/iron/grimy,
+/area/shuttle/escape)
+"MD" = (
+/obj/structure/chair/stool/directional/east,
+/obj/structure/window/spawner/directional/west,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"MW" = (
+/obj/machinery/door/airlock/command/glass{
+ name = "Cockpit"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"Nm" = (
+/obj/structure/extinguisher_cabinet/directional/south,
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"Ny" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 6
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"NA" = (
+/turf/open/floor/mineral/plastitanium/pod/light,
+/area/shuttle/escape)
+"NB" = (
+/obj/structure/sink/directional/west,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/iron/freezer,
+/area/shuttle/escape)
+"NF" = (
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/power_store/cell/high,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape)
+"NS" = (
+/obj/machinery/door/airlock/medical{
+ name = "Psychology"
+ },
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/mapping_helpers/airlock/access/all/medical/psychology,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"OD" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/obj/structure/curtain/cloth/fancy/mechanical{
+ name = "Psychology Curtains";
+ id = "shuttle_curtains"
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Pe" = (
+/obj/structure/curtain,
+/obj/effect/spawner/random/trash/soap{
+ spawn_scatter_radius = 1
+ },
+/turf/open/floor/iron/freezer,
+/area/shuttle/escape)
+"Pu" = (
+/obj/effect/turf_decal/stripes/white/line,
+/obj/structure/chair{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/pod/dark,
+/area/shuttle/escape/brig)
+"PB" = (
+/obj/item/toy/basketball,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Qn" = (
+/obj/structure/window/spawner/directional/south,
+/obj/effect/turf_decal/siding/dark,
+/obj/structure/chair/stool/directional/south,
+/obj/effect/turf_decal/trimline/red/filled/line,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Rv" = (
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Rw" = (
+/obj/structure/chair/stool/directional/south,
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 4
+ },
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"RY" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Sx" = (
+/obj/effect/turf_decal/trimline/red/filled/line,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/obj/machinery/camera/autoname/directional/south,
+/obj/machinery/light/directional/south,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"SA" = (
+/obj/effect/turf_decal/stripes/white/line,
+/obj/machinery/light/directional/south,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"SV" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/red/line,
+/obj/machinery/status_display/evac/directional/south,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"Um" = (
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/structure/sink/kitchen/directional/north,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Up" = (
+/obj/machinery/computer/station_alert,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape)
+"UW" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/red/line,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"Vf" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"VL" = (
+/obj/effect/turf_decal/trimline/red/filled/corner,
+/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Wn" = (
+/obj/structure/chair/sofa/right/brown{
+ dir = 4
+ },
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/grimy,
+/area/shuttle/escape)
+"Xe" = (
+/obj/structure/closet{
+ name = "evidence closet 2"
+ },
+/obj/effect/turf_decal/stripes/white/line,
+/obj/machinery/door/window/brigdoor/right/directional/north{
+ name = "Evidence Storage";
+ req_access = list("security")
+ },
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape)
+"Xs" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Xt" = (
+/obj/machinery/computer/operating{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 10
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"XS" = (
+/obj/structure/reagent_dispensers/water_cooler,
+/turf/open/floor/iron/grimy,
+/area/shuttle/escape)
+"XY" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/lockbox/loyalty{
+ pixel_x = -4;
+ pixel_y = -2
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"YA" = (
+/obj/structure/closet{
+ name = "evidence closet 1"
+ },
+/obj/effect/turf_decal/stripes/white/line,
+/obj/machinery/door/window/brigdoor/left/directional/north{
+ name = "Evidence Storage";
+ req_access = list("security")
+ },
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape)
+"YH" = (
+/obj/effect/mapping_helpers/airlock/unres/delayed{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/airlock/access/any/command/general,
+/obj/effect/mapping_helpers/airlock/access/any/security/general,
+/obj/machinery/door/airlock/shuttle{
+ name = "Emergency Shuttle Brig"
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"YM" = (
+/obj/machinery/status_display/door_timer{
+ id = "Shuttle Cell 2";
+ name = "Cell 1";
+ pixel_x = -32;
+ pixel_y = 0;
+ use_power = 0
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/red/corner{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape)
+"Zg" = (
+/obj/structure/table/reinforced,
+/obj/machinery/microwave,
+/obj/effect/turf_decal/tile/red/opposingcorners,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+"Zk" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/box/evidence{
+ pixel_x = 9;
+ pixel_y = 14
+ },
+/obj/machinery/recharger,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"Zo" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 1
+ },
+/obj/machinery/camera/autoname/directional/east,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/mineral/plastitanium/pod,
+/area/shuttle/escape/brig)
+"Zv" = (
+/obj/structure/bed/medical/emergency,
+/obj/machinery/iv_drip,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+hI
+jl
+IV
+zJ
+zJ
+zJ
+qf
+zJ
+YH
+zJ
+qB
+zJ
+zJ
+zJ
+qf
+zJ
+IL
+zJ
+IL
+zJ
+zJ
+zJ
+qf
+zJ
+zJ
+Jl
+"}
+(2,1,1) = {"
+oU
+eR
+qf
+HL
+HD
+qf
+gS
+BZ
+wM
+zr
+fv
+YA
+zJ
+KV
+vT
+ht
+hG
+hG
+hG
+RY
+zJ
+CO
+Zv
+ss
+IV
+zJ
+"}
+(3,1,1) = {"
+oU
+eR
+qf
+zZ
+HD
+sD
+lQ
+DV
+ls
+ls
+ER
+Xe
+zJ
+de
+dA
+kH
+Xs
+cX
+cX
+bq
+ok
+uV
+Rv
+ut
+Xt
+qf
+"}
+(4,1,1) = {"
+oU
+eR
+zJ
+zJ
+qf
+zJ
+zJ
+zJ
+oe
+qf
+oe
+zJ
+zJ
+IV
+du
+IE
+bL
+lP
+hj
+bq
+qf
+ep
+mq
+In
+xN
+qf
+"}
+(5,1,1) = {"
+hI
+hI
+zJ
+Lj
+NF
+pN
+zJ
+Gx
+Vf
+Vf
+Vf
+IK
+Jm
+zJ
+zJ
+IV
+kH
+hc
+hc
+Sx
+zJ
+zJ
+zJ
+zJ
+zJ
+zJ
+"}
+(6,1,1) = {"
+oU
+eR
+qf
+tF
+cl
+sQ
+qf
+xO
+dt
+dt
+dt
+dt
+uK
+zJ
+pB
+zJ
+qQ
+MD
+MD
+bq
+gO
+kQ
+Pe
+so
+kQ
+qf
+"}
+(7,1,1) = {"
+oU
+eR
+qf
+Up
+NA
+NA
+MW
+xO
+dM
+cj
+Zk
+kn
+UW
+DL
+FP
+DL
+kH
+Jh
+io
+bq
+zJ
+NB
+zJ
+bx
+bx
+qf
+"}
+(8,1,1) = {"
+hI
+hI
+zJ
+ro
+cl
+Nm
+zJ
+ps
+dM
+XY
+km
+kn
+UW
+qf
+FP
+qf
+kH
+vg
+vg
+bq
+IV
+zJ
+zJ
+zJ
+zJ
+zJ
+"}
+(9,1,1) = {"
+oU
+eR
+qf
+KR
+NA
+NA
+MW
+xO
+dM
+Fe
+bl
+kn
+UW
+DL
+FP
+DL
+Hf
+Gr
+bL
+Et
+Rw
+sW
+Ny
+lA
+Kz
+qf
+"}
+(10,1,1) = {"
+oU
+eR
+qf
+oZ
+NA
+GT
+qf
+xO
+dt
+dt
+dt
+dt
+SV
+zJ
+GO
+zJ
+zc
+Ef
+sz
+Xs
+Xs
+Qn
+fC
+DB
+iq
+qf
+"}
+(11,1,1) = {"
+hI
+hI
+zJ
+kY
+ym
+cH
+zJ
+mE
+kD
+fS
+kD
+AE
+cZ
+zJ
+zJ
+zJ
+zJ
+IV
+oX
+Xs
+Xs
+fA
+fC
+PB
+SA
+zJ
+"}
+(12,1,1) = {"
+oU
+eR
+zJ
+zJ
+qf
+zJ
+zJ
+qf
+FJ
+zJ
+qf
+hO
+qf
+zJ
+gR
+yk
+gI
+qf
+sz
+Xs
+Xs
+Qn
+fC
+DB
+iq
+qf
+"}
+(13,1,1) = {"
+oU
+eR
+zJ
+iG
+oi
+Mr
+qf
+FL
+fv
+zJ
+mn
+nv
+HD
+zJ
+do
+BV
+dO
+qf
+kH
+VL
+ha
+vs
+AR
+nY
+eo
+qf
+"}
+(14,1,1) = {"
+hI
+hI
+zJ
+vL
+Gd
+lY
+xZ
+sA
+vz
+zJ
+fa
+cD
+Fo
+zJ
+cP
+BV
+eY
+qf
+kH
+bq
+IV
+zJ
+zJ
+zJ
+zJ
+zJ
+"}
+(15,1,1) = {"
+oU
+eR
+zJ
+zJ
+qf
+zJ
+IV
+sA
+ua
+zJ
+zJ
+zJ
+zJ
+zJ
+vC
+BV
+Um
+zJ
+kH
+bq
+OD
+aj
+Wn
+aN
+Gz
+qf
+"}
+(16,1,1) = {"
+oU
+eR
+qf
+DO
+HD
+pI
+YM
+mR
+vz
+oD
+we
+jH
+LH
+zJ
+lu
+sV
+BV
+dl
+kH
+bq
+NS
+au
+au
+au
+XS
+qf
+"}
+(17,1,1) = {"
+oU
+eR
+qf
+Zo
+HD
+qf
+HO
+aI
+Bc
+zJ
+qx
+jn
+Pu
+zJ
+Zg
+Io
+xY
+zJ
+df
+Er
+zJ
+CD
+HJ
+JP
+IV
+zJ
+"}
+(18,1,1) = {"
+hI
+jl
+IV
+zJ
+zJ
+zJ
+qf
+zJ
+qf
+zJ
+qf
+zJ
+qf
+zJ
+qf
+zJ
+qf
+zJ
+qf
+zJ
+zJ
+zJ
+qf
+zJ
+zJ
+Jl
+"}
diff --git a/_maps/shuttles/emergency/emergency_dep_srv.dmm b/_maps/shuttles/emergency/emergency_dep_srv.dmm
new file mode 100644
index 000000000000..84a5b537063a
--- /dev/null
+++ b/_maps/shuttles/emergency/emergency_dep_srv.dmm
@@ -0,0 +1,1850 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aJ" = (
+/obj/machinery/mass_driver{
+ dir = 8;
+ id = "shuttlechapelgun"
+ },
+/obj/machinery/door/window/left/directional/east{
+ name = "Mass Driver";
+ req_access = list("chapel_office")
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bl" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 8
+ },
+/obj/structure/closet/emcloset/anchored,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"bD" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/effect/spawner/random/food_or_drink/booze{
+ spawn_loot_chance = 50;
+ pixel_x = -4;
+ pixel_y = 10
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"bL" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/window/spawner/directional/south,
+/obj/machinery/vending/coffee,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"cj" = (
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"cl" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/machinery/vending/boozeomat,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"cm" = (
+/obj/machinery/wall_healer/free/directional/south{
+ use_power = 0
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"cD" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"cH" = (
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"cQ" = (
+/obj/structure/extinguisher_cabinet/directional/north,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"cZ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"de" = (
+/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/obj/machinery/door/airlock/security/glass{
+ name = "Brig"
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"df" = (
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/iron/grimy,
+/area/shuttle/escape)
+"dt" = (
+/obj/effect/turf_decal/siding/wood/corner,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"dI" = (
+/obj/structure/closet/crate/hydroponics,
+/obj/item/shovel/spade,
+/obj/item/wrench,
+/obj/item/reagent_containers/cup/watering_can,
+/obj/item/cultivator,
+/obj/item/wirecutters,
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"dM" = (
+/obj/machinery/hydroponics/constructable,
+/obj/effect/turf_decal/box,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"dV" = (
+/obj/machinery/door/airlock/external/ruin{
+ name = "Emergency Recovery Airlock"
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"eh" = (
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/green/opposingcorners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/machinery/hydroponics/constructable,
+/obj/machinery/camera/autoname/directional/south,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"eo" = (
+/obj/machinery/computer/emergency_shuttle,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"eM" = (
+/obj/structure/table/wood,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/spawner/random/food_or_drink/snack{
+ pixel_x = 2;
+ pixel_y = 3
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"eR" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/effect/spawner/random/food_or_drink/booze{
+ spawn_loot_chance = 25;
+ pixel_x = -2;
+ pixel_y = 10
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"eY" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"fC" = (
+/obj/effect/turf_decal/tile/bar,
+/obj/machinery/deepfryer,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"fO" = (
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/obj/effect/turf_decal/loading_area{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"fS" = (
+/obj/structure/table/wood,
+/obj/machinery/computer/libraryconsole/bookmanagement{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"gj" = (
+/obj/machinery/libraryscanner,
+/obj/machinery/camera/autoname/directional/south,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"gI" = (
+/turf/open/floor/carpet/red,
+/area/shuttle/escape)
+"gR" = (
+/obj/machinery/power/shuttle_engine/propulsion,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"gS" = (
+/obj/machinery/door/airlock/freezer{
+ name = "Restroom";
+ id_tag = "shuttletoilet"
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/shuttle/escape)
+"hc" = (
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"ho" = (
+/obj/structure/bookcase/random/adult,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"ht" = (
+/obj/structure/chair/pew/left,
+/turf/open/floor/iron/chapel{
+ dir = 10
+ },
+/area/shuttle/escape)
+"hu" = (
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/closet/crate/coffin,
+/obj/structure/window/reinforced/spawner/directional/east,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"hG" = (
+/obj/structure/chair/pew/left,
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/iron/chapel{
+ dir = 1
+ },
+/area/shuttle/escape)
+"hI" = (
+/obj/effect/turf_decal/tile/bar,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"hO" = (
+/obj/structure/window/spawner/directional/south,
+/obj/structure/chair/sofa/left/brown{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"hV" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/duct,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"im" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/effect/spawner/random/food_or_drink/booze{
+ spawn_loot_chance = 50;
+ pixel_x = 1;
+ pixel_y = 7
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"iq" = (
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"iy" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/machinery/light/directional/south,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"ka" = (
+/obj/machinery/light/directional/east,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"km" = (
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/machinery/power/shuttle_engine/heater,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"kn" = (
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/iron/grimy,
+/area/shuttle/escape)
+"kC" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"kD" = (
+/obj/structure/bookcase/random/fiction,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"kG" = (
+/obj/structure/chair/pew/left,
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/chapel{
+ dir = 9
+ },
+/area/shuttle/escape)
+"kH" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 9
+ },
+/obj/structure/reagent_dispensers/wall/peppertank/directional/west,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"kW" = (
+/obj/structure/chair/office{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"kY" = (
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"ls" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"lP" = (
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"ma" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"mE" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"mI" = (
+/obj/item/radio/intercom/directional/south,
+/obj/machinery/camera/autoname/directional/south,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"nG" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"nT" = (
+/obj/structure/table,
+/obj/item/storage/box/zipties{
+ pixel_x = -8;
+ pixel_y = 10
+ },
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/obj/machinery/recharger{
+ pixel_x = 6;
+ pixel_y = 3
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"oi" = (
+/obj/machinery/door/poddoor/massdriver_chapel,
+/obj/machinery/atmos_shield_gen/active,
+/obj/machinery/atmos_shield_gen/active{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"ok" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/table,
+/obj/item/food/grown/flower/harebell{
+ pixel_x = 7;
+ pixel_y = 8
+ },
+/obj/item/food/grown/flower/harebell{
+ pixel_x = -7;
+ pixel_y = 9
+ },
+/obj/item/food/grown/flower/harebell{
+ pixel_x = 7;
+ pixel_y = 0
+ },
+/obj/item/food/grown/flower/harebell{
+ pixel_x = 0;
+ pixel_y = 4
+ },
+/obj/item/food/grown/flower/harebell{
+ pixel_x = -3;
+ pixel_y = -1
+ },
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"on" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/structure/table,
+/obj/machinery/chem_dispenser/drinks/beer,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"oG" = (
+/obj/effect/turf_decal/tile/blue/opposingcorners,
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/obj/machinery/hydroponics/constructable,
+/obj/machinery/light/directional/south,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"oU" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"oX" = (
+/obj/structure/chair,
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 5
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"pB" = (
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/structure/closet/secure_closet/freezer/fridge,
+/obj/item/radio/intercom/directional/west,
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"pH" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green/opposingcorners{
+ dir = 1
+ },
+/obj/structure/sink/directional/east,
+/obj/effect/turf_decal/box/corners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"pN" = (
+/obj/structure/table,
+/obj/item/storage/cans/sixsoda,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"qf" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"qB" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"ro" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/window/right/directional/south{
+ name = "Hydroponics Window";
+ req_access = list("hydroponics")
+ },
+/obj/machinery/door/window/left/directional/north{
+ name = "Kitchen Window";
+ req_access = list("kitchen")
+ },
+/obj/structure/window/spawner/directional/west,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"rr" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"ry" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"sz" = (
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"sD" = (
+/obj/structure/window/reinforced/tinted/spawner/directional/north,
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"sJ" = (
+/obj/machinery/door/airlock{
+ name = "Custodial Closet"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/service/janitor,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"sQ" = (
+/obj/effect/turf_decal/tile/bar,
+/obj/machinery/griddle,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"sR" = (
+/obj/structure/closet/crate/coffin,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/door/window/left/directional/east{
+ name = "Coffins Storage";
+ req_access = list("chapel_office")
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"tE" = (
+/obj/structure/table/reinforced,
+/obj/machinery/recharger,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"ub" = (
+/obj/structure/closet/crate/coffin,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/structure/window/reinforced/spawner/directional/east,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"uo" = (
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron/grimy,
+/area/shuttle/escape)
+"up" = (
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"uK" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/item/reagent_containers/condiment/saltshaker{
+ pixel_x = -4;
+ pixel_y = 3
+ },
+/obj/item/reagent_containers/condiment/peppermill{
+ pixel_x = 4;
+ pixel_y = 3
+ },
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"ve" = (
+/obj/structure/sink/directional/south,
+/obj/structure/mirror/directional/north,
+/obj/structure/window/reinforced/tinted/spawner/directional/east,
+/turf/open/floor/iron/showroomfloor,
+/area/shuttle/escape)
+"vi" = (
+/obj/structure/window/spawner/directional/south,
+/obj/structure/chair/sofa/right/brown{
+ dir = 1
+ },
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"vz" = (
+/obj/structure/chair/wood,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"vY" = (
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"we" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"wt" = (
+/obj/machinery/door/window/right/directional/north{
+ name = "Library Desk Door";
+ req_access = list("library")
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"wM" = (
+/obj/machinery/computer/crew,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 9
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"xN" = (
+/turf/open/floor/iron/chapel{
+ dir = 8
+ },
+/area/shuttle/escape)
+"xO" = (
+/obj/machinery/vending/hydroseeds,
+/obj/structure/window/spawner/directional/south,
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"yk" = (
+/obj/machinery/light/directional/west,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"ym" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/window/spawner/directional/south,
+/obj/structure/chair/sofa/left/brown{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"yU" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 6
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"zf" = (
+/obj/machinery/light/directional/west,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape)
+"zJ" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"Aj" = (
+/obj/effect/turf_decal/tile/blue/opposingcorners,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/structure/reagent_dispensers/plumbed,
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/machinery/light/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"AE" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/textured,
+/area/shuttle/escape)
+"AH" = (
+/obj/structure/table/wood,
+/obj/item/flashlight/lantern{
+ pixel_y = 7
+ },
+/turf/open/floor/iron/chapel{
+ dir = 5
+ },
+/area/shuttle/escape)
+"AJ" = (
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Be" = (
+/obj/machinery/seed_extractor,
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Bg" = (
+/turf/closed/wall/r_wall/plastitanium/nodiagonal,
+/area/shuttle/escape)
+"BG" = (
+/obj/machinery/wall_healer/free/directional/west{
+ use_power = 0
+ },
+/obj/machinery/skill_station,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"BV" = (
+/obj/structure/table/wood,
+/obj/item/toy/crayon/spraycan{
+ pixel_x = -7;
+ pixel_y = 14
+ },
+/obj/item/flashlight/lamp/green{
+ pixel_x = 1;
+ pixel_y = 5
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"BZ" = (
+/obj/machinery/door/window/right/directional/north{
+ name = "Shuttle Restroom"
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/machinery/wall_healer/free/directional/west{
+ use_power = 0
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"Dq" = (
+/obj/structure/table/wood,
+/obj/item/taperecorder,
+/obj/item/tape,
+/obj/structure/window/reinforced/spawner/directional/north,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"Dy" = (
+/obj/structure/easel,
+/obj/item/canvas/nineteen_nineteen,
+/obj/item/canvas/twentythree_nineteen,
+/obj/item/canvas/twentythree_twentythree,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"DB" = (
+/turf/open/floor/iron/chapel{
+ dir = 10
+ },
+/area/shuttle/escape)
+"DL" = (
+/obj/machinery/hydroponics/constructable,
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Ef" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 4
+ },
+/obj/structure/closet/emcloset/anchored,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"ED" = (
+/obj/structure/window/spawner/directional/south,
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/machinery/vending/cigarette,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"EM" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"EQ" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/computer/pod/old/mass_driver_controller{
+ pixel_x = -27;
+ pixel_y = -28;
+ id = "shuttlechapelgun"
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"ER" = (
+/turf/open/floor/iron/chapel{
+ dir = 6
+ },
+/area/shuttle/escape)
+"EW" = (
+/obj/machinery/biogenerator{
+ biomass = 100
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Fe" = (
+/obj/structure/chair/wood,
+/turf/open/floor/carpet/green,
+/area/shuttle/escape)
+"Fu" = (
+/obj/effect/turf_decal/trimline/purple/filled/end,
+/obj/item/grenade/chem_grenade/cleaner{
+ pixel_x = 5;
+ pixel_y = 12
+ },
+/obj/item/grenade/chem_grenade/cleaner{
+ pixel_x = 13;
+ pixel_y = 10
+ },
+/obj/item/grenade/chem_grenade/cleaner{
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/obj/machinery/light/small/directional/south,
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Fz" = (
+/obj/structure/chair/pew/right,
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/turf/open/floor/iron/chapel{
+ dir = 6
+ },
+/area/shuttle/escape)
+"FB" = (
+/obj/structure/chair/pew/right,
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/turf/open/floor/iron/chapel{
+ dir = 5
+ },
+/area/shuttle/escape)
+"FJ" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/effect/spawner/random/food_or_drink/booze{
+ spawn_loot_chance = 50;
+ pixel_x = 1;
+ pixel_y = 12
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"FP" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/chair/stool/bar/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Gx" = (
+/obj/structure/chair,
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 1
+ },
+/obj/item/radio/intercom/directional/north,
+/obj/machinery/light/directional/north,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"GT" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/item/radio/intercom/directional/east,
+/obj/machinery/light/directional/east,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Hk" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"Ht" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/machinery/door/airlock/public{
+ name = "Bar"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/service/bar,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"HO" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron/grimy,
+/area/shuttle/escape)
+"In" = (
+/obj/machinery/door/airlock/hydroponics/glass{
+ name = "Hydroponics"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/service/hydroponics,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"IE" = (
+/turf/open/floor/iron/grimy,
+/area/shuttle/escape)
+"IL" = (
+/obj/effect/turf_decal/tile/bar,
+/obj/structure/closet/secure_closet/freezer/meat,
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"Jl" = (
+/turf/template_noop,
+/area/template_noop)
+"Jm" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 10
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"Jo" = (
+/obj/structure/chair/office{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"JP" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/chair/stool/bar/directional/south,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Ke" = (
+/obj/structure/table,
+/obj/machinery/microwave,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"Kp" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/window/spawner/directional/south,
+/obj/structure/chair/sofa/right/brown{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"KJ" = (
+/obj/machinery/light/directional/south,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 6
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"KR" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"KV" = (
+/obj/machinery/door/airlock/external/ruin{
+ name = "Emergency Recovery Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"LH" = (
+/obj/structure/table/wood,
+/obj/item/storage/medkit/advanced{
+ pixel_x = 1;
+ pixel_y = 5
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"MD" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"MW" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/effect/spawner/random/food_or_drink/booze{
+ spawn_loot_chance = 25;
+ pixel_x = -2;
+ pixel_y = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"MZ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"Ni" = (
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Nm" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"NA" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/machinery/chem_master/condimaster{
+ desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments.";
+ name = "HoochMaster Deluxe"
+ },
+/obj/machinery/camera/autoname/directional/north,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"NS" = (
+/obj/machinery/hydroponics/constructable,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/corners,
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Oe" = (
+/obj/structure/toilet,
+/obj/machinery/button/door/directional/west{
+ id = "shuttletoilet";
+ name = "Lock Control";
+ normaldoorcontrol = 1;
+ specialfunctions = 4
+ },
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/iron/showroomfloor,
+/area/shuttle/escape)
+"Og" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/table/optable,
+/obj/machinery/vitals_reader/directional/east,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"OH" = (
+/obj/structure/chair/stool/directional/south,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"OL" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/machinery/door/airlock/public{
+ name = "Kitchen"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/service/kitchen,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"OX" = (
+/obj/structure/chair/office{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/corner{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"OZ" = (
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 10
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Po" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/machinery/light/directional/north,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"Pu" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ name = "Service emergency shuttle"
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"PK" = (
+/obj/structure/table/wood,
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = 0;
+ pixel_y = 3
+ },
+/obj/machinery/light/directional/east,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"Qn" = (
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/structure/closet/secure_closet/freezer/kitchen,
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"Qr" = (
+/obj/machinery/vending/hydronutrients,
+/obj/structure/window/spawner/directional/south,
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Qt" = (
+/obj/structure/table/wood,
+/obj/item/paper_bin,
+/obj/item/pen,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"Qv" = (
+/obj/structure/table/reinforced,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/power_store/cell/high,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"QC" = (
+/obj/structure/reagent_dispensers/watertank/high,
+/obj/item/reagent_containers/cup/watering_can,
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/effect/turf_decal/box,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"QS" = (
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/iron/chapel,
+/area/shuttle/escape)
+"Rs" = (
+/obj/effect/turf_decal/tile/bar,
+/obj/structure/table,
+/obj/item/food/dough{
+ desc = "A piece of raw dough, that waited until shuttle arrive on shuttle and chef made out of this nice meal. It waited for hours, and look at the walking crew and waits for its time. If its was able to speak it would say something like: 'HEY! PAY ATTENTION TO ME!' But nobody cares about that dough and its just repose and rotting. If you paid your attention, please make burger out of this, or just throw at trash bin."
+ },
+/obj/item/kitchen/rollingpin,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"Rv" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"RK" = (
+/obj/structure/chair/office{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"RY" = (
+/obj/structure/table/wood,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/item/storage/medkit/surgery{
+ pixel_x = 0;
+ pixel_y = 2
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"SQ" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/table,
+/obj/item/food/grown/flower/poppy,
+/obj/item/food/grown/flower/poppy,
+/obj/item/food/grown/flower/poppy{
+ pixel_x = 4;
+ pixel_y = 7
+ },
+/obj/item/food/grown/flower/poppy{
+ pixel_x = -5;
+ pixel_y = 2
+ },
+/obj/item/food/grown/flower/poppy{
+ pixel_x = 6;
+ pixel_y = -3
+ },
+/obj/item/food/grown/flower/poppy{
+ pixel_x = -6;
+ pixel_y = -9
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Th" = (
+/obj/machinery/computer/records/security,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 5
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Tt" = (
+/obj/effect/turf_decal/trimline/purple/filled/end{
+ dir = 1
+ },
+/obj/structure/mop_bucket/janitorialcart{
+ dir = 4
+ },
+/obj/item/reagent_containers/spray/cleaner{
+ pixel_x = 9;
+ pixel_y = -5
+ },
+/obj/item/mop,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"TL" = (
+/obj/machinery/jukebox,
+/turf/open/floor/carpet/green,
+/area/shuttle/escape)
+"TV" = (
+/obj/structure/chair/pew/right,
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/turf/open/floor/iron/chapel{
+ dir = 4
+ },
+/area/shuttle/escape)
+"Up" = (
+/obj/machinery/door/airlock/command/glass{
+ name = "Cockpit"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"UE" = (
+/obj/machinery/hydroponics/constructable,
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"UW" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/effect/spawner/random/food_or_drink/soup{
+ pixel_x = 0;
+ pixel_y = 4
+ },
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"Vf" = (
+/obj/machinery/door/window/right/directional/south{
+ name = "Hydroponics Room";
+ req_access = list("hydroponics")
+ },
+/obj/effect/turf_decal/arrows,
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Vu" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/effect/spawner/random/food_or_drink/snack{
+ pixel_x = -2;
+ pixel_y = 4
+ },
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"Vy" = (
+/obj/machinery/computer/communications,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"VG" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/turf/open/floor/iron/chapel,
+/area/shuttle/escape)
+"VU" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/red/filled/line,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape/brig)
+"Wb" = (
+/obj/machinery/computer/station_alert,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Wi" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/structure/table,
+/obj/machinery/chem_dispenser/drinks,
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"Xe" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/table,
+/obj/item/food/grown/flower/poppy/lily{
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/obj/item/food/grown/flower/poppy/geranium{
+ pixel_x = -3;
+ pixel_y = -2
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Xs" = (
+/obj/structure/extinguisher_cabinet/directional/north,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 9
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"XS" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/structure/table,
+/obj/machinery/reagentgrinder{
+ pixel_x = 0;
+ pixel_y = 3
+ },
+/turf/open/floor/iron,
+/area/shuttle/escape)
+"XY" = (
+/obj/structure/altar,
+/turf/open/floor/iron/chapel{
+ dir = 1
+ },
+/area/shuttle/escape)
+"Yp" = (
+/obj/structure/chair/office{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/dark_blue/filled/line{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Yt" = (
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron/showroomfloor,
+/area/shuttle/escape)
+"YH" = (
+/turf/closed/wall/r_wall/plastitanium,
+/area/shuttle/escape)
+"YM" = (
+/obj/machinery/light/directional/south,
+/obj/effect/turf_decal/trimline/dark_blue/filled/line,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"Ze" = (
+/obj/structure/table/wood,
+/obj/item/book/bible,
+/turf/open/floor/iron/chapel{
+ dir = 4
+ },
+/area/shuttle/escape)
+"Zk" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape)
+"Zo" = (
+/turf/open/floor/iron/chapel{
+ dir = 9
+ },
+/area/shuttle/escape)
+"Zv" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/machinery/oven/range,
+/turf/open/floor/iron/cafeteria,
+/area/shuttle/escape)
+"ZI" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/closet/crate/bin,
+/turf/open/floor/iron/dark,
+/area/shuttle/escape)
+"ZR" = (
+/obj/machinery/camera/autoname/directional/west{
+ pixel_x = 0;
+ base_pixel_y = -23;
+ pixel_y = -23
+ },
+/turf/open/floor/carpet/red,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+zJ
+zJ
+zJ
+zJ
+zJ
+nG
+qf
+Pu
+zJ
+qf
+zJ
+qf
+zJ
+qB
+qf
+qB
+zJ
+qf
+qf
+zJ
+oi
+rr
+Bg
+YH
+"}
+(2,1,1) = {"
+Jl
+zJ
+qf
+qf
+zJ
+Oe
+gS
+Yt
+BZ
+sz
+bl
+sz
+Hk
+bL
+kG
+ht
+hG
+xN
+Zo
+DB
+cD
+ub
+sR
+hu
+aJ
+zJ
+km
+gR
+"}
+(3,1,1) = {"
+Jl
+qf
+AE
+AE
+rr
+zJ
+rr
+ve
+sD
+ls
+Ef
+ls
+ls
+ED
+FB
+Fz
+TV
+VG
+AH
+ER
+cD
+cD
+cD
+cD
+EQ
+qf
+km
+gR
+"}
+(4,1,1) = {"
+zJ
+rr
+Xs
+OZ
+fO
+Up
+uo
+IE
+kn
+IE
+IE
+IE
+IE
+df
+IE
+IE
+IE
+HO
+XY
+xN
+ka
+ZI
+SQ
+Xe
+ok
+qf
+km
+gR
+"}
+(5,1,1) = {"
+zJ
+wM
+OX
+YM
+rr
+zJ
+Ht
+zJ
+zJ
+MZ
+oU
+iy
+zJ
+zJ
+zJ
+zJ
+zJ
+rr
+Ze
+QS
+rr
+zJ
+qf
+qf
+zJ
+zJ
+km
+gR
+"}
+(6,1,1) = {"
+qf
+tE
+kW
+mI
+zJ
+cl
+Nm
+bD
+FP
+dt
+ma
+kC
+JP
+uK
+Qn
+pB
+Zv
+zJ
+zJ
+In
+rr
+pH
+NS
+NS
+oG
+zJ
+YH
+YH
+"}
+(7,1,1) = {"
+qf
+Vy
+kY
+ry
+qf
+on
+Nm
+MW
+FP
+cH
+Fe
+mE
+JP
+Vu
+lP
+hc
+sQ
+zJ
+Be
+cj
+Qr
+hV
+cj
+cj
+Ni
+qf
+km
+gR
+"}
+(8,1,1) = {"
+qf
+eo
+Jo
+ry
+qf
+Wi
+Nm
+FJ
+FP
+cH
+TL
+mE
+JP
+we
+lP
+Ke
+Rs
+EW
+dI
+cj
+Vf
+hV
+QC
+dM
+UE
+qf
+km
+gR
+"}
+(9,1,1) = {"
+qf
+Wb
+kY
+ry
+qf
+XS
+Nm
+im
+FP
+cH
+Fe
+mE
+JP
+UW
+lP
+hc
+hI
+ro
+up
+cj
+xO
+hV
+cj
+cj
+Ni
+qf
+km
+gR
+"}
+(10,1,1) = {"
+qf
+Qv
+kY
+cm
+zJ
+NA
+GT
+eR
+FP
+EM
+oU
+KR
+JP
+we
+Rv
+IL
+fC
+rr
+zJ
+In
+rr
+Aj
+DL
+DL
+eh
+zJ
+YH
+YH
+"}
+(11,1,1) = {"
+zJ
+Th
+Yp
+KJ
+zJ
+zJ
+zJ
+zJ
+rr
+Po
+ma
+cZ
+zJ
+zJ
+OL
+zJ
+zJ
+rr
+BG
+iq
+rr
+zJ
+qf
+qf
+zJ
+zJ
+km
+gR
+"}
+(12,1,1) = {"
+zJ
+zJ
+zJ
+KV
+zJ
+kH
+MD
+Jm
+de
+gI
+gI
+gI
+gI
+gI
+gI
+ZR
+zf
+Zk
+sz
+sz
+sz
+yk
+sz
+OH
+Dy
+qf
+km
+gR
+"}
+(13,1,1) = {"
+Jl
+dV
+AJ
+vY
+zJ
+Gx
+pN
+VU
+qf
+eY
+RY
+hO
+eM
+ym
+rr
+zJ
+sJ
+rr
+cQ
+kD
+sz
+Dq
+fS
+Qt
+BV
+qf
+km
+gR
+"}
+(14,1,1) = {"
+Jl
+zJ
+qf
+qf
+zJ
+oX
+nT
+yU
+qf
+Og
+LH
+vi
+PK
+Kp
+zJ
+Tt
+Fu
+zJ
+vz
+ho
+sz
+wt
+RK
+sz
+gj
+zJ
+km
+gR
+"}
+(15,1,1) = {"
+Jl
+Jl
+Jl
+Jl
+zJ
+zJ
+zJ
+zJ
+zJ
+zJ
+qf
+zJ
+zJ
+qf
+zJ
+qf
+zJ
+zJ
+qf
+qf
+zJ
+qf
+qf
+zJ
+zJ
+rr
+Bg
+YH
+"}
diff --git a/_maps/shuttles/emergency/emergency_dep_sup.dmm b/_maps/shuttles/emergency/emergency_dep_sup.dmm
new file mode 100644
index 000000000000..5313b25fa26f
--- /dev/null
+++ b/_maps/shuttles/emergency/emergency_dep_sup.dmm
@@ -0,0 +1,1126 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ag" = (
+/obj/machinery/light/directional/south,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"ax" = (
+/obj/machinery/light/floor,
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"bl" = (
+/obj/effect/turf_decal/bot,
+/obj/effect/spawner/random/structure/crate,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"bL" = (
+/obj/machinery/conveyor/auto{
+ id = "shuttle_load";
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/full,
+/obj/effect/spawner/random/structure/closet_empty/crate,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"cj" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/suit_storage_unit/mining/eva,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"cl" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/item/radio/intercom/directional/west,
+/obj/machinery/light/directional/west,
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"cD" = (
+/obj/structure/chair/comfy/brown,
+/obj/item/binoculars,
+/obj/machinery/conveyor_switch{
+ id = "shuttle_load";
+ pixel_x = 15;
+ pixel_y = -1
+ },
+/turf/open/floor/carpet/orange,
+/area/shuttle/escape)
+"cH" = (
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"cZ" = (
+/obj/machinery/conveyor/auto{
+ id = "shuttle_load"
+ },
+/obj/effect/turf_decal/stripes/full,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"de" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/obj/machinery/computer/station_alert{
+ dir = 8
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"df" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Delivery Room"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/supply/general,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"dt" = (
+/obj/effect/spawner/random/vending/colavend,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"dM" = (
+/obj/effect/spawner/random/vending/snackvend,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"eo" = (
+/obj/machinery/atmos_shield_gen/active{
+ dir = 4
+ },
+/obj/machinery/atmos_shield_gen/active{
+ dir = 8
+ },
+/obj/machinery/door/airlock/public/glass{
+ name = "Mining Room"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/supply/mining,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"eR" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/structure/table/wood,
+/obj/item/reagent_containers/cup/glass/drinkingglass{
+ pixel_x = -7;
+ pixel_y = 9
+ },
+/obj/item/reagent_containers/cup/glass/drinkingglass{
+ pixel_x = 8;
+ pixel_y = 10
+ },
+/obj/item/reagent_containers/cup/glass/drinkingglass{
+ pixel_x = 0;
+ pixel_y = -1
+ },
+/obj/item/radio/intercom/directional/west,
+/obj/machinery/light/directional/west,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"eY" = (
+/obj/structure/table,
+/obj/item/melee/baton/security,
+/obj/structure/extinguisher_cabinet/directional/east,
+/obj/machinery/light/directional/east,
+/obj/machinery/camera/autoname/directional/east,
+/obj/machinery/recharger{
+ pixel_x = 0;
+ pixel_y = 2
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"fC" = (
+/turf/open/floor/engine,
+/area/shuttle/escape)
+"fJ" = (
+/obj/effect/turf_decal/stripes/full,
+/obj/machinery/conveyor/auto{
+ id = "shuttle_load";
+ dir = 9
+ },
+/obj/effect/spawner/random/structure/closet_empty/crate,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"fS" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"gI" = (
+/obj/item/kirbyplants/random,
+/obj/structure/window/reinforced/plasma/spawner/directional/east,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"gR" = (
+/obj/machinery/power/shuttle_engine/propulsion,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"gS" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"ht" = (
+/obj/machinery/conveyor/auto{
+ id = "shuttle_load";
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/full,
+/obj/effect/spawner/random/structure/closet_empty/crate,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"hI" = (
+/obj/effect/turf_decal/tile/yellow/diagonal_edge,
+/obj/effect/turf_decal/tile/brown/diagonal_centre,
+/obj/effect/turf_decal/siding/yellow,
+/obj/structure/railing/corner,
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/turf/open/floor/iron/diagonal,
+/area/shuttle/escape)
+"hO" = (
+/obj/machinery/conveyor/auto{
+ id = "shuttle_load";
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/full,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"iq" = (
+/obj/item/radio/intercom/directional/west,
+/obj/machinery/light/directional/west,
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"km" = (
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/machinery/power/shuttle_engine/heater,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"kn" = (
+/obj/structure/table,
+/obj/item/book/manual/wiki/security_space_law{
+ pixel_x = 6;
+ pixel_y = 16
+ },
+/obj/item/storage/box/handcuffs{
+ pixel_x = -5;
+ pixel_y = 10
+ },
+/obj/item/stock_parts/power_store/cell/high/empty{
+ pixel_x = 4;
+ pixel_y = 0
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"kD" = (
+/obj/effect/spawner/random/lavaland_mob/raptor,
+/turf/open/misc/hay/lavaland,
+/area/shuttle/escape)
+"kH" = (
+/obj/effect/turf_decal/stripes/full,
+/obj/machinery/conveyor/auto{
+ id = "shuttle_load";
+ dir = 5
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"kY" = (
+/obj/machinery/suit_storage_unit/industrial{
+ helmet_type = /obj/item/clothing/head/helmet/space/eva;
+ mask_type = /obj/item/clothing/mask/breath;
+ suit_type = /obj/item/clothing/suit/space/eva
+ },
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"ls" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Emergency Shuttle Brig"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"lP" = (
+/obj/structure/railing/wooden_fence{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava,
+/area/shuttle/escape)
+"ma" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ name = "Cargo emergency shuttle"
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"mE" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"oi" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"ok" = (
+/obj/structure/marker_beacon/burgundy,
+/obj/structure/railing/wooden_fence{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava,
+/area/shuttle/escape)
+"oU" = (
+/obj/effect/turf_decal/bot,
+/obj/effect/spawner/random/structure/chair_maintenance,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"oX" = (
+/obj/machinery/light/directional/east,
+/obj/machinery/status_display/ai/directional/east,
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"pg" = (
+/obj/machinery/conveyor/auto{
+ id = "shuttle_load"
+ },
+/obj/effect/turf_decal/stripes/full,
+/obj/effect/spawner/random/structure/crate,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"pB" = (
+/obj/machinery/light/directional/north,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"pN" = (
+/obj/effect/turf_decal/tile/yellow/diagonal_edge,
+/obj/effect/turf_decal/tile/brown/diagonal_centre,
+/obj/effect/turf_decal/siding/yellow,
+/obj/structure/railing,
+/obj/item/kirbyplants/organic/plant13,
+/obj/machinery/status_display/ai/directional/east,
+/turf/open/floor/iron/diagonal,
+/area/shuttle/escape)
+"qf" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"qB" = (
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape/brig)
+"ro" = (
+/obj/item/kirbyplants/random,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"rr" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"sz" = (
+/obj/item/radio/intercom/directional/east,
+/obj/machinery/light/directional/east,
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"sD" = (
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"sQ" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"tN" = (
+/obj/structure/sign/nanotrasen/directional/east,
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"uK" = (
+/obj/structure/flora/ash/fireblossom,
+/turf/open/misc/hay/lavaland,
+/area/shuttle/escape)
+"vz" = (
+/obj/machinery/conveyor_switch{
+ id = "shuttle_load"
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"vY" = (
+/obj/effect/turf_decal/stripes/full,
+/obj/machinery/conveyor/auto{
+ armor_type = /datum/armor/immune;
+ dir = 10;
+ id = "shuttle_load"
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"we" = (
+/obj/effect/turf_decal/bot,
+/obj/effect/spawner/random/structure/chair_maintenance{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"wM" = (
+/obj/structure/extinguisher_cabinet/directional/north,
+/obj/machinery/light/directional/north,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"xN" = (
+/obj/effect/turf_decal/loading_area{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"xO" = (
+/obj/structure/statue/gold/qm,
+/obj/effect/turf_decal/tile/yellow/diagonal_edge,
+/obj/effect/turf_decal/tile/brown/diagonal_centre,
+/obj/effect/turf_decal/siding/yellow,
+/obj/structure/railing,
+/obj/machinery/status_display/evac/directional/west,
+/turf/open/floor/iron/diagonal,
+/area/shuttle/escape)
+"yk" = (
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"ym" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"zJ" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"BV" = (
+/obj/effect/turf_decal/stripes/full,
+/obj/machinery/conveyor/auto{
+ id = "shuttle_load";
+ dir = 6
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"BZ" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"DB" = (
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"DL" = (
+/obj/effect/turf_decal/bot,
+/obj/effect/spawner/random/maintenance,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Ef" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"ER" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Fe" = (
+/obj/machinery/computer/cargo/express{
+ dir = 4
+ },
+/obj/item/supplypod_beacon,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/obj/machinery/light/directional/west,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"FJ" = (
+/obj/structure/ore_container/food_trough/raptor_trough,
+/turf/open/misc/hay/lavaland,
+/area/shuttle/escape)
+"FP" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/obj/structure/table/wood,
+/obj/item/gun/ballistic/rocketlauncher{
+ name = "\improper Dud Bazooka";
+ spawnwithmagazine = 0;
+ accepted_magazine_type = null;
+ pixel_x = -8;
+ pixel_y = 5
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"Gx" = (
+/obj/structure/fake_stairs/directional/north,
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"GK" = (
+/obj/machinery/camera/autoname/directional/east,
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"GT" = (
+/obj/effect/turf_decal/siding/wood/corner,
+/obj/effect/spawner/random/food_or_drink/keg,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"HO" = (
+/obj/machinery/conveyor/auto{
+ id = "shuttle_load";
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/full,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"In" = (
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"IE" = (
+/obj/machinery/conveyor/auto{
+ id = "shuttle_load";
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/full,
+/obj/effect/spawner/random/structure/crate,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"IL" = (
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Jl" = (
+/turf/template_noop,
+/area/template_noop)
+"Jm" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/machinery/computer/emergency_shuttle{
+ dir = 8
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"JP" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/suit_storage_unit/mining,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"KR" = (
+/obj/effect/turf_decal/bot,
+/obj/structure/closet/crate/medical,
+/obj/item/defibrillator/loaded,
+/obj/effect/spawner/surgery_tray/full,
+/obj/item/storage/medkit/o2{
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/obj/item/storage/medkit/toxin{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/medkit/fire,
+/obj/item/storage/medkit/brute{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"KV" = (
+/obj/structure/tank_dispenser/oxygen,
+/obj/item/radio/intercom/directional/south,
+/obj/machinery/light/floor,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"LH" = (
+/obj/machinery/door/window/brigdoor/security/cell/left/directional/south{
+ name = "Shuttle Holding Cell"
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape/brig)
+"MD" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/obj/machinery/computer/communications{
+ dir = 8
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"MW" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Cockpit"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/command/general,
+/obj/effect/mapping_helpers/airlock/access/any/supply/general,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Nm" = (
+/obj/structure/closet/crate/bin,
+/obj/structure/extinguisher_cabinet/directional/south,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Nu" = (
+/obj/structure/sign/nanotrasen/directional/west,
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"NA" = (
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"NS" = (
+/obj/machinery/conveyor/auto{
+ id = "shuttle_load";
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/full,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Pu" = (
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/utility/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/structure/closet/crate/internals,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Qn" = (
+/obj/structure/flora/ash/stem_shroom,
+/turf/open/misc/asteroid/basalt/lava,
+/area/shuttle/escape)
+"Rv" = (
+/obj/structure/tank_holder/oxygen/yellow,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"RY" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/escape)
+"Up" = (
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/structure/chair{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape/brig)
+"UW" = (
+/obj/structure/flora/ash/cacti,
+/turf/open/misc/asteroid/basalt/lava,
+/area/shuttle/escape)
+"Vf" = (
+/obj/effect/turf_decal/bot,
+/obj/effect/spawner/random/structure/closet_empty/crate,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Xe" = (
+/obj/machinery/autolathe,
+/obj/effect/turf_decal/stripes/line,
+/obj/item/radio/intercom/directional/west,
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"XS" = (
+/obj/effect/turf_decal/siding/wood/corner,
+/obj/machinery/door/airlock/public/glass{
+ name = "Cockpit"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"XY" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"YH" = (
+/obj/machinery/door/window/brigdoor/left/directional/east{
+ req_access = list("cargo");
+ name = "Delivery Pen"
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"YM" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/item/radio/intercom/prison/directional/north,
+/turf/open/floor/mineral/plastitanium/pod/redlight,
+/area/shuttle/escape/brig)
+"Zk" = (
+/obj/machinery/conveyor/auto{
+ id = "shuttle_load"
+ },
+/obj/effect/turf_decal/stripes/full,
+/obj/effect/spawner/random/structure/closet_empty/crate,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Zo" = (
+/obj/machinery/light/directional/west,
+/obj/machinery/status_display/evac/directional/west,
+/turf/open/floor/catwalk_floor/titanium,
+/area/shuttle/escape)
+"Zv" = (
+/turf/open/lava/smooth,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+Jl
+Jl
+zJ
+zJ
+qf
+zJ
+zJ
+zJ
+oi
+qf
+ma
+zJ
+qf
+qf
+qf
+zJ
+oi
+qf
+oi
+zJ
+zJ
+zJ
+zJ
+zJ
+zJ
+Jl
+"}
+(2,1,1) = {"
+zJ
+qf
+rr
+gS
+gS
+BZ
+zJ
+Nu
+DB
+DB
+DB
+iq
+DB
+DB
+DB
+Zo
+DB
+DB
+DB
+Nu
+qf
+Zv
+Zv
+Zv
+zJ
+RY
+"}
+(3,1,1) = {"
+zJ
+qB
+LH
+sD
+sD
+sD
+ls
+In
+kH
+NS
+NS
+ht
+NS
+NS
+NS
+ht
+NS
+NS
+fJ
+In
+qf
+Zv
+Zv
+Qn
+zJ
+gR
+"}
+(4,1,1) = {"
+zJ
+YM
+Up
+Ef
+eY
+kn
+zJ
+yk
+hO
+In
+xN
+In
+xN
+xN
+xN
+In
+xN
+In
+HO
+ag
+rr
+rr
+ok
+lP
+km
+gR
+"}
+(5,1,1) = {"
+zJ
+zJ
+zJ
+zJ
+zJ
+zJ
+rr
+pB
+hO
+In
+bl
+In
+Vf
+oU
+DL
+In
+bl
+In
+HO
+In
+In
+eo
+UW
+kD
+km
+gR
+"}
+(6,1,1) = {"
+qf
+fS
+cl
+sQ
+zJ
+xO
+dt
+In
+bL
+In
+oU
+In
+KR
+bl
+Vf
+In
+Vf
+In
+HO
+XY
+JP
+qf
+uK
+FJ
+km
+gR
+"}
+(7,1,1) = {"
+qf
+ER
+ER
+ER
+MW
+hI
+Gx
+In
+hO
+vz
+In
+In
+In
+In
+In
+In
+In
+vz
+IE
+XY
+KV
+zJ
+zJ
+zJ
+RY
+RY
+"}
+(8,1,1) = {"
+qf
+ro
+In
+Nm
+zJ
+pN
+dM
+In
+hO
+In
+Vf
+In
+bl
+Vf
+we
+In
+Pu
+In
+HO
+XY
+cj
+qf
+Fe
+Xe
+km
+gR
+"}
+(9,1,1) = {"
+zJ
+qf
+XS
+qf
+zJ
+zJ
+rr
+wM
+hO
+In
+Pu
+In
+DL
+Vf
+bl
+In
+Vf
+In
+HO
+In
+In
+df
+ER
+ER
+km
+gR
+"}
+(10,1,1) = {"
+zJ
+Rv
+NA
+GT
+eR
+FP
+qf
+In
+bL
+In
+IL
+In
+IL
+IL
+IL
+In
+IL
+In
+HO
+ag
+rr
+rr
+YH
+gI
+km
+gR
+"}
+(11,1,1) = {"
+zJ
+kY
+ym
+cH
+cD
+mE
+qf
+In
+BV
+cZ
+cZ
+pg
+cZ
+cZ
+cZ
+Zk
+cZ
+cZ
+vY
+In
+qf
+fC
+fC
+fC
+zJ
+gR
+"}
+(12,1,1) = {"
+zJ
+qf
+rr
+MD
+Jm
+de
+qf
+tN
+GK
+DB
+DB
+oX
+DB
+DB
+DB
+sz
+GK
+DB
+DB
+tN
+qf
+fC
+ax
+fC
+zJ
+RY
+"}
+(13,1,1) = {"
+Jl
+Jl
+zJ
+zJ
+qf
+zJ
+zJ
+zJ
+zJ
+qf
+zJ
+zJ
+qf
+qf
+qf
+zJ
+zJ
+qf
+zJ
+zJ
+zJ
+zJ
+zJ
+zJ
+zJ
+Jl
+"}
diff --git a/build/behavior_trees/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_combat.bt.compiled.json b/build/behavior_trees/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_combat.bt.compiled.json
index 83b18fc48efe..a8b6c7408309 100644
--- a/build/behavior_trees/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_combat.bt.compiled.json
+++ b/build/behavior_trees/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_combat.bt.compiled.json
@@ -1 +1 @@
-{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/is_at_distance","children":[{"type":"/datum/bt_node/decorator/ability_available","children":[{"type":"/datum/bt_node/composite/sequence","children":[{"type":"/datum/bt_node/ai_behavior/find_furthest_turf_from_target","target_key":"Current Target","set_key":"escape_destination","range":7},{"type":"/datum/bt_node/ai_behavior/targeted_mob_ability/and_clear_target","ability_key":"demon_teleport_ability","target_key":"escape_destination"}]}],"ability_key":"demon_teleport_ability"}],"target_key":"Current Target","maximum_distance":1},{"type":"/datum/bt_node/decorator/pawn_health_below","children":[{"type":"/datum/bt_node/decorator/ability_available","children":[{"type":"/datum/bt_node/ai_behavior/targeted_mob_ability","ability_key":"demon_clone_ability","target_key":"Current Target"}],"ability_key":"demon_clone_ability"}],"health_threshold":75},{"type":"/datum/bt_node/decorator/ability_available","children":[{"type":"/datum/bt_node/composite/sequence","children":[{"type":"/datum/bt_node/ai_behavior/find_valid_teleport_location","target_key":"Current Target","set_key":"teleport_destination","range":3},{"type":"/datum/bt_node/ai_behavior/targeted_mob_ability/and_clear_target","ability_key":"demon_teleport_ability","target_key":"teleport_destination"}]}],"ability_key":"demon_teleport_ability"},{"type":"/datum/bt_node/ai_behavior/basic_ranged_attack","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location","max_range":9}]}],"success_policy":1,"failure_policy":1},{"type":"/datum/bt_node/ai_behavior/maintain_distance/cover_minimum_distance","target_key":"Current Target"}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"finish_on_primary":true}
+{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/is_at_distance","children":[{"type":"/datum/bt_node/decorator/ability_available","children":[{"type":"/datum/bt_node/composite/sequence","children":[{"type":"/datum/bt_node/ai_behavior/find_furthest_turf_from_target","target_key":"Current Target","set_key":"escape_destination","range":7},{"type":"/datum/bt_node/ai_behavior/targeted_mob_ability/and_clear_target","ability_key":"demon_teleport_ability","target_key":"escape_destination"}]}],"ability_key":"demon_teleport_ability"}],"target_key":"Current Target","maximum_distance":1},{"type":"/datum/bt_node/decorator/pawn_health_below","children":[{"type":"/datum/bt_node/decorator/ability_available","children":[{"type":"/datum/bt_node/ai_behavior/targeted_mob_ability","ability_key":"demon_clone_ability","target_key":"Current Target"}],"ability_key":"demon_clone_ability"}],"health_threshold":75},{"type":"/datum/bt_node/decorator/ability_available","children":[{"type":"/datum/bt_node/composite/sequence","children":[{"type":"/datum/bt_node/ai_behavior/find_valid_teleport_location","target_key":"Current Target","set_key":"teleport_destination","range":3},{"type":"/datum/bt_node/ai_behavior/targeted_mob_ability/and_clear_target","ability_key":"demon_teleport_ability","target_key":"teleport_destination"}]}],"ability_key":"demon_teleport_ability"},{"type":"/datum/bt_node/ai_behavior/basic_ranged_attack","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location","max_range":9}]}],"success_policy":1,"failure_policy":1},{"type":"/datum/bt_node/ai_behavior/maintain_distance/cover_minimum_distance","target_key":"Current Target","face_target":false}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"finish_on_primary":true}
diff --git a/build/behavior_trees/code/modules/mob/living/basic/lavaland/basilisk/basilisk.bt.compiled.json b/build/behavior_trees/code/modules/mob/living/basic/lavaland/basilisk/basilisk.bt.compiled.json
index 77df6cb13d44..699ec43f4ff6 100644
--- a/build/behavior_trees/code/modules/mob/living/basic/lavaland/basilisk/basilisk.bt.compiled.json
+++ b/build/behavior_trees/code/modules/mob/living/basic/lavaland/basilisk/basilisk.bt.compiled.json
@@ -1 +1 @@
-{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/subtree/escape_captivity"},{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/bb_key_set","children":[{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/decorator/target_has_trait","children":[{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/is_at_distance","children":[{"type":"/datum/bt_node/ai_behavior/basic_ranged_attack","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location","max_range":9}],"min_distance":2},{"type":"/datum/bt_node/ai_behavior/attack_obstructions","target_key":"Current Target"},{"type":"/datum/bt_node/ai_behavior/basic_melee_attack","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location"}]}],"success_policy":1,"failure_policy":1}],"observer_abort":3,"invert":true,"key":"watcher_overwatched"},{"type":"/datum/bt_node/ai_behavior/maintain_distance","target_key":"Current Target"}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"finish_on_primary":true}],"observer_abort":3,"key":"Current Target"},{"type":"/datum/bt_node/subtree/random_walk"}]},{"type":"/datum/bt_node/ai_behavior/acquire_target/update_combat_targets","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location"}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"repeat_secondary_delay":10,"finish_on_primary":true}]}
+{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/subtree/escape_captivity"},{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/bb_key_set","children":[{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/decorator/target_has_trait","children":[{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/is_at_distance","children":[{"type":"/datum/bt_node/ai_behavior/basic_ranged_attack","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location","max_range":9}],"min_distance":2},{"type":"/datum/bt_node/ai_behavior/attack_obstructions","target_key":"Current Target"},{"type":"/datum/bt_node/ai_behavior/basic_melee_attack","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location"}]}],"success_policy":1,"failure_policy":1}],"observer_abort":3,"invert":true,"key":"watcher_overwatched"},{"type":"/datum/bt_node/ai_behavior/maintain_distance","target_key":"Current Target","face_target":false}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"finish_on_primary":true}],"observer_abort":3,"key":"Current Target"},{"type":"/datum/bt_node/subtree/random_walk"}]},{"type":"/datum/bt_node/ai_behavior/acquire_target/update_combat_targets","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location"}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"repeat_secondary_delay":10,"finish_on_primary":true}]}
diff --git a/build/behavior_trees/code/modules/mob/living/basic/lavaland/legion/legion.bt.compiled.json b/build/behavior_trees/code/modules/mob/living/basic/lavaland/legion/legion.bt.compiled.json
index dc586bdcd46c..bdbe083dfdda 100644
--- a/build/behavior_trees/code/modules/mob/living/basic/lavaland/legion/legion.bt.compiled.json
+++ b/build/behavior_trees/code/modules/mob/living/basic/lavaland/legion/legion.bt.compiled.json
@@ -1 +1 @@
-{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/subtree/escape_captivity"},{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/bb_key_set","children":[{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/ai_behavior/targeted_mob_ability","ability_key":"BB_TARGETED_action","target_key":"Current Target"}],"success_policy":1,"failure_policy":1},{"type":"/datum/bt_node/ai_behavior/maintain_distance","target_key":"Current Target"},{"type":"/datum/bt_node/decorator/cooldown","children":[{"type":"/datum/bt_node/ai_behavior/call_reinforcements/mining"}],"cooldown_key":"BB_basic_mob_reinforcements_cooldown","cooldown_duration":300,"lock_on_succeed":true}],"failure_policy":1,"success_policy":0,"repeat_secondary":true,"finish_on_primary":true}],"observer_abort":3,"key":"Current Target"},{"type":"/datum/bt_node/subtree/random_walk"}]},{"type":"/datum/bt_node/ai_behavior/acquire_target/update_combat_targets","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location"},{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/ai_behavior/random_speech/legion"}],"success_policy":1,"failure_policy":1,"loop_delay":10}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"repeat_secondary_delay":10,"finish_on_primary":true}]}
+{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/subtree/escape_captivity"},{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/bb_key_set","children":[{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/ai_behavior/targeted_mob_ability","ability_key":"BB_TARGETED_action","target_key":"Current Target"}],"success_policy":1,"failure_policy":1},{"type":"/datum/bt_node/ai_behavior/maintain_distance","target_key":"Current Target","face_target":false},{"type":"/datum/bt_node/decorator/cooldown","children":[{"type":"/datum/bt_node/ai_behavior/call_reinforcements/mining"}],"cooldown_key":"BB_basic_mob_reinforcements_cooldown","cooldown_duration":300,"lock_on_succeed":true}],"failure_policy":1,"success_policy":0,"repeat_secondary":true,"finish_on_primary":true}],"observer_abort":3,"key":"Current Target"},{"type":"/datum/bt_node/subtree/random_walk"}]},{"type":"/datum/bt_node/ai_behavior/acquire_target/update_combat_targets","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location"},{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/ai_behavior/random_speech/legion"}],"success_policy":1,"failure_policy":1,"loop_delay":10}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"repeat_secondary_delay":10,"finish_on_primary":true}]}
diff --git a/build/behavior_trees/code/modules/mob/living/basic/lavaland/legion/legion_monkey.bt.compiled.json b/build/behavior_trees/code/modules/mob/living/basic/lavaland/legion/legion_monkey.bt.compiled.json
index a6f3af26ff19..deccda2e536a 100644
--- a/build/behavior_trees/code/modules/mob/living/basic/lavaland/legion/legion_monkey.bt.compiled.json
+++ b/build/behavior_trees/code/modules/mob/living/basic/lavaland/legion/legion_monkey.bt.compiled.json
@@ -1 +1 @@
-{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/subtree/escape_captivity"},{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/bb_key_set","children":[{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/ai_behavior/targeted_mob_ability","ability_key":"BB_TARGETED_action","target_key":"Current Target"}],"success_policy":1,"failure_policy":1},{"type":"/datum/bt_node/ai_behavior/maintain_distance","target_key":"Current Target"},{"type":"/datum/bt_node/decorator/cooldown","children":[{"type":"/datum/bt_node/ai_behavior/call_reinforcements/mining"}],"cooldown_key":"BB_basic_mob_reinforcements_cooldown","cooldown_duration":300,"lock_on_succeed":true}],"failure_policy":1,"success_policy":0,"repeat_secondary":true,"finish_on_primary":true}],"observer_abort":3,"key":"Current Target"},{"type":"/datum/bt_node/subtree/consider_venting"},{"type":"/datum/bt_node/subtree/random_walk","bindings":{"bf07i8ep":10}}]},{"type":"/datum/bt_node/ai_behavior/acquire_target/update_combat_targets","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location"},{"type":"/datum/bt_node/ai_behavior/acquire_target/update_interaction_target","target_key":"BB_entry_vent_target","target_source":"/datum/target_source/oview_single_type/vent_pump","targeting_strategy":"/datum/targeting_strategy/anything","vision_range":7},{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/ai_behavior/random_speech/legion"}],"success_policy":1,"failure_policy":1,"loop_delay":10}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"repeat_secondary_delay":10,"finish_on_primary":true}]}
+{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/subtree/escape_captivity"},{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/bb_key_set","children":[{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/ai_behavior/targeted_mob_ability","ability_key":"BB_TARGETED_action","target_key":"Current Target"}],"success_policy":1,"failure_policy":1},{"type":"/datum/bt_node/ai_behavior/maintain_distance","target_key":"Current Target","face_target":false},{"type":"/datum/bt_node/decorator/cooldown","children":[{"type":"/datum/bt_node/ai_behavior/call_reinforcements/mining"}],"cooldown_key":"BB_basic_mob_reinforcements_cooldown","cooldown_duration":300,"lock_on_succeed":true}],"failure_policy":1,"success_policy":0,"repeat_secondary":true,"finish_on_primary":true}],"observer_abort":3,"key":"Current Target"},{"type":"/datum/bt_node/subtree/consider_venting"},{"type":"/datum/bt_node/subtree/random_walk","bindings":{"bf07i8ep":10}}]},{"type":"/datum/bt_node/ai_behavior/acquire_target/update_combat_targets","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location"},{"type":"/datum/bt_node/ai_behavior/acquire_target/update_interaction_target","target_key":"BB_entry_vent_target","target_source":"/datum/target_source/oview_single_type/vent_pump","targeting_strategy":"/datum/targeting_strategy/anything","vision_range":7},{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/ai_behavior/random_speech/legion"}],"success_policy":1,"failure_policy":1,"loop_delay":10}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"repeat_secondary_delay":10,"finish_on_primary":true}]}
diff --git a/build/behavior_trees/code/modules/mob/living/basic/lavaland/node_drone/node_drone.bt.compiled.json b/build/behavior_trees/code/modules/mob/living/basic/lavaland/node_drone/node_drone.bt.compiled.json
index 5d4dd01a8694..04aeeb4a3b0a 100644
--- a/build/behavior_trees/code/modules/mob/living/basic/lavaland/node_drone/node_drone.bt.compiled.json
+++ b/build/behavior_trees/code/modules/mob/living/basic/lavaland/node_drone/node_drone.bt.compiled.json
@@ -1 +1 @@
-{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/decorator/bb_key_set","children":[{"type":"/datum/bt_node/decorator/pawn_buckled_to_obj","children":[{"type":"/datum/bt_node/composite/sequence","children":[{"type":"/datum/bt_node/ai_behavior/move_to_target","target_key":"BB_current_hunting_target","required_dist":1,"finish_on_arrival":true},{"type":"/datum/bt_node/ai_behavior/hunt_target/latch_onto","target_key":"BB_current_hunting_target","hunt_cooldown":50}]}],"observer_abort":1,"invert":true,"target_key":"BB_current_hunting_target"}],"key":"BB_current_hunting_target","observer_abort":3}],"success_policy":1,"failure_policy":1,"loop_delay":15.0},{"type":"/datum/bt_node/ai_behavior/acquire_target/update_interaction_target","target_key":"BB_current_hunting_target","target_source":"/datum/target_source/oview_single_type/ore_vent","targeting_strategy":"/datum/targeting_strategy/ore_vent_unclaimed","vision_range":7}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"repeat_secondary_delay":10,"finish_on_primary":true}]}
+{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/decorator/bb_key_set","children":[{"type":"/datum/bt_node/decorator/pawn_buckled_to_obj","children":[{"type":"/datum/bt_node/composite/sequence","children":[{"type":"/datum/bt_node/ai_behavior/move_to_target","target_key":"BB_current_hunting_target","required_dist":1,"finish_on_arrival":true},{"type":"/datum/bt_node/ai_behavior/hunt_target/latch_onto","target_key":"BB_current_hunting_target","hunt_cooldown":50}]}],"observer_abort":1,"invert":true,"target_key":"BB_current_hunting_target"}],"key":"BB_current_hunting_target","observer_abort":3}],"success_policy":1,"failure_policy":1,"loop_delay":15.0},{"type":"/datum/bt_node/decorator/bb_key_set","children":[{"type":"/datum/bt_node/ai_behavior/acquire_target/update_interaction_target","target_key":"BB_current_hunting_target","target_source":"/datum/target_source/oview_single_type/ore_vent","targeting_strategy":"/datum/targeting_strategy/ore_vent_unclaimed","vision_range":7}],"observer_abort":1,"key":"BB_current_hunting_target"}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"repeat_secondary_delay":10,"finish_on_primary":true}]}
diff --git a/build/behavior_trees/code/modules/mob/living/basic/lavaland/watcher/watcher.bt.compiled.json b/build/behavior_trees/code/modules/mob/living/basic/lavaland/watcher/watcher.bt.compiled.json
index db275f6a561d..a1e59124c046 100644
--- a/build/behavior_trees/code/modules/mob/living/basic/lavaland/watcher/watcher.bt.compiled.json
+++ b/build/behavior_trees/code/modules/mob/living/basic/lavaland/watcher/watcher.bt.compiled.json
@@ -1 +1 @@
-{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/subtree/escape_captivity"},{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/bb_key_set","children":[{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/decorator/target_has_trait","children":[{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/bb_key_at_least","children":[{"type":"/datum/bt_node/ai_behavior/use_mob_ability"}],"key":"BB_basic_mob_has_target_time","minimum":50},{"type":"/datum/bt_node/ai_behavior/basic_ranged_attack","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location","max_range":9}]}],"success_policy":1,"failure_policy":1}],"observer_abort":3,"invert":true,"key":"watcher_overwatched"},{"type":"/datum/bt_node/ai_behavior/maintain_distance","target_key":"Current Target"},{"type":"/datum/bt_node/decorator/cooldown","children":[{"type":"/datum/bt_node/ai_behavior/call_reinforcements/mining"}],"cooldown_key":"BB_basic_mob_reinforcements_cooldown","cooldown_duration":300,"lock_on_succeed":true}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"finish_on_primary":true}],"observer_abort":3,"key":"Current Target"},{"type":"/datum/bt_node/subtree/random_walk"}]},{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/ai_behavior/acquire_target/target_from_retaliate_list","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location","check_faction":true},{"type":"/datum/bt_node/ai_behavior/acquire_target/update_combat_targets","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location"}]}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"repeat_secondary_delay":10,"finish_on_primary":true}]}
+{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/subtree/escape_captivity"},{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/bb_key_set","children":[{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/decorator/target_has_trait","children":[{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/bb_key_at_least","children":[{"type":"/datum/bt_node/ai_behavior/use_mob_ability"}],"key":"BB_basic_mob_has_target_time","minimum":50},{"type":"/datum/bt_node/ai_behavior/basic_ranged_attack","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location","max_range":9}]}],"success_policy":1,"failure_policy":1}],"observer_abort":3,"invert":true,"key":"watcher_overwatched"},{"type":"/datum/bt_node/ai_behavior/maintain_distance","target_key":"Current Target","face_target":false},{"type":"/datum/bt_node/decorator/cooldown","children":[{"type":"/datum/bt_node/ai_behavior/call_reinforcements/mining"}],"cooldown_key":"BB_basic_mob_reinforcements_cooldown","cooldown_duration":300,"lock_on_succeed":true}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"finish_on_primary":true}],"observer_abort":3,"key":"Current Target"},{"type":"/datum/bt_node/subtree/random_walk"}]},{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/ai_behavior/acquire_target/target_from_retaliate_list","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location","check_faction":true},{"type":"/datum/bt_node/ai_behavior/acquire_target/update_combat_targets","target_key":"Current Target","targeting_strategy":"targeting_strategy","hiding_location_key":"Current Target Hiding Location"}]}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"repeat_secondary_delay":10,"finish_on_primary":true}]}
diff --git a/code/__DEFINES/ai/bot_keys.dm b/code/__DEFINES/ai/bot_keys.dm
index f134f088d29f..f563a8277638 100644
--- a/code/__DEFINES/ai/bot_keys.dm
+++ b/code/__DEFINES/ai/bot_keys.dm
@@ -136,7 +136,7 @@
#define BB_REPAIRBOT_INTERACTION_TYPE "interaction_type"
///Key that hold robot target
#define BB_ROBOT_TARGET "robot target"
-///Key thast holds thingt to deconstruct
+///Key that holds thingt to deconstruct
#define BB_DECONSTRUCT_TARGET "deconstruct_target"
#define REPAIRBOT_INTERACTION_INTERACT 1
diff --git a/code/__DEFINES/alerts.dm b/code/__DEFINES/alerts.dm
index ea12830d8588..c4385db1146f 100644
--- a/code/__DEFINES/alerts.dm
+++ b/code/__DEFINES/alerts.dm
@@ -28,6 +28,7 @@
#define ALERT_SHOES_KNOT "shoealert"
#define ALERT_RADIOACTIVE_AREA "radioactive_area"
#define ALERT_UNPOSSESS_OBJECT "unpossess_object"
+#define ALERT_BLOODWORM_INFO "bloodworm_info"
//antag related
#define ALERT_HYPNOSIS "hypnosis"
diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
index a481924c727c..7d4d6d753395 100644
--- a/code/__DEFINES/antagonists.dm
+++ b/code/__DEFINES/antagonists.dm
@@ -155,7 +155,7 @@
/// - Must be a human (type, not species)
/// - Skeletons cannot be husked (they are snowflaked instead of having a trait)
/// - Monkeys are monkeys, not quite human (balance reasons)
-#define IS_VALID_GHOUL_MOB(mob) (ishuman(mob) && !isskeleton(mob) && !ismonkey(mob))
+#define IS_VALID_GHOUL_MOB(mob) (ishuman(mob) && !isskeleton(mob) && !HAS_TRAIT(mob, TRAIT_LESSER_HUMANOID))
/// Forces the blob to place the core where they currently are, ignoring any checks.
#define BLOB_FORCE_PLACEMENT -1
diff --git a/code/__DEFINES/atmospherics/atmos_core.dm b/code/__DEFINES/atmospherics/atmos_core.dm
index e2c66a83095e..4140f50a28df 100644
--- a/code/__DEFINES/atmospherics/atmos_core.dm
+++ b/code/__DEFINES/atmospherics/atmos_core.dm
@@ -179,3 +179,11 @@
#define ATMOS_PRESSURE_ERROR_TOLERANCE 0.01
/// Helper function for retrieving gas meta info for use in performace critical places
#define GAS_META /datum/gas_mixture::gas_meta
+
+// Flags for gas-cargo handling
+/// Gas can be sold in canisters
+#define GAS_EXPORTABLE (1 << 0)
+/// Gas can be purchased in canisters
+#define GAS_PURCHASABLE (1 << 1)
+/// Gas is dangerous and may need additional access
+#define GAS_DANGEROUS (1 << 2)
diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm
index bfb97ae7a46f..69fb41bb7f78 100644
--- a/code/__DEFINES/atom_hud.dm
+++ b/code/__DEFINES/atom_hud.dm
@@ -77,6 +77,8 @@
// Security HUD icon_state defines
+#define DEFAULT_HUDS_DMI 'icons/mob/huds/hud.dmi'
+
#define SECHUD_NO_ID "hudno_id"
#define SECHUD_UNKNOWN "hudunknown"
#define SECHUD_CENTCOM "hudcentcom"
diff --git a/code/__DEFINES/bodyparts.dm b/code/__DEFINES/bodyparts.dm
index 1a72e90876ac..94d77719cbbe 100644
--- a/code/__DEFINES/bodyparts.dm
+++ b/code/__DEFINES/bodyparts.dm
@@ -66,6 +66,7 @@
#define BODYPART_OVERLAY_CARP_INFUSION 2
#define BODYPART_OVERLAY_CSS_SUICIDE 3
#define BODYPART_OVERLAY_VOIDWALKER_CURSE 4
+#define BODYPART_OVERLAY_MESH 5
/// This limb cannot be disabled via damage thresholds
#define LIMB_NO_DISABLE -1
diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm
index d2a6b7ac0951..49ef949499c9 100644
--- a/code/__DEFINES/colors.dm
+++ b/code/__DEFINES/colors.dm
@@ -296,6 +296,8 @@
#define LIGHT_COLOR_HOLY_MAGIC "#FFF743"
/// deep crimson
#define LIGHT_COLOR_BLOOD_MAGIC "#D00000"
+/// Light-ish blue, used on mining sprites
+#define LIGHT_COLOR_MINING "#4AA0ED"
/* These ones aren't a direct colour like the ones above, because nothing would fit */
/// Warm orange color, leaning strongly towards yellow. rgb(250, 160, 25)
diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm
index 8faaeffb291a..2b4b88327fcc 100644
--- a/code/__DEFINES/cooldowns.dm
+++ b/code/__DEFINES/cooldowns.dm
@@ -59,8 +59,10 @@
#define COOLDOWN_CIRCUIT_TARGET_INTERCEPT "circuit_target_intercept"
#define COOLDOWN_CIRCUIT_VIEW_SENSOR "circuit_view_sensor"
-// mob cooldowns
+// emote cooldowns
#define COOLDOWN_YAWN_PROPAGATION "yawn_propagation_cooldown"
+#define COOLDOWN_YAWN_WITNESSED "yawn_witnessed_cooldown" // DARKPACK EDIT ADD
+#define COOLDOWN_DEATHGASP "deathgasp_cooldown"
//Shared cooldowns for actions
#define MOB_SHARED_COOLDOWN_1 (1<<0)
diff --git a/code/__DEFINES/dcs/signals/signals_mining.dm b/code/__DEFINES/dcs/signals/signals_mining.dm
index 494068f37078..78a3aea9e073 100644
--- a/code/__DEFINES/dcs/signals/signals_mining.dm
+++ b/code/__DEFINES/dcs/signals/signals_mining.dm
@@ -11,3 +11,7 @@
#define COMSIG_GOLIATH_TENTACLE_RETRACTING "comsig_goliath_tentacle_retracting"
/// Fired by a mob which has triggered a brimdust explosion from itself (not the mobs that get hit)
#define COMSIG_BRIMDUST_EXPLOSION "comsig_brimdust_explosion"
+/// From /datum/component/candela_node/set_network() : (old_network, new_network)
+#define COMSIG_CANDELA_NODE_NETWORK_CHANGED "candela_node_network_changed"
+/// From /datum/mining_beacon_network/set_power_state() : (old_state, new_state)
+#define COMSIG_CANDELA_NETWORK_POWER_CHANGED "candela_network_power_changed"
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm
index 95c138ad5796..17f2bd53c58c 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm
@@ -33,8 +33,14 @@
#define COMSIG_RAPTOR_GROWTH_STAGE_CHANGE "raptor_growth_stage_change"
/// Cancel raptor growth
#define COMPONENT_CANCEL_RAPTOR_GROWTH (1<<0)
-// Called when the revenant is to be released from its prison : (cause)
-#define COMSIG_REVENANT_RELEASE "revenant_release"
+
+// Called when revenant residue is starting to reform
+#define COMSIG_RESIDUE_REFORM "residue_reform"
+ // Reform successful
+ #define COMPONENT_RESIDUE_REFORM_SUCCESS (1 << 0)
+
+// Called when revenant residue is dispersed
+#define COMSIG_RESIDUE_DISPERSE "residue_disperse"
/// Called when a proficient_miner mob mines a tile
#define COMSIG_PROFICIENT_MINER_MINED "proficient_miner_mined"
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
index 3c3685badbf5..99ada07569db 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
@@ -51,7 +51,7 @@
#define MOVE_ARG_NEW_LOC 1
/// The argument of move_args which dictates our movement direction
#define MOVE_ARG_DIRECTION 2
-/// From base of /client/Move(): (direction, old_dir)
+/// From base of /client/Move(): (direction, old_dir, atom/old_loc)
#define COMSIG_MOB_CLIENT_MOVED "mob_client_moved"
/// From base of /client/proc/change_view() (mob/source, new_size)
#define COMSIG_MOB_CLIENT_CHANGE_VIEW "mob_client_change_view"
diff --git a/code/__DEFINES/dcs/signals/signals_mod.dm b/code/__DEFINES/dcs/signals/signals_mod.dm
index 21442ee73ebc..b9bcf35a6d95 100644
--- a/code/__DEFINES/dcs/signals/signals_mod.dm
+++ b/code/__DEFINES/dcs/signals/signals_mod.dm
@@ -60,3 +60,7 @@
#define COMSIG_MOD_TRY_INSTALL_MODULE "mod_try_install_module"
/// Cancel module installation, with no message. Include feedback on your cancel.
#define MOD_ABORT_INSTALL (1<<0)
+/// Called on an atom whenever a MOD module is used targeting it
+#define COMSIG_ATOM_MOD_MODULE_USED "atom_mod_module_used"
+ /// Cancels whatever the module is supposed to do
+ #define COMPONENT_INTERRUPT_MODULE_USE (1<<0)
diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm
index 91948c77bb7c..c49e85eeb20e 100644
--- a/code/__DEFINES/dcs/signals/signals_object.dm
+++ b/code/__DEFINES/dcs/signals/signals_object.dm
@@ -601,9 +601,9 @@
/// from /obj/machinery/computer/camera_advanced/shuttle_docker/gatherNavComputerOverlays() : (list/images_out)
#define COMSIG_SHUTTLE_NAV_COMPUTER_IMAGE_REQUESTED "shuttle_nav_computer_image_requested"
-/// Sent from /obj/item/organ/wings/functional/proc/open_wings(): (mob/living/carbon/owner)
+/// Sent from /obj/item/organ/wings/proc/open_wings(): (mob/living/carbon/owner)
#define COMSIG_WINGS_OPENED "wings_opened"
-/// Sent from /obj/item/organ/wings/functional/proc/close_wings(): (mob/living/carbon/owner)
+/// Sent from /obj/item/organ/wings/proc/close_wings(): (mob/living/carbon/owner)
#define COMSIG_WINGS_CLOSED "wings_closed"
/// Sent from /obj/item/clothing/shoes/bhop/rocket/jet, specifically it's toggle action /datum/action/item_action/toggle_flight
diff --git a/code/__DEFINES/diseases.dm b/code/__DEFINES/diseases.dm
index 4a0cdd676c40..9bf714c224a4 100644
--- a/code/__DEFINES/diseases.dm
+++ b/code/__DEFINES/diseases.dm
@@ -92,12 +92,6 @@ DEFINE_BITFIELD(spread_flags, list(
/// Negative Malnutrition Recovery Penalty
//// Flat penalty to recovery chance if malnourished or starving
#define DISEASE_MALNUTRITION_RECOVERY_PENALTY 3
-/// Satiety Recovery Multiplier - added chance to recover based on positive satiety
-//// Multiplier of satiety/max_satiety if satiety is positive or zero. Increase to make satiety more valuable, decrease for less.
-#define DISEASE_SATIETY_RECOVERY_MULTIPLIER 3
-/// Disease Satiety Threshold - how much junk food we have to eat to start curing positive viruses.
-//// About -150 is good. May need to change if satiety/junkiness var is changed up much.
-#define DISEASE_SATIETY_THRESHOLD -150
/// Good Sleeping Recovery Bonus - additive benefits for various types of good sleep (blanket, bed, darkness, pillows.)
//// Raise to make each factor add this much chance to recover.
#define DISEASE_GOOD_SLEEPING_RECOVERY_BONUS 0.6
diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm
index 253e4db7ee2a..05cdfda4e6b1 100644
--- a/code/__DEFINES/economy.dm
+++ b/code/__DEFINES/economy.dm
@@ -106,3 +106,9 @@
//Mood event from minor slot events like winning/losing a few bits.
#define SLOTS_MOOD_CATEGORY "slots"
+/// Minimum amount of exports that can get boosted per economy fire
+#define EXPORT_BOOST_MIN_AMOUNT 2
+/// Maximum amount of exports that can get boosted per economy fire
+#define EXPORT_BOOST_MAX_AMOUNT 4
+/// Amount by which random exports are boosted each SSeconomy tick
+#define EXPORT_BOOST_MULT 3
diff --git a/code/__DEFINES/external_organs.dm b/code/__DEFINES/external_organs.dm
index 5d84a3aecdd9..69354389ae93 100644
--- a/code/__DEFINES/external_organs.dm
+++ b/code/__DEFINES/external_organs.dm
@@ -11,3 +11,11 @@
/// Tail spine defines
#define SPINE_KEY_LIZARD "lizard"
+
+//wing flight defines
+///can't generate lift, will only fly in 0G, while atmos is present
+#define WINGS_FLIGHTLESS 1
+///can generate lift and fly if atmos is present
+#define WINGS_AIRWORTHY 2
+///can fly regardless of atmos
+#define WINGS_MAGIC 3
diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm
index 2c3ea2ddc546..408acff568b0 100644
--- a/code/__DEFINES/icon_smoothing.dm
+++ b/code/__DEFINES/icon_smoothing.dm
@@ -164,26 +164,33 @@ DEFINE_BITFIELD(smoothing_junction, list(
#define SMOOTH_GROUP_PLASMA_WALLS S_OBJ(6) ///turf/closed/wall/mineral/plasma, /obj/structure/falsewall/plasma
#define SMOOTH_GROUP_BANANIUM_WALLS S_OBJ(7) ///turf/closed/wall/mineral/bananium, /obj/structure/falsewall/bananium
#define SMOOTH_GROUP_SANDSTONE_WALLS S_OBJ(8) ///turf/closed/wall/mineral/sandstone, /obj/structure/falsewall/sandstone
-#define SMOOTH_GROUP_WOOD_WALLS S_OBJ(9) ///turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood
-#define SMOOTH_GROUP_IRON_WALLS S_OBJ(10) ///turf/closed/wall/mineral/iron, /obj/structure/falsewall/iron
-#define SMOOTH_GROUP_ABDUCTOR_WALLS S_OBJ(11) ///turf/closed/wall/mineral/abductor, /obj/structure/falsewall/abductor
-#define SMOOTH_GROUP_TITANIUM_WALLS S_OBJ(12) ///turf/closed/wall/mineral/titanium, /obj/structure/falsewall/titanium
-#define SMOOTH_GROUP_PLASTITANIUM_WALLS S_OBJ(14) ///turf/closed/wall/mineral/plastitanium, /obj/structure/falsewall/plastitanium
-#define SMOOTH_GROUP_SURVIVAL_TITANIUM_POD S_OBJ(15) ///turf/closed/wall/mineral/plastitanium/survival/pod, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/reinforced/shuttle/survival_pod
-#define SMOOTH_GROUP_HIERO_WALL S_OBJ(16) ///obj/effect/temp_visual/elite_tumor_wall, /obj/effect/temp_visual/hierophant/wall
-#define SMOOTH_GROUP_BAMBOO_WALLS S_OBJ(17) //![/turf/closed/wall/mineral/bamboo, /obj/structure/falsewall/bamboo]
-#define SMOOTH_GROUP_CONCRETE_WALLS S_OBJ(18) ///turf/closed/wall/concrete
-
-#define SMOOTH_GROUP_PAPERFRAME S_OBJ(21) ///obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe
-
-#define SMOOTH_GROUP_WINDOW_FULLTILE S_OBJ(22) ///turf/closed/indestructible/fakeglass, /obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/reinforced/plasma/fulltile
-#define SMOOTH_GROUP_WINDOW_FULLTILE_BRONZE S_OBJ(23) ///obj/structure/window/bronze/fulltile
-#define SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM S_OBJ(24) ///turf/closed/indestructible/opsglass, /obj/structure/window/reinforced/plasma/plastitanium
-#define SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE S_OBJ(25) ///obj/structure/window/reinforced/shuttle
-#define SMOOTH_GROUP_WINDOW_FULLTILE_CULT S_OBJ(26) ///obj/structure/window/cult/fulltile
-
-#define SMOOTH_GROUP_LATTICE S_OBJ(31) ///obj/structure/lattice
-#define SMOOTH_GROUP_CATWALK S_OBJ(32) ///obj/structure/lattice/catwalk
+#define SMOOTH_GROUP_WOOD_WALLS S_OBJ(10) ///turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood
+#define SMOOTH_GROUP_IRON_WALLS S_OBJ(11) ///turf/closed/wall/mineral/iron, /obj/structure/falsewall/iron
+#define SMOOTH_GROUP_ABDUCTOR_WALLS S_OBJ(12) ///turf/closed/wall/mineral/abductor, /obj/structure/falsewall/abductor
+#define SMOOTH_GROUP_TITANIUM_WALLS S_OBJ(13) ///turf/closed/wall/mineral/titanium, /obj/structure/falsewall/titanium
+#define SMOOTH_GROUP_PLASTITANIUM_WALLS S_OBJ(15) ///turf/closed/wall/mineral/plastitanium, /obj/structure/falsewall/plastitanium
+#define SMOOTH_GROUP_SURVIVAL_TITANIUM_POD S_OBJ(16) ///turf/closed/wall/mineral/plastitanium/survival/pod, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/reinforced/shuttle/survival_pod
+#define SMOOTH_GROUP_HIERO_WALL S_OBJ(17) ///obj/effect/temp_visual/elite_tumor_wall, /obj/effect/temp_visual/hierophant/wall
+#define SMOOTH_GROUP_BAMBOO_WALLS S_OBJ(18) //![/turf/closed/wall/mineral/bamboo, /obj/structure/falsewall/bamboo]
+#define SMOOTH_GROUP_BONE_WALLS S_OBJ(19) ///turf/closed/wall/mineral/bone, /obj/structure/falsewall/bone
+#define SMOOTH_GROUP_CONCRETE_WALLS S_OBJ(20) ///turf/closed/wall/concrete
+#define SMOOTH_GROUP_ADAMANTINE_WALLS S_OBJ(21)///turf/closed/wall/mineral/admantine, /obj/structure/falsewall/admantine
+#define SMOOTH_GROUP_METALHYDROGEN_WALLS S_OBJ(22) ///turf/closed/wall/mineral/metalhydrogen, /obj/structure/falsewall/metalhydrogen
+#define SMOOTH_GROUP_HAUNTIUM_WALLS S_OBJ(23)///turf/closed/wall/mineral/hauntium, /obj/structure/falsewall/hauntium
+#define SMOOTH_GROUP_RUNITE_WALLS S_OBJ(24) ////turf/closed/wall/mineral/runite, /obj/structure/falsewall/runite
+#define SMOOTH_GROUP_MYTHRIL_WALLS S_OBJ(25) ///turf/closed/wall/mineral/mythril, /obj/structure/falsewall/mythril
+
+#define SMOOTH_GROUP_PAPERFRAME S_OBJ(28) ///obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe
+
+#define SMOOTH_GROUP_WINDOW_FULLTILE S_OBJ(30) ///turf/closed/indestructible/fakeglass, /obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/reinforced/plasma/fulltile
+#define SMOOTH_GROUP_WINDOW_FULLTILE_BRONZE S_OBJ(31) ///obj/structure/window/bronze/fulltile
+#define SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM S_OBJ(32) ///turf/closed/indestructible/opsglass, /obj/structure/window/reinforced/plasma/plastitanium
+#define SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE S_OBJ(33) ///obj/structure/window/reinforced/shuttle
+#define SMOOTH_GROUP_WINDOW_FULLTILE_CULT S_OBJ(34) ///obj/structure/window/cult/fulltile
+
+
+#define SMOOTH_GROUP_LATTICE S_OBJ(37) ///obj/structure/lattice
+#define SMOOTH_GROUP_CATWALK S_OBJ(38) ///obj/structure/lattice/catwalk
#define SMOOTH_GROUP_AIRLOCK S_OBJ(41) ///obj/machinery/door/airlock
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 2170795c10fe..e4b0494cf02e 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -189,8 +189,6 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list(
#define isshade(A) (istype(A, /mob/living/basic/shade))
-#define is_simian(A) (isgorilla(A) || ismonkey(A))
-
#define isstargazer(A) (istype(A, /mob/living/basic/heretic_summon/star_gazer))
#define isbloodworm(A) (istype(A, /mob/living/basic/blood_worm))
diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm
index 9b843a695198..020a5dd05b03 100644
--- a/code/__DEFINES/lighting.dm
+++ b/code/__DEFINES/lighting.dm
@@ -99,11 +99,11 @@ GLOBAL_LIST_INIT(specular_color, SPECULAR_COLOR)
// Types of emissives
/// Emissive that will not have bloom applied to it, encoded into the green channel
-#define EMISSIVE_NO_BLOOM 0
+#define EMISSIVE_NO_BLOOM 1
/// Emissive that will get bloom applied to it, encoded into the red channel
-#define EMISSIVE_BLOOM 1
+#define EMISSIVE_BLOOM 2
/// Mimics a highly reflective surface, will not have any glow by itself but will amplify any lighting applied to it, encoded into the blue channel
-#define EMISSIVE_SPECULAR 2
+#define EMISSIVE_SPECULAR 3
/// Light cutoff of specular emissives, controls how sharp a light must be before it starts reflecting
#define SPECULAR_EMISSIVE_CUTOFF 0.3
diff --git a/code/__DEFINES/mining.dm b/code/__DEFINES/mining.dm
index f71f30a70837..d00725466d63 100644
--- a/code/__DEFINES/mining.dm
+++ b/code/__DEFINES/mining.dm
@@ -8,7 +8,9 @@
/// How many boulders can a single ore vent have on its tile before it stops producing more?
#define MAX_BOULDERS_PER_VENT 10
/// Time multiplier
-#define INATE_BOULDER_SPEED_MULTIPLIER 3
+#define INNATE_BOULDER_SPEED_MULTIPLIER 3
+/// Multiplier for mineral amt in boulders when a vent is boosted by the Candela network
+#define BOULDER_MAT_MULT_BOOSTED 1.33
// Vent type
/// Large vents, giving large boulders.
@@ -27,12 +29,12 @@
#define GIBTONITE_QUALITY_LOW 1
// Timers for the ore vents to perform wave defense.
-/// Duration for wave defense for a small vent.
-#define WAVE_DURATION_SMALL 60 SECONDS
-/// Duration for wave defense for a medium vent.
-#define WAVE_DURATION_MEDIUM 90 SECONDS
-/// Duration for wave defense for a large vent.
-#define WAVE_DURATION_LARGE 150 SECONDS
+/// Number of waves players will need to defeat for a small vent.
+#define WAVE_DURATION_SMALL 5
+/// Number of waves players will need to defeat for a medium vent.
+#define WAVE_DURATION_MEDIUM 10
+/// Number of waves players will need to defeat for a large vent.
+#define WAVE_DURATION_LARGE 15
/// Lifetime of a boulder platform in seconds when spawned in lava/plasma.
#define PLATFORM_LIFE_DEFAULT 10 SECONDS
@@ -49,6 +51,11 @@
#define OREGEN_PRESET_LAVALAND "lavaland"
#define OREGEN_PRESET_TRIPLE_Z "triple_z"
+/// When assigned, spawners will continue to spawn a mob repeatedly until reaching max_spawned. New mobs will be spawned regardless of how many exist under that cap.
+#define SPAWN_CONTINUOUS_BEHAVIOR "continuous"
+/// When assigned, spawners will spawn a group of mobs as defined by max_spawn_per_attempt, and will only spawn a new wave after
+#define SPAWN_BY_WAVE_BEHAVIOR "complete_wave"
+
// Ore vein types
/// Round ore cluster
#define ORE_VEIN_CLUSTER "cluster"
@@ -66,3 +73,11 @@
#define ACTION_MULTIPLIER_PER_VENT_VALUE 0.1
/// Permanent style multiplier modifier earned from killing a megafauna.
#define ACTION_MULTIPLIER_MAJOR_KILL 0.1
+
+/// Maximum distance between Candela beacons
+#define MINING_BEACON_MAX_REACH 9
+// Different Candela network power states
+/// Connected to a regular ore vent
+#define CANDELA_NETWORK_POWERED (1<<0)
+/// Connected to a roundstart ore vent, boosting boulder rates
+#define CANDELA_NETWORK_BOOSTED (1<<1)
diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm
index 5fda2e9c15b2..d29e7a2229d2 100644
--- a/code/__DEFINES/obj_flags.dm
+++ b/code/__DEFINES/obj_flags.dm
@@ -35,42 +35,50 @@
// Flags for the item_flags var on /obj/item
-#define BEING_REMOVED (1<<0)
-#define IN_INVENTORY (1<<1) //is this item equipped into an inventory slot or hand of a mob? used for tooltips
-#define FORCE_STRING_OVERRIDE (1<<2) // used for tooltips
-///Used by security bots to determine if this item is safe for public use.
-#define NEEDS_PERMIT (1<<3)
-#define SLOWS_WHILE_IN_HAND (1<<4)
-#define NO_MAT_REDEMPTION (1<<5) // Stops you from putting things like an RCD or other items into an ORM or protolathe for materials.
-#define DROPDEL (1<<6) // When dropped, it calls qdel on itself
-#define NOBLUDGEON (1<<7) // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
+/// Is this item equipped into an inventory slot or hand of a mob?
+#define IN_INVENTORY (1<<0)
+/// If set, calls set_force_string when retrieving force for tooltips
+#define FORCE_STRING_OVERRIDE (1<<1)
+/// Used by security bots to determine if this item is safe for public use.
+#define NEEDS_PERMIT (1<<2)
+/// Must be set for an item's slowdown to apply when held rather than just worn
+#define SLOWS_WHILE_IN_HAND (1<<3)
+// Stops you from putting things like an RCD or other items into an ORM or protolathe for materials.
+#define NO_MAT_REDEMPTION (1<<4)
+/// When dropped, it calls qdel on itself
+#define DROPDEL (1<<5)
+/// Item cannot be used for attacks, even if it has a force set.
+#define NOBLUDGEON (1<<6)
/**
* for all things that are technically items but don't want to be treated as such, given on a case-by-case basis
* examples of use are hand items, omni-toolsets, non-limb limbs (hand eater, mounted chainsaw, many null rods), borg modules, bodyparts, organs, etc.
* This is used for general exclusion, such as preventing insertions into other items
* Basically, these aren't "real" items. <= wow thanks for the fucking insight sherlock
*/
-#define ABSTRACT (1<<9)
-#define IMMUTABLE_SLOW (1<<10) // When players should not be able to change the slowdown of the item (Speed potions, etc)
-#define IN_STORAGE (1<<11) //is this item in the storage item, such as backpack? used for tooltips
-#define SURGICAL_TOOL (1<<12) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes)
-#define CRUEL_IMPLEMENT (1<<13) //This object, when used for surgery, causes a lot more pain for the patient, and is more efficient in a morbid users hands
-#define HAND_ITEM (1<<14) // If an item is just your hand (circled hand, slapper) and shouldn't block things like riding
-#define XENOMORPH_HOLDABLE (1<<15) // A Xenomorph can hold this item.
-#define NO_PIXEL_RANDOM_DROP (1<<16) //if dropped, it wont have a randomized pixel_x/pixel_y
+#define ABSTRACT (1<<7)
+/// When players should not be able to change the slowdown of the item (Speed potions, etc)
+#define IMMUTABLE_SLOW (1<<8)
+/// is this item in the storage item, such as backpack?
+#define IN_STORAGE (1<<9)
+/// Tool commonly used for surgery, so it has some unique handling around surgical operations
+#define SURGICAL_TOOL (1<<10)
+/// This object, when used for surgery, causes a lot more pain for the patient, and is more efficient in a morbid users hands
+#define CRUEL_IMPLEMENT (1<<11)
+/// If an item represents a hand (circled hand, slapper) and shouldn't block things like riding
+#define HAND_ITEM (1<<12)
+/// if dropped, it wont have a randomized pixel_x/pixel_y
+#define NO_PIXEL_RANDOM_DROP (1<<13)
///Can be equipped on digitigrade legs.
-#define IGNORE_DIGITIGRADE (1<<17)
+#define IGNORE_DIGITIGRADE (1<<14)
/// Has contextual screentips when HOVERING OVER OTHER objects
-#define ITEM_HAS_CONTEXTUAL_SCREENTIPS (1 << 18)
+#define ITEM_HAS_CONTEXTUAL_SCREENTIPS (1<<15)
/// No blood overlay is allowed to appear on this item, and it cannot gain blood DNA forensics
-#define NO_BLOOD_ON_ITEM (1 << 19)
+#define NO_BLOOD_ON_ITEM (1<<16)
/// Whether this item should skip the /datum/component/fantasy applied on spawn on the RPG event. Used on things like stacks
-#define SKIP_FANTASY_ON_SPAWN (1<<20)
+#define SKIP_FANTASY_ON_SPAWN (1<<17)
/// If an item has had its /datum/element/weapon_description initialized or not.
-#define WEAPON_DESCRIPTION_INITIALIZED (1<<21)
-/// If an item causes bluespace interference when teleported with.
-#define BLUESPACE_INTERFERENCE (1<<22)
-#define ACTIVE_WORLD_ICON (1<<23) // DARKPACK EDIT ADD - World Icons
+#define WEAPON_DESCRIPTION_INITIALIZED (1<<18)
+#define ACTIVE_ONFLOOR_ICON (1<<19) // DARKPACK EDIT ADD - ONFLOOR_ICONS
// Flags for the clothing_flags var on /obj/item/clothing
@@ -83,37 +91,29 @@
#define BLOCK_GAS_SMOKE_EFFECT (1<<2)
/// mask allows internals
#define MASKINTERNALS (1<<3)
-/// mask filters toxins and other harmful gases
-#define GAS_FILTERING (1<<4)
/// prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag.
/// Example: space suits, biosuit, bombsuits, thick suits that cover your body.
-#define THICKMATERIAL (1<<5)
+#define THICKMATERIAL (1<<4)
/// The voicebox in this clothing can be toggled.
-#define VOICEBOX_TOGGLABLE (1<<6)
+#define VOICEBOX_TOGGLABLE (1<<5)
/// The voicebox is currently turned off.
-#define VOICEBOX_DISABLED (1<<7)
+#define VOICEBOX_DISABLED (1<<6)
/// Prevents knock-off from things like hat-throwing.
-#define SNUG_FIT (1<<8)
-/// Hats with negative effects when worn (i.e the tinfoil hat).
-#define ANTI_TINFOIL_MANEUVER (1<<9)
-/// Clothes that cause a larger notification when placed on a person.
-#define DANGEROUS_OBJECT (1<<10)
+#define SNUG_FIT (1<<7)
/// Clothes that use large icons, for applying the proper overlays like blood
-#define LARGE_WORN_ICON (1<<11)
+#define LARGE_WORN_ICON (1<<8)
/// prevents from placing on plasmaman helmet or modsuit hat holder
-#define STACKABLE_HELMET_EXEMPT (1<<12)
+#define STACKABLE_HELMET_EXEMPT (1<<9)
/// Prevents plasmamen from igniting when wearing this
-#define PLASMAMAN_PREVENT_IGNITION (1<<13)
-///Moths can't eat the clothing that has this flag.
-#define INEDIBLE_CLOTHING (1<<14)
+#define PLASMAMAN_PREVENT_IGNITION (1<<10)
/// Headgear/helmet allows internals
-#define HEADINTERNALS (1<<15)
+#define HEADINTERNALS (1<<11)
/// Prevents masks from getting adjusted from enabling internals
-#define INTERNALS_ADJUST_EXEMPT (1<<16)
+#define INTERNALS_ADJUST_EXEMPT (1<<12)
/// Indicates that the piece of clothing contributes towards Sleeping Carp's style factor, which determines evasion probabilities. See /datums/martial/sleeping_carp/carp_style_check().
-#define CARP_STYLE_FACTOR (1<<17)
+#define CARP_STYLE_FACTOR (1<<13)
/// Prevents clothing from losing bodyparts coverage when shredded
-#define NO_ZONE_DISABLING (1<<18)
+#define NO_ZONE_DISABLING (1<<14)
/// Integrity defines for clothing (not flags but close enough)
#define CLOTHING_PRISTINE 0 // We have no damage on the clothing
diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm
index 7aaf3e433741..1c0d3424fa31 100644
--- a/code/__DEFINES/say.dm
+++ b/code/__DEFINES/say.dm
@@ -96,6 +96,7 @@
#define SPAN_SOAPBOX "soapbox"
#define SPAN_COLOSSUS "colossus"
#define SPAN_DANGER "danger"
+#define SPAN_REVENWARNING "revenwarning"
//bitflag #defines for return value of the radio() proc.
/// Makes the message use italics
#define ITALICS (1<<0)
diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index 02bf160709fe..5bf80376e741 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -49,6 +49,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define STATION_TRAIT_UNNATURAL_ATMOSPHERE "station_trait_unnatural_atmosphere"
#define STATION_TRAIT_SPIKED_DRINKS "station_trait_spiked_drinks"
#define STATION_TRAIT_SPAWN_WEAKPOINTS "station_trait_spawn_weakpoints"
+#define STATION_TRAIT_VENDING_SHORTAGE "station_trait_vending_shortage"
// Hud traits
/// This hud is owned by a client with an open escape menu
@@ -535,8 +536,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_MARTIAL_ARTS_IMMUNE "martial_arts_immune"
/// Immune to being afflicted by time stop (spell)
#define TRAIT_TIME_STOP_IMMUNE "time_stop_immune"
-/// Revenants draining you only get a very small benefit.
-#define TRAIT_WEAK_SOUL "weak_soul"
/// This mob has no soul
#define TRAIT_NO_SOUL "no_soul"
/// Prevents mob from riding mobs when buckled onto something
@@ -977,8 +976,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_HAS_BEEN_KIDNAPPED "has_been_kidnapped"
/// An item still plays its hitsound even if it has 0 force, instead of the tap
#define TRAIT_CUSTOM_TAP_SOUND "no_tap_sound"
-/// Makes the feedback message when someone else is putting this item on you more noticeable
-#define TRAIT_DANGEROUS_OBJECT "dangerous_object"
+/// This item is potentially dangerous or disavantaged to have equipped
+#define TRAIT_DANGEROUS_EQUIP "dangerous_equip"
+/// This item is potentially dangerous or disavantaged to have unequipped
+#define TRAIT_DANGEROUS_UNEQUIP "dangerous_unequip"
/// determines whether or not objects are haunted and teleport/attack randomly
#define TRAIT_HAUNTED "haunted"
/// An item that, if it has contents, will ignore its contents when scanning for contraband.
@@ -1681,6 +1682,11 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Cannot be backstabbed with a crusher
#define TRAIT_BACKSTAB_IMMUNE "backstab_immune"
+/// Mobs that are of a lesser species, like monkeys, compared to other humanoid species
+#define TRAIT_LESSER_HUMANOID "lesser_humanoid"
+/// Is an ape, gorilla, a man of the jungle, an ook ook fellow
+#define TRAIT_SIMIAN "simian"
+
/// Makes the owner immune from the pacification from synthpax
#define TRAIT_SYNTHPAX_IMMUNE "synthpax_immune"
/// Allow the owner to eat cloth
@@ -1725,4 +1731,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Turfs with this trait allow whispers to be projected over it when the whisperer is facing it
#define TRAIT_TURF_PROJECTS_WHISPERS "turf_projects_whispers"
+/// Items with this trait interfere with bluespace teleportation
+#define TRAIT_BLUESPACE_INTERFERENCE "bluespace_interference"
+
+/// Objects with this trait may become a new prison for a revenant, in the event of its ectoplasm dispersing
+#define TRAIT_COZY_REVENANT_HOME "cozy_revenant_home"
+
// END TRAIT DEFINES
diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm
index 3ec7fad220a0..a1c0aa83a1e6 100644
--- a/code/__DEFINES/vv.dm
+++ b/code/__DEFINES/vv.dm
@@ -151,6 +151,7 @@
#define VV_HK_GIVE_HALLUCINATION "give_hallucination"
#define VV_HK_GIVE_DELUSION_HALLUCINATION "give_hallucination_delusion"
#define VV_HK_GIVE_GUARDIAN_SPIRIT "give_guardian_spirit"
+#define VV_HK_NAVIGATE_TO_MARKED_OBJECT "navigate_to_marked_object"
// /mob/living/carbon
#define VV_HK_MODIFY_BODYPART "mod_bodypart"
diff --git a/code/__DEFINES/~darkpack/fera/fera.dm b/code/__DEFINES/~darkpack/fera/fera.dm
index fd28eb1c24c2..21335a4fa333 100644
--- a/code/__DEFINES/~darkpack/fera/fera.dm
+++ b/code/__DEFINES/~darkpack/fera/fera.dm
@@ -16,25 +16,28 @@
#define BREED_CORAX_HOMID "Corax Homid"
#define BREED_CORVID "Corvid"
-#define FEATURE_FUR_COLOR "fera_fur"
+#define FEATURE_FERA_FUR_COLOR "fera_fur_color"
+#define FEATURE_FERA_HAIR(splat_id) "fera_hair" + splat_id
+#define FEATURE_FERA_BODY(splat_id) "fera_body" + splat_id
+#define FEATURE_FERA_CLOTHES(splat_id) "fera_clothes" + splat_id
-// fera will likely have a seperate list of colors but uses the same feature or var as other fera
-GLOBAL_LIST_INIT(garou_fur_colors, list(
- "black" = "black",
- "gray" = "gray",
- "red" = "red",
- "white" = "white",
- "ginger" = "ginger",
- "brown" = "brown",
-))
-
-GLOBAL_LIST_INIT(corax_fur_colors, list(
- "black" = "black",
- "brown" = "brown",
- "white" = "white",
- "green" = "green",
- "red" = "red",
- "gray" = "gray",
+GLOBAL_ALIST_INIT(fera_fur_colors, alist(
+ SPLAT_GAROU = list(
+ "black" = "black",
+ "gray" = "gray",
+ "red" = "red",
+ "white" = "white",
+ "ginger" = "ginger",
+ "brown" = "brown",
+ ),
+ SPLAT_CORAX = list(
+ "black" = "black",
+ "brown" = "brown",
+ "white" = "white",
+ "green" = "green",
+ "red" = "red",
+ "gray" = "gray",
+ )
))
#define STATUS_EFFECT_DELIRIUM /datum/status_effect/delirium
diff --git a/code/__DEFINES/~darkpack/jobs.dm b/code/__DEFINES/~darkpack/jobs.dm
index 3bf0605aee87..4812cd7cbd9f 100644
--- a/code/__DEFINES/~darkpack/jobs.dm
+++ b/code/__DEFINES/~darkpack/jobs.dm
@@ -270,7 +270,7 @@ DEFINE_BITFIELD(departments_bitflags, list(
// Playtime tracking system, see jobs_exp.dm
// weird one.
-#define EXP_TYPE_KINDRED "Kindred"
+#define EXP_TYPE_PLAYTIME "Playtime"
#define EXP_TYPE_GAIA "Garou Nation"
#define EXP_TYPE_SPIRAL "Pentex"
#define EXP_TYPE_CAMARILLA "Camarilla Authorities"
@@ -278,14 +278,16 @@ DEFINE_BITFIELD(departments_bitflags, list(
#define EXP_TYPE_CHANTRY "Chantry"
#define EXP_TYPE_ANARCH "Anarchs"
#define EXP_TYPE_SABBAT "Sabbat"
-#define EXP_TYPE_COUNCIL "Camarilla Primogen Council"
#define EXP_TYPE_POLICE "Police Force"
-#define EXP_TYPE_NATIONAL_SECURITY "National Security"
#define EXP_TYPE_SERVICES "City Services"
-// this prob should just say clinic genericly.
-#define EXP_TYPE_CLINIC "St. John's Clinic"
+#define EXP_TYPE_CLINIC "Clinic"
#define EXP_TYPE_GIOVANNI "Giovanni Family"
#define EXP_TYPE_MANOR "Voivodate" // APOC EDIT CHANGE - (Voivode)
#define EXP_TYPE_CHURCH "Church"
#define EXP_TYPE_CLUB "Strip Club"
+#define EXP_TYPE_SOCIETY_OF_LEOPOLD "Society of Leopold"
#define EXP_TYPE_OCEAN "Ocean 76" // APOC EDIT ADD - JOBS - Ocean 76
+
+#define EXP_REQ_CRITICAL 720
+#define EXP_REQ_HEAD 360
+#define EXP_REQ_MINOR 180
diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm
index 419d5dcca57b..349c39035373 100644
--- a/code/__DEFINES/~darkpack/traits/declarations.dm
+++ b/code/__DEFINES/~darkpack/traits/declarations.dm
@@ -16,6 +16,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define STATION_TRAIT_STRAY_MIGRATION "station_trait_stray_migration"
#define STATION_TRAIT_WILD_MASQUERADE "station_trait_wild_masquerade"
+/// Prevents passive fire acts from igniting the ground below it.
+#define TRAIT_ELEVATED_FLAME "elevated_flame" // TURF_FIRE
+
// Mob traits
// If the user is unbondable via blood bonds.
@@ -107,8 +110,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Stepping on glass shards immunity. Currently used for a couple Garou forms but could be used elsewhere.
#define TRAIT_HARDENED_SOLES "hardened_soles"
-
-// Allows the user to pass through doors
#define TRAIT_IN_FRENZY "in_frenzy"
// Is the mob silenced (by Quietus 1 for example)
@@ -146,6 +147,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_NO_LYING_ANGLE "no_lying_angle"
// Expensive but allows us to ensure there resting gets updated.
#define TRAIT_TRANSFORM_UPDATES_ICON "transform_updates_icon"
+#define TRAIT_OPENS_MOONGATES "opens_moongates"
+/// Friends and allowed to interact with the main gaian caern
+#define TRAIT_GAIA_CAERN_FRIEND "gaia_caern_friend"
// Fera both grants a flight ability, and has the sprites to support such a thing. (Presently only designed to supprot feral form.)
#define TRAIT_FERA_FLIGHT "fera_flight"
#define TRAIT_SILVER_WEAKNESS "silver_weakness"
@@ -172,6 +176,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
// BELOW ARE ALL MERITS/FLAWS
#define TRAIT_ACUTE_HEARING "acute_hearing"
#define TRAIT_ANIMAL_MUSK "animal_musk"
+#define TRAIT_ANTHROPIC_TASTE "anthropic_taste"
#define TRAIT_BANNED_TRANSFORMATION "banned_transformation"
#define TRAIT_BEACON_OF_THE_UNHOLY "beacon_of_the_unholy"
#define TRAIT_BETRAYERS_MARK "betrayers_mark"
diff --git a/code/__DEFINES/~darkpack/traits/sources.dm b/code/__DEFINES/~darkpack/traits/sources.dm
index 7f873747748c..80bfe711b295 100644
--- a/code/__DEFINES/~darkpack/traits/sources.dm
+++ b/code/__DEFINES/~darkpack/traits/sources.dm
@@ -1,7 +1,7 @@
#define NPC_ITEM_TRAIT "npc_item"
-/// Trait given by a vampire's Clan
-#define CLAN_TRAIT "clan"
+/// Trait given by a splat's subsplat
+#define SUBSPLAT_TRAIT "subsplat"
#define GIFT_TRAIT "gift"
diff --git a/code/__DEFINES/~darkpack/whitelist.dm b/code/__DEFINES/~darkpack/whitelist.dm
new file mode 100644
index 000000000000..f6f9fdafc578
--- /dev/null
+++ b/code/__DEFINES/~darkpack/whitelist.dm
@@ -0,0 +1,2 @@
+#define WHITELIST_TRUSTED "trusted"
+#define WHITELIST_TIMELIMITS "timelimits"
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index a460cf656c77..ecd2f19e45bb 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -771,7 +771,7 @@
*
* If no record is found, returns null
*/
-/proc/find_record(value, locked_only = FALSE)
+/proc/find_record(value, locked_only = FALSE) as /datum/record
if(locked_only)
for(var/datum/record/locked/target in GLOB.manifest.locked)
if(target.name != value)
diff --git a/code/__HELPERS/atmospherics.dm b/code/__HELPERS/atmospherics.dm
index d3f1522dbf82..3c7e2438cd66 100644
--- a/code/__HELPERS/atmospherics.dm
+++ b/code/__HELPERS/atmospherics.dm
@@ -49,7 +49,7 @@
cached_gas_name[gas_path],
amount,
))
- for(var/datum/gas_reaction/reaction_result as anything in gasmix.reaction_results)
+ for(var/datum/gas_reaction/standard/reaction_result as anything in gasmix.reaction_results)
.["reactions"] += list(list(
initial(reaction_result.id),
initial(reaction_result.name),
@@ -84,10 +84,11 @@ GLOBAL_LIST_EMPTY(gas_handbook)
gas_info["name"] = meta_information[META_GAS_NAME][gas_path]
gas_info["description"] = meta_information[META_GAS_DESC][gas_path]
gas_info["specific_heat"] = meta_information[META_GAS_SPECIFIC_HEAT][gas_path]
+ gas_info["export_value"] = (gas_path::cargo_flags & GAS_EXPORTABLE) ? gas_path::base_value : 0
gas_info["reactions"] = list()
momentary_gas_list[gas_path] = gas_info
- for (var/datum/gas_reaction/reaction_path as anything in subtypesof(/datum/gas_reaction))
+ for (var/datum/gas_reaction/standard/reaction_path as anything in valid_subtypesof(/datum/gas_reaction))
var/datum/gas_reaction/reaction = new reaction_path
var/list/reaction_info = list()
reaction_info["id"] = reaction.id
@@ -109,9 +110,9 @@ GLOBAL_LIST_EMPTY(gas_handbook)
if(factor == "Temperature" || factor == "Pressure")
factor_info["tooltip"] = "Reaction is influenced by the [LOWER_TEXT(factor)] of the place where the reaction is occurring."
else if(factor == "Energy")
- factor_info["tooltip"] = "Energy released by the reaction, may or may not result in linear temperature change depending on a slew of other factors."
+ factor_info["tooltip"] = "Energy released by the reaction. May or may not result in linear temperature change depending on a slew of other factors."
else if(factor == "Radiation")
- factor_info["tooltip"] = "This reaction emits dangerous radiation! Take precautions."
+ factor_info["tooltip"] = "This reaction emits hazardous radiation - take precautions."
else if (factor == "Location")
factor_info["tooltip"] = "This reaction has special behaviour when occurring in specific locations."
else if(factor == "Hot Ice")
@@ -120,44 +121,13 @@ GLOBAL_LIST_EMPTY(gas_handbook)
GLOB.reaction_handbook += list(reaction_info)
qdel(reaction)
- for (var/datum/electrolyzer_reaction/reaction_path as anything in subtypesof(/datum/electrolyzer_reaction))
- var/datum/electrolyzer_reaction/reaction = new reaction_path
- var/list/reaction_info = list()
- reaction_info["id"] = reaction.id
- reaction_info["name"] = reaction.name
- reaction_info["description"] = reaction.desc
- reaction_info["factors"] = list()
- for (var/factor in reaction.factor)
- var/list/factor_info = list()
- factor_info["desc"] = reaction.factor[factor]
-
- if(factor in momentary_gas_list)
- momentary_gas_list[factor]["reactions"] += list(reaction.id = reaction.name)
- factor_info["factor_id"] = momentary_gas_list[factor]["id"] //Gas id
- factor_info["factor_type"] = "gas"
- factor_info["factor_name"] = momentary_gas_list[factor]["name"] //Common name
- else
- factor_info["factor_name"] = factor
- factor_info["factor_type"] = "misc"
- if(factor == "Temperature" || factor == "Pressure")
- factor_info["tooltip"] = "Reaction is influenced by the [LOWER_TEXT(factor)] of the place where the reaction is occurring."
- else if(factor == "Energy")
- factor_info["tooltip"] = "Energy released by the reaction, may or may not result in linear temperature change depending on a slew of other factors."
- else if(factor == "Radiation")
- factor_info["tooltip"] = "This reaction emits dangerous radiation! Take precautions."
- else if (factor == "Location")
- factor_info["tooltip"] = "This reaction has special behaviour when occurring in specific locations."
- reaction_info["factors"] += list(factor_info)
- GLOB.reaction_handbook += list(reaction_info)
- qdel(reaction)
-
for (var/gas_info_index in momentary_gas_list)
GLOB.gas_handbook += list(momentary_gas_list[gas_info_index])
/// Returns an assoc list of the gas handbook and the reaction handbook.
/// For UIs, simply do data += return_atmos_handbooks() to use.
/proc/return_atmos_handbooks()
- return list("gasInfo" = GLOB.gas_handbook, "reactionInfo" = GLOB.reaction_handbook)
+ return list("gasInfo" = GLOB.gas_handbook, "reactionInfo" = GLOB.reaction_handbook, "moneySymbol" = MONEY_SYMBOL, "moneyName" = MONEY_NAME)
/proc/extract_id_tags(list/objects)
var/list/tags = list()
diff --git a/code/__HELPERS/spatial_info.dm b/code/__HELPERS/spatial_info.dm
index 214c1477aeaf..200f1f60cec4 100644
--- a/code/__HELPERS/spatial_info.dm
+++ b/code/__HELPERS/spatial_info.dm
@@ -516,8 +516,9 @@
* @params inner_range - The inner range of the circle to NOT pull from.
* @params center - The center of the circle to pull from, can be an atom (we'll apply get_turf() to it within circle_x_turfs procs.)
* @params view_based - If TRUE, we'll use circle_view_turfs instead of circle_range_turfs procs.
+ * @params reject_dense - If TRUE, ignore picked turfs in this selection that have density.
*/
-/proc/turf_peel(outer_range, inner_range, center, view_based = FALSE)
+/proc/turf_peel(outer_range, inner_range, center, view_based = FALSE, reject_dense = TRUE)
if(inner_range > outer_range) // If the inner range is larger than the outer range, you're using this wrong.
CRASH("Turf peel inner range is larger than outer range!")
var/list/peel = list()
@@ -532,10 +533,12 @@
for(var/turf/possible_spawn as anything in outer)
if(possible_spawn in inner)
continue
+ if(possible_spawn.density && reject_dense)
+ continue
peel += possible_spawn
if(!length(peel))
- return center //Offer the center only as a default case when we don't have a valid circle.
+ peel += center //Offer the center only as a default case when we don't have a valid circle.
return peel
///check if 2 diagonal turfs are blocked by dense objects
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index 43e20072d603..b6ab3456a107 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -120,13 +120,9 @@ DEFINE_BITFIELD(car_traits, list(
))
DEFINE_BITFIELD(clothing_flags, list(
- "ANTI_TINFOIL_MANEUVER" = ANTI_TINFOIL_MANEUVER,
"BLOCK_GAS_SMOKE_EFFECT" = BLOCK_GAS_SMOKE_EFFECT,
"CARP_STYLE_FACTOR" = CARP_STYLE_FACTOR,
- "DANGEROUS_OBJECT" = DANGEROUS_OBJECT,
- "GAS_FILTERING" = GAS_FILTERING,
"HEADINTERNALS" = HEADINTERNALS,
- "INEDIBLE_CLOTHING" = INEDIBLE_CLOTHING,
"INTERNALS_ADJUST_EXEMPT" = INTERNALS_ADJUST_EXEMPT,
"LARGE_WORN_ICON" = LARGE_WORN_ICON,
"LAVAPROTECT" = LAVAPROTECT,
@@ -228,8 +224,6 @@ DEFINE_BITFIELD(interaction_flags_item, list(
DEFINE_BITFIELD(item_flags, list(
"ABSTRACT" = ABSTRACT,
- "BEING_REMOVED" = BEING_REMOVED,
- "BLUESPACE_INTERFERENCE" = BLUESPACE_INTERFERENCE,
"CRUEL_IMPLEMENT" = CRUEL_IMPLEMENT,
"DROPDEL" = DROPDEL,
"FORCE_STRING_OVERRIDE" = FORCE_STRING_OVERRIDE,
@@ -248,7 +242,6 @@ DEFINE_BITFIELD(item_flags, list(
"SLOWS_WHILE_IN_HAND" = SLOWS_WHILE_IN_HAND,
"SURGICAL_TOOL" = SURGICAL_TOOL,
"WEAPON_DESCRIPTION_INITIALIZED" = WEAPON_DESCRIPTION_INITIALIZED,
- "XENOMORPH_HOLDABLE" = XENOMORPH_HOLDABLE,
))
#define HIDEFLAGS_BITFIELD list( \
diff --git a/code/_globalvars/darkpack/lists/phone_contacts.dm b/code/_globalvars/darkpack/lists/phone_contacts.dm
index d762a4914634..09708babfb04 100644
--- a/code/_globalvars/darkpack/lists/phone_contacts.dm
+++ b/code/_globalvars/darkpack/lists/phone_contacts.dm
@@ -15,6 +15,11 @@ GLOBAL_LIST_EMPTY(supply_network)
GLOBAL_LIST_EMPTY(vampire_leader_network)
GLOBAL_LIST_EMPTY(endron_network)
GLOBAL_LIST_EMPTY(society_network)
+GLOBAL_LIST_EMPTY(civilian_network)
+GLOBAL_LIST_EMPTY(police_network)
+GLOBAL_LIST_EMPTY(medical_network)
+GLOBAL_LIST_EMPTY(garou_network)
+GLOBAL_LIST_EMPTY(sabbat_network)
#define MILLENIUM_TOWER_NETWORK 1
#define LASOMBRA_NETWORK 2
@@ -26,6 +31,11 @@ GLOBAL_LIST_EMPTY(society_network)
#define VAMPIRE_LEADER_NETWORK 8
#define ENDRON_NETWORK 9
#define SOCIETY_OF_LEOPOLD_NETWORK 10
+#define CIVILIAN_NETWORK 11
+#define POLICE_NETWORK 12
+#define MEDICAL_NETWORK 13
+#define GAROU_NETWORK 14
+#define SABBAT_NETWORK 15
// An indexed list of all the different phone networks that connect the phones that are part of them together.
GLOBAL_LIST_INIT(contact_networks, alist(
@@ -39,4 +49,9 @@ GLOBAL_LIST_INIT(contact_networks, alist(
VAMPIRE_LEADER_NETWORK = GLOB.vampire_leader_network,
ENDRON_NETWORK = GLOB.endron_network,
SOCIETY_OF_LEOPOLD_NETWORK = GLOB.society_network,
+ CIVILIAN_NETWORK = GLOB.civilian_network,
+ POLICE_NETWORK = GLOB.police_network,
+ MEDICAL_NETWORK = GLOB.medical_network,
+ GAROU_NETWORK = GLOB.garou_network,
+ SABBAT_NETWORK = GLOB.sabbat_network,
))
diff --git a/code/_globalvars/lists/girder_wall_recipes.dm b/code/_globalvars/lists/girder_wall_recipes.dm
index 75c9120d07fa..5e7b11bc1f7a 100644
--- a/code/_globalvars/lists/girder_wall_recipes.dm
+++ b/code/_globalvars/lists/girder_wall_recipes.dm
@@ -14,6 +14,9 @@ GLOBAL_LIST_INIT(material_girder_wall_recipes, init_material_girder_wall_recipes
/turf/closed/wall/mineral/diamond,
/turf/closed/wall/mineral/bananium,
/turf/closed/wall/mineral/sandstone,
+ /turf/closed/wall/mineral/sandstone/wall_fill,
+ /turf/closed/wall/mineral/sandstone/ornate,
+ /turf/closed/wall/mineral/sandstone/basalt,
/turf/closed/wall/mineral/uranium,
/turf/closed/wall/mineral/plasma,
/turf/closed/wall/mineral/wood,
@@ -22,6 +25,12 @@ GLOBAL_LIST_INIT(material_girder_wall_recipes, init_material_girder_wall_recipes
/turf/closed/wall/mineral/iron,
/turf/closed/wall/mineral/snow,
/turf/closed/wall/mineral/abductor,
+ /turf/closed/wall/mineral/bone,
+ /turf/closed/wall/mineral/runite,
+ /turf/closed/wall/mineral/adamantine,
+ /turf/closed/wall/mineral/metalhydrogen,
+ /turf/closed/wall/mineral/hauntium,
+ /turf/closed/wall/mineral/mythril,
/turf/closed/wall/mineral/titanium,
/turf/closed/wall/mineral/plastitanium,
/turf/closed/wall/mineral/plastitanium/wall_fill,
@@ -40,6 +49,9 @@ GLOBAL_LIST_INIT(material_girder_wall_recipes, init_material_girder_wall_recipes
/obj/structure/falsewall/diamond,
/obj/structure/falsewall/bananium,
/obj/structure/falsewall/sandstone,
+ /obj/structure/falsewall/sandstone/wall_fill,
+ /obj/structure/falsewall/sandstone/ornate,
+ /obj/structure/falsewall/sandstone/basalt,
/obj/structure/falsewall/uranium,
/obj/structure/falsewall/plasma,
/obj/structure/falsewall/wood,
@@ -48,11 +60,16 @@ GLOBAL_LIST_INIT(material_girder_wall_recipes, init_material_girder_wall_recipes
/obj/structure/falsewall/abductor,
/obj/structure/falsewall/titanium,
/obj/structure/falsewall/plastitanium,
- /obj/structure/falsewall/plastitanium,
/obj/structure/falsewall/plastitanium/wall_fill,
/obj/structure/falsewall/plastitanium/darkpod,
/obj/structure/falsewall/plastitanium/redpod,
/obj/structure/falsewall/plastitanium/survival,
+ /obj/structure/falsewall/bone,
+ /obj/structure/falsewall/runite,
+ /obj/structure/falsewall/adamantine,
+ /obj/structure/falsewall/metalhydrogen,
+ /obj/structure/falsewall/hauntium,
+ /obj/structure/falsewall/mythril,
/obj/structure/falsewall/material,
),
tram_types = list(
diff --git a/code/_globalvars/lists/languages.dm b/code/_globalvars/lists/languages.dm
index da4d248959eb..194922471af5 100644
--- a/code/_globalvars/lists/languages.dm
+++ b/code/_globalvars/lists/languages.dm
@@ -13,26 +13,19 @@ GLOBAL_LIST_INIT(most_common_words_frequency, init_common_words_by_frequency())
/proc/init_language_prototypes()
var/list/lang_list = list()
- for(var/datum/language/lang_type as anything in typesof(/datum/language))
- if(!initial(lang_type.key))
- continue
-
+ for(var/datum/language/lang_type as anything in valid_subtypesof(/datum/language))
lang_list[lang_type] = new lang_type()
return lang_list
/proc/init_all_languages()
var/list/lang_list = list()
- for(var/datum/language/lang_type as anything in typesof(/datum/language))
- if(!initial(lang_type.key))
- continue
+ for(var/datum/language/lang_type as anything in valid_subtypesof(/datum/language))
lang_list += lang_type
return lang_list
/proc/init_language_types_by_name()
var/list/lang_list = list()
- for(var/datum/language/lang_type as anything in typesof(/datum/language))
- if(!initial(lang_type.key))
- continue
+ for(var/datum/language/lang_type as anything in valid_subtypesof(/datum/language))
lang_list[initial(lang_type.name)] = lang_type
return lang_list
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 498ef82f0c19..1f08b41d5015 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -89,8 +89,6 @@ GLOBAL_LIST_EMPTY(roundstart_station_mechcharger_areas)
GLOBAL_LIST_INIT(prototype_organs, typecacheof(list(
/obj/item/organ,
/obj/item/organ/wings,
- /obj/item/organ/wings/functional,
- /obj/item/organ/wings/functional/moth,
/obj/item/organ/cyberimp,
/obj/item/organ/cyberimp/brain,
/obj/item/organ/cyberimp/mouth,
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index 44ae6dace8fa..5ec60bca7f14 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -143,6 +143,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"STATION_TRAIT_UNNATURAL_ATMOSPHERE" = STATION_TRAIT_UNNATURAL_ATMOSPHERE,
"STATION_TRAIT_SPIKED_DRINKS" = STATION_TRAIT_SPIKED_DRINKS,
"STATION_TRAIT_SPAWN_WEAKPOINTS" = STATION_TRAIT_SPAWN_WEAKPOINTS,
+ "STATION_TRAIT_VENDING_SHORTAGE" = STATION_TRAIT_VENDING_SHORTAGE,
"STATION_TRAIT_BLACKOUT" = STATION_TRAIT_BLACKOUT, // DARKPACK EDIT ADD START - CITY_TRAITS
"STATION_TRAIT_COSPLAY_CONVENTION" = STATION_TRAIT_COSPLAY_CONVENTION,
"STATION_TRAIT_INFESTATION" = STATION_TRAIT_INFESTATION,
@@ -169,6 +170,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_DUCT_TAPE_UNREPAIRABLE" = TRAIT_DUCT_TAPE_UNREPAIRABLE,
"TRAIT_SPEED_POTIONED" = TRAIT_SPEED_POTIONED,
"TRAIT_WALLMOUNTED" = TRAIT_WALLMOUNTED,
+ "TRAIT_COZY_REVENANT_HOME" = TRAIT_COZY_REVENANT_HOME,
),
/mob = list(
"TRAIT_ABDUCTOR_HUD" = TRAIT_ABDUCTOR_HUD,
@@ -392,6 +394,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT,
"TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES,
"TRAIT_KNOW_ROBO_WIRES" = TRAIT_KNOW_ROBO_WIRES,
+ "TRAIT_LESSER_HUMANOID" = TRAIT_LESSER_HUMANOID,
"TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER,
"TRAIT_LIGHT_DRINKER" = TRAIT_LIGHT_DRINKER,
"TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP,
@@ -572,6 +575,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS,
"TRAIT_SILICON_ACCESS" = TRAIT_SILICON_ACCESS,
"TRAIT_SILICON_EMOTES_ALLOWED" = TRAIT_SILICON_EMOTES_ALLOWED,
+ "TRAIT_SIMIAN" = TRAIT_SIMIAN,
"TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE,
"TRAIT_SKITTISH" = TRAIT_SKITTISH,
"TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE,
@@ -661,7 +665,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_WAS_EVOLVED" = TRAIT_WAS_EVOLVED,
"TRAIT_WATER_ADAPTATION" = TRAIT_WATER_ADAPTATION,
"TRAIT_WATER_HATER" = TRAIT_WATER_HATER,
- "TRAIT_WEAK_SOUL" = TRAIT_WEAK_SOUL,
"TRAIT_WEB_SURFER" = TRAIT_WEB_SURFER,
"TRAIT_WEB_WEAVER" = TRAIT_WEB_WEAVER,
"TRAIT_WET_FOR_LONGER" = TRAIT_WET_FOR_LONGER,
@@ -702,6 +705,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_BLOODY_SUCKER" = TRAIT_BLOODY_SUCKER, // DARKPACK EDIT ADD
"TRAIT_BLUSH_OF_HEALTH" = TRAIT_BLUSH_OF_HEALTH, // DARKPACK EDIT ADD
"TRAIT_BOND_WITHIN_THE_MOUNTAIN" = TRAIT_BOND_WITHIN_THE_MOUNTAIN, // DARKPACK EDIT ADD - POWERS - (Visceratika)
+ "TRAIT_BRASSKNUCKLES" = TRAIT_BRASSKNUCKLES, // DARKPACK EDIT ADD - CLOTHES
"TRAIT_CALM_HEART" = TRAIT_CALM_HEART, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_CANNOT_RESIST_MIND_CONTROL" = TRAIT_CANNOT_RESIST_MIND_CONTROL, // DARKPACK EDIT ADD
"TRAIT_CAN_ENTER_TORPOR" = TRAIT_CAN_ENTER_TORPOR, // DARKPACK EDIT ADD
@@ -723,11 +727,11 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_FEEDING_RESTRICTION" = TRAIT_FEEDING_RESTRICTION, // DARKPACK EDIT ADD
"TRAIT_FERA_FLIGHT" = TRAIT_FERA_FLIGHT, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_FERA_FORMS" = TRAIT_FERA_FORMS, // DARKPACK EDIT ADD - WEREWOLF
- "TRAIT_POSSIBLE_WYRM" = TRAIT_POSSIBLE_WYRM, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_FERA_FUR" = TRAIT_FERA_FUR, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_FERA_RENOWN" = TRAIT_FERA_RENOWN, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_FORCED_EMOTION" = TRAIT_FORCED_EMOTION, // DARKPACK EDIT ADD - Melpominee
"TRAIT_FRENETIC_AURA" = TRAIT_FRENETIC_AURA, // DARKPACK EDIT ADD
+ "TRAIT_GAIA_CAERN_FRIEND" = TRAIT_GAIA_CAERN_FRIEND, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_GHOST_VISION" = TRAIT_GHOST_VISION, // DARKPACK EDIT ADD - POWERS - (Necromancy)
"TRAIT_GLOWING_EYES" = TRAIT_GLOWING_EYES, // DARKPACK EDIT ADD - MERITS_FLAWS - PHYSICAL FLAWS
"TRAIT_GOLD_WEAKNESS" = TRAIT_GOLD_WEAKNESS, // DARKPACK EDIT ADD - WEREWOLF - (corax)
@@ -762,12 +766,14 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_NO_EYE_CONTACT" = TRAIT_NO_EYE_CONTACT, // DARKPACK EDIT ADD
"TRAIT_NO_LYING_ANGLE" = TRAIT_NO_LYING_ANGLE, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_OBFUSCATED" = TRAIT_OBFUSCATED, // DARKPACK EDIT ADD
+ "TRAIT_OPENS_MOONGATES" = TRAIT_OPENS_MOONGATES, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_ORGANOVORE" = TRAIT_ORGANOVORE, // DARKPACK EDIT ADD - Nagaraja
"TRAIT_PAINFUL_VAMPIRE_KISS" = TRAIT_PAINFUL_VAMPIRE_KISS, // DARKPACK EDIT ADD
"TRAIT_PALE_AURA" = TRAIT_PALE_AURA, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_PASS_THROUGH_WALLS" = TRAIT_PASS_THROUGH_WALLS, // DARKPACK EDIT ADD
"TRAIT_PERMAFANGS" = TRAIT_PERMAFANGS, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_PIERCED_VEIL" = TRAIT_PIERCED_VEIL, // DARKPACK EDIT ADD - MERITS_FLAWS
+ "TRAIT_POSSIBLE_WYRM" = TRAIT_POSSIBLE_WYRM, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_PREY_EXCLUSION" = TRAIT_PREY_EXCLUSION, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_PROMETHEAN_CLAY" = TRAIT_PROMETHEAN_CLAY, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_RAZOR_CLAWS" = TRAIT_RAZOR_CLAWS, // DARKPACK EDIT ADD - WEREWOLF
@@ -810,7 +816,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_WEAK_WILLED" = TRAIT_WEAK_WILLED, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_WYRMTAINTED" = TRAIT_WYRMTAINTED, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_WYRMTAINTED_SPRITE" = TRAIT_WYRMTAINTED_SPRITE, // DARKPACK EDIT ADD - WEREWOLF
- "TRAIT_BRASSKNUCKLES" = TRAIT_BRASSKNUCKLES, // DARKPACK EDIT ADD - CLOTHES
+ "TRAIT_ANTHROPIC_TASTE" = TRAIT_ANTHROPIC_TASTE, //DARKPACK EDIT ADD - MERITS_FLAWS
),
/mob/living/carbon = list(
"TRAIT_BRAINLESS_CARBON" = TRAIT_BRAINLESS_CARBON,
@@ -827,11 +833,13 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_BAKEABLE" = TRAIT_BAKEABLE,
"TRAIT_BASIC_QUALITY_BAIT" = TRAIT_BASIC_QUALITY_BAIT,
"TRAIT_BLIND_TOOL" = TRAIT_BLIND_TOOL,
+ "TRAIT_BLUESPACE_INTERFERENCE" = TRAIT_BLUESPACE_INTERFERENCE,
"TRAIT_BYPASS_RANGED_ARMOR" = TRAIT_BYPASS_RANGED_ARMOR,
"TRAIT_CASTING_CLOTHING" = TRAIT_CASTING_CLOTHING,
"TRAIT_CONTRABAND_BLOCKER" = TRAIT_CONTRABAND_BLOCKER,
"TRAIT_CUSTOM_TAP_SOUND" = TRAIT_CUSTOM_TAP_SOUND,
- "TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT,
+ "TRAIT_DANGEROUS_EQUIP" = TRAIT_DANGEROUS_EQUIP,
+ "TRAIT_DANGEROUS_UNEQUIP" = TRAIT_DANGEROUS_UNEQUIP,
"TRAIT_EXAMINE_SKIP" = TRAIT_EXAMINE_SKIP,
"TRAIT_FIREDOOR_OPENER" = TRAIT_FIREDOOR_OPENER,
"TRAIT_FISHING_BAIT" = TRAIT_FISHING_BAIT,
@@ -867,6 +875,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_UNCOMPOSTABLE" = TRAIT_UNCOMPOSTABLE,
"TRAIT_UNIQUE_AQUARIUM_CONTENT" = TRAIT_UNIQUE_AQUARIUM_CONTENT,
"TRAIT_WIELDED" = TRAIT_WIELDED,
+ "TRAIT_ELEVATED_FLAME" = TRAIT_ELEVATED_FLAME, // DARKPACK EDIT ADD - TURF_FIRE
),
/obj/item/ammo_casing = list(
"TRAIT_DART_HAS_INSERT" = TRAIT_DART_HAS_INSERT,
diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm
index acafc5920a96..72ddcc7edcc1 100644
--- a/code/_globalvars/traits/admin_tooling.dm
+++ b/code/_globalvars/traits/admin_tooling.dm
@@ -291,6 +291,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG,
"TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS,
"TRAIT_SILICON_EMOTES_ALLOWED" = TRAIT_SILICON_EMOTES_ALLOWED,
+ "TRAIT_SIMIAN" = TRAIT_SIMIAN,
"TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE,
"TRAIT_SKITTISH" = TRAIT_SKITTISH,
"TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE,
@@ -352,7 +353,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_VORACIOUS" = TRAIT_VORACIOUS,
"TRAIT_WATER_ADAPTATION" = TRAIT_WATER_ADAPTATION,
"TRAIT_WATER_HATER" = TRAIT_WATER_HATER,
- "TRAIT_WEAK_SOUL" = TRAIT_WEAK_SOUL,
"TRAIT_WEB_SURFER" = TRAIT_WEB_SURFER,
"TRAIT_WEB_WEAVER" = TRAIT_WEB_WEAVER,
"TRAIT_WET_FOR_LONGER" = TRAIT_WET_FOR_LONGER,
@@ -396,6 +396,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_FERA_FUR" = TRAIT_FERA_FUR, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_FERA_RENOWN" = TRAIT_FERA_RENOWN, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_FRENETIC_AURA" = TRAIT_FRENETIC_AURA, // DARKPACK EDIT ADD
+ "TRAIT_GAIA_CAERN_FRIEND" = TRAIT_GAIA_CAERN_FRIEND, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_GHOST_VISION" = TRAIT_GHOST_VISION, // DARKPACK EDIT ADD - POWERS - (Necromancy)
"TRAIT_GLOWING_EYES" = TRAIT_GLOWING_EYES, // DARKPACK EDIT ADD - MERITS_FLAWS - PHYSICAL FLAWS
"TRAIT_GOLD_WEAKNESS" = TRAIT_GOLD_WEAKNESS, // DARKPACK EDIT ADD - WEREWOLF - (corax)
@@ -427,6 +428,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_NO_EYE_CONTACT" = TRAIT_NO_EYE_CONTACT, // DARKPACK EDIT ADD
"TRAIT_NO_LYING_ANGLE" = TRAIT_NO_LYING_ANGLE, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_OBFUSCATED" = TRAIT_OBFUSCATED, // DARKPACK EDIT ADD
+ "TRAIT_OPENS_MOONGATES" = TRAIT_OPENS_MOONGATES, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_PAINFUL_VAMPIRE_KISS" = TRAIT_PAINFUL_VAMPIRE_KISS, // DARKPACK EDIT ADD
"TRAIT_PALE_AURA" = TRAIT_PALE_AURA, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_PASS_THROUGH_WALLS" = TRAIT_PASS_THROUGH_WALLS, // DARKPACK EDIT ADD
@@ -469,7 +471,9 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
),
/obj/item = list(
"TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING,
- "TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT,
+ "TRAIT_BLUESPACE_INTERFERENCE" = TRAIT_BLUESPACE_INTERFERENCE,
+ "TRAIT_DANGEROUS_EQUIP" = TRAIT_DANGEROUS_EQUIP,
+ "TRAIT_DANGEROUS_UNEQUIP" = TRAIT_DANGEROUS_UNEQUIP,
"TRAIT_GERM_SENSITIVE" = TRAIT_GERM_SENSITIVE,
"TRAIT_HAUNTED" = TRAIT_HAUNTED,
"TRAIT_NO_STORAGE_INSERT" = TRAIT_NO_STORAGE_INSERT,
diff --git a/code/_onclick/hud/rendering/render_plate.dm b/code/_onclick/hud/rendering/render_plate.dm
index 09040a046218..49b3a2cf551b 100644
--- a/code/_onclick/hud/rendering/render_plate.dm
+++ b/code/_onclick/hud/rendering/render_plate.dm
@@ -121,7 +121,7 @@
if(!istype(mymob) || !mymob.canon_client?.prefs?.read_preference(/datum/preference/toggle/particle_weather))
return
- SSweather.particle_planemasters += src
+ SSweather.particle_planemasters[src] = TRUE
// Lobby HUDs, we don't care about weather during init anyways
if(!SSmapping.initialized)
@@ -138,6 +138,9 @@
/atom/movable/screen/plane_master/rendering_plate/particle_weather/proc/z_changed(datum/source, new_z)
SIGNAL_HANDLER
+ if(!SSweather.particle_planemasters[src])
+ return
+
if(!SSmapping.initialized)
return
diff --git a/code/controllers/subsystem/dynamic/dynamic.dm b/code/controllers/subsystem/dynamic/dynamic.dm
index 6afbfb8a6570..c7fc30312705 100644
--- a/code/controllers/subsystem/dynamic/dynamic.dm
+++ b/code/controllers/subsystem/dynamic/dynamic.dm
@@ -734,7 +734,7 @@ SUBSYSTEM_DEF(dynamic)
data += "\]\n"
else
data += "blacklisted_roles = \[\]\n"
- if(!istype(ruleset, /datum/dynamic_ruleset/latejoin) && !istype(ruleset, /datum/dynamic_ruleset/midround/from_living))
+ if(!istype(ruleset, /datum/dynamic_ruleset/latejoin))
if(islist(ruleset.min_antag_cap))
for(var/ruleset_min_antag_cap in ruleset.min_antag_cap)
data += "min_antag_cap.[ruleset_min_antag_cap] = [ruleset.min_antag_cap[ruleset_min_antag_cap]]\n"
diff --git a/code/controllers/subsystem/dynamic/dynamic_ruleset_midround.dm b/code/controllers/subsystem/dynamic/dynamic_ruleset_midround.dm
index 1b8c8d73e1fc..3671770dcee6 100644
--- a/code/controllers/subsystem/dynamic/dynamic_ruleset_midround.dm
+++ b/code/controllers/subsystem/dynamic/dynamic_ruleset_midround.dm
@@ -1113,16 +1113,6 @@
max_antag_cap = 1
repeatable = TRUE
-/datum/dynamic_ruleset/midround/from_living/set_config_value(nvar, nval)
- if(nvar == NAMEOF(src, min_antag_cap) || nvar == NAMEOF(src, max_antag_cap))
- return FALSE
- return ..()
-
-/datum/dynamic_ruleset/midround/from_living/vv_edit_var(var_name, var_value)
- if(var_name == NAMEOF(src, min_antag_cap) || var_name == NAMEOF(src, max_antag_cap))
- return FALSE
- return ..()
-
/datum/dynamic_ruleset/midround/from_living/collect_candidates()
return GLOB.alive_player_list
diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm
index 552943b07646..2809c92e3dff 100644
--- a/code/controllers/subsystem/economy.dm
+++ b/code/controllers/subsystem/economy.dm
@@ -62,6 +62,8 @@ SUBSYSTEM_DEF(economy)
var/temporary_total = 0
/// Determines how many ticks it takes to restock mail
var/ticks_per_mail = 2
+ /// Currently boosted exports
+ var/list/boosted_exports = list()
/datum/controller/subsystem/economy/Initialize()
//removes cargo from the split
@@ -109,6 +111,7 @@ SUBSYSTEM_DEF(economy)
station_target = max(round(temporary_total / max(bank_accounts_by_id.len * 2, 1)) + station_target_buffer, 1)
if(processing_part == ECON_PRICE_UPDATE_STEP)
+ update_boosted_exports()
if(!HAS_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING) && !price_update())
return
@@ -126,6 +129,16 @@ SUBSYSTEM_DEF(economy)
if(D.department_id == dep_id)
return D
+/// Pick X amount of random exports to boost in price for the tick
+/datum/controller/subsystem/economy/proc/update_boosted_exports()
+ boosted_exports.Cut()
+ // Don't randomize export values during unit tests or we'll get flakies
+#ifndef UNIT_TESTS
+ var/list/valid_exports = valid_typesof(/datum/export)
+ for (var/i in 1 to rand(EXPORT_BOOST_MIN_AMOUNT, EXPORT_BOOST_MAX_AMOUNT))
+ boosted_exports += pick_n_take(valid_exports)
+#endif
+
/**
* Departmental income payments are kept static and linear for every department, and paid out once every 5 minutes, as determined by MAX_GRANT_DPT.
* Iterates over every department account for the same payment.
diff --git a/code/controllers/subsystem/sprite_accessories.dm b/code/controllers/subsystem/sprite_accessories.dm
index b053136cb6f8..823e51de17b6 100644
--- a/code/controllers/subsystem/sprite_accessories.dm
+++ b/code/controllers/subsystem/sprite_accessories.dm
@@ -102,6 +102,12 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
feature_list[FEATURE_TAIL_MONKEY] = INIT_ACCESSORY(/datum/sprite_accessory/tails/monkey)
feature_list[FEATURE_TAIL_XENO] = INIT_ACCESSORY(/datum/sprite_accessory/tails/xeno)
+ // DARKPACK EDIT ADD START - WEREWOLF
+ feature_list[FEATURE_FERA_HAIR(SPLAT_GAROU)] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/fera_feature/hair/garou)
+ feature_list[FEATURE_FERA_BODY(SPLAT_GAROU)] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/fera_feature/body/garou)
+ feature_list[FEATURE_FERA_CLOTHES(SPLAT_GAROU)] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/fera_feature/clothes/garou)
+ // DARKPACK EDIT ADD END
+
/// This proc just initializes all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name
/datum/controller/subsystem/accessories/proc/init_hair_gradients()
hair_gradients_list = list()
diff --git a/code/datums/actions/action.dm b/code/datums/actions/action.dm
index b7dc4c6848e3..60b6271cd85f 100644
--- a/code/datums/actions/action.dm
+++ b/code/datums/actions/action.dm
@@ -134,14 +134,14 @@
viewers = list()
UnregisterSignal(remove_from, COMSIG_MOB_KEYDOWN)
- if(isnull(owner))
+ if(isnull(remove_from))
return
- SEND_SIGNAL(src, COMSIG_ACTION_REMOVED, owner)
- SEND_SIGNAL(owner, COMSIG_MOB_REMOVED_ACTION, src)
- UnregisterSignal(owner, COMSIG_QDELETING)
+ SEND_SIGNAL(src, COMSIG_ACTION_REMOVED, remove_from)
+ SEND_SIGNAL(remove_from, COMSIG_MOB_REMOVED_ACTION, src)
+ UnregisterSignal(remove_from, COMSIG_QDELETING)
// Clean up our check_flag signals
- UnregisterSignal(owner, list(
+ UnregisterSignal(remove_from, list(
COMSIG_LIVING_SET_BODY_POSITION,
COMSIG_MOB_STATCHANGE,
COMSIG_MOVABLE_MOVED,
@@ -155,7 +155,7 @@
SIGNAL_REMOVETRAIT(TRAIT_MAGICALLY_PHASED),
))
- if(target == owner)
+ if(target == remove_from)
RegisterSignal(target, COMSIG_QDELETING, PROC_REF(clear_ref))
if (owner == remove_from)
owner = null
diff --git a/code/datums/actions/items/flight.dm b/code/datums/actions/items/flight.dm
index 42b56657a09a..90cd7c1488a9 100644
--- a/code/datums/actions/items/flight.dm
+++ b/code/datums/actions/items/flight.dm
@@ -35,9 +35,9 @@
)
/datum/action/item_action/toggle_flight/Remove(mob/remove_from)
- . = ..()
if(HAS_TRAIT_FROM(remove_from, TRAIT_MOVE_FLOATING, SHOES_TRAIT))
switch_flight()
+ return ..()
/datum/action/item_action/toggle_flight/do_effect(trigger_flags)
if(!ishuman(owner))
diff --git a/code/datums/ai/basic_mobs/targeting_strategies/slime_food.dm b/code/datums/ai/basic_mobs/targeting_strategies/slime_food.dm
index 8f63df2315c7..def6c51ae0e1 100644
--- a/code/datums/ai/basic_mobs/targeting_strategies/slime_food.dm
+++ b/code/datums/ai/basic_mobs/targeting_strategies/slime_food.dm
@@ -38,7 +38,7 @@
if(controller.blackboard[BB_SLIME_HUNGER_LEVEL] == SLIME_HUNGER_STARVING && controller.blackboard[BB_SLIME_RABID])
return can_see(hunter, candidate, vision_range)
- if(islarva(candidate) || ismonkey(candidate) || ishuman(candidate) || isalienadult(candidate))
+ if(isalien(candidate) || ishuman(candidate))
return can_see(hunter, candidate, vision_range)
return FALSE
diff --git a/code/datums/ai/generic_behaviors/maintain_distance.dm b/code/datums/ai/generic_behaviors/maintain_distance.dm
index 0f48cc359cb4..8daf7d8c31ec 100644
--- a/code/datums/ai/generic_behaviors/maintain_distance.dm
+++ b/code/datums/ai/generic_behaviors/maintain_distance.dm
@@ -10,6 +10,8 @@
var/max_dist_key = BB_RANGED_SKIRMISH_MAX_DISTANCE
/// Movement type to use while approaching a target that's too far. Null falls back to the controller's default movement type. Reset on finish.
var/approach_movement_type = null
+ /// Should we keep facing the target while retreating?
+ var/face_target = TRUE
/datum/bt_node/ai_behavior/maintain_distance/setup(datum/ai_controller/controller)
var/atom/target = controller.blackboard[target_key]
@@ -57,7 +59,8 @@
/datum/bt_node/ai_behavior/maintain_distance/proc/retreat(datum/ai_controller/controller, atom/target, minimum_distance)
controller.change_ai_movement_type(/datum/ai_movement/basic_avoidance/backstep)
var/mob/pawn = controller.pawn
- pawn.face_atom(target)
+ if(face_target)
+ pawn.face_atom(target)
var/turf/next_step = get_step_away(pawn, target)
if(!isnull(next_step) && !next_step.is_blocked_turf(exclude_mobs = TRUE))
controller.ai_movement.start_moving_towards(controller, next_step, 0, controller.movement_delay * 2)
diff --git a/code/datums/ai/monkey/monkey_bt_nodes.dm b/code/datums/ai/monkey/monkey_bt_nodes.dm
index 3c294ce7f75f..49cd364b4d76 100644
--- a/code/datums/ai/monkey/monkey_bt_nodes.dm
+++ b/code/datums/ai/monkey/monkey_bt_nodes.dm
@@ -344,7 +344,7 @@
for(var/mob/living/carbon/human/human_mob in oview(5, living_pawn))
if(istype(human_mob.mind?.assigned_role, /datum/job/bartender))
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED // my boss is on duty!
- if(IS_UNCONSCIOUS_OR_CRIT(human_mob) || ismonkey(human_mob))
+ if(IS_UNCONSCIOUS_OR_CRIT(human_mob) || HAS_TRAIT(human_mob, TRAIT_LESSER_HUMANOID))
continue
if(!human_mob.get_empty_held_indexes())
continue
diff --git a/code/datums/beam.dm b/code/datums/beam.dm
index e690536a15c3..7a1ca50529f7 100644
--- a/code/datums/beam.dm
+++ b/code/datums/beam.dm
@@ -22,6 +22,8 @@
var/icon
///icon state of the main segments of the beam
var/icon_state = ""
+ ///Our beam's alpha
+ var/alpha = 255
///The beam will qdel if it's longer than this many tiles.
var/max_distance = 0
///the objects placed in the elements list
@@ -30,8 +32,10 @@
var/obj/effect/ebeam/visuals
///The color of the beam we're drawing.
var/beam_color
- ///If we use an emissive appearance
- var/emissive = TRUE
+ ///If we use an emissive appearance, and if so, what type?
+ var/emissive = EMISSIVE_NO_BLOOM
+ ///Alpha (strength) of our emissive
+ var/emissive_alpha = 255
/// If FALSE, redraws snap per update instead of using animate() interpolation.
var/animate = TRUE
/// If set will be used instead of origin's pixel_x in offset calculations
@@ -83,21 +87,25 @@
beam_type = /obj/effect/ebeam,
beam_color = null,
emissive = TRUE,
+ emissive_alpha = 255,
animate = TRUE,
override_origin_pixel_x = null,
override_origin_pixel_y = null,
override_target_pixel_x = null,
override_target_pixel_y = null,
- beam_layer = ABOVE_ALL_MOB_LAYER
+ beam_layer = ABOVE_ALL_MOB_LAYER,
+ alpha = 255,
)
src.origin = origin
src.target = target
src.icon = icon
src.icon_state = icon_state
+ src.alpha = alpha
src.max_distance = max_distance
src.beam_type = beam_type
src.beam_color = beam_color
src.emissive = emissive
+ src.emissive_alpha = emissive_alpha
src.animate = animate
src.override_origin_pixel_x = override_origin_pixel_x
src.override_origin_pixel_y = override_origin_pixel_y
@@ -314,6 +322,8 @@
final_y += Pixel_y > 0 ? round(Pixel_y/32) : ceil(Pixel_y/32)
Pixel_y %= 32
segment.forceMove(locate(final_x, final_y, segment.z))
+ segment.alpha = alpha
+ segment.layer = beam_layer
var/new_pixel_x = origin_px + Pixel_x
var/new_pixel_y = origin_py + Pixel_y
if(animate_time)
@@ -326,7 +336,7 @@
// Segments past the old beam's end fade in instead of popping.
if(N >= old_length)
segment.alpha = 0
- animate(segment, alpha = 255, time = animate_time, flags = ANIMATION_PARALLEL)
+ animate(segment, alpha = alpha, time = animate_time, flags = ANIMATION_PARALLEL)
if(animate_rotation)
animate(segment, pixel_x = new_pixel_x, pixel_y = new_pixel_y, transform = rot_matrix, time = animate_time, flags = ANIMATION_PARALLEL)
else
@@ -335,7 +345,7 @@
segment.pixel_x = new_pixel_x
segment.pixel_y = new_pixel_y
if(emissive)
- segment.add_overlay(emissive_appearance(terminal_icon ? terminal_icon : icon, terminal_icon ? "" : icon_state, segment, alpha = segment.alpha))
+ segment.add_overlay(emissive_appearance(terminal_icon ? terminal_icon : icon, terminal_icon ? "" : icon_state, segment, alpha = segment.alpha * emissive_alpha / 255, effect_type = emissive))
elements = new_elements
// Fade out extra segments before deleting them so shrinking the beam does not pop the tail.
@@ -418,6 +428,7 @@
override_target_pixel_x = null,
override_target_pixel_y = null,
beam_layer = ABOVE_ALL_MOB_LAYER,
+ alpha = 255,
icon_state_variants = 1
)
. = ..()
@@ -601,13 +612,15 @@
icon_state_variants = 0,
glide_seed = null,
glide_time = 0,
+ alpha = 255,
+ emissive_alpha = 255,
)
var/datum/beam/newbeam
if(icon_state_variants <= 0)
- newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type, beam_color, emissive, animate, override_origin_pixel_x, override_origin_pixel_y, override_target_pixel_x, override_target_pixel_y, layer)
+ newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type, beam_color, emissive, emissive_alpha, animate, override_origin_pixel_x, override_origin_pixel_y, override_target_pixel_x, override_target_pixel_y, layer, alpha)
else
- newbeam = new /datum/beam/varied(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type, beam_color, emissive, animate, override_origin_pixel_x, override_origin_pixel_y, override_target_pixel_x, override_target_pixel_y, layer, icon_state_variants)
+ newbeam = new /datum/beam/varied(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type, beam_color, emissive, emissive_alpha, animate, override_origin_pixel_x, override_origin_pixel_y, override_target_pixel_x, override_target_pixel_y, layer, alpha, icon_state_variants)
// Seed the glide before Start()'s first Draw() runs (INVOKE_ASYNC runs it synchronously here since
// Draw() never sleeps), so a rebuilt beam animates from its predecessor instead of snapping.
newbeam.inherit_glide(glide_seed, glide_time)
diff --git a/code/datums/bodypart_overlays/texture_bodypart_overlay.dm b/code/datums/bodypart_overlays/texture_bodypart_overlay.dm
index e60f663d9a5b..3750b32b578a 100644
--- a/code/datums/bodypart_overlays/texture_bodypart_overlay.dm
+++ b/code/datums/bodypart_overlays/texture_bodypart_overlay.dm
@@ -5,7 +5,7 @@
/// icon state for the texture
var/texture_icon_state
/// Cache the icon so we dont have to make a new one each time
- var/cached_texture_icon
+ VAR_FINAL/icon/cached_texture_icon
/// Priority of this texture - all textures with a lower priority will not be rendered
var/overlay_priority = 0
@@ -48,3 +48,96 @@
texture_icon_state = "fishscale"
texture_icon = 'icons/mob/human/textures.dmi'
overlay_priority = BODYPART_OVERLAY_FISH_INFUSION
+
+/datum/bodypart_texture/mesh
+ texture_icon_state = "mesh_mask"
+ texture_icon = 'icons/mob/clothing/tail_suit_mask.dmi'
+ overlay_priority = BODYPART_OVERLAY_MESH
+ /// Icon state for displacement map that comes with the texture
+ var/displacement_icon_state = "mesh_mask_displacement"
+ /// Icon file for the displacement map that comes with the texture.
+ var/displacement_icon = 'icons/mob/clothing/tail_suit_mask.dmi'
+ /// Cache the displacement icon so we dont have to make a new one each time
+ VAR_FINAL/icon/cached_displacement_icon
+
+ /// Icon state for the lighting map that comes with the texture.
+ var/lighting_icon_state = "mesh_mask_lighting"
+ /// Icon file for the lighting map that comes with the texture.
+ var/lighting_icon = 'icons/mob/clothing/tail_suit_mask.dmi'
+ /// Cache the lighting icon so we dont have to make a new one each time
+ VAR_FINAL/icon/cached_lighting_icon
+
+ /// Color used for the outline filter
+ var/outline_color = "#080808"
+
+/datum/bodypart_texture/mesh/New()
+ . = ..()
+ cached_displacement_icon = icon(displacement_icon, displacement_icon_state)
+ cached_lighting_icon = icon(lighting_icon, lighting_icon_state)
+
+/datum/bodypart_texture/mesh/modify_bodypart_appearance(image/appearance)
+ if(!should_modify(appearance))
+ return
+
+ . = ..()
+ // adds a displacement map so the outline lines up with the bottom of the sprite
+ appearance.add_filter("displacement", 2, displacement_map_filter(cached_displacement_icon, size = 1))
+ // adds an outline so the texture doesn't end abruptly
+ appearance.add_filter("outline", 3, outline_filter(1, outline_color, OUTLINE_SHARP))
+ // adds a bit of lighting to make the texture look less flat
+ appearance.add_filter("lighting", 4, layering_filter(cached_lighting_icon, blend_mode = BLEND_MULTIPLY))
+ // forces white (blends better with the texture)
+ appearance.color = COLOR_WHITE
+
+/datum/bodypart_texture/mesh/proc/should_modify(image/appearance)
+ // only apply to other mutant bodyparts. we filter by layer which is *absolutely* not ideal, but hey, work with what you got
+ var/appearance_layer = abs(appearance.layer)
+ return appearance_layer == BODY_ADJ_LAYER || appearance_layer == BODY_FRONT_LAYER || appearance_layer == BODY_BEHIND_LAYER
+
+/datum/bodypart_texture/mesh/black
+ texture_icon_state = "mesh_mask"
+ outline_color = "#080808"
+
+/datum/bodypart_texture/mesh/white
+ texture_icon_state = "mesh_mask_white"
+ outline_color = "#B2B2B2"
+
+/datum/bodypart_texture/mesh/biosuit
+ texture_icon_state = "mesh_mask_biosuit"
+ outline_color = "#747182"
+
+/datum/bodypart_texture/mesh/biosuit_dark
+ texture_icon_state = "mesh_mask_biosuit_dark"
+ outline_color = "#514F5B"
+
+/datum/bodypart_texture/mesh/bombsuit
+ texture_icon_state = "mesh_mask_bombsuit"
+ outline_color = "#897B51"
+
+/datum/bodypart_texture/mesh/bombsuit_white
+ texture_icon_state = "mesh_mask_bombsuit_white"
+ outline_color = "#A58975"
+
+/datum/bodypart_texture/mesh/bombsuit_red
+ texture_icon_state = "mesh_mask_bombsuit_red"
+ outline_color = "#511D19"
+
+/datum/bodypart_texture/mesh/firesuit
+ texture_icon_state = "mesh_mask_firesuit"
+ outline_color = "#262A33"
+
+/datum/bodypart_texture/mesh/drake
+ texture_icon_state = "mesh_mask_drake"
+ outline_color = "#2B1B17"
+
+/datum/bodypart_texture/mesh/cult
+ texture_icon_state = "mesh_mask_cult"
+ outline_color = "#413F3B"
+
+/datum/bodypart_texture/mesh/heretic
+ texture_icon_state = "mesh_mask_heretic"
+ outline_color = "#270B08"
+
+/datum/bodypart_texture/mesh/space
+ texture_icon_state = "mesh_mask_space"
+ outline_color = "#1F1F1F"
diff --git a/code/datums/components/anomalock_module.dm b/code/datums/components/anomalock_module.dm
index 5dada406af92..289f1076b8f2 100644
--- a/code/datums/components/anomalock_module.dm
+++ b/code/datums/components/anomalock_module.dm
@@ -20,10 +20,10 @@
src.pre_insert_callback = pre_insert_callback
core_insert_callback = insert_callback
core_remove_callback = remove_callback
- if(!(prebuilt && length(anomaly_types)))
+ if(!prebuilt || !length(anomaly_types))
return
var/obj/item/assembly/signaler/anomaly/core_type = pick(anomaly_types)
- core = new core_type(parent)
+ insert_core(parent, null, new core_type(parent), null)
/datum/component/anomaly_locked_module/Destroy(force)
QDEL_NULL(core)
@@ -69,12 +69,13 @@
return callback_return
return insert_core(source, user, tool, modifiers)
-/datum/component/anomaly_locked_module/proc/insert_core(obj/item/mod/module/source, mob/living/user, obj/item/tool, list/modifiers)
- if(!user.transferItemToLoc(tool, source))
+/datum/component/anomaly_locked_module/proc/insert_core(obj/item/mod/module/source, mob/living/user, obj/item/new_core, list/modifiers)
+ if(user && !user.transferItemToLoc(new_core, source))
return ITEM_INTERACT_FAILURE
- core = tool
- source.balloon_alert(user, "core inserted")
- playsound(source, 'sound/machines/click.ogg', 30, TRUE)
+ core = new_core
+ if(user)
+ source.balloon_alert(user, "core inserted")
+ playsound(source, 'sound/machines/click.ogg', 30, TRUE)
source.update_appearance(UPDATE_ICON_STATE)
if(core_insert_callback)
if(istype(core_insert_callback, /datum/callback))
diff --git a/code/datums/components/candela_node.dm b/code/datums/components/candela_node.dm
new file mode 100644
index 000000000000..6d70b3455250
--- /dev/null
+++ b/code/datums/components/candela_node.dm
@@ -0,0 +1,461 @@
+/// Component that handles stationary node behavior for the Candela mining navigation network
+/datum/component/candela_node
+ /// Network we're connected to
+ var/datum/mining_beacon_network/network = null
+ /// List of beam visuals we're using for connections
+ var/list/beam_visuals = list()
+ /// X offset for our beam connection point
+ var/connection_pixel_x = null
+ /// Y offset for our beam connection point
+ var/connection_pixel_y = null
+ /// Is this node a valid network power source? If yes, what type?
+ var/power_flags = NONE
+ /// Can this node be teleported to using fultons?
+ var/fulton_point = FALSE
+
+/datum/component/candela_node/Initialize(datum/mining_beacon_network/new_network = null, datum/candela_item_handler/deployer = null, connection_pixel_x = null, connection_pixel_y = null, power_flags = NONE, fulton_point = FALSE)
+ . = ..()
+ if (!ismovable(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ src.connection_pixel_x = connection_pixel_x
+ src.connection_pixel_y = connection_pixel_y
+ src.power_flags = power_flags
+ src.fulton_point = fulton_point
+
+ set_network(new_network)
+ if (!QDELETED(deployer))
+ deployer.set_network(network, src)
+
+/datum/component/candela_node/Destroy(force)
+ set_network(null, update = FALSE)
+ return ..()
+
+/datum/component/candela_node/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(on_item_interaction))
+ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved))
+ RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
+ RegisterSignal(parent, COMSIG_ATOM_MOD_MODULE_USED, PROC_REF(on_module_used))
+
+/datum/component/candela_node/proc/on_examine(atom/movable/source, mob/viewer, list/examine_list)
+ SIGNAL_HANDLER
+
+ examine_list += span_notice("[source.p_Theyre()] a \"Candela\" mining navigation node, capable of syncronizing various prospecting machinery and equipment, and repelling hostile fauna.")
+ if (power_flags & CANDELA_NETWORK_BOOSTED)
+ examine_list += span_notice("[source.p_They()] additionally act[source.p_s()] as an energy booster for the network, [power_flags & CANDELA_NETWORK_POWERED ? "keeping all connected beacons and equipment active and " : ""]increasing ore vent outputs.")
+ else if (power_flags & CANDELA_NETWORK_POWERED)
+ examine_list += span_notice("[source.p_They()] additionally act[source.p_s()] as a power source for the network, keeping all connected beacons and equipment active.")
+ else
+ examine_list += span_notice("The network is currently [(network.powered & CANDELA_NETWORK_POWERED) ? "fully operational[(network.powered & CANDELA_NETWORK_BOOSTED) ? " and overclocked" : ""]" : "missing a power source"].")
+
+/datum/component/candela_node/proc/on_item_interaction(atom/movable/source, mob/living/user, obj/item/tool, list/modifiers)
+ SIGNAL_HANDLER
+
+ if (!istype(tool, /obj/item/stack/candela_beacon))
+ return NONE
+
+ var/obj/item/stack/candela_beacon/beacon = tool
+ beacon.handler.set_network(network, src)
+ beacon.balloon_alert(user, "network linked!")
+ return ITEM_INTERACT_SUCCESS
+
+/datum/component/candela_node/proc/on_module_used(atom/movable/source, obj/item/mod/module/module)
+ SIGNAL_HANDLER
+
+ if (!istype(module, /obj/item/mod/module/candela_spool))
+ return NONE
+
+ var/obj/item/mod/module/candela_spool/spool = module
+ if (!spool.mod.wearer.Adjacent(parent))
+ return NONE
+
+ spool.handler.set_network(network, src)
+ spool.mod.wearer.balloon_alert(spool.mod.wearer, "network linked!")
+ return COMPONENT_INTERRUPT_MODULE_USE
+
+/datum/component/candela_node/proc/set_network(datum/mining_beacon_network/new_network, merging = FALSE, update = TRUE, separating = FALSE)
+ if (network == new_network)
+ return
+
+ . = network
+ if (network && !separating && !merging)
+ network.remove_node(src)
+ network = new_network
+ // Before add_node, as network can change from merging
+ SEND_SIGNAL(parent, COMSIG_CANDELA_NODE_NETWORK_CHANGED, ., network)
+
+ if (network)
+ network.add_node(src, merging = merging)
+
+ if (update)
+ update_connections()
+
+/// Refresh visual connections of our node
+/// - keep_links: Forces a redraw of all beams rather than a full recalculation of all links
+/datum/component/candela_node/proc/update_connections(keep_links = FALSE)
+ if (!network)
+ QDEL_LIST_ASSOC_VAL(beam_visuals)
+ return
+
+ var/list/draw_to = null
+ var/our_index = network.linked_nodes.Find(src)
+#ifdef TESTING
+ var/atom/movable/as_atom = parent
+ as_atom.maptext = MAPTEXT("[our_index] - [GLOB.mining_beacon_networks.Find(network)]")
+#endif
+ if (keep_links)
+ draw_to = assoc_to_keys(beam_visuals)
+ QDEL_LIST_ASSOC_VAL(beam_visuals)
+ else
+ var/list/linked_to = network.linked_nodes[src]
+ draw_to = linked_to.Copy()
+ var/turf/our_turf = get_turf(parent)
+ for (var/datum/component/candela_node/link_node as anything in linked_to)
+ var/turf/link_turf = get_turf(link_node.parent)
+ var/link_index = network.linked_nodes.Find(link_node)
+ // Don't render connections to shared nodes if there's another one that's closer to them than us (in case of equal distance, use index)
+ for (var/datum/component/candela_node/shared_node as anything in (draw_to & link_node.beam_visuals))
+ var/our_dist = get_dist_euclidean(get_turf(shared_node.parent), our_turf)
+ var/link_dist = get_dist_euclidean(get_turf(shared_node.parent), link_turf)
+ if (our_dist > link_dist || our_dist == link_dist && link_index < our_index)
+ draw_to -= shared_node
+
+ for (var/lost_node, old_beam in beam_visuals - draw_to)
+ beam_visuals -= lost_node
+ qdel(old_beam)
+
+ var/atom/movable/movable_parent = parent
+ for (var/datum/component/candela_node/new_node as anything in draw_to - beam_visuals)
+ if (network.linked_nodes.Find(new_node) < our_index) // Older nodes draw connections to younger ones
+ continue
+ beam_visuals[new_node] = movable_parent.Beam(
+ new_node.parent,
+ "1-full",
+ 'icons/effects/beam.dmi',
+ beam_color = LIGHT_COLOR_MINING,
+ emissive = EMISSIVE_BLOOM,
+ override_origin_pixel_x = connection_pixel_x,
+ override_origin_pixel_y = connection_pixel_y,
+ override_target_pixel_x = new_node.connection_pixel_x,
+ override_target_pixel_y = new_node.connection_pixel_y,
+ emissive_alpha = (network.powered & CANDELA_NETWORK_BOOSTED) ? 255 : 192,
+ alpha = (network.powered & CANDELA_NETWORK_POWERED) ? 192 : 128
+ )
+
+// Costly, but should not be called often (if at all) as all nodes should be anchored
+/datum/component/candela_node/proc/on_moved(atom/movable/source, atom/old_loc, dir, forced, list/old_locs)
+ SIGNAL_HANDLER
+
+ var/list/located_nodes = list()
+ var/list/atoms_to_nodes = list()
+
+ for (var/datum/mining_beacon_network/network as anything in GLOB.mining_beacon_networks)
+ for (var/datum/component/candela_node/node as anything in network.linked_nodes)
+ atoms_to_nodes[node.parent] = node
+
+ // We use can_see rather than view() because view() is not a raycast and can end up putting beams through walls, as it sees around corners in a weird fasion
+ var/list/our_links = network.linked_nodes[src]
+ for (var/datum/component/candela_node/other_node as anything in our_links)
+ if (!can_see(parent, other_node.parent, MINING_BEACON_MAX_REACH) || !can_see(other_node.parent, parent, MINING_BEACON_MAX_REACH))
+ continue
+ located_nodes |= other_node
+
+ if (length(located_nodes))
+ // No nodes were cut, don't do anything
+ if (length(our_links) == length(located_nodes))
+ return
+ // Otherwise, cut ourselves from the network and try to link back to refresh connections or find another one
+ var/datum/mining_beacon_network/old_network = network
+ set_network(null)
+ set_network(old_network)
+ return
+
+ // Otherwise, go through all (nearby, can_see checks get_dist) nodes looking for matches
+ var/min_dist = MINING_BEACON_MAX_REACH + 1
+ var/datum/component/candela_node/secondary_node = null
+ for (var/atom/movable/thing as anything in atoms_to_nodes)
+ var/node_dist = get_dist_euclidean(thing, parent)
+ if (node_dist >= min_dist)
+ continue
+
+ if (!can_see(parent, thing, MINING_BEACON_MAX_REACH) || !can_see(thing, parent, MINING_BEACON_MAX_REACH))
+ continue
+
+ min_dist = node_dist
+ secondary_node = atoms_to_nodes[thing]
+
+ set_network(null)
+ if (secondary_node)
+ set_network(secondary_node.network)
+
+/// List of all mining beacon networks for easy connection lookups
+GLOBAL_LIST_EMPTY(mining_beacon_networks)
+
+/// Candela beacon network datum
+/datum/mining_beacon_network
+ /// List of all beacon nodes within our network (node -> its connections)
+ var/list/datum/component/candela_node/linked_nodes = list()
+ /// List of beacon items tracking our network
+ var/list/datum/candela_item_handler/linked_beacon_items = list()
+ /// List of mobs currently attached to the network via handler items for centralized movement tracking (mob -> all handlers on them)
+ var/list/mob/living/linked_mobs = list()
+ /// What types of power providers we have in the network
+ var/powered = NONE
+
+/datum/mining_beacon_network/New()
+ . = ..()
+ GLOB.mining_beacon_networks += src
+
+/datum/mining_beacon_network/Destroy(force)
+ linked_nodes.Cut()
+ for (var/datum/candela_item_handler/handler as anything in linked_beacon_items)
+ handler.locate_closest_network()
+ linked_beacon_items.Cut()
+ linked_mobs.Cut()
+ GLOB.mining_beacon_networks -= src
+ return ..()
+
+/// Refresh our power state, returns previous power state
+/datum/mining_beacon_network/proc/update_power()
+ . = powered
+ var/new_state = NONE
+ for (var/datum/component/candela_node/power_node as anything in linked_nodes)
+ new_state |= power_node.power_flags
+
+ set_powered_state(new_state)
+
+/datum/mining_beacon_network/proc/add_node(datum/component/candela_node/new_node, merging = FALSE)
+ if (linked_nodes[new_node])
+ return
+
+ linked_nodes[new_node] = list()
+ if (!(new_node.power_flags & powered))
+ set_powered_state(powered | new_node.power_flags)
+
+ if (merging)
+ return
+
+ var/list/all_nodes = list()
+ var/list/atoms_to_nodes = list()
+ for (var/datum/mining_beacon_network/network as anything in GLOB.mining_beacon_networks)
+ for (var/datum/component/candela_node/node as anything in network.linked_nodes)
+ all_nodes[node] = network
+ atoms_to_nodes[node.parent] = node
+
+ var/list/merged_networks = list()
+ var/list/need_updates = list(new_node)
+ for (var/atom/movable/thing in view(MINING_BEACON_MAX_REACH, new_node.parent))
+ var/datum/component/candela_node/actual_node = atoms_to_nodes[thing]
+ // Need a can_see check to avoid beams going through walls
+ if (!actual_node || actual_node == new_node || !can_see(thing, new_node.parent, MINING_BEACON_MAX_REACH) || !can_see(new_node.parent, thing, MINING_BEACON_MAX_REACH))
+ continue
+
+ if (linked_nodes[actual_node])
+ linked_nodes[new_node] |= actual_node
+ linked_nodes[actual_node] |= new_node
+ need_updates |= actual_node
+ continue
+
+ if (!all_nodes[actual_node])
+ continue
+
+ var/datum/mining_beacon_network/network = all_nodes[actual_node]
+ linked_nodes[new_node] |= actual_node
+ network.linked_nodes[actual_node] |= new_node
+ need_updates |= actual_node
+
+ merged_networks |= network
+
+ if (!length(merged_networks))
+ for (var/datum/component/candela_node/update_node as anything in need_updates)
+ update_node.update_connections()
+ return
+
+ // Merge ourselves into the closest network, then merge all other located networks into it as well
+ // Significantly reduces churn when placing new beacons
+ var/datum/mining_beacon_network/first_net = merged_networks[1]
+ first_net.merge_network(src)
+
+ for (var/datum/mining_beacon_network/network as anything in merged_networks - first_net)
+ first_net.merge_network(network)
+
+ for (var/datum/component/candela_node/update_node as anything in need_updates)
+ update_node.update_connections()
+
+/datum/mining_beacon_network/proc/merge_network(datum/mining_beacon_network/to_merge)
+ for (var/datum/component/candela_node/node as anything in to_merge.linked_nodes)
+ node.set_network(src, merging = TRUE, update = FALSE)
+
+ for (var/datum/candela_item_handler/beacon as anything in to_merge.linked_beacon_items)
+ beacon.set_network(src, merging = TRUE)
+
+ for (var/node, connections in to_merge.linked_nodes)
+ if (linked_nodes[node])
+ linked_nodes[node] |= connections
+ else
+ linked_nodes[node] = connections
+
+ linked_beacon_items |= to_merge.linked_beacon_items
+
+ for (var/datum/component/candela_node/node as anything in to_merge.linked_nodes)
+ node.update_connections()
+
+ qdel(to_merge)
+
+/datum/mining_beacon_network/proc/remove_node(datum/component/candela_node/node)
+ if (!linked_nodes[node])
+ return
+
+ if (length(linked_nodes) == 1)
+ qdel(src)
+ return
+
+ var/list/connections = linked_nodes[node]
+ if (length(connections) == 1) // End node, no need to run separation calculations
+ var/datum/component/candela_node/other_node = connections[1]
+ linked_nodes[other_node] -= node
+ linked_nodes -= node
+ other_node.update_connections()
+ // If this node was potentially powering us, check if we lost any power sources
+ if (node.power_flags & powered)
+ update_power()
+ return
+
+ linked_nodes -= node
+ for (var/datum/component/candela_node/other_node as anything in connections)
+ // Network cut?
+ if (linked_nodes[other_node])
+ linked_nodes[other_node] -= node
+
+ // If the network wasn't separated, just update connected nodes
+ // Otherwise, check_network_separation will handle updates for us
+ if (!check_network_separation(connections))
+ for (var/datum/component/candela_node/other_node as anything in connections)
+ other_node.update_connections()
+
+ // We might've lost more than one node from this
+ if (powered)
+ update_power()
+
+/datum/mining_beacon_network/proc/set_powered_state(new_power_state)
+ if (powered == new_power_state)
+ return
+ . = powered
+ powered = new_power_state
+ for (var/datum/component/candela_node/node as anything in linked_nodes)
+ node.update_connections(keep_links = TRUE)
+ SEND_SIGNAL(src, COMSIG_CANDELA_NETWORK_POWER_CHANGED, ., powered)
+
+/// Try to reassemble the network in case of possible separation
+/// Node that caused separation should already be removed from linked_nodes
+/// Returns FALSE if the network was not split, TRUE if it was
+/// - connections - List of all connections of the node that caused the separation.
+/datum/mining_beacon_network/proc/check_network_separation(list/connections)
+ var/list/new_networks = list()
+ var/list/polled_nodes = list()
+ for (var/datum/component/candela_node/primary_node as anything in connections)
+ // We've reached this node from another primary one, ignore
+ if (primary_node in polled_nodes)
+ continue
+
+ var/list/node_pool = list(primary_node)
+ var/index = 1
+ // Breadth-first parse all nodes connected from our primary node to see which ones it can connect to
+ while (index <= length(node_pool))
+ var/datum/component/candela_node/link_node = node_pool[index]
+ node_pool |= linked_nodes[link_node]
+ index += 1
+
+ var/list/new_net = list()
+ for (var/datum/component/candela_node/new_net_node as anything in node_pool)
+ new_net[new_net_node] = linked_nodes[new_net_node]
+
+ new_networks += list(new_net)
+ polled_nodes |= node_pool
+
+ // No separation occured, ignore
+ if (length(new_networks) <= 1)
+ return FALSE
+
+ linked_nodes = new_networks[1]
+ var/list/all_nodes = linked_nodes.Copy()
+ for (var/i in 2 to length(new_networks))
+ var/list/other_net = new_networks[i]
+ var/datum/mining_beacon_network/new_net = new()
+ new_net.linked_nodes = other_net
+ all_nodes |= other_net
+ for (var/datum/component/candela_node/other_node as anything in other_net)
+ // Doesn't actually run add_node code as we already "added" the nodes above, so we don't do pointless merging checks
+ other_node.set_network(new_net, update = FALSE, separating = TRUE)
+ new_net.update_power()
+
+ update_power()
+
+ // Force a full connection recalculation on all nodes in the network
+ for (var/datum/component/candela_node/node as anything in all_nodes)
+ node.update_connections()
+
+ for (var/datum/candela_item_handler/beacon as anything in linked_beacon_items)
+ beacon.locate_closest_network()
+ return TRUE
+
+/datum/mining_beacon_network/proc/link_mob(datum/candela_item_handler/handler, mob/living/new_user)
+ if (!linked_mobs[new_user])
+ linked_mobs[new_user] = list()
+ RegisterSignal(new_user, COMSIG_MOB_CLIENT_MOVED, PROC_REF(on_user_moved))
+ linked_mobs[new_user] |= handler
+
+/datum/mining_beacon_network/proc/unlink_mob(datum/candela_item_handler/handler, mob/living/user)
+ linked_mobs[user] -= handler
+ if (length(linked_mobs[user]))
+ return
+ linked_mobs -= user
+ UnregisterSignal(user, COMSIG_MOB_CLIENT_MOVED)
+
+/// A mob linked to the network moved, check if they still can connect to us and if not, check if any handlers object and then cut the connection
+/datum/mining_beacon_network/proc/on_user_moved(mob/living/source, direction, old_dir, atom/old_loc)
+ SIGNAL_HANDLER
+
+ var/turf/new_loc = source.loc
+ var/list/all_handlers = linked_mobs[source]
+ // Check if this was a valid step with no teleportation involved
+ if (!isturf(new_loc) || !isturf(old_loc) || get_step(old_loc, direction) != new_loc)
+ for (var/datum/candela_item_handler/handler as anything in all_handlers)
+ handler.set_network(null)
+ return
+
+ var/datum/component/candela_node/current_closest = null
+ var/datum/candela_item_handler/master = all_handlers[1]
+ var/datum/component/candela_node/closest_node = master.closest_node
+ if (closest_node && can_see(source, closest_node.parent, MINING_BEACON_MAX_REACH) && can_see(closest_node.parent, source, MINING_BEACON_MAX_REACH))
+ current_closest = closest_node
+
+ for (var/datum/component/candela_node/network_node as anything in linked_nodes)
+ if (network_node == closest_node || get_dist_euclidean(get_turf(network_node.parent), new_loc) > MINING_BEACON_MAX_REACH)
+ continue
+
+ if (current_closest && get_dist_euclidean(new_loc, get_turf(network_node.parent)) >= get_dist_euclidean(new_loc, get_turf(current_closest.parent)))
+ continue
+
+ // Need a can_see rather than viewers() to avoid beams going through walls
+ if (can_see(source, network_node.parent, MINING_BEACON_MAX_REACH) && can_see(network_node.parent, source, MINING_BEACON_MAX_REACH))
+ current_closest = network_node
+
+ if (current_closest)
+ if (current_closest == closest_node)
+ return
+ for (var/datum/candela_item_handler/handler as anything in all_handlers)
+ handler.set_closest_node(current_closest)
+ return
+
+ var/interrupt = FALSE
+ for (var/datum/candela_item_handler/handler as anything in all_handlers)
+ if (handler.on_network_cut_callback?.Invoke(old_loc, old_dir, interrupt))
+ interrupt = TRUE
+
+ if (interrupt)
+ return
+
+ for (var/datum/candela_item_handler/handler as anything in all_handlers)
+ handler.set_network(null)
+ source.balloon_alert(source, "connection lost!")
diff --git a/code/datums/components/crafting/melee_weapon.dm b/code/datums/components/crafting/melee_weapon.dm
index a86e3bf1523a..ca8c3eee92b8 100644
--- a/code/datums/components/crafting/melee_weapon.dm
+++ b/code/datums/components/crafting/melee_weapon.dm
@@ -136,6 +136,19 @@
category = CAT_WEAPON_MELEE
skill_dots_minimum = 4 // DARKPACK EDIT ADD - STORYTELER_STATS
+/datum/crafting_recipe/chainsaw/dual
+ name = "Double-ended chainsaw spear"
+ result = /obj/item/chainsaw/dual
+ reqs = list(
+ /datum/reagent/consumable/ethanol/beer = 20,
+ /obj/item/restraints/handcuffs/cable = 2,
+ /obj/item/chainsaw = 2,
+ /obj/item/stack/rods = 4,
+ /obj/item/stack/medical/wrap/sticky_tape = 2,
+ )
+ time = 5 SECONDS
+ category = CAT_WEAPON_MELEE
+
/datum/crafting_recipe/spear
name = "Spear"
result = /obj/item/spear
diff --git a/code/datums/components/crafting/robot.dm b/code/datums/components/crafting/robot.dm
index 5d1e0d6a3370..45b2c5ff4ef4 100644
--- a/code/datums/components/crafting/robot.dm
+++ b/code/datums/components/crafting/robot.dm
@@ -192,4 +192,18 @@
/obj/item/soulstone = 1,
)
category = CAT_ROBOT
+
+/datum/crafting_recipe/mod_core_candela
+ name = "MOD core (Candela)"
+ result = /obj/item/mod/core/candela
+ tool_behaviors = list(TOOL_SCREWDRIVER)
+ time = 10 SECONDS
+ reqs = list(
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/stack/rods = 2,
+ /obj/item/stack/sheet/glass = 1,
+ /obj/item/stack/sheet/bluespace_crystal = 1,
+ /obj/item/stack/candela_beacon = 5,
+ )
+ category = CAT_ROBOT
*/
diff --git a/code/datums/components/crafting/tiles.dm b/code/datums/components/crafting/tiles.dm
index 8344bb8163a5..16ef031ebf9b 100644
--- a/code/datums/components/crafting/tiles.dm
+++ b/code/datums/components/crafting/tiles.dm
@@ -28,3 +28,133 @@
)
category = CAT_TILES
*/
+
+/datum/crafting_recipe/ashforge
+ name = "Ash Forge Tile"
+ result = /obj/item/stack/tile/circuit/ash
+ reqs = list(
+ /obj/item/stack/sheet/mineral/plastitanium = 1,
+ /datum/reagent/ash = 80,
+ /datum/reagent/phosphorus = 80,
+ )
+ result_amount = 6
+ category = CAT_TILES
+
+/datum/crafting_recipe/silvergold
+ name = "Silver And Gold Tile"
+ result = /obj/item/stack/tile/silvergold
+ reqs = list(
+ /obj/item/stack/sheet/mineral/silver = 1,
+ /obj/item/stack/sheet/mineral/gold = 1,
+ )
+ result_amount = 8
+ category = CAT_TILES
+
+/datum/crafting_recipe/neo_tile
+ name = "Neo Tile"
+ result = /obj/item/stack/tile/neo/red
+ reqs = list(
+ /obj/item/stack/tile/iron = 4,
+ /datum/reagent/phosphorus = 20,
+ /datum/reagent/uranium/radium = 20,
+ /datum/reagent/fuel/oil = 10,
+ )
+ result_amount = 4
+ category = CAT_TILES
+
+/datum/crafting_recipe/goliath
+ name = "Goliath Carpet"
+ result = /obj/item/stack/tile/carpet/goliath
+ reqs = list(
+ /obj/item/stack/sheet/animalhide/goliath_hide = 1,
+ /obj/item/stack/sheet/sinew = 1,
+ )
+ result_amount = 4
+
+/datum/crafting_recipe/stained_glass_red
+ name = "Red Stained Glass"
+ reqs = list(
+ /obj/item/stack/tile/glass = 40,
+ /obj/item/stack/rods = 20,
+ /obj/item/toy/crayon/red = 1,
+ )
+ result = /obj/item/stack/tile/stained_glass/red
+ result_amount = 40
+ category = CAT_TILES
+
+/datum/crafting_recipe/stained_glass_orange
+ name = "Orange Stained Glass"
+ reqs = list(
+ /obj/item/stack/tile/glass = 40,
+ /obj/item/stack/rods = 20,
+ /obj/item/toy/crayon/orange = 1,
+ )
+ result = /obj/item/stack/tile/stained_glass/orange
+ result_amount = 40
+ category = CAT_TILES
+
+/datum/crafting_recipe/stained_glass_yellow
+ name = "Yellow Stained Glass"
+ reqs = list(
+ /obj/item/stack/tile/glass = 40,
+ /obj/item/stack/rods = 20,
+ /obj/item/toy/crayon/yellow = 1,
+ )
+ result = /obj/item/stack/tile/stained_glass/yellow
+ result_amount = 40
+ category = CAT_TILES
+
+/datum/crafting_recipe/stained_glass_green
+ name = "Green Stained Glass"
+ reqs = list(
+ /obj/item/stack/tile/glass = 40,
+ /obj/item/stack/rods = 20,
+ /obj/item/toy/crayon/green = 1,
+ )
+ result = /obj/item/stack/tile/stained_glass/green
+ result_amount = 40
+ category = CAT_TILES
+
+/datum/crafting_recipe/stained_glass_blue
+ name = "Blue Stained Glass"
+ reqs = list(
+ /obj/item/stack/tile/glass = 40,
+ /obj/item/stack/rods = 20,
+ /obj/item/toy/crayon/blue = 1,
+ )
+ result = /obj/item/stack/tile/stained_glass/blue
+ result_amount = 40
+ category = CAT_TILES
+
+/datum/crafting_recipe/stained_glass_purple
+ name = "Purple Stained Glass"
+ reqs = list(
+ /obj/item/stack/tile/glass = 40,
+ /obj/item/stack/rods = 20,
+ /obj/item/toy/crayon/purple = 1,
+ )
+ result = /obj/item/stack/tile/stained_glass/purple
+ result_amount = 40
+ category = CAT_TILES
+
+/datum/crafting_recipe/stained_glass_white
+ name = "White Stained Glass"
+ reqs = list(
+ /obj/item/stack/tile/glass = 40,
+ /obj/item/stack/rods = 20,
+ /obj/item/toy/crayon/white = 1,
+ )
+ result = /obj/item/stack/tile/stained_glass/white
+ result_amount = 40
+ category = CAT_TILES
+
+/datum/crafting_recipe/stained_glass_black
+ name = "Black Stained Glass"
+ reqs = list(
+ /obj/item/stack/tile/glass = 40,
+ /obj/item/stack/rods = 20,
+ /obj/item/toy/crayon/black = 1,
+ )
+ result = /obj/item/stack/tile/stained_glass/black
+ result_amount = 40
+ category = CAT_TILES
diff --git a/code/datums/components/face_decal.dm b/code/datums/components/face_decal.dm
index a9c15f0f8ead..b4437d0f6539 100644
--- a/code/datums/components/face_decal.dm
+++ b/code/datums/components/face_decal.dm
@@ -40,6 +40,7 @@
return
bodypart_overlay = new()
bodypart_overlay.set_layers(layers)
+ bodypart_overlay.offset_location = UPPER_BODY
if(carbon_parent.bodyshape & BODYSHAPE_SNOUTED) //stupid, but external organ bodytypes are not stored on the limb
bodypart_overlay.icon_state = "[icon_state]_lizard"
else if(my_head.bodyshape & BODYSHAPE_MONKEY)
diff --git a/code/datums/components/monitored_area.dm b/code/datums/components/monitored_area.dm
index 6797fe15f0ab..8850ccbdee48 100644
--- a/code/datums/components/monitored_area.dm
+++ b/code/datums/components/monitored_area.dm
@@ -58,7 +58,7 @@
LAZYNULL(motion_targets)
/datum/motion_group/proc/track_mob(mob/gain_mob)
- if(!ismob(gain_mob) || !LAZYLEN(motion_cameras))
+ if(!isliving(gain_mob) || !LAZYLEN(motion_cameras))
return
for(var/obj/machinery/camera/camera as anything in motion_cameras)
@@ -66,7 +66,7 @@
return //??
/datum/motion_group/proc/untrack_mob(mob/lost_mob)
- if(!ismob(lost_mob) || !LAZYLEN(motion_cameras))
+ if(!isliving(lost_mob) || !LAZYLEN(motion_cameras))
return
for(var/obj/machinery/camera/camera as anything in motion_cameras)
diff --git a/code/datums/components/revenant_prison.dm b/code/datums/components/revenant_prison.dm
index d5ba6529a626..9af28e417148 100644
--- a/code/datums/components/revenant_prison.dm
+++ b/code/datums/components/revenant_prison.dm
@@ -5,6 +5,8 @@
var/mob/living/basic/revenant/revenant
// ckey of the player who controlled it when it was imprisoned
var/old_ckey
+ // ability that is granted to revenants trapped in mirrors
+ var/datum/action/mirror_talk/mirror_talk
/datum/component/revenant_prison/Initialize(mob/living/basic/revenant/revenant, create_on_release = FALSE)
if(create_on_release)
@@ -19,6 +21,7 @@
revenant.forceMove(parent)
/datum/component/revenant_prison/Destroy()
+ QDEL_NULL(mirror_talk)
if(revenant?.client)
revenant.ghostize(can_reenter_corpse = FALSE)
QDEL_NULL(revenant)
@@ -30,38 +33,70 @@
playsound(source.loc, 'sound/effects/chemistry/ahaha.ogg', 100, TRUE)
release_revenant(source, cause = "[parent] breaking")
-/datum/component/revenant_prison/proc/release_revenant(obj/source, cause)
+/datum/component/revenant_prison/proc/on_dispersed()
SIGNAL_HANDLER
+ for (var/obj/new_home in view(3, get_turf(parent)))
+ if(!HAS_TRAIT(new_home, TRAIT_COZY_REVENANT_HOME))
+ continue
+ REMOVE_TRAIT(new_home, TRAIT_COZY_REVENANT_HOME, INNATE_TRAIT)
+ new_home.TakeComponent(src)
+ new_home.visible_message(span_revenwarning("A dismal moan echoes as particles of [parent] fall onto [new_home]!"))
+ log_game("A revenant was trapped inside [new_home]")
+ message_admins("A revenant was trapped inside [new_home] [ADMIN_JMP(new_home)]")
+ return
+
+/datum/component/revenant_prison/proc/on_residue_reform(obj/source)
+ SIGNAL_HANDLER
+ if(release_revenant(cause = "ectoplasm reforming"))
+ return COMPONENT_RESIDUE_REFORM_SUCCESS
+
+/datum/component/revenant_prison/proc/release_revenant(cause)
if(create_on_release)
revenant = new(get_turf(parent))
- if(!revenant)
- qdel(src)
- return
- message_admins("[revenant] [ADMIN_FLW(revenant)] has been released from [source] [ADMIN_JMP(source)]. Cause: [cause]")
- if(!revenant.reform(old_ckey))
- message_admins("Couldn't reform revenant upon release.")
+ if(mirror_talk)
+ mirror_talk.Remove(revenant)
+ var/mob/living/basic/revenant/our_guy = revenant
+ var/obj/old_home = parent
revenant = null
qdel(src)
+ if(!our_guy)
+ return FALSE
+ message_admins("[our_guy] [ADMIN_FLW(our_guy)] has been released from [old_home] [ADMIN_JMP(old_home)]. Cause: [cause]")
+ if(!our_guy.reform(old_ckey))
+ message_admins("Failed to reform [our_guy].")
+ return FALSE
+ return TRUE
/datum/component/revenant_prison/proc/shift_reflection(datum/source, obj/effect/abstract/reflection)
SIGNAL_HANDLER
apply_wibbly_filters(reflection)
/datum/component/revenant_prison/proc/on_parent_examine(datum/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
if(istype(parent, /obj/structure/mirror))
examine_list += span_revenwarning("The reflection is shifting and distorted.")
/datum/component/revenant_prison/RegisterWithParent()
RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_parent_examine))
RegisterSignal(parent, COMSIG_ATOM_BREAK, PROC_REF(on_parent_break))
- RegisterSignal(parent, COMSIG_REVENANT_RELEASE, PROC_REF(release_revenant))
+ RegisterSignal(parent, COMSIG_RESIDUE_DISPERSE, PROC_REF(on_dispersed))
+ RegisterSignal(parent, COMSIG_RESIDUE_REFORM, PROC_REF(on_residue_reform))
RegisterSignal(parent, COMSIG_REFLECTED_IMAGE_UPDATED, PROC_REF(shift_reflection))
/datum/component/revenant_prison/UnregisterFromParent()
UnregisterSignal(parent, COMSIG_ATOM_EXAMINE)
UnregisterSignal(parent, COMSIG_ATOM_BREAK)
- UnregisterSignal(parent, COMSIG_REVENANT_RELEASE)
+ UnregisterSignal(parent, COMSIG_RESIDUE_DISPERSE)
+ UnregisterSignal(parent, COMSIG_RESIDUE_REFORM)
UnregisterSignal(parent, COMSIG_REFLECTED_IMAGE_UPDATED)
/datum/component/revenant_prison/PostTransfer(datum/new_parent)
+ if(!revenant)
+ return
revenant.forceMove(new_parent)
+ if(istype(new_parent, /obj/structure/mirror))
+ mirror_talk = new
+ mirror_talk.Grant(revenant)
+ else
+ mirror_talk.Remove(revenant)
+ QDEL_NULL(mirror_talk)
diff --git a/code/datums/components/spawner.dm b/code/datums/components/spawner.dm
index 89281a40e9f3..9277d1fa9b48 100644
--- a/code/datums/components/spawner.dm
+++ b/code/datums/components/spawner.dm
@@ -1,29 +1,74 @@
+
+
/datum/component/spawner
/// Time to wait between spawns
var/spawn_time
- /// Maximum number of atoms we can have active at one time
- var/max_spawned
/// Visible message to show when something spawns
var/spawn_text
/// List of atom types to spawn, picked randomly
var/list/spawn_types
/// Faction to grant to mobs (only applies to mobs)
var/list/faction
- /// List of weak references to things we have already created
- var/list/spawned_things = list()
/// Callback to a proc that is called when a mob is spawned. Primarily used for sentient spawners.
var/datum/callback/spawn_callback
- /// How many mobs can we spawn maximum each time we try to spawn? (1 - max)
+
+ /// How many mobs can we spawn maximum each time we try to spawn? (1 - max) This number is applied
var/max_spawn_per_attempt
+ /// How many types of mobs, taken from spawn_types, will be spawned in every spawn attempt?
+ var/max_spawn_types_per_attempt
+ /// Maximum number of atoms we can have active at one time
+ var/max_spawned
+ /// List of weak references to things we have already created
+ var/list/spawned_things = list()
+
/// Distance from the spawner to spawn mobs
var/spawn_distance
/// Distance from the spawner to exclude mobs from spawning
var/spawn_distance_exclude
+
+ /// Visual Effect to spawn before the mobs spawn in that location.
+ var/obj/effect/temp_visual/effect
+ /// Audio path to play when spawning new mobs.
+ var/sound_effect
+ /// How long of a pause do we use between the effect spawning, and the mob spawning.
+ var/spawn_windup
+
+ /// What type of behavior does this spawner have?
+ var/spawner_logic
+ /// If using SPAWN_BY_WAVE_BEHAVIOR, how many waves should spawn before the spawner component shuts down?
+ var/max_waves
+ /// Number of waves of mobs that have been spawned. Only tracked with SPAWN_BY_WAVE_BEHAVIOR.
+ var/completed_waves = 0
+ /// Reference a mob that should it die, we'll stop the spawner component from functioning.
+ var/mob/linked_mob
+
COOLDOWN_DECLARE(spawn_delay)
-/datum/component/spawner/Initialize(spawn_types = list(), spawn_time = 30 SECONDS, max_spawned = 5, max_spawn_per_attempt = 1 , faction = list(FACTION_MINING), spawn_text = null, datum/callback/spawn_callback = null, spawn_distance = 1, spawn_distance_exclude = 0, initial_spawn_delay = 0 SECONDS)
+/datum/component/spawner/Initialize(
+ spawn_types = list(),
+ spawn_time = 30 SECONDS,
+ max_spawned = 5,
+ max_spawn_per_attempt = 1,
+ max_spawn_types_per_attempt = 1,
+ faction = list(FACTION_MINING),
+ spawn_text = null,
+ datum/callback/spawn_callback = null,
+ spawn_distance = 1,
+ spawn_distance_exclude = 0,
+ initial_spawn_delay = 0 SECONDS,
+ spawner_logic = SPAWN_CONTINUOUS_BEHAVIOR,
+ max_waves = 1,
+ effect = null,
+ sound_effect = null,
+ spawn_windup = 0.5 SECONDS,
+ linked_mob = null
+)
+ if(!isatom(parent))
+ return COMPONENT_INCOMPATIBLE
+
if (!islist(spawn_types))
CRASH("invalid spawn_types to spawn specified for spawner component!")
+
src.spawn_time = spawn_time
src.spawn_types = spawn_types
src.faction = faction
@@ -31,14 +76,24 @@
src.max_spawned = max_spawned
src.spawn_callback = spawn_callback
src.max_spawn_per_attempt = max_spawn_per_attempt
+ src.max_spawn_types_per_attempt = max_spawn_types_per_attempt
src.spawn_distance = spawn_distance
src.spawn_distance_exclude = spawn_distance_exclude
+ src.linked_mob = linked_mob
// If set, doesn't instantly spawn a creature when the spawner component is applied.
if(initial_spawn_delay)
COOLDOWN_START(src, spawn_delay, spawn_time)
+ src.spawner_logic = spawner_logic
+ if(spawner_logic == SPAWN_BY_WAVE_BEHAVIOR)
+ src.max_waves = max_waves
+ src.effect = effect
+ if(effect)
+ src.spawn_windup = spawn_windup
+ src.sound_effect = sound_effect
- RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(stop_spawning))
- RegisterSignal(parent, COMSIG_VENT_WAVE_CONCLUDED, PROC_REF(stop_spawning))
+ RegisterSignals(parent, list(COMSIG_QDELETING), PROC_REF(stop_spawning))
+ if(linked_mob)
+ RegisterSignals(linked_mob, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(stop_spawning))
START_PROCESSING((spawn_time < 2 SECONDS ? SSfastprocess : SSprocessing), src)
/datum/component/spawner/process()
@@ -47,9 +102,31 @@
/// Stop spawning mobs
/datum/component/spawner/proc/stop_spawning(force)
SIGNAL_HANDLER
-
STOP_PROCESSING(SSprocessing, src)
spawned_things = list()
+ SEND_SIGNAL(parent, COMSIG_VENT_WAVE_CONCLUDED)
+ qdel(src)
+
+/// Determine if we can spawn a mob based on the current spawn logic.
+/datum/component/spawner/proc/check_spawn_availability(mobs_spawned)
+ if(!spawner_logic)
+ CRASH("A spawner was created without selecting it's spawning logic!")
+
+ validate_references()
+ switch(spawner_logic)
+ if(SPAWN_CONTINUOUS_BEHAVIOR)
+ if(mobs_spawned >= max_spawned)
+ return FALSE
+ if(SPAWN_BY_WAVE_BEHAVIOR)
+ if(mobs_spawned) //If any mobs are still alive.
+ return FALSE
+ if(completed_waves >= max_waves)
+ stop_spawning()
+ return FALSE
+ completed_waves++
+ var/atom/spawner_atom = parent
+ spawner_atom.balloon_alert_to_viewers("wave [completed_waves]/[max_waves]")
+ return TRUE
/// Try to create a new mob
/datum/component/spawner/proc/try_spawn_mob()
@@ -57,49 +134,92 @@
return
if(!COOLDOWN_FINISHED(src, spawn_delay))
return
- validate_references()
var/spawned_total = length(spawned_things)
- if(spawned_total >= max_spawned)
+ if(!check_spawn_availability(spawned_total))
return
var/atom/spawner = parent
COOLDOWN_START(src, spawn_delay, spawn_time)
- var/chosen_mob_type = pick(spawn_types)
- var/adjusted_spawn_count = 1
- var/max_spawn_this_attempt = min(max_spawn_per_attempt, max_spawned - spawned_total)
- if (max_spawn_this_attempt > 1)
- adjusted_spawn_count = rand(1, max_spawn_this_attempt)
- for(var/i in 1 to adjusted_spawn_count)
- var/atom/created
- var/turf/picked_spot
-
- if(spawn_distance == 1)
- created = new chosen_mob_type(spawner.loc)
- else if(spawn_distance >= 1 && spawn_distance_exclude >= 1)
- picked_spot = pick(turf_peel(spawn_distance, spawn_distance_exclude, spawner.loc, view_based = TRUE))
- if(!picked_spot)
- picked_spot = pick(circle_range_turfs(spawner.loc, spawn_distance))
- if(picked_spot == spawner.loc)
- SEND_SIGNAL(spawner, COMSIG_SPAWNER_SPAWNED_DEFAULT)
- created = new chosen_mob_type(picked_spot)
- else if (spawn_distance >= 1)
+ var/list/local_spawn_types = spawn_types.Copy()
+ for(var/i in 1 to max_spawn_types_per_attempt)
+ var/chosen_mob_type = pick_n_take(local_spawn_types) //This way we avoid duplicates when spawning.
+ var/adjusted_spawn_count = 1
+ var/max_spawn_this_attempt = min(max_spawn_per_attempt, max_spawned - spawned_total)
+ if (max_spawn_this_attempt > 1)
+ adjusted_spawn_count = rand(1, max_spawn_this_attempt)
+ for(var/j in 1 to adjusted_spawn_count)
+ var/atom/created
+ var/turf/picked_spot = select_turf(spawner)
+ if(!effect || (effect && !spawn_windup))
+ created = new chosen_mob_type(picked_spot)
+ else
+ new effect(picked_spot)
+ addtimer(CALLBACK(src, PROC_REF(delayed_mob_spawn), picked_spot, chosen_mob_type, spawner), spawn_windup)
+
+ if(created)
+ setup_spawned_mob(created, spawner)
+ if(sound_effect)
+ playsound(parent, sound_effect, 40)
+
+/**
+ * This proc determines the tile that a spawner will place a mob on.
+ * @param: atom/spawner: typed definition of the parent, used to send a signal in case a mob spawns to the default position, as well as center our circles to pick turfs from.
+ */
+/datum/component/spawner/proc/select_turf(atom/spawner)
+ var/turf/picked_spot
+ if(spawn_distance == 1)
+ picked_spot = spawner.loc
+ else if(spawn_distance >= 1 && spawn_distance_exclude >= 1)
+ picked_spot = pick(turf_peel(spawn_distance, spawn_distance_exclude, spawner.loc, view_based = TRUE, reject_dense = TRUE))
+ if(!picked_spot)
picked_spot = pick(circle_range_turfs(spawner.loc, spawn_distance))
- created = new chosen_mob_type(picked_spot)
+ if(picked_spot == spawner.loc)
+ SEND_SIGNAL(spawner, COMSIG_SPAWNER_SPAWNED_DEFAULT)
+ else if (spawn_distance >= 1)
+ picked_spot = pick(circle_range_turfs(spawner.loc, spawn_distance))
+ return picked_spot
+
+/**
+ * Adds handling to the created mob from the spawner component,
+ * such as adding to spawned_things list,
+ * weakrefs to the spawned_things list, and registering relevant signals.
+ *
+ * @param: turf/picked_spot: Turf to spawn the mob onto.
+ * @param: mob/chosen_mob_type: Type of mob to spawn.
+ * @param: atom/spawner: type definition of parent, passed for further setup on setup_spawned_mob.
+ */
+/datum/component/spawner/proc/delayed_mob_spawn(turf/picked_spot, mob/chosen_mob_type, atom/spawner)
+ if(!picked_spot)
+ CRASH("Incorrect parameters for delayed mob spawn - no picked spot to spawn!")
- created.flags_1 |= (spawner.flags_1 & ADMIN_SPAWNED_1)
- spawned_things += WEAKREF(created)
+ var/atom/created = new chosen_mob_type(picked_spot)
+ if(!created)
+ CRASH("Failed to spawn mob!")
+ setup_spawned_mob(created, spawner)
- if (isliving(created))
- var/mob/living/created_mob = created
- created_mob.set_faction(faction)
- RegisterSignal(created, COMSIG_MOB_STATCHANGE, PROC_REF(mob_stat_changed))
+/**
+ * Registers signals and flags onto a component spawned mob, to keep track of the spawned mob, as well as prevent them from getting treated as naturally spawned.
+ * @param: mob/spawned_mob: Mob to have signals sent to/registered onto.
+ * @param: atom/spawner:
+ */
+/datum/component/spawner/proc/setup_spawned_mob(mob/spawned_mob, atom/spawner)
+ spawned_mob.flags_1 |= (spawner.flags_1 & ADMIN_SPAWNED_1)
+ spawned_things += WEAKREF(spawned_mob)
- SEND_SIGNAL(src, COMSIG_SPAWNER_SPAWNED, created)
- RegisterSignal(created, COMSIG_QDELETING, PROC_REF(on_deleted))
- spawn_callback?.Invoke(created)
+ if(isliving(spawned_mob))
+ var/mob/living/created_mob = spawned_mob
+ created_mob.set_faction(faction)
+ RegisterSignal(created_mob, COMSIG_LIVING_DEATH, PROC_REF(mob_death))
+ if(spawner_logic == SPAWN_BY_WAVE_BEHAVIOR)
+ created_mob.adjust_timed_status_effect(60 SECONDS, /datum/status_effect/heads_up)
- if (spawn_text)
+ SEND_SIGNAL(src, COMSIG_SPAWNER_SPAWNED, spawned_mob)
+ RegisterSignal(spawned_mob, COMSIG_QDELETING, PROC_REF(on_deleted))
+ spawn_callback?.Invoke(spawned_mob)
+
+ if(spawn_text)
spawner.visible_message(span_danger("A creature [spawn_text] [spawner]."))
+
/// Remove weakrefs to atoms which have been killed or deleted without us picking it up somehow
/datum/component/spawner/proc/validate_references()
for (var/datum/weakref/weak_thing as anything in spawned_things)
@@ -120,8 +240,7 @@
spawned_things -= WEAKREF(source)
/// Called when a mob we spawned dies, remove it from the list and unregister signals
-/datum/component/spawner/proc/mob_stat_changed(mob/living/source)
- if (source.stat != DEAD)
- return
+/datum/component/spawner/proc/mob_death(mob/living/source)
spawned_things -= WEAKREF(source)
- UnregisterSignal(source, list(COMSIG_QDELETING, COMSIG_MOB_STATCHANGE))
+ source.remove_status_effect(/datum/status_effect/heads_up)
+ UnregisterSignal(source, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH))
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index ca461d139385..29dee2e4b804 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -449,7 +449,8 @@
if(HAS_TRAIT(sacker, TRAIT_TACKLING_WINGED_ATTACKER))
var/obj/item/organ/wings/moth/sacker_moth_wing = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
- if(!sacker_moth_wing || sacker_moth_wing.burnt)
+ //Flight potion wings cannot burn off. Only the moth's natural fragile pair can cost us the bonus
+ if(isnull(sacker_moth_wing) || (istype(sacker_moth_wing) && sacker_moth_wing.burnt))
attack_mod -= 2
var/obj/item/organ/wings/sacker_wing = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
if(sacker_wing)
diff --git a/code/datums/components/tether.dm b/code/datums/components/tether.dm
index bc0c273b5ed0..f8ec178d04c5 100644
--- a/code/datums/components/tether.dm
+++ b/code/datums/components/tether.dm
@@ -39,7 +39,7 @@
cur_dist = max_dist
if (start_distance != null)
cur_dist = start_distance
- var/datum/beam/beam = tether_target.Beam(parent, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi', emissive = FALSE, beam_type = /obj/effect/ebeam/tether)
+ var/datum/beam/beam = tether_target.Beam(parent, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi', emissive = NONE, beam_type = /obj/effect/ebeam/tether)
tether_beam = beam
if (ispath(tether_name, /atom))
var/atom/tmp = tether_name
diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm
index fbdf0229b991..cc1120b31655 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -130,6 +130,7 @@
var/cure_mod
var/bad_immune = HAS_TRAIT(affected_mob, TRAIT_IMMUNODEFICIENCY) ? 2 : 1
var/is_sleeping = !!affected_mob.IsSleeping()
+ var/malnourished = !HAS_TRAIT(affected_mob, TRAIT_NOHUNGER) && (affected_mob.nutrition <= NUTRITION_LEVEL_STARVING)
if(required_organ)
if(!has_required_infectious_organ(affected_mob, required_organ))
@@ -166,7 +167,7 @@
if(!(disease_flags & CHRONIC) && disease_flags & CURABLE && bypasses_immunity != TRUE)
switch(severity)
if(DISEASE_SEVERITY_POSITIVE)
- if(slowdown < 1 || (!(HAS_TRAIT(affected_mob, TRAIT_NOHUNGER)) && (affected_mob.satiety < DISEASE_SATIETY_THRESHOLD || affected_mob.nutrition < NUTRITION_LEVEL_STARVING)))
+ if(slowdown < 1 || malnourished)
cycles_to_beat = max(DISEASE_RECOVERY_SCALING, DISEASE_CYCLES_POSITIVE)
else
recovery_prob = 0
@@ -192,12 +193,9 @@
if(slowdown < 1) //using spaceacillin can help get them over the finish line to kill a virus with decreasing effect over time
recovery_prob += clamp((((1 - slowdown)*(DISEASE_SLOWDOWN_RECOVERY_BONUS * 2)) * ((DISEASE_SLOWDOWN_RECOVERY_BONUS_DURATION - chemical_offsets) / DISEASE_SLOWDOWN_RECOVERY_BONUS_DURATION)), 0, DISEASE_SLOWDOWN_RECOVERY_BONUS)
chemical_offsets = min(chemical_offsets + 1, DISEASE_SLOWDOWN_RECOVERY_BONUS_DURATION)
- if(!HAS_TRAIT(affected_mob, TRAIT_NOHUNGER))
- if(affected_mob.satiety < DISEASE_SATIETY_THRESHOLD || affected_mob.nutrition < NUTRITION_LEVEL_STARVING) //being malnourished makes it a lot harder to defeat your illness
- recovery_prob -= DISEASE_MALNUTRITION_RECOVERY_PENALTY
- else
- if(affected_mob.satiety > 0)
- recovery_prob += round((DISEASE_SATIETY_RECOVERY_MULTIPLIER * (affected_mob.satiety/MAX_SATIETY)), 0.1)
+ if(malnourished) //being malnourished makes it a lot harder to defeat your illness
+ recovery_prob -= DISEASE_MALNUTRITION_RECOVERY_PENALTY
+
if(affected_mob.mob_mood) // this and most other modifiers below a shameless rip from sleeping healing buffs, but feeling good helps make it go away quicker
switch(affected_mob.mob_mood.sanity_level)
@@ -216,7 +214,7 @@
recovery_prob += get_immunity_recovery()
- if((HAS_TRAIT(affected_mob, TRAIT_NOHUNGER) || !(affected_mob.satiety < 0 || affected_mob.nutrition < NUTRITION_LEVEL_STARVING)) && is_sleeping) //resting starved won't help, but resting helps
+ if(!malnourished && is_sleeping) //resting starved won't help, but resting helps
var/turf/rest_turf = get_turf(affected_mob)
var/is_sleeping_in_darkness = !rest_turf.check_lumcount_above(LIGHTING_TILE_IS_DARK)
@@ -249,7 +247,9 @@
var/failure_chance = (1 - get_recovery_failure_chance() / 100)
if(SPT_PROB(recovery_prob * failure_chance, seconds_per_tick))
if(stage == 1 && prob(cure_chance * DISEASE_FINAL_CURE_CHANCE_MULTIPLIER)) //if we reduce FROM stage == 1, cure the virus - after defeating its cure_chance in a final battle
- if(!HAS_TRAIT(affected_mob, TRAIT_NOHUNGER) && (affected_mob.satiety < DISEASE_SATIETY_THRESHOLD || affected_mob.nutrition < NUTRITION_LEVEL_STARVING))
+ if(severity == DISEASE_SEVERITY_POSITIVE && slowdown < 1)
+ return TRUE
+ if(malnourished)
if(stage_peaked == FALSE) //if you didn't ride out the virus from its peak, if you're malnourished when it cures, you don't get resistance
cure(add_resistance = FALSE)
return FALSE
@@ -306,7 +306,7 @@
return FALSE
if(!has_required_infectious_organ(affected_mob, ORGAN_SLOT_LUNGS)) //also if you lack lungs
return FALSE
- if(HAS_TRAIT(affected_mob, TRAIT_VIRUS_RESISTANCE) || (affected_mob.satiety > 0 && prob(affected_mob.satiety / 2))) //being full or on spaceacillin makes you less likely to spread a virus
+ if(HAS_TRAIT(affected_mob, TRAIT_VIRUS_RESISTANCE)) //being full or on spaceacillin makes you less likely to spread a virus
return FALSE
var/turf/mob_loc = affected_mob.loc
if(!istype(mob_loc))
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index d8de944aece8..c56e16403071 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -259,14 +259,12 @@
if(3)
if(ishuman(affected_mob))
var/mob/living/carbon/human/human = affected_mob
- if(!ismonkey(human) && !isjellyperson(human))
+ if(!HAS_TRAIT(human, TRAIT_LESSER_HUMANOID) && !isjellyperson(human))
human.set_species(/datum/species/jelly/slime)
/datum/disease/transformation/slime/do_disease_transformation(mob/living/affected_mob)
- if(affected_mob.client && ishuman(affected_mob)) // if they are a human who's not a monkey and are sentient, then let them have the old fun
- var/mob/living/carbon/human/human = affected_mob
- if(!ismonkey(human))
- new_form = /mob/living/basic/slime/random
+ if(affected_mob.client &&!HAS_TRAIT(affected_mob, TRAIT_LESSER_HUMANOID)) // if they are a human who's not a monkey and are sentient, then let them have the old fun
+ new_form = /mob/living/basic/slime/random
return ..()
/datum/disease/transformation/corgi
diff --git a/code/datums/dna/blocks/dna_identity_block.dm b/code/datums/dna/blocks/dna_identity_block.dm
index 2c7cd2f4b342..b01e2a3b5866 100644
--- a/code/datums/dna/blocks/dna_identity_block.dm
+++ b/code/datums/dna/blocks/dna_identity_block.dm
@@ -150,4 +150,4 @@
/datum/dna_block/identity/height/apply_to_mob(mob/living/carbon/human/target, dna_hash)
var/max_height_index = length(dna_heights)
var/mob_height_index = deconstruct_block(get_block(dna_hash), max_height_index, block_length)
- target.set_mob_height(text2num(dna_heights[mob_height_index]) || HUMAN_HEIGHT_MEDIUM, update_dna = FALSE)
+ target.set_mob_height(dna_heights[mob_height_index] || HUMAN_HEIGHT_MEDIUM, update_dna = FALSE)
diff --git a/code/datums/elements/equipment_bodypart_texture.dm b/code/datums/elements/equipment_bodypart_texture.dm
new file mode 100644
index 000000000000..fe76a60aac1c
--- /dev/null
+++ b/code/datums/elements/equipment_bodypart_texture.dm
@@ -0,0 +1,65 @@
+/// Attached to clothing items to have them apply a texture to bodyparts when worn."
+/datum/element/equipment_bodypart_texture
+ element_flags = ELEMENT_BESPOKE
+ argument_hash_start_idx = 2
+
+ /// Bodypart we apply the texture to
+ var/body_zone
+ /// Texture we apply to the bodypart
+ var/bodypart_overlay_type
+
+/datum/element/equipment_bodypart_texture/Attach(datum/target, body_zone, bodypart_overlay_type)
+ . = ..()
+ if(!isitem(target))
+ return ELEMENT_INCOMPATIBLE
+
+ src.body_zone = body_zone
+ src.bodypart_overlay_type = bodypart_overlay_type
+
+ var/obj/item/target_item = target
+ RegisterSignal(target_item, COMSIG_ITEM_EQUIPPED, PROC_REF(item_equipped))
+ RegisterSignal(target_item, COMSIG_ITEM_DROPPED, PROC_REF(item_dropped))
+ if(isliving(target_item.loc))
+ var/mob/living/wearer = target_item.loc
+ item_equipped(target_item, wearer, wearer.get_slot_by_item(target_item))
+
+/datum/element/equipment_bodypart_texture/Detach(datum/source, ...)
+ . = ..()
+ var/obj/item/target_item = source
+ UnregisterSignal(target_item, COMSIG_ITEM_EQUIPPED)
+ UnregisterSignal(target_item, COMSIG_ITEM_DROPPED)
+ if(isliving(target_item.loc))
+ var/mob/living/wearer = target_item.loc
+ item_dropped(target_item, wearer)
+
+/datum/element/equipment_bodypart_texture/proc/item_equipped(obj/item/equipped_item, mob/living/carbon/equipper, slot)
+ SIGNAL_HANDLER
+
+ if(!(slot & equipped_item.slot_flags))
+ return
+
+ var/obj/item/bodypart/affected_bodypart = equipper.get_bodypart(body_zone)
+ affected_bodypart?.add_bodypart_texture(bodypart_overlay_type)
+ RegisterSignal(equipper, COMSIG_CARBON_POST_REMOVE_LIMB, PROC_REF(limb_removed))
+ RegisterSignal(equipper, COMSIG_CARBON_POST_ATTACH_LIMB, PROC_REF(limb_added))
+
+/datum/element/equipment_bodypart_texture/proc/item_dropped(obj/item/dropped_item, mob/living/carbon/dropper)
+ SIGNAL_HANDLER
+
+ if(dropper.get_item_by_slot(dropped_item.slot_flags) != dropped_item)
+ return
+
+ var/obj/item/bodypart/affected_bodypart = dropper.get_bodypart(body_zone)
+ affected_bodypart?.remove_bodypart_texture(bodypart_overlay_type)
+ UnregisterSignal(dropper, COMSIG_CARBON_POST_REMOVE_LIMB)
+ UnregisterSignal(dropper, COMSIG_CARBON_POST_ATTACH_LIMB)
+
+/datum/element/equipment_bodypart_texture/proc/limb_removed(mob/living/carbon/limb_owner, obj/item/bodypart/removed_limb)
+ SIGNAL_HANDLER
+
+ removed_limb.remove_bodypart_texture(bodypart_overlay_type)
+
+/datum/element/equipment_bodypart_texture/proc/limb_added(mob/living/carbon/limb_owner, obj/item/bodypart/added_limb)
+ SIGNAL_HANDLER
+
+ added_limb.add_bodypart_texture(bodypart_overlay_type)
diff --git a/code/datums/elements/table_smash.dm b/code/datums/elements/table_smash.dm
index d0f518543405..9a4da9197a9a 100644
--- a/code/datums/elements/table_smash.dm
+++ b/code/datums/elements/table_smash.dm
@@ -153,9 +153,6 @@
if (pushed_mob.loc != table.loc) //Something prevented the tabling
return
- pushed_mob.Knockdown(3 SECONDS)
- pushed_mob.apply_damage(10, BRUTE)
- pushed_mob.apply_damage(40, STAMINA)
playsound(pushed_mob, 'sound/effects/tableslam.ogg', 90, TRUE)
pushed_mob.visible_message(span_danger("[user] slams [pushed_mob] onto \the [table]!"), \
span_userdanger("[user] slams you onto \the [table]!"))
@@ -165,15 +162,13 @@
if(after_smash_proccall)
call(table, after_smash_proccall)(pushed_mob)
+ pushed_mob.Knockdown(3 SECONDS)
+ pushed_mob.apply_damage(40, STAMINA)
+ pushed_mob.apply_damage(10, BRUTE)
+
/// Even more aggressively smash a single part of a mob onto the table
/datum/element/table_smash/proc/tablelimbsmash(mob/living/user, mob/living/pushed_mob, obj/structure/table/table)
- pushed_mob.Knockdown(3 SECONDS)
var/obj/item/bodypart/banged_limb = pushed_mob.get_bodypart(user.zone_selected) || pushed_mob.get_bodypart(BODY_ZONE_HEAD)
- var/extra_wound = 0
- if (HAS_TRAIT(user, TRAIT_HULK))
- extra_wound = 20
- pushed_mob.apply_damage(30, BRUTE, banged_limb, wound_bonus = extra_wound)
- pushed_mob.apply_damage(60, STAMINA)
playsound(pushed_mob, 'sound/effects/bang.ogg', 90, TRUE)
pushed_mob.visible_message(span_danger("[user] smashes [pushed_mob]'s [banged_limb.plaintext_zone] against \the [table]!"),
span_userdanger("[user] smashes your [banged_limb.plaintext_zone] against \the [table]"))
@@ -184,6 +179,10 @@
if(after_smash_proccall)
call(table, after_smash_proccall)(pushed_mob)
+ pushed_mob.Knockdown(3 SECONDS)
+ pushed_mob.apply_damage(60, STAMINA)
+ pushed_mob.apply_damage(30, BRUTE, banged_limb, wound_bonus = HAS_TRAIT(user, TRAIT_HULK) ? 20 : 0)
+
/// Called when someone is shoved into our tile
/obj/structure/proc/on_disarm_shoved_into(datum/source, mob/living/shover, mob/living/target, shove_flags, obj/item/weapon)
SIGNAL_HANDLER
diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm
index 465c2260d3e1..f440cd9fe95e 100644
--- a/code/datums/emotes.dm
+++ b/code/datums/emotes.dm
@@ -351,7 +351,7 @@
. = message_larva
else if(isAI(user) && message_AI)
. = message_AI
- else if(ismonkey(user) && message_monkey)
+ else if(HAS_TRAIT(user, TRAIT_LESSER_HUMANOID) && message_monkey)
. = message_monkey
else if((iscyborg(user) || (living_user.mob_biotypes & MOB_ROBOTIC)) && message_robot)
. = message_robot
diff --git a/code/datums/greyscale/json_configs/digitigrade.json b/code/datums/greyscale/json_configs/digitigrade.json
index f068457be94d..18033044682f 100644
--- a/code/datums/greyscale/json_configs/digitigrade.json
+++ b/code/datums/greyscale/json_configs/digitigrade.json
@@ -15,6 +15,14 @@
"color_ids": [1]
}
],
+ "apron_worn": [
+ {
+ "type": "icon_state",
+ "icon_state": "apron",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ],
"sneakers_worn": [
{
"type": "icon_state",
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index 10fde7b8dae6..86c7b443b523 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -30,7 +30,7 @@
if(TELEPORT_CHANNEL_BLUESPACE)
var/interference = 0
for(var/obj/item/check as anything in teleatom.get_all_contents_type(/obj/item))
- if(check.item_flags & BLUESPACE_INTERFERENCE)
+ if(HAS_TRAIT(check, TRAIT_BLUESPACE_INTERFERENCE))
interference += 1
if(interference)
precision = max(rand(1,100)*interference,100)
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
index 0217298f9bc3..9485d940c1dd 100644
--- a/code/datums/holocall.dm
+++ b/code/datums/holocall.dm
@@ -234,7 +234,7 @@
/obj/item/disk/holodisk/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(!istype(tool, /obj/item/disk/holodisk))
- return NONE
+ return ..()
var/obj/item/disk/holodisk/holodisk_original = tool
diff --git a/code/datums/id_trim/_id_trim.dm b/code/datums/id_trim/_id_trim.dm
index b9356e9c35dc..c5e7334228ba 100644
--- a/code/datums/id_trim/_id_trim.dm
+++ b/code/datums/id_trim/_id_trim.dm
@@ -14,6 +14,8 @@
var/assignment
/// The name of the job for interns. If unset it will default to "[assignment] (Intern)".
var/intern_alt_name = null
+ /// The dmi icon file associated with this trim, as it will show on the security HUD.
+ var/sechud_icon = DEFAULT_HUDS_DMI
/// The icon_state associated with this trim, as it will show on the security HUD.
var/sechud_icon_state = SECHUD_UNKNOWN
/// How threatened does a security bot feel when scanning this ID? A negative value may cause them to forgive things which would otherwise cause aggro.
@@ -36,6 +38,13 @@
/datum/id_trim/proc/find_job()
return null
+/// Returns the SecHUD job icon state for whatever this object's ID card is, if it has one.
+/obj/item/proc/get_sechud_job_icon()
+ var/obj/item/card/id/id_card = GetID()
+
+ return id_card?.get_trim_sechud_icon() || DEFAULT_HUDS_DMI
+
+
/// Returns the SecHUD job icon state for whatever this object's ID card is, if it has one.
/obj/item/proc/get_sechud_job_icon_state()
var/obj/item/card/id/id_card = GetID()
diff --git a/code/datums/keybinding/communication.dm b/code/datums/keybinding/communication.dm
index 767bc897cbd3..50737998300e 100644
--- a/code/datums/keybinding/communication.dm
+++ b/code/datums/keybinding/communication.dm
@@ -84,5 +84,5 @@
winset(user, null, "command=[VERB_PRAY]")
return TRUE
winset(user, null, "command=[user.tgui_say_create_open_command(PRAY_CHANNEL)];")
- winset(user, "tgui_say.browser", "focus=true")
+ winset(user, SKIN_TGUISAY_BROWSER, "focus=true")
return TRUE
diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm
index f6f6ecf3cdac..aaefd2c8a890 100644
--- a/code/datums/materials/basemats.dm
+++ b/code/datums/materials/basemats.dm
@@ -516,7 +516,7 @@
/// RPG Magic.
/datum/material/mythril
name = "mythril"
- desc = "How this even exists is byond me"
+ desc = "How this even exists is byond me."
color = "#f2d5d7"
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_METAL | MATERIAL_CLASS_RIGID
mat_properties = list(
@@ -557,7 +557,7 @@
//formed when freon react with o2, emits a lot of plasma when heated
/datum/material/hot_ice
name = "hot ice"
- desc = "A weird kind of ice, feels warm to the touch"
+ desc = "A crystalline solid formed when Freon reacts with Oxygen. Extremely flammable, and will easily combust when exposed to heat."
color = "#88cdf1"
alpha = 150
starlight_color = COLOR_BLUE_LIGHT
@@ -587,8 +587,8 @@
// It's basically adamantine, but it isn't!
/datum/material/metalhydrogen
- name = "Metal Hydrogen"
- desc = "Solid metallic hydrogen. Some say it should be impossible"
+ name = "metal hydrogen"
+ desc = "Hydrogen in a metallic state, formed under extreme pressure. Some say achieving this state is impossible."
color = "#62708A"
starlight_color = COLOR_MODERATE_BLUE
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_METAL | MATERIAL_CLASS_RIGID
@@ -868,7 +868,7 @@
/datum/material/zaukerite
name = "zaukerite"
- desc = "A light absorbing crystal"
+ desc = "A light absorbing crystal formed out of Zauker. Vaguely toxic, like the gas itself."
color = COLOR_ALMOST_BLACK
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_CRYSTAL | MATERIAL_CLASS_RIGID
mat_properties = list(
diff --git a/code/datums/mood_events/death.dm b/code/datums/mood_events/death.dm
index cacfe063d7f8..225596c0a959 100644
--- a/code/datums/mood_events/death.dm
+++ b/code/datums/mood_events/death.dm
@@ -59,7 +59,7 @@
/// Checks if the dead mob is a pet
/datum/mood_event/conditional/see_death/proc/is_pet(mob/dead_mob)
- return istype(dead_mob, /mob/living/basic/pet) || ismonkey(dead_mob)
+ return istype(dead_mob, /mob/living/basic/pet) || HAS_TRAIT(dead_mob, TRAIT_LESSER_HUMANOID)
/datum/mood_event/conditional/see_death/be_refreshed(datum/mood/home, mob/dead_mob, dusted, gibbed)
if(can_stack_effect(dead_mob))
diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm
index a59ae74d1ac4..b87e749d2dba 100644
--- a/code/datums/mutations/body.dm
+++ b/code/datums/mutations/body.dm
@@ -254,7 +254,7 @@
. = ..()
if(!.)
return
- if(ismonkey(owner))
+ if(HAS_TRAIT(owner, TRAIT_LESSER_HUMANOID))
return
original_species = owner.dna.species.type
original_name = owner.real_name
diff --git a/code/datums/quirks/negative_quirks/csl.dm b/code/datums/quirks/negative_quirks/csl.dm
index 752a7d2dc312..92bc2538924a 100644
--- a/code/datums/quirks/negative_quirks/csl.dm
+++ b/code/datums/quirks/negative_quirks/csl.dm
@@ -41,14 +41,6 @@
else
quirk_holder.grant_language(/datum/language/common, UNDERSTOOD_LANGUAGE, LANGUAGE_ATOM)
-/datum/quirk/csl/is_species_appropriate(datum/species/mob_species)
- var/datum/language_holder/species_holder = GLOB.prototype_language_holders[mob_species.species_language_holder]
- if(isnull(species_holder))
- return FALSE
- if(length(species_holder.spoken_languages) < 2)
- return FALSE
- return ..()
-
/// Gets our native language from our list of spoken languages
/datum/quirk/csl/proc/get_native_language()
var/list/language_pool = quirk_holder.get_language_holder()?.spoken_languages?.Copy()
diff --git a/code/datums/quirks/positive_quirks/death_mimicry.dm b/code/datums/quirks/positive_quirks/death_mimicry.dm
new file mode 100644
index 000000000000..5b00a800fab6
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/death_mimicry.dm
@@ -0,0 +1,9 @@
+/datum/quirk/death_mimicry
+ name = "Death Mimicry"
+ desc = "You've mastered the art of faking your demise. Performing a death gasp knocks you unconscious and tricks anyone examining you into believing you've succumbed to your injuries for a short time."
+ icon = FA_ICON_GHOST
+ value = 16
+ gain_text = span_notice("You know how to put on a convincing death scene.")
+ lose_text = span_danger("You've lost your flair for dramatic deaths.")
+ medical_record_text = "Patient routinely fakes cardiac arrest to get out of fights."
+ mail_goodies = list(/obj/item/bodybag)
diff --git a/code/datums/records/manifest.dm b/code/datums/records/manifest.dm
index bbdea8b4026e..ab1b62d806cf 100644
--- a/code/datums/records/manifest.dm
+++ b/code/datums/records/manifest.dm
@@ -46,7 +46,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new)
misc_list[++misc_list.len] = list(
"name" = name,
"rank" = rank,
- "trim" = trim,
+ "trim" = job?.tgui_icon,
)
continue
for(var/department_type in job.departments_list)
@@ -60,7 +60,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new)
var/list/entry = list(
"name" = name,
"rank" = rank,
- "trim" = trim,
+ "trim" = job.tgui_icon,
)
var/list/department_list = manifest_out[department.department_name]
if(istype(job, department.department_head))
diff --git a/code/datums/shuttles/emergency.dm b/code/datums/shuttles/emergency.dm
index f05baeebd145..6e806a7823a6 100644
--- a/code/datums/shuttles/emergency.dm
+++ b/code/datums/shuttles/emergency.dm
@@ -547,4 +547,107 @@
/datum/map_template/shuttle/emergency/ark/prerequisites_met()
return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_ARK]
+/datum/map_template/shuttle/emergency/departmental
+ who_can_purchase = null
+ admin_notes = "Parent shuttle for other departmental shuttles."
+ ///requires a job_department datum to present it to communications console.
+ var/department_type = null
+ ///requires a name of department to send it to ui.
+ var/department_name = ""
+ occupancy_limit = "null"
+
+/datum/map_template/shuttle/emergency/departmental/command
+ suffix = "dep_cap"
+ name = "Command Emergency Shuttle"
+ description = "It could have been some oligarch's personal shuttle, but the union wouldn't let us make a deal, \
+ so this shuttle is being put into operation as an elite shuttle."
+ admin_notes = "Has Shutters and an Axe in bridge area."
+ credit_cost = CARGO_CRATE_VALUE * 17.5
+ who_can_purchase = list(ACCESS_CAPTAIN)
+ department_type = /datum/job_department/command
+ department_name = DEPARTMENT_COMMAND
+ occupancy_limit = "40, also 7 people can take part in banquet."
+
+/datum/map_template/shuttle/emergency/departmental/civil
+ suffix = "dep_civ"
+ name = "Assistants Emergency Shuttle"
+ description = "A shuttle designed to satisfy assistants' wishes. Converted into Maintenance Rooms."
+ admin_notes = "Maintenance Shuttle."
+ credit_cost = CARGO_CRATE_VALUE * 5.5
+ who_can_purchase = list(ACCESS_CAPTAIN)
+ department_type = /datum/job_department/assistant
+ department_name = DEPARTMENT_ASSISTANT
+ occupancy_limit = "Fine for a bunch of assistans."
+
+/datum/map_template/shuttle/emergency/departmental/engineering
+ suffix = "dep_eng"
+ name = "Engineering Emergency Shuttle"
+ description = "According to the engineers, the laws of physics reports that the shuttle cannot fly without energy, \
+ so we installed supermatter shard and atmos shuttle with turbine and mixing chamber."
+ admin_notes = "Has inactive supermatter shard, axe, insuls, free engi vending machines and electrified grilles, if engineers powers the shuttle."
+ credit_cost = CARGO_CRATE_VALUE * 15.5
+ who_can_purchase = list(ACCESS_CAPTAIN)
+ department_type = /datum/job_department/engineering
+ department_name = DEPARTMENT_ENGINEERING
+ occupancy_limit = "20"
+
+/datum/map_template/shuttle/emergency/departmental/medical
+ suffix = "dep_med"
+ name = "Medical Emergency Shuttle"
+ description = "Someone decided that driving a shuttle and treating people is very convenient, \
+ so they decided to please the surgeons who perform heart operations and launched medical shuttle with a treating center, virology and chemistry lab."
+ admin_notes = "Has functioning pharmacy and virology."
+ credit_cost = CARGO_CRATE_VALUE * 12
+ who_can_purchase = list(ACCESS_CAPTAIN)
+ department_type = /datum/job_department/medical
+ department_name = DEPARTMENT_MEDICAL
+ occupancy_limit = "30 lives bodies and 1 dead body."
+
+/datum/map_template/shuttle/emergency/departmental/science
+ suffix = "dep_sci"
+ name = "Science Emergency Shuttle"
+ description = "We're so fed up with scientists that we built a separate shuttle for them. \
+ We took real asteroid to build up ordnance lab and extension to xenobiology."
+ admin_notes = "Has functional R&D."
+ credit_cost = CARGO_CRATE_VALUE * 10
+ who_can_purchase = list(ACCESS_CAPTAIN)
+ department_type = /datum/job_department/science
+ department_name = DEPARTMENT_SCIENCE
+ occupancy_limit = "50"
+
+/datum/map_template/shuttle/emergency/departmental/security
+ suffix = "dep_sec"
+ name = "Security Emergency Shuttle"
+ description = "Created in honor of the Security Officer, who saved head of CC Representative. \
+ He was a very good man, until he died at the hands of a traitor."
+ admin_notes = "Has 2 prison cells, 1 holding cell and permabrig instead of seating area."
+ credit_cost = CARGO_CRATE_VALUE * 16
+ who_can_purchase = list(ACCESS_CAPTAIN)
+ department_type = /datum/job_department/security
+ department_name = DEPARTMENT_SECURITY
+ occupancy_limit = "40 in prison crew and 10 freedom crew."
+
+/datum/map_template/shuttle/emergency/departmental/service
+ suffix = "dep_srv"
+ name = "Service Emergency Shuttle"
+ description = "Shuttle is built solely for bar hopping and has no tool storage or medbay."
+ admin_notes = "Shuttle is spacious, but many important things for a shuttle are missing."
+ credit_cost = CARGO_CRATE_VALUE * 8
+ who_can_purchase = list(ACCESS_CAPTAIN)
+ department_type = /datum/job_department/service
+ department_name = DEPARTMENT_SERVICE
+ occupancy_limit = "30"
+
+/datum/map_template/shuttle/emergency/departmental/cargo
+ suffix = "dep_sup"
+ name = "Cargo Emergency Shuttle"
+ description = "It was built by order of the Cargotic separatists. \
+ Don't worry, every single one of the separatists has already been jailed. Project was that good, that we made that for public sale."
+ admin_notes = "Has unloaded rocket launcher and express suply console."
+ credit_cost = CARGO_CRATE_VALUE * 9.5
+ who_can_purchase = list(ACCESS_CAPTAIN)
+ department_type = /datum/job_department/cargo
+ department_name = DEPARTMENT_CARGO
+ occupancy_limit = "40"
+
#undef EMAG_LOCKED_SHUTTLE_COST
diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm
index 5b6887c066c9..e12b37e8be80 100644
--- a/code/datums/station_traits/negative_traits.dm
+++ b/code/datums/station_traits/negative_traits.dm
@@ -770,4 +770,14 @@
report_message = "Our station subdivision informed us that this station may have been built with a number of structural weaknesses due to defective construction materials. Be on the lookout for them and try not to let anything explode."
trait_to_give = STATION_TRAIT_SPAWN_WEAKPOINTS
+///A negative trait that empties the food and drink products available from vending machines throughout the station.
+/datum/station_trait/vending_shortage
+ name = "Vending products shortage"
+ trait_type = STATION_TRAIT_NEGATIVE
+ weight = 3
+ show_in_report = TRUE
+ can_revert = FALSE // because it touches every maploaded vending machine on the station.
+ report_message = "We haven't had the time to take care of the station's food and drink vending machines. Food and drink products are empty and need to be restocked."
+ trait_to_give = STATION_TRAIT_VENDING_SHORTAGE
+
#undef GLOW_NEBULA
diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm
index b12dfb54e5ae..10ed600ac342 100644
--- a/code/datums/status_effects/debuffs/debuffs.dm
+++ b/code/datums/status_effects/debuffs/debuffs.dm
@@ -538,11 +538,11 @@ GLOBAL_LIST_EMPTY(unconscious_appearances)
new /obj/effect/temp_visual/bleed(get_turf(owner))
/datum/status_effect/stacking/saw_bleed/threshold_cross_effect()
- owner.adjust_brute_loss(bleed_damage)
new /obj/effect/temp_visual/bleed/explode(get_turf(owner))
+ playsound(owner, SFX_DESECRATION, 100, TRUE, -1)
for(var/splatter_dir in GLOB.alldirs)
owner.create_splatter(splatter_dir)
- playsound(owner, SFX_DESECRATION, 100, TRUE, -1)
+ owner.adjust_brute_loss(bleed_damage)
/datum/status_effect/stacking/saw_bleed/bloodletting
id = "bloodletting"
diff --git a/code/datums/status_effects/debuffs/genetic_damage.dm b/code/datums/status_effects/debuffs/genetic_damage.dm
index 64663a0c3ae7..62c8b247c8e4 100644
--- a/code/datums/status_effects/debuffs/genetic_damage.dm
+++ b/code/datums/status_effects/debuffs/genetic_damage.dm
@@ -32,7 +32,7 @@
src.total_damage += total_damage
/datum/status_effect/genetic_damage/tick(seconds_between_ticks)
- if(ismonkey(owner) && total_damage >= GORILLA_MUTATION_MINIMUM_DAMAGE && SPT_PROB(GORILLA_MUTATION_CHANCE_PER_SECOND, seconds_between_ticks))
+ if(iscarbon(owner) && HAS_TRAIT(owner, TRAIT_SIMIAN) && total_damage >= GORILLA_MUTATION_MINIMUM_DAMAGE && SPT_PROB(GORILLA_MUTATION_CHANCE_PER_SECOND, seconds_between_ticks))
var/mob/living/carbon/carbon_owner = owner
carbon_owner.gorillize(genetics_gorilla = TRUE)
qdel(src)
diff --git a/code/datums/status_effects/debuffs/temperature_over_time.dm b/code/datums/status_effects/debuffs/temperature_over_time.dm
index 5a14b47617d2..056fc6cbb1f0 100644
--- a/code/datums/status_effects/debuffs/temperature_over_time.dm
+++ b/code/datums/status_effects/debuffs/temperature_over_time.dm
@@ -51,7 +51,7 @@
return "[owner.p_They()] [owner.p_are()] shivering!"
/datum/status_effect/temperature_over_time/tick(seconds_between_ticks)
- if((TRAIT_RESISTHEAT && temperature_value > 1) || (TRAIT_RESISTCOLD && temperature_value < 1))
+ if((HAS_TRAIT(owner, TRAIT_RESISTHEAT) && temperature_value > 1) || (HAS_TRAIT(owner, TRAIT_RESISTCOLD) && temperature_value < 1))
qdel(src) // git out
return
temperaturetion(seconds_between_ticks)
diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm
index 3ce91598fa6d..b3534c827d32 100644
--- a/code/datums/status_effects/neutral.dm
+++ b/code/datums/status_effects/neutral.dm
@@ -918,3 +918,35 @@
SIGNAL_HANDLER
real_invis_see = see_invis
+
+// Applies a little arrow above the mobs head to let the players know that it's subject to holding up the waves being spawned.
+/datum/status_effect/heads_up
+ id = "heads_up_arrow"
+ processing_speed = STATUS_EFFECT_NORMAL_PROCESS
+ alert_type = null
+ on_remove_on_mob_delete = TRUE
+ var/obj/effect/overlay/wave_headsup/arrow_overlay
+
+/datum/status_effect/heads_up/on_apply()
+ . = ..()
+ var/turf/owner_turf = get_turf(owner)
+ arrow_overlay = new /obj/effect/overlay/wave_headsup
+ arrow_overlay.pixel_x = -(owner.base_pixel_x)
+ SET_PLANE(arrow_overlay, PLANE_TO_TRUE(arrow_overlay.plane), owner_turf)
+ owner.vis_contents += arrow_overlay
+ RegisterSignal(owner, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_z_change))
+ RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(on_death))
+
+/datum/status_effect/heads_up/on_remove()
+ owner.vis_contents -= arrow_overlay
+ QDEL_NULL(arrow_overlay)
+ UnregisterSignal(owner, COMSIG_MOVABLE_Z_CHANGED)
+
+/datum/status_effect/heads_up/proc/on_z_change(mob/living/source, turf/old_turf, turf/new_turf, same_z_layer)
+ SIGNAL_HANDLER
+ SET_PLANE(arrow_overlay, PLANE_TO_TRUE(arrow_overlay.plane), new_turf)
+
+/// We delete the status effect and visual on mob death.
+/datum/status_effect/heads_up/proc/on_death(mob/living/source)
+ SIGNAL_HANDLER
+ qdel(src)
diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm
index 9d2ed52153b6..8e4dccb4ddd8 100644
--- a/code/datums/storage/storage.dm
+++ b/code/datums/storage/storage.dm
@@ -437,6 +437,11 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches)
user.balloon_alert(user, "no room!")
return FALSE
+ if(to_insert.anchored)
+ if(messages && user && !silent_for_user)
+ user.balloon_alert(user, "anchored!")
+ return FALSE
+
var/can_hold_it = isnull(can_hold) || is_type_in_typecache(to_insert, can_hold) || is_type_in_typecache(to_insert, exception_hold)
var/cant_hold_it = is_type_in_typecache(to_insert, cant_hold)
var/trait_says_no = HAS_TRAIT(to_insert, TRAIT_NO_STORAGE_INSERT)
diff --git a/code/datums/storage/subtypes/belts.dm b/code/datums/storage/subtypes/belts.dm
index 43d7cc7859b0..7fd410abe0d2 100644
--- a/code/datums/storage/subtypes/belts.dm
+++ b/code/datums/storage/subtypes/belts.dm
@@ -141,6 +141,7 @@
/obj/item/shovel,
/obj/item/stack/cable_coil,
/obj/item/stack/marker_beacon,
+ /obj/item/stack/candela_beacon,
/obj/item/stack/medical,
/obj/item/stack/ore,
/obj/item/stack/sheet/animalhide,
diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm
index 8ffba209c595..e1ea3b5d6969 100644
--- a/code/game/area/areas/shuttles.dm
+++ b/code/game/area/areas/shuttles.dm
@@ -196,6 +196,9 @@
/area/shuttle/escape/tombstone
ambience_index = AMBIENCE_SPOOKY
+/area/shuttle/escape/xenobio
+ name = "Escape Shuttle Xenobiology"
+
/area/shuttle/transport
name = "Transport Shuttle"
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index af59ab9a6a9d..c6a60d464769 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -998,8 +998,8 @@
if(!QDELETED(throwing))
throwing.finalize(hit = TRUE, target = bumped_atom)
. = TRUE
- if(QDELETED(bumped_atom))
- return
+ if(QDELETED(bumped_atom))
+ return TRUE
bumped_atom.Bumped(src)
/atom/movable/Exited(atom/movable/gone, direction)
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index a579e8e945cf..f52466a1c745 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -172,54 +172,54 @@ Medical HUD! Basic mode needs suit sensors on.
//called when a living mob changes health
/mob/living/proc/med_hud_set_health()
- set_hud_image_state(HEALTH_HUD, "hud[RoundHealth(src)]")
+ set_hud_image_state(HEALTH_HUD, hud_state = "hud[RoundHealth(src)]")
// Called when a carbon changes stat, virus or XENO_HOST
// Returns TRUE if the mob is considered "perfectly healthy", FALSE otherwise
/mob/living/proc/med_hud_set_status()
if(IS_DEAD_OR_FAKING(src))
- set_hud_image_state(STATUS_HUD, "huddead")
+ set_hud_image_state(STATUS_HUD, hud_state = "huddead")
return FALSE
- set_hud_image_state(STATUS_HUD, "hudhealthy")
+ set_hud_image_state(STATUS_HUD, hud_state = "hudhealthy")
return TRUE
/mob/living/carbon/med_hud_set_status()
if(HAS_TRAIT(src, TRAIT_XENO_HOST))
- set_hud_image_state(STATUS_HUD, "hudxeno")
+ set_hud_image_state(STATUS_HUD, hud_state = "hudxeno")
return FALSE
if(IS_DEAD_OR_FAKING(src))
if(can_defib_client())
- set_hud_image_state(STATUS_HUD, "huddefib")
+ set_hud_image_state(STATUS_HUD, hud_state = "huddefib")
else if(HAS_TRAIT(src, TRAIT_GHOSTROLE_ON_REVIVE))
- set_hud_image_state(STATUS_HUD, "hudghost")
+ set_hud_image_state(STATUS_HUD, hud_state = "hudghost")
else
- set_hud_image_state(STATUS_HUD, "huddead")
+ set_hud_image_state(STATUS_HUD, hud_state = "huddead")
return FALSE
var/virus_threat = check_virus()
if (!virus_threat)
- set_hud_image_state(STATUS_HUD, "hudhealthy")
+ set_hud_image_state(STATUS_HUD, hud_state = "hudhealthy")
return TRUE
switch(virus_threat)
if(DISEASE_SEVERITY_UNCURABLE)
- set_hud_image_state(STATUS_HUD, "hudill6")
+ set_hud_image_state(STATUS_HUD, hud_state = "hudill6")
if(DISEASE_SEVERITY_BIOHAZARD)
- set_hud_image_state(STATUS_HUD, "hudill5")
+ set_hud_image_state(STATUS_HUD, hud_state = "hudill5")
if(DISEASE_SEVERITY_DANGEROUS)
- set_hud_image_state(STATUS_HUD, "hudill4")
+ set_hud_image_state(STATUS_HUD, hud_state = "hudill4")
if(DISEASE_SEVERITY_HARMFUL)
- set_hud_image_state(STATUS_HUD, "hudill3")
+ set_hud_image_state(STATUS_HUD, hud_state = "hudill3")
if(DISEASE_SEVERITY_MEDIUM)
- set_hud_image_state(STATUS_HUD, "hudill2")
+ set_hud_image_state(STATUS_HUD, hud_state = "hudill2")
if(DISEASE_SEVERITY_MINOR)
- set_hud_image_state(STATUS_HUD, "hudill1")
+ set_hud_image_state(STATUS_HUD, hud_state = "hudill1")
if(DISEASE_SEVERITY_NONTHREAT)
- set_hud_image_state(STATUS_HUD, "hudill0")
+ set_hud_image_state(STATUS_HUD, hud_state = "hudill0")
if(DISEASE_SEVERITY_POSITIVE)
- set_hud_image_state(STATUS_HUD, "hudbuff")
+ set_hud_image_state(STATUS_HUD, hud_state = "hudbuff")
return FALSE
/mob/living/carbon/human/med_hud_set_status()
@@ -228,7 +228,7 @@ Medical HUD! Basic mode needs suit sensors on.
return
var/obj/item/clothing/under/uniform = w_uniform
if(istype(uniform) && uniform.has_sensor == BROKEN_SENSORS)
- set_hud_image_state(STATUS_HUD, "hudnosensor")
+ set_hud_image_state(STATUS_HUD, hud_state = "hudnosensor")
return FALSE
@@ -247,14 +247,14 @@ FAN HUDs! For identifying other fans on-sight.
set_hud_image_active(FAN_HUD)
for(var/accessory in undershirt.attached_accessories)
if(istype(accessory, /obj/item/clothing/accessory/mime_fan_pin))
- set_hud_image_state(FAN_HUD, "mime_fan_pin")
+ set_hud_image_state(FAN_HUD, hud_state = "mime_fan_pin")
return
if(istype(accessory, /obj/item/clothing/accessory/clown_enjoyer_pin))
- set_hud_image_state(FAN_HUD, "clown_enjoyer_pin")
+ set_hud_image_state(FAN_HUD, hud_state = "clown_enjoyer_pin")
return
- set_hud_image_state(FAN_HUD, "hudfan_no")
+ set_hud_image_state(FAN_HUD, hud_state = "hudfan_no")
/***********************************************
Security HUDs! Basic mode shows only the job.
@@ -265,10 +265,12 @@ Security HUDs! Basic mode shows only the job.
/mob/living/carbon/human/proc/update_ID_card()
SIGNAL_HANDLER
+ var/sechud_icon = wear_id?.get_sechud_job_icon()
var/sechud_icon_state = wear_id?.get_sechud_job_icon_state()
if(!sechud_icon_state || HAS_TRAIT(src, TRAIT_UNKNOWN_APPEARANCE))
+ sechud_icon = DEFAULT_HUDS_DMI
sechud_icon_state = "hudno_id"
- set_hud_image_state(ID_HUD, sechud_icon_state)
+ set_hud_image_state(ID_HUD, sechud_icon, sechud_icon_state)
sec_hud_set_security_status()
update_visible_name()
@@ -281,16 +283,16 @@ Security HUDs! Basic mode shows only the job.
if(current_implant.implant_flags & IMPLANT_TYPE_SECURITY)
switch(security_slot)
if(1)
- set_hud_image_state(IMPSEC_FIRST_HUD, current_implant.hud_icon_state)
+ set_hud_image_state(IMPSEC_FIRST_HUD, hud_state = current_implant.hud_icon_state)
set_hud_image_active(IMPSEC_FIRST_HUD)
security_slot++
if(2) //Theoretically if we somehow get multiple sec implants, whatever the most recently implanted implant is will take over the 2nd position
- set_hud_image_state(IMPSEC_SECOND_HUD, current_implant.hud_icon_state, x_offset = (ICON_SIZE_X / 4 - 1)) //Adds an offset that mirrors the hud blip to the other side of the mob
+ set_hud_image_state(IMPSEC_SECOND_HUD, hud_state = current_implant.hud_icon_state, x_offset = (ICON_SIZE_X / 4 - 1)) //Adds an offset that mirrors the hud blip to the other side of the mob
set_hud_image_active(IMPSEC_SECOND_HUD)
if(HAS_TRAIT(src, TRAIT_MINDSHIELD))
- set_hud_image_state(IMPLOYAL_HUD, "hud_imp_loyal")
+ set_hud_image_state(IMPLOYAL_HUD, hud_state = "hud_imp_loyal")
set_hud_image_active(IMPLOYAL_HUD)
/mob/living/carbon/human/proc/sec_hud_set_security_status()
@@ -299,7 +301,7 @@ Security HUDs! Basic mode shows only the job.
return
if (HAS_TRAIT(src, TRAIT_ALWAYS_WANTED))
- set_hud_image_state(WANTED_HUD, "hudwanted")
+ set_hud_image_state(WANTED_HUD, hud_state = "hudwanted")
set_hud_image_active(WANTED_HUD)
return
@@ -316,15 +318,15 @@ Security HUDs! Basic mode shows only the job.
switch(target.wanted_status)
if(WANTED_ARREST)
- set_hud_image_state(WANTED_HUD, "hudwanted")
+ set_hud_image_state(WANTED_HUD, hud_state = "hudwanted")
if(WANTED_PRISONER)
- set_hud_image_state(WANTED_HUD, "hudincarcerated")
+ set_hud_image_state(WANTED_HUD, hud_state = "hudincarcerated")
if(WANTED_SUSPECT)
- set_hud_image_state(WANTED_HUD, "hudsuspected")
+ set_hud_image_state(WANTED_HUD, hud_state = "hudsuspected")
if(WANTED_PAROLE)
- set_hud_image_state(WANTED_HUD, "hudparolled")
+ set_hud_image_state(WANTED_HUD, hud_state = "hudparolled")
if(WANTED_DISCHARGED)
- set_hud_image_state(WANTED_HUD, "huddischarged")
+ set_hud_image_state(WANTED_HUD, hud_state = "huddischarged")
set_hud_image_active(WANTED_HUD)
@@ -370,26 +372,26 @@ Diagnostic HUDs!
//Sillycone hooks
/mob/living/silicon/proc/diag_hud_set_health()
if(stat == DEAD)
- set_hud_image_state(DIAG_HUD, "huddiagdead")
+ set_hud_image_state(DIAG_HUD, hud_state = "huddiagdead")
else
- set_hud_image_state(DIAG_HUD, "huddiag[RoundDiagBar(health/maxHealth)]")
+ set_hud_image_state(DIAG_HUD, hud_state = "huddiag[RoundDiagBar(health/maxHealth)]")
/mob/living/silicon/proc/diag_hud_set_status()
if(IS_UNCONSCIOUS(src))
- set_hud_image_state(DIAG_STAT_HUD, "hudoffline")
+ set_hud_image_state(DIAG_STAT_HUD, hud_state = "hudoffline")
return
if(stat == DEAD)
- set_hud_image_state(DIAG_STAT_HUD, "huddead2")
+ set_hud_image_state(DIAG_STAT_HUD, hud_state = "huddead2")
return
- set_hud_image_state(DIAG_STAT_HUD, "hudstat")
+ set_hud_image_state(DIAG_STAT_HUD, hud_state = "hudstat")
//Borgie battery tracking!
/mob/living/silicon/robot/proc/diag_hud_set_borgcell()
if(QDELETED(cell) || (cell.maxcharge == 0))
- set_hud_image_state(DIAG_BATT_HUD, "hudnobatt")
+ set_hud_image_state(DIAG_BATT_HUD, hud_state = "hudnobatt")
else
var/chargelvl = (cell.charge/cell.maxcharge)
- set_hud_image_state(DIAG_BATT_HUD, "hudbatt[RoundDiagBar(chargelvl)]")
+ set_hud_image_state(DIAG_BATT_HUD, hud_state = "hudbatt[RoundDiagBar(chargelvl)]")
//borg-AI shell tracking
/mob/living/silicon/robot/proc/diag_hud_set_aishell() //Shows if AI is controlling a cyborg via a BORIS module
@@ -397,9 +399,9 @@ Diagnostic HUDs!
set_hud_image_inactive(DIAG_TRACK_HUD)
return
if(deployed) //AI shell in use by an AI
- set_hud_image_state(DIAG_TRACK_HUD, "hudtrackingai")
+ set_hud_image_state(DIAG_TRACK_HUD, hud_state = "hudtrackingai")
else //Empty AI shell
- set_hud_image_state(DIAG_TRACK_HUD, "hudtracking")
+ set_hud_image_state(DIAG_TRACK_HUD, hud_state = "hudtracking")
set_hud_image_active(DIAG_TRACK_HUD)
//AI side tracking of AI shell control
@@ -408,28 +410,28 @@ Diagnostic HUDs!
set_hud_image_inactive(DIAG_TRACK_HUD)
return
//AI is currently controlling a shell
- set_hud_image_state(DIAG_TRACK_HUD, "hudtrackingai")
+ set_hud_image_state(DIAG_TRACK_HUD, hud_state = "hudtrackingai")
set_hud_image_active(DIAG_TRACK_HUD)
/*~~~~~~~~~~~~~~~~~~~~
BIG STOMPY MECHS
~~~~~~~~~~~~~~~~~~~~~*/
/obj/vehicle/sealed/mecha/proc/diag_hud_set_mechhealth()
- set_hud_image_state(DIAG_MECH_HUD, "huddiag[RoundDiagBar(atom_integrity/max_integrity)]")
+ set_hud_image_state(DIAG_MECH_HUD, hud_state = "huddiag[RoundDiagBar(atom_integrity/max_integrity)]")
/obj/vehicle/sealed/mecha/proc/diag_hud_set_mechcell()
if(QDELETED(cell) || (cell.maxcharge == 0))
- set_hud_image_state(DIAG_BATT_HUD, "hudnobatt")
+ set_hud_image_state(DIAG_BATT_HUD, hud_state = "hudnobatt")
else
var/chargelvl = cell.charge/cell.maxcharge
- set_hud_image_state(DIAG_BATT_HUD, "hudbatt[RoundDiagBar(chargelvl)]")
+ set_hud_image_state(DIAG_BATT_HUD, hud_state = "hudbatt[RoundDiagBar(chargelvl)]")
/obj/vehicle/sealed/mecha/proc/diag_hud_set_mechstat()
if(!internal_damage)
set_hud_image_inactive(DIAG_STAT_HUD)
return
- set_hud_image_state(DIAG_STAT_HUD, "hudwarn")
+ set_hud_image_state(DIAG_STAT_HUD, hud_state = "hudwarn")
set_hud_image_active(DIAG_STAT_HUD)
///Shows tracking beacons on the mech
@@ -441,7 +443,7 @@ Diagnostic HUDs!
break //Immediately terminate upon finding an AI beacon to ensure it is always shown over the normal one, as mechs can have several trackers.
else
new_icon_state = "hudtracking"
- set_hud_image_state(DIAG_TRACK_HUD, new_icon_state)
+ set_hud_image_state(DIAG_TRACK_HUD, hud_state = new_icon_state)
///Shows inbuilt camera on the mech; if the camera's view range was affected by an EMP, shows a red blip while it's affected
/obj/vehicle/sealed/mecha/proc/diag_hud_set_camera()
@@ -451,9 +453,9 @@ Diagnostic HUDs!
set_hud_image_active(DIAG_CAMERA_HUD)
if(chassis_camera?.is_emp_scrambled)
- set_hud_image_state(DIAG_CAMERA_HUD, "hudcamera_empd")
+ set_hud_image_state(DIAG_CAMERA_HUD, hud_state = "hudcamera_empd")
else
- set_hud_image_state(DIAG_CAMERA_HUD, "hudcamera")
+ set_hud_image_state(DIAG_CAMERA_HUD, hud_state = "hudcamera")
/*~~~~~~~~~~~~
Airlocks!
@@ -480,7 +482,7 @@ Diagnostic HUDs!
/mob/living/proc/blood_hud_set_status()
if (CAN_HAVE_BLOOD(src))
- set_hud_image_state(BLOOD_HUD, round_blood_for_hud(src))
+ set_hud_image_state(BLOOD_HUD, hud_state = round_blood_for_hud(src))
#define CACHED_WIDTH_INDEX "width"
#define CACHED_HEIGHT_INDEX "height"
@@ -547,7 +549,7 @@ Diagnostic HUDs!
holder.pixel_w = get_hud_x_offset()
holder.pixel_z = get_hud_y_offset()
-/atom/proc/set_hud_image_state(hud_type, hud_state, x_offset = 0, y_offset = 0)
+/atom/proc/set_hud_image_state(hud_type, hud_icon = DEFAULT_HUDS_DMI, hud_state, x_offset = 0, y_offset = 0)
if (!hud_list) // Still initializing
return
var/image/holder = hud_list[hud_type]
@@ -555,6 +557,7 @@ Diagnostic HUDs!
return
if (!istype(holder)) // Can contain lists for HUD_LIST_LIST hinted HUDs, if someone fucks up and passes this here we wanna know about it
CRASH("[src] ([type]) had a HUD_LIST_LIST hud_type [hud_type] passed into set_hud_image_state!")
+ holder.icon = hud_icon
holder.icon_state = hud_state
adjust_hud_position(holder)
if (x_offset || y_offset)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index a279bc34a50d..6190a9c0d94f 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -717,28 +717,28 @@ GLOBAL_LIST_EMPTY(possible_items)
/datum/objective/capture/check_completion()//Basically runs through all the mobs in the area to determine how much they are worth.
var/captured_amount = 0
- var/area/centcom/central_command_areas/holding/A = GLOB.areas_by_type[/area/centcom/central_command_areas/holding]
- for(var/mob/living/carbon/human/M in A)//Humans.
- if(ismonkey(M))
+ var/area/centcom/central_command_areas/holding/area = GLOB.areas_by_type[/area/centcom/central_command_areas/holding]
+ for(var/mob/living/carbon/human/mob in area)//Humans.
+ if(HAS_TRAIT(mob, TRAIT_LESSER_HUMANOID))
captured_amount+=0.1
continue
- if(M.stat == DEAD)//Dead folks are worth less.
+ if(mob.stat == DEAD)//Dead folks are worth less.
captured_amount+=0.5
continue
captured_amount+=1
- for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research.
- if(M.stat == DEAD)
+ for(var/mob/living/carbon/alien/larva/mob in area)//Larva are important for research.
+ if(mob.stat == DEAD)
captured_amount+=0.5
continue
captured_amount+=1
- for(var/mob/living/carbon/alien/adult/M in A)//Aliens are worth twice as much as humans.
- if(isalienqueen(M))//Queens are worth three times as much as humans.
- if(M.stat == DEAD)
+ for(var/mob/living/carbon/alien/adult/mob in area)//Aliens are worth twice as much as humans.
+ if(isalienqueen(mob))//Queens are worth three times as much as humans.
+ if(mob.stat == DEAD)
captured_amount+=1.5
else
captured_amount+=3
continue
- if(M.stat == DEAD)
+ if(mob.stat == DEAD)
captured_amount+=1
continue
captured_amount+=2
diff --git a/code/game/machinery/big_manipulator/big_manipulator.dm b/code/game/machinery/big_manipulator/big_manipulator.dm
index 433c845fd9de..4f60ec8362d6 100644
--- a/code/game/machinery/big_manipulator/big_manipulator.dm
+++ b/code/game/machinery/big_manipulator/big_manipulator.dm
@@ -339,10 +339,10 @@
if(monkey_worker?.resolve())
return
- if(!ismonkey(monkey))
+ if(!HAS_TRAIT(monkey, TRAIT_LESSER_HUMANOID))
return
- var/mob/living/carbon/human/species/monkey/poor_monkey = monkey
+ var/mob/living/carbon/human/poor_monkey = monkey
if(poor_monkey.mind)
balloon_alert(user, "too smart!")
return
diff --git a/code/game/machinery/computer/atmos_computers/_atmos_control.dm b/code/game/machinery/computer/atmos_computers/_atmos_control.dm
index 5d50ad44efa4..e6711f3eb347 100644
--- a/code/game/machinery/computer/atmos_computers/_atmos_control.dm
+++ b/code/game/machinery/computer/atmos_computers/_atmos_control.dm
@@ -110,6 +110,7 @@
data["maxOutput"] = MAX_OUTPUT_PRESSURE
data["control"] = control
data["reconnecting"] = reconnecting
+ data["defaultGas"] = get_default_gas()
data += return_atmos_handbooks()
return data
@@ -229,6 +230,13 @@
reconnect(ui.user)
return TRUE
+/obj/machinery/computer/atmos_control/proc/get_default_gas()
+ for(var/gas_path, gas_id in GLOB.meta_gas_info[META_GAS_ID])
+ if(gas_id == atmos_chambers[1])
+ return gas_id
+
+ return null
+
/obj/machinery/computer/atmos_control/nocontrol
control = FALSE
circuit = /obj/item/circuitboard/computer/atmos_control/nocontrol
diff --git a/code/game/machinery/computer/atmos_computers/air_sensors.dm b/code/game/machinery/computer/atmos_computers/air_sensors.dm
index 723ffacb2eb7..374459906a4a 100644
--- a/code/game/machinery/computer/atmos_computers/air_sensors.dm
+++ b/code/game/machinery/computer/atmos_computers/air_sensors.dm
@@ -47,7 +47,7 @@
chamber_id = ATMOS_GAS_MONITOR_H2
/obj/machinery/air_sensor/hypernoblium_tank
- name = "hypernoblium tank gas sensor"
+ name = "hyper-noblium tank gas sensor"
chamber_id = ATMOS_GAS_MONITOR_HYPERNOBLIUM
/obj/machinery/air_sensor/miasma_tank
@@ -83,7 +83,7 @@
chamber_id = ATMOS_GAS_MONITOR_HELIUM
/obj/machinery/air_sensor/antinoblium_tank
- name = "antinoblium tank gas sensor"
+ name = "anti-noblium tank gas sensor"
chamber_id = ATMOS_GAS_MONITOR_ANTINOBLIUM
/obj/machinery/air_sensor/incinerator_tank
diff --git a/code/game/machinery/computer/atmos_computers/atmos_controls.dm b/code/game/machinery/computer/atmos_computers/atmos_controls.dm
index bf386c83a1c3..76ccc228dfa6 100644
--- a/code/game/machinery/computer/atmos_computers/atmos_controls.dm
+++ b/code/game/machinery/computer/atmos_computers/atmos_controls.dm
@@ -4,122 +4,122 @@
atmos_chambers = list(ATMOS_GAS_MONITOR_DISTRO = "Distribution Loop", ATMOS_GAS_MONITOR_WASTE = "Waste Loop")
/obj/machinery/computer/atmos_control/oxygen_tank
- name = "Oxygen Supply Control"
+ name = "\improper Oxygen supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/oxygen_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_O2 = "Oxygen Supply")
/obj/machinery/computer/atmos_control/plasma_tank
- name = "Plasma Supply Control"
+ name = "\improper Plasma supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/plasma_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_PLAS = "Plasma Supply")
/obj/machinery/computer/atmos_control/air_tank
- name = "Mixed Air Supply Control"
+ name = "\improper mixed air supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/air_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_AIR = "Mixed Air Supply")
/obj/machinery/computer/atmos_control/nitrous_tank
- name = "Nitrous Oxide Supply Control"
+ name = "\improper Nitrous Oxide supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/nitrous_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_N2O = "Nitrous Oxide Supply")
/obj/machinery/computer/atmos_control/nitrogen_tank
- name = "Nitrogen Supply Control"
+ name = "\improper Nitrogen supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/nitrogen_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_N2 = "Nitrogen Supply")
/obj/machinery/computer/atmos_control/carbon_tank
- name = "Carbon Dioxide Supply Control"
+ name = "\improper Carbon Dioxide supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/carbon_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_CO2 = "Carbon Dioxide Supply")
/obj/machinery/computer/atmos_control/bz_tank
- name = "BZ Supply Control"
+ name = "\improper BZ supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/bz_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_BZ = "BZ Supply")
/obj/machinery/computer/atmos_control/freon_tank
- name = "Freon Supply Control"
+ name = "\improper Freon supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/freon_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_FREON = "Freon Supply")
/obj/machinery/computer/atmos_control/halon_tank
- name = "Halon Supply Control"
+ name = "\improper Halon supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/halon_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_HALON = "Halon Supply")
/obj/machinery/computer/atmos_control/healium_tank
- name = "Healium Supply Control"
+ name = "\improper Healium supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/healium_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_HEALIUM = "Healium Supply")
/obj/machinery/computer/atmos_control/hydrogen_tank
- name = "Hydrogen Supply Control"
+ name = "\improper Hydrogen supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/hydrogen_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_H2 = "Hydrogen Supply")
/obj/machinery/computer/atmos_control/hypernoblium_tank
- name = "Hypernoblium Supply Control"
+ name = "\improper Hyper-Noblium supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/hypernoblium_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_HYPERNOBLIUM = "Hypernoblium Supply")
/obj/machinery/computer/atmos_control/miasma_tank
- name = "Miasma Supply Control"
+ name = "\improper Miasma supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/miasma_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_MIASMA = "Miasma Supply")
/obj/machinery/computer/atmos_control/nitrium_tank
- name = "Nitrium Supply Control"
+ name = "\improper Nitrium supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/nitrium_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_NITRIUM = "Nitrium Supply")
/obj/machinery/computer/atmos_control/pluoxium_tank
- name = "Pluoxium Supply Control"
+ name = "\improper Pluoxium supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/pluoxium_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_PLUOXIUM = "Pluoxium Supply")
/obj/machinery/computer/atmos_control/proto_nitrate_tank
- name = "Proto-Nitrate Supply Control"
+ name = "\improper Proto-Nitrate supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/proto_nitrate_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_PROTO_NITRATE = "Proto-Nitrate Supply")
/obj/machinery/computer/atmos_control/tritium_tank
- name = "Tritium Supply Control"
+ name = "\improper Tritium supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/tritium_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_TRITIUM = "Tritium Supply")
/obj/machinery/computer/atmos_control/water_vapor
- name = "Water Vapor Supply Control"
+ name = "\improper Water Vapor supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/water_vapor
atmos_chambers = list(ATMOS_GAS_MONITOR_H2O = "Water Vapor Supply")
/obj/machinery/computer/atmos_control/zauker_tank
- name = "Zauker Supply Control"
+ name = "\improper Zauker supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/zauker_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_ZAUKER = "Zauker Supply")
/obj/machinery/computer/atmos_control/helium_tank
- name = "Helium Supply Control"
+ name = "\improper Helium supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/helium_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_HELIUM = "Helium Supply")
/obj/machinery/computer/atmos_control/antinoblium_tank
- name = "Antinoblium Supply Control"
+ name = "\improper Anti-Noblium supply control"
circuit = /obj/item/circuitboard/computer/atmos_control/antinoblium_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_ANTINOBLIUM = "Antinoblium Supply")
/obj/machinery/computer/atmos_control/mix_tank
- name = "Mix Chamber Control"
+ name = "mix chamber control"
circuit = /obj/item/circuitboard/computer/atmos_control/mix_tank
atmos_chambers = list(ATMOS_GAS_MONITOR_MIX = "Mix Chamber")
/obj/machinery/computer/atmos_control/nocontrol/incinerator
- name = "Incinerator Chamber Monitor"
+ name = "incinerator chamber monitor"
circuit = /obj/item/circuitboard/computer/atmos_control/nocontrol/incinerator
atmos_chambers = list(ATMOS_GAS_MONITOR_INCINERATOR = "Incinerator Chamber")
/obj/machinery/computer/atmos_control/ordnancemix
- name = "Ordnance Chamber Control"
+ name = "ordnance chamber control"
circuit = /obj/item/circuitboard/computer/atmos_control/ordnancemix
atmos_chambers = list(
ATMOS_GAS_MONITOR_ORDNANCE_BURN = "Ordnance Burn Chamber",
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index eaf1119e6339..401dd04a1d5e 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -269,6 +269,19 @@
return
if (!can_purchase_this_shuttle(shuttle))
return
+ if (istype(shuttle, /datum/map_template/shuttle/emergency/departmental))
+ var/datum/map_template/shuttle/emergency/departmental/dept_shuttle = shuttle
+ if(dept_shuttle.department_type)
+ var/max_crew_count = 0
+ for(var/dept_type in SSjob.joinable_departments_by_type)
+ var/crew_count = get_department_employee_count(dept_type)
+ if(crew_count > max_crew_count)
+ max_crew_count = crew_count
+
+ var/crew_in_department = get_department_employee_count(dept_shuttle.department_type)
+ if(crew_in_department <= 0 || crew_in_department < max_crew_count)
+ to_chat(user, span_alert("This shuttle can be buyed only if this department has most employees."))
+ return
if (!shuttle.prerequisites_met())
to_chat(user, span_alert("You have not met the requirements for purchasing this shuttle."))
return
@@ -608,6 +621,27 @@
if (!can_purchase_this_shuttle(shuttle_template))
continue
+ var/department_locked = FALSE
+ var/department_name_string = ""
+
+ if (istype(shuttle_template, /datum/map_template/shuttle/emergency/departmental))
+ var/datum/map_template/shuttle/emergency/departmental/dept_shuttle = shuttle_template
+ department_name_string = dept_shuttle.department_name
+
+ if (dept_shuttle.department_type)
+ var/crew_in_department = get_department_employee_count(dept_shuttle.department_type)
+ if(crew_in_department <= 0)
+ department_locked = TRUE
+ else
+ for(var/other_id in SSmapping.shuttle_templates)
+ var/datum/map_template/shuttle/emergency/departmental/other_shuttle = SSmapping.shuttle_templates[other_id]
+ if(!istype(other_shuttle) || other_shuttle == dept_shuttle || !other_shuttle.department_type)
+ continue
+ var/crew_in_other_department = get_department_employee_count(other_shuttle.department_name)
+ if(crew_in_department < crew_in_other_department)
+ department_locked = TRUE
+ break
+
shuttles += list(list(
"name" = shuttle_template.name,
"description" = shuttle_template.description,
@@ -617,6 +651,8 @@
"emagOnly" = shuttle_template.emag_only,
"prerequisites" = shuttle_template.prerequisites,
"ref" = REF(shuttle_template),
+ "department_locked" = department_locked,
+ "department_name" = department_name_string,
))
data["budget"] = bank_account.account_balance
@@ -720,6 +756,19 @@
return FALSE
+/// Used in checks of dept-locked shuttles.
+/// Determines number of employees in department.
+/obj/machinery/computer/communications/proc/get_department_employee_count(datum/job_department/target_department_type)
+ if(!target_department_type)
+ return
+ var/datum/job_department/current_department = SSjob.joinable_departments_by_type[target_department_type]
+ if(!istype(current_department))
+ return
+ var/total_crew_count = 0
+ for(var/datum/job/current_job in current_department.department_jobs)
+ total_crew_count += current_job.current_positions
+ return total_crew_count
+
/obj/machinery/computer/communications/proc/can_send_messages_to_other_sectors(mob/user)
if (!authenticated_as_non_silicon_captain(user))
return
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index 06bc865c1ee3..0f6b0215a5eb 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -295,7 +295,11 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
var/mob/living/silicon/ai/AI = usr
if(!istype(AI))
return
- AI.ai_tracking_tool.track_name(AI, params["name"])
+ // We need to do this because the ID might add an honorific and otherwise break tracking
+ var/mob/living/target = locate(params["ref"]) in GLOB.mob_living_list
+ if(isnull(target))
+ return
+ AI.ai_tracking_tool.track_mob(AI, target)
#undef SENSORS_UPDATE_PERIOD
#undef UNKNOWN_JOB_ID
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index 76d3eab6c4e6..4443f3c285dc 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -351,7 +351,7 @@
data["subjectStatus"] = scanner_occupant.stat
data["subjectHealth"] = scanner_occupant.health
data["subjectEnzymes"] = scanner_occupant.dna.unique_enzymes
- data["isMonkey"] = ismonkey(scanner_occupant)
+ data["isMonkey"] = HAS_TRAIT(scanner_occupant, TRAIT_LESSER_HUMANOID)
data["subjectUNI"] = scanner_occupant.dna.unique_identity
data["subjectUF"] = scanner_occupant.dna.unique_features
data["storage"]["occupant"] = tgui_occupant_mutations
diff --git a/code/game/machinery/computer/orders/order_computer/mining_order.dm b/code/game/machinery/computer/orders/order_computer/mining_order.dm
index 074386b1f4be..b07047dbbc03 100644
--- a/code/game/machinery/computer/orders/order_computer/mining_order.dm
+++ b/code/game/machinery/computer/orders/order_computer/mining_order.dm
@@ -40,7 +40,8 @@
/obj/machinery/computer/order_console/mining/order_groceries(mob/living/purchaser, obj/item/card/id/card, list/groceries)
var/list/things_to_order = list()
for(var/datum/orderable_item/item as anything in groceries)
- things_to_order[item.purchase_path] = groceries[item]
+ var/purchase_path = item.get_purchased_item(purchaser, card)
+ things_to_order[purchase_path] = groceries[item]
var/datum/supply_pack/custom/mining_pack = new(
purchaser = purchaser, \
diff --git a/code/game/machinery/computer/orders/order_computer/order_computer.dm b/code/game/machinery/computer/orders/order_computer/order_computer.dm
index ab8b32bb6121..0e855d0090b4 100644
--- a/code/game/machinery/computer/orders/order_computer/order_computer.dm
+++ b/code/game/machinery/computer/orders/order_computer/order_computer.dm
@@ -189,8 +189,9 @@ GLOBAL_LIST_EMPTY(order_console_products)
stack_trace("[src] somehow delivered [item] which is not purchasable at this order console.")
grocery_list.Remove(item)
continue
+ var/purchase_path = item.get_purchased_item(living_user, used_id_card)
for(var/amt in 1 to grocery_list[item])//every order amount
- ordered_paths += item.purchase_path
+ ordered_paths += purchase_path
podspawn(list(
"target" = get_turf(living_user),
"style" = /datum/pod_style/advanced,
diff --git a/code/game/machinery/computer/orders/order_items/mining/order_consumables.dm b/code/game/machinery/computer/orders/order_items/mining/order_consumables.dm
index b298eb9f96db..300c52fd3e8e 100644
--- a/code/game/machinery/computer/orders/order_items/mining/order_consumables.dm
+++ b/code/game/machinery/computer/orders/order_items/mining/order_consumables.dm
@@ -9,6 +9,12 @@
purchase_path = /obj/item/reagent_containers/hypospray/medipen/survival/luxury
cost_per_order = 750
+// slime accounts get ourple pen :3
+/datum/orderable_item/consumables/luxury_pen/get_purchased_item(mob/living/user, obj/item/card/id/card)
+ if(cmptext(trimtext(find_record(card.registered_account?.account_holder)?.species), /datum/species/jelly::name))
+ return /obj/item/reagent_containers/hypospray/medipen/survival/luxury/purple
+ return ..()
+
/datum/orderable_item/consumables/medkit
purchase_path = /obj/item/storage/medkit/brute
cost_per_order = 400
diff --git a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm
index d628e3fc3292..9b29a897cb69 100644
--- a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm
+++ b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm
@@ -3,6 +3,10 @@
/datum/orderable_item/mining/marker_beacon
purchase_path = /obj/item/stack/marker_beacon/ten
+ cost_per_order = 60
+
+/datum/orderable_item/mining/candela_beacon
+ purchase_path = /obj/item/stack/candela_beacon/ten
cost_per_order = 80
/datum/orderable_item/mining/skeleton_key
@@ -14,8 +18,8 @@
cost_per_order = 320
/datum/orderable_item/mining/fulton_core
- purchase_path = /obj/item/fulton_core
- cost_per_order = 320
+ purchase_path = /obj/item/fulton_core/networked
+ cost_per_order = 280
/datum/orderable_item/mining/mining_modsuit
purchase_path = /obj/item/mod/control/pre_equipped/mining
@@ -51,8 +55,8 @@
cost_per_order = 675
/datum/orderable_item/mining/fulton
- purchase_path = /obj/item/extraction_pack
- cost_per_order = 800
+ purchase_path = /obj/item/extraction_pack/networked
+ cost_per_order = 400
/datum/orderable_item/mining/lazarus
purchase_path = /obj/item/lazarus_injector
diff --git a/code/game/machinery/computer/orders/order_items/order_datum.dm b/code/game/machinery/computer/orders/order_items/order_datum.dm
index 28c21a14f267..ac3a0cb370b4 100644
--- a/code/game/machinery/computer/orders/order_items/order_datum.dm
+++ b/code/game/machinery/computer/orders/order_items/order_datum.dm
@@ -21,3 +21,6 @@
name = initial(purchase_path.name)
if(!desc)
desc = initial(purchase_path.desc)
+
+/datum/orderable_item/proc/get_purchased_item(mob/living/user, obj/item/card/id/card)
+ return purchase_path
diff --git a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm
index 984dfd4a8273..0683af2ff0df 100644
--- a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm
@@ -284,6 +284,7 @@
feature_key = FEATURE_TAIL_FISH
color_source = ORGAN_COLOR_OVERRIDE
draw_on_husks = HUSK_OVERLAY_GRAYSCALE
+ mesh_in_suits = TRUE
/datum/bodypart_overlay/mutant/tail/fish/on_mob_insert(obj/item/organ/parent, mob/living/carbon/receiver)
//Initialize the related dna feature block if we don't have any so it doesn't error out.
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 45faaa3257f3..f21a9f3cdd4c 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -670,12 +670,8 @@
if(isalien(future_pancake)) //For xenos
future_pancake.apply_damage(DOOR_CRUSH_DAMAGE * 1.5, BRUTE, BODY_ZONE_CHEST, wound_bonus = door_wounding, attacking_item = src) //Xenos go into crit after aproximately the same amount of crushes as humans.
future_pancake.emote("roar")
- else if(ismonkey(future_pancake)) //For monkeys
- future_pancake.emote("screech")
- future_pancake.apply_damage(DOOR_CRUSH_DAMAGE, BRUTE, BODY_ZONE_CHEST, wound_bonus = door_wounding, attacking_item = src)
- future_pancake.Paralyze(10 SECONDS)
else if(ishuman(future_pancake)) //For humans
- future_pancake.emote("scream")
+ future_pancake.emote(HAS_TRAIT(future_pancake, TRAIT_SIMIAN) ? "screch" : "scream")
future_pancake.apply_damage(DOOR_CRUSH_DAMAGE, BRUTE, BODY_ZONE_CHEST, wound_bonus = door_wounding, attacking_item = src)
future_pancake.Paralyze(10 SECONDS)
else //for simple_animals & borgs
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index a907d4e6d9e9..a221867bc13b 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -146,13 +146,9 @@
if(ishuman(living_user))
context[SCREENTIP_CONTEXT_LMB] = "Knock"
return CONTEXTUAL_SCREENTIP_SET
- else
- if(ismonkey(living_user))
- context[SCREENTIP_CONTEXT_LMB] = "Attack"
- return CONTEXTUAL_SCREENTIP_SET
- if(ishuman(living_user))
- context[SCREENTIP_CONTEXT_LMB] = "Bash"
- return CONTEXTUAL_SCREENTIP_SET
+ else if(ishuman(living_user))
+ context[SCREENTIP_CONTEXT_LMB] = "Bash"
+ return CONTEXTUAL_SCREENTIP_SET
else if(issilicon(living_user))
context[SCREENTIP_CONTEXT_LMB] = "Close"
return CONTEXTUAL_SCREENTIP_SET
diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm
index 18e880902963..9b8224c9d4c5 100644
--- a/code/game/machinery/embedded_controller/airlock_controller.dm
+++ b/code/game/machinery/embedded_controller/airlock_controller.dm
@@ -279,7 +279,7 @@
return last_pressure
/obj/machinery/airlock_controller/incinerator_ordmix
- name = "Incinerator Access Console"
+ name = "incinerator access console"
airpump_tag = INCINERATOR_ORDMIX_DP_VENTPUMP
exterior_door_tag = INCINERATOR_ORDMIX_AIRLOCK_EXTERIOR
id_tag = INCINERATOR_ORDMIX_AIRLOCK_CONTROLLER
@@ -288,7 +288,7 @@
sensor_tag = INCINERATOR_ORDMIX_AIRLOCK_SENSOR
/obj/machinery/airlock_controller/incinerator_atmos
- name = "Incinerator Access Console"
+ name = "incinerator access console"
airpump_tag = INCINERATOR_ATMOS_DP_VENTPUMP
exterior_door_tag = INCINERATOR_ATMOS_AIRLOCK_EXTERIOR
id_tag = INCINERATOR_ATMOS_AIRLOCK_CONTROLLER
@@ -297,7 +297,7 @@
sensor_tag = INCINERATOR_ATMOS_AIRLOCK_SENSOR
/obj/machinery/airlock_controller/incinerator_syndicatelava
- name = "Incinerator Access Console"
+ name = "incinerator access console"
airpump_tag = INCINERATOR_SYNDICATELAVA_DP_VENTPUMP
exterior_door_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_EXTERIOR
id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_CONTROLLER
diff --git a/code/game/machinery/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm
index 8192cf3c93c7..c3bd69ce7655 100644
--- a/code/game/machinery/medipen_refiller.dm
+++ b/code/game/machinery/medipen_refiller.dm
@@ -19,6 +19,7 @@
/obj/item/reagent_containers/hypospray/medipen/methamphetamine = /datum/reagent/drug/methamphetamine,
/obj/item/reagent_containers/hypospray/medipen/survival = /datum/reagent/medicine/c2/libital,
/obj/item/reagent_containers/hypospray/medipen/survival/luxury = /datum/reagent/medicine/c2/penthrite,
+ /obj/item/reagent_containers/hypospray/medipen/survival/luxury/purple = /datum/reagent/medicine/c2/penthrite,
/obj/item/reagent_containers/hypospray/medipen/invisibility = /datum/reagent/drug/saturnx,
)
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 9cc318779a84..35bcc1d1ea08 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -556,7 +556,9 @@ DEFINE_BITFIELD(turret_flags, list(
raising = 1
if(cover)
flick("popup", cover)
- sleep(POPUP_ANIM_TIME)
+ addtimer(CALLBACK(src, PROC_REF(finish_popup)), POPUP_ANIM_TIME, TIMER_STOPPABLE | TIMER_DELETE_ME)
+
+/obj/machinery/porta_turret/proc/finish_popup()
raising = 0
if(cover)
cover.icon_state = "openTurretCover"
@@ -572,7 +574,9 @@ DEFINE_BITFIELD(turret_flags, list(
raising = 1
if(cover)
flick("popdown", cover)
- sleep(POPDOWN_ANIM_TIME)
+ addtimer(CALLBACK(src, PROC_REF(finish_popdown)), POPDOWN_ANIM_TIME, TIMER_STOPPABLE | TIMER_DELETE_ME)
+
+/obj/machinery/porta_turret/proc/finish_popdown()
raising = 0
if(cover)
cover.icon_state = "turretCover"
diff --git a/code/game/objects/effects/decals/cleanable/blood.dm b/code/game/objects/effects/decals/cleanable/blood.dm
index 7b191cc65943..b0dd12a832be 100644
--- a/code/game/objects/effects/decals/cleanable/blood.dm
+++ b/code/game/objects/effects/decals/cleanable/blood.dm
@@ -304,6 +304,8 @@
/obj/effect/decal/cleanable/blood/trail_holder/Initialize(mapload, list/datum/disease/diseases, list/blood_or_dna = get_default_blood_type())
. = ..()
+ if(. == INITIALIZE_HINT_QDEL)
+ return
icon_state = "nothing"
update_appearance() // Cut possible overlays
if(mapload)
@@ -537,6 +539,8 @@
/obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases, list/blood_or_dna = get_default_blood_type())
. = ..()
+ if(. == INITIALIZE_HINT_QDEL)
+ return
leave_blood = has_blood_flag(GET_ATOM_BLOOD_DNA(src), BLOOD_COVER_TURFS)
if(squishy)
AddElement(/datum/element/squish_sound)
@@ -691,6 +695,8 @@
/obj/effect/decal/cleanable/blood/footprints/Initialize(mapload, list/datum/disease/diseases, list/blood_or_dna = get_default_blood_type())
. = ..()
+ if(. == INITIALIZE_HINT_QDEL)
+ return
icon_state = "" // All of the footprint visuals come from overlays
if(mapload)
entered_dirs |= dir // Keep the same appearance as in the map editor
@@ -817,6 +823,8 @@
/obj/effect/decal/cleanable/blood/hitsplatter/Initialize(mapload, list/datum/disease/diseases, list/blood_or_dna = get_default_blood_type(), splatter_strength)
. = ..()
+ if(. == INITIALIZE_HINT_QDEL)
+ return
leave_blood = has_blood_flag(GET_ATOM_BLOOD_DNA(src), BLOOD_COVER_TURFS)
prev_loc = loc //Just so we are sure prev_loc exists
if(splatter_strength)
diff --git a/code/game/objects/effects/decals/cleanable/fuel.dm b/code/game/objects/effects/decals/cleanable/fuel.dm
index 6dbd03ac8bea..a1a91cd90f74 100644
--- a/code/game/objects/effects/decals/cleanable/fuel.dm
+++ b/code/game/objects/effects/decals/cleanable/fuel.dm
@@ -12,13 +12,15 @@
var/burning = FALSE
/// Type of hotspot fuel pool spawns upon being ignited
var/hotspot_type = /obj/effect/hotspot
-
-/obj/effect/decal/cleanable/fuel_pool/Initialize(mapload, burn_stacks)
- . = ..()
var/static/list/loc_connections = list(
COMSIG_TURF_MOVABLE_THROW_LANDED = PROC_REF(ignition_trigger),
COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
)
+
+/obj/effect/decal/cleanable/fuel_pool/Initialize(mapload, burn_stacks)
+ . = ..()
+ if(. == INITIALIZE_HINT_QDEL)
+ return
AddElement(/datum/element/connect_loc, loc_connections)
for(var/obj/effect/decal/cleanable/fuel_pool/pool in get_turf(src)) //Can't use locate because we also belong to that turf
if(pool == src)
@@ -31,6 +33,10 @@
return INITIALIZE_HINT_LATELOAD
+/obj/effect/decal/cleanable/fuel_pool/Destroy(force)
+ RemoveElement(/datum/element/connect_loc, loc_connections)
+ return ..()
+
// Just in case of fires, do this after mapload.
/obj/effect/decal/cleanable/fuel_pool/LateInitialize()
// We don't want to burn down the create_and_destroy test area
diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm
index 1839ec498b93..9fb0f546c84f 100644
--- a/code/game/objects/effects/decals/decal.dm
+++ b/code/game/objects/effects/decals/decal.dm
@@ -5,6 +5,9 @@
abstract_type = /obj/effect/decal
anchored = TRUE
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ var/static/list/decal_move_connections = list(
+ COMSIG_TURF_CHANGE = PROC_REF(on_decal_move),
+ )
/obj/effect/decal/Initialize(mapload)
. = ..()
@@ -13,14 +16,15 @@
stack_trace("[name] spawned in a bad turf ([loc]) at [AREACOORD(src)] in \the [get_area(src)]. \
Please remove it or allow it to pass NeverShouldHaveComeHere if it's intended.")
return INITIALIZE_HINT_QDEL
- var/static/list/loc_connections = list(
- COMSIG_TURF_CHANGE = PROC_REF(on_decal_move),
- )
while(isopenspaceturf(loc) && can_z_move(DOWN, z_move_flags = ZMOVE_ALLOW_ANCHORED))
zMove(DOWN, z_move_flags = ZMOVE_ALLOW_ANCHORED)
- AddElement(/datum/element/connect_loc, loc_connections)
+ AddElement(/datum/element/connect_loc, decal_move_connections)
AddElement(/datum/element/force_move_pulled)
+/obj/effect/decal/Destroy(force)
+ RemoveElement(/datum/element/connect_loc, decal_move_connections)
+ return ..()
+
/obj/effect/decal/blob_act(obj/structure/blob/B)
if(B && B.loc == loc)
qdel(src)
diff --git a/code/game/objects/effects/mining_mob_respawner.dm b/code/game/objects/effects/mining_mob_respawner.dm
index 5f9365f7d1f5..7e99308a1277 100644
--- a/code/game/objects/effects/mining_mob_respawner.dm
+++ b/code/game/objects/effects/mining_mob_respawner.dm
@@ -7,8 +7,10 @@
var/outdoor_only = TRUE
/// Are we waiting for a mob to spawn so we can link to it?
var/registered_spawn_signal = FALSE
- // Spawn somewhere in an area around the spawner rather than dead on it
+ /// Spawn somewhere in an area around the spawner rather than dead on it
var/respawn_range = 3
+ /// Range in which active Candela nodes prevent our mob spawns
+ var/network_block_range = 5
/// Min time from storm to spawn a mob
var/min_delay = 1 SECONDS
/// Max time from storm to spawn a mob
@@ -110,6 +112,19 @@
var/mob/living/resolved = our_mob?.resolve()
if (resolved && resolved.stat != DEAD)
return
+
+ var/list/blockers = list()
+ // Respawns get blocked by active Candela network nodes nearby
+ for (var/datum/mining_beacon_network/network as anything in GLOB.mining_beacon_networks)
+ if (!network.powered)
+ continue
+ for (var/datum/component/candela_node/node as anything in network.linked_nodes)
+ blockers[get_turf(node.parent)] = TRUE
+
+ for(var/turf/turf_in_view in view(network_block_range, get_turf(src)))
+ if (blockers[turf_in_view])
+ return
+
if (prob(respawn_chance))
addtimer(CALLBACK(src, PROC_REF(make_mob)), rand(min_delay, max_delay), TIMER_DELETE_ME)
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index 2015c0824639..e9c6ba57a671 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -70,3 +70,12 @@
layer = FLY_LAYER
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
appearance_flags = RESET_TRANSFORM | LONG_GLIDE | PIXEL_SCALE | TILE_BOUND
+
+/obj/effect/overlay/wave_headsup
+ icon_state = "headsup"
+ pixel_y = 32
+ alpha = 100
+ plane = ABOVE_GAME_PLANE
+ layer = FLY_LAYER
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ appearance_flags = RESET_TRANSFORM | LONG_GLIDE | PIXEL_SCALE | TILE_BOUND
diff --git a/code/game/objects/effects/spiderwebs.dm b/code/game/objects/effects/spiderwebs.dm
index e8de468af285..d56e134e7b43 100644
--- a/code/game/objects/effects/spiderwebs.dm
+++ b/code/game/objects/effects/spiderwebs.dm
@@ -99,6 +99,8 @@
/// Drains stamina and shows feedback when you get stuck moving thru a web
/obj/structure/spider/stickyweb/proc/stuck_react(mob/living/victim)
+ if(QDELETED(victim))
+ return
if(victim.get_stamina_loss() > 90)
if(victim.body_position != LYING_DOWN)
to_chat(victim, span_warning("You trip over \the [src] due to exhaustion!"))
diff --git a/code/game/objects/effects/temporary_visuals/effect_trail.dm b/code/game/objects/effects/temporary_visuals/effect_trail.dm
index e8ab9526f519..123d13cd4b31 100644
--- a/code/game/objects/effects/temporary_visuals/effect_trail.dm
+++ b/code/game/objects/effects/temporary_visuals/effect_trail.dm
@@ -36,7 +36,7 @@
RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_target_invalid))
/obj/effect/temp_visual/effect_trail/proc/add_spawner()
- AddComponent(/datum/component/spawner, spawn_types = list(spawned_effect), max_spawned = max_spawned, spawn_time = spawn_interval)
+ AddComponent(/datum/component/spawner, spawn_types = list(spawned_effect), max_spawned = max_spawned, spawn_time = spawn_interval, spawner_logic = SPAWN_CONTINUOUS_BEHAVIOR)
/// Destroy ourselves if the target is no longer valid
/obj/effect/temp_visual/effect_trail/proc/on_target_invalid()
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 04ddd8566e60..70483a19e230 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -434,7 +434,7 @@ GAME_VERB_SRC(/obj/item, move_to_top, oview(1), "Move To Top", null)
if(item_flags & CRUEL_IMPLEMENT)
.[span_red("morbid")] = "It seems quite practical for particularly morbid procedures and experiments."
- if(item_flags & BLUESPACE_INTERFERENCE)
+ if(HAS_TRAIT(src, TRAIT_BLUESPACE_INTERFERENCE))
.["bluespace-active"] = "It is highly active in bluespace and will cause malfunctions in teleporters."
if (siemens_coefficient == 0)
.["insulated"] = "It is made from a robust electrical insulator and will block any electricity passing through it!"
@@ -978,9 +978,14 @@ GAME_VERB_SRC(/obj/item, verb_pickup, oview(1), "Pick up", null)
if(isturf(location))
location.hotspot_expose(flame_heat, 5)
// DARKPACK EDIT ADD START - TURF_FIRE
- if(SEND_SIGNAL(location, COMSIG_TURF_OPEN_FLAME, flame_heat) & BLOCK_TURF_IGNITION)
- return
var/turf/open/open_location = loc // NOT the location variable used earlier else cigarettes in mouths start fires
+ if(SEND_SIGNAL(open_location, COMSIG_TURF_OPEN_FLAME, flame_heat) & BLOCK_TURF_IGNITION)
+ return
+ // Checking src here incase we have... a flamable table. that should ignite its turf.
+ if(HAS_TRAIT(open_location, TRAIT_ELEVATED_TURF) && !HAS_TRAIT(src, TRAIT_ELEVATING_OBJECT))
+ return
+ if(HAS_TRAIT(src, TRAIT_ELEVATED_FLAME))
+ return
if(isopenturf(open_location) && open_location.flammability >= 1 && prob(open_location.flammability))
open_location.ignite_turf(2) // if there's enough flammability for a fire to sustain itself..
// DARKPACK EDIT ADD END
@@ -1839,7 +1844,7 @@ GAME_VERB_SRC(/obj/item, verb_pickup, oview(1), "Pick up", null)
/obj/item/proc/item_start_equip(atom/target, obj/item/equipping, mob/user, show_visible_message = TRUE)
if(show_visible_message)
- if(HAS_TRAIT(equipping, TRAIT_DANGEROUS_OBJECT))
+ if(HAS_TRAIT(equipping, TRAIT_DANGEROUS_EQUIP))
target.visible_message(
span_danger("[user] tries to put [equipping] on [target]."),
span_userdanger("[user] tries to put [equipping] on you."),
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index a22bb770d968..21d65ac6cc41 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -1027,6 +1027,10 @@
/obj/item/card/id/proc/get_trim_assignment()
return trim?.assignment || assignment
+/// Returns the trim sechud icon state.
+/obj/item/card/id/proc/get_trim_sechud_icon()
+ return trim?.sechud_icon || DEFAULT_HUDS_DMI
+
/// Returns the trim sechud icon state.
/obj/item/card/id/proc/get_trim_sechud_icon_state()
return trim?.sechud_icon_state || SECHUD_UNKNOWN
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 82d72caae26a..c1948c7cd4bb 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -616,6 +616,7 @@
. = ..()
AddElement(/datum/element/floor_placeable)
AddElement(/datum/element/update_icon_updates_onmob)
+ ADD_TRAIT(src, TRAIT_ELEVATED_FLAME, INNATE_TRAIT) // DARKPACK EDIT ADD - TURF_FIRE
/**
* Just checks the wax level of the candle for displaying the correct sprite.
diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm
index 036db0639d6a..5ef84017bbc2 100644
--- a/code/game/objects/items/devices/scanners/gas_analyzer.dm
+++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm
@@ -27,6 +27,8 @@
var/barometer_accuracy
/// Cached gasmix data from ui_interact
var/list/last_gasmix_data
+
+ var/datum/weakref/last_scanned
/// Max scan distance
var/ranged_scan_distance = 1
@@ -134,39 +136,59 @@
return return_atmos_handbooks()
/obj/item/analyzer/ui_data(mob/user)
- LAZYINITLIST(last_gasmix_data)
- return list("gasmixes" = last_gasmix_data)
+ var/obj/item/last_scanned_real = last_scanned?.resolve()
+ if(!QDELETED(last_scanned_real) && can_see(user, last_scanned_real, ranged_scan_distance))
+ collect_scan_info(last_scanned_real) // updates last_gasmix_data as long as we're in range
+
+ return list(
+ "gasmixes" = last_gasmix_data,
+ )
+
+/// Checks if we can use the analyzer at all
+/obj/item/analyzer/proc/can_use(mob/user)
+ if(!user.can_read(src))
+ return FALSE
+ // Logical, but it contains "tutorial information", so we should allow it.
+ // if(user.is_blind())
+ // return FALSE
+ return TRUE
+
+/obj/item/analyzer/ui_status(mob/user)
+ return can_use(user) ? ..() : UI_CLOSE
/obj/item/analyzer/attack_self(mob/user, modifiers)
- if(IS_UNCONSCIOUS_OR_CRIT(user) || !user.can_read(src) || user.is_blind())
- return
- atmos_scan(user=user, target=get_turf(src), silent=FALSE)
- on_analyze(source=src, target=get_turf(src))
+ scan_atom(get_turf(src), user)
+ return TRUE
/obj/item/analyzer/attack_self_secondary(mob/user, modifiers)
- if(IS_UNCONSCIOUS_OR_CRIT(user) || !user.can_read(src) || user.is_blind())
- return
-
ui_interact(user)
+ return TRUE
/obj/item/analyzer/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
if(istype(interacting_with, /obj/effect/anomaly) && can_see(user, interacting_with, ranged_scan_distance))
var/obj/effect/anomaly/ranged_anomaly = interacting_with
ranged_anomaly.analyzer_act(user, src)
return ITEM_INTERACT_SUCCESS
+
return interact_with_atom(interacting_with, user, modifiers)
/obj/item/analyzer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
if(!HAS_TRAIT(interacting_with, TRAIT_COMBAT_MODE_SKIP_INTERACTION) && can_see(user, interacting_with, ranged_scan_distance))
- atmos_scan(user, (interacting_with.return_analyzable_air() ? interacting_with : get_turf(interacting_with)))
+ scan_atom(interacting_with.return_analyzable_air() ? interacting_with : get_turf(interacting_with), user)
return NONE // Non-blocking
-/// Called when our analyzer is used on something
-/obj/item/analyzer/proc/on_analyze(datum/source, atom/target)
- SIGNAL_HANDLER
+/obj/item/analyzer/proc/scan_atom(atom/target, mob/living/user)
+ if(!can_use(user))
+ return
+
+ atmos_scan(user, target, silent = FALSE)
+ collect_scan_info(target)
+
+/obj/item/analyzer/proc/collect_scan_info(atom/target)
var/mixture = target.return_analyzable_air()
if(!mixture)
- return FALSE
+ return
+
var/list/airs = islist(mixture) ? mixture : list(mixture)
var/list/new_gasmix_data = list()
for(var/datum/gas_mixture/air as anything in airs)
@@ -175,6 +197,12 @@
mix_name += " - Node [airs.Find(air)]"
new_gasmix_data += list(gas_mixture_parser(air, mix_name))
last_gasmix_data = new_gasmix_data
+ last_scanned = WEAKREF(target)
+
+/// Called when our analyzer is used on something
+/obj/item/analyzer/proc/on_analyze(datum/source, atom/target)
+ SIGNAL_HANDLER
+ collect_scan_info(target)
/**
* Outputs a message to the user describing the target's gasmixes.
diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm
index 178f67c0b008..3e6c30916b89 100644
--- a/code/game/objects/items/dna_injector.dm
+++ b/code/game/objects/items/dna_injector.dm
@@ -66,7 +66,7 @@
target.dna.remove_mutation(removed_mutation, GLOB.standard_mutation_sources)
for(var/datum/mutation/added_mutation as anything in add_mutations)
- if(added_mutation::warn_admins_on_inject && target != user && !ismonkey(target))
+ if(added_mutation::warn_admins_on_inject && target != user && !HAS_TRAIT(target, TRAIT_LESSER_HUMANOID))
message_admins("[ADMIN_LOOKUPFLW(user)] injected [key_name_admin(target)] with [src] containing [added_mutation::name].")
if(target.dna.mutation_in_sequence(added_mutation))
target.dna.activate_mutation(added_mutation)
diff --git a/code/game/objects/items/dna_probe.dm b/code/game/objects/items/dna_probe.dm
index a4dbfe243009..95243b951cb5 100644
--- a/code/game/objects/items/dna_probe.dm
+++ b/code/game/objects/items/dna_probe.dm
@@ -108,7 +108,7 @@
balloon_alert(user, "data added")
return TRUE
- if(ishuman(target) && !ismonkey(target))
+ if(ishuman(target) && !HAS_TRAIT(target, TRAIT_LESSER_HUMANOID))
var/mob/living/carbon/human/human_target = target
if(our_vault.human_dna[human_target.dna.unique_identity])
balloon_alert(user, "data already in vault!")
@@ -124,7 +124,7 @@
balloon_alert(user, "data added")
return TRUE
- if(!is_type_in_typecache(target, animal_typecache) && !ismonkey(target))
+ if(!is_type_in_typecache(target, animal_typecache) && !HAS_TRAIT(target, TRAIT_LESSER_HUMANOID))
return FALSE
if(our_vault.animal_dna[target.type])
balloon_alert(user, "data already in vault!")
@@ -146,9 +146,9 @@
/obj/item/dna_probe/proc/valid_scan_target(atom/target)
if((allowed_scans & DNA_PROBE_SCAN_PLANTS) && istype(target, /obj/machinery/hydroponics))
return TRUE
- if((allowed_scans & DNA_PROBE_SCAN_HUMANS) && (ishuman(target) && !ismonkey(target)))
+ if((allowed_scans & DNA_PROBE_SCAN_HUMANS) && (ishuman(target) && !HAS_TRAIT(target, TRAIT_LESSER_HUMANOID)))
return TRUE
- if((allowed_scans & DNA_PROBE_SCAN_ANIMALS) && (is_type_in_typecache(target, animal_typecache) || ismonkey(target)))
+ if((allowed_scans & DNA_PROBE_SCAN_ANIMALS) && (is_type_in_typecache(target, animal_typecache) || HAS_TRAIT(target, TRAIT_LESSER_HUMANOID)))
return TRUE
return FALSE
diff --git a/code/game/objects/items/floppy_disk.dm b/code/game/objects/items/floppy_disk.dm
index 60dfac95a56b..0e022be5843c 100644
--- a/code/game/objects/items/floppy_disk.dm
+++ b/code/game/objects/items/floppy_disk.dm
@@ -264,10 +264,10 @@
var/obj/item/disk/top = stacked_disks[length(stacked_disks)]
user.put_in_hands(top)
- balloon_alert(user, "removed top disk")
if(length(stacked_disks) > 1)
update_appearance(UPDATE_OVERLAYS)
+ balloon_alert(user, "removed top disk")
return TRUE
var/obj/item/disk/last_disk = stacked_disks[1]
@@ -281,6 +281,7 @@
last_disk.pixel_x = pixel_x
last_disk.pixel_y = pixel_y
+ last_disk.balloon_alert(user, "removed top disk")
qdel(src)
return TRUE
diff --git a/code/game/objects/items/grenades/atmos_grenades.dm b/code/game/objects/items/grenades/atmos_grenades.dm
index fb8bebe283b6..1db715d4aab4 100644
--- a/code/game/objects/items/grenades/atmos_grenades.dm
+++ b/code/game/objects/items/grenades/atmos_grenades.dm
@@ -1,6 +1,7 @@
/obj/item/grenade/gas_crystal
- desc = "Some kind of crystal, this shouldn't spawn"
- name = "Gas Crystal"
+ name = "gas crystal"
+ desc = "Some kind of crystal."
+ abstract_type = /obj/item/grenade/gas_crystal
icon = 'icons/obj/weapons/grenade.dmi'
icon_state = "bluefrag"
inhand_icon_state = "flashbang"
@@ -24,8 +25,8 @@
addtimer(CALLBACK(src, PROC_REF(detonate)), isnull(delayoverride)? det_time : delayoverride)
/obj/item/grenade/gas_crystal/healium_crystal
- name = "Healium crystal"
- desc = "A crystal made from the Healium gas, it's cold to the touch."
+ name = "\improper Healium crystal"
+ desc = "A crystal made from the Healium gas. It's cold to the touch."
icon_state = "healium_crystal"
///Range of the grenade that will cool down and affect mobs
var/fix_range = 7
@@ -47,8 +48,8 @@
qdel(src)
/obj/item/grenade/gas_crystal/proto_nitrate_crystal
- name = "Proto Nitrate crystal"
- desc = "A crystal made from the Proto Nitrate gas, you can see the liquid gases inside."
+ name = "\improper Proto-Nitrate crystal"
+ desc = "A crystal made from the Proto-Nitrate gas. It feels lighter than you'd expect."
icon_state = "proto_nitrate_crystal"
///Range of the grenade air refilling
var/refill_range = 5
@@ -73,8 +74,8 @@
qdel(src)
/obj/item/grenade/gas_crystal/nitrous_oxide_crystal
- name = "N2O crystal"
- desc = "A crystal made from the N2O gas, you can see the liquid gases inside."
+ name = "\improper N2O crystal"
+ desc = "A crystal made from Nitrous Oxide gas. Looking at it makes you feel sleepy."
icon_state = "n2o_crystal"
///Range of the grenade air refilling
var/fill_range = 1
@@ -98,7 +99,7 @@
/obj/item/grenade/gas_crystal/crystal_foam
name = "crystal foam"
- desc = "A crystal with a foggy inside"
+ desc = "A crystal with a foggy inside."
icon_state = "crystal_foam"
var/breach_range = 7
diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm
index d04b77683442..cfb684e7d167 100644
--- a/code/game/objects/items/mop.dm
+++ b/code/game/objects/items/mop.dm
@@ -24,6 +24,7 @@
var/static/list/clean_blacklist = typecacheof(list(
/obj/item/reagent_containers/cup/bucket,
/obj/structure/mop_bucket,
+ /obj/structure/sink,
))
custom_price = 20 // DARKPACK EDIT ADD - ECONOMY
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index cfe728e7f861..e504dccc5a72 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -724,7 +724,6 @@
name = "runner plushie"
desc = "A plushie depicting a xenomorph runner, made to commemorate the centenary of the Battle of LV-426. Much cuddlier than the real thing."
icon_state = "rouny"
- item_flags = XENOMORPH_HOLDABLE
inhand_icon_state = null
attack_verb_continuous = list("slashes", "bites", "charges")
attack_verb_simple = list("slash", "bite", "charge")
diff --git a/code/game/objects/items/stacks/ammonia_crystals.dm b/code/game/objects/items/stacks/ammonia_crystals.dm
index 885ab685a80c..6b85c4717db7 100644
--- a/code/game/objects/items/stacks/ammonia_crystals.dm
+++ b/code/game/objects/items/stacks/ammonia_crystals.dm
@@ -1,5 +1,6 @@
/obj/item/stack/ammonia_crystals
name = "ammonia crystals"
+ desc = "Crystallized ammonia. Valuable for someone, but probably not you."
singular_name = "ammonia crystal"
icon = 'icons/obj/stack_objects.dmi'
icon_state = "ammonia_crystal"
diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm
index d50904bee027..f70808759274 100644
--- a/code/game/objects/items/stacks/bscrystal.dm
+++ b/code/game/objects/items/stacks/bscrystal.dm
@@ -108,3 +108,11 @@
/obj/item/stack/sheet/bluespace_crystal/fifty
amount = 50
+
+GLOBAL_LIST_INIT(bluespace_crystal_recipes, list ( \
+ new/datum/stack_recipe("bluespace crystal tile", /obj/item/stack/tile/mineral/bluespace, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \
+))
+
+/obj/item/stack/sheet/bluespace_crystal/get_main_recipes()
+ . = ..()
+ . += GLOB.bluespace_crystal_recipes
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index db44b8f1020a..430d24fd5887 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -55,6 +55,7 @@
merge_type = /obj/item/stack/sheet/animalhide/carbon/human
GLOBAL_LIST_INIT(human_recipes, list( \
+ new/datum/stack_recipe("human skin carpet", /obj/item/stack/tile/carpet/human, 1, 4, 20, category = CAT_TILES), \
new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5, crafting_flags = NONE, category = CAT_CLOTHING), \
new/datum/stack_recipe("human skin hat", /obj/item/clothing/head/fedora/human_leather, 1, crafting_flags = NONE, category = CAT_CLOTHING), \
))
@@ -94,6 +95,15 @@ GLOBAL_LIST_INIT(human_recipes, list( \
/obj/item/stack/sheet/animalhide/mothroach/five
amount = 5
+
+GLOBAL_LIST_INIT(mothroach_recipes, list( \
+ new/datum/stack_recipe("moth fur carpet", /obj/item/stack/tile/carpet/moth, 1, 4, 20, category = CAT_TILES), \
+ ))
+
+/obj/item/stack/sheet/animalhide/mothroach/get_main_recipes()
+ . = ..()
+ . += GLOB.mothroach_recipes
+
/* // DARKPACK EDIT REMOVAL
GLOBAL_LIST_INIT(gondola_recipes, list ( \
new/datum/stack_recipe("gondola mask", /obj/item/clothing/mask/gondola, 1, crafting_flags = NONE, category = CAT_CLOTHING), \
@@ -168,6 +178,14 @@ GLOBAL_LIST_INIT(monkey_recipes, list ( \
/obj/item/stack/sheet/animalhide/carbon/lizard/five
amount = 5
+GLOBAL_LIST_INIT(lizard_recipes, list( \
+ new/datum/stack_recipe("lizard scale carpet", /obj/item/stack/tile/carpet/moth, 1, 4, 20, category = CAT_TILES), \
+ ))
+
+/obj/item/stack/sheet/animalhide/carbon/lizard/get_main_recipes()
+ . = ..()
+ . += GLOB.lizard_recipes
+
/obj/item/stack/sheet/animalhide/xeno
name = "alien chitin"
singular_name = "alien chitin piece"
@@ -197,6 +215,7 @@ GLOBAL_LIST_INIT(xeno_recipes, list ( \
merge_type = /obj/item/stack/sheet/animalhide/carp
/* // DARKPACK EDIT REMOVAL
GLOBAL_LIST_INIT(carp_recipes, list ( \
+ new/datum/stack_recipe("carp scale carpet", /obj/item/stack/tile/carpet/carp, 1, 4, 20, category = CAT_TILES), \
new/datum/stack_recipe("carp costume", /obj/item/clothing/suit/hooded/carp_costume, 4, crafting_flags = NONE, category = CAT_CLOTHING), \
new/datum/stack_recipe("carp mask", /obj/item/clothing/mask/gas/carp, 1, crafting_flags = NONE, category = CAT_CLOTHING), \
new/datum/stack_recipe("carpskin chair", /obj/structure/chair/comfy/carp, 2, crafting_flags = NONE, category = CAT_FURNITURE), \
@@ -366,6 +385,14 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
singular_name = "polar bear hide"
merge_type = /obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide
+GLOBAL_LIST_INIT(polar_bear_recipes, list( \
+ new/datum/stack_recipe("polar bear fur carpet", /obj/item/stack/tile/carpet/polar_bear, 1, 4, 20, category = CAT_TILES), \
+ ))
+
+/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide/get_main_recipes()
+ . = ..()
+ . += GLOB.polar_bear_recipes
+
/obj/item/stack/sheet/animalhide/ashdrake
name = "ash drake hide"
desc = "The strong, scaled hide of an ash drake."
@@ -398,6 +425,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
novariants = FALSE
GLOBAL_LIST_INIT(bear_pelt_recipes, list ( \
+ new/datum/stack_recipe(" bear fur carpet", /obj/item/stack/tile/carpet/bear, 1, 4, 20, category = CAT_TILES), \
new/datum/stack_recipe("bear costume", /obj/item/clothing/suit/costume/bear_suit, 5, crafting_flags = NONE, category = CAT_CLOTHING), \
new/datum/stack_recipe("bear hat", /obj/item/clothing/head/costume/bearpelt, 2, crafting_flags = NONE, category = CAT_CLOTHING), \
))
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 4a896731a430..e73ea226d81b 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -24,6 +24,7 @@ Mineral Sheets
*/
GLOBAL_LIST_INIT(sandstone_recipes, list ( \
+ new/datum/stack_recipe("sandstone tile", /obj/item/stack/tile/mineral/sandstone, 1, 4, 20, category = CAT_TILES), \
/* new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ */ // DARKPACK EDIT REMOVAL
new/datum/stack_recipe("sandstone platform", /obj/structure/platform/sandstone, 2, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \
new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_NO_MATERIALS, category = CAT_MISC), \
@@ -435,6 +436,7 @@ GLOBAL_LIST_INIT(snow_recipes, list ( \
GLOBAL_LIST_INIT(adamantine_recipes, list(
+ new /datum/stack_recipe("adamantine tile", /obj/item/stack/tile/mineral/adamantine, 1, 4, 20, category = CAT_TILES), \
new /datum/stack_recipe("incomplete servant golem shell", /obj/item/golem_shell/servant, req_amount=3, res_amount=1, category = CAT_ROBOT),
))
@@ -446,11 +448,15 @@ GLOBAL_LIST_INIT(adamantine_recipes, list(
singular_name = "adamantine sheet"
mats_per_unit = list(/datum/material/adamantine=SHEET_MATERIAL_AMOUNT)
merge_type = /obj/item/stack/sheet/mineral/adamantine
-/* // DARKPACK EDIT REMOVAL
+
/obj/item/stack/sheet/mineral/adamantine/get_main_recipes()
. = ..()
. += GLOB.adamantine_recipes
- */
+
+GLOBAL_LIST_INIT(runite_recipes, list(
+ new /datum/stack_recipe("runite tile", /obj/item/stack/tile/mineral/runite, 1, 4, 20, category = CAT_TILES), \
+ ))
+
/*
* Runite
*/
@@ -466,6 +472,13 @@ GLOBAL_LIST_INIT(adamantine_recipes, list(
merge_type = /obj/item/stack/sheet/mineral/runite
material_type = /datum/material/runite
+/obj/item/stack/sheet/mineral/runite/get_main_recipes()
+ . = ..()
+ . += GLOB.runite_recipes
+
+GLOBAL_LIST_INIT(mythril_recipes, list(
+ new /datum/stack_recipe("mythril tile", /obj/item/stack/tile/mineral/mythril, 1, 4, 20, category = CAT_TILES), \
+ ))
/*
* Mythril
@@ -480,6 +493,10 @@ GLOBAL_LIST_INIT(adamantine_recipes, list(
mats_per_unit = list(/datum/material/mythril=SHEET_MATERIAL_AMOUNT)
merge_type = /obj/item/stack/sheet/mineral/mythril
+/obj/item/stack/sheet/mineral/mythril/get_main_recipes()
+ . = ..()
+ . += GLOB.mythril_recipes
+
/*
* Alien Alloy
*/
@@ -548,6 +565,7 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \
//Metal Hydrogen
GLOBAL_LIST_INIT(metalhydrogen_recipes, list(
+ new /datum/stack_recipe("metallic hydrogen tile", /obj/item/stack/tile/mineral/metal_hydrogen, 1, 4, 20, category = CAT_TILES), \
new /datum/stack_recipe("incomplete servant golem shell", /obj/item/golem_shell/servant, req_amount=20, res_amount=1, crafting_flags = NONE, category = CAT_ROBOT),
new /datum/stack_recipe("ancient armor", /obj/item/clothing/suit/armor/elder_atmosian, req_amount = 5, res_amount = 1, crafting_flags = NONE, category = CAT_CLOTHING),
new /datum/stack_recipe("ancient helmet", /obj/item/clothing/head/helmet/elder_atmosian, req_amount = 3, res_amount = 1, crafting_flags = NONE, category = CAT_CLOTHING),
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index a7861457f5fd..41e881cd4a64 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -824,6 +824,13 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \
slapcraft_recipes = slapcraft_recipe_list,\
)
+GLOBAL_LIST_INIT(bone_recipes, list(
+ new /datum/stack_recipe("bone tile", /obj/item/stack/tile/bone, 1, 4, 20, time = 2 SECONDS, crafting_flags = NONE, category = CAT_TILES), \
+))
+
+/obj/item/stack/sheet/bone/get_main_recipes()
+ . = ..()
+ . += GLOB.bone_recipes
// DARKPACK EDIT CHANGE START
GLOBAL_LIST_INIT(plastic_recipes, list(
@@ -915,6 +922,15 @@ GLOBAL_LIST_INIT(paperframe_recipes, list(
/obj/item/stack/sheet/meat/five
amount = 5
+GLOBAL_LIST_INIT(meat_recipes, list(
+ new /datum/stack_recipe("meat tile", /obj/item/stack/tile/meat, 1, 4, 20, time = 2 SECONDS, crafting_flags = NONE, category = CAT_TILES), \
+))
+
+/obj/item/stack/sheet/meat/get_main_recipes()
+ . = ..()
+ . += GLOB.meat_recipes
+
+
GLOBAL_LIST_INIT(pizza_sheet_recipes, list(
new/datum/stack_recipe("huge pizza", /obj/structure/platform/pizza, 2, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \
))
@@ -959,3 +975,11 @@ GLOBAL_LIST_INIT(pizza_sheet_recipes, list(
amount = 20
/obj/item/stack/sheet/hauntium/five
amount = 5
+
+GLOBAL_LIST_INIT(hauntium_recipes, list(
+ new /datum/stack_recipe("hauntium tile", /obj/item/stack/tile/hauntium, 1, 4, 20, time = 2 SECONDS, crafting_flags = NONE, category = CAT_TILES), \
+))
+
+/obj/item/stack/sheet/hauntium/get_main_recipes()
+ . = ..()
+ . += GLOB.hauntium_recipes
diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm
index 4988a9748a84..e9d5e6e03c07 100644
--- a/code/game/objects/items/stacks/telecrystal.dm
+++ b/code/game/objects/items/stacks/telecrystal.dm
@@ -36,6 +36,14 @@
/obj/item/stack/telecrystal/twenty
amount = 20
+GLOBAL_LIST_INIT(telecrystal_recipes, list ( \
+ new/datum/stack_recipe("telecrystal tile", /obj/item/stack/tile/mineral/telecrystal, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \
+))
+
+/obj/item/stack/telecrystal/get_main_recipes()
+ . = ..()
+ . += GLOB.telecrystal_recipes
+
/obj/item/stack/sheet/telepolycrystal
name = "telelocational podcrystal"
singular_name = "telelocational podcrystal"
diff --git a/code/game/objects/items/stacks/tiles/tile_iron.dm b/code/game/objects/items/stacks/tiles/tile_iron.dm
index 204ecfe3b175..d2bb3fe233b1 100644
--- a/code/game/objects/items/stacks/tiles/tile_iron.dm
+++ b/code/game/objects/items/stacks/tiles/tile_iron.dm
@@ -62,6 +62,9 @@
/obj/item/stack/tile/iron/white/textured_corner,
/obj/item/stack/tile/iron/white/textured_large,
/obj/item/stack/tile/iron/recharge_floor,
+ /obj/item/stack/tile/iron/recharge_floor/white,
+ /obj/item/stack/tile/iron/recharge_floor/dark,
+ /obj/item/stack/tile/iron/recharge_floor/smooth,
/obj/item/stack/tile/iron/smooth,
/obj/item/stack/tile/iron/smooth_edge,
/obj/item/stack/tile/iron/smooth_half,
@@ -477,6 +480,27 @@
turf_type = /turf/open/floor/iron/white/herringbone
merge_type = /obj/item/stack/tile/iron/white/herringbone
+/obj/item/stack/tile/iron/recharge_floor/white
+ name = "white recharge floor tile"
+ singular_name = "white recharge floor tile"
+ icon_state = "tile_white_recharge"
+ turf_type = /turf/open/floor/iron/recharge_floor/white
+ merge_type = /obj/item/stack/tile/iron/recharge_floor/white
+
+/obj/item/stack/tile/iron/recharge_floor/dark
+ name = "dark recharge floor tile"
+ singular_name = "dark recharge floor tile"
+ icon_state = "tile_dark_recharge"
+ turf_type = /turf/open/floor/iron/recharge_floor/dark
+ merge_type = /obj/item/stack/tile/iron/recharge_floor/dark
+
+/obj/item/stack/tile/iron/recharge_floor/smooth
+ name = "smooth recharge floor tile"
+ singular_name = "smooth recharge floor tile"
+ icon_state = "tile_smooth_recharge"
+ turf_type = /turf/open/floor/iron/recharge_floor/smooth
+ merge_type = /obj/item/stack/tile/iron/recharge_floor/smooth
+
/obj/item/stack/tile/iron/recharge_floor
name = "recharge floor tile"
singular_name = "recharge floor tile"
diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm
index b5cf7f8ff57a..2a2f79c6207f 100644
--- a/code/game/objects/items/stacks/tiles/tile_mineral.dm
+++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm
@@ -33,6 +33,15 @@
mineralType = "plasma"
mats_per_unit = list(/datum/material/plasma=SHEET_MATERIAL_AMOUNT*0.25)
merge_type = /obj/item/stack/tile/mineral/plasma
+ tile_reskin_types = list(
+ /obj/item/stack/tile/mineral/plasma,
+ /obj/item/stack/tile/mineral/plasma/tiled,
+ )
+
+/obj/item/stack/tile/mineral/plasma/tiled
+ icon_state = "plasma_tiled"
+ turf_type = /turf/open/floor/mineral/plasma/tiled
+ merge_type = /obj/item/stack/tile/mineral/plasma/tiled
/obj/item/stack/tile/mineral/uranium
name = "uranium tile"
@@ -44,6 +53,15 @@
mineralType = "uranium"
mats_per_unit = list(/datum/material/uranium=SHEET_MATERIAL_AMOUNT*0.25)
merge_type = /obj/item/stack/tile/mineral/uranium
+ tile_reskin_types = list(
+ /obj/item/stack/tile/mineral/uranium,
+ /obj/item/stack/tile/mineral/uranium/tiled,
+ )
+
+/obj/item/stack/tile/mineral/uranium/tiled
+ icon_state = "uranium_tiled"
+ turf_type = /turf/open/floor/mineral/uranium/tiled
+ merge_type = /obj/item/stack/tile/mineral/uranium/tiled
/obj/item/stack/tile/mineral/gold
name = "gold tile"
@@ -55,6 +73,22 @@
mineralType = "gold"
mats_per_unit = list(/datum/material/gold=SHEET_MATERIAL_AMOUNT*0.25)
merge_type = /obj/item/stack/tile/mineral/gold
+ tile_reskin_types = list(
+ /obj/item/stack/tile/mineral/gold,
+ /obj/item/stack/tile/mineral/gold/tiled,
+ /obj/item/stack/tile/mineral/gold/sun,
+ )
+
+/obj/item/stack/tile/mineral/gold/tiled
+ icon_state = "gold_tiled"
+ turf_type = /turf/open/floor/mineral/gold/tiled
+ merge_type = /obj/item/stack/tile/mineral/gold/tiled
+
+/obj/item/stack/tile/mineral/gold/sun
+ icon_state = "gold_sun"
+ desc = "A tile made out of gold, portraying the sun."
+ turf_type = /turf/open/floor/mineral/gold/sun
+ merge_type = /obj/item/stack/tile/mineral/gold/sun
/obj/item/stack/tile/mineral/silver
name = "silver tile"
@@ -66,6 +100,23 @@
mineralType = "silver"
mats_per_unit = list(/datum/material/silver=SHEET_MATERIAL_AMOUNT*0.25)
merge_type = /obj/item/stack/tile/mineral/silver
+ tile_reskin_types = list(
+ /obj/item/stack/tile/mineral/silver,
+ /obj/item/stack/tile/mineral/silver/tiled,
+ /obj/item/stack/tile/mineral/silver/moon,
+ )
+
+/obj/item/stack/tile/mineral/silver/tiled
+ icon_state = "silver_tiled"
+ turf_type = /turf/open/floor/mineral/silver/tiled
+ merge_type = /obj/item/stack/tile/mineral/uranium/tiled
+
+/obj/item/stack/tile/mineral/silver/moon
+ icon_state = "silver_moon"
+ desc = "A tile made out of silver, portraying the moon."
+ turf_type = /turf/open/floor/mineral/gold/sun
+ merge_type = /obj/item/stack/tile/mineral/silver/moon
+ tile_rotate_dirs = list(SOUTH, NORTH, EAST, WEST)
/obj/item/stack/tile/mineral/diamond
name = "diamond tile"
@@ -77,6 +128,15 @@
mineralType = "diamond"
mats_per_unit = list(/datum/material/diamond=SHEET_MATERIAL_AMOUNT*0.25)
merge_type = /obj/item/stack/tile/mineral/diamond
+ tile_reskin_types = list(
+ /obj/item/stack/tile/mineral/diamond,
+ /obj/item/stack/tile/mineral/diamond/tiled,
+ )
+
+/obj/item/stack/tile/mineral/diamond/tiled
+ icon_state = "diamond_tiled"
+ turf_type = /turf/open/floor/mineral/diamond/tiled
+ merge_type = /obj/item/stack/tile/mineral/diamond/tiled
/obj/item/stack/tile/mineral/bananium
name = "bananium tile"
@@ -89,6 +149,168 @@
mats_per_unit = list(/datum/material/bananium=SHEET_MATERIAL_AMOUNT*0.25)
material_flags = NONE //The slippery comp makes it unpractical for good clown decor. The material tiles should still slip.
merge_type = /obj/item/stack/tile/mineral/bananium
+ tile_reskin_types = list(
+ /obj/item/stack/tile/mineral/bananium,
+ /obj/item/stack/tile/mineral/bananium/tiled,
+ )
+
+/obj/item/stack/tile/mineral/bananium/tiled
+ icon_state = "bananium_tiled"
+ turf_type = /turf/open/floor/mineral/bananium/tiled
+ merge_type = /obj/item/stack/tile/mineral/bananium/tiled
+
+/obj/item/stack/tile/mineral/bluespace
+ name = "bluespace tile"
+ singular_name = "bluespace floor tile"
+ desc = "A tile made out of bluespace crystals. Latest innovation in random teleportation."
+ icon_state = "tile_bluespace_c"
+ inhand_icon_state = "tile-bluespace"
+ turf_type = /turf/open/floor/mineral/bluespace
+ mineralType = "bluespace"
+ mats_per_unit = list(/datum/material/bluespace=SHEET_MATERIAL_AMOUNT*0.25)
+ merge_type = /obj/item/stack/tile/mineral/bluespace
+ tile_reskin_types = list(
+ /obj/item/stack/tile/mineral/bluespace,
+ /obj/item/stack/tile/mineral/bluespace/tiled,
+ )
+
+/obj/item/stack/tile/mineral/bluespace/tiled
+ icon_state = "bluespace_c_tiled"
+ turf_type = /turf/open/floor/mineral/bluespace/tiled
+ merge_type = /obj/item/stack/tile/mineral/bluespace/tiled
+
+/obj/item/stack/tile/mineral/bluespace/n
+ icon_state = "bluespace_c_n"
+ turf_type = /turf/open/floor/mineral/bluespace/n
+ merge_type = /obj/item/stack/tile/mineral/bluespace/n
+
+/obj/item/stack/tile/mineral/telecrystal
+ name = "telecrystal tile"
+ singular_name = "telecrystal floor tile"
+ desc = "A tile made out of telecrystals. Pretty sure its illegal."
+ icon_state = "tile_telecrystal"
+ inhand_icon_state = "tile-telecrystal"
+ turf_type = /turf/open/floor/mineral/telecrystal
+ mineralType = "telecrystal"
+ mats_per_unit = list(/datum/material/telecrystal=SHEET_MATERIAL_AMOUNT*0.25)
+
+ merge_type = /obj/item/stack/tile/mineral/telecrystal
+ tile_reskin_types = list(
+ /obj/item/stack/tile/mineral/telecrystal,
+ /obj/item/stack/tile/mineral/telecrystal/tiled,
+ )
+
+/obj/item/stack/tile/mineral/telecrystal/tiled
+ icon_state = "telecrystal_tiled"
+ turf_type = /turf/open/floor/mineral/bluespace/tiled
+ merge_type = /obj/item/stack/tile/mineral/telecrystal/tiled
+
+/obj/item/stack/tile/mineral/telecrystal/s
+ icon_state = "telecrystal_s"
+ turf_type = /turf/open/floor/mineral/telecrystal/s
+ merge_type = /obj/item/stack/tile/mineral/telecrystal/s
+
+/obj/item/stack/tile/mineral/adamantine
+ name = "adamantine tile"
+ singular_name = "adamantine floor tile"
+ desc = "A tile made out of adamantine. Industrial style, favourite of golems."
+ icon_state = "tile_adamantine"
+ inhand_icon_state = "tile-adamantium"
+ turf_type = /turf/open/floor/mineral/adamantine
+ mineralType = "adamantine"
+ mats_per_unit = list(/datum/material/adamantine=SHEET_MATERIAL_AMOUNT*0.25)
+
+ merge_type = /obj/item/stack/tile/mineral/telecrystal
+ tile_reskin_types = list(
+ /obj/item/stack/tile/mineral/adamantine,
+ /obj/item/stack/tile/mineral/adamantine/alt,
+ )
+
+/obj/item/stack/tile/mineral/adamantine/alt
+ icon_state = "adamantine_alt"
+ turf_type = /turf/open/floor/mineral/adamantine/alt
+ merge_type = /obj/item/stack/tile/mineral/adamantine/alt
+
+/obj/item/stack/tile/mineral/metal_hydrogen
+ name = "metal hydrogen tile"
+ singular_name = "metal hydrogen floor tile"
+ desc = "A tile made out of metal hydrogen. Like walking on a cloud!"
+ icon_state = "tile_metal_hydrogen"
+ inhand_icon_state = "tile-metalhydrogen"
+ turf_type = /turf/open/floor/mineral/metal_hydrogen
+ mineralType = "metal hydrogen"
+ mats_per_unit = list(/datum/material/metalhydrogen=SHEET_MATERIAL_AMOUNT*0.25)
+
+ merge_type = /obj/item/stack/tile/mineral/metal_hydrogen
+ tile_reskin_types = list(
+ /obj/item/stack/tile/mineral/metal_hydrogen,
+ /obj/item/stack/tile/mineral/metal_hydrogen/tiled,
+ )
+
+/obj/item/stack/tile/mineral/metal_hydrogen/tiled
+ icon_state = "metal_hydrogen_tiled"
+ turf_type = /turf/open/floor/mineral/metal_hydrogen/tiled
+ merge_type = /obj/item/stack/tile/mineral/metal_hydrogen/tiled
+
+/obj/item/stack/tile/mineral/runite
+ name = "runite tile"
+ singular_name = "runite floor tile"
+ desc = "A quite magical tile made from runite. You feel its polarity is determined by the direction of the winds of magic."
+ icon_state = "tile_runite"
+ inhand_icon_state = "tile-runite"
+ turf_type = /turf/open/floor/mineral/runite
+ mineralType = "runite"
+ mats_per_unit = list(/datum/material/runite=SHEET_MATERIAL_AMOUNT*0.25)
+ merge_type = /obj/item/stack/tile/mineral/runite
+ tile_rotate_dirs = list(SOUTH, NORTH, EAST, WEST)
+
+/obj/item/stack/tile/mineral/mythril
+ name = "mythril tile"
+ singular_name = "mythril floor tile"
+ desc = "Definetly the best use of such an legendary, unfathomable material."
+ icon_state = "tile_mythril"
+ inhand_icon_state = "tile-mythril"
+ turf_type = /turf/open/floor/mineral/mythril
+ mineralType = "mythril"
+ mats_per_unit = list(/datum/material/mythril=SHEET_MATERIAL_AMOUNT*0.25)
+ merge_type = /obj/item/stack/tile/mineral/mythril
+
+/obj/item/stack/tile/mineral/sandstone
+ name = "sandstone brick tile"
+ icon_state = "tile_sandstone"
+ inhand_icon_state = "tile-hay"
+ mineralType = "sandstone"
+ mats_per_unit = list(/datum/material/sandstone = HALF_SHEET_MATERIAL_AMOUNT / 2)
+ turf_type = /turf/open/floor/sandstone
+ merge_type = /obj/item/stack/tile/mineral/sandstone
+ desc = "A tile made out of sandstone."
+ tile_reskin_types = list(
+ /obj/item/stack/tile/mineral/sandstone,
+ /obj/item/stack/tile/mineral/sandstone/cobbled,
+ /obj/item/stack/tile/mineral/sandstone/tiled,
+ /obj/item/stack/tile/mineral/sandstone/basalt,
+ )
+
+/obj/item/stack/tile/mineral/sandstone/cobbled
+ name = "cobbled sandstone tile"
+ icon_state = "sandstone_cobbled"
+ singular_name = "sandstone cobbled floor tile"
+ turf_type = /turf/open/floor/sandstone/cobbled
+ merge_type = /obj/item/stack/tile/mineral/sandstone/cobbled
+
+/obj/item/stack/tile/mineral/sandstone/tiled
+ name = "sandstone brick tile"
+ icon_state = "sandstone_tiled"
+ singular_name = "sandstone brick floor tile"
+ turf_type = /turf/open/floor/sandstone/tiled
+ merge_type = /obj/item/stack/tile/mineral/sandstone/tiled
+
+/obj/item/stack/tile/mineral/sandstone/basalt
+ name = "basalt brick tile"
+ icon_state = "tile_basaltbrick"
+ singular_name = "basalt brick floor tile"
+ turf_type = /turf/open/floor/sandstone/tiled
+ merge_type = /obj/item/stack/tile/mineral/sandstone/basalt
/obj/item/stack/tile/mineral/abductor
name = "alien floor tile"
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 052a77d72d25..8d3d5f33a039 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -137,6 +137,14 @@
/obj/item/stack/tile/wood/large,
/obj/item/stack/tile/wood/tile,
/obj/item/stack/tile/wood/parquet,
+ /obj/item/stack/tile/wood/dark,
+ /obj/item/stack/tile/wood/dark/large,
+ /obj/item/stack/tile/wood/dark/tile,
+ /obj/item/stack/tile/wood/dark/parquet,
+ /obj/item/stack/tile/wood/light,
+ /obj/item/stack/tile/wood/light/large,
+ /obj/item/stack/tile/wood/light/tile,
+ /obj/item/stack/tile/wood/light/parquet,
)
mats_per_unit = list(/datum/material/wood = HALF_SHEET_MATERIAL_AMOUNT / 2)
@@ -161,6 +169,64 @@
turf_type = /turf/open/floor/wood/tile
merge_type = /obj/item/stack/tile/wood/tile
+/obj/item/stack/tile/wood/dark
+ name = "dark wood floor tile"
+ singular_name = "dark wood floor tile"
+ desc = "An easy to fit dark wood floor tile. Use while in your hand to change what pattern you want."
+ icon_state = "tile-darkwood"
+ turf_type = /turf/open/floor/wood
+ merge_type = /obj/item/stack/tile/wood/dark
+
+/obj/item/stack/tile/wood/dark/parquet
+ name = "parquet dark wood floor tile"
+ singular_name = "parquet dark wood floor tile"
+ icon_state = "tile-darkwood_parquet"
+ turf_type = /turf/open/floor/wood/dark/parquet
+ merge_type = /obj/item/stack/tile/wood/dark/parquet
+
+/obj/item/stack/tile/wood/dark/large
+ name = "large dark wood floor tile"
+ singular_name = "large dark wood floor tile"
+ icon_state = "tile-darkwood_large"
+ turf_type = /turf/open/floor/wood/dark/large
+ merge_type = /obj/item/stack/tile/wood/dark/large
+
+/obj/item/stack/tile/wood/dark/tile
+ name = "tiled dark wood floor tile"
+ singular_name = "tiled dark wood floor tile"
+ icon_state = "tile-darkwood_tile"
+ turf_type = /turf/open/floor/wood/dark/tile
+ merge_type = /obj/item/stack/tile/wood/dark/tile
+
+/obj/item/stack/tile/wood/light
+ name = "light wood floor tile"
+ singular_name = "light wood floor tile"
+ desc = "An easy to fit light wood floor tile. Use while in your hand to change what pattern you want."
+ icon_state = "tile-lightwood"
+ turf_type = /turf/open/floor/wood/light
+ merge_type = /obj/item/stack/tile/wood/light
+
+/obj/item/stack/tile/wood/light/parquet
+ name = "parquet light wood floor tile"
+ singular_name = "parquet light wood floor tile"
+ icon_state = "tile-lightwood_parquet"
+ turf_type = /turf/open/floor/wood/light/parquet
+ merge_type = /obj/item/stack/tile/wood/light/parquet
+
+/obj/item/stack/tile/wood/light/large
+ name = "large light wood floor tile"
+ singular_name = "large light wood floor tile"
+ icon_state = "tile-lightwood_large"
+ turf_type = /turf/open/floor/wood/light/large
+ merge_type = /obj/item/stack/tile/wood/light/large
+
+/obj/item/stack/tile/wood/light/tile
+ name = "tiled light wood floor tile"
+ singular_name = "tiled light wood floor tile"
+ icon_state = "tile-lightwood_tile"
+ turf_type = /turf/open/floor/wood/light/tile
+ merge_type = /obj/item/stack/tile/wood/light/tile
+
//Bamboo
/obj/item/stack/tile/bamboo
name = "bamboo mat pieces"
@@ -173,12 +239,21 @@
resistance_flags = FLAMMABLE
tile_reskin_types = list(
/obj/item/stack/tile/bamboo,
+ /obj/item/stack/tile/bamboo/planks,
/obj/item/stack/tile/bamboo/tatami,
/obj/item/stack/tile/bamboo/tatami/purple,
/obj/item/stack/tile/bamboo/tatami/black,
)
mats_per_unit = list(/datum/material/bamboo = HALF_SHEET_MATERIAL_AMOUNT / 2)
+/obj/item/stack/tile/bamboo/planks
+ name = "bamboo planks tile"
+ singular_name = "planks planks floor tile"
+ icon_state = "tile_bamboo_planks"
+ desc = "Layer after layer of cut bamboo placed like planks."
+ turf_type = /turf/open/floor/bamboo/planks
+ merge_type = /obj/item/stack/tile/bamboo/planks
+
/obj/item/stack/tile/bamboo/tatami
name = "Tatami with green rim"
singular_name = "green tatami floor tile"
@@ -211,6 +286,38 @@
turf_type = /turf/open/floor/fakebasalt
merge_type = /obj/item/stack/tile/basalt
mats_per_unit = list(/datum/material/sand = SHEET_MATERIAL_AMOUNT * 2)
+ tile_reskin_types = list(
+ /obj/item/stack/tile/basalt,
+ /obj/item/stack/tile/basalt/sand,
+ /obj/item/stack/tile/basalt/redsand,
+ /obj/item/stack/tile/basalt/moonsand,
+ )
+/obj/item/stack/tile/basalt/sand
+ name = "sand tile"
+ singular_name = "sand floor tile"
+ desc = "Artificially made sand tile."
+ icon_state = "tile_sand"
+ inhand_icon_state = "tile-hay"
+ turf_type = /turf/open/floor/fakesand
+ merge_type = /obj/item/stack/tile/basalt/sand
+
+/obj/item/stack/tile/basalt/redsand
+ name = "red sand tile"
+ singular_name = "red sand floor tile"
+ desc = "Artificially made red sand tile."
+ icon_state = "tile_redsand"
+ inhand_icon_state = "tile-meat"
+ turf_type = /turf/open/floor/fakesand/red
+ merge_type = /obj/item/stack/tile/basalt/redsand
+
+/obj/item/stack/tile/basalt/moonsand
+ name = "moon sand tile"
+ singular_name = "moon sand floor tile"
+ desc = "Artificially made moon sand tile."
+ icon_state = "tile_moonsand"
+ inhand_icon_state = "tile-silver"
+ turf_type = /turf/open/floor/fakesand/moon
+ merge_type = /obj/item/stack/tile/basalt/moonsand
//Carpets
/obj/item/stack/tile/carpet
@@ -393,6 +500,68 @@
/obj/item/stack/tile/carpet/donk/thirty
amount = 30
+/obj/item/stack/tile/carpet/bear
+ name = "bear fur carpet"
+ desc = "Bear fur stretched out into a carpet for you to walk on."
+ icon_state = "tile-carpet-bear"
+ turf_type = /turf/open/floor/carpet/bear
+ merge_type = /obj/item/stack/tile/carpet/bear
+ tile_reskin_types = null
+
+/obj/item/stack/tile/carpet/polar_bear
+ name = "polar fur carpet"
+ desc = "Polar bear fur stretched out into a carpet for you to walk on."
+ icon_state = "tile-carpet-bear-polar"
+ inhand_icon_state = "tile-silver"
+ turf_type = /turf/open/floor/carpet/polar_bear
+ merge_type = /obj/item/stack/tile/carpet/polar_bear
+ tile_reskin_types = null
+
+/obj/item/stack/tile/carpet/moth
+ name = "moth fur carpet"
+ desc = "Moth fur stretched out into a carpet for you to walk on."
+ icon_state = "tile-carpet-moth"
+ inhand_icon_state = "tile-bananium"
+ turf_type = /turf/open/floor/carpet/moth
+ merge_type = /obj/item/stack/tile/carpet/moth
+ tile_reskin_types = null
+
+/obj/item/stack/tile/carpet/goliath
+ name = "goliath hide carpet"
+ desc = "Goliath hide plates woven together with watcher sinew to make something aproximating a carpet."
+ icon_state = "tile-carpet-goliath"
+ inhand_icon_state = "tile-carpet-goliath"
+ turf_type = /turf/open/floor/carpet/goliath
+ merge_type = /obj/item/stack/tile/carpet/goliath
+ tile_reskin_types = null
+
+/obj/item/stack/tile/carpet/carp
+ name = "carp scales carpet"
+ desc = "Carpet made with carp scales. A carp carpet. Carp carp carp."
+ icon_state = "tile-carpet-carp"
+ inhand_icon_state = "tile-carpet-carp"
+ turf_type = /turf/open/floor/carpet/carp
+ merge_type = /obj/item/stack/tile/carpet/carp
+ tile_reskin_types = null
+
+/obj/item/stack/tile/carpet/lizard
+ name = "lizard scales carpet"
+ desc = "Carpet made with lizard scales. Lizards were most likely harmed making this."
+ icon_state = "tile-carpet-lizard"
+ inhand_icon_state = "tile-uranium"
+ turf_type = /turf/open/floor/carpet/lizard
+ merge_type = /obj/item/stack/tile/carpet/lizard
+ tile_reskin_types = null
+
+/obj/item/stack/tile/carpet/human
+ name = "human skin carpet"
+ desc = "Carpet made from flayed human skin. Fresh and moist."
+ icon_state = "tile-carpet-skin"
+ inhand_icon_state = "tile-carpet-skin"
+ turf_type = /turf/open/floor/carpet/human
+ merge_type = /obj/item/stack/tile/carpet/human
+ tile_reskin_types = null
+
/obj/item/stack/tile/carpet/neon
name = "neon carpet"
singular_name = "neon carpet tile"
@@ -1111,14 +1280,255 @@
turf_type = /turf/open/floor/circuit/red/anim
merge_type = /obj/item/stack/tile/circuit/red/anim
+/obj/item/stack/tile/circuit/ash
+ name = "ornate ash forge tile"
+ singular_name = "ornate ash forge tile"
+ desc = "An ashen, ornate forge tile. Normaly seen in photos of ethereal homeworld's industrial areas."
+ icon_state = "tile_ash"
+ inhand_icon_state = "tile-rcircuit"
+ turf_type = /turf/open/floor/circuit/red
+ merge_type = /obj/item/stack/tile/circuit/red
+ tile_reskin_types = list(
+ /obj/item/stack/tile/circuit/ash,
+ /obj/item/stack/tile/circuit/ash/alt,
+ )
+ mats_per_unit = list(/datum/material/alloy/plastitanium = HALF_SHEET_MATERIAL_AMOUNT / 3)
+
+/obj/item/stack/tile/circuit/ash/alt
+ name = "ash forge tile"
+ singular_name = "ash forge tile"
+ desc = "An ashen forge tile. Normaly seen in photos of ethereal homeworld's industrial areas."
+ icon_state = "tile_ash_alt"
+ turf_type = /turf/open/floor/circuit/ash/alt
+ merge_type = /obj/item/stack/tile/circuit/ash/alt
+
/obj/item/stack/tile/plastic
name = "plastic tile"
singular_name = "plastic floor tile"
desc = "A tile of cheap, flimsy plastic flooring."
icon_state = "tile_plastic"
+ inhand_icon_state = "tile-bluespace"
mats_per_unit = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT / 2)
turf_type = /turf/open/floor/plastic
merge_type = /obj/item/stack/tile/plastic
+ tile_reskin_types = list(
+ /obj/item/stack/tile/plastic,
+ /obj/item/stack/tile/plastic/puzzle,
+ )
+
+/obj/item/stack/tile/plastic/puzzle
+ name = "puzzle tile"
+ icon_state = "plastic_puzzle"
+ singular_name = "puzzle floor tile"
+ turf_type = /turf/open/floor/plastic/puzzle
+ merge_type = /obj/item/stack/tile/plastic/puzzle
+ desc = "A tile of cheap, puzzling plastic puzzles flooring."
+
+/obj/item/stack/tile/meat
+ name = "meat tile"
+ singular_name = "meat floor tile"
+ desc = "From big Barry's builders best barbecue. This one looks a little stale."
+ icon_state = "tile_meat"
+ inhand_icon_state = "tile-meat"
+ mats_per_unit = list(/datum/material/meat = HALF_SHEET_MATERIAL_AMOUNT / 2)
+ turf_type = /turf/open/floor/meat
+ merge_type = /obj/item/stack/tile/meat
+ tile_reskin_types = list(
+ /obj/item/stack/tile/meat,
+ /obj/item/stack/tile/meat/fresh,
+ )
+
+/obj/item/stack/tile/meat/fresh
+ name = "fresh meat tile"
+ singular_name = "fresh meat floor tile"
+ desc = "Fresh from big Barry's builders best barbecue."
+ icon_state = "tile_meat_fresh"
+ turf_type = /turf/open/floor/meat/fresh
+ merge_type = /obj/item/stack/tile/meat/fresh
+
+/obj/item/stack/tile/bone
+ name = "bone tile"
+ singular_name = "bone floor tile"
+ desc = "Don't question where the dirt around it came from."
+ icon_state = "tile_bone"
+ inhand_icon_state = "tile-sepia"
+ mats_per_unit = list(/datum/material/bone = HALF_SHEET_MATERIAL_AMOUNT / 2)
+ turf_type = /turf/open/floor/bone
+ merge_type = /obj/item/stack/tile/bone
+ tile_reskin_types = list(
+ /obj/item/stack/tile/bone,
+ /obj/item/stack/tile/bone/corner,
+ /obj/item/stack/tile/bone/straight,
+ /obj/item/stack/tile/bone/spine,
+ /obj/item/stack/tile/bone/meaty,
+ /obj/item/stack/tile/bone/meaty/corner,
+ /obj/item/stack/tile/bone/meaty/straight,
+ /obj/item/stack/tile/bone/meaty/spine,
+ )
+
+/obj/item/stack/tile/bone/corner
+ name = "bone corner tile"
+ singular_name = "bone corner floor tile"
+ icon_state = "bone_corner"
+ turf_type = /turf/open/floor/bone/corner
+ merge_type = /obj/item/stack/tile/bone/corner
+ tile_rotate_dirs = list(SOUTH, NORTH, EAST, WEST)
+
+/obj/item/stack/tile/bone/straight
+ name = "bone straight tile"
+ singular_name = "bone straight floor tile"
+ icon_state = "bone_straight"
+ turf_type = /turf/open/floor/bone/straight
+ merge_type = /obj/item/stack/tile/bone/straight
+ tile_rotate_dirs = list(SOUTH, NORTH, EAST, WEST)
+
+/obj/item/stack/tile/bone/spine
+ name = "bone spine tile"
+ singular_name = "bone spine floor tile"
+ icon_state = "bone_spine"
+ turf_type = /turf/open/floor/bone/spine
+ merge_type = /obj/item/stack/tile/bone/spine
+ tile_rotate_dirs = list(SOUTH, NORTH, EAST, WEST)
+
+/obj/item/stack/tile/bone/meaty
+ name = "meaty bone tile"
+ singular_name = "meaty bone floor tile"
+ desc = "Don't question where the meat around it came from."
+ icon_state = "tile_meatbone"
+ inhand_icon_state = "tile-meat"
+ turf_type = /turf/open/floor/bone/meaty
+ merge_type = /obj/item/stack/tile/bone/meaty
+
+/obj/item/stack/tile/bone/meaty/corner
+ name = "meaty bone corner tile"
+ singular_name = "meaty bone corner floor tile"
+ icon_state = "meatbone_corner"
+ turf_type = /turf/open/floor/bone/meaty/corner
+ merge_type = /obj/item/stack/tile/bone/meaty/corner
+ tile_rotate_dirs = list(SOUTH, NORTH, EAST, WEST)
+
+/obj/item/stack/tile/bone/meaty/straight
+ name = "meaty bone straight tile"
+ singular_name = "meaty bone straight floor tile"
+ icon_state = "meatbone_straight"
+ turf_type = /turf/open/floor/bone/meaty/straight
+ merge_type = /obj/item/stack/tile/bone/meaty/straight
+ tile_rotate_dirs = list(SOUTH, NORTH, EAST, WEST)
+
+/obj/item/stack/tile/bone/meaty/spine
+ name = "meaty bone spine tile"
+ singular_name = "meaty bone spine floor tile"
+ icon_state = "meatbone_spine"
+ turf_type = /turf/open/floor/bone/meaty/spine
+ merge_type = /obj/item/stack/tile/bone/meaty/spine
+ tile_rotate_dirs = list(SOUTH, NORTH, EAST, WEST)
+
+/obj/item/stack/tile/hauntium
+ name = "hauntium tile"
+ singular_name = "hauntium floor tile"
+ desc = "Dead men walking? More like walking over dead men."
+ icon_state = "tile_hauntium"
+ inhand_icon_state = "tile-hauntium"
+ mats_per_unit = list(/datum/material/hauntium = HALF_SHEET_MATERIAL_AMOUNT / 2)
+ turf_type = /turf/open/floor/hauntium
+ merge_type = /obj/item/stack/tile/hauntium
+ tile_reskin_types = list(
+ /obj/item/stack/tile/hauntium,
+ /obj/item/stack/tile/hauntium/ghostbricked,
+ )
+
+/obj/item/stack/tile/hauntium/ghostbricked
+ name = "ghostbricked hauntium tile"
+ singular_name = "ghostbricked hauntium floor tile"
+ icon_state = "tile_hauntium_ghostbricked"
+ turf_type = /turf/open/floor/hauntium/ghostbricked
+ merge_type = /obj/item/stack/tile/hauntium/ghostbricked
+
+/obj/item/stack/tile/neo
+ name = "neo tile"
+ singular_name = "neo floor tile"
+ inhand_icon_state = "tile-neon"
+ mats_per_unit = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT / 2)
+ turf_type = /turf/open/floor/neo
+ merge_type = /obj/item/stack/tile/neo
+ tile_reskin_types = list(
+ /obj/item/stack/tile/neo/red,
+ /obj/item/stack/tile/neo/purple,
+ /obj/item/stack/tile/neo/orange,
+ /obj/item/stack/tile/neo/cyan,
+ )
+
+/obj/item/stack/tile/neo/red
+ name = "red neo tile"
+ singular_name = "red neo floor tile"
+ desc = "A neo tile. Radiates with the power of ketchup."
+ icon_state = "neo_red"
+ turf_type = /turf/open/floor/neo/red
+ merge_type = /obj/item/stack/tile/neo/red
+
+/obj/item/stack/tile/neo/purple
+ name = "purple neo tile"
+ singular_name = "purple neo floor tile"
+ desc = "A neo tile. Radiates with the power of neo. Duh."
+ icon_state = "neo_purple"
+ turf_type = /turf/open/floor/neo/purple
+ merge_type = /obj/item/stack/tile/neo/purple
+
+/obj/item/stack/tile/neo/orange
+ name = "orange neo tile"
+ singular_name = "orange neo floor tile"
+ desc = "A neo tile. Radiates with the power of 80s stylized sunset and tequilla."
+ icon_state = "neo_orange"
+ turf_type = /turf/open/floor/neo/orange
+ merge_type = /obj/item/stack/tile/neo/orange
+
+/obj/item/stack/tile/neo/cyan
+ name = "cyan neo tile"
+ singular_name = "cyan neo floor tile"
+ desc = "A neo tile. Radiates with the power of being pedantic about colour names."
+ icon_state = "neo_cyan"
+ turf_type = /turf/open/floor/neo/cyan
+ merge_type = /obj/item/stack/tile/neo/cyan
+
+/obj/item/stack/tile/silvergold
+ name = "silver and gold floor"
+ desc = "Floor made from silver and gold, in scaly pattern. As if just one or the other wasn't lavish enough."
+ icon_state = "blade"
+ singular_name = "silver and gold tile"
+ inhand_icon_state = "tile-silvergold"
+ mats_per_unit = list(/datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT / 4, /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT / 4)
+ turf_type = /turf/open/floor/silvergold
+ merge_type = /obj/item/stack/tile/silvergold
+ tile_reskin_types = list(
+ /obj/item/stack/tile/silvergold,
+ /obj/item/stack/tile/silvergold/sword,
+ /obj/item/stack/tile/silvergold/void,
+ /obj/item/stack/tile/silvergold/flow,
+ )
+
+/obj/item/stack/tile/silvergold/sword
+ name = "sword tile"
+ singular_name = "sword tile"
+ desc = "Floor made from silver and gold, in scaly pattern, with a sword in the middle."
+ icon_state = "blade_sword"
+ turf_type = /turf/open/floor/silvergold/sword
+ merge_type = /obj/item/stack/tile/silvergold/sword
+
+/obj/item/stack/tile/silvergold/void
+ name = "stars tile"
+ singular_name = "stars tile"
+ desc = "Floor made from silver and gold, picturing stars. As opposed to the actual stars you are surrounded by."
+ icon_state = "void"
+ turf_type = /turf/open/floor/silvergold/void
+ merge_type = /obj/item/stack/tile/silvergold/void
+
+/obj/item/stack/tile/silvergold/flow
+ name = "flowing tile"
+ singular_name = "flowing tile"
+ desc = "Floor made from silver and gold, with a flowing pattern. Silver and gold in balance."
+ icon_state = "flow"
+ turf_type = /turf/open/floor/silvergold/flow
+ merge_type = /obj/item/stack/tile/silvergold/flow
/obj/item/stack/tile/material
name = "floor tile"
@@ -1218,6 +1628,66 @@
mats_per_unit = list(/datum/material/runedmetal=SMALL_MATERIAL_AMOUNT*5)
merge_type = /obj/item/stack/tile/cult/window
+/// Plasteel
+
+/obj/item/stack/tile/plasteel
+ name = "plasteel tile"
+ singular_name = "plasteel floor tile"
+ desc = "Industrial plasteel tiles, tough and reinforced."
+ icon_state = "plasteel"
+ inhand_icon_state = "tile-shuttle"
+ turf_type = /turf/open/floor/mineral/plasteel
+ mats_per_unit = list(/datum/material/alloy/plasteel=SHEET_MATERIAL_AMOUNT*0.25)
+ merge_type = /obj/item/stack/tile/plasteel
+ tile_reskin_types = list(
+ /obj/item/stack/tile/plasteel,
+ /obj/item/stack/tile/plasteel/straight,
+ /obj/item/stack/tile/plasteel/corner,
+ /obj/item/stack/tile/plasteel/block,
+ /obj/item/stack/tile/plasteel/lock,
+ /obj/item/stack/tile/plasteel/tiled,
+ )
+
+/obj/item/stack/tile/plasteel/straight
+ name = "straight plasteel tile"
+ singular_name = "straight plasteel floor tile"
+ desc = "Industrial straight plasteel tiles, tough and reinforced."
+ turf_type = /turf/open/floor/mineral/plasteel/straight
+ icon_state = "plasteel_straight"
+ merge_type = /obj/item/stack/tile/plasteel/straight
+
+/obj/item/stack/tile/plasteel/corner
+ name = "corner plasteel tile"
+ singular_name = "corner plasteel floor tile"
+ desc = "Industrial corner plasteel tiles, tough and reinforced."
+ turf_type = /turf/open/floor/mineral/plasteel/corner
+ icon_state = "plasteel_corner"
+ merge_type = /obj/item/stack/tile/plasteel/corner
+
+/obj/item/stack/tile/plasteel/block
+ name = "blocky plasteel tile"
+ singular_name = "blocky plasteel floor tile"
+ desc = "Blocky plasteel tiles, quite futuristic."
+ turf_type = /turf/open/floor/mineral/plasteel/block
+ icon_state = "block"
+ merge_type = /obj/item/stack/tile/plasteel/block
+
+/obj/item/stack/tile/plasteel/lock
+ name = "locked plasteel tile"
+ singular_name = "locked plasteel floor tile"
+ desc = "Locked plasteel tiles, with a keyhole symbol in the middle. Could be a pawn, though?"
+ turf_type = /turf/open/floor/mineral/plasteel/lock
+ icon_state = "lock"
+ merge_type = /obj/item/stack/tile/plasteel/lock
+
+/obj/item/stack/tile/plasteel/tiled
+ name = "plasteel tiled"
+ singular_name = "tiled plasteel"
+ desc = "Plasteel, tiled."
+ turf_type = /turf/open/floor/mineral/plasteel/tiled
+ icon_state = "plasteel_tiled"
+ merge_type = /obj/item/stack/tile/plasteel/tiled
+
/// Floor tiles used to test emissive turfs.
/obj/item/stack/tile/emissive_test
name = "emissive test tile"
@@ -1360,3 +1830,77 @@
turf_type = /turf/open/floor/glass/plastitatanium
merge_type = /obj/item/stack/tile/glass/plastitanium
mats_per_unit = list(/datum/material/alloy/plastitaniumglass = SHEET_MATERIAL_AMOUNT * 0.25)
+
+/obj/item/stack/tile/stained_glass
+ name = "stained glass floor"
+ singular_name = "stained glass floor tile"
+ desc = "This shouldn't exist."
+ icon_state = null
+ turf_type = /turf/open/floor/glass
+ inhand_icon_state = "tile-glass"
+ merge_type = /obj/item/stack/tile/stained_glass
+ mats_per_unit = list(/datum/material/glass=SHEET_MATERIAL_AMOUNT * 0.25, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.25,)
+
+/obj/item/stack/tile/stained_glass/red
+ name = "red stained glass floor"
+ singular_name = "red stained glass floor tile"
+ desc = "Glass floor, stained red. Not with blood, hopefuly."
+ icon_state = "tile_sglass_red"
+ turf_type = /turf/open/floor/glass/stained_red
+ merge_type = /obj/item/stack/tile/stained_glass/red
+
+/obj/item/stack/tile/stained_glass/orange
+ name = "orange stained glass floor"
+ singular_name = "orange stained glass floor tile"
+ desc = "Glass floor, stained orange. Somebody spilled their orange juice?"
+ icon_state = "tile_sglass_orange"
+ turf_type = /turf/open/floor/glass/stained_orange
+ merge_type = /obj/item/stack/tile/stained_glass/orange
+
+/obj/item/stack/tile/stained_glass/yellow
+ name = "yellow stained glass floor"
+ singular_name = "yellow stained glass floor tile"
+ desc = "Glass floor, stained yellow. Probably by some mellow fellow."
+ icon_state = "tile_sglass_yellow"
+ turf_type = /turf/open/floor/glass/stained_yellow
+ merge_type = /obj/item/stack/tile/stained_glass/yellow
+
+/obj/item/stack/tile/stained_glass/green
+ name = "green stained glass floor"
+ singular_name = "green stained glass floor tile"
+ desc = "Glass floor, stained green. That's what you get when putting liquid uranium at the edge of your table."
+ icon_state = "tile_sglass_green"
+ turf_type = /turf/open/floor/glass/stained_green
+ merge_type = /obj/item/stack/tile/stained_glass/green
+
+/obj/item/stack/tile/stained_glass/blue
+ name = "blue stained glass floor"
+ singular_name = "blue stained glass floor tile"
+ desc = "Glass floor, stained blue. With tears of someone feeling blue, obviously."
+ icon_state = "tile_sglass_blue"
+ turf_type = /turf/open/floor/glass/stained_blue
+ merge_type = /obj/item/stack/tile/stained_glass/blue
+
+/obj/item/stack/tile/stained_glass/purple
+ name = "purple stained glass floor"
+ singular_name = "purple stained glass floor tile"
+ desc = "Glass floor, stained purple. It tastes purple, too."
+ icon_state = "tile_sglass_purple"
+ turf_type = /turf/open/floor/glass/stained_purple
+ merge_type = /obj/item/stack/tile/stained_glass/purple
+
+/obj/item/stack/tile/stained_glass/white
+ name = "white stained glass floor"
+ singular_name = "white stained glass floor tile"
+ desc = "Glass floor, stained white. Or perhaps it was bleached?"
+ icon_state = "tile_sglass_white"
+ turf_type = /turf/open/floor/glass/stained_white
+ merge_type = /obj/item/stack/tile/stained_glass/white
+
+/obj/item/stack/tile/stained_glass/black
+ name = "black stained glass floor"
+ singular_name = "black stained glass floor tile"
+ desc = "Glass floor, stained black. A space squid inked it."
+ icon_state = "tile_sglass_black"
+ turf_type = /turf/open/floor/glass/stained_black
+ merge_type = /obj/item/stack/tile/stained_glass/black
diff --git a/code/game/objects/items/stacks/wall_filling.dm b/code/game/objects/items/stacks/wall_filling.dm
index cbeb4ccbb56e..4c69c0060806 100644
--- a/code/game/objects/items/stacks/wall_filling.dm
+++ b/code/game/objects/items/stacks/wall_filling.dm
@@ -93,6 +93,38 @@ GLOBAL_LIST_EMPTY(wall_reskin_lists)
if(wall_reskin_types)
wall_reskin_types = wall_reskin_list(wall_reskin_types)
+/obj/item/stack/wall_filling/sandstone
+ name = "sandstone wall filling"
+ singular_name = "sandstone wall filler"
+ desc = "A filling for a standard sandstone wall."
+ icon_state = "sandbrick-wall-fill"
+ inhand_icon_state = null
+ mats_per_unit = list(/datum/material/sandstone =SHEET_MATERIAL_AMOUNT*2)
+ merge_type = /obj/item/stack/wall_filling/sandstone
+ made_from = /obj/item/stack/sheet/mineral/sandstone
+ wall_reskin_types = list(
+ /obj/item/stack/wall_filling/sandstone/basic,
+ /obj/item/stack/wall_filling/sandstone/ornate,
+ /obj/item/stack/wall_filling/sandstone/basalt,
+ )
+
+/obj/item/stack/wall_filling/sandstone/basic
+ merge_type = /obj/item/stack/wall_filling/sandstone/basic
+
+/obj/item/stack/wall_filling/sandstone/ornate
+ name = "ornate sandstone wall filling"
+ singular_name = "ornate sandstone wall filler"
+ icon_state = "sandornate-wall-fill"
+ desc = "A filling for a ornate sandstone wall. Is someone here building a pyramid or something?"
+ merge_type = /obj/item/stack/wall_filling/sandstone/ornate
+
+/obj/item/stack/wall_filling/sandstone/basalt
+ name = "basalt sandstone wall filling"
+ singular_name = "basalt sandstone wall filler"
+ icon_state = "basaltbrick-wall-fill"
+ desc = "A filling for a basalt wall, made out of sandstone. Not sure how it works, not the weirdest thing you've seen."
+ merge_type = /obj/item/stack/wall_filling/sandstone/basalt
+
/obj/item/stack/wall_filling/plastitanium
name = "plastitanium wall filling"
singular_name = "plastitanium wall filler"
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 9789f63e77f1..923f79244e1a 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -62,13 +62,17 @@
icon_state = "bag_of_holding"
inhand_icon_state = "holdingpack"
resistance_flags = FIRE_PROOF
- item_flags = NO_MAT_REDEMPTION | BLUESPACE_INTERFERENCE
+ item_flags = NO_MAT_REDEMPTION
armor_type = /datum/armor/backpack_holding
storage_type = /datum/storage/bag_of_holding
pickup_sound = null
drop_sound = null
custom_materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/bluespace = SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 7.5, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 2.5)
+/obj/item/storage/backpack/holding/Initialize(mapload)
+ . = ..()
+ ADD_TRAIT(src, TRAIT_BLUESPACE_INTERFERENCE, INNATE_TRAIT)
+
/datum/armor/backpack_holding
fire = 60
acid = 50
diff --git a/code/game/objects/items/storage/boxes/job_boxes.dm b/code/game/objects/items/storage/boxes/job_boxes.dm
index 0c78be971bcd..830d3db5f62b 100644
--- a/code/game/objects/items/storage/boxes/job_boxes.dm
+++ b/code/game/objects/items/storage/boxes/job_boxes.dm
@@ -319,4 +319,4 @@
/obj/item/storage/box/contractor/fulton_extraction/PopulateContents()
new /obj/item/extraction_pack/syndicate(src)
- new /obj/item/fulton_core(src)
+ new /obj/item/fulton_core/syndicate(src)
diff --git a/code/game/objects/items/storage/dufflebags.dm b/code/game/objects/items/storage/dufflebags.dm
index ad62356d6015..257185ba6491 100644
--- a/code/game/objects/items/storage/dufflebags.dm
+++ b/code/game/objects/items/storage/dufflebags.dm
@@ -412,3 +412,4 @@
new /obj/item/gun/energy/recharge/kinetic_accelerator(src)
new /obj/item/knife/combat/survival(src)
new /obj/item/flashlight/seclite(src)
+ new /obj/item/stack/candela_beacon/thirty(src)
diff --git a/code/game/objects/items/storage/toolboxes/weapons.dm b/code/game/objects/items/storage/toolboxes/weapons.dm
index ff42dfc58a10..bbfb4e2bcb3d 100644
--- a/code/game/objects/items/storage/toolboxes/weapons.dm
+++ b/code/game/objects/items/storage/toolboxes/weapons.dm
@@ -274,7 +274,7 @@
if(atom_storage.locked == STORAGE_NOT_LOCKED)
return TRUE
- if(is_simian(user))
+ if(HAS_TRAIT(user, TRAIT_SIMIAN))
atom_storage.locked = STORAGE_NOT_LOCKED
to_chat(user, span_notice("You place your paw on the paw scanner, and hear a soft click as [src] unlocks!"))
playsound(src, 'sound/items/click.ogg', 25, TRUE)
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index f4d7f2491abb..0c8a7d0d7b59 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -495,6 +495,7 @@
new /obj/item/reagent_containers/cup/bottle/carnivorous_blood(src)
new /obj/item/reagent_containers/syringe(src)
new /obj/item/food/meat/slab/human(src)
+ new /obj/item/paper/guides/carnivorous_blood(src)
/obj/item/storage/box/syndie_kit/nuke
name = "nuke core extraction kit"
diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm
index 28809f7c1b10..0af3d784c5ad 100644
--- a/code/game/objects/items/teleportation.dm
+++ b/code/game/objects/items/teleportation.dm
@@ -404,7 +404,7 @@
var/turf/destination = get_teleport_loc(current_location, user, teleport_distance)
var/bagholdingcheck = FALSE
for(var/obj/item/check as anything in user.get_all_contents_type(/obj/item))
- if(check.item_flags & BLUESPACE_INTERFERENCE)
+ if(HAS_TRAIT(check, TRAIT_BLUESPACE_INTERFERENCE))
bagholdingcheck = TRUE
if(isclosedturf(destination))
if(!triggered_by_emp && !bagholdingcheck)
diff --git a/code/game/objects/items/tools/control_wand.dm b/code/game/objects/items/tools/control_wand.dm
index 2c76191a7da9..4e3ed943f5b0 100644
--- a/code/game/objects/items/tools/control_wand.dm
+++ b/code/game/objects/items/tools/control_wand.dm
@@ -17,6 +17,7 @@
w_class = WEIGHT_CLASS_TINY
drop_sound = 'sound/items/door_remote/door_remote_drop1.ogg'
pickup_sound = 'sound/items/door_remote/door_remote_pick_up1.ogg'
+ item_flags = NOBLUDGEON
var/department = "civilian"
var/mode = WAND_OPEN
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index b59cdb5cf0b7..1c55103cd612 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -199,20 +199,20 @@
return ITEM_INTERACT_SUCCESS
/obj/item/toy/balloon/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
- if(!istype(tool, /obj/item/ammo_casing/foam_dart) || !ismonkey(user))
+ if(!istype(tool, /obj/item/ammo_casing/foam_dart) || !HAS_TRAIT(user, TRAIT_SIMIAN))
return NONE
pop_balloon(monkey_pop = TRUE)
return ITEM_INTERACT_SUCCESS
/obj/item/toy/balloon/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
var/mob/thrower = throwingdatum?.get_thrower()
- if(ismonkey(thrower) && istype(AM, /obj/item/ammo_casing/foam_dart))
+ if(HAS_TRAIT(thrower, TRAIT_SIMIAN) && istype(AM, /obj/item/ammo_casing/foam_dart))
pop_balloon(monkey_pop = TRUE)
else
return ..()
/obj/item/toy/balloon/bullet_act(obj/projectile/proj)
- if((istype(proj, /obj/projectile/bullet/p50) || istype(proj,/obj/projectile/bullet/foam_dart)) && ismonkey(proj.firer))
+ if((istype(proj, /obj/projectile/bullet/p50) || istype(proj,/obj/projectile/bullet/foam_dart)) && HAS_TRAIT(proj.firer, TRAIT_SIMIAN))
pop_balloon(monkey_pop = TRUE)
return BULLET_ACT_HIT
return ..()
diff --git a/code/game/objects/items/weaponry/melee/chainsaw.dm b/code/game/objects/items/weaponry/melee/chainsaw.dm
index 770fbdd721a8..a7ee30cd795c 100644
--- a/code/game/objects/items/weaponry/melee/chainsaw.dm
+++ b/code/game/objects/items/weaponry/melee/chainsaw.dm
@@ -161,5 +161,75 @@
return TRUE
return FALSE
+/obj/item/chainsaw/dual
+ name = "double-ended chainsaw spear"
+ desc = "A dangerous, crazy contraption that could fall apart from a slight breeze. WHAT WERE THEY THINKING?!"
+ icon_state = "chainsawdual"
+ base_icon_state = "chainsawdual"
+ lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
+ throw_range = 0
+ force_on = 40
+ armour_penetration = 20
+ block_chance = 50
+ block_sound = 'sound/items/weapons/parry.ogg'
+ item_flags = SLOWS_WHILE_IN_HAND
+ slowdown = 2
+ custom_materials = list(
+ /datum/material/iron = SHEET_MATERIAL_AMOUNT * 12.3,
+ /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 10,
+ /datum/material/glass = SHEET_MATERIAL_AMOUNT * 6.3,
+ /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 2
+ )
+
+/obj/item/chainsaw/dual/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
+ . = ..()
+ if(HAS_TRAIT(user, TRAIT_HULK))
+ to_chat(user, span_warning("You grip the weapon too hard and accidentally drop it!"))
+ user.dropItemToGround(src, force=TRUE)
+ return TRUE
+
+/obj/item/chainsaw/dual/attack(mob/target, mob/living/carbon/human/user)
+ if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE))
+ return ..()
+
+ if(prob(50))
+ impale(user)
+ return TRUE
+
+ return ..()
+
+/obj/item/chainsaw/dual/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
+ if(prob(50))
+ INVOKE_ASYNC(src, PROC_REF(jedi_spin), user)
+
+/obj/item/chainsaw/dual/proc/jedi_spin(mob/living/user)
+ dance_rotate(user, CALLBACK(user, TYPE_PROC_REF(/mob, dance_flip)))
+
+/obj/item/chainsaw/dual/proc/impale(mob/living/user)
+ to_chat(user, span_warning("You horrifically tear yourself with [src]!"))
+ user.take_bodypart_damage(45,check_armor = TRUE, wound_bonus = 20, sharpness = SHARP_EDGED)
+ user.do_attack_animation(user)
+ user.Stun(1 SECONDS)
+ user.Knockdown(5 SECONDS)
+
+/obj/item/chainsaw/dual/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE)
+ if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK)
+ final_block_chance = 0
+ if(attack_type != PROJECTILE_ATTACK && prob(30))
+ atom_destruction(MELEE)
+ return FALSE
+
+ return ..()
+
+/obj/item/chainsaw/dual/atom_destruction(damage_flag)
+ playsound(src, 'sound/effects/grillehit.ogg', 50)
+ new /obj/item/chainsaw(drop_location())
+ new /obj/item/chainsaw(drop_location())
+ new /obj/item/restraints/handcuffs/cable(drop_location())
+ if(isliving(loc))
+ loc.balloon_alert(loc, "weapon broken!")
+ return ..()
+
/datum/action/item_action/startchainsaw
name = "Pull The Starting Cord"
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index c875a0517687..969ed770f08b 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -312,6 +312,31 @@
smoothing_groups = SMOOTH_GROUP_SANDSTONE_WALLS + SMOOTH_GROUP_WALLS
canSmoothWith = SMOOTH_GROUP_SANDSTONE_WALLS
+/obj/structure/falsewall/sandstone/wall_fill
+ mineral = /obj/item/stack/wall_filling/sandstone/basic
+ mineral_amount = 1
+ walltype = /turf/closed/wall/mineral/sandstone/wall_fill
+
+/obj/structure/falsewall/sandstone/ornate
+ name = "sandstone wall"
+ desc = "A wall with sandstone plating. Rough."
+ fake_icon = 'icons/turf/walls/sandstone_ornate_wall.dmi'
+ icon_state = "sandstone_ornate_wall-open"
+ base_icon_state = "sandstone_ornate_wall"
+ mineral = /obj/item/stack/wall_filling/sandstone/ornate
+ mineral_amount = 1
+ walltype = /turf/closed/wall/mineral/sandstone/ornate
+
+/obj/structure/falsewall/sandstone/basalt
+ name = "basalt wall"
+ desc = "A wall with basalt plating. The orange is from other colours of sand that make up for it."
+ fake_icon = 'icons/turf/walls/sandbasalt_wall.dmi'
+ icon_state = "sandbasalt_wall-open"
+ base_icon_state = "sandbasalt_wall"
+ mineral = /obj/item/stack/wall_filling/sandstone/basalt
+ mineral_amount = 1
+ walltype = /turf/closed/wall/mineral/sandstone/basalt
+
/obj/structure/falsewall/wood
name = "wooden wall"
desc = "A wall with wooden plating. Stiff."
@@ -427,6 +452,78 @@
smoothing_groups = SMOOTH_GROUP_SURVIVAL_TITANIUM_POD + SMOOTH_GROUP_TITANIUM_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
canSmoothWith = SMOOTH_GROUP_SURVIVAL_TITANIUM_POD
+/obj/structure/falsewall/bone
+ name = "bone wall"
+ desc = "A bone wall. That's a lot of calcium."
+ fake_icon = 'icons/turf/walls/bone_wall.dmi'
+ icon_state = "bone_wall-open"
+ base_icon_state = "bone_wall"
+ mineral = /obj/item/stack/sheet/bone
+ walltype = /turf/closed/wall/mineral/bone
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_BONE_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_BONE_WALLS
+
+/obj/structure/falsewall/runite
+ name = "runite wall"
+ desc = "A runite wall. How... magical."
+ fake_icon = 'icons/turf/walls/runite_wall.dmi'
+ icon_state = "runite_wall-open"
+ base_icon_state = "runite_wall"
+ mineral = /obj/item/stack/sheet/mineral/runite
+ walltype = /turf/closed/wall/mineral/runite
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_RUNITE_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_RUNITE_WALLS
+
+/obj/structure/falsewall/adamantine
+ name = "adamantine wall"
+ desc = "A adamantine wall. Quite industrial."
+ fake_icon = 'icons/turf/walls/adamantine_wall.dmi'
+ icon_state = "adamantine_wall-open"
+ base_icon_state = "adamantine_wall"
+ mineral = /obj/item/stack/sheet/mineral/adamantine
+ walltype = /turf/closed/wall/mineral/adamantine
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_ADAMANTINE_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_ADAMANTINE_WALLS
+
+/obj/structure/falsewall/metalhydrogen
+ name = "metal hydrogen wall"
+ desc = "A metal hydrogen wall. Long live atmosia!"
+ fake_icon = 'icons/turf/walls/metal_hydrogen_wall.dmi'
+ icon_state = "metal_hydrogen_wall-open"
+ base_icon_state = "metal_hydrogen_wall"
+ mineral = /obj/item/stack/sheet/mineral/metal_hydrogen
+ walltype = /turf/closed/wall/mineral/metalhydrogen
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_METALHYDROGEN_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_METALHYDROGEN_WALLS
+
+/obj/structure/falsewall/hauntium
+ name = "hauntium wall"
+ desc = "A hauntium wall. Are you spooked yet?"
+ fake_icon = 'icons/turf/walls/hauntium_wall.dmi'
+ icon_state = "hauntium_wall-open"
+ base_icon_state = "hauntium_wall"
+ mineral = /obj/item/stack/sheet/hauntium
+ walltype = /turf/closed/wall/mineral/hauntium
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_HAUNTIUM_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_HAUNTIUM_WALLS
+
+/obj/structure/falsewall/mythril
+ name = "mythril wall"
+ desc = "A fake mythril wall. You can tell it's fake because it's not perfect like the rest."
+ fake_icon = 'icons/turf/walls/mythril_wall.dmi'
+ icon_state = "mythril_wall-open"
+ base_icon_state = "mythril_wall"
+ mineral = /obj/item/stack/sheet/mineral/mythril
+ walltype = /turf/closed/wall/mineral/mythril
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_MYTHRIL_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_MYTHRIL_WALLS
+
/obj/structure/falsewall/material
name = "wall"
desc = "A huge chunk of material used to separate rooms."
diff --git a/code/game/objects/structures/lavaland/vent_mining/boss_vent.dm b/code/game/objects/structures/lavaland/vent_mining/boss_vent.dm
new file mode 100644
index 000000000000..149d5c3ed0f9
--- /dev/null
+++ b/code/game/objects/structures/lavaland/vent_mining/boss_vent.dm
@@ -0,0 +1,112 @@
+
+/obj/structure/ore_vent/boss
+ name = "menacing ore vent"
+ desc = "An ore vent, brimming with underground ore. This one has an evil aura about it. Better be careful."
+ unique_vent = TRUE
+ spawn_drone_on_tap = FALSE
+ boulder_size = BOULDER_SIZE_LARGE
+ mineral_breakdown = list( // All the riches of the world, eeny meeny boulder room.
+ /datum/material/iron = 1,
+ /datum/material/glass = 1,
+ /datum/material/plasma = 1,
+ /datum/material/titanium = 1,
+ /datum/material/silver = 1,
+ /datum/material/gold = 1,
+ /datum/material/diamond = 0.1,
+ /datum/material/uranium = 1,
+ /datum/material/bluespace = 0.1,
+ /datum/material/plastic = 1,
+ )
+ defending_mobs = list(
+ /mob/living/simple_animal/hostile/megafauna/bubblegum,
+ /mob/living/simple_animal/hostile/megafauna/dragon,
+ /mob/living/simple_animal/hostile/megafauna/colossus,
+ )
+ excavation_warning = "Something big is nearby. Are you ABSOLUTELY ready to excavate this ore vent? A NODE drone will be deployed after threat is neutralized."
+ ///What boss do we want to spawn?
+ var/summoned_boss = null
+
+/obj/structure/ore_vent/boss/Initialize(mapload)
+ . = ..()
+ summoned_boss = pick(defending_mobs)
+
+/obj/structure/ore_vent/boss/Destroy()
+ . = ..()
+ summoned_boss = null
+
+/obj/structure/ore_vent/boss/examine(mob/user)
+ . = ..()
+ var/boss_string = ""
+ switch(summoned_boss)
+ if(/mob/living/simple_animal/hostile/megafauna/bubblegum)
+ boss_string = "A giant fleshbound beast"
+ if(/mob/living/simple_animal/hostile/megafauna/dragon)
+ boss_string = "Sharp teeth and scales"
+ if(/mob/living/simple_animal/hostile/megafauna/colossus)
+ boss_string = "A giant, armored behemoth"
+ if(/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner)
+ boss_string = "A bloody drillmark"
+ if(/mob/living/simple_animal/hostile/megafauna/wendigo/noportal)
+ boss_string = "A chilling skull"
+ . += span_notice("[boss_string] is etched onto the side of the vent.")
+
+/obj/structure/ore_vent/boss/start_wave_defense()
+ if(!COOLDOWN_FINISHED(src, wave_cooldown))
+ return
+ // Completely override the normal wave defense, and just spawn the boss.
+ var/mob/living/simple_animal/hostile/megafauna/boss = new summoned_boss(loc)
+ RegisterSignal(boss, COMSIG_VENT_WAVE_CONCLUDED, PROC_REF(handle_wave_conclusion))
+ SSblackbox.record_feedback("tally", "ore_vent_mobs_spawned", 1, summoned_boss)
+ boss.say(boss.summon_line, language = /datum/language/common, forced = "summon line") //Pull their specific summon line to say. Default is meme text so make sure that they have theirs set already.
+
+/obj/structure/ore_vent/boss/handle_wave_conclusion()
+ node = new /mob/living/basic/node_drone(loc) //We're spawning the vent after the boss dies, so the player can just focus on the boss.
+ SSblackbox.record_feedback("tally", "ore_vent_mobs_killed", 1, summoned_boss)
+ COOLDOWN_RESET(src, wave_cooldown)
+ return ..()
+
+/obj/structure/ore_vent/boss/icebox
+ icon_state = "ore_vent_ice"
+ base_icon_state = "ore_vent_ice"
+ defending_mobs = list(
+ /mob/living/simple_animal/hostile/megafauna/demonic_frost_miner,
+ /mob/living/simple_animal/hostile/megafauna/wendigo/noportal,
+ /mob/living/simple_animal/hostile/megafauna/colossus,
+ )
+
+/** Debug vent: The one we have for testing.*/
+/obj/structure/ore_vent/debug
+ name = "debug ore vent"
+ desc = "How the hell did you get this?"
+ tapped = TRUE
+ discovered = TRUE
+ unique_vent = TRUE
+ color = "#ff00f2"
+ boulder_size = BOULDER_SIZE_SMALL
+ mineral_breakdown = list(
+ /datum/material/iron = 1,
+ )
+
+/obj/structure/ore_vent/debug/attack_hand(mob/living/user, list/modifiers)
+ . = ..()
+ var/datum/material/choice = tgui_input_list(user, "Choose a material to add/remove.", "New material", subtypesof(/datum/material))
+ if(!choice)
+ return
+ if(mineral_breakdown[choice])
+ mineral_breakdown -= choice
+ balloon_alert_to_viewers("removed [choice::name]")
+ return
+ mineral_breakdown += choice
+ balloon_alert_to_viewers("added [choice::name]")
+ var/value = tgui_input_number(user, "What weight should it have?", "ore pickweight", 1, 100, 1)
+ mineral_breakdown[choice] = value
+ balloon_alert_to_viewers("weighting of [value] added")
+ generate_description()
+
+/obj/structure/ore_vent/debug/attack_hand_secondary(mob/user, list/modifiers)
+ . = ..()
+ var/choice = tgui_input_list(user, "Choose a vent size.", "New size", list(SMALL_VENT_TYPE, MEDIUM_VENT_TYPE, LARGE_VENT_TYPE))
+ if(!choice)
+ return
+ vent_size_setup(random = FALSE, force_size = choice, map_loading = FALSE)
+
diff --git a/code/game/objects/structures/lavaland/gulag_vent.dm b/code/game/objects/structures/lavaland/vent_mining/gulag_vent.dm
similarity index 100%
rename from code/game/objects/structures/lavaland/gulag_vent.dm
rename to code/game/objects/structures/lavaland/vent_mining/gulag_vent.dm
diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/vent_mining/ore_vent.dm
similarity index 82%
rename from code/game/objects/structures/lavaland/ore_vent.dm
rename to code/game/objects/structures/lavaland/vent_mining/ore_vent.dm
index ff1f18cb5a1f..2b4f62aae9ae 100644
--- a/code/game/objects/structures/lavaland/ore_vent.dm
+++ b/code/game/objects/structures/lavaland/vent_mining/ore_vent.dm
@@ -41,6 +41,7 @@
MEDIUM_VENT_TYPE = 5,
SMALL_VENT_TYPE = 7,
)
+ /// The number of waves a vent will spawn to protect itself. See the spawner component for more details.
var/wave_timer = WAVE_DURATION_SMALL
/// What string do we use to warn the player about the excavation event?
@@ -68,6 +69,10 @@
var/obj/effect/abstract/top_bit = null
/// Are we currently hiding our top half because someone is above us?
var/trimmed = FALSE
+ /// Power flags we provide for our network
+ var/network_power_flags = CANDELA_NETWORK_POWERED
+ /// Is this vent being boosted by a Candela network?
+ var/boosted = FALSE
/// What base icon_state do we use for this vent's boulders?
var/boulder_icon_state = "boulder"
@@ -91,8 +96,7 @@
))
if(tapped)
SSore_generation.processed_vents += src
- update_appearance(UPDATE_ICON_STATE)
- add_tapped_visual()
+ become_tapped()
RegisterSignal(src, COMSIG_SPAWNER_SPAWNED_DEFAULT, PROC_REF(anti_cheese))
RegisterSignal(src, COMSIG_SPAWNER_SPAWNED, PROC_REF(log_mob_spawned))
@@ -234,18 +238,13 @@
return FALSE
if(!can_interact(user) && !mech_scan)
return FALSE
- if(!COOLDOWN_FINISHED(src, wave_cooldown) || node)
- return FALSE
//This is where we start spitting out mobs.
Shake(duration = 3 SECONDS)
if(spawn_drone)
node = new /mob/living/basic/node_drone(loc)
node.arrive(src)
- RegisterSignal(node, COMSIG_QDELETING, PROC_REF(handle_wave_conclusion))
- RegisterSignal(node, COMSIG_MOVABLE_MOVED, PROC_REF(handle_wave_conclusion))
- addtimer(CALLBACK(node, TYPE_PROC_REF(/atom, update_appearance)), wave_timer * 0.25)
- addtimer(CALLBACK(node, TYPE_PROC_REF(/atom, update_appearance)), wave_timer * 0.5)
- addtimer(CALLBACK(node, TYPE_PROC_REF(/atom, update_appearance)), wave_timer * 0.75)
+ RegisterSignals(node, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH, COMSIG_MOVABLE_MOVED), PROC_REF(handle_wave_conclusion))
+
add_shared_particles(/particles/smoke/ash)
for(var/i in 1 to 5) // Clears the surroundings of the ore vent before starting wave defense.
for(var/turf/rock in oview(i))
@@ -268,7 +267,7 @@
continue
var/obj/item/boulder/produced = produce_boulder(FALSE)
- var/obj/structure/lattice/catwalk/boulder/platform = produced.create_platform(rock, null, wave_timer)
+ var/obj/structure/lattice/catwalk/boulder/platform = produced.create_platform(rock, null, (wave_timer/5) * 75 SECONDS) // We have to finangle the number a bit to turn it into a timer again.
if(!platform || !QDELETED(produced))
qdel(produced)
@@ -288,15 +287,23 @@
AddComponent(\
/datum/component/spawner, \
spawn_types = defending_mobs, \
- spawn_time = (10 SECONDS + (5 SECONDS * (boulder_size/5))), \
+ spawn_time = 7.5 SECONDS, \
max_spawned = 10, \
- max_spawn_per_attempt = (1 + (boulder_size/5)), \
+ max_spawn_per_attempt = round(boulder_size/5), \
+ max_spawn_types_per_attempt = 2, \
spawn_text = "emerges to assault", \
spawn_distance = 4, \
spawn_distance_exclude = 3, \
+ initial_spawn_delay = 6 SECONDS, \
+ spawner_logic = SPAWN_BY_WAVE_BEHAVIOR, \
+ max_waves = wave_timer, \
+ effect = /obj/effect/temp_visual/dust_cloud, \
+ sound_effect = 'sound/effects/node_drilling.ogg', \
+ spawn_windup = 0.9 SECONDS, \
+ linked_mob = node, \
)
- COOLDOWN_START(src, wave_cooldown, wave_timer)
- addtimer(CALLBACK(src, PROC_REF(handle_wave_conclusion)), wave_timer)
+ COOLDOWN_START(src, wave_cooldown, INFINITY)
+ RegisterSignal(src, COMSIG_VENT_WAVE_CONCLUDED, PROC_REF(handle_wave_conclusion))
update_appearance(UPDATE_ICON_STATE)
/**
@@ -310,12 +317,10 @@
/obj/structure/ore_vent/proc/handle_wave_conclusion(datum/source)
SIGNAL_HANDLER
- SEND_SIGNAL(src, COMSIG_VENT_WAVE_CONCLUDED)
- COOLDOWN_RESET(src, wave_cooldown)
remove_shared_particles(/particles/smoke/ash)
//happens in COMSIG_QDELETING
- if(QDELETED(node))
+ if(QDELETED(node) || node.stat == DEAD)
initiate_wave_loss(loss_message = "\the [src] creaks and groans as the mining attempt fails, and the vent closes back up.")
return
@@ -331,20 +336,22 @@
*/
/obj/structure/ore_vent/proc/initiate_wave_loss(loss_message)
visible_message(span_danger(loss_message))
+ playsound(src, 'sound/effects/rock/rock_break.ogg', 50)
update_appearance(UPDATE_ICON_STATE)
reset_drone(success = FALSE)
+ COOLDOWN_RESET(src, wave_cooldown)
/**
* Handles winning the event, gives everyone a payout and start boulder production
*/
/obj/structure/ore_vent/proc/initiate_wave_win(forced = FALSE)
- tapped = TRUE //The Node Drone has survived the wave defense, and the ore vent is tapped.
+ become_tapped() //The Node Drone has survived the wave defense, and the ore vent is tapped.
SSore_generation.processed_vents += src
if(!forced)
log_game("Ore vent [key_name_and_tag(src)] was tapped")
SSblackbox.record_feedback("tally", "ore_vent_completed", 1, type)
balloon_alert_to_viewers("vent tapped!")
-
+ playsound(node, 'sound/effects/node_victory.ogg', 40, TRUE)
update_appearance(UPDATE_ICON_STATE)
add_tapped_visual()
qdel(GetComponent(/datum/component/gps))
@@ -375,6 +382,7 @@
vent_visual.icon_state = "well"
vent_visual.layer = ABOVE_MOB_LAYER
vent_visual.vis_flags = VIS_INHERIT_PLANE | VIS_INHERIT_ID
+ vent_visual.overlays += emissive_appearance('icons/obj/mining_zones/terrain.dmi', "well_e", src, alpha = 192)
vis_contents += vent_visual
/obj/structure/ore_vent/update_icon_state()
@@ -558,7 +566,7 @@
var/list/mats_list = new_rock.custom_materials?.Copy() || list()
for(var/iteration in 1 to MINERALS_PER_BOULDER)
var/datum/material/material = pick_weight(mineral_breakdown)
- mats_list[material] += ore_quantity_function(iteration)
+ mats_list[material] += ore_quantity_function(iteration, HALF_SHEET_MATERIAL_AMOUNT * (boosted ? BOULDER_MAT_MULT_BOOSTED : 1))
new_rock.set_custom_materials(mats_list)
//set size & durability
@@ -641,6 +649,27 @@
wave_timer = WAVE_DURATION_SMALL
name = initial(name)
+/obj/structure/ore_vent/proc/become_tapped()
+ tapped = TRUE
+ RegisterSignal(src, COMSIG_CANDELA_NODE_NETWORK_CHANGED, PROC_REF(on_network_changed))
+ AddComponent(/datum/component/candela_node, new /datum/mining_beacon_network(), connection_pixel_x = base_pixel_w, connection_pixel_y = base_pixel_z + 36, power_flags = network_power_flags, fulton_point = TRUE)
+ update_appearance(UPDATE_ICON_STATE)
+ add_tapped_visual()
+
+/obj/structure/ore_vent/proc/on_network_changed(datum/source, datum/mining_beacon_network/old_network, datum/mining_beacon_network/new_network)
+ SIGNAL_HANDLER
+
+ if (old_network)
+ UnregisterSignal(old_network, COMSIG_CANDELA_NETWORK_POWER_CHANGED)
+ on_power_changed(old_state = old_network?.powered, new_state = new_network?.powered)
+ if (new_network)
+ RegisterSignal(new_network, COMSIG_CANDELA_NETWORK_POWER_CHANGED, PROC_REF(on_power_changed))
+
+/obj/structure/ore_vent/proc/on_power_changed(datum/source, old_state, new_state)
+ SIGNAL_HANDLER
+
+ boosted = !!(new_state & CANDELA_NETWORK_BOOSTED)
+
//comes with the station, and is already tapped.
/obj/structure/ore_vent/starter_resources
name = "active ore vent"
@@ -653,6 +682,7 @@
/datum/material/iron = 1,
/datum/material/glass = 1,
)
+ network_power_flags = CANDELA_NETWORK_POWERED | CANDELA_NETWORK_BOOSTED
/obj/structure/ore_vent/starter_resources/Initialize(mapload)
. = ..()
@@ -702,127 +732,6 @@
LARGE_VENT_TYPE = 7,
)
-/obj/structure/ore_vent/boss
- name = "menacing ore vent"
- desc = "An ore vent, brimming with underground ore. This one has an evil aura about it. Better be careful."
- unique_vent = TRUE
- spawn_drone_on_tap = FALSE
- boulder_size = BOULDER_SIZE_LARGE
- mineral_breakdown = list( // All the riches of the world, eeny meeny boulder room.
- /datum/material/iron = 1,
- /datum/material/glass = 1,
- /datum/material/plasma = 1,
- /datum/material/titanium = 1,
- /datum/material/silver = 1,
- /datum/material/gold = 1,
- /datum/material/diamond = 0.1,
- /datum/material/uranium = 1,
- /datum/material/bluespace = 0.1,
- /datum/material/plastic = 1,
- )
- defending_mobs = list(
- /mob/living/simple_animal/hostile/megafauna/bubblegum,
- /mob/living/simple_animal/hostile/megafauna/dragon,
- /mob/living/simple_animal/hostile/megafauna/colossus,
- )
- excavation_warning = "Something big is nearby. Are you ABSOLUTELY ready to excavate this ore vent? A NODE drone will be deployed after threat is neutralized."
- ///What boss do we want to spawn?
- var/summoned_boss = null
-
-/obj/structure/ore_vent/boss/Initialize(mapload)
- . = ..()
- summoned_boss = pick(defending_mobs)
-
-/obj/structure/ore_vent/boss/examine(mob/user)
- . = ..()
- var/boss_string = ""
- switch(summoned_boss)
- if(/mob/living/simple_animal/hostile/megafauna/bubblegum)
- boss_string = "A giant fleshbound beast"
- if(/mob/living/simple_animal/hostile/megafauna/dragon)
- boss_string = "Sharp teeth and scales"
- if(/mob/living/simple_animal/hostile/megafauna/colossus)
- boss_string = "A giant, armored behemoth"
- if(/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner)
- boss_string = "A bloody drillmark"
- if(/mob/living/simple_animal/hostile/megafauna/wendigo/noportal)
- boss_string = "A chilling skull"
- . += span_notice("[boss_string] is etched onto the side of the vent.")
-
-/obj/structure/ore_vent/boss/start_wave_defense()
- if(!COOLDOWN_FINISHED(src, wave_cooldown))
- return
- // Completely override the normal wave defense, and just spawn the boss.
- var/mob/living/simple_animal/hostile/megafauna/boss = new summoned_boss(loc)
- RegisterSignal(boss, COMSIG_LIVING_DEATH, PROC_REF(handle_wave_conclusion))
- SSblackbox.record_feedback("tally", "ore_vent_mobs_spawned", 1, summoned_boss)
- COOLDOWN_START(src, wave_cooldown, INFINITY) //Basically forever
- boss.say(boss.summon_line, language = /datum/language/common, forced = "summon line") //Pull their specific summon line to say. Default is meme text so make sure that they have theirs set already.
-
-/obj/structure/ore_vent/boss/handle_wave_conclusion()
- node = new /mob/living/basic/node_drone(loc) //We're spawning the vent after the boss dies, so the player can just focus on the boss.
- SSblackbox.record_feedback("tally", "ore_vent_mobs_killed", 1, summoned_boss)
- COOLDOWN_RESET(src, wave_cooldown)
- return ..()
-
-/obj/structure/ore_vent/boss/icebox
- icon_state = "ore_vent_ice"
- base_icon_state = "ore_vent_ice"
- defending_mobs = list(
- /mob/living/simple_animal/hostile/megafauna/demonic_frost_miner,
- /mob/living/simple_animal/hostile/megafauna/wendigo/noportal,
- /mob/living/simple_animal/hostile/megafauna/colossus,
- )
-
-/obj/structure/ore_vent/debug
- name = "debug ore vent"
- desc = "How the hell did you get this?."
- tapped = TRUE
- discovered = TRUE
- unique_vent = TRUE
- color = "#ff00f2"
- boulder_size = BOULDER_SIZE_SMALL
- mineral_breakdown = list(
- /datum/material/iron = 1,
- )
-
-/obj/structure/ore_vent/debug/attack_hand(mob/living/user, list/modifiers)
- . = ..()
- var/datum/material/choice = tgui_input_list(user, "Choose a material to add/remove.", "New material", subtypesof(/datum/material))
- if(!choice)
- return
- if(mineral_breakdown[choice])
- mineral_breakdown -= choice
- balloon_alert_to_viewers("removed [choice::name]")
- return
- mineral_breakdown += choice
- balloon_alert_to_viewers("added [choice::name]")
- var/value = tgui_input_number(user, "What weight should it have?", "ore pickweight", 1, 100, 1)
- mineral_breakdown[choice] = value
- balloon_alert_to_viewers("weighting of [value] added")
- generate_description()
-
-/obj/structure/ore_vent/debug/attack_hand_secondary(mob/user, list/modifiers)
- . = ..()
- var/choice = tgui_input_list(user, "Choose a vent size.", "New size", list(SMALL_VENT_TYPE, MEDIUM_VENT_TYPE, LARGE_VENT_TYPE))
- if(!choice)
- return
- vent_size_setup(random = FALSE, force_size = choice, map_loading = FALSE)
-
-/obj/effect/landmark/mining_center
- name = "Mining Epicenter"
- icon_state = "mining_epicenter"
-
-/obj/effect/landmark/mining_center/Initialize(mapload)
- ..()
-
- for(var/obj/mining_mark as anything in GLOB.mining_center)
- if(src.z == mining_mark.z)
- CRASH("\The [src] spawned on Z level [z] already exists! Maps should only have at most one mining epicenter for normal ore generation.")
-
- GLOB.mining_center += loc
- return INITIALIZE_HINT_QDEL
-
#undef ARTIFACT_ROLL_CHANCE
#undef MINERAL_TYPE_OPTIONS_RANDOM
#undef OVERLAY_OFFSET_START
diff --git a/code/game/objects/structures/lavaland/vent_mining/vent_misc.dm b/code/game/objects/structures/lavaland/vent_mining/vent_misc.dm
new file mode 100644
index 000000000000..f332d01c8008
--- /dev/null
+++ b/code/game/objects/structures/lavaland/vent_mining/vent_misc.dm
@@ -0,0 +1,26 @@
+
+/obj/effect/landmark/mining_center
+ name = "Mining Epicenter"
+ icon_state = "mining_epicenter"
+
+/obj/effect/landmark/mining_center/Initialize(mapload)
+ ..()
+
+ for(var/obj/mining_mark as anything in GLOB.mining_center)
+ if(src.z == mining_mark.z)
+ CRASH("\The [src] spawned on Z level [z] already exists! Maps should only have at most one mining epicenter for normal ore generation.")
+
+ GLOB.mining_center += loc
+ return INITIALIZE_HINT_QDEL
+
+/obj/effect/temp_visual/dust_cloud
+ name = "dust"
+ desc = "We're all like... dust... in the wind."
+ icon_state = "light_dust_cloud"
+ layer = ABOVE_MOB_LAYER
+ plane = GAME_PLANE
+ pixel_x = -4
+ pixel_z = -4
+ base_pixel_z = -4
+ base_pixel_x = -4
+ duration = 1 SECONDS
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 6d4d7d64fd64..c5318bf0dce7 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -64,10 +64,13 @@
update_signals = list(COMSIG_ATOM_BREAK), \
check_reflect_signals = list(SIGNAL_ADDTRAIT(TRAIT_NO_MIRROR_REFLECTION), SIGNAL_REMOVETRAIT(TRAIT_NO_MIRROR_REFLECTION)), \
)
+ if(cursable)
+ if(mapload && prob(ROUNDSTART_CURSED_CHANCE))
+ AddComponent(/datum/component/revenant_prison, create_on_release = TRUE)
+ else
+ ADD_TRAIT(src, TRAIT_COZY_REVENANT_HOME, INNATE_TRAIT)
if(mapload)
find_and_mount_on_atom()
- if(prob(ROUNDSTART_CURSED_CHANCE) && cursable)
- AddComponent(/datum/component/revenant_prison, create_on_release = TRUE)
update_choices()
register_context()
@@ -298,8 +301,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28)
return .
/obj/structure/mirror/attacked_by(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
+ if(broken)
+ return ..()
. = ..()
- if(broken || . <= 0) // breaking a mirror truly gets you bad luck!
+ if(!broken || . <= 0) // breaking a mirror truly gets you bad luck!
return
to_chat(user, span_warning("A chill runs down your spine as [src] shatters..."))
user.AddComponent(/datum/component/omen, incidents_left = 7)
@@ -524,15 +529,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28)
)
var/turf/user_turf = get_turf(user)
- var/list/levels = SSmapping.levels_by_trait(ZTRAIT_SPACE_RUINS)
- var/turf/dest
- if(length(levels))
- dest = locate(user_turf.x, user_turf.y, pick(levels))
-
- user_turf.ChangeTurf(/turf/open/chasm, flags = CHANGETURF_INHERIT_AIR)
- var/turf/open/chasm/new_chasm = user_turf
- new_chasm.set_target(dest)
- new_chasm.drop(user)
+ var/turf/open/chasm/pride/new_chasm = user_turf.ChangeTurf(/turf/open/chasm/pride, flags = CHANGETURF_INHERIT_AIR)
+ // `ChangeTurf()` can itself lead to `drop()` if there's lattice present, so
+ // we only force the user down if they're still on the same turf.
+ if(get_turf(user) == user_turf)
+ new_chasm.drop(user)
#undef CHANGE_HAIR
#undef CHANGE_BEARD
diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm
index dfbff670320d..5993b547a9c7 100644
--- a/code/game/objects/structures/shower.dm
+++ b/code/game/objects/structures/shower.dm
@@ -32,7 +32,7 @@ GLOBAL_LIST_INIT(shower_mode_descriptions, list(
icon = 'modular_darkpack/master_files/icons/obj/watercloset.dmi' // DARKPACK EDIT CHANGE
icon_state = "shower"
density = FALSE
- layer = ABOVE_WINDOW_LAYER
+ layer = ABOVE_MOB_LAYER
use_power = NO_POWER_USE
subsystem_type = /datum/controller/subsystem/processing/plumbing
///Does the user want the shower on or off?
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index beb2f2c9bdaa..687e7967e483 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -631,7 +631,7 @@
custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT)
/obj/structure/table/wood/after_smash(mob/living/smashed_onto)
- if(QDELETED(src) || prob(66))
+ if(QDELETED(src) || QDELETED(smashed_onto) || prob(66))
return
visible_message(
span_warning("[src] smashes into bits!"),
diff --git a/code/game/objects/structures/water_structures/sink.dm b/code/game/objects/structures/water_structures/sink.dm
index 511a898d88d6..f36414cd0040 100644
--- a/code/game/objects/structures/water_structures/sink.dm
+++ b/code/game/objects/structures/water_structures/sink.dm
@@ -64,12 +64,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14))
context[SCREENTIP_CONTEXT_LMB] = "Wash hands"
return CONTEXTUAL_SCREENTIP_SET
- if(is_reagent_container(held_item) && held_item.is_refillable() && !held_item.reagents.holder_full())
- context[SCREENTIP_CONTEXT_LMB] = "Fill container"
+ if(is_reagent_container(held_item))
+ if(held_item.is_refillable() && !held_item.reagents.holder_full())
+ context[SCREENTIP_CONTEXT_LMB] = "Fill container"
+ if(held_item.reagents.total_volume > 0)
+ context[SCREENTIP_CONTEXT_RMB] = "Drain container"
return CONTEXTUAL_SCREENTIP_SET
if(istype(held_item, /obj/item/mop) || astype(held_item, /obj/item/rag)?.blood_level == 0)
context[SCREENTIP_CONTEXT_LMB] = "Wet mop"
+ context[SCREENTIP_CONTEXT_RMB] = "Wash out mop"
return CONTEXTUAL_SCREENTIP_SET
if(istype(held_item, /obj/item/stock_parts/water_recycler) && !has_water_reclaimer)
@@ -89,6 +93,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14))
if(has_water_reclaimer)
. += span_notice("A water recycler is installed. It looks like you could pry it out.")
. += span_notice("[reagents.total_volume]/[reagents.maximum_volume] liquids remaining.")
+ . += span_notice("You could [EXAMINE_HINT("right-click")] it with a container to empty it down the drain.")
/obj/structure/sink/attack_hand(mob/living/user, list/modifiers)
. = ..()
@@ -219,6 +224,27 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14))
span_notice("You wash [tool] using [src]."))
return ITEM_INTERACT_SUCCESS
+/obj/structure/sink/item_interaction_secondary(mob/living/user, obj/item/held_item, list/modifiers)
+ if(!is_reagent_container(held_item) && !istype(held_item, /obj/item/mop))
+ return ..()
+
+ if(busy)
+ to_chat(user, span_warning("Someone's already washing here!"))
+ return ITEM_INTERACT_BLOCKING
+
+ if(held_item.reagents.total_volume <= 0)
+ balloon_alert(user, "already empty!")
+ return ITEM_INTERACT_BLOCKING
+
+ held_item.reagents.clear_reagents()
+ playsound(src, 'sound/effects/slosh.ogg', 25, TRUE)
+
+ user.visible_message(
+ span_notice("[user] empties [held_item] into [src]."),
+ span_notice("You empty [held_item] into [src], washing its contents down the drain."),
+ )
+ return ITEM_INTERACT_SUCCESS
+
/obj/structure/sink/wrench_act(mob/living/user, obj/item/tool)
tool.play_tool_sound(src)
deconstruct(TRUE)
diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm
index 7d02bf2a7797..b8320281516f 100644
--- a/code/game/turfs/closed/wall/mineral_walls.dm
+++ b/code/game/turfs/closed/wall/mineral_walls.dm
@@ -84,6 +84,28 @@
custom_materials = list(/datum/material/sandstone = SHEET_MATERIAL_AMOUNT*2)
rust_resistance = RUST_RESISTANCE_BASIC
+/turf/closed/wall/mineral/sandstone/wall_fill
+ sheet_type = /obj/item/stack/wall_filling/sandstone/basic
+ sheet_amount = 1
+
+/turf/closed/wall/mineral/sandstone/ornate
+ name = "ornate sandstone wall"
+ desc = "A wall with ornate sandstone plating. Smooth."
+ icon = 'icons/turf/walls/sandstone_ornate_wall.dmi'
+ icon_state = "sandstone_ornate_wall-0"
+ base_icon_state = "sandstone_ornate_wall"
+ sheet_type = /obj/item/stack/wall_filling/sandstone/ornate
+ sheet_amount = 1
+
+/turf/closed/wall/mineral/sandstone/basalt
+ name = "basalt wall"
+ desc = "A wall with basalt plating. The orange is from other colours of sand that make up for it."
+ icon = 'icons/turf/walls/sandbasalt_wall.dmi'
+ icon_state = "sandbasalt_wall-0"
+ base_icon_state = "sandbasalt_wall"
+ sheet_type = /obj/item/stack/wall_filling/sandstone/basalt
+ sheet_amount = 1
+
/turf/closed/wall/mineral/uranium
article = "a"
name = "uranium wall"
@@ -261,6 +283,90 @@
custom_materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT*2)
rust_resistance = RUST_RESISTANCE_ORGANIC
+/turf/closed/wall/mineral/runite
+ name = "runite wall"
+ desc = "A runite wall. How... magical."
+ icon = 'icons/turf/walls/runite_wall.dmi'
+ icon_state = "runite_wall-0"
+ base_icon_state = "runite_wall"
+ sheet_type = /obj/item/stack/sheet/mineral/runite
+ hardness = 40
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_RUNITE_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_RUNITE_WALLS
+ custom_materials = list(/datum/material/runite = SHEET_MATERIAL_AMOUNT*2)
+ rust_resistance = RUST_RESISTANCE_REINFORCED
+
+/turf/closed/wall/mineral/bone
+ name = "bone wall"
+ desc = "A bone wall. That's a lot of calcium."
+ icon = 'icons/turf/walls/bone_wall.dmi'
+ icon_state = "bone_wall-0"
+ base_icon_state = "bone_wall"
+ sheet_type = /obj/item/stack/sheet/bone
+ hardness = 30
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_BONE_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_BONE_WALLS
+ custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT*2)
+ rust_resistance = RUST_RESISTANCE_ORGANIC
+
+/turf/closed/wall/mineral/adamantine
+ name = "adamantine wall"
+ desc = "A adamantine wall. Quite industrial."
+ icon = 'icons/turf/walls/adamantine_wall.dmi'
+ icon_state = "adamantine_wall-0"
+ base_icon_state = "adamantine_wall"
+ sheet_type = /obj/item/stack/sheet/mineral/adamantine
+ hardness = 30
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_ADAMANTINE_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_ADAMANTINE_WALLS
+ custom_materials = list(/datum/material/adamantine = SHEET_MATERIAL_AMOUNT*2)
+ rust_resistance = RUST_RESISTANCE_REINFORCED
+
+/turf/closed/wall/mineral/metalhydrogen
+ name = "metal hydrogen wall"
+ desc = "A metal hydrogen wall. Long live atmosia!"
+ icon = 'icons/turf/walls/metal_hydrogen_wall.dmi'
+ icon_state = "metal_hydrogen_wall-0"
+ base_icon_state = "metal_hydrogen_wall"
+ sheet_type = /obj/item/stack/sheet/mineral/metal_hydrogen
+ hardness = 30
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_METALHYDROGEN_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_METALHYDROGEN_WALLS
+ custom_materials = list(/datum/material/metalhydrogen = SHEET_MATERIAL_AMOUNT*2)
+ rust_resistance = RUST_RESISTANCE_REINFORCED
+
+/turf/closed/wall/mineral/hauntium
+ name = "hauntium wall"
+ desc = "A hauntium wall. Are you spooked yet?"
+ icon = 'icons/turf/walls/hauntium_wall.dmi'
+ icon_state = "hauntium_wall-0"
+ base_icon_state = "hauntium_wall"
+ sheet_type = /obj/item/stack/sheet/hauntium
+ hardness = 20
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_HAUNTIUM_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_HAUNTIUM_WALLS
+ custom_materials = list(/datum/material/hauntium = SHEET_MATERIAL_AMOUNT*2)
+ rust_resistance = RUST_RESISTANCE_ORGANIC
+
+/turf/closed/wall/mineral/mythril
+ name = "mythril wall"
+ desc = "A mythril wall. You are in the deep end, huh?"
+ icon = 'icons/turf/walls/mythril_wall.dmi'
+ icon_state = "mythril_wall-0"
+ base_icon_state = "mythril_wall"
+ sheet_type = /obj/item/stack/sheet/mineral/mythril
+ hardness = 1
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_MYTHRIL_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_MYTHRIL_WALLS
+ custom_materials = list(/datum/material/mythril = SHEET_MATERIAL_AMOUNT*2)
+ rust_resistance = RUST_RESISTANCE_REINFORCED
+
/////////////////////Titanium walls/////////////////////
/turf/closed/wall/mineral/titanium //has to use this path due to how building walls works
diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm
index dd7e01ed2243..d297ee119a14 100644
--- a/code/game/turfs/open/chasm.dm
+++ b/code/game/turfs/open/chasm.dm
@@ -140,3 +140,20 @@
return ITEM_INTERACT_BLOCKING
return ..()
+
+// Chasm produced by the Pride ruin. Leads to a random space Z-level at the same x/y coordinate.
+/turf/open/chasm/pride
+ desc = "It's beautiful down there, dotted with pinpricks of light."
+ baseturfs = /turf/open/chasm/pride
+ light_color = COLOR_STARLIGHT
+ light_range = 1.9
+ light_power = 0.65
+
+/turf/open/chasm/pride/apply_components(mapload)
+ var/list/levels = SSmapping.levels_by_trait(ZTRAIT_SPACE_RUINS)
+ var/turf/space_turf
+ if(length(levels))
+ space_turf = locate(src.x, src.y, pick(levels))
+
+ AddComponent(/datum/component/chasm, space_turf, mapload)
+
diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm
index 270cfef5db95..05d2fb99abc0 100644
--- a/code/game/turfs/open/floor/fancy_floor.dm
+++ b/code/game/turfs/open/floor/fancy_floor.dm
@@ -9,7 +9,7 @@
*/
/turf/open/floor/wood
- desc = "Stylish dark wood."
+ desc = "Stylish wood."
icon_state = "wood"
floor_tile = /obj/item/stack/tile/wood
footstep = FOOTSTEP_WOOD
@@ -71,6 +71,16 @@
/turf/open/floor/wood/freezing
temperature = ICEBOX_MIN_TEMPERATURE
+/turf/open/floor/wood/dark
+ desc = "Stylish dark wood."
+ icon_state = "darkwood"
+ floor_tile = /obj/item/stack/tile/wood/dark
+
+/turf/open/floor/wood/light
+ desc = "Stylish light wood."
+ icon_state = "lightwood"
+ floor_tile = /obj/item/stack/tile/wood/light
+
/turf/open/floor/wood/airless
initial_gas_mix = AIRLESS_ATMOS
@@ -81,6 +91,15 @@
icon_state = "wood_tile"
floor_tile = /obj/item/stack/tile/wood/tile
+/turf/open/floor/wood/dark/tile
+ icon_state = "darkwood_tile"
+ floor_tile = /obj/item/stack/tile/wood/dark/tile
+
+/turf/open/floor/wood/light/tile
+ icon_state = "lightwood_tile"
+ floor_tile = /obj/item/stack/tile/wood/light/tile
+
+
/turf/open/floor/wood/tile/broken_states()
return list("wood_tile-broken", "wood_tile-broken2", "wood_tile-broken3")
@@ -88,6 +107,14 @@
icon_state = "wood_parquet"
floor_tile = /obj/item/stack/tile/wood/parquet
+/turf/open/floor/wood/light/parquet
+ icon_state = "lightwood_parquet"
+ floor_tile = /obj/item/stack/tile/wood/light/parquet
+
+/turf/open/floor/wood/dark/parquet
+ icon_state = "darkwood_parquet"
+ floor_tile = /obj/item/stack/tile/wood/dark/parquet
+
/turf/open/floor/wood/parquet/broken_states()
return list("wood_parquet-broken", "wood_parquet-broken2", "wood_parquet-broken3", "wood_parquet-broken4", "wood_parquet-broken5", "wood_parquet-broken6", "wood_parquet-broken7")
@@ -95,6 +122,14 @@
icon_state = "wood_large"
floor_tile = /obj/item/stack/tile/wood/large
+/turf/open/floor/wood/light/large
+ icon_state = "lightwood_large"
+ floor_tile = /obj/item/stack/tile/wood/light/large
+
+/turf/open/floor/wood/dark/large
+ icon_state = "darkwood_large"
+ floor_tile = /obj/item/stack/tile/wood/dark/large
+
/turf/open/floor/wood/large/broken_states()
return list("wood_large-broken", "wood_large-broken2", "wood_large-broken3")
@@ -116,6 +151,13 @@
/turf/open/floor/bamboo/broken_states()
return list("bamboodamaged")
+/turf/open/floor/bamboo/planks
+ desc = "A floor tile made from cut bamboo pieces."
+ icon = 'icons/turf/floors.dmi'
+ icon_state = "bamboo"
+ floor_tile = /obj/item/stack/tile/bamboo/planks
+ smoothing_flags = NONE
+
/turf/open/floor/bamboo/tatami
desc = "A traditional Japanese floor mat."
icon = 'icons/turf/floors/floor_variations.dmi'
@@ -269,6 +311,58 @@
if("basalt5", "basalt9")
set_light(BASALT_LIGHT_RANGE_DIM, BASALT_LIGHT_POWER, LIGHT_COLOR_LAVA)
+/turf/open/floor/fakesand
+ name = "aesthetic sand flooring"
+ desc = "Safely recreated turf for your desertplanet-scaping."
+ icon = 'icons/turf/floors.dmi'
+ icon_state = "asteroid"
+ var/base_icon = "asteroid"
+ floor_tile = /obj/item/stack/tile/basalt/sand
+ flags_1 = NONE
+ bullet_bounce_sound = null
+ footstep = FOOTSTEP_SAND
+ barefootstep = FOOTSTEP_SAND
+ clawfootstep = FOOTSTEP_SAND
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
+ tiled_turf = FALSE
+
+/turf/open/floor/fakesand/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/diggable, /obj/item/stack/ore/glass, 2, worm_chance = 0)
+ if(prob(15))
+ icon_state = "[base_icon][rand(0, 12)]"
+
+/turf/open/floor/fakesand/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(!istype(tool, /obj/item/cultivator/rake))
+ return NONE
+ icon_state = "[base_icon]_raked"
+ dir = turn(dir, 45)
+
+ user.visible_message(
+ span_notice("[user] rakes the [name]."),
+ span_notice("You rake the [name]."),
+ )
+
+ playsound(src, 'sound/effects/shovel_dig.ogg', 50, TRUE)
+
+ return ITEM_INTERACT_SUCCESS
+
+/turf/open/floor/fakesand/red
+ name = "aesthetic red sand flooring"
+ desc = "Safely recreated turf for your mars-scaping."
+ icon = 'icons/turf/floors.dmi'
+ icon_state = "ironsand"
+ base_icon = "ironsand"
+ floor_tile = /obj/item/stack/tile/basalt/redsand
+
+/turf/open/floor/fakesand/moon
+ name = "aesthetic moon sand flooring"
+ desc = "Safely recreated turf for your moon-scaping."
+ icon = 'icons/turf/floors.dmi'
+ icon_state = "moon"
+ base_icon = "moon"
+ floor_tile = /obj/item/stack/tile/basalt/moonsand
+
/turf/open/floor/carpet
name = "carpet"
desc = "Soft velvet carpeting. Feels good between your toes."
@@ -421,6 +515,62 @@
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_DONK
canSmoothWith = SMOOTH_GROUP_CARPET_DONK
+/turf/open/floor/carpet/bear
+ name = "bear fur carpet"
+ desc = "Bear fur stretched out into a carpet for you to walk on."
+ icon = 'icons/turf/floors/carpet_bear.dmi'
+ icon_state = "carpet_bear-255"
+ base_icon_state = "carpet_bear"
+ floor_tile = /obj/item/stack/tile/carpet/bear
+
+/turf/open/floor/carpet/polar_bear
+ name = "polar bear fur carpet"
+ desc = "Polar bear fur stretched out into a carpet for you to walk on."
+ icon = 'icons/turf/floors/carpet_bearpolar.dmi'
+ icon_state = "carpet_bearpolar-255"
+ base_icon_state = "carpet_bearpolar"
+ floor_tile = /obj/item/stack/tile/carpet/polar_bear
+
+/turf/open/floor/carpet/moth
+ name = "moth carpet"
+ desc = "Moth fur stretched out into a carpet for you to walk on."
+ icon = 'icons/turf/floors/carpet_moth.dmi'
+ icon_state = "carpet_moth-255"
+ base_icon_state = "carpet_moth"
+ floor_tile = /obj/item/stack/tile/carpet/moth
+
+/turf/open/floor/carpet/goliath
+ name = "goliath hide carpet"
+ desc = "Goliath hide plates woven together with watcher sinew to make something aproximating a carpet."
+ icon = 'icons/turf/floors/carpet_goliath.dmi'
+ icon_state = "carpet_goliath-255"
+ base_icon_state = "carpet_goliath"
+ floor_tile = /obj/item/stack/tile/carpet/goliath
+
+/turf/open/floor/carpet/carp
+ name = "carp scales carpet"
+ desc = "Carpet made with carp scales. A carp carpet. Carp carp carp."
+ icon = 'icons/turf/floors/carpet_carp.dmi'
+ icon_state = "carpet_carp-255"
+ base_icon_state = "carpet_carp"
+ floor_tile = /obj/item/stack/tile/carpet/carp
+
+/turf/open/floor/carpet/lizard
+ name = "lizard scales"
+ desc = "Carpet made with lizard scales. Lizards were most likely harmed making this."
+ icon = 'icons/turf/floors/carpet_lizard.dmi'
+ icon_state = "carpet_lizard-255"
+ base_icon_state = "carpet_lizard"
+ floor_tile = /obj/item/stack/tile/carpet/lizard
+
+/turf/open/floor/carpet/human
+ name = "human flesh carpet"
+ desc = "Carpet made from flayed human skin. Fresh and moist."
+ icon = 'icons/turf/floors/carpet_skin.dmi'
+ icon_state = "carpet_skin-255"
+ base_icon_state = "carpet_skin"
+ floor_tile = /obj/item/stack/tile/carpet/human
+
//*****Airless versions of all of the above.*****
/turf/open/floor/carpet/airless
initial_gas_mix = AIRLESS_ATMOS
diff --git a/code/game/turfs/open/floor/glass.dm b/code/game/turfs/open/floor/glass.dm
index eefb1f04e6c7..a954cf0e3587 100644
--- a/code/game/turfs/open/floor/glass.dm
+++ b/code/game/turfs/open/floor/glass.dm
@@ -154,3 +154,76 @@
floor_tile = /obj/item/stack/tile/glass/plastitanium
starlight_color = COLOR_ASSISTANT_GRAY
alpha_to_leave = 206
+
+/turf/open/floor/glass/stained_red
+ name = "red stained glass floor"
+ desc = "Glass floor, stained red. Not with blood, hopefuly."
+ icon = 'icons/turf/floors/glass_stained_red.dmi'
+ icon_state = "glass_stained_red-0"
+ base_icon_state = "glass_stained_red"
+ floor_tile = /obj/item/stack/tile/stained_glass/red
+ starlight_color = COLOR_CRAYON_RED
+
+/turf/open/floor/glass/stained_orange
+ name = "orange stained glass floor"
+ desc = "Glass floor, stained orange. Somebody spilled their orange juice?"
+ icon = 'icons/turf/floors/glass_stained_orange.dmi'
+ icon_state = "glass_stained_orange-0"
+ base_icon_state = "glass_stained_orange"
+ floor_tile = /obj/item/stack/tile/stained_glass/orange
+ starlight_color = COLOR_CRAYON_ORANGE
+
+/turf/open/floor/glass/stained_yellow
+ name = "yellow stained glass floor"
+ desc = "Glass floor, stained yellow. Probably by some mellow fellow."
+ icon = 'icons/turf/floors/glass_stained_yellow.dmi'
+ icon_state = "glass_stained_yellow-0"
+ base_icon_state = "glass_stained_yellow"
+ floor_tile = /obj/item/stack/tile/stained_glass/yellow
+ starlight_color = COLOR_CRAYON_YELLOW
+
+/turf/open/floor/glass/stained_green
+ name = "green stained glass floor"
+ desc = "Glass floor, stained green. That's what you get when putting liquid uranium at the edge of your table."
+ icon = 'icons/turf/floors/glass_stained_green.dmi'
+ icon_state = "glass_stained_green-0"
+ base_icon_state = "glass_stained_green"
+ floor_tile = /obj/item/stack/tile/stained_glass/green
+ starlight_color = COLOR_CRAYON_GREEN
+
+/turf/open/floor/glass/stained_blue
+ name = "blue stained glass floor"
+ desc = "Glass floor, stained blue. With tears of someone feeling blue, obviously."
+ icon = 'icons/turf/floors/glass_stained_blue.dmi'
+ icon_state = "glass_stained_blue-0"
+ base_icon_state = "glass_stained_blue"
+ floor_tile = /obj/item/stack/tile/stained_glass/blue
+ starlight_color = COLOR_CRAYON_BLUE
+
+/turf/open/floor/glass/stained_purple
+ name = "purple stained glass floor"
+ desc = "Glass floor, stained purple. It tastes purple, too."
+ icon = 'icons/turf/floors/glass_stained_purple.dmi'
+ icon_state = "glass_stained_purple-0"
+ base_icon_state = "glass_stained_purple"
+ floor_tile = /obj/item/stack/tile/stained_glass/purple
+ starlight_color = COLOR_CRAYON_PURPLE
+
+/turf/open/floor/glass/stained_white
+ name = "white stained glass floor"
+ desc = "Glass floor, stained white. Or perhaps it was bleached?"
+ icon = 'icons/turf/floors/glass_stained_white.dmi'
+ icon_state = "glass_stained_white-0"
+ base_icon_state = "glass_stained_white"
+ floor_tile = /obj/item/stack/tile/stained_glass/white
+ starlight_color = COLOR_VERY_LIGHT_GRAY /// White crayon doesn't have a colour.
+
+/turf/open/floor/glass/stained_black
+ name = "black stained glass floor"
+ desc = "Glass floor, stained black. A space squid inked it."
+ icon = 'icons/turf/floors/glass_stained_black.dmi'
+ icon_state = "glass_stained_black-0"
+ base_icon_state = "glass_stained_black"
+ floor_tile = /obj/item/stack/tile/stained_glass/black
+ starlight_color = COLOR_CRAYON_BLACK
+
diff --git a/code/game/turfs/open/floor/iron_floor.dm b/code/game/turfs/open/floor/iron_floor.dm
index 7b0df2455555..4696d377ffeb 100644
--- a/code/game/turfs/open/floor/iron_floor.dm
+++ b/code/game/turfs/open/floor/iron_floor.dm
@@ -306,6 +306,7 @@
initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/iron/recharge_floor
+ desc = "This tile possesses a purely aesthetic indent and cable port. Often used to denote where a piece of machinery is supposed to stand or be parked."
icon_state = "recharge_floor"
base_icon_state = "recharge_floor"
floor_tile = /obj/item/stack/tile/iron/recharge_floor
@@ -313,6 +314,21 @@
/turf/open/floor/iron/recharge_floor/airless
initial_gas_mix = AIRLESS_ATMOS
+/turf/open/floor/iron/recharge_floor/dark
+ icon_state = "recharge_dark"
+ base_icon_state = "recharge_dark"
+ floor_tile = /obj/item/stack/tile/iron/recharge_floor/dark
+
+/turf/open/floor/iron/recharge_floor/white
+ icon_state = "recharge_white"
+ base_icon_state = "recharge_white"
+ floor_tile = /obj/item/stack/tile/iron/recharge_floor/white
+
+/turf/open/floor/iron/recharge_floor/smooth
+ icon_state = "recharge_smooth"
+ base_icon_state = "recharge_smooth"
+ floor_tile = /obj/item/stack/tile/iron/recharge_floor/smooth
+
/turf/open/floor/iron/recharge_floor/asteroid
icon_state = "recharge_floor_asteroid"
base_icon_state = "recharge_floor_asteroid"
diff --git a/code/game/turfs/open/floor/mineral_floor.dm b/code/game/turfs/open/floor/mineral_floor.dm
index e6a6e91b529b..869947085e16 100644
--- a/code/game/turfs/open/floor/mineral_floor.dm
+++ b/code/game/turfs/open/floor/mineral_floor.dm
@@ -46,6 +46,13 @@
/turf/open/floor/mineral/plasma/disco/crowbar_act(mob/living/user, obj/item/I)
return
+/turf/open/floor/mineral/plasma/tiled
+ name = "tiled plasma floor"
+ icon_state = "plasma_tiled"
+ floor_tile = /obj/item/stack/tile/mineral/plasma/tiled
+
+/turf/open/floor/mineral/plasma/tiled/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
//GOLD
@@ -57,6 +64,22 @@
custom_materials = list(/datum/material/gold = SMALL_MATERIAL_AMOUNT*5)
rust_resistance = RUST_RESISTANCE_BASIC
+/turf/open/floor/mineral/gold/tiled
+ name = "tiled gold floor"
+ icon_state = "gold_tiled"
+ floor_tile = /obj/item/stack/tile/mineral/gold/tiled
+
+/turf/open/floor/mineral/gold/tiled/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+/turf/open/floor/mineral/gold/sun
+ name = "gold sun floor"
+ icon_state = "gold_sun"
+ floor_tile = /obj/item/stack/tile/mineral/gold/sun
+
+/turf/open/floor/mineral/gold/sun/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
//SILVER
/turf/open/floor/mineral/silver
@@ -66,6 +89,59 @@
icons = list("silver","silver_dam")
custom_materials = list(/datum/material/silver = SMALL_MATERIAL_AMOUNT*5)
+/turf/open/floor/mineral/silver/tiled
+ name = "tiled silver floor"
+ icon_state = "silver_tiled"
+ floor_tile = /obj/item/stack/tile/mineral/silver/tiled
+
+/turf/open/floor/mineral/silver/tiled/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+/turf/open/floor/mineral/silver/moon
+ name = "silver moon floor"
+ icon_state = "silver_moon"
+ floor_tile = /obj/item/stack/tile/mineral/silver/moon
+
+/turf/open/floor/mineral/silver/moon/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+//PLASTEEL
+
+/turf/open/floor/mineral/plasteel
+ name = "plasteel floor"
+ icon_state = "plasteel"
+ floor_tile = /obj/item/stack/tile/plasteel
+ custom_materials = list(/datum/material/alloy/plasteel = SMALL_MATERIAL_AMOUNT*5)
+ rust_resistance = RUST_RESISTANCE_TITANIUM
+
+/turf/open/floor/mineral/plasteel/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+/turf/open/floor/mineral/plasteel/straight
+ name = "straight plasteel floor"
+ icon_state = "plasteel_straight"
+ floor_tile = /obj/item/stack/tile/plasteel/straight
+
+/turf/open/floor/mineral/plasteel/corner
+ name = "corner plasteel floor"
+ icon_state = "plasteel_corner"
+ floor_tile = /obj/item/stack/tile/plasteel/corner
+
+/turf/open/floor/mineral/plasteel/block
+ name = "blocky plasteel floor"
+ icon_state = "block"
+ floor_tile = /obj/item/stack/tile/plasteel/block
+
+/turf/open/floor/mineral/plasteel/lock
+ name = "locked plasteel floor"
+ icon_state = "lock"
+ floor_tile = /obj/item/stack/tile/plasteel/lock
+
+/turf/open/floor/mineral/plasteel/tiled
+ name = "tiled plasteel floor"
+ icon_state = "alienvault"
+ floor_tile = /obj/item/stack/tile/plasteel/tiled
+
//TITANIUM (shuttle)
/turf/open/floor/mineral/titanium
@@ -78,8 +154,6 @@
/turf/open/floor/mineral/titanium/broken_states()
return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
-
-
/turf/open/floor/mineral/titanium/airless
initial_gas_mix = AIRLESS_ATMOS
@@ -212,9 +286,16 @@
icons = list("bananium","bananium_dam")
custom_materials = list(/datum/material/bananium = SMALL_MATERIAL_AMOUNT*5)
rust_resistance = RUST_RESISTANCE_BASIC
- material_flags = NONE //The slippery comp makes it unpractical for good clown decor. The custom mat one should still slip.
var/sound_cooldown = 0
+/turf/open/floor/mineral/bananium/tiled
+ name = "tiled bananium floor"
+ icon_state = "bananium_tiled"
+ floor_tile = /obj/item/stack/tile/mineral/bananium/tiled
+
+/turf/open/floor/mineral/bananium/tiled/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
/turf/open/floor/mineral/bananium/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
. = ..()
if(.)
@@ -260,6 +341,14 @@
custom_materials = list(/datum/material/diamond = SMALL_MATERIAL_AMOUNT*5)
rust_resistance = RUST_RESISTANCE_REINFORCED
+/turf/open/floor/mineral/diamond/tiled
+ name = "tiled diamond floor"
+ icon_state = "diamond_tiled"
+ floor_tile = /obj/item/stack/tile/mineral/diamond/tiled
+
+/turf/open/floor/mineral/diamond/tiled/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
//URANIUM
/turf/open/floor/mineral/uranium
@@ -273,6 +362,14 @@
var/last_event = 0
var/active = null
+/turf/open/floor/mineral/uranium/tiled
+ name = "tiled uranium floor"
+ icon_state = "uranium_tiled"
+ floor_tile = /obj/item/stack/tile/mineral/uranium/tiled
+
+/turf/open/floor/mineral/uranium/tiled/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
/turf/open/floor/mineral/uranium/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
. = ..()
if(.)
@@ -312,6 +409,105 @@
active = FALSE
return
+//BLUESPACE
+
+/turf/open/floor/mineral/bluespace
+ name = "bluespace floor"
+ icon_state = "bluespacecrystal"
+ floor_tile = /obj/item/stack/tile/mineral/bluespace
+ custom_materials = list(/datum/material/bluespace = SMALL_MATERIAL_AMOUNT*5)
+ rust_resistance = RUST_RESISTANCE_REINFORCED
+
+/turf/open/floor/mineral/bluespace/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+/turf/open/floor/mineral/bluespace/tiled
+ name = "tiled bluespace floor"
+ icon_state = "bluespacecrystal_tiled"
+ floor_tile = /obj/item/stack/tile/mineral/bluespace/tiled
+
+/turf/open/floor/mineral/bluespace/n
+ name = "N-marked bluespace floor"
+ icon_state = "bluespacecrystal_n"
+ floor_tile = /obj/item/stack/tile/mineral/bluespace/n
+
+//TELECRYSTAL
+
+/turf/open/floor/mineral/telecrystal
+ name = "telecrystal floor"
+ icon_state = "telecrystal"
+ floor_tile = /obj/item/stack/tile/mineral/telecrystal
+ custom_materials = list(/datum/material/telecrystal = SMALL_MATERIAL_AMOUNT*5)
+ rust_resistance = RUST_RESISTANCE_REINFORCED
+
+/turf/open/floor/mineral/telecrystal/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+/turf/open/floor/mineral/telecrystal/tiled
+ name = "tiled telecrystal floor"
+ icon_state = "telecrystal_tiled"
+ floor_tile = /obj/item/stack/tile/mineral/telecrystal/tiled
+
+/turf/open/floor/mineral/telecrystal/s
+ name = "S-marked telecrystal floor"
+ icon_state = "telecrystal_s"
+ floor_tile = /obj/item/stack/tile/mineral/telecrystal/s
+
+//ADAMANTINE
+/turf/open/floor/mineral/adamantine
+ name = "adamantine floor"
+ icon_state = "adamantium"
+ floor_tile = /obj/item/stack/tile/mineral/adamantine
+ custom_materials = list(/datum/material/adamantine = SMALL_MATERIAL_AMOUNT*5)
+ rust_resistance = RUST_RESISTANCE_TITANIUM
+
+/turf/open/floor/mineral/adamantine/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+/turf/open/floor/mineral/adamantine/alt
+ name = "adamantine plating"
+ icon_state = "adamantium_alt"
+ floor_tile = /obj/item/stack/tile/mineral/adamantine/alt
+
+//METAL HYDROGEN
+/turf/open/floor/mineral/metal_hydrogen
+ name = "metal hydrogen floor"
+ icon_state = "metalhydrogen"
+ floor_tile = /obj/item/stack/tile/mineral/metal_hydrogen
+ custom_materials = list(/datum/material/metalhydrogen = SMALL_MATERIAL_AMOUNT*5)
+ rust_resistance = RUST_RESISTANCE_TITANIUM
+
+/turf/open/floor/mineral/metal_hydrogen/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+/turf/open/floor/mineral/metal_hydrogen/tiled
+ name = "tiled metalhydrogen floor"
+ icon_state = "metalhydrogen_tiled"
+ floor_tile = /obj/item/stack/tile/mineral/metal_hydrogen/tiled
+
+//RUNITE
+/turf/open/floor/mineral/runite
+ name = "runite floor"
+ icon_state = "runite"
+ floor_tile = /obj/item/stack/tile/mineral/runite
+ custom_materials = list(/datum/material/runite = SMALL_MATERIAL_AMOUNT*5)
+ rust_resistance = RUST_RESISTANCE_REINFORCED
+
+/turf/open/floor/mineral/runite/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+//MYTHRIL
+/turf/open/floor/mineral/mythril
+ name = "mythril floor"
+ icon_state = "mythril"
+ floor_tile = /obj/item/stack/tile/mineral/mythril
+ custom_materials = list(/datum/material/mythril = SMALL_MATERIAL_AMOUNT*5)
+ rust_resistance = RUST_RESISTANCE_REINFORCED
+
+/turf/open/floor/mineral/mythril/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+
// ALIEN ALLOY
/turf/open/floor/mineral/abductor
name = "alien floor"
diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm
index ba1c0a6e0344..025437a14c1f 100644
--- a/code/game/turfs/open/floor/misc_floor.dm
+++ b/code/game/turfs/open/floor/misc_floor.dm
@@ -136,6 +136,37 @@
/turf/open/floor/circuit/red/telecomms
initial_gas_mix = TCOMMS_ATMOS
+/turf/open/floor/circuit/ash
+ icon_state = "ash"
+ base_icon_state = "ash"
+ light_color = LIGHT_COLOR_INTENSE_RED
+ floor_tile = /obj/item/stack/tile/circuit/ash
+
+/turf/open/floor/circuit/ash/off
+ icon_state = "ash_off"
+ always_off = TRUE
+
+/turf/open/floor/circuit/red/no_power
+ always_off = TRUE
+
+/turf/open/floor/circuit/red/anim
+ icon_state = "ash"
+
+/turf/open/floor/circuit/ash/alt
+ icon_state = "ash_alt"
+ base_icon_state = "ash_alt"
+ floor_tile = /obj/item/stack/tile/circuit/ash/alt
+
+/turf/open/floor/circuit/ash/alt/off
+ icon_state = "ash_alt_off"
+ always_off = TRUE
+
+/turf/open/floor/circuit/red/alt/no_power
+ always_off = TRUE
+
+/turf/open/floor/circuit/red/alt/anim
+ icon_state = "ash_alt"
+
/turf/open/floor/noslip
name = "high-traction floor"
icon_state = "noslip"
@@ -225,6 +256,184 @@
/turf/open/floor/plastic/broken_states()
return list("plastic-damaged1","plastic-damaged2")
+/turf/open/floor/plastic/puzzle
+ name = "plastic puzzle floor"
+ icon_state = "plastic_puzzle"
+ floor_tile = /obj/item/stack/tile/plastic/puzzle
+
+/turf/open/floor/plastic/puzzle/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+/turf/open/floor/meat
+ name = "meat floor"
+ icon_state = "meat"
+ desc = "Floor is meat!"
+ custom_materials = list(/datum/material/meat=SMALL_MATERIAL_AMOUNT*5)
+ floor_tile = /obj/item/stack/tile/meat
+
+/turf/open/floor/meat/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+/turf/open/floor/meat/fresh
+ name = "fresh meat floor"
+ icon_state = "meat_fresh"
+ floor_tile = /obj/item/stack/tile/meat/fresh
+
+/turf/open/floor/bone
+ name = "bone floor"
+ icon_state = "bone_tile"
+ desc = "Those bones were once creatures with individidual hopes and dreams. Just a thing to think about as you walk on them."
+ custom_materials = list(/datum/material/bone=SMALL_MATERIAL_AMOUNT*5)
+ floor_tile = /obj/item/stack/tile/bone
+
+/turf/open/floor/bone/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+/turf/open/floor/bone/corner
+ name = "bone corner floor"
+ icon_state = "bone_corner"
+ floor_tile = /obj/item/stack/tile/bone/corner
+
+/turf/open/floor/bone/straight
+ name = "bone straight floor"
+ icon_state = "bone_straight"
+ floor_tile = /obj/item/stack/tile/bone/straight
+
+/turf/open/floor/bone/spine
+ name = "spine floor"
+ icon_state = "bone_spine"
+ floor_tile = /obj/item/stack/tile/bone/spine
+
+/turf/open/floor/bone/meaty
+ name = "meaty bone floor"
+ icon_state = "meatbone_tile"
+ desc = "Spine-crawling, made literal."
+ floor_tile = /obj/item/stack/tile/bone/meaty
+
+/turf/open/floor/bone/meaty/corner
+ name = "meaty bone corner floor"
+ icon_state = "meatbone_corner"
+ floor_tile = /obj/item/stack/tile/bone/meaty/corner
+
+/turf/open/floor/bone/meaty/straight
+ name = "meaty bone straight floor"
+ icon_state = "meatbone_straight"
+ floor_tile = /obj/item/stack/tile/bone/meaty/straight
+
+/turf/open/floor/bone/meaty/spine
+ name = "meaty spine floor"
+ icon_state = "meatbone_spine"
+ floor_tile = /obj/item/stack/tile/bone/meaty/spine
+
+/turf/open/floor/hauntium
+ name = "hauntium floor"
+ icon_state = "hauntium"
+ desc = "Now this is one spooky tile."
+ custom_materials = list(/datum/material/hauntium=SMALL_MATERIAL_AMOUNT*5)
+ floor_tile = /obj/item/stack/tile/hauntium
+
+/turf/open/floor/hauntium/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+/turf/open/floor/hauntium/ghostbricked
+ name = "ghostbricked hauntium floor"
+ icon_state = "hauntium_ghostbricked"
+ floor_tile = /obj/item/stack/tile/hauntium/ghostbricked
+
+/turf/open/floor/neo
+ name = "neo tile"
+ desc = "It's pink and black because it shouldn't exist!"
+ custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*5)
+ floor_tile = /obj/item/stack/tile/neo
+
+/turf/open/floor/neo/broken_states()
+ return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+
+/turf/open/floor/neo/red
+ name = "red neo tile"
+ icon_state = "neo_red"
+ desc = "A neo tile. Radiates with the power of ketchup."
+ floor_tile = /obj/item/stack/tile/neo/red
+
+/turf/open/floor/neo/purple
+ name = "purple neo tile"
+ icon_state = "neo_purple"
+ desc = "A neo tile. Radiates with the power of neo. Duh."
+ floor_tile = /obj/item/stack/tile/neo/purple
+
+/turf/open/floor/neo/orange
+ name = "orange neo tile"
+ icon_state = "neo_orange"
+ desc = "A neo tile. Radiates with the power of 80s stylized sunset and tequilla."
+ floor_tile = /obj/item/stack/tile/neo/orange
+
+/turf/open/floor/neo/cyan
+ name = "cyan neo tile"
+ icon_state = "neo_cyan"
+ desc = "A neo tile. Radiates with the power of being pedantic about colour names."
+ floor_tile = /obj/item/stack/tile/neo/cyan
+
+/turf/open/floor/stone
+ name = "stone brick floor"
+ desc = "Odd, really, how it looks exactly like the iron walls yet is stone instead of iron. Now, if that's really more of a complaint about\
+ the ironness of walls or the stoneness of the floors, that's really up to you. But have you really ever seen iron that dull? I mean, it\
+ makes sense for the station to have dull metal walls but we're talking how a rudimentary iron wall would be. Medieval ages didn't even\
+ use iron walls, iron walls are actually not even something that exists because iron is an expensive and not-so-great thing to build walls\
+ out of. It only makes sense in the context of space because you're trying to keep a freezing vacuum out. Is anyone following me on this? \
+ The idea of a \"rudimentary\" iron wall makes no sense at all! Is anything i'm even saying here true? Someone's gotta fact check this!"
+ icon_state = "stone_floor"
+ custom_materials = list(/datum/material/rock=SMALL_MATERIAL_AMOUNT*5)
+
+/turf/open/floor/stone/icemoon
+ initial_gas_mix = ICEMOON_DEFAULT_ATMOS
+
+/turf/open/floor/sandstone
+ name = "sandstone brick floor"
+ desc = "Sandstone tile. Makes you feel quite like a pharoah."
+ icon_state = "sandstone_floor"
+ custom_materials = list(/datum/material/sandstone=SMALL_MATERIAL_AMOUNT*5)
+ floor_tile = /obj/item/stack/tile/mineral/sandstone
+
+/turf/open/floor/sandstone/cobbled
+ name = "cobbled sandstone floor"
+ icon_state = "sandstone_cobbled"
+ floor_tile = /obj/item/stack/tile/mineral/sandstone/cobbled
+
+/turf/open/floor/sandstone/tiled
+ name = "sandstone tile"
+ icon_state = "sandstonevault"
+ floor_tile = /obj/item/stack/tile/mineral/sandstone/tiled
+
+/turf/open/floor/sandstone/basalt
+ name = "basalt brick tile"
+ icon_state = "basaltbrick_floor"
+ floor_tile = /obj/item/stack/tile/mineral/sandstone/basalt
+
+/turf/open/floor/silvergold
+ name = "silver and gold floor"
+ desc = "Floor made from silver and gold, in scaly pattern. As if just one or the other wasn't lavish enough."
+ icon_state = "blade"
+ custom_materials = list(/datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT / 4, /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT / 4)
+ floor_tile = /obj/item/stack/tile/silvergold
+
+/turf/open/floor/silvergold/sword
+ name = "sword floor"
+ desc = "Floor made from silver and gold, in scaly pattern, with a sword in the middle."
+ icon_state = "blade_sword"
+ floor_tile = /obj/item/stack/tile/silvergold/sword
+
+/turf/open/floor/silvergold/void
+ name = "stars tile"
+ desc = "Floor made from silver and gold, picturing stars. As opposed to the actual stars you are surrounded by."
+ icon_state = "void"
+ floor_tile = /obj/item/stack/tile/silvergold/void
+
+/turf/open/floor/silvergold/flow
+ name = "flowing tile"
+ desc = "Floor made from silver and gold, with a flowing pattern. Silver and gold in balance."
+ icon_state = "flow"
+ floor_tile = /obj/item/stack/tile/silvergold/flow
+
/turf/open/floor/eighties
name = "retro floor"
desc = "This one takes you back."
@@ -274,27 +483,6 @@
// Especially since it looks like we don't even change the default icon/iconstate???
AddElement(/datum/element/rust)
-/turf/open/floor/stone
- name = "stone brick floor"
- desc = "Odd, really, how it looks exactly like the iron walls yet is stone instead of iron. Now, if that's really more of a complaint about\
- the ironness of walls or the stoneness of the floors, that's really up to you. But have you really ever seen iron that dull? I mean, it\
- makes sense for the station to have dull metal walls but we're talking how a rudimentary iron wall would be. Medieval ages didn't even\
- use iron walls, iron walls are actually not even something that exists because iron is an expensive and not-so-great thing to build walls\
- out of. It only makes sense in the context of space because you're trying to keep a freezing vacuum out. Is anyone following me on this? \
- The idea of a \"rudimentary\" iron wall makes no sense at all! Is anything i'm even saying here true? Someone's gotta fact check this!"
- icon_state = "stone_floor"
-
-/turf/open/floor/stone/icemoon
- initial_gas_mix = ICEMOON_DEFAULT_ATMOS
- name = "stone brick floor"
- desc = "Odd, really, how it looks exactly like the iron walls yet is stone instead of iron. Now, if that's really more of a complaint about\
- the ironness of walls or the stoneness of the floors, that's really up to you. But have you really ever seen iron that dull? I mean, it\
- makes sense for the station to have dull metal walls but we're talking how a rudimentary iron wall would be. Medieval ages didn't even\
- use iron walls, iron walls are actually not even something that exists because iron is an expensive and not-so-great thing to build walls\
- out of. It only makes sense in the context of space because you're trying to keep a freezing vacuum out. Is anyone following me on this? \
- The idea of a \"rudimentary\" iron wall makes no sense at all! Is anything i'm even saying here true? Someone's gotta fact check this!"
- icon_state = "stone_floor"
-
/turf/open/floor/vault
name = "strange floor"
desc = "You feel a strange nostalgia from looking at this..."
diff --git a/code/game/turfs/open/floor/reinforced_floor.dm b/code/game/turfs/open/floor/reinforced_floor.dm
index bc8f70655759..0ca443d101c1 100644
--- a/code/game/turfs/open/floor/reinforced_floor.dm
+++ b/code/game/turfs/open/floor/reinforced_floor.dm
@@ -105,7 +105,7 @@
initial_gas_mix = ATMOS_TANK_CO2
/turf/open/floor/engine/plasma
- name = "plasma floor"
+ name = "\improper Plasma floor"
initial_gas_mix = ATMOS_TANK_PLASMA
/turf/open/floor/engine/o2
@@ -139,7 +139,7 @@
initial_gas_mix = ATMOS_TANK_H2
/turf/open/floor/engine/hypernoblium
- name = "\improper Hypernoblium floor"
+ name = "\improper Hyper-Noblium floor"
initial_gas_mix = ATMOS_TANK_HYPERNOBLIUM
/turf/open/floor/engine/miasma
@@ -147,7 +147,7 @@
initial_gas_mix = ATMOS_TANK_MIASMA
/turf/open/floor/engine/nitrium
- name = "\improper nitrium floor"
+ name = "\improper Nitrium floor"
initial_gas_mix = ATMOS_TANK_NITRIUM
/turf/open/floor/engine/pluoxium
@@ -176,7 +176,7 @@
initial_gas_mix = ATMOS_TANK_HELIUM
/turf/open/floor/engine/antinoblium
- name = "\improper Antinoblium floor"
+ name = "\improper Anti-Noblium floor"
initial_gas_mix = ATMOS_TANK_ANTINOBLIUM
/turf/open/floor/engine/air
diff --git a/code/modules/admin/admin_fax_panel.dm b/code/modules/admin/admin_fax_panel.dm
index d426c48b14dd..3be78a100617 100644
--- a/code/modules/admin/admin_fax_panel.dm
+++ b/code/modules/admin/admin_fax_panel.dm
@@ -1,6 +1,6 @@
ADMIN_VERB(fax_panel, R_ADMIN, "Fax Panel", "View and respond to faxes sent to CC.", ADMIN_CATEGORY_EVENTS)
- var/datum/fax_panel_interface/ui = new /datum/fax_panel_interface(user.mob)
- ui.ui_interact(user.mob)
+ var/datum/fax_panel_interface/tgui = new(user.mob)
+ tgui.ui_interact(user.mob)
/// Admin Fax Panel. Tool for sending fax messages faster.
/datum/fax_panel_interface
diff --git a/code/modules/admin/admin_verb_panel.dm b/code/modules/admin/admin_verb_panel.dm
index 056e93a842e9..ccc340a32636 100644
--- a/code/modules/admin/admin_verb_panel.dm
+++ b/code/modules/admin/admin_verb_panel.dm
@@ -12,8 +12,6 @@ ADMIN_VERB(admin_verb_panel, R_NONE, "Admin Verb Panel", "Browse and invoke admi
/datum/admin_verb_panel
var/client/owner
var/selected_verb_type
- var/typepath_parent = "/datum"
- var/list/typepath_children = list()
/datum/admin_verb_panel/New(client/user)
owner = user
@@ -27,6 +25,11 @@ ADMIN_VERB(admin_verb_panel, R_NONE, "Admin Verb Panel", "Browse and invoke admi
/datum/admin_verb_panel/ui_state(mob/user)
return ADMIN_STATE(R_NONE)
+/datum/admin_verb_panel/ui_assets(mob/user)
+ return list(
+ get_asset_datum(/datum/asset/json/spawn_menu),
+ )
+
/datum/admin_verb_panel/ui_static_data(mob/user)
var/list/data = list()
var/list/verbs_data = list()
@@ -68,7 +71,6 @@ ADMIN_VERB(admin_verb_panel, R_NONE, "Admin Verb Panel", "Browse and invoke admi
/datum/admin_verb_panel/ui_data(mob/user)
var/list/data = list()
data["targets"] = build_target_list()
- data["typepaths"] = list("parent" = typepath_parent, "paths" = typepath_children)
return data
/datum/admin_verb_panel/proc/build_target_list()
@@ -136,20 +138,3 @@ ADMIN_VERB(admin_verb_panel, R_NONE, "Admin Verb Panel", "Browse and invoke admi
resolved_args[key] = value
SSadmin_verbs.dynamic_invoke_verb(owner, verb_type, resolved_args)
return TRUE
- if("request_typepaths")
- var/parent_text = params["parent"]
- var/browse_type = text2path(parent_text)
- if(isnull(browse_type))
- browse_type = /datum
- typepath_parent = parent_text || "/datum"
- typepath_children = list()
- for(var/child_type in typesof(browse_type))
- if(child_type == browse_type)
- continue
- var/child_text = "[child_type]"
- var/parent_len = length(typepath_parent)
- var/remainder = copytext(child_text, parent_len + 1)
- if(findtext(remainder, "/", 2))
- continue
- typepath_children += child_text
- return TRUE
diff --git a/code/modules/admin/outfit_manager.dm b/code/modules/admin/outfit_manager.dm
index 6fc7bc640c23..39168fdda1ab 100644
--- a/code/modules/admin/outfit_manager.dm
+++ b/code/modules/admin/outfit_manager.dm
@@ -1,6 +1,6 @@
ADMIN_VERB(outfit_manager, R_DEBUG|R_ADMIN, "Outfit Manager", "View and edit outfits.", ADMIN_CATEGORY_DEBUG)
- var/static/datum/outfit_manager/ui = new
- ui.ui_interact(user.mob)
+ var/datum/outfit_manager/tgui = new()
+ tgui.ui_interact(user.mob)
/datum/outfit_manager
diff --git a/code/modules/admin/painting_manager.dm b/code/modules/admin/painting_manager.dm
index fadd354380cf..1cdd33dffefd 100644
--- a/code/modules/admin/painting_manager.dm
+++ b/code/modules/admin/painting_manager.dm
@@ -1,6 +1,6 @@
ADMIN_VERB(painting_manager, R_ADMIN, "Paintings Manager", "View and redact paintings.", ADMIN_CATEGORY_MAIN)
- var/static/datum/paintings_manager/ui = new
- ui.ui_interact(user.mob)
+ var/datum/paintings_manager/tgui = new()
+ tgui.ui_interact(user.mob)
/// Painting Admin Management Panel
/datum/paintings_manager
@@ -8,9 +8,6 @@ ADMIN_VERB(painting_manager, R_ADMIN, "Paintings Manager", "View and redact pain
/datum/paintings_manager/ui_state(mob/user)
return ADMIN_STATE(R_ADMIN)
-/datum/paintings_manager/ui_close(mob/user)
- qdel(src)
-
/datum/paintings_manager/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 714cb41a9ed5..4bec3901b775 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -237,7 +237,7 @@
if(iscarbon(M)) //Carbon stuff
if(ishuman(M) && M.job)
M_job = M.job
- else if(ismonkey(M))
+ else if(HAS_TRAIT(M, TRAIT_LESSER_HUMANOID))
M_job = "Monkey"
else if(isalien(M)) //aliens
if(islarva(M))
diff --git a/code/modules/admin/trophy_manager.dm b/code/modules/admin/trophy_manager.dm
index 95afad83a2a4..7fb3335dd400 100644
--- a/code/modules/admin/trophy_manager.dm
+++ b/code/modules/admin/trophy_manager.dm
@@ -1,6 +1,6 @@
ADMIN_VERB(trophy_manager, R_ADMIN, "Trophy Manager", "View all trophies.", ADMIN_CATEGORY_MAIN)
- var/static/datum/trophy_manager/ui = new
- ui.ui_interact(user.mob)
+ var/datum/trophy_manager/tgui = new()
+ tgui.ui_interact(user.mob)
/// Trophy Admin Management Panel
/datum/trophy_manager
@@ -8,9 +8,6 @@ ADMIN_VERB(trophy_manager, R_ADMIN, "Trophy Manager", "View all trophies.", ADMI
/datum/trophy_manager/ui_state(mob/user)
return ADMIN_STATE(R_ADMIN)
-/datum/trophy_manager/ui_close(mob/user)
- qdel(src)
-
/datum/trophy_manager/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
diff --git a/code/modules/admin/verbs/admingame.dm b/code/modules/admin/verbs/admingame.dm
index 8f1115ac4af6..f4b28a43adeb 100644
--- a/code/modules/admin/verbs/admingame.dm
+++ b/code/modules/admin/verbs/admingame.dm
@@ -118,12 +118,12 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_ADMIN, "Show Player Panel", /m
else
body += "Make Ghost | "
- if(ishuman(player) && !ismonkey(player))
+ if(ishuman(player) && !HAS_TRAIT(player, TRAIT_LESSER_HUMANOID))
body += "Human | "
else
body += "Make Human | "
- if(ismonkey(player))
+ if(HAS_TRAIT(player, TRAIT_LESSER_HUMANOID))
body += "Monkey | "
else
body += "Make Monkey | "
diff --git a/code/modules/admin/verbs/appearance_debugger/appearance_debugger.dm b/code/modules/admin/verbs/appearance_debugger/appearance_debugger.dm
index 32c29a9e5407..6c2597f7c790 100644
--- a/code/modules/admin/verbs/appearance_debugger/appearance_debugger.dm
+++ b/code/modules/admin/verbs/appearance_debugger/appearance_debugger.dm
@@ -11,8 +11,16 @@
var/atom/movable/screen/map_view/proxy_view_hover
/// Mapview used to display the selected appearance
var/atom/movable/screen/map_view/proxy_view_selected
+ /// ID of currently hovered over appearance
+ var/hover_id = null
+ /// ID of currently selected appearance
+ var/selected_id = null
/// Assoc list of ref -> list of atoms to be displayed in said ref atom's vis_contents
var/list/atom/movable/fake_vis
+ /// Are we currently forcing selected overlay to render to a specific plane?
+ var/forced_plane = null
+ /// Color of the backdrop, if any
+ var/backdrop_color = null
/// Should we display a popup that the appearance in-game has updated?
var/update_warning = FALSE
@@ -134,6 +142,8 @@
/datum/appearance_debugger/ui_data(mob/user)
return list(
"updateWarning" = update_warning,
+ "forcedPlane" = forced_plane,
+ "backdropColor" = backdrop_color,
)
/datum/appearance_debugger/ui_static_data(mob/user)
@@ -150,39 +160,47 @@
/datum/appearance_debugger/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
- if(.)
+ if (.)
return
- switch(action)
- if("swapMapViewHover")
- var/appearance_id = text2num(params["id"])
- proxy_view_hover.appearance = appearance_copies[appearance_id]
+ switch (action)
+ if ("swapMapViewHover")
+ hover_id = text2num(params["id"])
+ set_appearance_proxy(proxy_view_hover, hover_id)
- for (var/atom/movable/something as anything in proxy_view_hover.vis_contents)
- proxy_view_hover.vis_contents -= something
- for (var/ref_id in appearance_cache)
- if (appearance_copies[appearance_id] != appearance_cache[ref_id])
- continue
- if (fake_vis[ref_id])
- proxy_view_hover.vis_contents |= fake_vis[ref_id]
+ if ("swapMapViewSelected")
+ selected_id = text2num(params["id"])
+ set_appearance_proxy(proxy_view_selected, selected_id)
- // Needs screenloc to be set since we're setting the appearance and carrying over target's screenloc
- proxy_view_hover.set_position(1, 1)
+ if ("setForcedPlane")
+ forced_plane = text2num(params["plane"])
+ SET_PLANE_IMPLICIT(proxy_view_hover, forced_plane)
+ SET_PLANE_IMPLICIT(proxy_view_selected, forced_plane)
- if("swapMapViewSelected")
- var/appearance_id = text2num(params["id"])
- proxy_view_selected.appearance = appearance_copies[appearance_id]
+ if ("resetForcedPlane")
+ forced_plane = null
+ if (!isnull(hover_id))
+ var/mutable_appearance/hover_appearance = appearance_copies[hover_id]
+ SET_PLANE_IMPLICIT(proxy_view_hover, hover_appearance.plane)
- for (var/atom/movable/something as anything in proxy_view_selected.vis_contents)
- proxy_view_selected.vis_contents -= something
- for (var/ref_id in appearance_cache)
- if (appearance_copies[appearance_id] != appearance_cache[ref_id])
- continue
- if (fake_vis[ref_id])
- proxy_view_selected.vis_contents |= fake_vis[ref_id]
+ if (!isnull(selected_id))
+ var/mutable_appearance/selected_appearance = appearance_copies[selected_id]
+ SET_PLANE_IMPLICIT(proxy_view_selected, selected_appearance.plane)
- proxy_view_selected.set_position(1, 1)
+ if ("pickBackdropColor")
+ backdrop_color = tgui_color_picker(usr, "Choose preview backdrop color:", "Backdrop Color", backdrop_color || COLOR_WHITE)
+ if (!isnull(hover_id))
+ set_appearance_proxy(proxy_view_hover, hover_id)
+ if (!isnull(selected_id))
+ set_appearance_proxy(proxy_view_selected, selected_id)
- if("refreshAppearance")
+ if ("setBackdropColor")
+ backdrop_color = params["reset"] ? null : params["backdropColor"]
+ if (!isnull(hover_id))
+ set_appearance_proxy(proxy_view_hover, hover_id)
+ if (!isnull(selected_id))
+ set_appearance_proxy(proxy_view_selected, selected_id)
+
+ if ("refreshAppearance")
update_warning = FALSE
appearance_copies = list()
appearance_cache = list()
@@ -192,12 +210,43 @@
fake_vis = list()
update_static_data_for_all_viewers()
- if("vvAppearance")
+ if ("vvAppearance")
if (!check_rights(R_VAREDIT))
return
var/appearance_id = text2num(params["id"])
usr.client.debug_variables(appearance_copies[appearance_id])
+/// Cause a passed proxy mapview to render a set appearance ID
+/datum/appearance_debugger/proc/set_appearance_proxy(atom/movable/screen/map_view/proxy, appearance_id)
+ var/mutable_appearance/appearance_mirror = new(appearance_copies[appearance_id])
+ proxy.appearance = appearance_mirror
+ proxy.vis_contents.Cut()
+
+ for (var/ref_id in appearance_cache)
+ if (appearance_copies[appearance_id] != appearance_cache[ref_id])
+ continue
+ if (fake_vis[ref_id])
+ proxy.vis_contents |= fake_vis[ref_id]
+
+ if (!isnull(forced_plane))
+ SET_PLANE_IMPLICIT(proxy, forced_plane)
+
+ if (!isnull(backdrop_color))
+ // Rendering *really* low, to ensure we're below everything
+ var/mutable_appearance/backdrop = mutable_appearance('icons/effects/alphacolors.dmi', "white", LOWER_FLOOR_LAYER, proxy, FLOOR_PLANE, 255, KEEP_APART | RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM)
+ backdrop.transform = matrix() * 32 // I doubt anyone will make sprites larger than 32x32 tiles, largest we have as of 2026 is 11x11
+ backdrop.transform.Translate(-15.5, -15.5)
+ backdrop.color = backdrop_color
+ proxy.underlays += backdrop
+ // Also render an emissive backdrop to light up the floor
+ var/mutable_appearance/backdrop_light = emissive_appearance('icons/effects/alphacolors.dmi', "white", proxy, LOWER_FLOOR_LAYER, 255, RESET_ALPHA | RESET_TRANSFORM, effect_type = EMISSIVE_NO_BLOOM)
+ backdrop_light.transform = matrix() * 32
+ backdrop_light.transform.Translate(-15.5, -15.5)
+ proxy.underlays += backdrop_light
+
+ // Needs screenloc to be set since we're setting the appearance and carrying over target's screenloc
+ proxy.set_position(1, 1)
+
/datum/appearance_debugger/ui_assets(mob/user)
return list(get_asset_datum(/datum/asset/simple/plane_background))
diff --git a/code/modules/admin/verbs/commandreport.dm b/code/modules/admin/verbs/commandreport.dm
index 07acafd21201..97a870250ccb 100644
--- a/code/modules/admin/verbs/commandreport.dm
+++ b/code/modules/admin/verbs/commandreport.dm
@@ -19,7 +19,7 @@ ADMIN_VERB(change_command_name, R_ADMIN, "Change Command Name", "Change the name
/// Verb to open the create command report window and send command reports.
ADMIN_VERB(create_command_report, R_ADMIN, "Create Command Report", "Create a command report to be sent to the station.", ADMIN_CATEGORY_EVENTS)
BLACKBOX_LOG_ADMIN_VERB("Create Command Report")
- var/datum/command_report_menu/tgui = new /datum/command_report_menu(user.mob)
+ var/datum/command_report_menu/tgui = new(user.mob)
tgui.ui_interact(user.mob)
/// Datum for holding the TGUI window for command reports.
diff --git a/code/modules/admin/verbs/lawpanel.dm b/code/modules/admin/verbs/lawpanel.dm
index 833f96309a59..ecd44d0eaf61 100644
--- a/code/modules/admin/verbs/lawpanel.dm
+++ b/code/modules/admin/verbs/lawpanel.dm
@@ -1,7 +1,7 @@
ADMIN_VERB(law_panel, R_ADMIN, "Law Panel", "View the AI laws.", ADMIN_CATEGORY_EVENTS)
if(!isobserver(user) && SSticker.HasRoundStarted())
message_admins("[key_name_admin(user)] checked AI laws via the Law Panel.")
- var/datum/law_panel/tgui = new
+ var/datum/law_panel/tgui = new()
tgui.ui_interact(user.mob)
BLACKBOX_LOG_ADMIN_VERB("Law Panel")
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index cad9cd405bc2..2a593d12302b 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -197,12 +197,13 @@ ADMIN_VERB(disable_communication, R_DEBUG, "Disable all communication verbs", "D
ADMIN_VERB_VISIBILITY(create_mapping_job_icons, ADMIN_VERB_VISIBLITY_FLAG_MAPPING_DEBUG)
ADMIN_VERB(create_mapping_job_icons, R_DEBUG, "Generate job landmarks icons", "Generates job starting location landmarks.", ADMIN_CATEGORY_MAPPING)
var/icon/final = icon()
- var/mob/living/carbon/human/dummy/consistent/mannequin = new(get_turf(usr))
- mannequin.setDir(SOUTH)
+ // var/mob/living/carbon/human/dummy/consistent/mannequin = new(get_turf(usr))
+ // mannequin.setDir(SOUTH)
for(var/job_type in valid_subtypesof(/datum/job/vampire))
var/datum/job/job_datum = SSjob.get_job_type(job_type)
if(!job_datum.outfit)
continue
+ /* DARKPACK CODE
mannequin.delete_equipment()
mannequin.dress_up_as_job(
equipping = job_datum,
@@ -211,7 +212,11 @@ ADMIN_VERB(create_mapping_job_icons, R_DEBUG, "Generate job landmarks icons", "G
)
var/icon/job_icon = get_flat_existing_human_icon(mannequin, list(SOUTH))
final.Insert(job_icon, job_datum.title, frame = 1)
- qdel(mannequin)
+ */
+ // TG code, Test
+ var/icon/I = get_flat_human_icon(null, job_datum, null, "landmark_icons", list(SOUTH))
+ final.Insert(I, job_datum.title)
+ // qdel(mannequin)
final.Insert(icon('modular_darkpack/modules/jobs/icons/landmarks_static.dmi', "x"), "x")
final.Insert(icon('icons/hud/screen_gen.dmi', "x", ""))
diff --git a/code/modules/admin/verbs/policy_panel.dm b/code/modules/admin/verbs/policy_panel.dm
index cc70dc2babbe..a7969f7edc13 100644
--- a/code/modules/admin/verbs/policy_panel.dm
+++ b/code/modules/admin/verbs/policy_panel.dm
@@ -3,7 +3,7 @@ ADMIN_VERB(policy_panel, R_ADMIN, "Policy Panel", "View all policy the server ha
tgui_alert(usr, "Policy hasn't loaded yet (or the server has none set).", "Policy Panel", list("OK"))
return
- var/datum/policy_panel/tgui = new
+ var/datum/policy_panel/tgui = new()
tgui.ui_interact(user.mob)
BLACKBOX_LOG_ADMIN_VERB("Policy Panel")
diff --git a/code/modules/admin/verbs/selectequipment.dm b/code/modules/admin/verbs/selectequipment.dm
index 12cfa91cf179..260ba888f8b6 100644
--- a/code/modules/admin/verbs/selectequipment.dm
+++ b/code/modules/admin/verbs/selectequipment.dm
@@ -1,7 +1,7 @@
ADMIN_VERB_ONLY_CONTEXT_MENU(select_equipment, R_FUN, "Select Equipment", /mob)
VERB_ARG_TYPED(target, VERB_ARG_TYPE_MOB, VERB_ARG_SOURCE_WORLD, /mob)
- var/datum/select_equipment/ui = new(user, target)
- ui.ui_interact(user.mob)
+ var/datum/select_equipment/tgui = new(user, target)
+ tgui.ui_interact(user.mob)
/*
* This is the datum housing the select equipment UI.
diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm
index ed7f8ffeec24..e8a81987cd16 100644
--- a/code/modules/antagonists/_common/antag_spawner.dm
+++ b/code/modules/antagonists/_common/antag_spawner.dm
@@ -444,7 +444,7 @@
/obj/item/antag_spawner/loadout/monkey_man/proc/allergy(mob/living/second_lifer, datum/species/folly_species)
SIGNAL_HANDLER
- if(is_simian(second_lifer))
+ if(HAS_TRAIT(second_lifer, TRAIT_SIMIAN))
return
// timer is long to let them panic and consider their folly, and because allergies take a while
second_lifer.visible_message(span_bolddanger("[second_lifer] starts swelling unhealthily in size. It looks like they had an allergic reaction to becoming a [folly_species]!"), span_userdanger("As your monkey features morph, you feel your allergies coming in. Oh no."))
diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm
index 70e2ceacaed9..8582a2507b99 100644
--- a/code/modules/antagonists/abductor/equipment/gland.dm
+++ b/code/modules/antagonists/abductor/equipment/gland.dm
@@ -50,11 +50,11 @@
if(!owner)
return
if(active_mind_control)
- owner.set_hud_image_state(GLAND_HUD, "hudgland_active")
+ owner.set_hud_image_state(GLAND_HUD, hud_state = "hudgland_active")
else if(mind_control_uses)
- owner.set_hud_image_state(GLAND_HUD, "hudgland_ready")
+ owner.set_hud_image_state(GLAND_HUD, hud_state = "hudgland_ready")
else
- owner.set_hud_image_state(GLAND_HUD, "hudgland_spent")
+ owner.set_hud_image_state(GLAND_HUD, hud_state = "hudgland_spent")
/obj/item/organ/heart/gland/proc/mind_control(command, mob/living/user)
if(!ownerCheck() || !mind_control_uses || active_mind_control)
diff --git a/code/modules/antagonists/blood_worm/actions/bloodworm_info.dm b/code/modules/antagonists/blood_worm/actions/bloodworm_info.dm
new file mode 100644
index 000000000000..bb7b469bfe2e
--- /dev/null
+++ b/code/modules/antagonists/blood_worm/actions/bloodworm_info.dm
@@ -0,0 +1,24 @@
+/atom/movable/screen/alert/bloodworm_info
+ name = "Bloodworm Info"
+ desc = "Shows you stats on all Bloodworm-related activities when hovering over."
+ icon = 'icons/mob/actions/backgrounds.dmi'
+ icon_state = "bg_demon"
+ use_user_hud_icon = USER_HUD_STYLE_INHERIT
+ overlay_state = "highbloodpressure"
+ click_master = FALSE
+
+ ///Ref to the worm we're giving info about
+ var/mob/living/basic/blood_worm/worm_owner
+
+/atom/movable/screen/alert/bloodworm_info/Initialize(mapload, datum/hud/hud_owner)
+ . = ..()
+ underlays += mutable_appearance('icons/mob/actions/backgrounds.dmi', "bg_demon", layer = layer, offset_spokesman = src, plane = plane)
+
+/atom/movable/screen/alert/bloodworm_info/Destroy()
+ worm_owner = null
+ return ..()
+
+/atom/movable/screen/alert/bloodworm_info/MouseEntered(location, control, params)
+ name = worm_owner.get_info_title()
+ desc = worm_owner.get_info_desc()
+ return ..()
diff --git a/code/modules/antagonists/blood_worm/actions/cocoon.dm b/code/modules/antagonists/blood_worm/actions/cocoon.dm
index f976a4fe5598..9ca8f4762525 100644
--- a/code/modules/antagonists/blood_worm/actions/cocoon.dm
+++ b/code/modules/antagonists/blood_worm/actions/cocoon.dm
@@ -1,6 +1,7 @@
/datum/action/cooldown/mob_cooldown/blood_worm/cocoon
cooldown_time = 30 SECONDS
shared_cooldown = NONE
+ transparent_when_unavailable = FALSE
click_to_activate = FALSE
@@ -15,6 +16,18 @@
var/cocoon_time = 30 SECONDS
+/datum/action/cooldown/mob_cooldown/blood_worm/cocoon/create_button(mob/viewer)
+ var/atom/movable/screen/movable/action_button/button = ..()
+ button.maptext_x = 1
+ return button
+
+/datum/action/cooldown/mob_cooldown/blood_worm/cocoon/update_button_status(atom/movable/screen/movable/action_button/button, force = FALSE)
+ . = ..()
+ var/mob/living/basic/blood_worm/worm = owner
+ var/percentage_shown = "[round((worm.get_consumed_blood() / total_blood_required) * 100, 0.1)]"
+ button.maptext_x = (length(percentage_shown) >= 3) ? 0 : 1
+ button.maptext = MAPTEXT_TINY_UNICODE("[percentage_shown]%")
+
/datum/action/cooldown/mob_cooldown/blood_worm/cocoon/Grant(mob/granted_to)
. = ..()
if (!owner)
diff --git a/code/modules/antagonists/blood_worm/blood_worm_host_handling.dm b/code/modules/antagonists/blood_worm/blood_worm_host_handling.dm
index ebfeed40a646..1aa022c822b9 100644
--- a/code/modules/antagonists/blood_worm/blood_worm_host_handling.dm
+++ b/code/modules/antagonists/blood_worm/blood_worm_host_handling.dm
@@ -21,10 +21,12 @@
RegisterSignal(host, COMSIG_LIVING_LIFE, PROC_REF(on_host_life))
RegisterSignal(host, COMSIG_LIVING_ADJUST_OXY_DAMAGE, PROC_REF(on_host_adjust_oxy_damage))
RegisterSignal(host, COMSIG_LIVING_PRE_UPDATE_BLOOD_STATUS, PROC_REF(on_host_pre_update_blood_status))
- RegisterSignal(host, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(on_host_get_status_tab_items))
client?.set_stat_panel()
RegisterSignal(host, COMSIG_MOB_EXAMINING, PROC_REF(on_host_examining))
+ var/atom/movable/screen/alert/bloodworm_info/info_alert = host.throw_alert(ALERT_BLOODWORM_INFO, /atom/movable/screen/alert/bloodworm_info)
+ info_alert.worm_owner = src
+
START_PROCESSING(SSfastprocess, src)
add_traits(list(TRAIT_INCAPACITATED, TRAIT_IMMOBILIZED, TRAIT_MUTE, TRAIT_EMOTEMUTE), BLOOD_WORM_HOST_TRAIT)
@@ -135,6 +137,7 @@
sync_health(already_ejecting = TRUE)
host.hud_used?.remove_screen_object(HUD_MOB_BLOOD_LEVEL)
+ host.clear_alert(ALERT_BLOODWORM_INFO)
host.set_blood_volume(0)
diff --git a/code/modules/antagonists/blood_worm/blood_worm_mob.dm b/code/modules/antagonists/blood_worm/blood_worm_mob.dm
index 6442dde137df..bfe9a0cd4683 100644
--- a/code/modules/antagonists/blood_worm/blood_worm_mob.dm
+++ b/code/modules/antagonists/blood_worm/blood_worm_mob.dm
@@ -168,11 +168,14 @@
return FALSE
if (host)
ADD_TRAIT(host, TRAIT_MIND_TEMPORARILY_GONE, BLOOD_WORM_HOST_TRAIT)
+ var/atom/movable/screen/alert/bloodworm_info/info_alert = throw_alert(ALERT_BLOODWORM_INFO, /atom/movable/screen/alert/bloodworm_info)
+ info_alert.worm_owner = src
/mob/living/basic/blood_worm/Logout()
. = ..()
if (host)
REMOVE_TRAIT(host, TRAIT_MIND_TEMPORARILY_GONE, BLOOD_WORM_HOST_TRAIT)
+ clear_alert(ALERT_BLOODWORM_INFO)
/mob/living/basic/blood_worm/process(seconds_per_tick, times_fired)
if (!host)
diff --git a/code/modules/antagonists/blood_worm/blood_worm_text_feedback.dm b/code/modules/antagonists/blood_worm/blood_worm_text_feedback.dm
index d11dc64ce837..2dbeecd88b34 100644
--- a/code/modules/antagonists/blood_worm/blood_worm_text_feedback.dm
+++ b/code/modules/antagonists/blood_worm/blood_worm_text_feedback.dm
@@ -63,29 +63,14 @@
result += span_notice("[target.p_They()] [target.p_have()] [rounded_volume] unit[rounded_volume == 1 ? "" : "s"] of blood[growth_string]. [target.p_Their()] blood is [synth_string] synthetic.")
-/mob/living/basic/blood_worm/get_status_tab_items()
- return ..() + get_special_status_tab_items()
-
-/mob/living/basic/blood_worm/proc/on_host_get_status_tab_items(datum/source, list/items)
- SIGNAL_HANDLER
- items += "Worm Health: [round((health / maxHealth) * 100)]%"
- items += get_special_status_tab_items()
-
-/mob/living/basic/blood_worm/proc/get_special_status_tab_items()
- . = list()
-
- var/normal = consumed_normal_blood
- var/synth = consumed_synth_blood
- var/total = normal + synth
-
- var/total_required = cocoon_action?.total_blood_required
-
- if (total_required > 0)
- . += "Growth: [FLOOR(total / total_required * 100, 1)]%"
- . += "Blood Consumed"
- . += "- Normal: [ceil(normal)]u"
- . += "- Synthetic: [ceil(synth)]u (MAX: [maximum_synth_blood]u)"
- . += "- Total: [ceil(total)]u (REQ: [total_required]u)"
+/mob/living/basic/blood_worm/proc/get_info_title()
+ . = "Worm Health: [round((health / maxHealth) * 100)]%"
+
+/mob/living/basic/blood_worm/proc/get_info_desc()
+ . = "Blood Consumed
"
+ . += "- Normal: [ceil(consumed_normal_blood)]u
"
+ . += "- Synthetic: [ceil(consumed_synth_blood)]u (MAX: [maximum_synth_blood]u)
"
+ . += "- Total: [ceil(consumed_normal_blood + consumed_synth_blood)]u
"
/// Sends text to the blood worm, whether they are possessing a host or not.
/mob/living/basic/blood_worm/proc/to_chat_self(text)
diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm
index 279bc3032c69..064a73dc2c10 100644
--- a/code/modules/antagonists/changeling/changeling.dm
+++ b/code/modules/antagonists/changeling/changeling.dm
@@ -438,7 +438,7 @@
* Changeling's ability to re-adapt all of their learned powers.
*/
/datum/antagonist/changeling/proc/readapt()
- if(!ishuman(owner.current) || ismonkey(owner.current))
+ if(!ishuman(owner.current) || HAS_TRAIT(owner.current, TRAIT_LESSER_HUMANOID))
to_chat(owner.current, span_warning("We can't remove our evolutions in this form!"))
return FALSE
@@ -513,7 +513,7 @@
if(verbose)
to_chat(user, span_warning("[target]'s body is ruined beyond usability!"))
return FALSE
- if(!ishuman(target) || ismonkey(target))//Absorbing monkeys is entirely possible, but it can cause issues with transforming. That's what lesser form is for anyway!
+ if(!ishuman(target) || HAS_TRAIT(target, TRAIT_LESSER_HUMANOID))//Absorbing monkeys is entirely possible, but it can cause issues with transforming. That's what lesser form is for anyway!
if(verbose)
to_chat(user, span_warning("We could gain no benefit from absorbing a lesser creature."))
return FALSE
@@ -574,7 +574,8 @@
new_profile.profile_snapshot = entry
// Grab the target's sechut icon.
- new_profile.id_icon = target.wear_id?.get_sechud_job_icon_state()
+ new_profile.id_icon = target.wear_id?.get_sechud_job_icon()
+ new_profile.id_icon_state = target.wear_id?.get_sechud_job_icon_state()
var/list/slots = list("head", "wear_mask", "wear_neck", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store")
for(var/slot in slots)
@@ -874,6 +875,7 @@
if(istype(new_flesh_item, /obj/item/changeling/id) && chosen_profile.id_icon)
var/obj/item/changeling/id/flesh_id = new_flesh_item
flesh_id.hud_icon = chosen_profile.id_icon
+ flesh_id.hud_icon_state = chosen_profile.id_icon_state
if(equip)
user.equip_to_slot_or_del(new_flesh_item, slot2slot[slot], indirect_action = TRUE)
@@ -931,6 +933,8 @@
var/datum/icon_snapshot/profile_snapshot
/// ID HUD icon associated with the profile
var/id_icon
+ /// ID HUD icon state associated with the profile
+ var/id_icon_state
/// The age of the profile source.
var/age
/// The body type of the profile source.
diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm
index 9ceef3b07cd2..58cf6fe4e5f9 100644
--- a/code/modules/antagonists/changeling/changeling_power.dm
+++ b/code/modules/antagonists/changeling/changeling_power.dm
@@ -115,7 +115,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p
return FALSE
if(!ishuman(user))
return FALSE
- if(req_human && ismonkey(user))
+ if(req_human && HAS_TRAIT(user, TRAIT_LESSER_HUMANOID))
user.balloon_alert(user, "become human!")
return FALSE
return TRUE
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index 16719ac9df83..3a4c63bf6ea0 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -366,7 +366,7 @@
/obj/projectile/tentacle/fire(setAngle)
if(firer)
- chain = firer.Beam(src, icon_state = "tentacle", emissive = FALSE)
+ chain = firer.Beam(src, icon_state = "tentacle", emissive = NONE)
..()
/obj/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/user)
diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm
index 06c360aba079..fa7e9e4f9f20 100644
--- a/code/modules/antagonists/changeling/powers/tiny_prick.dm
+++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm
@@ -124,7 +124,7 @@
|| !target.has_dna() \
|| HAS_TRAIT(target, TRAIT_HUSK) \
|| HAS_TRAIT(target, TRAIT_BADDNA) \
- || (HAS_TRAIT(target, TRAIT_NO_DNA_COPY) && !ismonkey(target))) // sure, go ahead, make a monk-clone
+ || (HAS_TRAIT(target, TRAIT_NO_DNA_COPY) && !HAS_TRAIT(target, TRAIT_LESSER_HUMANOID))) // sure, go ahead, make a monk-clone
user.balloon_alert(user, "incompatible DNA!")
return FALSE
if(target.has_status_effect(/datum/status_effect/temporary_transformation/trans_sting))
@@ -135,7 +135,7 @@
/datum/action/changeling/sting/transformation/sting_action(mob/living/user, mob/living/target)
var/final_duration = sting_duration
var/final_message = span_notice("We transform [target] into [selected_dna.dna.real_name].")
- if(ismonkey(target))
+ if(HAS_TRAIT(target, TRAIT_LESSER_HUMANOID))
final_duration = INFINITY
final_message = span_warning("Our genes cry out as we transform the lesser form of [target] into [selected_dna.dna.real_name] permanently!")
@@ -178,7 +178,7 @@
..()
log_combat(user, target, "stung", object = "false armblade sting")
- if(ismonkey(target))
+ if(HAS_TRAIT(target, TRAIT_LESSER_HUMANOID))
to_chat(user, span_notice("Our genes cry out as we sting [target.name]!"))
var/obj/item/melee/arm_blade/false/blade = new(target,1)
diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm
index 81b62be3df74..e8ded29403e8 100644
--- a/code/modules/antagonists/changeling/powers/transform.dm
+++ b/code/modules/antagonists/changeling/powers/transform.dm
@@ -144,12 +144,14 @@
var/icon/cached_flat_icon
/// HUD job icon of the ID
var/hud_icon
+ ///HUD job icon state of the ID
+ var/hud_icon_state
/obj/item/changeling/id/equipped(mob/user, slot, initial)
. = ..()
if(!hud_icon)
return
- user.set_hud_image_state(ID_HUD, hud_icon)
+ user.set_hud_image_state(ID_HUD, hud_icon, hud_icon_state)
/**
* Returns cached flat icon of the ID, creates one if there is not one already cached
diff --git a/code/modules/antagonists/cult/cult_armor.dm b/code/modules/antagonists/cult/cult_armor.dm
index 36ede426e691..b161b2ae77da 100644
--- a/code/modules/antagonists/cult/cult_armor.dm
+++ b/code/modules/antagonists/cult/cult_armor.dm
@@ -58,12 +58,20 @@
inhand_icon_state = null
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/alt
+/obj/item/clothing/suit/hooded/cultrobes/alt/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, /datum/bodypart_texture/mesh/cult)
+
/obj/item/clothing/head/hooded/cult_hoodie/alt
name = "cultist hood"
desc = "An armored hood worn by the followers of Nar'Sie."
icon_state = "cult_hoodalt"
inhand_icon_state = null
+/obj/item/clothing/head/hooded/cult_hoodie/alt/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_HEAD, /datum/bodypart_texture/mesh/cult)
+
///'Ghost' subtype, given to cultists spawned by Spirit Realm. Can't be dropped.
/obj/item/clothing/suit/hooded/cultrobes/alt/ghost
item_flags = DROPDEL
@@ -95,6 +103,7 @@
/obj/item/clothing/suit/hooded/cultrobes/hardened/Initialize(mapload)
. = ..()
RegisterSignal(src, COMSIG_BIBLE_SMACKED, PROC_REF(on_bible_smacked))
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, /datum/bodypart_texture/mesh/cult)
/obj/item/clothing/suit/hooded/cultrobes/hardened/proc/on_bible_smacked(obj/item/book/bible/source, mob/user)
SIGNAL_HANDLER
@@ -174,6 +183,10 @@
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
resistance_flags = NONE
+/obj/item/clothing/head/hooded/cult_hoodie/hardened/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_HEAD, /datum/bodypart_texture/mesh/cult)
+
/**
* Shielded armor
* Was removed from the game, but returns as an exclusive to deathmatch
diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm
index fc08ebe64cf9..b605c6a13944 100644
--- a/code/modules/antagonists/ert/ert.dm
+++ b/code/modules/antagonists/ert/ert.dm
@@ -25,7 +25,7 @@
var/equip_ert = TRUE
var/forge_objectives_for_ert = TRUE
/// Typepath indicating the kind of job datum this ert member will have.
- var/ert_job_path = /datum/job/ert_generic
+ var/ert_job_path = /datum/job/ert
/datum/antagonist/ert/on_gain()
@@ -54,6 +54,7 @@
role = "Inspector"
random_names = FALSE
outfit = /datum/outfit/centcom/centcom_official
+ ert_job_path = /datum/job/ert/official
/datum/antagonist/ert/official/greet()
. = ..()
@@ -75,6 +76,7 @@
objectives |= mission
/datum/antagonist/ert/security // kinda handled by the base template but here for completion
+ ert_job_path = /datum/job/ert/officer
/datum/antagonist/ert/security/red
outfit = /datum/outfit/centcom/ert/security/alert
@@ -82,6 +84,7 @@
/datum/antagonist/ert/engineer
role = "Engineer"
outfit = /datum/outfit/centcom/ert/engineer
+ ert_job_path = /datum/job/ert/engineer
/datum/antagonist/ert/engineer/red
outfit = /datum/outfit/centcom/ert/engineer/alert
@@ -89,6 +92,7 @@
/datum/antagonist/ert/medic
role = "Medical Officer"
outfit = /datum/outfit/centcom/ert/medic
+ ert_job_path = /datum/job/ert/medical_doctor
/datum/antagonist/ert/medic/red
outfit = /datum/outfit/centcom/ert/medic/alert
@@ -97,6 +101,7 @@
role = "Commander"
outfit = /datum/outfit/centcom/ert/commander
plasmaman_outfit = /datum/outfit/plasmaman/centcom_commander
+ ert_job_path = /datum/job/ert/commander
/datum/antagonist/ert/commander/red
outfit = /datum/outfit/centcom/ert/commander/alert
@@ -104,6 +109,7 @@
/datum/antagonist/ert/janitor
role = "Janitor"
outfit = /datum/outfit/centcom/ert/janitor
+ ert_job_path = /datum/job/ert/janitor
/datum/antagonist/ert/janitor/heavy
role = "Heavy Duty Janitor"
@@ -115,6 +121,7 @@
plasmaman_outfit = /datum/outfit/plasmaman/centcom_commander
role = "Trooper"
rip_and_tear = TRUE
+ ert_job_path = /datum/job/ert/deatsquad
/datum/antagonist/ert/deathsquad/New()
. = ..()
@@ -142,6 +149,7 @@
/datum/antagonist/ert/chaplain
role = "Chaplain"
outfit = /datum/outfit/centcom/ert/chaplain
+ ert_job_path = /datum/job/ert/chaplain
/datum/antagonist/ert/chaplain/inquisitor
outfit = /datum/outfit/centcom/ert/chaplain/inquisitor
@@ -164,23 +172,27 @@
random_names = FALSE
role = "Intern"
suicide_cry = "FOR MY INTERNSHIP!!"
+ ert_job_path = /datum/job/ert/intern
/datum/antagonist/ert/intern/leader
name = "CentCom Head Intern"
outfit = /datum/outfit/centcom/centcom_intern/leader
random_names = FALSE
role = "Head Intern"
+ ert_job_path = /datum/job/ert/intern/leader
/datum/antagonist/ert/intern/unarmed
outfit = /datum/outfit/centcom/centcom_intern/unarmed
/datum/antagonist/ert/intern/leader/unarmed
outfit = /datum/outfit/centcom/centcom_intern/leader/unarmed
+ ert_job_path = /datum/antagonist/ert/intern/leader::ert_job_path
/datum/antagonist/ert/clown
role = "Clown"
outfit = /datum/outfit/centcom/ert/clown
plasmaman_outfit = /datum/outfit/plasmaman/party_comedian
+ ert_job_path = /datum/job/ert/clown
/datum/antagonist/ert/clown/New()
. = ..()
@@ -265,22 +277,26 @@
/datum/antagonist/ert/marine
name = "Marine Commander"
outfit = /datum/outfit/centcom/ert/marine
+ ert_job_path = /datum/antagonist/ert/commander::ert_job_path
role = "Commander"
/datum/antagonist/ert/marine/security
name = "Marine Heavy"
outfit = /datum/outfit/centcom/ert/marine/security
+ ert_job_path = /datum/antagonist/ert/security::ert_job_path
role = "Trooper"
/datum/antagonist/ert/marine/engineer
name = "Marine Engineer"
outfit = /datum/outfit/centcom/ert/marine/engineer
role = "Engineer"
+ ert_job_path = /datum/antagonist/ert/engineer::ert_job_path
/datum/antagonist/ert/marine/medic
name = "Marine Medic"
outfit = /datum/outfit/centcom/ert/marine/medic
role = "Medical Officer"
+ ert_job_path = /datum/antagonist/ert/medic::ert_job_path
/datum/antagonist/ert/militia
name = "Frontier Militia"
@@ -296,8 +312,10 @@
role = "Chief EMT"
outfit = /datum/outfit/centcom/ert/medical_commander
plasmaman_outfit = /datum/outfit/plasmaman/medical_commander
+ ert_job_path = /datum/antagonist/ert/medic::ert_job_path
/datum/antagonist/ert/medical_technician
role = "Emergency Medical Technician"
outfit = /datum/outfit/centcom/ert/medical_technician
plasmaman_outfit = /datum/outfit/plasmaman/medical_technician
+ ert_job_path = /datum/antagonist/ert/medic::ert_job_path
diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm
index 8c0f55b6b568..6081e195c18c 100644
--- a/code/modules/antagonists/heretic/heretic_knowledge.dm
+++ b/code/modules/antagonists/heretic/heretic_knowledge.dm
@@ -310,7 +310,7 @@
if(the_spell != created_action_ref || isnull(the_spell.owner))
return NONE
- if(charges > 0)
+ if(has_charges(the_spell.owner))
return NONE
var/datum/antagonist/heretic/our_heretic = GET_HERETIC(the_spell.owner)
if(our_heretic?.ascended)
@@ -325,7 +325,7 @@
if(the_spell != created_action_ref)
return NONE
- if(charges > 0)
+ if(has_charges(source))
return NONE
var/datum/antagonist/heretic/our_heretic = GET_HERETIC(source)
if(our_heretic?.ascended)
@@ -334,17 +334,27 @@
to_chat(source, span_mansus("You don't have enough charges to cast this spell! [transmute_text]"))
return SPELL_CANCEL_CAST
+/// Checks if we have enough charges to cast the spell
+/datum/heretic_knowledge/spell/proc/has_charges(mob/living/user)
+ return charges > 0
+
/datum/heretic_knowledge/spell/proc/deduct_charge(mob/living/source, datum/action/cooldown/the_spell)
SIGNAL_HANDLER
if(the_spell != created_action_ref)
return
+ if(!should_deduct_charge(source))
+ return
var/datum/antagonist/heretic/our_heretic = GET_HERETIC(source)
if(our_heretic?.ascended)
return
remove_charges(1)
+/// Checks if casting the spell should deduct a charge
+/datum/heretic_knowledge/spell/proc/should_deduct_charge(mob/living/user)
+ return TRUE
+
/// Add a number of charges, optionally bypassing the cap
/datum/heretic_knowledge/spell/proc/add_charges(num, uncapped = FALSE)
if(num <= 0)
@@ -787,7 +797,7 @@
* Checks if the passed human is a valid sacrifice for our ritual.
*/
/datum/heretic_knowledge/ultimate/proc/is_valid_sacrifice(mob/living/carbon/human/sacrifice)
- return (sacrifice.stat == DEAD) && !ismonkey(sacrifice)
+ return (sacrifice.stat == DEAD) && !HAS_TRAIT(sacrifice, TRAIT_LESSER_HUMANOID)
/datum/heretic_knowledge/ultimate/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc)
diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm
index a91199fdae78..7e8c5f03df9b 100644
--- a/code/modules/antagonists/heretic/items/heretic_armor.dm
+++ b/code/modules/antagonists/heretic/items/heretic_armor.dm
@@ -21,6 +21,13 @@
clothing_traits = list(TRAIT_HERETIC_AURA_HIDDEN)
/// Whether the hood is flipped up
var/hood_up = FALSE
+ /// Type of texture applied by this
+ var/texture_type = /datum/bodypart_texture/mesh/heretic
+
+/obj/item/clothing/suit/hooded/cultrobes/eldritch/Initialize(mapload)
+ . = ..()
+ if(texture_type)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, texture_type)
/obj/item/clothing/suit/hooded/cultrobes/eldritch/equipped(mob/user, slot, initial)
. = ..()
@@ -69,6 +76,13 @@
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
clothing_flags = THICKMATERIAL | PLASMAMAN_PREVENT_IGNITION | SNUG_FIT
armor_type = /datum/armor/eldritch_armor
+ /// Type of texture applied by this
+ var/texture_type = /datum/bodypart_texture/mesh/heretic
+
+/obj/item/clothing/head/hooded/cult_hoodie/eldritch/Initialize(mapload)
+ . = ..()
+ if(texture_type)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_HEAD, texture_type)
/datum/armor/eldritch_armor
melee = 50
@@ -100,6 +114,7 @@
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | LAVA_PROOF | FREEZE_PROOF
actions_types = list(/datum/action/item_action/toggle/flames)
+ texture_type = /datum/bodypart_texture/mesh/black
/// If our robes are actively generating flames
var/flame_generation = FALSE
/// Cooldown before our robes will create new flames
@@ -181,6 +196,7 @@
Yet the soot-choked folds turn blade and flame from the form within. A brief reprieve before its gaze turns inwards."
icon_state = "ash_armor"
armor_type = /datum/armor/eldritch_armor/ash
+ texture_type = /datum/bodypart_texture/mesh/black
/datum/armor/eldritch_armor/ash
melee = 40
@@ -203,6 +219,7 @@
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/blade
armor_type = /datum/armor/eldritch_armor/blade
siemens_coefficient = 0
+ texture_type = /datum/bodypart_texture/mesh/bombsuit
var/murdering_with_blades = FALSE
/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/on_robes_gained(mob/living/user)
@@ -310,6 +327,7 @@
icon_state = "blade_armor"
armor_type = /datum/armor/eldritch_armor/blade
siemens_coefficient = 0
+ texture_type = /datum/bodypart_texture/mesh/bombsuit
/datum/armor/eldritch_armor/blade
melee = 50
@@ -335,6 +353,7 @@
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
actions_types = list(/datum/action/item_action/toggle/gravity)
+ texture_type = null
/// If our robes are making us weightless
var/weightless_enabled = FALSE
@@ -385,6 +404,7 @@
clothing_flags = THICKMATERIAL | PLASMAMAN_PREVENT_IGNITION | STOPSPRESSUREDAMAGE
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
+ texture_type = null
/obj/item/clothing/head/hooded/cult_hoodie/eldritch/cosmic/Initialize(mapload)
. = ..()
@@ -404,12 +424,13 @@
// Flesh
// Emits a healing aura that affects any heretic summons (excluding the heretic himself)
/obj/item/clothing/suit/hooded/cultrobes/eldritch/flesh
- name = "Writhing Embrace"
+ name = "\improper Writhing Embrace"
desc = "A rotten carcass, or perhaps several, twisted into fleshy polyps, knotted intestines and cracked bone. \
How one 'wears' this baffles reasonable understanding. It moves when it believes itself unobserved."
icon_state = "flesh_armor"
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/flesh
armor_type = /datum/armor/eldritch_armor/flesh
+ texture_type = null
/// The aura healing component. Used to delete it when taken off.
var/datum/component/healing_aura
@@ -442,9 +463,11 @@
addtimer(CALLBACK(limb, TYPE_PROC_REF(/obj/item/bodypart, force_wound_upwards), /datum/wound/slash/flesh/critical), 1 SECONDS * iteration)
/obj/item/clothing/head/hooded/cult_hoodie/eldritch/flesh
+ name = "\improper Writhing Embrace"
icon_state = "flesh_armor"
armor_type = /datum/armor/eldritch_armor/flesh
clothing_traits = list(TRAIT_MEDICAL_HUD)
+ texture_type = null
/datum/armor/eldritch_armor/flesh
melee = 70
@@ -460,11 +483,12 @@
// Lock
// Gives you digital camo, silences your footsteps and makes you un-examineable
/obj/item/clothing/suit/hooded/cultrobes/eldritch/lock
- name = "Shifting Guise"
+ name = "\improper Shifting Guise"
icon_state = "lock_armor"
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/lock
armor_type = /datum/armor/eldritch_armor/lock
flags_inv = parent_type::flags_inv | HIDEMUTWINGS
+ texture_type = /datum/bodypart_texture/mesh/firesuit
/obj/item/clothing/suit/hooded/cultrobes/eldritch/lock/on_robes_gained(mob/living/user)
user.AddElement(/datum/element/digitalcamo)
@@ -486,8 +510,10 @@
to_throw.safe_throw_at(pick(nearby_turfs), 2, 1, spin = TRUE)
/obj/item/clothing/head/hooded/cult_hoodie/eldritch/lock
+ name = "\improper Shifting Guise"
icon_state = "lock_armor"
armor_type = /datum/armor/eldritch_armor/lock
+ texture_type = /datum/bodypart_texture/mesh/firesuit
/datum/armor/eldritch_armor/lock
melee = 40
@@ -519,6 +545,7 @@
TRAIT_PACIFISM,
TRAIT_NOHUNGER
)
+ texture_type = /datum/bodypart_texture/mesh/firesuit
/// Boolean if you are brain dead so the sound doesn't spam during the delay
var/braindead = FALSE
//---- Messages that get sent when someone wearing the moon robes is attacked
@@ -760,6 +787,7 @@
name = "\improper Resplendant Hood"
icon_state = "moon_armor"
armor_type = /datum/armor/eldritch_armor/moon
+ texture_type = /datum/bodypart_texture/mesh/firesuit
/datum/armor/eldritch_armor/moon
melee = 0
@@ -1045,6 +1073,7 @@
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/void
armor_type = /datum/armor/eldritch_armor/void
+ texture_type = null
/// Cooldown before we can go back into stealth
COOLDOWN_DECLARE(stealth_cooldown)
/// Timer before our stealth runs out
@@ -1085,6 +1114,7 @@
Yet upon tracking the shape of the folds more carefully, it is better to describe it as the absence of such a thing."
icon_state = "void_armor"
armor_type = /datum/armor/eldritch_armor/void
+ texture_type = null
/datum/armor/eldritch_armor/void
melee = 40
diff --git a/code/modules/antagonists/heretic/knowledge/lock_lore.dm b/code/modules/antagonists/heretic/knowledge/lock_lore.dm
index 25e2af0ac6c6..29d3f4fe18e4 100644
--- a/code/modules/antagonists/heretic/knowledge/lock_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/lock_lore.dm
@@ -225,6 +225,12 @@
holywater_drain_amount = 0.33
notice = "• Cannot be used near living sentient beings.
• Cancelled if you are hit with an anti-magic item."
+/datum/heretic_knowledge/spell/caretaker_refuge/has_charges(mob/living/user)
+ return user.has_status_effect(/datum/status_effect/caretaker_refuge) || ..()
+
+/datum/heretic_knowledge/spell/caretaker_refuge/should_deduct_charge(mob/living/user)
+ return !user.has_status_effect(/datum/status_effect/caretaker_refuge)
+
/datum/heretic_knowledge/ultimate/lock_final
name = "Unlock the Labyrinth"
desc = "The ascension ritual of the Path of Knock. \
diff --git a/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_four.dm b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_four.dm
index 51a8f8a4ecc3..eaf21689dc1c 100644
--- a/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_four.dm
+++ b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_four.dm
@@ -19,6 +19,12 @@
/// Tracks tim ein EVA
var/seconds_in_eva = 0
+/datum/heretic_knowledge/spell/space_phase/has_charges(mob/living/user)
+ return HAS_TRAIT(user, TRAIT_MAGICALLY_PHASED) || ..()
+
+/datum/heretic_knowledge/spell/space_phase/should_deduct_charge(mob/living/user)
+ return !HAS_TRAIT(user, TRAIT_MAGICALLY_PHASED)
+
/datum/heretic_knowledge/spell/space_phase/on_gain(mob/user, datum/antagonist/heretic/our_heretic)
. = ..()
RegisterSignal(user, COMSIG_MOB_CRUSHED_BLUESPACE_CRYSTAL, PROC_REF(on_crystal_crushed))
diff --git a/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_one.dm b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_one.dm
index 2dddb2affe20..66c8f5f4a002 100644
--- a/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_one.dm
+++ b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_one.dm
@@ -23,7 +23,7 @@
/datum/heretic_knowledge/medallion
name = "Ashen Eyes"
desc = "Sculpt an Eldritch Medallion.
\
- The Eldritch Medallion grants you thermal vision while worn, and also functions as a focus."
+ The Eldritch Medallion grants you thermal vision while worn."
transmute_text = "Transmute a pair of eyes, a candle, and a glass shard."
gain_text = "Piercing eyes guided them through the mundane. Neither darkness nor terror could stop them."
required_atoms = list(
diff --git a/code/modules/antagonists/heretic/magic/caretaker.dm b/code/modules/antagonists/heretic/magic/caretaker.dm
index f2f30747b465..9e5da1b7fd3d 100644
--- a/code/modules/antagonists/heretic/magic/caretaker.dm
+++ b/code/modules/antagonists/heretic/magic/caretaker.dm
@@ -17,8 +17,7 @@
spell_requirements = NONE
/datum/action/cooldown/spell/caretaker/Remove(mob/living/remove_from)
- if(remove_from.has_status_effect(/datum/status_effect/caretaker_refuge))
- remove_from.remove_status_effect(/datum/status_effect/caretaker_refuge)
+ remove_from.remove_status_effect(/datum/status_effect/caretaker_refuge)
return ..()
/datum/action/cooldown/spell/caretaker/is_valid_target(atom/cast_on)
diff --git a/code/modules/antagonists/heretic/status_effects/heretic_passive.dm b/code/modules/antagonists/heretic/status_effects/heretic_passive.dm
index f59e9cbd26ac..f06583c4698b 100644
--- a/code/modules/antagonists/heretic/status_effects/heretic_passive.dm
+++ b/code/modules/antagonists/heretic/status_effects/heretic_passive.dm
@@ -92,7 +92,7 @@
"Resistance to high and low pressure."
)
/// Tracks total seconds nearby mobs are on fire, used to determine when to recharge spells
- var/seconds_of_fire = 0
+ VAR_PRIVATE/seconds_of_fire = 0
/datum/status_effect/heretic_passive/ash/on_apply()
. = ..()
@@ -113,8 +113,8 @@
/datum/status_effect/heretic_passive/ash/tick(seconds_between_ticks)
. = ..()
var/seconds_gained = 0
- for(var/mob/living/nearby_guy in view(owner, 3))
- if(!nearby_guy.on_fire || nearby_guy.stat == DEAD || nearby_guy == owner)
+ for(var/mob/living/nearby_guy in oview(owner, 3))
+ if(nearby_guy.stat == DEAD || !nearby_guy.on_fire)
continue
if(ismonkey(nearby_guy) && isnull(nearby_guy.mind))
continue
@@ -318,7 +318,7 @@
if(!isliving(target) || target == source || target.stat <= HARD_CRIT)
return
- if(locate(/obj/effect/forcefield/cosmic_field) in target.loc)
+ if(locate(/obj/effect/forcefield/cosmic_field) in range(1, target))
addtimer(CALLBACK(src, PROC_REF(check_crit), target), 0.2 SECONDS, TIMER_DELETE_ME|TIMER_UNIQUE)
/datum/status_effect/heretic_passive/cosmic/proc/check_crit(mob/living/target)
@@ -699,19 +699,18 @@
/datum/status_effect/heretic_passive/void
name = "Aristocrat's Way"
id = "void_passive"
- recharge_description = "Recharge spells by knocking foes who are exposed to sub-zero temperature into critical condition."
+ recharge_description = "Recharge spells by freezing nearby foes."
passive_descriptions = list(
"Cold and low pressure immunity.",
"You no longer need to breathe.",
"Water, ice and slippery surfaces no slip you."
)
-
- var/list/gained_charges_from
+ /// Tracks total seconds nearby mobs are exposed to cold temperature, used to determine when to recharge spells
+ VAR_PRIVATE/seconds_of_cold = 0
/datum/status_effect/heretic_passive/void/on_apply()
. = ..()
owner.add_traits(list(TRAIT_RESISTCOLD, TRAIT_RESISTLOWPRESSURE), REF(src))
- RegisterSignal(owner, COMSIG_USER_PRE_ITEM_ATTACK, PROC_REF(hit_someone))
/datum/status_effect/heretic_passive/void/heretic_level_upgrade()
. = ..()
@@ -724,27 +723,27 @@
/datum/status_effect/heretic_passive/void/on_remove()
. = ..()
owner.remove_traits(list(TRAIT_RESISTCOLD, TRAIT_RESISTLOWPRESSURE, TRAIT_NOBREATH, TRAIT_NO_SLIP_WATER, TRAIT_NO_SLIP_ICE, TRAIT_NO_SLIP_SLIDE), REF(src))
- UnregisterSignal(owner, COMSIG_USER_PRE_ITEM_ATTACK)
-
-/datum/status_effect/heretic_passive/void/proc/hit_someone(mob/living/source, mob/living/target, obj/item/used_weapon)
- SIGNAL_HANDLER
- if(!isliving(target) || target == source || target.stat <= HARD_CRIT || LAZYFIND(gained_charges_from, REF(target)))
- return
+/datum/status_effect/heretic_passive/void/tick(seconds_between_ticks)
+ . = ..()
+ var/seconds_gained = 0
+ for(var/mob/living/nearby_guy in oview(owner, 4))
+ // -75c required - easily achievable with void chill but can also be achieved via spacing (even on icebox)
+ if(nearby_guy.stat == DEAD || nearby_guy.bodytemperature > T0C - 75)
+ continue
+ if(ismonkey(nearby_guy) && isnull(nearby_guy.mind))
+ continue
- var/turf/target_turf = get_turf(target)
- if(target_turf?.GetTemperature() <= T0C)
- addtimer(CALLBACK(src, PROC_REF(check_crit), target), 0.2 SECONDS, TIMER_DELETE_ME|TIMER_UNIQUE)
+ seconds_gained += seconds_between_ticks
+ if(seconds_gained >= 6)
+ break
-/datum/status_effect/heretic_passive/void/proc/check_crit(mob/living/target)
- if(QDELETED(target) || target.stat == STABLE)
+ seconds_of_cold += seconds_gained
+ if(seconds_of_cold < 30)
return
- LAZYADD(gained_charges_from, REF(target))
- addtimer(CALLBACK(src, PROC_REF(remove_gained_from), REF(target)), 5 MINUTES, TIMER_DELETE_ME|TIMER_UNIQUE)
- recharge_spells()
-/datum/status_effect/heretic_passive/void/proc/remove_gained_from(target_ref)
- LAZYREMOVE(gained_charges_from, target_ref)
+ seconds_of_cold = 0
+ recharge_spells()
#undef HERETIC_LEVEL_START
#undef HERETIC_LEVEL_UPGRADE
diff --git a/code/modules/antagonists/nightmare/nightmare.dm b/code/modules/antagonists/nightmare/nightmare.dm
index a6157b8f27df..8a60c99b9aab 100644
--- a/code/modules/antagonists/nightmare/nightmare.dm
+++ b/code/modules/antagonists/nightmare/nightmare.dm
@@ -16,6 +16,7 @@
/datum/antagonist/nightmare/on_gain()
forge_objectives()
. = ..()
+ owner.set_assigned_role(SSjob.get_job_type(/datum/job/nightmare))
/datum/antagonist/nightmare/apply_innate_effects(mob/living/mob_override)
var/mob/living/nightmare = mob_override || owner.current
diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm
index 68efc07663b6..29d8275bd2d9 100644
--- a/code/modules/antagonists/revolution/revolution.dm
+++ b/code/modules/antagonists/revolution/revolution.dm
@@ -426,7 +426,7 @@
for(var/datum/mind/khrushchev as anything in members - head_revolutionaries)
if(!can_be_headrev(khrushchev))
continue
- if(ismonkey(khrushchev.current))
+ if(HAS_TRAIT(khrushchev.current, TRAIT_LESSER_HUMANOID))
monkey_promotable += khrushchev
else
promotable += khrushchev
diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm
index d76d90a35c83..aabba56c4c09 100644
--- a/code/modules/antagonists/wizard/wizard.dm
+++ b/code/modules/antagonists/wizard/wizard.dm
@@ -94,6 +94,7 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key)
owner.add_traits(list(TRAIT_MAGICALLY_GIFTED, TRAIT_SEE_BLESSED_TILES), REF(src))
for(var/datum/atom_hud/alternate_appearance/basic/blessed_aware/blessed_hud in GLOB.active_alternate_appearances)
blessed_hud.check_hud(owner.current)
+ owner.set_assigned_role(SSjob.get_job_type(/datum/job/space_wizard))
/datum/antagonist/wizard/Destroy()
QDEL_NULL(ritual)
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index b0f0604ae1ad..5b65ba076aed 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -1,7 +1,7 @@
/// Returns reactions which will contribute to a hotspot's size.
/proc/init_hotspot_reactions()
var/list/fire_reactions = list()
- for (var/datum/gas_reaction/reaction as anything in subtypesof(/datum/gas_reaction))
+ for (var/datum/gas_reaction/standard/reaction as anything in subtypesof(/datum/gas_reaction/standard))
if(initial(reaction.expands_hotspot))
fire_reactions += reaction
diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
index 672a177671de..3378a524e0e5 100644
--- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
@@ -523,7 +523,7 @@ GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm
//It might be worth looking into updating these after each reaction, but that makes us care more about order of operations, so be careful
var/temp = temperature
reaction_loop:
- for(var/datum/gas_reaction/reaction as anything in reactions)
+ for(var/datum/gas_reaction/standard/reaction as anything in reactions)
var/list/reqs = reaction.requirements
if((reqs["MIN_TEMP"] && temp < reqs["MIN_TEMP"]) || (reqs["MAX_TEMP"] && temp > reqs["MAX_TEMP"]))
@@ -743,7 +743,7 @@ GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm
*/
/datum/gas_mixture/proc/electrolyze(working_power = 0, electrolyzer_args = list())
for(var/reaction in GLOB.electrolyzer_reactions)
- var/datum/electrolyzer_reaction/current_reaction = GLOB.electrolyzer_reactions[reaction]
+ var/datum/gas_reaction/electrolyzer/current_reaction = GLOB.electrolyzer_reactions[reaction]
if(!current_reaction.reaction_check(air_mixture = src, electrolyzer_args = electrolyzer_args))
continue
diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm
index 54a86a334532..a831d05135cf 100644
--- a/code/modules/atmospherics/gasmixtures/gas_types.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_types.dm
@@ -13,7 +13,7 @@
if (gas_info[META_GAS_MOLES_VISIBLE][gas_path])
gas_info[META_GAS_OVERLAY][gas_path] += generate_gas_overlays(0, SSmapping.max_plane_offset, gas_path)
gas_info[META_GAS_FUSION_POWER][gas_path] = initial(gas_path.fusion_power)
- gas_info[META_GAS_DANGER][gas_path] = initial(gas_path.dangerous)
+ gas_info[META_GAS_DANGER][gas_path] = initial(gas_path.cargo_flags) & GAS_DANGEROUS
gas_info[META_GAS_ID][gas_path] = initial(gas_path.id)
gas_info[META_GAS_DESC][gas_path] = initial(gas_path.desc)
@@ -39,44 +39,44 @@
return path
return ""
-/*||||||||||||||/----------\||||||||||||||*\
-||||||||||||||||[GAS DATUMS]||||||||||||||||
-||||||||||||||||\__________/||||||||||||||||
-|||| These should never be instantiated. ||||
-|||| They exist only to make it easier ||||
-|||| to add a new gas. They are accessed ||||
-|||| only by meta_gas_list(). ||||
-\*||||||||||||||||||||||||||||||||||||||||*/
-
-//This is a plot created using the values for gas exports. Each gas has a value that works as its kind of soft-cap, which limits you from making billions of credits per sale, based on the base_value variable on the gasses themselves. Most of these gasses as a result have a rather low value when sold, like nitrogen and oxygen at 1500 and 600 respectively at their maximum value. The
+/**
+ * # Gas datums
+ *
+ * These are never and should never be instantiated,
+ * they just exist to hold data which is passed into the gas metadata list.
+ *
+ * They are templates for how gases should generally act.
+ */
/datum/gas
var/id = ""
var/specific_heat = 0
var/name = ""
+ var/desc
///icon_state in icons/effects/atmospherics.dmi
var/gas_overlay = ""
var/moles_visible = null
- ///currently used by canisters
- var/dangerous = FALSE
///How much the gas accelerates a fusion reaction
var/fusion_power = 0
/// relative rarity compared to other gases, used when setting up the reactions list.
var/rarity = 0
- ///Can gas of this type can purchased through cargo?
- var/purchaseable = FALSE
- ///How does a single mole of this gas sell for? Formula to calculate maximum value is in code\modules\cargo\exports\large_objects.dm. Doesn't matter for roundstart gasses.
+ /// Flags that relate to how the gas is handled in cargo
+ /// GAS_PURCHASABLE - Can be purchased in cargo
+ /// GAS_EXPORTABLE - Can be sold in cargo
+ /// GAS_DANGEROUS - Is considered dangerous, requires elevated access to purchase
+ var/cargo_flags = NONE
+ /// How does a single mole of this gas buy/sell for?
+ /// Formula to calculate maximum value is in [code\modules\cargo\exports\large_objects.dm].
+ /// Only necessary for exportable or purchasable gases, otherwise meaningless.
var/base_value = 0
- var/desc
- ///RGB code for use when a generic color representing the gas is needed. Colors taken from contants.ts
+ /// RGB code for use when a generic color representing the gas is needed. Colors taken from contants.ts
var/primary_color
-
/datum/gas/oxygen
id = GAS_O2
specific_heat = 20
name = "Oxygen"
rarity = 900
- purchaseable = TRUE
+ cargo_flags = GAS_PURCHASABLE
base_value = 0.2
desc = "The gas most life forms need to be able to survive. Also an oxidizer."
primary_color = "#0000ff"
@@ -86,7 +86,7 @@
specific_heat = 20
name = "Nitrogen"
rarity = 1000
- purchaseable = TRUE
+ cargo_flags = GAS_PURCHASABLE
base_value = 0.1
desc = "A very common gas that used to pad artificial atmospheres to habitable pressure."
primary_color = "#ffff00"
@@ -95,11 +95,11 @@
id = GAS_CO2
specific_heat = 30
name = "Carbon Dioxide"
- dangerous = TRUE
rarity = 700
- purchaseable = TRUE
+ cargo_flags = GAS_PURCHASABLE | GAS_DANGEROUS
base_value = 0.2
- desc = "What the fuck is carbon dioxide?"
+ desc = "What the fuck is Carbon Dioxide?"
+ // desc = "A colorless, odorless gas commonly produced by respiration and combustion. Potentially dangerous when inhaled in high concentrations."
primary_color = COLOR_GRAY
/datum/gas/plasma
@@ -108,10 +108,10 @@
name = "Plasma"
gas_overlay = "plasma"
moles_visible = MOLES_GAS_VISIBLE
- dangerous = TRUE
+ cargo_flags = GAS_DANGEROUS
rarity = 800
base_value = 1.5
- desc = "A flammable gas with many other curious properties. Its research is one of NT's primary objective."
+ desc = "A flammable gas with many curious properties. Its research is one of Nanotrasen's primary objectives."
primary_color = "#ffc0cb"
/datum/gas/water_vapor
@@ -122,7 +122,7 @@
moles_visible = MOLES_GAS_VISIBLE
fusion_power = 8
rarity = 500
- purchaseable = TRUE
+ cargo_flags = GAS_PURCHASABLE
base_value = 0.5
desc = "Water, in gas form. Makes floors slippery and washes items on them."
primary_color = "#b0c4de"
@@ -130,13 +130,14 @@
/datum/gas/hypernoblium
id = GAS_HYPER_NOBLIUM
specific_heat = 2000
- name = "Hyper-noblium"
+ name = "Hyper-Noblium"
gas_overlay = "freon"
moles_visible = MOLES_GAS_VISIBLE
fusion_power = 10
rarity = 50
+ cargo_flags = GAS_EXPORTABLE
base_value = 2.5
- desc = "The most noble gas of them all. High quantities of hyper-noblium actively prevents reactions from occurring."
+ desc = "The most noble gas of them all. High quantities actively prevents reactions from occurring."
primary_color = COLOR_TEAL
/datum/gas/nitrous_oxide
@@ -146,11 +147,11 @@
gas_overlay = "nitrous_oxide"
moles_visible = MOLES_GAS_VISIBLE * 2
fusion_power = 10
- dangerous = TRUE
rarity = 600
- purchaseable = TRUE
+ cargo_flags = GAS_PURCHASABLE | GAS_DANGEROUS
base_value = 1.5
- desc = "Causes drowsiness, euphoria, and eventually unconsciousness."
+ desc = "A gas known to causes drowsiness, euphoria, and eventually unconsciousness. \
+ Commonly used as an anesthetic for surgical procedures, and occasionally, as a recreational drug."
primary_color = "#ffe4c4"
/datum/gas/nitrium
@@ -160,10 +161,10 @@
fusion_power = 7
gas_overlay = "nitrium"
moles_visible = MOLES_GAS_VISIBLE
- dangerous = TRUE
+ cargo_flags = GAS_PURCHASABLE | GAS_DANGEROUS
rarity = 1
base_value = 6
- desc = "An experimental performance enhancing gas. Nitrium can have amplified effects as more of it gets into your bloodstream."
+ desc = "An experimental (and slightly toxic) performance enhancing gas that increases speed and alertness when inhaled."
primary_color = "#a52a2a"
/datum/gas/tritium
@@ -172,7 +173,7 @@
name = "Tritium"
gas_overlay = "tritium"
moles_visible = MOLES_GAS_VISIBLE
- dangerous = TRUE
+ cargo_flags = GAS_DANGEROUS | GAS_EXPORTABLE
fusion_power = 5
rarity = 300
base_value = 2.5
@@ -183,10 +184,9 @@
id = GAS_BZ
specific_heat = 20
name = "BZ"
- dangerous = TRUE
fusion_power = 8
rarity = 400
- purchaseable = TRUE
+ cargo_flags = GAS_PURCHASABLE | GAS_EXPORTABLE | GAS_DANGEROUS
base_value = 1.5
desc = "A powerful hallucinogenic nerve agent able to induce cognitive damage."
primary_color = "#9370db"
@@ -197,40 +197,43 @@
name = "Pluoxium"
fusion_power = -10
rarity = 200
+ cargo_flags = GAS_EXPORTABLE
base_value = 2.5
- desc = "A gas that could supply even more oxygen to the bloodstream when inhaled, without being an oxidizer."
+ desc = "An alternative to oxygen that is eight times more efficient at lung diffusion \
+ and even has minor healing properties - while itself not being an oxidizer."
primary_color = "#7b68ee"
/datum/gas/miasma
id = GAS_MIASMA
specific_heat = 20
name = "Miasma"
- dangerous = TRUE
+ cargo_flags = GAS_DANGEROUS | GAS_EXPORTABLE
gas_overlay = "miasma"
moles_visible = MOLES_GAS_VISIBLE * 60
rarity = 250
base_value = 1
- desc = "Not necessarily a gas, miasma refers to biological pollutants found in the atmosphere."
+ desc = "Miasma is not necessarily a gas, but more broadly refers to biological pollutants \
+ found in the atmosphere known to cause disease and nausea."
primary_color = COLOR_OLIVE
/datum/gas/freon
id = GAS_FREON
specific_heat = 600
name = "Freon"
- dangerous = TRUE
+ cargo_flags = GAS_DANGEROUS | GAS_EXPORTABLE
gas_overlay = "freon"
moles_visible = MOLES_GAS_VISIBLE *30
fusion_power = -5
rarity = 10
base_value = 5
- desc = "A coolant gas. Mainly used for its endothermic reaction with oxygen."
+ desc = "A coolant gas. Primarily used for its endothermic reaction with oxygen."
primary_color = "#afeeee"
/datum/gas/hydrogen
id = GAS_HYDROGEN
specific_heat = 15
name = "Hydrogen"
- dangerous = TRUE
+ cargo_flags = GAS_DANGEROUS | GAS_EXPORTABLE
fusion_power = 2
rarity = 600
base_value = 1
@@ -241,48 +244,50 @@
id = GAS_HEALIUM
specific_heat = 10
name = "Healium"
- dangerous = TRUE
+ cargo_flags = GAS_DANGEROUS | GAS_EXPORTABLE
gas_overlay = "healium"
moles_visible = MOLES_GAS_VISIBLE
rarity = 300
base_value = 5.5
- desc = "Causes deep, regenerative sleep."
+ desc = "An experimental alternative to anesthetic that induces a state of unconsciousness \
+ that accelerates healing and regeneration when inhaled."
primary_color = "#fa8072"
/datum/gas/proto_nitrate
id = GAS_PROTO_NITRATE
specific_heat = 30
- name = "Proto Nitrate"
- dangerous = TRUE
+ name = "Proto-Nitrate"
+ cargo_flags = GAS_DANGEROUS | GAS_EXPORTABLE
gas_overlay = "proto_nitrate"
moles_visible = MOLES_GAS_VISIBLE
rarity = 200
base_value = 2.5
- desc = "A very volatile gas that reacts differently with various gases."
+ desc = "A volatile gas that has wildly different reactions with other gases."
primary_color = "#adff2f"
/datum/gas/zauker
id = GAS_ZAUKER
specific_heat = 350
name = "Zauker"
- dangerous = TRUE
+ cargo_flags = GAS_DANGEROUS | GAS_EXPORTABLE
gas_overlay = "zauker"
moles_visible = MOLES_GAS_VISIBLE
rarity = 1
base_value = 7
- desc = "A highly toxic gas, its production is highly regulated on top of being difficult. It also breaks down when in contact with nitrogen."
+ desc = "A highly toxic gas and difficult to produce gas. \
+ It breaks down when in contact with Nitrogen, making it relatively safe in Earth-like atmospheres."
primary_color = "#006400"
/datum/gas/halon
id = GAS_HALON
specific_heat = 175
name = "Halon"
- dangerous = TRUE
+ cargo_flags = GAS_DANGEROUS | GAS_EXPORTABLE
gas_overlay = "halon"
moles_visible = MOLES_GAS_VISIBLE
rarity = 300
base_value = 4
- desc = "A potent fire suppressant. Removes oxygen from high temperature fires and cools down the area"
+ desc = "A potent fire suppressant. It removes Oxygen from high temperature fires and cools down the area."
primary_color = COLOR_PURPLE
/datum/gas/helium
@@ -291,21 +296,24 @@
name = "Helium"
fusion_power = 7
rarity = 50
+ cargo_flags = GAS_EXPORTABLE
base_value = 3.5
- desc = "A very inert gas produced by the fusion of hydrogen and its derivatives."
+ desc = "An inert noble gas produced by the fusion of Hydrogen and its derivatives. \
+ Commonly known for being lighter than air and its ability to raise voice pitch when inhaled."
primary_color = "#f0f8ff"
/datum/gas/antinoblium
id = GAS_ANTINOBLIUM
specific_heat = 1
- name = "Antinoblium"
- dangerous = TRUE
+ name = "Anti-Noblium"
+ cargo_flags = GAS_DANGEROUS | GAS_EXPORTABLE
gas_overlay = "antinoblium"
moles_visible = MOLES_GAS_VISIBLE
fusion_power = 20
rarity = 1
base_value = 10
- desc = "We still don't know what it does, but it sells for a lot."
+ desc = "A mysterious and highly reactive gas known to replicate itself. \
+ It is highly sought after due to its rarity, and will export for a high price."
primary_color = COLOR_MAROON
/obj/effect/overlay/gas
@@ -329,4 +337,3 @@
/obj/effect/overlay/gas/Initialize(mapload)
. = ..()
SET_PLANE_W_SCALAR(src, initial(plane), plane_offset)
-
diff --git a/code/modules/atmospherics/gasmixtures/reaction_factors.dm b/code/modules/atmospherics/gasmixtures/reaction_factors.dm
index 329cb1b733b1..75d1dc8de168 100644
--- a/code/modules/atmospherics/gasmixtures/reaction_factors.dm
+++ b/code/modules/atmospherics/gasmixtures/reaction_factors.dm
@@ -1,216 +1,276 @@
-/datum/gas_reaction/water_vapor/init_factors()
+/datum/gas_reaction/standard/water_vapor/init_factors()
factor = list(
- /datum/gas/water_vapor = "Condensation will consume [MOLES_GAS_VISIBLE] moles, freezing will not consume any. Both needs a minimum of [MOLES_GAS_VISIBLE] moles to occur.",
- "Temperature" = "Freezes a turf at [WATER_VAPOR_DEPOSITION_POINT] Kelvins or below, wets it at [WATER_VAPOR_CONDENSATION_POINT] Kelvins or below.",
- "Location" = "Can only happen on turfs.",
+ /datum/gas/water_vapor = "Condensation will consume [MOLES_GAS_VISIBLE] moles. \
+ Freezing will not consume any. Both requires a minimum of [MOLES_GAS_VISIBLE] moles to occur.",
+ "Temperature" = "Freezes a tile at [WATER_VAPOR_DEPOSITION_POINT]K or below, \
+ wets it at [WATER_VAPOR_CONDENSATION_POINT]K or below.",
+ "Location" = "Can only happen on tiles.",
)
-/datum/gas_reaction/miaster/init_factors()
+/datum/gas_reaction/standard/miaster/init_factors()
factor = list(
- /datum/gas/miasma = "Miasma is sterilized at a rate that scales with the difference between the temperature and [MIASTER_STERILIZATION_TEMP]K.",
- /datum/gas/oxygen = "One mole of oxygen is released per mole of miasma consumed.",
- "Temperature" = "Higher temperature increases the speed of miasma sterilization.",
- "Energy" = "[MIASTER_STERILIZATION_ENERGY] joules of energy is released per mole of miasma sterilized.",
+ /datum/gas/miasma = "[/datum/gas/miasma::name] is sterilized at a rate that scales \
+ with the difference between the temperature and [MIASTER_STERILIZATION_TEMP]K.",
+ /datum/gas/oxygen = "One mole of [/datum/gas/oxygen::name] is released per mole of [/datum/gas/miasma::name] consumed.",
+ "Temperature" = "Higher temperature increases the speed of [/datum/gas/miasma::name] sterilization.",
+ "Energy" = "[MIASTER_STERILIZATION_ENERGY] joules of energy is released per mole of [/datum/gas/miasma::name] sterilized.",
)
-/datum/gas_reaction/plasmafire/init_factors()
+/datum/gas_reaction/standard/plasmafire/init_factors()
factor = list(
- /datum/gas/oxygen = "Oxygen consumption is determined by the temperature, ranging from [OXYGEN_BURN_RATIO_BASE] moles per mole of plasma consumed at [PLASMA_MINIMUM_BURN_TEMPERATURE] Kelvins to [OXYGEN_BURN_RATIO_BASE-1] moles per mole of plasma consumed at [PLASMA_UPPER_TEMPERATURE] Kelvins. Higher oxygen concentration up to [PLASMA_OXYGEN_FULLBURN] times the plasma increases the speed of plasma consumption.",
- /datum/gas/plasma = "Plasma is consumed at a rate that scales with the difference between the temperature and [PLASMA_MINIMUM_BURN_TEMPERATURE]K, with maximum scaling at [PLASMA_UPPER_TEMPERATURE]K.",
- /datum/gas/tritium = "Tritium is formed at 1 mole per mole of plasma consumed if there are at least 97 times more oxygen than plasma.",
- /datum/gas/water_vapor = "Water vapor is formed at 0.25 moles per mole of plasma consumed if tritium isn't being formed.",
- /datum/gas/carbon_dioxide = "Carbon Dioxide is formed at 0.75 moles per mole of plasma consumed if tritium isn't being formed.",
- "Temperature" = "Minimum temperature of [PLASMA_MINIMUM_BURN_TEMPERATURE] kelvin to occur. Higher temperature up to [PLASMA_UPPER_TEMPERATURE]K increases the oxygen efficiency and also the plasma consumption rate.",
- "Energy" = "[FIRE_PLASMA_ENERGY_RELEASED] joules of energy is released per mole of plasma consumed.",
+ /datum/gas/oxygen = "[/datum/gas/oxygen::name] consumption is determined by the temperature, \
+ ranging from [OXYGEN_BURN_RATIO_BASE] moles per mole of [/datum/gas/plasma::name] consumed at [PLASMA_MINIMUM_BURN_TEMPERATURE]K \
+ to [OXYGEN_BURN_RATIO_BASE-1] moles per mole of [/datum/gas/plasma::name] consumed at [PLASMA_UPPER_TEMPERATURE]K. \
+ Higher [/datum/gas/oxygen::name] concentration up to [PLASMA_OXYGEN_FULLBURN] times the [/datum/gas/plasma::name] \
+ increases the speed of [/datum/gas/plasma::name] consumption.",
+ /datum/gas/plasma = "[/datum/gas/plasma::name] is consumed at a rate that scales with the difference between the temperature \
+ and [PLASMA_MINIMUM_BURN_TEMPERATURE]K, with maximum scaling at [PLASMA_UPPER_TEMPERATURE]K.",
+ /datum/gas/tritium = "[/datum/gas/tritium::name] is formed at 1 mole per mole of [/datum/gas/plasma::name] consumed \
+ if there are at least 97 times more [/datum/gas/oxygen::name] than [/datum/gas/plasma::name].",
+ /datum/gas/water_vapor = "[/datum/gas/water_vapor::name] is formed at 0.25 moles per mole of [/datum/gas/plasma::name] consumed \
+ if [/datum/gas/tritium::name] isn't being formed.",
+ /datum/gas/carbon_dioxide = "[/datum/gas/carbon_dioxide::name] is formed at 0.75 moles per mole of [/datum/gas/plasma::name] consumed \
+ if [/datum/gas/tritium::name] isn't being formed.",
+ "Temperature" = "Minimum temperature of [PLASMA_MINIMUM_BURN_TEMPERATURE]K to occur. \
+ Higher temperature up to [PLASMA_UPPER_TEMPERATURE]K increases the [/datum/gas/oxygen::name] efficiency \
+ and also the [/datum/gas/plasma::name] consumption rate.",
+ "Energy" = "[FIRE_PLASMA_ENERGY_RELEASED] joules of energy is released per mole of [/datum/gas/plasma::name] consumed.",
)
-/datum/gas_reaction/h2fire/init_factors()
+/datum/gas_reaction/standard/h2fire/init_factors()
factor = list(
- /datum/gas/oxygen = "Oxygen is consumed at 0.5 moles per mole of hydrogen consumed. Higher oxygen concentration up to [HYDROGEN_OXYGEN_FULLBURN] times the hydrogen increases the hydrogen consumption rate.",
- /datum/gas/hydrogen = "Hydrogen is consumed rapidly fast as long as there's enough oxygen to allow combustion.",
- /datum/gas/water_vapor = "Water vapor is produced at 1 mole per mole of hydrogen combusted.",
- "Temperature" = "Minimum temperature of [FIRE_MINIMUM_TEMPERATURE_TO_EXIST] kelvin to occur",
- "Energy" = "[FIRE_HYDROGEN_ENERGY_RELEASED] joules of energy is released per mol of hydrogen consumed.",
+ /datum/gas/oxygen = "[/datum/gas/oxygen::name] is consumed at 0.5 moles per mole of [/datum/gas/hydrogen::name] consumed. \
+ Higher [/datum/gas/oxygen::name] concentration up to [HYDROGEN_OXYGEN_FULLBURN] times \
+ the [/datum/gas/hydrogen::name] increases the [/datum/gas/hydrogen::name] consumption rate.",
+ /datum/gas/hydrogen = "[/datum/gas/hydrogen::name] is consumed rapidly fast as long as there's enough [/datum/gas/oxygen::name] to allow combustion.",
+ /datum/gas/water_vapor = "[/datum/gas/water_vapor::name] is produced at 1 mole per mole of [/datum/gas/hydrogen::name] combusted.",
+ "Temperature" = "Minimum temperature of [FIRE_MINIMUM_TEMPERATURE_TO_EXIST]K to occur",
+ "Energy" = "[FIRE_HYDROGEN_ENERGY_RELEASED] joules of energy is released per mol of [/datum/gas/hydrogen::name] consumed.",
)
-/datum/gas_reaction/tritfire/init_factors()
+/datum/gas_reaction/standard/tritfire/init_factors()
factor = list(
- /datum/gas/oxygen = "Oxygen is consumed at 0.5 moles per mole of tritium consumed. Higher oxygen concentration up to [TRITIUM_OXYGEN_FULLBURN] times the tritium increases the tritium consumption rate.",
- /datum/gas/tritium = "Tritium is consumed at rapidly fast as long as there's enough oxygen to allow combustion.",
- /datum/gas/water_vapor = "Water vapor is produced at 1 mole per mole of tritium combusted.",
- "Temperature" = "Minimum temperature of [FIRE_MINIMUM_TEMPERATURE_TO_EXIST] kelvin to occur",
- "Energy" = "[FIRE_TRITIUM_ENERGY_RELEASED] joules of energy is released per mol of tritium consumed.",
+ /datum/gas/oxygen = "[/datum/gas/oxygen::name] is consumed at 0.5 moles per mole of [/datum/gas/tritium::name] consumed. \
+ Higher [/datum/gas/oxygen::name] concentration up to [TRITIUM_OXYGEN_FULLBURN] times \
+ the [/datum/gas/tritium::name] increases the [/datum/gas/tritium::name] consumption rate.",
+ /datum/gas/tritium = "[/datum/gas/tritium::name] is consumed at rapidly fast as long as there's enough [/datum/gas/oxygen::name] to allow combustion.",
+ /datum/gas/water_vapor = "[/datum/gas/water_vapor::name] is produced at 1 mole per mole of [/datum/gas/tritium::name] combusted.",
+ "Temperature" = "Minimum temperature of [FIRE_MINIMUM_TEMPERATURE_TO_EXIST]K to occur",
+ "Energy" = "[FIRE_TRITIUM_ENERGY_RELEASED] joules of energy is released per mol of [/datum/gas/tritium::name] consumed.",
"Radiation" = "This reaction emits radiation proportional to the amount of energy released.",
)
-/datum/gas_reaction/freonfire/init_factors()
+/datum/gas_reaction/standard/freonfire/init_factors()
factor = list(
- /datum/gas/oxygen = "Oxygen consumption is determined by the temperature, ranging from [OXYGEN_BURN_RATIO_BASE] moles per mole of freon consumed at [FREON_LOWER_TEMPERATURE] Kelvins to [OXYGEN_BURN_RATIO_BASE-1] moles per mole of freon consumed at [FREON_MAXIMUM_BURN_TEMPERATURE] Kelvins. Higher oxygen concentration up to [FREON_OXYGEN_FULLBURN] times the freon increases freon consumption rate.",
- /datum/gas/freon = "Freon is consumed at a rate that scales with the distance of the temperature from [FREON_MAXIMUM_BURN_TEMPERATURE]K. Its relationship with oxygen also determines consumption rate.",
- /datum/gas/carbon_dioxide = "Carbon Dioxide is formed at 1 mole per mole of freon consumed.",
- "Temperature" = "Can only occur between [FREON_LOWER_TEMPERATURE] - [FREON_MAXIMUM_BURN_TEMPERATURE] Kelvin",
- "Energy" = "[FIRE_FREON_ENERGY_CONSUMED] joules of energy is absorbed per mole of freon consumed.",
- "Hot Ice" = "This reaction produces hot ice when occurring between [HOT_ICE_FORMATION_MINIMUM_TEMPERATURE]-[HOT_ICE_FORMATION_MAXIMUM_TEMPERATURE] kelvins",
+ /datum/gas/oxygen = "[/datum/gas/oxygen::name] consumption is determined by the temperature, \
+ ranging from [OXYGEN_BURN_RATIO_BASE] moles per mole of [/datum/gas/freon::name] consumed at [FREON_LOWER_TEMPERATURE]K \
+ to [OXYGEN_BURN_RATIO_BASE - 1] moles per mole of [/datum/gas/freon::name] consumed at [FREON_MAXIMUM_BURN_TEMPERATURE]K. \
+ Higher [/datum/gas/oxygen::name] concentration up to [FREON_OXYGEN_FULLBURN] times \
+ the [/datum/gas/freon::name] increases [/datum/gas/freon::name] consumption rate.",
+ /datum/gas/freon = "[/datum/gas/freon::name] is consumed at a rate that scales with the distance of the temperature \
+ from [FREON_MAXIMUM_BURN_TEMPERATURE]K. Its relationship with [/datum/gas/oxygen::name] also determines consumption rate.",
+ /datum/gas/carbon_dioxide = "[/datum/gas/carbon_dioxide::name] is formed at 1 mole per mole of [/datum/gas/freon::name] consumed.",
+ "Temperature" = "Can only occur between [FREON_LOWER_TEMPERATURE] - [FREON_MAXIMUM_BURN_TEMPERATURE]K.",
+ "Energy" = "[FIRE_FREON_ENERGY_CONSUMED] joules of energy is absorbed per mole of [/datum/gas/freon::name] consumed.",
+ "Hot Ice" = "This reaction produces \"hot ice\" when occurring between [HOT_ICE_FORMATION_MINIMUM_TEMPERATURE]-[HOT_ICE_FORMATION_MAXIMUM_TEMPERATURE]K.",
)
-/datum/gas_reaction/nitrousformation/init_factors()
+/datum/gas_reaction/standard/nitrousformation/init_factors()
factor = list(
- /datum/gas/oxygen = "10 moles of Oxygen needs to be present for the reaction to occur. Oxygen is consumed at 0.5 moles per mole of nitrous oxide formed.",
- /datum/gas/nitrogen = " 20 moles of Nitrogen needs to be present for the reaction to occur. Nitrogen is consumed at 1 mole per mole of nitrous oxide formed.",
- /datum/gas/bz = "5 moles of BZ needs to be present for the reaction to occur. Not consumed.",
- /datum/gas/nitrous_oxide = "Nitrous oxide gets produced rapidly.",
- "Temperature" = "Can only occur between [N2O_FORMATION_MIN_TEMPERATURE] - [N2O_FORMATION_MAX_TEMPERATURE] Kelvin",
- "Energy" = "[N2O_FORMATION_ENERGY] joules of energy is released per mole of nitrous oxide formed.",
+ /datum/gas/oxygen = "10 moles of [/datum/gas/oxygen::name] needs to be present for the reaction to occur. \
+ [/datum/gas/oxygen::name] is consumed at 0.5 moles per mole of [/datum/gas/nitrous_oxide::name] formed.",
+ /datum/gas/nitrogen = " 20 moles of [/datum/gas/nitrogen::name] needs to be present for the reaction to occur. \
+ [/datum/gas/nitrogen::name] is consumed at 1 mole per mole of [/datum/gas/nitrous_oxide::name] formed.",
+ /datum/gas/bz = "5 moles of [/datum/gas/bz::name] needs to be present for the reaction to occur. Not consumed.",
+ /datum/gas/nitrous_oxide = "[/datum/gas/nitrous_oxide::name] gets produced rapidly.",
+ "Temperature" = "Can only occur between [N2O_FORMATION_MIN_TEMPERATURE] - [N2O_FORMATION_MAX_TEMPERATURE]K",
+ "Energy" = "[N2O_FORMATION_ENERGY] joules of energy is released per mole of [/datum/gas/nitrous_oxide::name] formed.",
)
-/datum/gas_reaction/nitrous_decomp/init_factors()
+/datum/gas_reaction/standard/nitrous_decomp/init_factors()
factor = list(
- /datum/gas/nitrous_oxide = "Nitrous Oxide is decomposed at a rate that scales negatively with the distance between the temperature and average of the minimum and maximum temperature of the reaction. Minimum of [MINIMUM_MOLE_COUNT * 2] to occur.", //okay this one isn't made into a define yet.
- /datum/gas/oxygen = "Oxygen is formed at 0.5 moles per mole of nitrous oxide decomposed.",
- /datum/gas/nitrogen = "Nitrogen is formed at 1 mole per mole of nitrous oxide decomposed.",
- "Temperature" = "The decomposition rate scales with the product of the distances between temperature and minimum and maximum temperature. Can only happen between [N2O_DECOMPOSITION_MIN_TEMPERATURE] - [N2O_DECOMPOSITION_MAX_TEMPERATURE] kelvin.",
- "Energy" = "[N2O_DECOMPOSITION_ENERGY] joules of energy is released per mole of nitrous oxide decomposed.",
+ /datum/gas/nitrous_oxide = "[/datum/gas/nitrous_oxide::name] is decomposed at a rate that scales negatively with the distance between \
+ the temperature and average of the minimum and maximum temperature of the reaction. \
+ Minimum of [MINIMUM_MOLE_COUNT * 2] to occur.", //okay this one isn't made into a define yet.
+ /datum/gas/oxygen = "[/datum/gas/oxygen::name] is formed at 0.5 moles per mole of [/datum/gas/nitrous_oxide::name] decomposed.",
+ /datum/gas/nitrogen = "[/datum/gas/nitrogen::name] is formed at 1 mole per mole of [/datum/gas/nitrous_oxide::name] decomposed.",
+ "Temperature" = "The decomposition rate scales with the product of the distances between temperature and minimum and maximum temperature. Can only happen between [N2O_DECOMPOSITION_MIN_TEMPERATURE] - [N2O_DECOMPOSITION_MAX_TEMPERATURE]K.",
+ "Energy" = "[N2O_DECOMPOSITION_ENERGY] joules of energy is released per mole of [/datum/gas/nitrous_oxide::name] decomposed.",
)
-/datum/gas_reaction/bzformation/init_factors()
+/datum/gas_reaction/standard/bzformation/init_factors()
factor = list(
- /datum/gas/plasma = "Each mole of BZ made consumes 0.8 moles of plasma. If there is more plasma than nitrous oxide, bz formation rate gets slowed down.",
- /datum/gas/nitrous_oxide = "Each mole of bz made consumes 0.4 moles of Nitrous oxide. If there is less nitrous oxide than plasma the reaction rate is slowed down. At three times the amount of plasma to Nitrous oxide it will start breaking down into Nitrogen and Oxygen, the lower the ratio the more Nitrous oxide decomposes.",
- /datum/gas/bz = "The lower the pressure and larger the volume the more bz gets made. Less nitrous oxide than plasma will slow down the reaction.",
- /datum/gas/nitrogen = "Each mole Nitrous oxide decomposed makes 1 mol Nitrogen. Lower ratio of Nitrous oxide to Plasma means a higher ratio of decomposition to BZ production.",
- /datum/gas/oxygen = "Each mole Nitrous oxide decomposed makes 0.5 moles Oxygen. Lower ratio of Nitrous oxide to Plasma means a higher ratio of decomposition to BZ production.",
- "Energy" = "[BZ_FORMATION_ENERGY] joules of energy is released per mol of BZ made. Nitrous oxide decomposition releases [N2O_DECOMPOSITION_ENERGY] per mol decomposed",
+ /datum/gas/plasma = "Each mole of [/datum/gas/bz::name] made consumes 0.8 moles of [/datum/gas/plasma::name]. \
+ If there is more [/datum/gas/plasma::name] than [/datum/gas/nitrous_oxide::name], [/datum/gas/bz::name] formation rate gets slowed down.",
+ /datum/gas/nitrous_oxide = "Each mole of [/datum/gas/bz::name] made consumes 0.4 moles of [/datum/gas/nitrous_oxide::name]. \
+ If there is less [/datum/gas/nitrous_oxide::name] than [/datum/gas/plasma::name] the reaction rate is slowed down. \
+ At three times the amount of [/datum/gas/plasma::name] to [/datum/gas/nitrous_oxide::name], \
+ it will start breaking down into [/datum/gas/nitrogen::name] and [/datum/gas/oxygen::name] - \
+ the lower the ratio, the more [/datum/gas/nitrous_oxide::name] decomposes.",
+ /datum/gas/bz = "The lower the pressure and larger the volume the more [/datum/gas/bz::name] gets made. \
+ Less [/datum/gas/nitrous_oxide::name] than [/datum/gas/plasma::name] will slow down the reaction.",
+ /datum/gas/nitrogen = "Each mole [/datum/gas/nitrous_oxide::name] decomposed makes 1 mol [/datum/gas/nitrogen::name]. \
+ Lower ratio of [/datum/gas/nitrous_oxide::name] to [/datum/gas/plasma::name] means a higher ratio of decomposition to [/datum/gas/bz::name] production.",
+ /datum/gas/oxygen = "Each mole [/datum/gas/nitrous_oxide::name] decomposed makes 0.5 moles [/datum/gas/oxygen::name]. \
+ Lower ratio of [/datum/gas/nitrous_oxide::name] to [/datum/gas/plasma::name] means a higher ratio of decomposition to [/datum/gas/bz::name] production.",
+ "Energy" = "[BZ_FORMATION_ENERGY] joules of energy is released per mol of [/datum/gas/bz::name] made. \
+ [/datum/gas/nitrous_oxide::name] decomposition releases [N2O_DECOMPOSITION_ENERGY] per mol decomposed.",
)
-/datum/gas_reaction/pluox_formation/init_factors()
+/datum/gas_reaction/standard/pluox_formation/init_factors()
factor = list(
- /datum/gas/carbon_dioxide = "1 mole of carbon dioxide gets consumed per mole of pluoxium formed.",
- /datum/gas/oxygen = "Oxygen is consumed at 0.5 moles per mole of pluoxium formed.",
- /datum/gas/tritium = "Tritium is converted into hydrogen at 0.01 moles per mole of pluoxium formed.",
- /datum/gas/pluoxium = "Pluoxium is produced at a constant rate in any given mixture.",
- /datum/gas/hydrogen = "Hydrogen is formed from the tritium losing their neutrons.",
- "Energy" = "[PLUOXIUM_FORMATION_ENERGY] joules of energy is released per mole of pluoxium formed.",
- "Temperature" = "Can only occur between [PLUOXIUM_FORMATION_MIN_TEMP] - [PLUOXIUM_FORMATION_MAX_TEMP] Kelvin",
+ /datum/gas/carbon_dioxide = "1 mole of [/datum/gas/carbon_dioxide::name] gets consumed per mole of [/datum/gas/pluoxium::name] formed.",
+ /datum/gas/oxygen = "[/datum/gas/oxygen::name] is consumed at 0.5 moles per mole of [/datum/gas/pluoxium::name] formed.",
+ /datum/gas/tritium = "[/datum/gas/tritium::name] is converted into [/datum/gas/hydrogen::name] at 0.01 moles per mole of [/datum/gas/pluoxium::name] formed.",
+ /datum/gas/pluoxium = "[/datum/gas/pluoxium::name] is produced at a constant rate in any given mixture.",
+ /datum/gas/hydrogen = "[/datum/gas/hydrogen::name] is formed from the [/datum/gas/tritium::name] losing their neutrons.",
+ "Energy" = "[PLUOXIUM_FORMATION_ENERGY] joules of energy is released per mole of [/datum/gas/pluoxium::name] formed.",
+ "Temperature" = "Can only occur between [PLUOXIUM_FORMATION_MIN_TEMP] - [PLUOXIUM_FORMATION_MAX_TEMP]K",
)
-/datum/gas_reaction/nitrium_formation/init_factors()
+/datum/gas_reaction/standard/nitrium_formation/init_factors()
factor = list(
- /datum/gas/bz = "5 moles of BZ needs to be present for the reaction to occur. BZ is consumed at 0.05 moles per mole of nitrium formed.",
- /datum/gas/tritium = "20 moles of tritium needs to be present for the reaction to occur. Tritium is consumed at 1 mole per mole of nitroum formed.",
- /datum/gas/nitrogen = "10 moles of nitrogen needs to be present for the reaction to occur. Nitrogen is consumed at 1 mole per mole of nitrium formed.",
- /datum/gas/nitrium = "Nitrium is produced at a rate that scales with the temperature.",
- "Temperature" = "Can only occur above [NITRIUM_FORMATION_MIN_TEMP] kelvins",
- "Energy" = "[NITRIUM_FORMATION_ENERGY] joules of energy is absorbed per mole of nitrium formed.",
+ /datum/gas/bz = "5 moles of [/datum/gas/bz::name] needs to be present for the reaction to occur. \
+ [/datum/gas/bz::name] is consumed at 0.05 moles per mole of [/datum/gas/nitrium::name] formed.",
+ /datum/gas/tritium = "20 moles of [/datum/gas/tritium::name] needs to be present for the reaction to occur. \
+ [/datum/gas/tritium::name] is consumed at 1 mole per mole of [/datum/gas/nitrium::name] formed.",
+ /datum/gas/nitrogen = "10 moles of [/datum/gas/nitrogen::name] needs to be present for the reaction to occur. \
+ [/datum/gas/nitrogen::name] is consumed at 1 mole per mole of [/datum/gas/nitrium::name] formed.",
+ /datum/gas/nitrium = "[/datum/gas/nitrium::name] is produced at a rate that scales with the temperature.",
+ "Temperature" = "Can only occur above [NITRIUM_FORMATION_MIN_TEMP]K",
+ "Energy" = "[NITRIUM_FORMATION_ENERGY] joules of energy is absorbed per mole of [/datum/gas/nitrium::name] formed.",
)
-/datum/gas_reaction/nitrium_decomposition/init_factors()
+/datum/gas_reaction/standard/nitrium_decomposition/init_factors()
factor = list(
- /datum/gas/oxygen = "[MINIMUM_MOLE_COUNT] moles of oxygen need to be present for the reaction to occur. Not consumed.",
- /datum/gas/nitrium = "Nitrium is consumed at a rate that scales with the temperature.",
- /datum/gas/hydrogen = "Hydrogen is produced at 1 mole per mole of nitrium decomposed.",
- /datum/gas/nitrogen = "Nitrogen is produced at 1 mole per mole of nitrium decomposed.",
- "Temperature" = "Can only occur below [NITRIUM_DECOMPOSITION_MAX_TEMP]. Higher temperature increases the nitrium decomposition rate.",
- "Energy" = "[NITRIUM_DECOMPOSITION_ENERGY] joules of energy is released per mole of nitrium decomposed.",
+ /datum/gas/oxygen = "[MINIMUM_MOLE_COUNT] moles of [/datum/gas/oxygen::name] need to be present for the reaction to occur. Not consumed.",
+ /datum/gas/nitrium = "[/datum/gas/nitrium::name] is consumed at a rate that scales with the temperature.",
+ /datum/gas/hydrogen = "[/datum/gas/hydrogen::name] is produced at 1 mole per mole of [/datum/gas/nitrium::name] decomposed.",
+ /datum/gas/nitrogen = "[/datum/gas/nitrogen::name] is produced at 1 mole per mole of [/datum/gas/nitrium::name] decomposed.",
+ "Temperature" = "Can only occur below [NITRIUM_DECOMPOSITION_MAX_TEMP]. Higher temperature increases the [/datum/gas/nitrium::name] decomposition rate.",
+ "Energy" = "[NITRIUM_DECOMPOSITION_ENERGY] joules of energy is released per mole of [/datum/gas/nitrium::name] decomposed.",
)
-/datum/gas_reaction/freonformation/init_factors()
+/datum/gas_reaction/standard/freonformation/init_factors()
factor = list(
- /datum/gas/plasma = "At least 0.06 moles of plasma needs to be present. Plasma is consumed at 0.6 moles per mole of freon formed.",
- /datum/gas/carbon_dioxide = "At least 0.03 moles of CO2 needs to be present. CO2 is consumed at 0.3 moles per mole of freon formed.",
- /datum/gas/bz = "At least 0.01 moles of BZ needs to be present. BZ is consumed at 0.1 moles per mole of freon formed.",
- /datum/gas/freon = "Freon is produced at a rate that scales with the sum of a quadratic exponential and sigmoidal function, with the quadratic exponential peaking at 800 Kelvin, but the sigmoidal function takes dominance at over 5,500K being up to 3 times more efficient.",
- "Energy" = "Between 100 and 800 joules of energy is absorbed per mole of freon produced", // I don't know why the energy release is also a sigmoidal function, but it should really just be constant to be honest.
- "Temperature" = "Minimum temperature of [FIRE_MINIMUM_TEMPERATURE_TO_EXIST + 100] Kelvin to occur, with production peak at 800 K. However at temperatures above 5500 K higher rates are possible maxing out at three times the low temperature rate at over 8500 K.",
+ /datum/gas/plasma = "At least 0.06 moles of [/datum/gas/plasma::name] needs to be present. \
+ [/datum/gas/plasma::name] is consumed at 0.6 moles per mole of [/datum/gas/freon::name] formed.",
+ /datum/gas/carbon_dioxide = "At least 0.03 moles of [/datum/gas/carbon_dioxide::name] needs to be present. \
+ [/datum/gas/carbon_dioxide::name] is consumed at 0.3 moles per mole of [/datum/gas/freon::name] formed.",
+ /datum/gas/bz = "At least 0.01 moles of [/datum/gas/bz::name] needs to be present. \
+ [/datum/gas/bz::name] is consumed at 0.1 moles per mole of [/datum/gas/freon::name] formed.",
+ /datum/gas/freon = "[/datum/gas/freon::name] is produced at a rate that scales with temperature. \
+ See temperature factor for more information.",
+ "Energy" = "Between 100 and 800 joules of energy is absorbed per mole of [/datum/gas/freon::name] produced", // I don't know why the energy release is also a sigmoidal function, but it should really just be constant to be honest.
+ "Temperature" = "Minimum temperature of [FIRE_MINIMUM_TEMPERATURE_TO_EXIST + 100]K to occur. \
+ Production speed peaks at 800K - However, at temperatures above 5500K, \
+ production speed can exceed the low temperature peak (reaching up to three times fast at 8500K).",
)
-/datum/gas_reaction/nobliumformation/init_factors()
+/datum/gas_reaction/standard/nobliumformation/init_factors()
factor = list(
- /datum/gas/nitrogen = "10 moles of nitrogen needs to be present for the reaction to occur. Nitrogen is consumed at 10 moles per mole of hypernoblium formed.",
- /datum/gas/tritium = "5 moles of tritium needs to be present for the reaction to occur. Tritium is consumed at 5 moles per mole of hypernoblium formed. The relative consumption rate of tritium decreases in the exposure of BZ.",
- /datum/gas/hypernoblium = "Hyper-Noblium production scales based on the sum of the nitrogen and tritium moles.",
- "Energy" = "[NOBLIUM_FORMATION_ENERGY] joules of energy is released per mole of hypernoblium produced.",
- /datum/gas/bz = "BZ is not consumed in the reaction but will lower the amount of energy released. It also reduces amount of tritium consumed by a ratio between tritium and bz, greater bz than tritium will reduce more.",
- "Temperature" = "Can only occur between [NOBLIUM_FORMATION_MIN_TEMP] - [NOBLIUM_FORMATION_MAX_TEMP] kelvin",
+ /datum/gas/nitrogen = "10 moles of [/datum/gas/nitrogen::name] needs to be present for the reaction to occur. \
+ [/datum/gas/nitrogen::name] is consumed at 10 moles per mole of [/datum/gas/hypernoblium::name] formed.",
+ /datum/gas/tritium = "5 moles of [/datum/gas/tritium::name] needs to be present for the reaction to occur. \
+ [/datum/gas/tritium::name] is consumed at 5 moles per mole of [/datum/gas/hypernoblium::name] formed. \
+ The relative consumption rate of [/datum/gas/tritium::name] decreases in the exposure of [/datum/gas/bz::name].",
+ /datum/gas/hypernoblium = "[/datum/gas/hypernoblium::name] production scales based on the sum \
+ of the [/datum/gas/nitrogen::name] and [/datum/gas/tritium::name] moles.",
+ "Energy" = "[NOBLIUM_FORMATION_ENERGY] joules of energy is released per mole of [/datum/gas/hypernoblium::name] produced.",
+ /datum/gas/bz = "[/datum/gas/bz::name] is not consumed in the reaction but will lower the amount of energy released. \
+ It also reduces amount of [/datum/gas/tritium::name] consumed by a ratio \
+ between [/datum/gas/tritium::name] and [/datum/gas/bz::name], greater [/datum/gas/bz::name] than [/datum/gas/tritium::name] will reduce more.",
+ "Temperature" = "Can only occur between [NOBLIUM_FORMATION_MIN_TEMP] - [NOBLIUM_FORMATION_MAX_TEMP]K",
)
-/datum/gas_reaction/halon_o2removal/init_factors()
+/datum/gas_reaction/standard/halon_o2removal/init_factors()
factor = list(
- /datum/gas/halon = "Halon is consumed at a rate that scales with temperature.",
- /datum/gas/oxygen = "20 moles of oxygen is consumed per mole of halon combusted.",
- /datum/gas/carbon_dioxide = "Carbon dioxide is produced at 5 moles per mole of halon consumed.",
- "Energy" = "[HALON_COMBUSTION_ENERGY] joules of energy is absorbed per mole of halon consumed.",
- "Temperature" = "Can only occur above [FIRE_MINIMUM_TEMPERATURE_TO_EXIST] kelvin. Higher temperature increases halon consumption rate.",
+ /datum/gas/halon = "[/datum/gas/halon::name] is consumed at a rate that scales with temperature.",
+ /datum/gas/oxygen = "20 moles of [/datum/gas/oxygen::name] is consumed per mole of [/datum/gas/halon::name] combusted.",
+ /datum/gas/carbon_dioxide = "[/datum/gas/carbon_dioxide::name] is produced at 5 moles per mole of [/datum/gas/halon::name] consumed.",
+ "Energy" = "[HALON_COMBUSTION_ENERGY] joules of energy is absorbed per mole of [/datum/gas/halon::name] consumed.",
+ "Temperature" = "Can only occur above [FIRE_MINIMUM_TEMPERATURE_TO_EXIST]K. Higher temperature increases [/datum/gas/halon::name] consumption rate.",
)
-/datum/gas_reaction/healium_formation/init_factors()
+/datum/gas_reaction/standard/healium_formation/init_factors()
factor = list(
- /datum/gas/bz = "BZ is consumed at 1/12th of a mole per mole of healium formed.",
- /datum/gas/freon = "Freon is consumed at 11/12th of a mole per mole of healium formed.",
- /datum/gas/healium = "Healium is formed at a rate that scales with the temperature.",
- "Temperature" = "Can only occur between [HEALIUM_FORMATION_MIN_TEMP] - [HEALIUM_FORMATION_MAX_TEMP]. Higher temperature increases healium formation rate.",
- "Energy" = "[HEALIUM_FORMATION_ENERGY/3] joules of energy is released per mole of healium formed.",
+ /datum/gas/bz = "[/datum/gas/bz::name] is consumed at 1/12th of a mole per mole of [/datum/gas/healium::name] formed.",
+ /datum/gas/freon = "[/datum/gas/freon::name] is consumed at 11/12th of a mole per mole of [/datum/gas/healium::name] formed.",
+ /datum/gas/healium = "[/datum/gas/healium::name] is formed at a rate that scales with the temperature.",
+ "Temperature" = "Can only occur between [HEALIUM_FORMATION_MIN_TEMP] - [HEALIUM_FORMATION_MAX_TEMP]. \
+ Higher temperature increases [/datum/gas/healium::name] formation rate.",
+ "Energy" = "[HEALIUM_FORMATION_ENERGY/3] joules of energy is released per mole of [/datum/gas/healium::name] formed.",
)
-/datum/gas_reaction/zauker_formation/init_factors()
+/datum/gas_reaction/standard/zauker_formation/init_factors()
factor = list(
- /datum/gas/hypernoblium = "Hyper-Noblium is consumed at 0.02 moles per mole of zauker formed.",
- /datum/gas/nitrium = "Nitrium is consumed at 1 mole per mole of zauker formed.",
- /datum/gas/zauker = "Zauker is produced at a rate that scales with the temperature.",
- "Temperature" = "Can only occur between [ZAUKER_FORMATION_MIN_TEMPERATURE] - [ZAUKER_FORMATION_MAX_TEMPERATURE] kelvin. Zauker formation rate is proportional to the temperature.",
- "Energy" = "[2 * ZAUKER_FORMATION_ENERGY] joules of energy is absorbed per mole of zauker formed.",
+ /datum/gas/hypernoblium = "[/datum/gas/hypernoblium::name] is consumed at 0.02 moles per mole of [/datum/gas/zauker::name] formed.",
+ /datum/gas/nitrium = "[/datum/gas/nitrium::name] is consumed at 1 mole per mole of [/datum/gas/zauker::name] formed.",
+ /datum/gas/zauker = "[/datum/gas/zauker::name] is produced at a rate that scales with the temperature.",
+ "Temperature" = "Can only occur between [ZAUKER_FORMATION_MIN_TEMPERATURE] - [ZAUKER_FORMATION_MAX_TEMPERATURE]K. [/datum/gas/zauker::name] formation rate is proportional to the temperature.",
+ "Energy" = "[2 * ZAUKER_FORMATION_ENERGY] joules of energy is absorbed per mole of [/datum/gas/zauker::name] formed.",
)
-/datum/gas_reaction/zauker_decomp/init_factors() //Fixed reaction rate
+/datum/gas_reaction/standard/zauker_decomp/init_factors() //Fixed reaction rate
factor = list(
- /datum/gas/zauker = "Zauker is consumed at [ZAUKER_DECOMPOSITION_MAX_RATE SECONDS / SSair.wait] moles per second in any unique gas mixture.",
- /datum/gas/nitrogen = "At least [MINIMUM_MOLE_COUNT] moles of Nitrogen needs to be present for this reaction to occur. Nitrogen is produced at 0.7 moles per mole of Zauker decomposed.",
- /datum/gas/oxygen = "Oxygen is produced at 0.3 moles per mole of zauker decomposed.",
- "Energy" = "[ZAUKER_DECOMPOSITION_ENERGY] joules of energy is released per mole of zauker decomposed.",
+ /datum/gas/zauker = "[/datum/gas/zauker::name] is consumed at [ZAUKER_DECOMPOSITION_MAX_RATE SECONDS / SSair.wait] moles per second in any unique gas mixture.",
+ /datum/gas/nitrogen = "At least [MINIMUM_MOLE_COUNT] moles of [/datum/gas/nitrogen::name] needs to be present for this reaction to occur. \
+ [/datum/gas/nitrogen::name] is produced at 0.7 moles per mole of [/datum/gas/zauker::name] decomposed.",
+ /datum/gas/oxygen = "[/datum/gas/oxygen::name] is produced at 0.3 moles per mole of [/datum/gas/zauker::name] decomposed.",
+ "Energy" = "[ZAUKER_DECOMPOSITION_ENERGY] joules of energy is released per mole of [/datum/gas/zauker::name] decomposed.",
)
-/datum/gas_reaction/proto_nitrate_formation/init_factors()
+/datum/gas_reaction/standard/proto_nitrate_formation/init_factors()
factor = list(
- /datum/gas/pluoxium = "Pluoxium is consumed at 1/11th of a mole per mole of proto-nitrate formed.",
- /datum/gas/hydrogen = "Hydrogen is consumed at 10/11th of a mole per mole of proto-nitrate formed.",
- /datum/gas/proto_nitrate = "Proto-Nitrate is produced at a rate that scales with the temperature.",
- "Energy" = "[PN_FORMATION_ENERGY / 2.2] joules of energy is released per mole of proto-nitrate formed.",
- "Temperature" = "Can only occur between [PN_FORMATION_MIN_TEMPERATURE] - [PN_FORMATION_MAX_TEMPERATURE] kelvin. Higher temperature increases proto-nitrate formation rate.",
+ /datum/gas/pluoxium = "[/datum/gas/pluoxium::name] is consumed at 1/11th of a mole per mole of [/datum/gas/proto_nitrate::name] formed.",
+ /datum/gas/hydrogen = "[/datum/gas/hydrogen::name] is consumed at 10/11th of a mole per mole of [/datum/gas/proto_nitrate::name] formed.",
+ /datum/gas/proto_nitrate = "[/datum/gas/proto_nitrate::name] is produced at a rate that scales with the temperature.",
+ "Energy" = "[PN_FORMATION_ENERGY / 2.2] joules of energy is released per mole of [/datum/gas/proto_nitrate::name] formed.",
+ "Temperature" = "Can only occur between [PN_FORMATION_MIN_TEMPERATURE] - [PN_FORMATION_MAX_TEMPERATURE]K. \
+ Higher temperature increases [/datum/gas/proto_nitrate::name] formation rate.",
)
-/datum/gas_reaction/proto_nitrate_hydrogen_response/init_factors() // Fixed reaction rate
+/datum/gas_reaction/standard/proto_nitrate_hydrogen_response/init_factors() // Fixed reaction rate
factor = list(
- /datum/gas/hydrogen = "[PN_HYDROGEN_CONVERSION_THRESHOLD] moles of hydrogen needs to be present for the reaction to occur. Hydrogen is consumed at 2 moles per mole of proto-nitrate formed.",
- /datum/gas/proto_nitrate = "[MINIMUM_MOLE_COUNT] moles of proto-nitrate needs to be present for the reaction to occur. Proto nitrate is produced a rate that scales with its mole count, up to a max of [PN_HYDROGEN_CONVERSION_MAX_RATE * 0.5 SECONDS / SSair.wait] moles per second.",
- "Energy" = "[PN_HYDROGEN_CONVERSION_ENERGY * 2] joules of energy is absorbed per mole of proto-nitrate formed.",
+ /datum/gas/hydrogen = "[PN_HYDROGEN_CONVERSION_THRESHOLD] moles of [/datum/gas/hydrogen::name] needs to be present for the reaction to occur. \
+ [/datum/gas/hydrogen::name] is consumed at 2 moles per mole of [/datum/gas/proto_nitrate::name] formed.",
+ /datum/gas/proto_nitrate = "[MINIMUM_MOLE_COUNT] moles of [/datum/gas/proto_nitrate::name] needs to be present for the reaction to occur. \
+ [/datum/gas/proto_nitrate::name] is produced a rate that scales with its mole count, \
+ up to a max of [PN_HYDROGEN_CONVERSION_MAX_RATE * 0.5 SECONDS / SSair.wait] moles per second.",
+ "Energy" = "[PN_HYDROGEN_CONVERSION_ENERGY * 2] joules of energy is absorbed per mole of [/datum/gas/proto_nitrate::name] formed.",
)
-/datum/gas_reaction/proto_nitrate_tritium_response/init_factors()
+/datum/gas_reaction/standard/proto_nitrate_tritium_response/init_factors()
factor = list(
- /datum/gas/tritium = "Tritium radiates its neutrons at a rate that scales with the temperature and proto-nitrate mole count.",
- /datum/gas/proto_nitrate = "Proto nitrate is consumed at 0.005 moles per mole of neutrons released.",
- /datum/gas/hydrogen = "Hydrogen remains after the neutrons escape.",
+ /datum/gas/tritium = "[/datum/gas/tritium::name] radiates its neutrons at a rate that scales with the temperature and [/datum/gas/proto_nitrate::name] mole count.",
+ /datum/gas/proto_nitrate = "[/datum/gas/proto_nitrate::name] is consumed at 0.005 moles per mole of neutrons released.",
+ /datum/gas/hydrogen = "[/datum/gas/hydrogen::name] remains after the neutrons escape.",
"Energy" = "[PN_TRITIUM_CONVERSION_ENERGY / 2] joules of energy is released per mole of neutron released.",
- "Radiation" = "Neutrons get released as ionising radiation.",
+ "Radiation" = "Neutrons are released as ionising radiation.",
)
-/datum/gas_reaction/proto_nitrate_bz_response/init_factors()
+/datum/gas_reaction/standard/proto_nitrate_bz_response/init_factors()
factor = list(
- /datum/gas/proto_nitrate = "[MINIMUM_MOLE_COUNT] moles of proto-nitrate needs to be present for the reaction to occur. Proto-nitrate accelerates the BZ decomposition.",
- /datum/gas/bz = "BZ gets decomposed into plasma and nitrous oxide. The nitrous oxide then decomposes into nitrogen and oxygen, with the oxygen then decaying into helium.",
- /datum/gas/nitrogen = "Nitrogen is produced at 0.4 moles per mole of BZ decomposed.",
- /datum/gas/helium = "Helium is produced at 1.6 moles per mole of BZ decomposed.",
- /datum/gas/plasma = "Plasma is produced at 0.8 moles per mole of BZ decomposed.",
- "Energy" = "[PN_BZASE_ENERGY] joules of energy is released per mole of BZ decomposed.",
- "Radiation" = "Radiation gets released during this decomposition process.",
+ /datum/gas/proto_nitrate = "[MINIMUM_MOLE_COUNT] moles of [/datum/gas/proto_nitrate::name] needs to be present for the reaction to occur. \
+ [/datum/gas/proto_nitrate::name] accelerates the [/datum/gas/bz::name] decomposition.",
+ /datum/gas/bz = "[/datum/gas/bz::name] gets decomposed into [/datum/gas/plasma::name] and [/datum/gas/nitrous_oxide::name]. \
+ The [/datum/gas/nitrous_oxide::name] then decomposes into [/datum/gas/nitrogen::name] and [/datum/gas/oxygen::name], \
+ with the [/datum/gas/oxygen::name] then decaying into [/datum/gas/helium::name].",
+ /datum/gas/nitrogen = "[/datum/gas/nitrogen::name] is produced at 0.4 moles per mole of [/datum/gas/bz::name] decomposed.",
+ /datum/gas/helium = "[/datum/gas/helium::name] is produced at 1.6 moles per mole of [/datum/gas/bz::name] decomposed.",
+ /datum/gas/plasma = "[/datum/gas/plasma::name] is produced at 0.8 moles per mole of [/datum/gas/bz::name] decomposed.",
+ "Energy" = "[PN_BZASE_ENERGY] joules of energy is released per mole of [/datum/gas/bz::name] decomposed.",
+ "Radiation" = "Radiation is released during this decomposition process.",
"Hallucinations" = "This reaction can cause various carbon based lifeforms in the vicinity to hallucinate.",
- "Nuclear Particles" = "This reaction emits extremely high energy nuclear particles, up to [2 * PN_BZASE_NUCLEAR_PARTICLE_MAXIMUM] per second per unique gas mixture.",
- "Temperature" = "Can only occur between [PN_BZASE_MIN_TEMP] - [PN_BZASE_MAX_TEMP] kelvin.",
+ "Nuclear Particles" = "This reaction emits extremely high energy nuclear particles, \
+ up to [2 * PN_BZASE_NUCLEAR_PARTICLE_MAXIMUM] per second per unique gas mixture.",
+ "Temperature" = "Can only occur between [PN_BZASE_MIN_TEMP] - [PN_BZASE_MAX_TEMP]K.",
)
-/datum/gas_reaction/antinoblium_replication/init_factors()
+/datum/gas_reaction/standard/antinoblium_replication/init_factors()
factor = list(
- /datum/gas/antinoblium = "[MOLES_GAS_VISIBLE] moles of antinoblium is needed to replicate itself. Requires other gases to be converted to antinoblium.",
- "Temperature" = "Can only occur above [REACTION_OPPRESSION_MIN_TEMP] Kelvin."
+ /datum/gas/antinoblium = "[MOLES_GAS_VISIBLE] moles of [/datum/gas/antinoblium::name] is needed to replicate itself. \
+ Requires other gases to be converted to [/datum/gas/antinoblium::name].",
+ "Temperature" = "Can only occur above [REACTION_OPPRESSION_MIN_TEMP]K."
)
-
diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm
index 14b5e02b7fac..6fff9667dc48 100644
--- a/code/modules/atmospherics/gasmixtures/reactions.dm
+++ b/code/modules/atmospherics/gasmixtures/reactions.dm
@@ -13,7 +13,7 @@
/* PRIORITY_FIRE = */ list()
)
- for(var/datum/gas_reaction/reaction as anything in subtypesof(/datum/gas_reaction))
+ for(var/datum/gas_reaction/standard/reaction as anything in subtypesof(/datum/gas_reaction/standard))
if(initial(reaction.exclude))
continue
reaction = new reaction
@@ -40,6 +40,13 @@
return priority_reactions
/datum/gas_reaction
+ abstract_type = /datum/gas_reaction
+ /// Name of the reaction
+ var/name = "reaction"
+ /// A short string describing this reaction.
+ var/desc
+ /// ID of the reaction
+ var/id = "r"
/**
* Regarding the requirements list: the minimum or maximum requirements must be non-zero.
* When in doubt, use MINIMUM_MOLE_COUNT.
@@ -47,16 +54,6 @@
* More complex implementations will require modifications to gas_mixture.react()
*/
var/list/requirements
- var/major_gas //the highest rarity gas used in the reaction.
- var/exclude = FALSE //do it this way to allow for addition/removal of reactions midmatch in the future
- ///The priority group this reaction is a part of. You can think of these as processing in batches, put your reaction into the one that's most fitting
- var/priority_group
- var/name = "reaction"
- var/id = "r"
- /// Whether the presence of our reaction should make fires bigger or not.
- var/expands_hotspot = FALSE
- /// A short string describing this reaction.
- var/desc
/** REACTION FACTORS
*
* Describe (to a human) factors influencing this reaction in an assoc list format.
@@ -69,16 +66,26 @@
*/
var/list/factor
-/datum/gas_reaction/New()
+/datum/gas_reaction/standard
+ abstract_type = /datum/gas_reaction/standard
+ var/major_gas //the highest rarity gas used in the reaction.
+ var/exclude = FALSE //do it this way to allow for addition/removal of reactions midmatch in the future
+ ///The priority group this reaction is a part of. You can think of these as processing in batches, put your reaction into the one that's most fitting
+ var/priority_group
+ /// Whether the presence of our reaction should make fires bigger or not.
+ var/expands_hotspot = FALSE
+
+/datum/gas_reaction/standard/New()
+ . = ..()
init_reqs()
init_factors()
-/datum/gas_reaction/proc/init_reqs() // Override this
+/datum/gas_reaction/standard/proc/init_reqs() // Override this
CRASH("Reaction [type] made without specifying requirements.")
-/datum/gas_reaction/proc/init_factors()
+/datum/gas_reaction/standard/proc/init_factors()
-/datum/gas_reaction/proc/react(datum/gas_mixture/air, atom/location)
+/datum/gas_reaction/standard/proc/react(datum/gas_mixture/air, atom/location)
return NO_REACTION
@@ -88,19 +95,19 @@
* Makes turfs slippery.
* Can frost things if the gas is cold enough.
*/
-/datum/gas_reaction/water_vapor
+/datum/gas_reaction/standard/water_vapor
priority_group = PRIORITY_POST_FORMATION
name = "Water Vapor Condensation"
id = "vapor"
- desc = "Water vapor condensation that can make things slippery."
+ desc = "Water Vapor condensation that may make things slippery."
-/datum/gas_reaction/water_vapor/init_reqs()
+/datum/gas_reaction/standard/water_vapor/init_reqs()
requirements = list(
/datum/gas/water_vapor = MOLES_GAS_VISIBLE,
"MAX_TEMP" = WATER_VAPOR_CONDENSATION_POINT,
)
-/datum/gas_reaction/water_vapor/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/water_vapor/react(datum/gas_mixture/air, datum/holder)
. = NO_REACTION
if(!isturf(holder))
return
@@ -130,19 +137,19 @@
*
* Clears out pathogens in the air.
*/
-/datum/gas_reaction/miaster
+/datum/gas_reaction/standard/miaster
priority_group = PRIORITY_POST_FORMATION
name = "Dry Heat Sterilization"
id = "sterilization"
desc = "Pathogens cannot survive in a hot environment. Miasma decomposes on high temperature."
-/datum/gas_reaction/miaster/init_reqs()
+/datum/gas_reaction/standard/miaster/init_reqs()
requirements = list(
/datum/gas/miasma = MINIMUM_MOLE_COUNT,
"MIN_TEMP" = MIASTER_STERILIZATION_TEMP,
)
-/datum/gas_reaction/miaster/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/miaster/react(datum/gas_mixture/air, datum/holder)
var/list/cached_moles = air.moles
var/water_vapor_moles = cached_moles[/datum/gas/water_vapor]
var/miasma_moles = cached_moles[/datum/gas/miasma]
@@ -171,21 +178,22 @@
* The reaction rate is dependent on the temperature of the gasmix.
* May produce either tritium or carbon dioxide and water vapor depending on the fuel/oxydizer ratio of the gasmix.
*/
-/datum/gas_reaction/plasmafire
+/datum/gas_reaction/standard/plasmafire
priority_group = PRIORITY_FIRE
name = "Plasma Combustion"
id = "plasmafire"
expands_hotspot = TRUE
- desc = "Combustion of oxygen and plasma. Able to produce tritium or carbon dioxide and water vapor."
+ desc = "Combustion of Oxygen and Plasma. Produces Carbon Dioxide and Water Vapor, \
+ and potentially even Tritium if the mixture is rich enough in Plasma."
-/datum/gas_reaction/plasmafire/init_reqs()
+/datum/gas_reaction/standard/plasmafire/init_reqs()
requirements = list(
/datum/gas/plasma = MINIMUM_MOLE_COUNT,
/datum/gas/oxygen = MINIMUM_MOLE_COUNT,
"MIN_TEMP" = PLASMA_MINIMUM_BURN_TEMPERATURE,
)
-/datum/gas_reaction/plasmafire/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/plasmafire/react(datum/gas_mixture/air, datum/holder)
. = NO_REACTION
// This reaction should proceed faster at higher temperatures.
var/temperature = air.temperature
@@ -249,21 +257,21 @@
* Highly exothermic.
* Creates hotspots.
*/
-/datum/gas_reaction/h2fire
+/datum/gas_reaction/standard/h2fire
priority_group = PRIORITY_FIRE
name = "Hydrogen Combustion"
id = "h2fire"
expands_hotspot = TRUE
- desc = "Combustion of hydrogen with oxygen. Can be extremely fast and energetic if a few conditions are fulfilled."
+ desc = "Combustion of Hydrogen with Oxygen. May be extremely fast and energetic, if a few conditions are fulfilled."
-/datum/gas_reaction/h2fire/init_reqs()
+/datum/gas_reaction/standard/h2fire/init_reqs()
requirements = list(
/datum/gas/hydrogen = MINIMUM_MOLE_COUNT,
/datum/gas/oxygen = MINIMUM_MOLE_COUNT,
"MIN_TEMP" = HYDROGEN_MINIMUM_BURN_TEMPERATURE,
)
-/datum/gas_reaction/h2fire/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/h2fire/react(datum/gas_mixture/air, datum/holder)
. = NO_REACTION
var/list/cached_moles = air.moles //this speeds things up because accessing datum vars is slow
var/hydrogen_moles = cached_moles[/datum/gas/hydrogen]
@@ -305,21 +313,21 @@
* Creates hotspots.
* Creates radiation.
*/
-/datum/gas_reaction/tritfire
+/datum/gas_reaction/standard/tritfire
priority_group = PRIORITY_FIRE
name = "Tritium Combustion"
id = "tritfire"
expands_hotspot = TRUE
- desc = "Combustion of tritium with oxygen. Can be extremely fast and energetic if a few conditions are fulfilled."
+ desc = "Combustion of Tritium with Oxygen. May be extremely fast and energetic, if a few conditions are fulfilled."
-/datum/gas_reaction/tritfire/init_reqs()
+/datum/gas_reaction/standard/tritfire/init_reqs()
requirements = list(
/datum/gas/tritium = MINIMUM_MOLE_COUNT,
/datum/gas/oxygen = MINIMUM_MOLE_COUNT,
"MIN_TEMP" = TRITIUM_MINIMUM_BURN_TEMPERATURE,
)
-/datum/gas_reaction/tritfire/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/tritfire/react(datum/gas_mixture/air, datum/holder)
. = NO_REACTION
var/list/cached_moles = air.moles //this speeds things up because accessing datum vars is slow
var/tritium_moles = cached_moles[/datum/gas/tritium]
@@ -369,14 +377,14 @@
* Combustion of oxygen and freon.
* Endothermic.
*/
-/datum/gas_reaction/freonfire
+/datum/gas_reaction/standard/freonfire
priority_group = PRIORITY_FIRE
name = "Freon Combustion"
id = "freonfire"
expands_hotspot = TRUE
- desc = "Reaction between oxygen and freon that consumes a huge amount of energy and can cool things significantly. Also able to produce hot ice."
+ desc = "Reaction between Oxygen and Freon that consumes a huge amount of energy, cooling the atmosphere significantly. May produce \"hot ice\"."
-/datum/gas_reaction/freonfire/init_reqs()
+/datum/gas_reaction/standard/freonfire/init_reqs()
requirements = list(
/datum/gas/oxygen = MINIMUM_MOLE_COUNT,
/datum/gas/freon = MINIMUM_MOLE_COUNT,
@@ -384,7 +392,7 @@
"MAX_TEMP" = FREON_MAXIMUM_BURN_TEMPERATURE,
)
-/datum/gas_reaction/freonfire/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/freonfire/react(datum/gas_mixture/air, datum/holder)
. = NO_REACTION
var/temperature = air.temperature
var/temperature_scale
@@ -443,13 +451,13 @@
* Endothermic.
* Requires BZ as a catalyst.
*/
-/datum/gas_reaction/nitrousformation //formation of n2o, exothermic, requires bz as catalyst
+/datum/gas_reaction/standard/nitrousformation //formation of n2o, exothermic, requires bz as catalyst
priority_group = PRIORITY_FORMATION
name = "Nitrous Oxide Formation"
id = "nitrousformation"
- desc = "Production of nitrous oxide with BZ as a catalyst."
+ desc = "Production of Nitrous Oxide with BZ as a catalyst."
-/datum/gas_reaction/nitrousformation/init_reqs()
+/datum/gas_reaction/standard/nitrousformation/init_reqs()
requirements = list(
/datum/gas/oxygen = 10,
/datum/gas/nitrogen = 20,
@@ -458,7 +466,7 @@
"MAX_TEMP" = N2O_FORMATION_MAX_TEMPERATURE,
)
-/datum/gas_reaction/nitrousformation/react(datum/gas_mixture/air)
+/datum/gas_reaction/standard/nitrousformation/react(datum/gas_mixture/air)
var/list/cached_moles = air.moles
var/oxygen_moles = cached_moles[/datum/gas/oxygen]
var/nitrogen_moles = cached_moles[/datum/gas/nitrogen]
@@ -485,20 +493,20 @@
* Decomposition of N2O.
* Exothermic.
*/
-/datum/gas_reaction/nitrous_decomp
+/datum/gas_reaction/standard/nitrous_decomp
priority_group = PRIORITY_POST_FORMATION
name = "Nitrous Oxide Decomposition"
id = "nitrous_decomp"
- desc = "Decomposition of nitrous oxide under high temperature."
+ desc = "Decomposition of Nitrous Oxide under high temperature."
-/datum/gas_reaction/nitrous_decomp/init_reqs()
+/datum/gas_reaction/standard/nitrous_decomp/init_reqs()
requirements = list(
/datum/gas/nitrous_oxide = MINIMUM_MOLE_COUNT * 2,
"MIN_TEMP" = N2O_DECOMPOSITION_MIN_TEMPERATURE,
"MAX_TEMP" = N2O_DECOMPOSITION_MAX_TEMPERATURE,
)
-/datum/gas_reaction/nitrous_decomp/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/nitrous_decomp/react(datum/gas_mixture/air, datum/holder)
var/list/cached_moles = air.moles //this speeds things up because accessing datum vars is slow
var/nitrous_oxide_moles = cached_moles[/datum/gas/nitrous_oxide]
var/temperature = air.temperature
@@ -527,20 +535,20 @@
* Formation of BZ by combining plasma and nitrous oxide at low pressures.
* Exothermic.
*/
-/datum/gas_reaction/bzformation
+/datum/gas_reaction/standard/bzformation
priority_group = PRIORITY_FORMATION
name = "BZ Gas Formation"
id = "bzformation"
- desc = "Production of BZ using plasma and nitrous oxide."
+ desc = "Production of BZ using Plasma and Nitrous Oxide."
-/datum/gas_reaction/bzformation/init_reqs()
+/datum/gas_reaction/standard/bzformation/init_reqs()
requirements = list(
/datum/gas/nitrous_oxide = 10,
/datum/gas/plasma = 10,
"MAX_TEMP" = BZ_FORMATION_MAX_TEMPERATURE,
)
-/datum/gas_reaction/bzformation/react(datum/gas_mixture/air)
+/datum/gas_reaction/standard/bzformation/react(datum/gas_mixture/air)
var/list/cached_moles = air.moles
var/nitrous_oxide_moles = cached_moles[/datum/gas/nitrous_oxide]
var/plasma_moles = cached_moles[/datum/gas/plasma]
@@ -587,13 +595,13 @@
* Consumes a tiny amount of tritium to convert CO2 and oxygen to pluoxium.
* Exothermic.
*/
-/datum/gas_reaction/pluox_formation
+/datum/gas_reaction/standard/pluox_formation
priority_group = PRIORITY_FORMATION
name = "Pluoxium Formation"
id = "pluox_formation"
- desc = "Alternate production for pluoxium which uses tritium."
+ desc = "Alternate Production method for Pluoxium which uses Tritium."
-/datum/gas_reaction/pluox_formation/init_reqs()
+/datum/gas_reaction/standard/pluox_formation/init_reqs()
requirements = list(
/datum/gas/carbon_dioxide = MINIMUM_MOLE_COUNT,
/datum/gas/oxygen = MINIMUM_MOLE_COUNT,
@@ -602,7 +610,7 @@
"MAX_TEMP" = PLUOXIUM_FORMATION_MAX_TEMP,
)
-/datum/gas_reaction/pluox_formation/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/pluox_formation/react(datum/gas_mixture/air, datum/holder)
var/list/cached_moles = air.moles
var/carbon_dioxide_moles = cached_moles[/datum/gas/carbon_dioxide]
var/oxygen_moles = cached_moles[/datum/gas/oxygen]
@@ -635,13 +643,13 @@
* Endothermic.
* Requires BZ.
*/
-/datum/gas_reaction/nitrium_formation
+/datum/gas_reaction/standard/nitrium_formation
priority_group = PRIORITY_FORMATION
name = "Nitrium Formation"
id = "nitrium_formation"
- desc = "Production of nitrium from BZ, tritium, and nitrogen."
+ desc = "Production of Nitrium from BZ, Tritium, and Nitrogen."
-/datum/gas_reaction/nitrium_formation/init_reqs()
+/datum/gas_reaction/standard/nitrium_formation/init_reqs()
requirements = list(
/datum/gas/tritium = 20,
/datum/gas/nitrogen = 10,
@@ -649,7 +657,7 @@
"MIN_TEMP" = NITRIUM_FORMATION_MIN_TEMP,
)
-/datum/gas_reaction/nitrium_formation/react(datum/gas_mixture/air)
+/datum/gas_reaction/standard/nitrium_formation/react(datum/gas_mixture/air)
var/list/cached_moles = air.moles
var/tritium_moles = cached_moles[/datum/gas/tritium]
var/nitrogen_moles = cached_moles[/datum/gas/nitrogen]
@@ -682,20 +690,20 @@
* Exothermic.
* Requires oxygen as catalyst.
*/
-/datum/gas_reaction/nitrium_decomposition
+/datum/gas_reaction/standard/nitrium_decomposition
priority_group = PRIORITY_PRE_FORMATION
name = "Nitrium Decomposition"
id = "nitrium_decomp"
- desc = "Decomposition of nitrium when exposed to oxygen under normal temperatures."
+ desc = "Decomposition of Nitrium when exposed to Oxygen under normal temperatures."
-/datum/gas_reaction/nitrium_decomposition/init_reqs()
+/datum/gas_reaction/standard/nitrium_decomposition/init_reqs()
requirements = list(
/datum/gas/oxygen = MINIMUM_MOLE_COUNT,
/datum/gas/nitrium = MINIMUM_MOLE_COUNT,
"MAX_TEMP" = NITRIUM_DECOMPOSITION_MAX_TEMP,
)
-/datum/gas_reaction/nitrium_decomposition/react(datum/gas_mixture/air)
+/datum/gas_reaction/standard/nitrium_decomposition/react(datum/gas_mixture/air)
var/list/cached_moles = air.moles
var/nitrium_moles = cached_moles[/datum/gas/nitrium]
var/temperature = air.temperature
@@ -726,13 +734,13 @@
* The formation of freon.
* Endothermic.
*/
-/datum/gas_reaction/freonformation
+/datum/gas_reaction/standard/freonformation
priority_group = PRIORITY_FORMATION
name = "Freon Formation"
id = "freonformation"
- desc = "Production of freon using plasma, carbon dioxide, and BZ under high temperature."
+ desc = "Production of Freon using Plasma, Carbon Dioxide, and BZ under high temperature."
-/datum/gas_reaction/freonformation/init_reqs() //minimum requirements for freon formation
+/datum/gas_reaction/standard/freonformation/init_reqs() //minimum requirements for freon formation
requirements = list(
/datum/gas/plasma = MINIMUM_MOLE_COUNT * 6,
/datum/gas/carbon_dioxide = MINIMUM_MOLE_COUNT * 3,
@@ -740,7 +748,7 @@
"MIN_TEMP" = FREON_FORMATION_MIN_TEMPERATURE,
)
-/datum/gas_reaction/freonformation/react(datum/gas_mixture/air)
+/datum/gas_reaction/standard/freonformation/react(datum/gas_mixture/air)
var/list/cached_moles = air.moles
var/plasma_moles = cached_moles[/datum/gas/plasma]
var/carbon_dioxide_moles = cached_moles[/datum/gas/carbon_dioxide]
@@ -779,13 +787,13 @@
* Due to its high mass, hyper-noblium uses large amounts of nitrogen and tritium.
* BZ can be used as a catalyst to make it less exothermic.
*/
-/datum/gas_reaction/nobliumformation
+/datum/gas_reaction/standard/nobliumformation
priority_group = PRIORITY_FORMATION
name = "Hyper-Noblium Condensation"
id = "nobformation"
- desc = "Production of hyper-noblium from nitrogen and tritium under very low temperatures. Extremely energetic."
+ desc = "Production of Hyper-Noblium from Nitrogen and Tritium under very low temperatures. Extremely energetic."
-/datum/gas_reaction/nobliumformation/init_reqs()
+/datum/gas_reaction/standard/nobliumformation/init_reqs()
requirements = list(
/datum/gas/nitrogen = 10,
/datum/gas/tritium = 5,
@@ -793,7 +801,7 @@
"MAX_TEMP" = NOBLIUM_FORMATION_MAX_TEMP,
)
-/datum/gas_reaction/nobliumformation/react(datum/gas_mixture/air)
+/datum/gas_reaction/standard/nobliumformation/react(datum/gas_mixture/air)
. = NO_REACTION
var/list/cached_moles = air.moles
var/nitrogen_moles = cached_moles[/datum/gas/nitrogen]
@@ -832,20 +840,20 @@
* Produces carbon dioxide.
* Endothermic.
*/
-/datum/gas_reaction/halon_o2removal
+/datum/gas_reaction/standard/halon_o2removal
priority_group = PRIORITY_PRE_FORMATION
name = "Halon Oxygen Absorption"
id = "halon_o2removal"
- desc = "Halon interaction with oxygen that can be used to snuff fires out."
+ desc = "Halon interaction with Oxygen that can be used to snuff fires out."
-/datum/gas_reaction/halon_o2removal/init_reqs()
+/datum/gas_reaction/standard/halon_o2removal/init_reqs()
requirements = list(
/datum/gas/halon = MINIMUM_MOLE_COUNT,
/datum/gas/oxygen = MINIMUM_MOLE_COUNT,
"MIN_TEMP" = HALON_COMBUSTION_MIN_TEMPERATURE,
)
-/datum/gas_reaction/halon_o2removal/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/halon_o2removal/react(datum/gas_mixture/air, datum/holder)
. = NO_REACTION
var/list/cached_moles = air.moles
var/halon_moles = cached_moles[/datum/gas/halon]
@@ -885,13 +893,13 @@
*
* Exothermic
*/
-/datum/gas_reaction/healium_formation
+/datum/gas_reaction/standard/healium_formation
priority_group = PRIORITY_FORMATION
name = "Healium Formation"
id = "healium_formation"
- desc = "Production of healium using BZ and freon."
+ desc = "Production of Healium using BZ and Freon."
-/datum/gas_reaction/healium_formation/init_reqs()
+/datum/gas_reaction/standard/healium_formation/init_reqs()
requirements = list(
/datum/gas/bz = MINIMUM_MOLE_COUNT,
/datum/gas/freon = MINIMUM_MOLE_COUNT,
@@ -899,7 +907,7 @@
"MAX_TEMP" = HEALIUM_FORMATION_MAX_TEMP,
)
-/datum/gas_reaction/healium_formation/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/healium_formation/react(datum/gas_mixture/air, datum/holder)
var/list/cached_moles = air.moles
var/bz_moles = cached_moles[/datum/gas/bz]
var/freon_moles = cached_moles[/datum/gas/freon]
@@ -926,13 +934,13 @@
* Exothermic.
* Requires Hypernoblium.
*/
-/datum/gas_reaction/zauker_formation
+/datum/gas_reaction/standard/zauker_formation
priority_group = PRIORITY_FORMATION
name = "Zauker Formation"
id = "zauker_formation"
- desc = "Production of zauker using hyper-noblium and nitrium under very high temperatures."
+ desc = "Production of Zauker using Hyper-Noblium and Nitrium under very high temperatures."
-/datum/gas_reaction/zauker_formation/init_reqs()
+/datum/gas_reaction/standard/zauker_formation/init_reqs()
requirements = list(
/datum/gas/hypernoblium = MINIMUM_MOLE_COUNT,
/datum/gas/nitrium = MINIMUM_MOLE_COUNT,
@@ -940,7 +948,7 @@
"MAX_TEMP" = ZAUKER_FORMATION_MAX_TEMPERATURE,
)
-/datum/gas_reaction/zauker_formation/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/zauker_formation/react(datum/gas_mixture/air, datum/holder)
var/list/cached_moles = air.moles
var/hypernoblium_moles = cached_moles[/datum/gas/hypernoblium]
var/nitrium_moles = cached_moles[/datum/gas/nitrium]
@@ -969,19 +977,19 @@
* Occurs in the presence of nitrogen to prevent zauker floods.
* Exothermic.
*/
-/datum/gas_reaction/zauker_decomp
+/datum/gas_reaction/standard/zauker_decomp
priority_group = PRIORITY_POST_FORMATION
name = "Zauker Decomposition"
id = "zauker_decomp"
- desc = "Decomposition of zauker when exposed to nitrogen."
+ desc = "Decomposition of Zauker when exposed to Nitrogen."
-/datum/gas_reaction/zauker_decomp/init_reqs()
+/datum/gas_reaction/standard/zauker_decomp/init_reqs()
requirements = list(
/datum/gas/nitrogen = MINIMUM_MOLE_COUNT,
/datum/gas/zauker = MINIMUM_MOLE_COUNT,
)
-/datum/gas_reaction/zauker_decomp/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/zauker_decomp/react(datum/gas_mixture/air, datum/holder)
var/list/cached_moles = air.moles //this speeds things up because accessing datum vars is slow
var/nitrogen_moles = cached_moles[/datum/gas/nitrogen]
var/zauker_moles = cached_moles[/datum/gas/zauker]
@@ -1009,13 +1017,13 @@
*
* Exothermic.
*/
-/datum/gas_reaction/proto_nitrate_formation
+/datum/gas_reaction/standard/proto_nitrate_formation
priority_group = PRIORITY_FORMATION
- name = "Proto Nitrate Formation"
+ name = "Proto-Nitrate Formation"
id = "proto_nitrate_formation"
- desc = "Production of proto-nitrate from pluoxium and hydrogen under high temperatures."
+ desc = "Production of Proto-Nitrate from Pluoxium and Hydrogen under high temperatures."
-/datum/gas_reaction/proto_nitrate_formation/init_reqs()
+/datum/gas_reaction/standard/proto_nitrate_formation/init_reqs()
requirements = list(
/datum/gas/pluoxium = MINIMUM_MOLE_COUNT,
/datum/gas/hydrogen = MINIMUM_MOLE_COUNT,
@@ -1023,7 +1031,7 @@
"MAX_TEMP" = PN_FORMATION_MAX_TEMPERATURE,
)
-/datum/gas_reaction/proto_nitrate_formation/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/proto_nitrate_formation/react(datum/gas_mixture/air, datum/holder)
var/list/cached_moles = air.moles
var/pluoxium_moles = cached_moles[/datum/gas/pluoxium]
var/hydrogen_moles = cached_moles[/datum/gas/hydrogen]
@@ -1051,19 +1059,19 @@
* Converts hydrogen into proto-nitrate.
* Endothermic.
*/
-/datum/gas_reaction/proto_nitrate_hydrogen_response
+/datum/gas_reaction/standard/proto_nitrate_hydrogen_response
priority_group = PRIORITY_PRE_FORMATION
- name = "Proto Nitrate Hydrogen Response"
+ name = "Proto-Nitrate Hydrogen Response"
id = "proto_nitrate_hydrogen_response"
- desc = "Conversion of hydrogen into proto nitrate."
+ desc = "Conversion of Hydrogen into Proto-Nitrate."
-/datum/gas_reaction/proto_nitrate_hydrogen_response/init_reqs()
+/datum/gas_reaction/standard/proto_nitrate_hydrogen_response/init_reqs()
requirements = list(
/datum/gas/proto_nitrate = MINIMUM_MOLE_COUNT,
/datum/gas/hydrogen = PN_HYDROGEN_CONVERSION_THRESHOLD,
)
-/datum/gas_reaction/proto_nitrate_hydrogen_response/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/proto_nitrate_hydrogen_response/react(datum/gas_mixture/air, datum/holder)
var/list/cached_moles = air.moles
var/proto_nitrate_moles = cached_moles[/datum/gas/proto_nitrate]
var/hydrogen_moles = cached_moles[/datum/gas/hydrogen]
@@ -1089,13 +1097,13 @@
* Releases radiation.
* Exothermic.
*/
-/datum/gas_reaction/proto_nitrate_tritium_response
+/datum/gas_reaction/standard/proto_nitrate_tritium_response
priority_group = PRIORITY_PRE_FORMATION
- name = "Proto Nitrate Tritium Response"
+ name = "Proto-Nitrate Tritium Response"
id = "proto_nitrate_tritium_response"
- desc = "Conversion of tritium into hydrogen that consumes a small amount of proto-nitrate."
+ desc = "Conversion of Tritium into Hydrogen that consumes a small amount of Proto-Nitrate."
-/datum/gas_reaction/proto_nitrate_tritium_response/init_reqs()
+/datum/gas_reaction/standard/proto_nitrate_tritium_response/init_reqs()
requirements = list(
/datum/gas/proto_nitrate = MINIMUM_MOLE_COUNT,
/datum/gas/tritium = MINIMUM_MOLE_COUNT,
@@ -1103,7 +1111,7 @@
"MAX_TEMP" = PN_TRITIUM_CONVERSION_MAX_TEMP,
)
-/datum/gas_reaction/proto_nitrate_tritium_response/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/proto_nitrate_tritium_response/react(datum/gas_mixture/air, datum/holder)
. = NO_REACTION
var/list/cached_moles = air.moles
var/proto_nitrate_moles = cached_moles[/datum/gas/proto_nitrate]
@@ -1142,13 +1150,13 @@
*
* Breaks BZ down into nitrogen, helium, and plasma in the presence of proto-nitrate.
*/
-/datum/gas_reaction/proto_nitrate_bz_response
+/datum/gas_reaction/standard/proto_nitrate_bz_response
priority_group = PRIORITY_PRE_FORMATION
- name = "Proto Nitrate BZ Response"
+ name = "Proto-Nitrate BZ Response"
id = "proto_nitrate_bz_response"
- desc = "Breakdown of BZ into nitrogen, helium, and plasma by proto-nitrate under low temperatures."
+ desc = "Breakdown of BZ into Nitrogen, Helium, and Plasma by Proto-Nitrate under low temperatures."
-/datum/gas_reaction/proto_nitrate_bz_response/init_reqs()
+/datum/gas_reaction/standard/proto_nitrate_bz_response/init_reqs()
requirements = list(
/datum/gas/proto_nitrate = MINIMUM_MOLE_COUNT,
/datum/gas/bz = MINIMUM_MOLE_COUNT,
@@ -1156,7 +1164,7 @@
"MAX_TEMP" = PN_BZASE_MAX_TEMP,
)
-/datum/gas_reaction/proto_nitrate_bz_response/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/proto_nitrate_bz_response/react(datum/gas_mixture/air, datum/holder)
. = NO_REACTION
var/list/cached_moles = air.moles
var/proto_nitrate_moles = cached_moles[/datum/gas/proto_nitrate]
@@ -1194,24 +1202,24 @@
air.temperature = max((temperature * old_heat_capacity + energy_released) / new_heat_capacity, TCMB)
. |= REACTING
-/datum/gas_reaction/antinoblium_replication
+/datum/gas_reaction/standard/antinoblium_replication
priority_group = PRIORITY_FORMATION
- name = "Antinoblium Replication"
+ name = "Anti-Noblium Replication"
id = "antinoblium_replication"
- desc = "Antinoblium breaks down all gases into more of itself."
+ desc = "Anti-Noblium breaks down all gases into more of itself."
-/datum/gas_reaction/antinoblium_replication/init_reqs()
+/datum/gas_reaction/standard/antinoblium_replication/init_reqs()
requirements = list(
/datum/gas/antinoblium = MOLES_GAS_VISIBLE,
"MIN_TEMP" = REACTION_OPPRESSION_MIN_TEMP,
)
/**
- * Antinoblium Recplication
+ * Anti-Noblium Replication
*
* Converts all gases into antinoblium.
*/
-/datum/gas_reaction/antinoblium_replication/react(datum/gas_mixture/air, datum/holder)
+/datum/gas_reaction/standard/antinoblium_replication/react(datum/gas_mixture/air, datum/holder)
. = REACTING | VOLATILE_REACTION
var/list/cached_moles = air.moles
var/heat_capacity = air.heat_capacity()
diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm
index 983b136f5d4f..1d63c65f7fe9 100644
--- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm
+++ b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm
@@ -7,8 +7,8 @@
interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN
icon = 'icons/obj/pipes_n_cables/atmos.dmi'
icon_state = "electrolyzer-off"
- name = "space electrolyzer"
- desc = "Thanks to the fast and dynamic response of our electrolyzers, on-site hydrogen production is guaranteed. Warranty void if used by clowns"
+ name = "electrolyzer"
+ desc = "A portable electrolyzer, allowing for on-site production of Hydrogen. Warranty void if used by clowns."
max_integrity = 250
armor_type = /datum/armor/machinery_electrolyzer
circuit = /obj/item/circuitboard/machine/electrolyzer
@@ -71,9 +71,9 @@
. += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%."
else
. += "There is no power cell installed."
- if(in_range(user, src) || isobserver(user))
+ if(in_range(user, src) && !isobserver(user))
. += span_notice("Alt-click to toggle [on ? "off" : "on"].")
- . += span_notice("Anchor to drain power from APC instead of cell")
+ . += span_notice("Anchor it to drain power from the area's APC instead its internal power cell.")
. += span_notice("It will drain power from the [anchored ? "area's APC" : "internal power cell"].")
diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm
index b41b7ce0e768..8ca39d0fe974 100644
--- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm
+++ b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm
@@ -5,19 +5,20 @@ GLOBAL_LIST_INIT(electrolyzer_reactions, electrolyzer_reactions_list())
*/
/proc/electrolyzer_reactions_list()
var/list/built_reaction_list = list()
- for(var/reaction_path in subtypesof(/datum/electrolyzer_reaction))
- var/datum/electrolyzer_reaction/reaction = new reaction_path()
+ for(var/reaction_path in subtypesof(/datum/gas_reaction/electrolyzer))
+ var/datum/gas_reaction/electrolyzer/reaction = new reaction_path()
built_reaction_list[reaction.id] = reaction
return built_reaction_list
-/datum/electrolyzer_reaction
- var/list/requirements
- var/name = "reaction"
- var/id = "r"
- var/desc = ""
- var/list/factor
+/datum/gas_reaction/electrolyzer
+ abstract_type = /datum/gas_reaction/electrolyzer
+
+/datum/gas_reaction/electrolyzer/New()
+ . = ..()
+ factor ||= list()
+ factor["Location"] ||= "Can only happen on tiles with an active Electrolyzer."
/**
* Electrolyzer reaction.
@@ -26,7 +27,7 @@ GLOBAL_LIST_INIT(electrolyzer_reactions, electrolyzer_reactions_list())
* * working_power: How much energy to put into the electrolysis, in electrolyzer units. A value of 1 is what a tier 1 electrolyzer would put in.
* * electrolyzer_args: Additional arguments for alternative methods of electrolysis.
*/
-/datum/electrolyzer_reaction/proc/react(datum/gas_mixture/air_mixture, working_power, list/electrolyzer_args = list())
+/datum/gas_reaction/electrolyzer/proc/react(datum/gas_mixture/air_mixture, working_power, list/electrolyzer_args = list())
return
/**
@@ -35,7 +36,7 @@ GLOBAL_LIST_INIT(electrolyzer_reactions, electrolyzer_reactions_list())
* * air_mixture: The air mixture to check the requirements for.
* * electrolyzer_args: Additional arguments for alternative methods of electrolysis.
*/
-/datum/electrolyzer_reaction/proc/reaction_check(datum/gas_mixture/air_mixture, list/electrolyzer_args = list())
+/datum/gas_reaction/electrolyzer/proc/reaction_check(datum/gas_mixture/air_mixture, list/electrolyzer_args = list())
var/temp = air_mixture.temperature
var/list/cached_moles = air_mixture.moles
if((requirements["MIN_TEMP"] && temp < requirements["MIN_TEMP"]) || (requirements["MAX_TEMP"] && temp > requirements["MAX_TEMP"]))
@@ -47,21 +48,20 @@ GLOBAL_LIST_INIT(electrolyzer_reactions, electrolyzer_reactions_list())
return FALSE
return TRUE
-/datum/electrolyzer_reaction/h2o_conversion
+/datum/gas_reaction/electrolyzer/h2o_conversion
name = "H2O Conversion"
id = "h2o_conversion"
- desc = "Conversion of H2o into O2 and H2"
+ desc = "Conversion of H2O into H2 and O2."
requirements = list(
/datum/gas/water_vapor = MINIMUM_MOLE_COUNT
)
factor = list(
- /datum/gas/water_vapor = "2 moles of H2O get consumed",
- /datum/gas/oxygen = "1 mole of O2 gets produced",
- /datum/gas/hydrogen = "2 moles of H2 get produced",
- "Location" = "Can only happen on turfs with an active Electrolyzer.",
+ /datum/gas/water_vapor = "2 moles of H2O is consumed.",
+ /datum/gas/oxygen = "1 mole of O2 is produced.",
+ /datum/gas/hydrogen = "2 moles of H2 is produced.",
)
-/datum/electrolyzer_reaction/h2o_conversion/react(datum/gas_mixture/air_mixture, working_power, list/electrolyzer_args = list())
+/datum/gas_reaction/electrolyzer/h2o_conversion/react(datum/gas_mixture/air_mixture, working_power, list/electrolyzer_args = list())
var/old_heat_capacity = air_mixture.heat_capacity()
@@ -73,25 +73,25 @@ GLOBAL_LIST_INIT(electrolyzer_reactions, electrolyzer_reactions_list())
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
air_mixture.temperature = max(air_mixture.temperature * old_heat_capacity / new_heat_capacity, TCMB)
-/datum/electrolyzer_reaction/nob_conversion
- name = "Hypernob conversion"
+/datum/gas_reaction/electrolyzer/nob_conversion
+ name = "Hyper-Noblium Conversion"
id = "nob_conversion"
- desc = "Conversion of Hypernoblium into Antinoblium"
+ desc = "Conversion of Hyper-Noblium into Anti-Noblium."
requirements = list(
/datum/gas/hypernoblium = MINIMUM_MOLE_COUNT,
)
factor = list(
- /datum/gas/hypernoblium = "1 mole of Hypernoblium gets consumed",
- /datum/gas/antinoblium = "1 mole of Antinoblium get produced",
- "Location" = "Can only happen on turfs that are being struck by supermatter zaps with a power level above 5 GeV.",
+ /datum/gas/hypernoblium = "1 mole of Hyper-Noblium is consumed.",
+ /datum/gas/antinoblium = "1 mole of Anti-Noblium is produced.",
+ "Location" = "Can only happen on tiles that are being struck by Supermatter zaps with a power level above 5 GeV.",
)
-/datum/electrolyzer_reaction/nob_conversion/reaction_check(datum/gas_mixture/air_mixture, list/electrolyzer_args = list())
+/datum/gas_reaction/electrolyzer/nob_conversion/reaction_check(datum/gas_mixture/air_mixture, list/electrolyzer_args = list())
if(!electrolyzer_args[ELECTROLYSIS_ARGUMENT_SUPERMATTER_POWER] || electrolyzer_args[ELECTROLYSIS_ARGUMENT_SUPERMATTER_POWER] <= POWER_PENALTY_THRESHOLD)
return FALSE
- . = ..()
+ return ..()
-/datum/electrolyzer_reaction/nob_conversion/react(datum/gas_mixture/air_mixture, working_power, list/electrolyzer_args = list())
+/datum/gas_reaction/electrolyzer/nob_conversion/react(datum/gas_mixture/air_mixture, working_power, list/electrolyzer_args = list())
/// The supermatter zap power_level.
var/supermatter_power = electrolyzer_args[ELECTROLYSIS_ARGUMENT_SUPERMATTER_POWER]
var/list/cached_moles = air_mixture.moles
@@ -107,23 +107,22 @@ GLOBAL_LIST_INIT(electrolyzer_reactions, electrolyzer_reactions_list())
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
air_mixture.temperature = max(air_mixture.temperature * old_heat_capacity / new_heat_capacity, TCMB)
-/datum/electrolyzer_reaction/halon_generation
- name = "Halon generation"
+/datum/gas_reaction/electrolyzer/halon_generation
+ name = "Halon Generation"
id = "halon_generation"
desc = "Production of halon from the electrolysis of BZ."
requirements = list(
/datum/gas/bz = MINIMUM_MOLE_COUNT,
)
factor = list(
- /datum/gas/bz = "Consumed during reaction.",
- /datum/gas/oxygen = "0.2 moles of oxygen gets produced per mole of BZ consumed.",
- /datum/gas/halon = "2 moles of Halon gets produced per mole of BZ consumed.",
+ /datum/gas/bz = "All moles of BZ are consumed.",
+ /datum/gas/oxygen = "0.2 moles of oxygen is produced per mole of BZ consumed.",
+ /datum/gas/halon = "2 moles of Halon is produced per mole of BZ consumed.",
"Energy" = "91.2321 kJ of thermal energy is released per mole of BZ consumed.",
"Temperature" = "Reaction efficiency is proportional to temperature.",
- "Location" = "Can only happen on turfs with an active Electrolyzer.",
)
-/datum/electrolyzer_reaction/halon_generation/react(datum/gas_mixture/air_mixture, working_power, list/electrolyzer_args = list())
+/datum/gas_reaction/electrolyzer/halon_generation/react(datum/gas_mixture/air_mixture, working_power, list/electrolyzer_args = list())
var/old_heat_capacity = air_mixture.heat_capacity()
air_mixture.assert_gases(/datum/gas/bz, /datum/gas/oxygen, /datum/gas/halon)
var/bz_moles = air_mixture.moles[/datum/gas/bz]
diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm
index 2b2e0898f700..f837c8c6c48d 100644
--- a/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm
+++ b/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm
@@ -2,7 +2,7 @@
* This section contain the hfr core with all the variables and the Initialize() and Destroy() procs
*/
/obj/machinery/atmospherics/components/unary/hypertorus/core
- name = "HFR core"
+ name = "\improper HFR core"
desc = "This is the Hypertorus Fusion Reactor core, an advanced piece of technology to finely tune the reaction inside of the machine. It has I/O for cooling gases."
icon = 'icons/obj/machines/atmospherics/hypertorus.dmi'
icon_state = "core"
diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_fuel_datums.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_fuel_datums.dm
index c7a9545a7d25..39d8ce76cd27 100644
--- a/code/modules/atmospherics/machinery/components/fusion/hfr_fuel_datums.dm
+++ b/code/modules/atmospherics/machinery/components/fusion/hfr_fuel_datums.dm
@@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(hfr_fuels_list, hfr_fuels_create_list())
/datum/hfr_fuel/hypernob_hydrogen_fuel
id = "hypernob_hydrogen_fuel"
- name = "Hypernoblium + Hydrogen fuel"
+ name = "Hyper-Noblium + Hydrogen fuel"
negative_temperature_multiplier = 0.2
positive_temperature_multiplier = 2.2
energy_concentration_multiplier = 0.2
@@ -113,7 +113,7 @@ GLOBAL_LIST_INIT(hfr_fuels_list, hfr_fuels_create_list())
/datum/hfr_fuel/hypernob_trit_fuel
id = "hypernob_trit_fuel"
- name = "Hypernoblium + Tritium fuel"
+ name = "Hyper-Noblium + Tritium fuel"
negative_temperature_multiplier = 0.1
positive_temperature_multiplier = 2.5
energy_concentration_multiplier = 0.1
@@ -127,7 +127,7 @@ GLOBAL_LIST_INIT(hfr_fuels_list, hfr_fuels_create_list())
/datum/hfr_fuel/hypernob_antinob_fuel
id = "hypernob_antinob_fuel"
- name = "Hypernoblium + Antinoblium fuel"
+ name = "Hyper-Noblium + Anti-Noblium fuel"
negative_temperature_multiplier = 0.01
positive_temperature_multiplier = 3.5
energy_concentration_multiplier = 2
diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm
index 13cde0056e55..d4b6c7b45c09 100644
--- a/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm
+++ b/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm
@@ -70,21 +70,21 @@
return
/obj/machinery/atmospherics/components/unary/hypertorus/fuel_input
- name = "HFR fuel input port"
+ name = "\improper HFR fuel input port"
desc = "Input port for the Hypertorus Fusion Reactor, designed to take in fuels with the optimal fuel mix being a 50/50 split."
icon_state = "fuel_input"
base_icon_state = "fuel_input"
circuit = /obj/item/circuitboard/machine/HFR_fuel_input
/obj/machinery/atmospherics/components/unary/hypertorus/waste_output
- name = "HFR waste output port"
+ name = "\improper HFR waste output port"
desc = "Waste port for the Hypertorus Fusion Reactor, designed to output the hot waste gases coming from the core of the machine."
icon_state = "waste_output"
base_icon_state = "waste_output"
circuit = /obj/item/circuitboard/machine/HFR_waste_output
/obj/machinery/atmospherics/components/unary/hypertorus/moderator_input
- name = "HFR moderator input port"
+ name = "\improper HFR moderator input port"
desc = "Moderator port for the Hypertorus Fusion Reactor, designed to move gases inside the machine to cool and control the flow of the reaction."
icon_state = "moderator_input"
base_icon_state = "moderator_input"
@@ -135,7 +135,7 @@
. += emissive_appearance(icon, "[base_icon_state]_active", src, alpha = src.alpha)
/obj/machinery/hypertorus/interface
- name = "HFR interface"
+ name = "\improper HFR interface"
desc = "Interface for the HFR to control the flow of the reaction."
icon_state = "interface"
base_icon_state = "interface"
@@ -379,7 +379,7 @@
. = TRUE
/obj/machinery/hypertorus/corner
- name = "HFR corner"
+ name = "\improper HFR corner"
desc = "Structural piece of the machine."
icon_state = "corner"
base_icon_state = "corner"
@@ -411,7 +411,7 @@
use more advanced guides to understando how the various gases will act as moderators."
/obj/item/hfr_box
- name = "HFR box"
+ name = "\improper HFR box"
desc = "If you see this, call the police."
icon = 'icons/obj/machines/atmospherics/hypertorus.dmi'
icon_state = "error"
@@ -421,39 +421,39 @@
var/part_path
/obj/item/hfr_box/corner
- name = "HFR box corner"
+ name = "\improper HFR box corner"
desc = "Place this as the corner of your 3x3 multiblock fusion reactor"
icon_state = "box_corner"
box_type = "corner"
part_path = /obj/machinery/hypertorus/corner
/obj/item/hfr_box/body
- name = "HFR box body"
+ name = "\improper HFR box body"
desc = "Place this on the sides of the core box of your 3x3 multiblock fusion reactor"
box_type = "body"
icon_state = "box_body"
/obj/item/hfr_box/body/fuel_input
- name = "HFR box fuel input"
+ name = "\improper HFR box fuel input"
icon_state = "box_fuel"
part_path = /obj/machinery/atmospherics/components/unary/hypertorus/fuel_input
/obj/item/hfr_box/body/moderator_input
- name = "HFR box moderator input"
+ name = "\improper HFR box moderator input"
icon_state = "box_moderator"
part_path = /obj/machinery/atmospherics/components/unary/hypertorus/moderator_input
/obj/item/hfr_box/body/waste_output
- name = "HFR box waste output"
+ name = "\improper HFR box waste output"
icon_state = "box_waste"
part_path = /obj/machinery/atmospherics/components/unary/hypertorus/waste_output
/obj/item/hfr_box/body/interface
- name = "HFR box interface"
+ name = "\improper HFR box interface"
part_path = /obj/machinery/hypertorus/interface
/obj/item/hfr_box/core
- name = "HFR box core"
+ name = "\improper HFR box core"
desc = "Activate this with a multitool to deploy the full machine after setting up the other boxes"
icon_state = "box_core"
box_type = "core"
diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/atmos_machines_recipes.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/atmos_machines_recipes.dm
index 13c872199dc0..8e94efa1a943 100644
--- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/atmos_machines_recipes.dm
+++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/atmos_machines_recipes.dm
@@ -38,7 +38,7 @@ GLOBAL_LIST_INIT(gas_recipe_meta, gas_recipes_list())
/datum/gas_recipe/crystallizer/hypern_crystalium
id = "hyper_crystalium"
- name = "Hypernoblium Crystal"
+ name = "Hyper-Noblium Crystal"
min_temp = 3
max_temp = 250
energy_release = -250000
@@ -47,7 +47,7 @@ GLOBAL_LIST_INIT(gas_recipe_meta, gas_recipes_list())
/datum/gas_recipe/crystallizer/metallic_hydrogen
id = "metal_h"
- name = "Metallic hydrogen"
+ name = "Metallic Hydrogen"
min_temp = 50000
max_temp = 150000
energy_release = -2500000
@@ -56,7 +56,7 @@ GLOBAL_LIST_INIT(gas_recipe_meta, gas_recipes_list())
/datum/gas_recipe/crystallizer/healium_grenade
id = "healium_g"
- name = "Healium crystal"
+ name = "Healium Crystal"
min_temp = 200
max_temp = 400
energy_release = -2000000
@@ -65,7 +65,7 @@ GLOBAL_LIST_INIT(gas_recipe_meta, gas_recipes_list())
/datum/gas_recipe/crystallizer/proto_nitrate_grenade
id = "proto_nitrate_g"
- name = "Proto nitrate crystal"
+ name = "Proto-Nitrate Crystal"
min_temp = 200
max_temp = 400
energy_release = 1500000
@@ -74,7 +74,7 @@ GLOBAL_LIST_INIT(gas_recipe_meta, gas_recipes_list())
/datum/gas_recipe/crystallizer/hot_ice
id = "hot_ice"
- name = "Hot ice"
+ name = "Hot Ice"
min_temp = 15
max_temp = 35
energy_release = -3000000
@@ -83,7 +83,7 @@ GLOBAL_LIST_INIT(gas_recipe_meta, gas_recipes_list())
/datum/gas_recipe/crystallizer/ammonia_crystal
id = "ammonia_crystal"
- name = "Ammonia crystal"
+ name = "Ammonia Crystal"
min_temp = 200
max_temp = 240
energy_release = 950000
@@ -92,7 +92,7 @@ GLOBAL_LIST_INIT(gas_recipe_meta, gas_recipes_list())
/datum/gas_recipe/crystallizer/shard
id = "crystal_shard"
- name = "Supermatter crystal shard"
+ name = "Supermatter Crystal Shard"
min_temp = 10
max_temp = 20
energy_release = 3500000
@@ -102,7 +102,7 @@ GLOBAL_LIST_INIT(gas_recipe_meta, gas_recipes_list())
/datum/gas_recipe/crystallizer/n2o_crystal
id = "n2o_crystal"
- name = "Nitrous oxide crystal"
+ name = "Nitrous Oxide Crystal"
min_temp = 50
max_temp = 350
energy_release = 3500000
@@ -120,7 +120,7 @@ GLOBAL_LIST_INIT(gas_recipe_meta, gas_recipes_list())
/datum/gas_recipe/crystallizer/plasma_sheet
id = "plasma_sheet"
- name = "Plasma sheet"
+ name = "Solidified Plasma"
min_temp = 10
max_temp = 20
energy_release = 3500000
@@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(gas_recipe_meta, gas_recipes_list())
/datum/gas_recipe/crystallizer/zaukerite
id = "zaukerite"
- name = "Zaukerite sheet"
+ name = "Solidified Zauker"
min_temp = 5
max_temp = 20
energy_release = 2900000
@@ -147,35 +147,35 @@ GLOBAL_LIST_INIT(gas_recipe_meta, gas_recipes_list())
/datum/gas_recipe/crystallizer/fuel_pellet
id = "fuel_basic"
- name = "standard fuel pellet"
+ name = "Standard Fuel Pellet"
energy_release = -6000000
requirements = list(/datum/gas/oxygen = 50, /datum/gas/plasma = 100)
products = list(/obj/item/fuel_pellet = 1)
/datum/gas_recipe/crystallizer/fuel_pellet_advanced
id = "fuel_advanced"
- name = "advanced fuel pellet"
+ name = "Advanced Fuel Pellet"
energy_release = -6000000
requirements = list(/datum/gas/tritium = 100, /datum/gas/hydrogen = 100)
products = list(/obj/item/fuel_pellet/advanced = 1)
/datum/gas_recipe/crystallizer/fuel_pellet_exotic
id = "fuel_exotic"
- name = "exotic fuel pellet"
+ name = "Exotic Fuel Pellet"
energy_release = -6000000
requirements = list(/datum/gas/hypernoblium = 100, /datum/gas/nitrium = 100)
products = list(/obj/item/fuel_pellet/exotic = 1)
/datum/gas_recipe/crystallizer/crystal_foam
id = "crystal_foam"
- name = "Crystal foam grenade"
+ name = "Foam Crystal"
energy_release = 140000
requirements = list(/datum/gas/carbon_dioxide = 150, /datum/gas/nitrous_oxide = 100, /datum/gas/water_vapor = 25)
products = list(/obj/item/grenade/gas_crystal/crystal_foam = 1)
/datum/gas_recipe/crystallizer/crystallized_nitrium
id = "crystallized_nitrium"
- name = "Nitrium crystal"
+ name = "Nitrium Crystal"
min_temp = 10
max_temp = 25
energy_release = -45000
diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm
index 440be922316e..2c28296a0f86 100644
--- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm
+++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm
@@ -1,6 +1,6 @@
/obj/item/hypernoblium_crystal
- name = "Hypernoblium Crystal"
- desc = "Crystallized oxygen and hypernoblium stored in a bottle to pressure-proof your clothes or stop reactions occurring in portable atmospheric devices."
+ name = "\improper Hyper-Noblium crystal"
+ desc = "Crystallized Oxygen and Hyper-Noblium stored in a bottle. Pressure-proofs clothing or stop reactions occurring in portable atmospheric devices."
icon = 'icons/obj/pipes_n_cables/atmos.dmi'
icon_state = "hypernoblium_crystal"
var/uses = 1
@@ -40,8 +40,8 @@
return ITEM_INTERACT_SUCCESS
/obj/item/nitrium_crystal
- desc = "A weird brown crystal, it smokes when broken"
- name = "nitrium crystal"
+ name = "\improper Nitrium crystal"
+ desc = "A strange brown crystal that emits a foul smoke when chipped."
icon = 'icons/obj/pipes_n_cables/atmos.dmi'
icon_state = "nitrium_crystal"
var/cloud_size = 1
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
index 76a78ab1cac8..c9dec3e037a4 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
@@ -224,57 +224,75 @@
/obj/machinery/atmospherics/components/trinary/filter/atmos //Used for atmos waste loops
on = TRUE
icon_state = "filter_on-0"
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/n2
name = "nitrogen filter"
filter_type = list(/datum/gas/nitrogen)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/o2
name = "oxygen filter"
filter_type = list(/datum/gas/oxygen)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/co2
name = "carbon dioxide filter"
filter_type = list(/datum/gas/carbon_dioxide)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o
name = "nitrous oxide filter"
filter_type = list(/datum/gas/nitrous_oxide)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma
name = "plasma filter"
filter_type = list(/datum/gas/plasma)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/bz
name = "bz filter"
filter_type = list(/datum/gas/bz)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/freon
name = "freon filter"
filter_type = list(/datum/gas/freon)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/halon
name = "halon filter"
filter_type = list(/datum/gas/halon)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/healium
name = "healium filter"
filter_type = list(/datum/gas/healium)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/h2
name = "hydrogen filter"
filter_type = list(/datum/gas/hydrogen)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/hypernoblium
- name = "hypernoblium filter"
+ name = "hyper-noblium filter"
filter_type = list(/datum/gas/hypernoblium)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/miasma
name = "miasma filter"
filter_type = list(/datum/gas/miasma)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/no2
name = "nitrium filter"
filter_type = list(/datum/gas/nitrium)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/pluoxium
name = "pluoxium filter"
filter_type = list(/datum/gas/pluoxium)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/proto_nitrate
name = "proto-nitrate filter"
filter_type = list(/datum/gas/proto_nitrate)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/tritium
name = "tritium filter"
filter_type = list(/datum/gas/tritium)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/h2o
name = "water vapor filter"
filter_type = list(/datum/gas/water_vapor)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/zauker
name = "zauker filter"
filter_type = list(/datum/gas/zauker)
@@ -284,71 +302,91 @@
filter_type = list(/datum/gas/helium)
/obj/machinery/atmospherics/components/trinary/filter/atmos/antinoblium
- name = "antinoblium filter"
+ name = "anti-noblium filter"
filter_type = list(/datum/gas/antinoblium)
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped //This feels wrong, I know
icon_state = "filter_on-0_f"
flipped = TRUE
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2
name = "nitrogen filter"
filter_type = list(/datum/gas/nitrogen)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/o2
name = "oxygen filter"
filter_type = list(/datum/gas/oxygen)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2
name = "carbon dioxide filter"
filter_type = list(/datum/gas/carbon_dioxide)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o
name = "nitrous oxide filter"
filter_type = list(/datum/gas/nitrous_oxide)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma
name = "plasma filter"
filter_type = list(/datum/gas/plasma)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/bz
name = "bz filter"
filter_type = list(/datum/gas/bz)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/freon
name = "freon filter"
filter_type = list(/datum/gas/freon)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/halon
name = "halon filter"
filter_type = list(/datum/gas/halon)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/healium
name = "healium filter"
filter_type = list(/datum/gas/healium)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/h2
name = "hydrogen filter"
filter_type = list(/datum/gas/hydrogen)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/hypernoblium
- name = "hypernoblium filter"
+ name = "hyper-noblium filter"
filter_type = list(/datum/gas/hypernoblium)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/miasma
name = "miasma filter"
filter_type = list(/datum/gas/miasma)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/no2
name = "nitrium filter"
filter_type = list(/datum/gas/nitrium)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/pluoxium
name = "pluoxium filter"
filter_type = list(/datum/gas/pluoxium)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/proto_nitrate
name = "proto-nitrate filter"
filter_type = list(/datum/gas/proto_nitrate)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/tritium
name = "tritium filter"
filter_type = list(/datum/gas/tritium)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/h2o
name = "water vapor filter"
filter_type = list(/datum/gas/water_vapor)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/zauker
name = "zauker filter"
filter_type = list(/datum/gas/zauker)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/helium
name = "helium filter"
filter_type = list(/datum/gas/helium)
+
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/antinoblium
- name = "antinoblium filter"
+ name = "anti-noblium filter"
filter_type = list(/datum/gas/antinoblium)
// These two filter types have critical_machine flagged to on and thus causes the area they are in to be exempt from the Grid Check event.
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index 0d83f675097b..d5b0c45802a4 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -122,7 +122,7 @@
// Basic canister per gas below here
/obj/machinery/portable_atmospherics/canister/air
- name = "Air canister"
+ name = "\improper Air canister"
desc = "Pre-mixed air."
icon_state = "/obj/machinery/portable_atmospherics/canister/air"
post_init_icon_state = ""
@@ -130,7 +130,7 @@
greyscale_colors = "#c6c0b5"
/obj/machinery/portable_atmospherics/canister/antinoblium
- name = "Antinoblium canister"
+ name = "\improper Anti-Noblium canister"
gas_type = /datum/gas/antinoblium
filled = 1
icon_state = "/obj/machinery/portable_atmospherics/canister/antinoblium"
@@ -147,7 +147,7 @@
greyscale_colors = "#9b5d7f#d0d2a0"
/obj/machinery/portable_atmospherics/canister/carbon_dioxide
- name = "Carbon dioxide canister"
+ name = "\improper Carbon dioxide canister"
gas_type = /datum/gas/carbon_dioxide
icon_state = "/obj/machinery/portable_atmospherics/canister/carbon_dioxide"
post_init_icon_state = ""
@@ -155,7 +155,7 @@
greyscale_colors = "#4e4c48#eaeaea"
/obj/machinery/portable_atmospherics/canister/freon
- name = "Freon canister"
+ name = "\improper Freon canister"
gas_type = /datum/gas/freon
filled = 1
icon_state = "/obj/machinery/portable_atmospherics/canister/freon"
@@ -164,7 +164,7 @@
greyscale_colors = "#6696ee#fefb30"
/obj/machinery/portable_atmospherics/canister/halon
- name = "Halon canister"
+ name = "\improper Halon canister"
gas_type = /datum/gas/halon
filled = 1
icon_state = "/obj/machinery/portable_atmospherics/canister/halon"
@@ -173,7 +173,7 @@
greyscale_colors = "#9b5d7f#368bff"
/obj/machinery/portable_atmospherics/canister/healium
- name = "Healium canister"
+ name = "\improper Healium canister"
gas_type = /datum/gas/healium
filled = 1
icon_state = "/obj/machinery/portable_atmospherics/canister/healium"
@@ -182,7 +182,7 @@
greyscale_colors = "#009823#ff0e00"
/obj/machinery/portable_atmospherics/canister/helium
- name = "Helium canister"
+ name = "\improper Helium canister"
gas_type = /datum/gas/helium
filled = 1
icon_state = "/obj/machinery/portable_atmospherics/canister/helium"
@@ -191,7 +191,7 @@
greyscale_colors = "#9b5d7f#368bff"
/obj/machinery/portable_atmospherics/canister/hydrogen
- name = "Hydrogen canister"
+ name = "\improper Hydrogen canister"
gas_type = /datum/gas/hydrogen
filled = 1
icon_state = "/obj/machinery/portable_atmospherics/canister/hydrogen"
@@ -200,7 +200,7 @@
greyscale_colors = "#eaeaea#be3455"
/obj/machinery/portable_atmospherics/canister/miasma
- name = "Miasma canister"
+ name = "\improper Miasma canister"
gas_type = /datum/gas/miasma
filled = 1
icon_state = "/obj/machinery/portable_atmospherics/canister/miasma"
@@ -209,7 +209,7 @@
greyscale_colors = "#009823#f7d5d3"
/obj/machinery/portable_atmospherics/canister/nitrogen
- name = "Nitrogen canister"
+ name = "\improper Nitrogen canister"
gas_type = /datum/gas/nitrogen
icon_state = "/obj/machinery/portable_atmospherics/canister/nitrogen"
post_init_icon_state = ""
@@ -217,7 +217,7 @@
greyscale_colors = "#e9ff5c#f4fce8"
/obj/machinery/portable_atmospherics/canister/nitrous_oxide
- name = "Nitrous oxide canister"
+ name = "\improper Nitrous Oxide canister"
gas_type = /datum/gas/nitrous_oxide
icon_state = "/obj/machinery/portable_atmospherics/canister/nitrous_oxide"
post_init_icon_state = ""
@@ -225,7 +225,7 @@
greyscale_colors = "#c63e3b#f7d5d3"
/obj/machinery/portable_atmospherics/canister/nitrium
- name = "Nitrium canister"
+ name = "\improper Nitrium canister"
gas_type = /datum/gas/nitrium
icon_state = "/obj/machinery/portable_atmospherics/canister/nitrium"
post_init_icon_state = ""
@@ -233,7 +233,7 @@
greyscale_colors = "#7b4732"
/obj/machinery/portable_atmospherics/canister/nob
- name = "Hyper-noblium canister"
+ name = "\improper Hyper-Noblium canister"
gas_type = /datum/gas/hypernoblium
icon_state = "/obj/machinery/portable_atmospherics/canister/nob"
post_init_icon_state = ""
@@ -241,7 +241,7 @@
greyscale_colors = "#6399fc#b2b2b2"
/obj/machinery/portable_atmospherics/canister/oxygen
- name = "Oxygen canister"
+ name = "\improper Oxygen canister"
gas_type = /datum/gas/oxygen
icon_state = "/obj/machinery/portable_atmospherics/canister/oxygen"
post_init_icon_state = ""
@@ -249,7 +249,7 @@
greyscale_colors = "#2786e5#e8fefe"
/obj/machinery/portable_atmospherics/canister/pluoxium
- name = "Pluoxium canister"
+ name = "\improper Pluoxium canister"
gas_type = /datum/gas/pluoxium
icon_state = "/obj/machinery/portable_atmospherics/canister/pluoxium"
post_init_icon_state = ""
@@ -257,7 +257,7 @@
greyscale_colors = "#2786e5"
/obj/machinery/portable_atmospherics/canister/proto_nitrate
- name = "Proto Nitrate canister"
+ name = "\improper Proto-Nitrate canister"
gas_type = /datum/gas/proto_nitrate
filled = 1
icon_state = "/obj/machinery/portable_atmospherics/canister/proto_nitrate"
@@ -266,7 +266,7 @@
greyscale_colors = "#008200#33cc33"
/obj/machinery/portable_atmospherics/canister/plasma
- name = "Plasma canister"
+ name = "\improper Plasma canister"
gas_type = /datum/gas/plasma
icon_state = "/obj/machinery/portable_atmospherics/canister/plasma"
post_init_icon_state = ""
@@ -274,7 +274,7 @@
greyscale_colors = "#f62800#000000"
/obj/machinery/portable_atmospherics/canister/tritium
- name = "Tritium canister"
+ name = "\improper Tritium canister"
gas_type = /datum/gas/tritium
icon_state = "/obj/machinery/portable_atmospherics/canister/tritium"
post_init_icon_state = ""
@@ -282,7 +282,7 @@
greyscale_colors = "#3fcd40#000000"
/obj/machinery/portable_atmospherics/canister/water_vapor
- name = "Water vapor canister"
+ name = "\improper Water Vapor canister"
gas_type = /datum/gas/water_vapor
filled = 1
icon_state = "/obj/machinery/portable_atmospherics/canister/water_vapor"
@@ -291,7 +291,7 @@
greyscale_colors = "#4c4e4d#f7d5d3"
/obj/machinery/portable_atmospherics/canister/zauker
- name = "Zauker canister"
+ name = "\improper Zauker canister"
gas_type = /datum/gas/zauker
filled = 1
icon_state = "/obj/machinery/portable_atmospherics/canister/zauker"
diff --git a/code/modules/bitrunning/antagonists/_parent.dm b/code/modules/bitrunning/antagonists/_parent.dm
index e73d159bddb2..824c7aac2f03 100644
--- a/code/modules/bitrunning/antagonists/_parent.dm
+++ b/code/modules/bitrunning/antagonists/_parent.dm
@@ -1,5 +1,6 @@
/datum/job/bitrunning_glitch
title = ROLE_GLITCH
+ tgui_icon = FA_ICON_QRCODE
/datum/antagonist/bitrunning_glitch
name = "Generic Bitrunning Glitch"
diff --git a/code/modules/bitrunning/job.dm b/code/modules/bitrunning/job.dm
index 8939478018e1..a0f0f0c7d1b6 100644
--- a/code/modules/bitrunning/job.dm
+++ b/code/modules/bitrunning/job.dm
@@ -29,6 +29,7 @@
)
rpg_title = "Recluse"
job_flags = STATION_JOB_FLAGS
+ tgui_icon = FA_ICON_GAMEPAD
/datum/outfit/job/bitrunner
name = "Bitrunner"
@@ -41,3 +42,4 @@
/datum/job/bit_avatar
title = "Bit Avatar"
+ tgui_icon = FA_ICON_CODE
diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm
index 2a4b40259b92..7cc617595333 100644
--- a/code/modules/cargo/exports.dm
+++ b/code/modules/cargo/exports.dm
@@ -174,6 +174,8 @@ Then the player gets the profit from selling his own wasted time.
var/total = get_base_cost(exported_item) * get_amount(exported_item)
if(apply_elastic && initial(k_elasticity) > 0)
total *= k_elasticity
+ if(type in SSeconomy.boosted_exports)
+ total *= EXPORT_BOOST_MULT
return ROUND_UP(total)
/// Checks if the item is fit for export datum.
diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm
index ab23ad7e95dc..249dcc3aec7b 100644
--- a/code/modules/cargo/exports/large_objects.dm
+++ b/code/modules/cargo/exports/large_objects.dm
@@ -131,28 +131,13 @@
return 0
var/cached_moles = canister_mix.moles
- var/static/list/gases_to_check = list(
- /datum/gas/bz,
- /datum/gas/nitrium,
- /datum/gas/hypernoblium,
- /datum/gas/miasma,
- /datum/gas/tritium,
- /datum/gas/pluoxium,
- /datum/gas/freon,
- /datum/gas/hydrogen,
- /datum/gas/healium,
- /datum/gas/proto_nitrate,
- /datum/gas/zauker,
- /datum/gas/helium,
- /datum/gas/antinoblium,
- /datum/gas/halon,
- )
-
var/worth = cost
- for(var/gas_id in gases_to_check)
- canister_mix.assert_gas(gas_id)
- if(cached_moles[gas_id] > 0)
- worth += get_gas_value(gas_id, cached_moles[gas_id])
+ for(var/datum/gas/gas as anything in GLOB.meta_gas_info[META_GAS_ID])
+ if(!(initial(gas.cargo_flags) & GAS_EXPORTABLE))
+ continue
+ canister_mix.assert_gas(gas)
+ if(cached_moles[gas] > 0)
+ worth += get_gas_value(gas, cached_moles[gas])
if(worth > MAX_GAS_CREDITS)
worth = MAX_GAS_CREDITS
break
diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm
index cdfb7138de90..b2e7419f91ff 100644
--- a/code/modules/cargo/packs/materials.dm
+++ b/code/modules/cargo/packs/materials.dm
@@ -84,19 +84,18 @@
// This is the amount of moles in a default canister
var/moleCount = (initial(fakeCanister.maximum_pressure) * initial(fakeCanister.filled)) * initial(fakeCanister.volume) / (R_IDEAL_GAS_EQUATION * T20C)
- for(var/gasType in GLOB.meta_gas_info[META_GAS_ID])
- var/datum/gas/gas = gasType
- var/name = initial(gas.name)
- if(!initial(gas.purchaseable))
+ for(var/datum/gas/gas as anything in GLOB.meta_gas_info[META_GAS_ID])
+ if(!(initial(gas.cargo_flags) & GAS_PURCHASABLE))
continue
var/datum/supply_pack/materials/pack = new
- pack.name = "[name] Canister"
- pack.desc = "Contains a canister of [name]."
- if(initial(gas.dangerous))
+ var/canname = initial(gas.name)
+ pack.name = "[canname] Canister"
+ pack.desc = "Contains a canister of [canname]."
+ if(initial(gas.cargo_flags) & GAS_DANGEROUS)
pack.access = ACCESS_ATMOSPHERICS
pack.access_view = ACCESS_ATMOSPHERICS
- pack.crate_name = "[name] canister crate"
- pack.id = "[type]([name])"
+ pack.crate_name = "[canname] canister crate"
+ pack.id = "[type]([canname])"
pack.cost = cost + moleCount * initial(gas.base_value) * 1.6
pack.cost = CEILING(pack.cost, 10)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index e4a3e60a4eb4..9330a77a3a64 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -226,7 +226,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
// DARKPACK EDIT ADD START - (patches alot of minor exploits from midround char sheet manipulation)
if(!isnewplayer(usr) && ("[usr.client.prefs.default_slot]" in usr.persistent_client.joined_as_slots))
if(check_rights(R_ADMIN))
- to_chat(usr, span_warning("Swapping between character slots midround is unsupported and can lead to false writes to prefrences."))
+ to_chat(usr, span_warning("Swapping between character slots midround is unsupported and can lead to false writes to preferences."))
else
to_chat(usr, span_warning("You cannot be spawned in as this character to swap character slots. Return to the lobby to change characters."))
return FALSE
diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm
index f747c3bae7e3..f086b992ac38 100644
--- a/code/modules/client/preferences/_preference.dm
+++ b/code/modules/client/preferences/_preference.dm
@@ -402,6 +402,14 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
var/is_character_preference = savefile_identifier == PREFERENCE_CHARACTER
return is_on_character_page == is_character_preference
+/// Helper for checking if one/any of the passed job types are the highest priority job for the passed preferences object
+/// Useful for filtering out certain preferences unless certain jobs are/are not active
+/datum/preference/proc/highest_priority_job_is(datum/preferences/preferences, job_type_or_types)
+ if(islist(job_type_or_types))
+ return is_type_in_list(preferences.get_highest_priority_job(), job_type_or_types)
+
+ return istype(preferences.get_highest_priority_job(), job_type_or_types)
+
/// A preference that is a choice of one option among a fixed set.
/// Used for preferences such as clothing.
/datum/preference/choiced
diff --git a/code/modules/client/preferences/ai_core_display.dm b/code/modules/client/preferences/ai_core_display.dm
index 6afd85c6e90b..824fae4a3a17 100644
--- a/code/modules/client/preferences/ai_core_display.dm
+++ b/code/modules/client/preferences/ai_core_display.dm
@@ -15,10 +15,7 @@
return uni_icon('icons/mob/silicon/ai.dmi', resolve_ai_icon_sync(value))
/datum/preference/choiced/ai_core_display/is_accessible(datum/preferences/preferences)
- if (!..(preferences))
- return FALSE
-
- return istype(preferences.get_highest_priority_job(), /datum/job/ai)
+ return ..() && highest_priority_job_is(preferences, /datum/job/ai)
/datum/preference/choiced/ai_core_display/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
return
diff --git a/code/modules/client/preferences/ai_emote_display.dm b/code/modules/client/preferences/ai_emote_display.dm
index 321cbdbf3b11..08b8b9adcba8 100644
--- a/code/modules/client/preferences/ai_emote_display.dm
+++ b/code/modules/client/preferences/ai_emote_display.dm
@@ -20,10 +20,7 @@
return uni_icon('icons/obj/machines/status_display.dmi', GLOB.ai_status_display_all_options[value])
/datum/preference/choiced/ai_emote_display/is_accessible(datum/preferences/preferences)
- if (!..(preferences))
- return FALSE
-
- return istype(preferences.get_highest_priority_job(), /datum/job/ai)
+ return ..() && highest_priority_job_is(preferences, /datum/job/ai)
/datum/preference/choiced/ai_emote_display/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
return
diff --git a/code/modules/client/preferences/ai_hologram_display.dm b/code/modules/client/preferences/ai_hologram_display.dm
index 935c71c39850..da53acb0a8ae 100644
--- a/code/modules/client/preferences/ai_hologram_display.dm
+++ b/code/modules/client/preferences/ai_hologram_display.dm
@@ -16,10 +16,7 @@
return uni_icon(GLOB.ai_hologram_icons[value], GLOB.ai_hologram_icon_state[value])
/datum/preference/choiced/ai_hologram_display/is_accessible(datum/preferences/preferences)
- if (!..(preferences))
- return FALSE
-
- return istype(preferences.get_highest_priority_job(), /datum/job/ai)
+ return ..() && highest_priority_job_is(preferences, /datum/job/ai)
/datum/preference/choiced/ai_hologram_display/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
return
diff --git a/code/modules/client/preferences/height.dm b/code/modules/client/preferences/height.dm
new file mode 100644
index 000000000000..087b6c090329
--- /dev/null
+++ b/code/modules/client/preferences/height.dm
@@ -0,0 +1,37 @@
+/* // DARKPACK EDIT REMOVAL - (Removed in favor of `modular_darkpack/modules/preferences/height_preference.dm`)
+#define DEFAULT_HEIGHT "Average"
+
+/datum/preference/choiced/mob_height
+ savefile_key = "character_height"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ can_randomize = FALSE
+ var/list/height_to_actual = list(
+ // "Shortest" = HUMAN_HEIGHT_SHORTEST, // Reserved for Settler
+ "Short" = HUMAN_HEIGHT_SHORT,
+ DEFAULT_HEIGHT = HUMAN_HEIGHT_MEDIUM,
+ "Tall" = HUMAN_HEIGHT_TALL,
+ // "Taller" = HUMAN_HEIGHT_TALLER, // Reserved for Spacer
+ // "Tallest" = HUMAN_HEIGHT_TALLEST, // Reserved for Spacer
+ )
+
+/datum/preference/choiced/mob_height/init_possible_values()
+ return assoc_to_keys(height_to_actual)
+
+/datum/preference/choiced/mob_height/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
+ target.set_mob_height(height_to_actual[value] || DEFAULT_HEIGHT)
+
+/datum/preference/choiced/mob_height/is_accessible(datum/preferences/preferences)
+ if(highest_priority_job_is(preferences, list(/datum/job/cyborg, /datum/job/ai)))
+ return FALSE
+ if(/datum/quirk/settler::name in preferences.all_quirks)
+ return FALSE
+ if(/datum/quirk/spacer_born::name in preferences.all_quirks)
+ return FALSE
+ return ..()
+
+/datum/preference/choiced/mob_height/create_default_value(datum/preferences/preferences)
+ return DEFAULT_HEIGHT
+
+#undef DEFAULT_HEIGHT
+*/
diff --git a/code/modules/client/preferences/prisoner_crime.dm b/code/modules/client/preferences/prisoner_crime.dm
index f8d485cb23cd..f99b0d352f66 100644
--- a/code/modules/client/preferences/prisoner_crime.dm
+++ b/code/modules/client/preferences/prisoner_crime.dm
@@ -15,10 +15,7 @@
return "Random"
/datum/preference/choiced/prisoner_crime/is_accessible(datum/preferences/preferences)
- if (!..(preferences))
- return FALSE
-
- return istype(preferences.get_highest_priority_job(), /datum/job/prisoner)
+ return ..() && highest_priority_job_is(preferences, /datum/job/prisoner)
/// Types of Crimes Prisoners will have on their record roundstart.
/// (They also can choose Random, which picks from these options... randomly!)
diff --git a/code/modules/client/preferences/spacer_born.dm b/code/modules/client/preferences/spacer_born.dm
index cb2d78e4b16b..a11ba0ed70a2 100644
--- a/code/modules/client/preferences/spacer_born.dm
+++ b/code/modules/client/preferences/spacer_born.dm
@@ -16,5 +16,5 @@
associated_typepath = /datum/quirk/spacer_born
customization_options = list(/datum/preference/choiced/spacer_height)
-/datum/preference/choiced/spacer_height/apply_to_human(mob/living/carbon/human/target, value)
+/datum/preference/choiced/spacer_height/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
return
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 99d2b66df441..8f4d6af5643b 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -507,7 +507,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
for(var/stat_typepath in stats_list)
var/datum/st_stat/stat = stats_list[stat_typepath]
new_stats_list[stat_typepath] = list()
- new_stats_list[stat_typepath][STAT_SCORE] = stat.get_score(include_bonus = FALSE)
+ new_stats_list[stat_typepath][STAT_SCORE] = stat.get_pure_score()
new_stats_list[stat_typepath][STAT_POINTS] = stat.get_points()
new_stats_list[stat_typepath][STAT_FREEBIE_COST_SPENT] = stat.freebie_cost_spent
save_data["preference_storyteller_stats"] = new_stats_list
@@ -552,6 +552,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
stack_trace("remove_current_slot() being called when there are no slots to go to, the client should prevent this")
return
+ discipline_levels = list() // DARKPACK EDIT ADD - remove disciplines when removing a character slot
savefile.remove_entry("character[default_slot]")
tainted_character_profiles = TRUE
switch_to_slot(closest_slot)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index d3110ea61ddb..1ebfbb3f0a87 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -106,19 +106,20 @@
qdel(src)
/obj/item/clothing/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers)
- if(user.combat_mode || !HAS_TRAIT(user, TRAIT_CLOTH_EATER) || ispickedupmob(src))
- return ..()
- if((clothing_flags & INEDIBLE_CLOTHING) || (resistance_flags & INDESTRUCTIBLE))
+ if(user.combat_mode || !HAS_TRAIT(user, TRAIT_CLOTH_EATER) || (resistance_flags & INDESTRUCTIBLE))
return ..()
+ moth_snack ||= create_moth_snack()
if(isnull(moth_snack))
- create_moth_snack()
+ to_chat(user, span_warning("You can't eat [src]!"))
+ return
moth_snack.attack(target, user, modifiers)
/// Creates a food object in null space which we can eat and imagine we're eating this pair of shoes
/obj/item/clothing/proc/create_moth_snack()
- moth_snack = new
- moth_snack.name = name
- moth_snack.clothing = WEAKREF(src)
+ var/obj/item/food/clothing/new_moth_snack = new
+ new_moth_snack.name = name
+ new_moth_snack.clothing = WEAKREF(src)
+ return new_moth_snack
/obj/item/clothing/item_interaction(mob/living/user, obj/item/weapon, list/modifiers)
. = NONE
diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm
index 081cabf7a852..52350e28502f 100644
--- a/code/modules/clothing/head/_head.dm
+++ b/code/modules/clothing/head/_head.dm
@@ -8,16 +8,19 @@
body_parts_covered = HEAD
slot_flags = ITEM_SLOT_HEAD
-///Special throw_impact for hats to frisbee hats at people to place them on their heads/attempt to de-hat them.
+/// Can we land on people's heads?
+/obj/item/clothing/head/proc/can_throw_equip(atom/hit_atom)
+ return TRUE
+
+// Special throw_impact for hats to frisbee hats at people to place them on their heads/attempt to de-hat them.
/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)
+ if(!can_throw_equip(hit_atom))
return
- ///ignore any hats with the tinfoil counter-measure enabled
- if(clothing_flags & ANTI_TINFOIL_MANEUVER)
+ // if the thrown object's target zone isn't the head
+ if(thrownthing.target_zone != BODY_ZONE_HEAD)
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 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))
return
if(iscarbon(hit_atom))
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index 05f94232a85e..953989655611 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -218,11 +218,15 @@
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
visor_flags_cover = NONE
flags_inv = HIDEEARS|HIDEHAIR|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT
- hair_mask = ""
+ hair_mask = null
transparent_protection = HIDEMASK|HIDEEYES
visor_flags_inv = NONE
visor_state = "weldvisor_atmos"
+/obj/item/clothing/head/utility/hardhat/welding/atmos/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_HEAD, /datum/bodypart_texture/mesh/firesuit)
+
/obj/item/clothing/head/utility/hardhat/welding/atmos/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
@@ -238,7 +242,7 @@
hat_type = "pumpkin"
clothing_flags = SNUG_FIT | STACKABLE_HELMET_EXEMPT
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
- hair_mask = ""
+ hair_mask = null
armor_type = /datum/armor/none
light_range = 2 //luminosity when on
@@ -309,7 +313,7 @@
inhand_icon_state = null
hat_type = "reindeer"
flags_inv = 0
- hair_mask = ""
+ hair_mask = null
armor_type = /datum/armor/none
light_range = 1 //luminosity when on
clothing_traits = null
diff --git a/code/modules/clothing/head/hat.dm b/code/modules/clothing/head/hat.dm
index c37f0664c250..13ba8d4541ec 100644
--- a/code/modules/clothing/head/hat.dm
+++ b/code/modules/clothing/head/hat.dm
@@ -65,6 +65,7 @@
flags_cover = NONE
dirt_state = null
alternate_worn_layer = HAIR_LAYER
+ texture_type = /datum/bodypart_texture/mesh/black
/datum/armor/bio_hood_plague
bio = 100
diff --git a/code/modules/clothing/head/mind_monkey_helmet.dm b/code/modules/clothing/head/mind_monkey_helmet.dm
index a16dd7f08e62..9a551f49d8c9 100644
--- a/code/modules/clothing/head/mind_monkey_helmet.dm
+++ b/code/modules/clothing/head/mind_monkey_helmet.dm
@@ -38,7 +38,7 @@
. = ..()
if(!(slot & ITEM_SLOT_HEAD))
return
- if(!ismonkey(user) || user.ckey)
+ if(!HAS_TRAIT(user, TRAIT_LESSER_HUMANOID) || user.ckey)
var/mob/living/something = user
to_chat(something, span_boldnotice("You feel a stabbing pain in the back of your head for a moment."))
something.apply_damage(5,BRUTE,BODY_ZONE_HEAD,FALSE,FALSE,FALSE) //notably: no damage resist (it's in your helmet), no damage spread (it's in your helmet)
diff --git a/code/modules/clothing/head/tinfoilhat.dm b/code/modules/clothing/head/tinfoilhat.dm
index 04e3bb0d4364..00e378348404 100644
--- a/code/modules/clothing/head/tinfoilhat.dm
+++ b/code/modules/clothing/head/tinfoilhat.dm
@@ -5,7 +5,6 @@
inhand_icon_state = null
armor_type = /datum/armor/costume_foilhat
equip_delay_other = 14 SECONDS
- clothing_flags = ANTI_TINFOIL_MANEUVER
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5)
clothing_traits = list(TRAIT_DONT_HEAR_PRAYERS) //stops you from hearing prayers as well, yes
var/datum/brain_trauma/mild/phobia/conspiracies/paranoia
@@ -67,7 +66,6 @@
name = "scorched tinfoil hat"
desc = "A badly warped up hat. Quite unlikely this will still work against any of the fictional or real dangers it used to."
warped = TRUE
- clothing_flags &= ~ANTI_TINFOIL_MANEUVER
if(!isliving(loc) || !paranoia)
return
var/mob/living/target = loc
@@ -78,6 +76,9 @@
if(!IS_UNCONSCIOUS(target))
to_chat(target, span_warning("Your zealous conspirationism rapidly dissipates as the donned hat warps up into a ruined mess. All those theories starting to sound like nothing but a ridicolous fanfare."))
+/obj/item/clothing/head/costume/foilhat/can_throw_equip(atom/hit_atom)
+ return warped
+
/obj/item/clothing/head/costume/foilhat/attack_hand(mob/user, list/modifiers)
if(!warped && user.get_item_by_slot(ITEM_SLOT_HEAD) == src)
to_chat(user, span_userdanger("Why would you want to take this off? Do you want them to get into your mind?!"))
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index acdb0507ca67..e18060fc67af 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -11,7 +11,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list(
name = "gas mask"
desc = "A face-covering mask that can be connected to an air supply. Good for concealing your identity and with a filter slot to help remove those toxins." //More accurate
icon_state = "gas_alt"
- clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS | GAS_FILTERING
+ clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT
w_class = WEIGHT_CLASS_NORMAL
inhand_icon_state = "gas_alt"
diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm
index d936a66cf171..51f55a81d3c9 100644
--- a/code/modules/clothing/masks/hailer.dm
+++ b/code/modules/clothing/masks/hailer.dm
@@ -48,7 +48,7 @@ GLOBAL_LIST_INIT(hailer_phrases, list(
actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust)
icon_state = "sechailer"
inhand_icon_state = "sechailer"
- clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS | GAS_FILTERING
+ clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
flags_inv = HIDEFACIALHAIR | HIDEFACE | HIDESNOUT
w_class = WEIGHT_CLASS_SMALL
visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
diff --git a/code/modules/clothing/masks/muzzle.dm b/code/modules/clothing/masks/muzzle.dm
index 6fa7b247a3e1..0c2b7fbe5ed7 100644
--- a/code/modules/clothing/masks/muzzle.dm
+++ b/code/modules/clothing/masks/muzzle.dm
@@ -25,7 +25,6 @@
worn_icon_state = "tape_piece_worn"
inhand_icon_state = null
w_class = WEIGHT_CLASS_TINY
- clothing_flags = INEDIBLE_CLOTHING
equip_delay_other = 4 SECONDS
strip_delay = 4 SECONDS
icon = 'icons/map_icons/clothing/mask.dmi'
@@ -39,6 +38,9 @@
///The ammount of damage dealt when the tape piece is ripped off of someone.
var/stripping_damage = 0
+/obj/item/clothing/mask/muzzle/tape/create_moth_snack()
+ return null
+
/obj/item/clothing/mask/muzzle/tape/examine(mob/user)
. = ..()
. += "[span_notice("Use it on someone while not in combat mode to tape their mouth closed!")]"
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index a998d6db29ae..0aac8793e2a8 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -503,8 +503,8 @@
fire = 50
acid = 40
-/obj/item/clothing/neck/petcollar/mob_can_equip(mob/M, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE, indirect_action = FALSE)
- if(!ismonkey(M) && !human_wearable)
+/obj/item/clothing/neck/petcollar/mob_can_equip(mob/mob, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE, indirect_action = FALSE)
+ if(!HAS_TRAIT(mob, TRAIT_LESSER_HUMANOID) && !human_wearable)
return FALSE
return ..()
diff --git a/code/modules/clothing/neck/collar_bomb.dm b/code/modules/clothing/neck/collar_bomb.dm
index 5d3c598fb2d4..13974d269b94 100644
--- a/code/modules/clothing/neck/collar_bomb.dm
+++ b/code/modules/clothing/neck/collar_bomb.dm
@@ -7,7 +7,6 @@
inhand_icon_state = "reverse_bear_trap"
lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
- clothing_flags = INEDIBLE_CLOTHING
armor_type = /datum/armor/collar_bomb
equip_delay_self = 6 SECONDS
equip_delay_other = 8 SECONDS
@@ -32,6 +31,9 @@
button = null
return ..()
+/obj/item/clothing/neck/collar_bomb/create_moth_snack()
+ return null
+
/obj/item/clothing/neck/collar_bomb/examine(mob/user)
. = ..()
if(user.get_item_by_slot(ITEM_SLOT_NECK) == src)
diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm
index 14aac47f5643..484896f64b92 100644
--- a/code/modules/clothing/spacesuits/_spacesuits.dm
+++ b/code/modules/clothing/spacesuits/_spacesuits.dm
@@ -51,6 +51,7 @@
if(fishing_modifier)
AddElement(/datum/element/adjust_fishing_difficulty, fishing_modifier)
add_stabilizer()
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_HEAD, /datum/bodypart_texture/mesh/space)
/obj/item/clothing/head/helmet/space/proc/add_stabilizer(loose_hat = TRUE)
AddComponent(/datum/component/hat_stabilizer, loose_hat = loose_hat)
@@ -131,6 +132,7 @@
if(fishing_modifier)
AddElement(/datum/element/adjust_fishing_difficulty, fishing_modifier)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, /datum/bodypart_texture/mesh/space)
/obj/item/clothing/suit/space/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot)
. = ..()
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 2c567ddf41f1..2815a7a5bcbe 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -298,10 +298,13 @@
strip_delay = 8 SECONDS
equip_delay_other = 6 SECONDS
clothing_traits = list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)
+ /// Type of texture applied by this
+ var/texture_type = /datum/bodypart_texture/mesh/heretic
/obj/item/clothing/suit/armor/riot/Initialize(mapload)
. = ..()
AddElement(/datum/element/adjust_fishing_difficulty, 5)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, texture_type)
init_rustle_component()
/obj/item/clothing/suit/armor/riot/proc/init_rustle_component()
@@ -460,6 +463,12 @@
slowdown = 3
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
armor_type = /datum/armor/armor_heavy
+ /// Type of texture applied by this
+ var/texture_type = /datum/bodypart_texture/mesh/black
+
+/obj/item/clothing/suit/armor/heavy/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, texture_type)
/datum/armor/armor_heavy
melee = 80
@@ -526,13 +535,15 @@
desc = "A classic suit of plate armour, highly effective at stopping melee attacks."
icon_state = "knight_green"
inhand_icon_state = null
+ texture_type = /datum/bodypart_texture/mesh/biosuit_dark
allowed = list(
/obj/item/banner,
/obj/item/claymore,
/obj/item/nullrod,
/obj/item/tank/internals/emergency_oxygen,
/obj/item/tank/internals/plasmaman,
- )
+ )
+
/obj/item/clothing/suit/armor/riot/knight/init_rustle_component()
AddComponent(/datum/component/item_equipped_movement_rustle, SFX_PLATE_ARMOR_RUSTLE, 8)
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 07a564248341..2bdd623b82f5 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -11,6 +11,8 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT
resistance_flags = ACID_PROOF
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
+ /// Type of texture applied by this
+ var/texture_type = /datum/bodypart_texture/mesh/biosuit
// Icon_state passed into clothing dirt component
var/dirt_state = "bio_dirt"
@@ -20,6 +22,7 @@
AddComponent(/datum/component/clothing_dirt, dirt_state)
AddElement(/datum/element/adjust_fishing_difficulty, 6)
AddComponent(/datum/component/hat_stabilizer, loose_hat = TRUE)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_HEAD, texture_type)
/datum/armor/head_bio_hood
bio = 100
@@ -43,10 +46,15 @@
strip_delay = 7 SECONDS
equip_delay_other = 7 SECONDS
resistance_flags = ACID_PROOF
+ supports_variations_flags = CLOTHING_DIGITIGRADE_MASK
+ bodyshapes_with_variations = BODYSHAPE_DIGITIGRADE
+ /// Type of texture applied by this
+ var/texture_type = /datum/bodypart_texture/mesh/biosuit
/obj/item/clothing/suit/bio_suit/Initialize(mapload)
. = ..()
AddElement(/datum/element/adjust_fishing_difficulty, 6)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, texture_type)
//Standard biosuit, orange stripe
/datum/armor/suit_bio_suit
@@ -103,9 +111,11 @@
//Janitor's biosuit, grey with purple arms
/obj/item/clothing/head/bio_hood/janitor
icon_state = "bio_janitor"
+ texture_type = /datum/bodypart_texture/mesh/biosuit_dark
/obj/item/clothing/suit/bio_suit/janitor
icon_state = "bio_janitor"
+ texture_type = /datum/bodypart_texture/mesh/biosuit_dark
/obj/item/clothing/suit/bio_suit/janitor/Initialize(mapload)
. = ..()
@@ -137,6 +147,7 @@
inhand_icon_state = "bio_suit"
strip_delay = 4 SECONDS
equip_delay_other = 2 SECONDS
+ texture_type = /datum/bodypart_texture/mesh/black
/obj/item/clothing/suit/bio_suit/plaguedoctorsuit/Initialize(mapload)
. = ..()
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 5666cace9743..81249d7aac59 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -30,6 +30,12 @@
)
species_exception = list(/datum/species/golem)
armor_type = /datum/armor/suit_apron
+ supports_variations_flags = CLOTHING_DIGITIGRADE_MASK
+ bodyshapes_with_variations = BODYSHAPE_DIGITIGRADE
+
+/obj/item/clothing/suit/apron/generate_digitigrade_icons(icon/base_icon, greyscale_colors)
+ var/icon/legs = icon(SSgreyscale.GetColoredIconByType(/datum/greyscale_config/digitigrade, greyscale_colors), "apron_worn")
+ return replace_icon_legs(base_icon, legs)
/datum/armor/suit_apron
bio = 50
@@ -437,6 +443,12 @@
/obj/item/gun/ballistic/rifle/rebarxbow,
/obj/item/storage/bag/rebar_quiver,
)
+ supports_variations_flags = CLOTHING_DIGITIGRADE_MASK
+ bodyshapes_with_variations = BODYSHAPE_DIGITIGRADE
+
+/obj/item/clothing/suit/atmos_overalls/generate_digitigrade_icons(icon/base_icon, greyscale_colors)
+ var/icon/legs = icon(SSgreyscale.GetColoredIconByType(/datum/greyscale_config/digitigrade, greyscale_colors), "apron_worn")
+ return replace_icon_legs(base_icon, legs)
/datum/armor/atmos_overalls
fire = 100
diff --git a/code/modules/clothing/suits/straightjacket.dm b/code/modules/clothing/suits/straightjacket.dm
index 5212aec6eeda..19aa07664e6c 100644
--- a/code/modules/clothing/suits/straightjacket.dm
+++ b/code/modules/clothing/suits/straightjacket.dm
@@ -11,4 +11,4 @@
/obj/item/clothing/suit/jacket/straight_jacket/Initialize(mapload)
. = ..()
- ADD_TRAIT(src, TRAIT_DANGEROUS_OBJECT, INNATE_TRAIT)
+ ADD_TRAIT(src, TRAIT_DANGEROUS_EQUIP, INNATE_TRAIT)
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 6273d4ae1f4d..f3c14d242548 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -42,6 +42,7 @@
/obj/item/clothing/suit/utility/fire/Initialize(mapload)
. = ..()
AddElement(/datum/element/adjust_fishing_difficulty, 7)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, /datum/bodypart_texture/mesh/firesuit)
/datum/armor/utility_fire
melee = 15
@@ -103,12 +104,15 @@
equip_delay_other = 7 SECONDS
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
resistance_flags = NONE
+ /// Type of texture applied by this
+ var/texture_type = /datum/bodypart_texture/mesh/bombsuit
/obj/item/clothing/head/utility/bomb_hood/Initialize(mapload)
. = ..()
AddComponent(/datum/component/clothing_dirt, "bomb_dirt")
AddElement(/datum/element/adjust_fishing_difficulty, 8)
AddComponent(/datum/component/hat_stabilizer, loose_hat = TRUE)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_HEAD, texture_type)
/datum/armor/utility_bomb_hood
melee = 20
@@ -137,10 +141,13 @@
strip_delay = 7 SECONDS
equip_delay_other = 7 SECONDS
resistance_flags = NONE
+ /// Type of texture applied by this
+ var/texture_type = /datum/bodypart_texture/mesh/bombsuit
/obj/item/clothing/suit/utility/bomb_suit/Initialize(mapload)
. = ..()
AddElement(/datum/element/adjust_fishing_difficulty, 8)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, texture_type)
/datum/armor/utility_bomb_suit
melee = 20
@@ -154,19 +161,23 @@
/obj/item/clothing/head/utility/bomb_hood/security
icon_state = "bombsuit_sec"
inhand_icon_state = null
+ texture_type = /datum/bodypart_texture/mesh/bombsuit_red
/obj/item/clothing/suit/utility/bomb_suit/security
icon_state = "bombsuit_sec"
inhand_icon_state = null
allowed = list(/obj/item/gun/energy, /obj/item/melee/baton, /obj/item/restraints/handcuffs)
+ texture_type = /datum/bodypart_texture/mesh/bombsuit_red
/obj/item/clothing/head/utility/bomb_hood/white
icon_state = "bombsuit_white"
inhand_icon_state = null
+ texture_type = /datum/bodypart_texture/mesh/bombsuit_white
/obj/item/clothing/suit/utility/bomb_suit/white
icon_state = "bombsuit_white"
inhand_icon_state = null
+ texture_type = /datum/bodypart_texture/mesh/bombsuit_white
/*
* Radiation protection
@@ -190,6 +201,7 @@
AddComponent(/datum/component/hat_stabilizer, loose_hat = TRUE)
AddElement(/datum/element/radiation_protected_clothing)
AddComponent(/datum/component/clothing_dirt, "rad_dirt")
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_HEAD, /datum/bodypart_texture/mesh/black)
/datum/armor/utility_radiation
bio = 60
@@ -220,3 +232,4 @@
. = ..()
AddElement(/datum/element/radiation_protected_clothing)
AddElement(/datum/element/adjust_fishing_difficulty, 7)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, /datum/bodypart_texture/mesh/black)
diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm
index 13fa9a655b31..7731a843b115 100644
--- a/code/modules/clothing/under/accessories/badges.dm
+++ b/code/modules/clothing/under/accessories/badges.dm
@@ -178,6 +178,8 @@
// Pride pin skins
/datum/atom_skin/pride_pin
abstract_type = /datum/atom_skin/pride_pin
+ new_icon = /obj/item/clothing/accessory/pride::icon // DARKPACK EDIT ADD - FLAGS - (Make sure extra pins we add dont fuck up icon state of normal ones)
+ new_worn_icon = /obj/item/clothing/accessory/pride::worn_icon // DARKPACK EDIT ADD - FLAGS
/datum/atom_skin/pride_pin/gay
preview_name = "Rainbow Pride"
diff --git a/code/modules/experisci/destructive_scanner.dm b/code/modules/experisci/destructive_scanner.dm
index 12f12f1723a8..a3e76cf80bb3 100644
--- a/code/modules/experisci/destructive_scanner.dm
+++ b/code/modules/experisci/destructive_scanner.dm
@@ -9,7 +9,6 @@
icon = 'icons/obj/machines/destructive_scanner.dmi'
icon_state = "tube_open"
circuit = /obj/item/circuitboard/machine/destructive_scanner
- layer = MOB_LAYER
var/scanning = FALSE
// Late load to ensure the component initialization occurs after the machines are initialized
diff --git a/code/modules/experisci/experiment/experiments.dm b/code/modules/experisci/experiment/experiments.dm
index 140ea10c941d..5fe90377814b 100644
--- a/code/modules/experisci/experiment/experiments.dm
+++ b/code/modules/experisci/experiment/experiments.dm
@@ -89,7 +89,7 @@
sanitized_misc = TRUE
sanitized_reactions = TRUE
require_all = FALSE
- required_reactions = list(/datum/gas_reaction/h2fire, /datum/gas_reaction/tritfire)
+ required_reactions = list(/datum/gas_reaction/standard/h2fire, /datum/gas_reaction/standard/tritfire)
/datum/experiment/ordnance/explosive/nobliumbomb
name = "Noblium Explosives"
@@ -99,7 +99,7 @@
experiment_proper = TRUE
sanitized_misc = TRUE
sanitized_reactions = TRUE
- required_reactions = list(/datum/gas_reaction/nobliumformation)
+ required_reactions = list(/datum/gas_reaction/standard/nobliumformation)
/datum/experiment/ordnance/explosive/pressurebomb
name = "Reactionless Explosives"
diff --git a/code/modules/fishing/admin.dm b/code/modules/fishing/admin.dm
index 9e54aad28c7d..8e2d23e653a3 100644
--- a/code/modules/fishing/admin.dm
+++ b/code/modules/fishing/admin.dm
@@ -1,6 +1,6 @@
ADMIN_VERB(fishing_calculator, R_DEBUG, "Fishing Calculator", "A calculator... for fishes?", ADMIN_CATEGORY_DEBUG)
- var/datum/fishing_calculator/ui = new
- ui.ui_interact(user.mob)
+ var/datum/fishing_calculator/tgui = new()
+ tgui.ui_interact(user.mob)
/datum/fishing_calculator
var/list/current_table
diff --git a/code/modules/food_and_drinks/equipment/kitchen_utensils.dm b/code/modules/food_and_drinks/equipment/kitchen_utensils.dm
index 06dc92404e48..50aa9f928286 100644
--- a/code/modules/food_and_drinks/equipment/kitchen_utensils.dm
+++ b/code/modules/food_and_drinks/equipment/kitchen_utensils.dm
@@ -248,8 +248,8 @@
/obj/item/kitchen/spoon/update_overlays()
. = ..()
- // DARKPACK EDIT ADD START - WORLD_ICON
- if(item_flags & ACTIVE_WORLD_ICON) // World icons have nothing but the base state atm
+ // DARKPACK EDIT ADD START - ONFLOOR_ICONS
+ if(item_flags & ACTIVE_ONFLOOR_ICON) // World icons have nothing but the base state atm
return
// DARKPACK EDIT ADD END
if(reagents.total_volume <= 0)
diff --git a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm
index cebb2364d827..3f14bb222172 100644
--- a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm
+++ b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm
@@ -9,6 +9,10 @@
drop_sound = null
equip_sound = null
+/obj/item/clothing/head/utility/beekeeper_head/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_HEAD, /datum/bodypart_texture/mesh/white)
+
/obj/item/clothing/suit/utility/beekeeper_suit
name = "beekeeper suit"
desc = "Keeps the lil buzzing buggers away from your squishy bits."
@@ -17,3 +21,9 @@
body_parts_covered = CHEST|GROIN|LEGS|ARMS
clothing_flags = THICKMATERIAL
allowed = list(/obj/item/melee/flyswatter, /obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/cup/bottle, /obj/item/reagent_containers/cup/beaker, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants)
+ supports_variations_flags = CLOTHING_DIGITIGRADE_MASK
+ bodyshapes_with_variations = BODYSHAPE_DIGITIGRADE
+
+/obj/item/clothing/suit/utility/beekeeper_suit/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, /datum/bodypart_texture/mesh/white)
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index 55eaeff29bc7..1110fd31cf99 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -512,6 +512,7 @@
cat["items"] += list(list(
"path" = design.type,
"name" = design.name,
+ "icon" = design.asset_id,
"is_reagent" = !isnull(design.make_reagent),
"cost" = design.materials[SSmaterials.get_material(/datum/material/biomass)] / efficiency,
))
diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm
index f3803e5dc6fe..2e43b37d514f 100644
--- a/code/modules/hydroponics/grown/apple.dm
+++ b/code/modules/hydroponics/grown/apple.dm
@@ -16,6 +16,20 @@
mutatelist = list(/obj/item/seeds/apple/gold)
reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1)
+/obj/item/seeds/apple/harvest(mob/user)
+ var/list/result = ..()
+ var/obj/machinery/hydroponics/tray = loc
+ var/worm_chance = tray.pestlevel
+ if(tray.tray_flags & WORM_HABITAT)
+ worm_chance = 80 // Wormy soil isn't good for apples probably
+ for(var/obj/item/food/grown/apple/applum in result)
+ if(prob(worm_chance))
+ applum.appleworm = new(applum) // There is a worm in this apple!
+ applum.tastes = list("apple" = 1, "worms" = 2)
+ applum.ediblecomponent = IS_EDIBLE(applum)
+ if(applum.ediblecomponent)
+ applum.ediblecomponent.foodtypes |= (GROSS | MEAT | BUGS)
+
/obj/item/food/grown/apple
seed = /obj/item/seeds/apple
name = "apple"
@@ -24,6 +38,39 @@
foodtypes = FRUIT
tastes = list("apple" = 1)
distill_reagent = /datum/reagent/consumable/ethanol/hcider
+ /// Do we know about the worm?
+ var/found_worm = FALSE
+ /// The worm in question
+ var/obj/item/food/bait/worm/appleworm
+ /// Our edible component
+ var/datum/component/edible/ediblecomponent
+
+/obj/item/food/grown/apple/examine(mob/user)
+ . = ..()
+ if(!found_worm && !isobserver(user) && appleworm)
+ balloon_alert(user, "there is a hole in this [src.name]!")
+ found_worm = TRUE
+ desc = "It's a little piece of Eden. Serpent not included, contains a worm as a replacement."
+
+/obj/item/food/grown/apple/attack_self(mob/user)
+ if(!appleworm)
+ return
+ balloon_alert(user, "pulling out [appleworm.name]...")
+ if(!do_after(user, 5 SECONDS, target = src))
+ return
+ appleworm.forceMove(drop_location())
+ appleworm = null
+ tastes = list("apple" = 1)
+ var/datum/component/edible/ediblecomponent = IS_EDIBLE(src)
+ desc = "It's a little piece of Eden. The [pick("serpent", "worm", "extra protein", "friendly neighbor")] is gone."
+ if(!ediblecomponent)
+ return
+ ediblecomponent.foodtypes &= ~(GROSS | MEAT | BUGS)
+
+/obj/item/food/grown/apple/proc/on_consume(mob/living/eater)
+ if(!ishuman(eater) && !appleworm)
+ return
+ to_chat(eater, span_alert("That apple was wormy!"))
/obj/item/food/grown/apple/juice_typepath()
return /datum/reagent/consumable/applejuice
diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm
index 1aac3a250699..5aa1d5f3cabd 100644
--- a/code/modules/hydroponics/grown/banana.dm
+++ b/code/modules/hydroponics/grown/banana.dm
@@ -196,13 +196,13 @@
/obj/item/food/grown/banana/bunch/monkeybomb/examine(mob/user)
. = ..()
- if(!is_simian(user))
+ if(!HAS_TRAIT(user, TRAIT_SIMIAN))
. += span_notice("There's a banana label on one of the 'nanas you can't quite make out the details of.")
return
. += span_notice("The banana label on this bunch indicates that monkeys can use this as a sonic grenade with a 3 second timer!")
/obj/item/food/grown/banana/bunch/monkeybomb/attack_self(mob/user, modifiers)
- if(!is_simian(user))
+ if(!HAS_TRAIT(user, TRAIT_SIMIAN))
return to_chat(user, span_notice("You don't really know what to do with this."))
else start_ripening()
diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm
index 2dfe36b6ed9a..7dd6d068ff2a 100644
--- a/code/modules/jobs/job_exp.dm
+++ b/code/modules/jobs/job_exp.dm
@@ -12,6 +12,10 @@ GLOBAL_PROTECT(exp_to_update)
return 0
if(!IS_XP_LOCKED(src))
return 0
+ // DARKPACK EDIT ADD START - (whitelist)
+ if(C.prefs?.has_whitelist(WHITELIST_TIMELIMITS))
+ return 0
+ // DARKPACK EDIT ADD END
if(CONFIG_GET(flag/use_exp_restrictions_admin_bypass) && check_rights_for(C,R_ADMIN))
return 0
var/isexempt = C.prefs.db_flags & DB_FLAG_EXEMPT
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index 98b341f10277..b119f3b0cf36 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -140,6 +140,9 @@
/// How desensitized this job is to seeing death as a base - applied with the job
var/desensitized_base = 1.0
+ ///If set, adds this as the job icon map (from fontawesome5)
+ var/tgui_icon
+
/datum/job/New()
. = ..()
// DARKPACK EDIT ADD START - ALTERNATIVE_JOB_TITLES
@@ -701,11 +704,12 @@
if(!job_outfit || !job_outfit::id_trim)
CRASH("[src.type] has no job outfit but isn't overwriting get_lobby_icon().")
var/datum/id_trim/job_trim = job_outfit::id_trim
+ var/icon = job_trim::sechud_icon
var/icon_state = job_trim::sechud_icon_state
- if(!icon_state || icon_state == SECHUD_UNKNOWN)
- CRASH("[src.type] has no job icon state.")
+ if(!icon || !icon_state || icon_state == SECHUD_UNKNOWN)
+ CRASH("[src.type] has no job icon or icon state.")
- return icon('icons/mob/huds/hud.dmi', icon_state)
+ return icon(icon, icon_state)
/datum/job/proc/display_order_with_department()
var/datum/job_department/main_department = departments_list?[1]
diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm
index dabc876993e0..0b34817c7e21 100644
--- a/code/modules/jobs/job_types/ai.dm
+++ b/code/modules/jobs/job_types/ai.dm
@@ -21,7 +21,7 @@
random_spawns_possible = FALSE
job_flags = JOB_EQUIP_RANK | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS
config_tag = "AI"
-
+ tgui_icon = FA_ICON_EYE
/datum/job/ai/after_spawn(mob/living/spawned, client/player_client)
. = ..()
@@ -98,4 +98,4 @@
new_character.AIize()
/datum/job/ai/get_lobby_icon()
- return icon('icons/mob/huds/hud.dmi', "hudai")
+ return icon(DEFAULT_HUDS_DMI, "hudai")
diff --git a/code/modules/jobs/job_types/antagonists/nightmare.dm b/code/modules/jobs/job_types/antagonists/nightmare.dm
index 47d16f47ecd3..5264be22c377 100644
--- a/code/modules/jobs/job_types/antagonists/nightmare.dm
+++ b/code/modules/jobs/job_types/antagonists/nightmare.dm
@@ -1,2 +1,3 @@
/datum/job/nightmare
title = ROLE_NIGHTMARE
+ tgui_icon = FA_ICON_MOON
diff --git a/code/modules/jobs/job_types/antagonists/space_wizard.dm b/code/modules/jobs/job_types/antagonists/space_wizard.dm
index fc0c2cdbf15e..f91051f81755 100644
--- a/code/modules/jobs/job_types/antagonists/space_wizard.dm
+++ b/code/modules/jobs/job_types/antagonists/space_wizard.dm
@@ -1,6 +1,7 @@
/datum/job/space_wizard
title = ROLE_WIZARD
faction = ROLE_WIZARD
+ tgui_icon = FA_ICON_MAGIC
/datum/job/space_wizard/get_roundstart_spawn_point()
return pick(GLOB.wizardstart)
diff --git a/code/modules/jobs/job_types/assistant/assistant.dm b/code/modules/jobs/job_types/assistant/assistant.dm
index a0cb2699d82d..2fcbaddf0626 100644
--- a/code/modules/jobs/job_types/assistant/assistant.dm
+++ b/code/modules/jobs/job_types/assistant/assistant.dm
@@ -36,6 +36,7 @@ Assistant
job_flags = STATION_JOB_FLAGS
rpg_title = "Lout"
config_tag = "ASSISTANT"
+ tgui_icon = FA_ICON_TOOLBOX
/datum/job/assistant/get_outfit(consistent)
if(consistent)
diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm
index a9670e530535..0fe64c35b860 100644
--- a/code/modules/jobs/job_types/atmospheric_technician.dm
+++ b/code/modules/jobs/job_types/atmospheric_technician.dm
@@ -36,6 +36,7 @@
job_flags = STATION_JOB_FLAGS
rpg_title = "Aeromancer"
+ tgui_icon = FA_ICON_FAN
/datum/outfit/job/atmos
name = "Atmospheric Technician"
diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm
index 8de2d99b7c70..3b373f490ecb 100644
--- a/code/modules/jobs/job_types/bartender.dm
+++ b/code/modules/jobs/job_types/bartender.dm
@@ -33,6 +33,7 @@
job_flags = STATION_JOB_FLAGS
rpg_title = "Tavernkeeper"
+ tgui_icon = FA_ICON_COCKTAIL
/datum/job/bartender/award_service(client/winner, award)
winner.give_award(award, winner.mob)
diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm
index 679f07d06fa0..5cd9d72523eb 100644
--- a/code/modules/jobs/job_types/botanist.dm
+++ b/code/modules/jobs/job_types/botanist.dm
@@ -37,6 +37,7 @@
job_flags = STATION_JOB_FLAGS
rpg_title = "Gardener"
+ tgui_icon = FA_ICON_SEEDLING
/datum/outfit/job/botanist
name = "Botanist"
diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm
index f2d737ad31eb..ea452cadb41d 100644
--- a/code/modules/jobs/job_types/captain.dm
+++ b/code/modules/jobs/job_types/captain.dm
@@ -49,6 +49,7 @@
human_authority = JOB_AUTHORITY_HUMANS_ONLY
voice_of_god_power = 1.4 //Command staff has authority
+ tgui_icon = FA_ICON_CROWN
/datum/job/captain/get_captaincy_announcement(mob/living/captain)
diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm
index 7856714d157a..ef1c2e7cf537 100644
--- a/code/modules/jobs/job_types/cargo_technician.dm
+++ b/code/modules/jobs/job_types/cargo_technician.dm
@@ -33,6 +33,7 @@
)
rpg_title = "Merchantman"
job_flags = STATION_JOB_FLAGS
+ tgui_icon = FA_ICON_BOX
/datum/outfit/job/cargo_tech
diff --git a/code/modules/jobs/job_types/chaplain/chaplain.dm b/code/modules/jobs/job_types/chaplain/chaplain.dm
index d4c39db5beea..e10957bcf557 100644
--- a/code/modules/jobs/job_types/chaplain/chaplain.dm
+++ b/code/modules/jobs/job_types/chaplain/chaplain.dm
@@ -37,6 +37,7 @@
voice_of_god_power = 2 //Chaplains are very good at speaking with the voice of god
job_tone = "holy"
+ tgui_icon = FA_ICON_CROSS
/datum/job/chaplain/after_spawn(mob/living/spawned, client/player_client)
diff --git a/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm b/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm
index 1b46ade24378..3ce7d1ef7425 100644
--- a/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm
+++ b/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm
@@ -145,6 +145,7 @@
/obj/item/clothing/suit/chaplainsuit/armor/clock/Initialize(mapload)
. = ..()
AddComponent(/datum/component/item_equipped_movement_rustle, SFX_PLATE_ARMOR_RUSTLE, 8)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, /datum/bodypart_texture/mesh/drake)
/obj/item/clothing/head/helmet/chaplain
name = "crusader helmet"
@@ -169,6 +170,7 @@
/obj/item/clothing/suit/chaplainsuit/armor/templar/Initialize(mapload)
. = ..()
AddComponent(/datum/component/item_equipped_movement_rustle, SFX_PLATE_ARMOR_RUSTLE, 8)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, /datum/bodypart_texture/mesh/biosuit_dark)
/obj/item/clothing/head/helmet/chaplain/cage
name = "cage"
@@ -184,6 +186,10 @@
icon_state = "knight_ancient"
inhand_icon_state = null
+/obj/item/clothing/head/helmet/chaplain/ancient/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_HEAD, /datum/bodypart_texture/mesh/biosuit_dark)
+
/obj/item/clothing/suit/chaplainsuit/armor/ancient
name = "ancient armour"
desc = "Defend the treasure..."
@@ -194,6 +200,7 @@
/obj/item/clothing/suit/chaplainsuit/armor/ancient/Initialize(mapload)
. = ..()
AddComponent(/datum/component/item_equipped_movement_rustle, SFX_PLATE_ARMOR_RUSTLE, 8)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, /datum/bodypart_texture/mesh/biosuit_dark)
/obj/item/clothing/head/helmet/chaplain/witchunter_hat
name = "witchunter hat"
@@ -255,6 +262,10 @@
flags_cover = HEADCOVERSEYES
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
+/obj/item/clothing/head/helmet/chaplain/heretic/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_HEAD, /datum/bodypart_texture/mesh/heretic)
+
/obj/item/clothing/suit/chaplainsuit/armor/heretic
name = "occultist's robes"
desc = "Shields your body from the things others fail to notice."
@@ -262,6 +273,10 @@
inhand_icon_state = null
body_parts_covered = CHEST|GROIN|LEGS
+/obj/item/clothing/suit/chaplainsuit/armor/heretic/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, /datum/bodypart_texture/mesh/heretic)
+
/obj/item/clothing/suit/hooded/chaplain_hoodie
name = "follower hoodie"
desc = "Hoodie made for acolytes of the chaplain."
diff --git a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm
index b60156192662..39c8f62cfb49 100644
--- a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm
+++ b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm
@@ -84,7 +84,7 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and
AddComponent(/datum/component/walking_aid)
/obj/item/vorpalscythe/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers)
- if(ismonkey(target) && !target.mind) //Don't empower from hitting monkeys. Hit a corgi or something, I don't know.
+ if(HAS_TRAIT(target, TRAIT_LESSER_HUMANOID) && !target.mind) //Don't empower from hitting monkeys. Hit a corgi or something, I don't know.
return ..()
if(target.stat != DEAD && target != user)
@@ -125,7 +125,7 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and
var/potential_empowerment = SCYTHE_EMPOWERED
if(!potential_reaping.mind) //We put this here juuuust in case there is something funky with ling checks
- if(ismonkey(potential_reaping))
+ if(HAS_TRAIT(potential_reaping, TRAIT_LESSER_HUMANOID))
to_chat(user, span_warning("A pointless existence. You'll get no benefit from this death knell beyond the satisfaction of beheading this foul thing."))
potential_empowerment = SCYTHE_WEAK
else
@@ -141,7 +141,7 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and
death_knell_speed_mod *= 1.5 //Staminacritting someone who's jittering (from, say, a stun baton) won't give you enough time to slice their head off, but staminacritting someone who isn't jittering will
if(empowerment == SCYTHE_EMPOWERED) //That said, if heads are already rolling, why stop here?
death_knell_speed_mod *= 0.5
- if((potential_reaping.mob_biotypes & MOB_PLANT) || ismonkey(potential_reaping)) //And if they're a podperson/mushperson or monkey, they can just die.
+ if((potential_reaping.mob_biotypes & MOB_PLANT) || HAS_TRAIT(potential_reaping, TRAIT_LESSER_HUMANOID)) //And if they're a podperson/mushperson or monkey, they can just die.
death_knell_speed_mod *= 0.5
log_combat(user, potential_reaping, "prepared to use [src] to decapitate")
diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm
index 05955e1a3454..0f5326618259 100644
--- a/code/modules/jobs/job_types/chemist.dm
+++ b/code/modules/jobs/job_types/chemist.dm
@@ -35,6 +35,7 @@
)
rpg_title = "Alchemist"
job_flags = STATION_JOB_FLAGS
+ tgui_icon = FA_ICON_PRESCRIPTION_BOTTLE
/datum/outfit/job/chemist
diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm
index 369d89f5c115..07940f21ee22 100644
--- a/code/modules/jobs/job_types/chief_engineer.dm
+++ b/code/modules/jobs/job_types/chief_engineer.dm
@@ -48,6 +48,7 @@
human_authority = JOB_AUTHORITY_HUMANS_ONLY
voice_of_god_power = 1.4 //Command staff has authority
+ tgui_icon = FA_ICON_USER_ASTRONAUT
/datum/job/chief_engineer/after_spawn(mob/living/spawned, client/player_client)
diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm
index 7b03fe19121e..9de40803ab55 100644
--- a/code/modules/jobs/job_types/chief_medical_officer.dm
+++ b/code/modules/jobs/job_types/chief_medical_officer.dm
@@ -46,6 +46,7 @@
human_authority = JOB_AUTHORITY_HUMANS_ONLY
voice_of_god_power = 1.4 //Command staff has authority
+ tgui_icon = FA_ICON_USER_MD
/datum/job/chief_medical_officer/get_captaincy_announcement(mob/living/captain)
diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm
index fb19a7d521bf..a2a55ed1bb21 100644
--- a/code/modules/jobs/job_types/clown.dm
+++ b/code/modules/jobs/job_types/clown.dm
@@ -36,6 +36,7 @@
job_flags = STATION_JOB_FLAGS
job_tone = "honk"
+ tgui_icon = FA_ICON_FACE_GRIN_TEARS
/datum/job/clown/after_spawn(mob/living/spawned, client/player_client)
if (ishuman(spawned))
diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm
index aebe1b9ca803..ce10bef7082c 100644
--- a/code/modules/jobs/job_types/cook.dm
+++ b/code/modules/jobs/job_types/cook.dm
@@ -51,6 +51,7 @@
JOB_CHEF,
)
job_flags = STATION_JOB_FLAGS
+ tgui_icon = FA_ICON_UTENSILS
/datum/job/cook/award_service(client/winner, award)
winner.give_award(award, winner.mob)
diff --git a/code/modules/jobs/job_types/coroner.dm b/code/modules/jobs/job_types/coroner.dm
index c2e15efbd9af..b8f629f62cdc 100644
--- a/code/modules/jobs/job_types/coroner.dm
+++ b/code/modules/jobs/job_types/coroner.dm
@@ -43,6 +43,7 @@
job_flags = STATION_JOB_FLAGS
rpg_title = "Undertaker"
+ tgui_icon = FA_ICON_SKULL
/datum/outfit/job/coroner
name = "Coroner"
diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm
index 16f652dfa275..3717b4383c0d 100644
--- a/code/modules/jobs/job_types/curator.dm
+++ b/code/modules/jobs/job_types/curator.dm
@@ -34,6 +34,7 @@
voice_of_god_silence_power = 3
rpg_title = "Veteran Adventurer"
+ tgui_icon = FA_ICON_BOOK
/datum/outfit/job/curator
name = "Curator"
diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm
index adcd3b27afca..d7a7d4062e07 100644
--- a/code/modules/jobs/job_types/cyborg.dm
+++ b/code/modules/jobs/job_types/cyborg.dm
@@ -20,6 +20,7 @@
)
random_spawns_possible = FALSE
job_flags = JOB_EQUIP_RANK | JOB_CANNOT_OPEN_SLOTS // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_CANNOT_OPEN_SLOTS
+ tgui_icon = FA_ICON_ROBOT
/datum/job/cyborg/after_spawn(mob/living/spawned, client/player_client)
@@ -41,4 +42,4 @@
new_character.Robotize(TRUE)
/datum/job/cyborg/get_lobby_icon()
- return icon('icons/mob/huds/hud.dmi', "hudcyborg")
+ return icon(DEFAULT_HUDS_DMI, "hudcyborg")
diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm
index 7c6a5bf8ff79..16f140180359 100644
--- a/code/modules/jobs/job_types/detective.dm
+++ b/code/modules/jobs/job_types/detective.dm
@@ -42,8 +42,8 @@
family_heirlooms = list(/obj/item/reagent_containers/cup/glass/bottle/whiskey)
rpg_title = "Thiefcatcher" //I guess they caught them all rip thief...
job_flags = STATION_JOB_FLAGS | JOB_ANTAG_PROTECTED
-
job_tone = "objection"
+ tgui_icon = FA_ICON_USER_SECRET
/datum/outfit/job/detective
diff --git a/code/modules/jobs/job_types/ert/ert_generic.dm b/code/modules/jobs/job_types/ert/ert_generic.dm
index 4758ac75b285..b3943cef1357 100644
--- a/code/modules/jobs/job_types/ert/ert_generic.dm
+++ b/code/modules/jobs/job_types/ert/ert_generic.dm
@@ -1,2 +1,45 @@
-/datum/job/ert_generic
+/datum/job/ert
title = "ERT Generic"
+ tgui_icon = FA_ICON_PEN_ALT
+
+/datum/job/ert/deatsquad
+ title = JOB_ERT_DEATHSQUAD
+
+/datum/job/ert/commander
+ title = JOB_ERT_COMMANDER
+ tgui_icon = FA_ICON_CROWN
+
+/datum/job/ert/officer
+ title = JOB_ERT_OFFICER
+ tgui_icon = /datum/job/security_officer::tgui_icon
+
+/datum/job/ert/engineer
+ title = JOB_ERT_ENGINEER
+ tgui_icon = /datum/job/station_engineer::tgui_icon
+
+/datum/job/ert/medical_doctor
+ title = JOB_ERT_MEDICAL_DOCTOR
+ tgui_icon = /datum/job/doctor::tgui_icon
+
+/datum/job/ert/chaplain
+ title = JOB_ERT_CHAPLAIN
+ tgui_icon = /datum/job/chaplain::tgui_icon
+
+/datum/job/ert/janitor
+ title = JOB_ERT_JANITOR
+ tgui_icon = /datum/job/janitor::tgui_icon
+
+/datum/job/ert/clown
+ title = JOB_ERT_CLOWN
+ tgui_icon = /datum/job/clown::tgui_icon
+
+/datum/job/ert/official
+ title = "CentCom Official"
+ tgui_icon = FA_ICON_MEDAL
+
+/datum/job/ert/intern
+ title = "CentCom Intern"
+
+/datum/job/ert/intern/leader
+ title = "CentCom Head Intern"
+ tgui_icon = FA_ICON_PEN_FANCY
diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm
index 95645ebed9ee..7d0c610a035c 100644
--- a/code/modules/jobs/job_types/geneticist.dm
+++ b/code/modules/jobs/job_types/geneticist.dm
@@ -29,6 +29,7 @@
family_heirlooms = list(/obj/item/clothing/under/shorts/purple)
rpg_title = "Genemancer"
job_flags = STATION_JOB_FLAGS
+ tgui_icon = FA_ICON_DNA
/datum/outfit/job/geneticist
diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm
index b4bf3706b9fd..58b8629000c3 100644
--- a/code/modules/jobs/job_types/head_of_personnel.dm
+++ b/code/modules/jobs/job_types/head_of_personnel.dm
@@ -44,6 +44,7 @@
human_authority = JOB_AUTHORITY_HUMANS_ONLY
voice_of_god_power = 1.4 //Command staff has authority
+ tgui_icon = FA_ICON_DOG
/datum/job/head_of_personnel/get_captaincy_announcement(mob/living/captain)
diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm
index 7febc5371fcb..15aea875585c 100644
--- a/code/modules/jobs/job_types/head_of_security.dm
+++ b/code/modules/jobs/job_types/head_of_security.dm
@@ -40,6 +40,7 @@
human_authority = JOB_AUTHORITY_HUMANS_ONLY
voice_of_god_power = 1.4 //Command staff has authority
+ tgui_icon = FA_ICON_USER_SHIELD
/datum/job/head_of_security/get_captaincy_announcement(mob/living/captain)
return "Due to staffing shortages, newly promoted Acting Captain [captain.real_name] on deck!"
diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm
index d9a52c9d6d9b..14f775301984 100644
--- a/code/modules/jobs/job_types/janitor.dm
+++ b/code/modules/jobs/job_types/janitor.dm
@@ -30,6 +30,7 @@
job_flags = STATION_JOB_FLAGS
job_tone = "slip"
+ tgui_icon = FA_ICON_SOAP
/datum/outfit/job/janitor
name = "Janitor"
diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm
index 7a1c8d58bc7f..93291e2e2e9a 100644
--- a/code/modules/jobs/job_types/lawyer.dm
+++ b/code/modules/jobs/job_types/lawyer.dm
@@ -27,6 +27,7 @@
job_flags = STATION_JOB_FLAGS
job_tone = "objection"
+ tgui_icon = FA_ICON_GAVEL
/datum/outfit/job/lawyer
name = "Lawyer"
diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm
index 0c300d2f6315..35b7cdd00310 100644
--- a/code/modules/jobs/job_types/medical_doctor.dm
+++ b/code/modules/jobs/job_types/medical_doctor.dm
@@ -37,6 +37,7 @@
)
rpg_title = "Cleric"
job_flags = STATION_JOB_FLAGS
+ tgui_icon = FA_ICON_STAFF_SNAKE
/datum/outfit/job/doctor
diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm
index 7e10eac2204c..06df427e1701 100644
--- a/code/modules/jobs/job_types/mime.dm
+++ b/code/modules/jobs/job_types/mime.dm
@@ -34,6 +34,7 @@
voice_of_god_silence_power = 3
job_tone = "silence"
+ tgui_icon = FA_ICON_COMMENT_SLASH
/datum/job/mime/after_spawn(mob/living/spawned, client/player_client)
if (ishuman(spawned))
diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm
index fca347c0cad1..ee573d6d956a 100644
--- a/code/modules/jobs/job_types/paramedic.dm
+++ b/code/modules/jobs/job_types/paramedic.dm
@@ -37,6 +37,7 @@
)
rpg_title = "Corpse Runner"
job_flags = STATION_JOB_FLAGS
+ tgui_icon = FA_ICON_TRUCK_MEDICAL
/datum/outfit/job/paramedic
diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm
index c025a900c801..c1e229b02c14 100644
--- a/code/modules/jobs/job_types/prisoner.dm
+++ b/code/modules/jobs/job_types/prisoner.dm
@@ -23,6 +23,7 @@
family_heirlooms = list(/obj/item/pen/blue)
rpg_title = "Defeated Miniboss"
job_flags = STATION_JOB_FLAGS | JOB_CANNOT_OPEN_SLOTS | JOB_ANTAG_PROTECTED & ~JOB_REOPEN_ON_ROUNDSTART_LOSS
+ tgui_icon = FA_ICON_LOCK
/datum/job/prisoner/New()
. = ..()
diff --git a/code/modules/jobs/job_types/psychologist.dm b/code/modules/jobs/job_types/psychologist.dm
index e4a8bfd4418a..c770fd23e51d 100644
--- a/code/modules/jobs/job_types/psychologist.dm
+++ b/code/modules/jobs/job_types/psychologist.dm
@@ -31,6 +31,7 @@
)
rpg_title = "Snake Oil Salesman"
job_flags = STATION_JOB_FLAGS
+ tgui_icon = FA_ICON_BRAIN
/datum/outfit/job/psychologist
diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm
index b353664100ca..dd7f2185dea7 100644
--- a/code/modules/jobs/job_types/quartermaster.dm
+++ b/code/modules/jobs/job_types/quartermaster.dm
@@ -36,6 +36,7 @@
job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS
voice_of_god_power = 1.4 //Command staff has authority
human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED
+ tgui_icon = FA_ICON_SACK_DOLLAR
/datum/outfit/job/quartermaster
name = "Quartermaster"
diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm
index 3da1d9425835..88b93b6a7ace 100644
--- a/code/modules/jobs/job_types/research_director.dm
+++ b/code/modules/jobs/job_types/research_director.dm
@@ -46,6 +46,7 @@
human_authority = JOB_AUTHORITY_HUMANS_ONLY
voice_of_god_power = 1.4 //Command staff has authority
+ tgui_icon = FA_ICON_USER_GRADUATE
/datum/job/research_director/get_captaincy_announcement(mob/living/captain)
diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm
index 4306ec080702..dbf61a3424d3 100644
--- a/code/modules/jobs/job_types/roboticist.dm
+++ b/code/modules/jobs/job_types/roboticist.dm
@@ -32,6 +32,7 @@
family_heirlooms = list(/obj/item/toy/plush/pkplush)
rpg_title = "Necromancer"
job_flags = STATION_JOB_FLAGS
+ tgui_icon = FA_ICON_BATTERY_HALF
/datum/job/roboticist/New()
diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm
index d32340c5d258..0cad528c990a 100644
--- a/code/modules/jobs/job_types/scientist.dm
+++ b/code/modules/jobs/job_types/scientist.dm
@@ -34,6 +34,7 @@
job_flags = STATION_JOB_FLAGS
job_tone = "boom"
+ tgui_icon = FA_ICON_FLASK
/datum/outfit/job/scientist
diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm
index fd87de05d375..9b7574e52d96 100644
--- a/code/modules/jobs/job_types/security_officer.dm
+++ b/code/modules/jobs/job_types/security_officer.dm
@@ -45,6 +45,7 @@
JOB_SECURITY_OFFICER_SCIENCE,
)
job_flags = STATION_JOB_FLAGS | JOB_ANTAG_PROTECTED
+ tgui_icon = FA_ICON_SHIELD_HALVED
GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY))
diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm
index 8b6d36349e9a..53481815f7cd 100644
--- a/code/modules/jobs/job_types/shaft_miner.dm
+++ b/code/modules/jobs/job_types/shaft_miner.dm
@@ -26,6 +26,7 @@
family_heirlooms = list(/obj/item/pickaxe/mini, /obj/item/shovel)
rpg_title = "Adventurer"
job_flags = STATION_JOB_FLAGS
+ tgui_icon = FA_ICON_DIGGING
/datum/outfit/job/miner
@@ -39,7 +40,7 @@
/obj/item/flashlight/seclite = 1,
/obj/item/knife/combat/survival = 1,
/obj/item/mining_voucher = 1,
- /obj/item/stack/marker_beacon/ten = 1,
+ /obj/item/stack/candela_beacon/thirty = 1,
/obj/item/t_scanner/adv_mining_scanner/lesser = 1,
)
belt = /obj/item/modular_computer/pda/shaftminer
@@ -69,7 +70,7 @@
/obj/item/gun/energy/recharge/kinetic_accelerator = 1,
/obj/item/knife/combat/survival = 1,
/obj/item/mining_voucher = 1,
- /obj/item/stack/marker_beacon/ten = 1,
+ /obj/item/stack/candela_beacon/thirty = 1,
/obj/item/t_scanner/adv_mining_scanner/lesser = 1,
)
glasses = /obj/item/clothing/glasses/meson
diff --git a/code/modules/jobs/job_types/spawner/personal_ai.dm b/code/modules/jobs/job_types/spawner/personal_ai.dm
index 0f575cbf6982..f18b89812a0d 100644
--- a/code/modules/jobs/job_types/spawner/personal_ai.dm
+++ b/code/modules/jobs/job_types/spawner/personal_ai.dm
@@ -1,2 +1,3 @@
/datum/job/personal_ai
title = ROLE_PAI
+ tgui_icon = FA_ICON_MOBILE_ALT
diff --git a/code/modules/jobs/job_types/spawner/space_syndicate.dm b/code/modules/jobs/job_types/spawner/space_syndicate.dm
index 8ab88337e50a..c98ee7bb4bfa 100644
--- a/code/modules/jobs/job_types/spawner/space_syndicate.dm
+++ b/code/modules/jobs/job_types/spawner/space_syndicate.dm
@@ -1,3 +1,4 @@
/datum/job/space_syndicate
title = ROLE_SPACE_SYNDICATE
policy_index = ROLE_SPACE_SYNDICATE
+ tgui_icon = FA_ICON_DRAGON
diff --git a/code/modules/jobs/job_types/spawner/syndicate_cybersun.dm b/code/modules/jobs/job_types/spawner/syndicate_cybersun.dm
index 5deba33fce88..11706f3b415c 100644
--- a/code/modules/jobs/job_types/spawner/syndicate_cybersun.dm
+++ b/code/modules/jobs/job_types/spawner/syndicate_cybersun.dm
@@ -1,3 +1,4 @@
/datum/job/syndicate_cybersun
title = ROLE_SYNDICATE_CYBERSUN
policy_index = ROLE_SYNDICATE_CYBERSUN
+ tgui_icon = FA_ICON_DRAGON
diff --git a/code/modules/jobs/job_types/spawner/syndicate_cybersun_captain.dm b/code/modules/jobs/job_types/spawner/syndicate_cybersun_captain.dm
index 697a5908f464..c21a9d8781c7 100644
--- a/code/modules/jobs/job_types/spawner/syndicate_cybersun_captain.dm
+++ b/code/modules/jobs/job_types/spawner/syndicate_cybersun_captain.dm
@@ -1,3 +1,4 @@
/datum/job/syndicate_cybersun_captain
title = ROLE_SYNDICATE_CYBERSUN_CAPTAIN
policy_index = ROLE_SYNDICATE_CYBERSUN_CAPTAIN
+ tgui_icon = FA_ICON_DRAGON
diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm
index 8e25895c0be3..a6b05ae2d8a5 100644
--- a/code/modules/jobs/job_types/station_engineer.dm
+++ b/code/modules/jobs/job_types/station_engineer.dm
@@ -25,7 +25,14 @@
/datum/job_department/engineering,
)
- family_heirlooms = list(/obj/item/clothing/head/utility/hardhat, /obj/item/screwdriver, /obj/item/wrench, /obj/item/weldingtool, /obj/item/crowbar, /obj/item/wirecutters)
+ family_heirlooms = list(
+ /obj/item/clothing/head/utility/hardhat,
+ /obj/item/screwdriver,
+ /obj/item/wrench,
+ /obj/item/weldingtool,
+ /obj/item/crowbar,
+ /obj/item/wirecutters,
+ )
mail_goodies = list(
/obj/item/storage/box/lights/mixed = 20,
@@ -37,6 +44,7 @@
)
rpg_title = "Crystallomancer"
job_flags = STATION_JOB_FLAGS
+ tgui_icon = FA_ICON_GEARS
/datum/outfit/job/engineer
diff --git a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm
index e52e4814cfa1..26bde0fc3ed5 100644
--- a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm
+++ b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm
@@ -33,6 +33,7 @@
allow_bureaucratic_error = FALSE
job_flags = NONE // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED
human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED
+ tgui_icon = FA_ICON_BUILDING_SHIELD
/datum/job/bridge_assistant/after_spawn(mob/living/spawned, client/player_client)
. = ..()
diff --git a/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm b/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm
index 19fba20c410c..b766101569b8 100644
--- a/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm
+++ b/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm
@@ -16,6 +16,7 @@
rpg_title = "Beast of Burden"
allow_bureaucratic_error = FALSE
job_flags = NONE // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = STATION_TRAIT_JOB_FLAGS | JOB_ANNOUNCE_ARRIVAL | JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK |JOB_ANTAG_BLACKLISTED
+ tgui_icon = FA_ICON_PAW
/datum/job/cargo_gorilla/get_roundstart_spawn_point()
if (length(GLOB.gorilla_start))
diff --git a/code/modules/jobs/job_types/station_trait/human_ai.dm b/code/modules/jobs/job_types/station_trait/human_ai.dm
index ade0f1608d00..160b7af6b5b6 100644
--- a/code/modules/jobs/job_types/station_trait/human_ai.dm
+++ b/code/modules/jobs/job_types/station_trait/human_ai.dm
@@ -40,6 +40,7 @@
allow_bureaucratic_error = FALSE
job_flags = NONE // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED
human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED //we can safely assume NT doesn't care what species AIs are made of, much less if they can't even afford an AI.
+ tgui_icon = /datum/job/ai::tgui_icon
/datum/job/human_ai/get_roundstart_spawn_point()
return get_latejoin_spawn_point()
diff --git a/code/modules/jobs/job_types/station_trait/pun_pun.dm b/code/modules/jobs/job_types/station_trait/pun_pun.dm
index 4c61355a89a8..02bcdfe4aa52 100644
--- a/code/modules/jobs/job_types/station_trait/pun_pun.dm
+++ b/code/modules/jobs/job_types/station_trait/pun_pun.dm
@@ -24,7 +24,8 @@
)
rpg_title = "Homunculus"
allow_bureaucratic_error = FALSE
- job_flags = NONE // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = (STATION_JOB_FLAGS|STATION_TRAIT_JOB_FLAGS)&~JOB_ASSIGN_QUIRKS
+ job_flags = NONE // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = (STATION_JOB_FLAGS|STATION_TRAIT_JOB_FLAGS) &~ JOB_ASSIGN_QUIRKS
+ tgui_icon = FA_ICON_PAW
/datum/job/pun_pun/get_spawn_mob(client/player_client, atom/spawn_point)
if (!player_client)
diff --git a/code/modules/jobs/job_types/station_trait/veteran_advisor.dm b/code/modules/jobs/job_types/station_trait/veteran_advisor.dm
index c487967c5ed9..81d7420a21c1 100644
--- a/code/modules/jobs/job_types/station_trait/veteran_advisor.dm
+++ b/code/modules/jobs/job_types/station_trait/veteran_advisor.dm
@@ -35,6 +35,7 @@
rpg_title = "Royal Advisor"
allow_bureaucratic_error = FALSE
job_flags = NONE // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED
+ tgui_icon = FA_ICON_RIBBON
/datum/job/veteran_advisor/get_default_roundstart_spawn_point()
for(var/obj/effect/landmark/start/spawn_point as anything in GLOB.start_landmarks_list)
diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm
index 1c42257a60a1..16b403af3a7c 100644
--- a/code/modules/jobs/job_types/warden.dm
+++ b/code/modules/jobs/job_types/warden.dm
@@ -41,6 +41,7 @@
)
rpg_title = "Jailor"
job_flags = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_ANTAG_PROTECTED
+ tgui_icon = FA_ICON_HANDCUFFS
/datum/job/warden/after_spawn(mob/living/spawned, client/player_client)
. = ..()
diff --git a/code/modules/language/_language.dm b/code/modules/language/_language.dm
index b6dd52c33ac7..10fb80934de0 100644
--- a/code/modules/language/_language.dm
+++ b/code/modules/language/_language.dm
@@ -5,12 +5,13 @@
/// Datum based languages. Easily editable and modular.
/datum/language
+ abstract_type = /datum/language
/// Fluff name of language if any.
var/name = "an unknown language"
/// Short description for 'Check Languages'.
var/desc = "A language."
/// Character used to speak in language
- /// If key is null, then the language isn't real or learnable.
+ /// If `null`, the language cannot be spoken with a key, requires being set as a default language or forced speech.
var/key
/// Various language flags.
var/flags = NONE
diff --git a/code/modules/language/_language_menu.dm b/code/modules/language/_language_menu.dm
index 039afb2e1c36..23678ba08c9b 100644
--- a/code/modules/language/_language_menu.dm
+++ b/code/modules/language/_language_menu.dm
@@ -29,12 +29,12 @@
for(var/datum/language/language as anything in GLOB.all_languages)
var/list/lang_data = list()
- lang_data["name"] = initial(language.name)
- lang_data["desc"] = initial(language.desc)
- lang_data["key"] = initial(language.key)
+ lang_data["name"] = language::name
+ lang_data["desc"] = language::desc
+ lang_data["key"] = language::key
lang_data["is_default"] = (language == language_holder.selected_language)
- lang_data["icon"] = initial(language.icon)
- lang_data["icon_state"] = initial(language.icon_state)
+ lang_data["icon"] = language::icon
+ lang_data["icon_state"] = language::icon_state
if(speaker)
lang_data["can_speak"] = !!speaker.has_language(language, SPOKEN_LANGUAGE)
lang_data["could_speak"] = !!(language_holder.omnitongue || speaker.could_speak_language(language))
diff --git a/code/modules/loadout/categories/shoes.dm b/code/modules/loadout/categories/shoes.dm
index 34726f2a52d8..4f7e80c9b421 100644
--- a/code/modules/loadout/categories/shoes.dm
+++ b/code/modules/loadout/categories/shoes.dm
@@ -9,6 +9,10 @@
abstract_type = /datum/loadout_item/shoes
/datum/loadout_item/shoes/insert_path_into_outfit(datum/outfit/outfit, mob/living/carbon/human/equipper, visuals_only = FALSE)
+ // This prevents clown shoes from being destroyed, for such would be SACRILEGE.
+ if(istype(outfit, /datum/outfit/job/clown))
+ return ..() // Parent calling puts them into the clown's backpack (as a test of character).
+
outfit.shoes = item_path
// DARKPACK EDIT REMOVAL START - Loadout categories
diff --git a/code/modules/mining/boulder_processing/boulder.dm b/code/modules/mining/boulder_processing/boulder.dm
index 3969c5551808..e49fd322ced8 100644
--- a/code/modules/mining/boulder_processing/boulder.dm
+++ b/code/modules/mining/boulder_processing/boulder.dm
@@ -84,7 +84,7 @@
if(.)
return
if(HAS_TRAIT(user, TRAIT_BOULDER_BREAKER))
- manual_process(null, user, INATE_BOULDER_SPEED_MULTIPLIER)
+ manual_process(null, user, INNATE_BOULDER_SPEED_MULTIPLIER)
return
/obj/item/boulder/attack_hand_secondary(mob/user, list/modifiers)
@@ -92,12 +92,12 @@
if(.)
return
if(HAS_TRAIT(user, TRAIT_BOULDER_BREAKER))
- manual_process(null, user, INATE_BOULDER_SPEED_MULTIPLIER)
+ manual_process(null, user, INNATE_BOULDER_SPEED_MULTIPLIER)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
/obj/item/boulder/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if (HAS_TRAIT(tool, TRAIT_BOULDER_BREAKER))
- manual_process(tool, user, INATE_BOULDER_SPEED_MULTIPLIER)
+ manual_process(tool, user, INNATE_BOULDER_SPEED_MULTIPLIER)
return ITEM_INTERACT_SUCCESS
if (tool.tool_behaviour == TOOL_MINING)
manual_process(tool, user)
@@ -109,7 +109,7 @@
if(.)
return
if(HAS_TRAIT(user, TRAIT_BOULDER_BREAKER))
- manual_process(null, user, INATE_BOULDER_SPEED_MULTIPLIER) //A little hacky but it works around the speed of the blackboard task selection process for now.
+ manual_process(null, user, INNATE_BOULDER_SPEED_MULTIPLIER) //A little hacky but it works around the speed of the blackboard task selection process for now.
return TRUE
/obj/item/boulder/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
@@ -168,7 +168,7 @@
else if(override_speed_multiplier)
process_speed = override_speed_multiplier
else
- process_speed = INATE_BOULDER_SPEED_MULTIPLIER
+ process_speed = INNATE_BOULDER_SPEED_MULTIPLIER
playsound(src, 'sound/effects/rock/rocktap1.ogg', 50)
if(!continued)
to_chat(user, span_notice("You scrape away at \the [src]..."))
diff --git a/code/modules/mining/equipment/candela_network/candela_beacons.dm b/code/modules/mining/equipment/candela_network/candela_beacons.dm
new file mode 100644
index 000000000000..009377376ee1
--- /dev/null
+++ b/code/modules/mining/equipment/candela_network/candela_beacons.dm
@@ -0,0 +1,180 @@
+/obj/item/stack/candela_beacon
+ name = "mining navigation beacon"
+ singular_name = "mining navigation beacon"
+ desc = "\"Candela\"-type extending mining beacon, capable of linking with nearby beacons and devices to form a satellite-free navigation network."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "candela_beacon"
+ w_class = WEIGHT_CLASS_SMALL
+ full_w_class = WEIGHT_CLASS_SMALL
+ merge_type = /obj/item/stack/candela_beacon
+ max_amount = 50
+ novariants = TRUE
+ /// Candela network handler we use for our connection behavior
+ var/datum/candela_item_handler/handler = null
+
+/obj/item/stack/candela_beacon/Initialize(mapload, new_amount, merge, list/mat_override, mat_amt)
+ . = ..()
+ handler = new(
+ src,
+ active_slots = ITEM_SLOT_HANDS | ITEM_SLOT_POCKETS,
+ storage_active_slots = ITEM_SLOT_POCKETS | ITEM_SLOT_BELT,
+ on_network_cut_callback = CALLBACK(src, PROC_REF(on_network_cut)),
+ )
+ update_appearance()
+
+/obj/item/stack/candela_beacon/Destroy()
+ QDEL_NULL(handler)
+ return ..()
+
+/obj/item/stack/candela_beacon/attack_self(mob/user, modifiers)
+ place_beacon(user)
+
+/obj/item/stack/candela_beacon/interact(mob/user)
+ return
+
+/obj/item/stack/candela_beacon/merge_without_del(obj/item/stack/candela_beacon/target_stack, limit)
+ . = ..()
+ if (.)
+ target_stack.handler.set_network(handler.network, handler.closest_node)
+
+/// Deploy a beacon at user's feet, or at a given location if passed
+/// Can deploy a beacon for another handler, using its network instead
+/obj/item/stack/candela_beacon/proc/place_beacon(mob/user, atom/loc_override = null, datum/candela_item_handler/handler_override = null, silent = FALSE)
+ if (!isturf(user.loc))
+ if (!silent)
+ to_chat(user, span_warning("You need more space to place a [singular_name] here."))
+ return FALSE
+
+ if (locate(/obj/structure/candela_beacon) in (loc_override || user.loc))
+ if (!silent)
+ to_chat(user, span_warning("There is already a [singular_name] here."))
+ return FALSE
+
+ var/datum/candela_item_handler/used_handler = handler_override || handler
+ // In case use() deletes ourselves
+ var/datum/mining_beacon_network/our_network = used_handler.network
+ if (!use(1))
+ return FALSE
+
+ if (!silent)
+ to_chat(user, span_notice("You activate and anchor [amount ? "a":"the"] [singular_name] in place."))
+
+ playsound(user, 'sound/machines/click.ogg', 50, TRUE)
+ var/obj/structure/candela_beacon/beacon = new(loc_override || user.loc, our_network, used_handler)
+ transfer_fingerprints_to(beacon)
+ return TRUE
+
+/// Callback to react to breaking LOS/reaching maximum distance with a beacon
+/obj/item/stack/candela_beacon/proc/on_network_cut(atom/old_loc, old_dir, interrupt)
+ // If we did not change current_closest, there is a chance we cannot see any nodes near us, in which case we want to place a beacon on the previous turf where we *did* see one
+ if (handler.closest_node && !interrupt)
+ return place_beacon(handler.owner, old_loc, silent = TRUE)
+ return FALSE
+
+/obj/item/stack/candela_beacon/attack_self_secondary(mob/user, modifiers)
+ . = ..()
+ if (.)
+ return
+ handler.set_network(null)
+ balloon_alert(user, "network connection severed")
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+/obj/item/stack/candela_beacon/update_overlays()
+ . = ..()
+ . += emissive_appearance(icon, "[icon_state]_e", src, alpha = 192)
+
+/obj/item/stack/candela_beacon/examine(mob/user)
+ . = ..()
+ . += "Use in-hand to plant a beacon, [EXAMINE_HINT("right-click")] in-hand to sever network link."
+ . += "Click on a placed beacon to form a network connection, or [EXAMINE_HINT("right-click")] to pick it up."
+ . += "Automatically deployed upon reaching maximum distance or breaking line-of-sight to the network when placed in pocket or belt slots, or in storage in pocket or belt slots."
+
+/obj/item/stack/candela_beacon/ten
+ amount = 10
+
+/obj/item/stack/candela_beacon/thirty
+ amount = 30
+
+// Deployed beacon structure
+
+/obj/structure/candela_beacon
+ name = "mining navigation beacon"
+ desc = "\"Candela\"-type extending mining beacon, capable of linking with nearby beacons and devices to form a satellite-free navigation network."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "candela_deployed"
+ layer = ABOVE_OBJ_LAYER
+ pixel_z = 6
+ base_pixel_z = 6
+ anchored = TRUE
+ light_range = 2
+ light_power = 1.7
+ light_color = LIGHT_COLOR_MINING
+ armor_type = /datum/armor/structure_candela_beacon
+ max_integrity = 90
+
+/datum/armor/structure_candela_beacon
+ melee = 25
+ bullet = 25
+ laser = 25
+ energy = 25
+ bomb = 75
+ fire = 25
+
+/obj/structure/candela_beacon/Initialize(mapload, datum/mining_beacon_network/new_network, datum/candela_item_handler/deployer)
+ . = ..()
+ if (isnull(new_network))
+ new_network = new()
+ RegisterSignal(src, COMSIG_CANDELA_NODE_NETWORK_CHANGED, PROC_REF(on_network_changed))
+ AddComponent(/datum/component/candela_node, new_network, deployer, connection_pixel_x = base_pixel_w, connection_pixel_y = base_pixel_z + 3)
+ update_appearance()
+
+/obj/structure/candela_beacon/proc/on_network_changed(datum/source, datum/mining_beacon_network/old_network, datum/mining_beacon_network/new_network)
+ SIGNAL_HANDLER
+
+ if (old_network)
+ UnregisterSignal(old_network, COMSIG_CANDELA_NETWORK_POWER_CHANGED)
+ on_power_changed(old_state = old_network?.powered, new_state = new_network?.powered)
+ if (new_network)
+ RegisterSignal(new_network, COMSIG_CANDELA_NETWORK_POWER_CHANGED, PROC_REF(on_power_changed))
+
+/obj/structure/candela_beacon/proc/on_power_changed(datum/source, old_state, new_state)
+ SIGNAL_HANDLER
+
+ var/powered = (new_state & CANDELA_NETWORK_POWERED)
+ set_light_power(powered ? 1.7 : 1.3)
+ set_light_range(powered ? 2 : MINIMUM_USEFUL_LIGHT_RANGE)
+
+/obj/structure/candela_beacon/update_overlays()
+ . = ..()
+ . += emissive_appearance(icon, "[icon_state]_e", src, alpha = 192)
+
+/obj/structure/candela_beacon/attack_hand(mob/living/user, list/modifiers)
+ . = ..()
+ if (.)
+ return
+ balloon_alert(user, "picking up the beacon...")
+ if (!do_after(user, 2 SECONDS, src))
+ return
+
+ var/obj/item/stack/candela_beacon/beacon = new(loc)
+ transfer_fingerprints_to(beacon)
+ if (user.put_in_hands(beacon, del_on_fail = TRUE))
+ playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
+ qdel(src)
+
+/obj/structure/candela_beacon/item_interaction_secondary(mob/living/user, obj/item/tool, list/modifiers)
+ if (!istype(tool, /obj/item/stack/candela_beacon))
+ return NONE
+
+ var/obj/item/stack/candela_beacon/collection = tool
+ if(collection.amount >= collection.max_amount)
+ balloon_alert(user, "stack full!")
+ return ITEM_INTERACT_BLOCKING
+ to_chat(user, span_notice("You start picking [src] up..."))
+ if(!do_after(user, 2 SECONDS, src) || collection.amount >= collection.max_amount)
+ return ITEM_INTERACT_BLOCKING
+
+ collection.add(1)
+ playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
+ qdel(src)
+ return ITEM_INTERACT_SUCCESS
diff --git a/code/modules/mining/equipment/candela_network/candela_item_handler.dm b/code/modules/mining/equipment/candela_network/candela_item_handler.dm
new file mode 100644
index 000000000000..49b2c77cbb22
--- /dev/null
+++ b/code/modules/mining/equipment/candela_network/candela_item_handler.dm
@@ -0,0 +1,233 @@
+/// Datum which handles interactions of items with the Candela network
+/// Not a component as item interactions can be much more involved and bi-directional
+/// which makes isolated nature of components a bad fit
+/datum/candela_item_handler
+ // Properties
+ /// Item which owns this handler
+ var/obj/item/parent = null
+ /// Slots in which the item keeps the connection to the network
+ var/active_slots = NONE
+ /// Slots in which the storage containing this item can be in order for the item to keep the connection
+ var/storage_active_slots = NONE
+ /// Callback called when we're about to get cut from the network due to user movement : (atom/old_loc, old_dir, interrupt)
+ var/datum/callback/on_network_cut_callback = null
+
+ // Runtime variables
+ /// Mob which is currently holding/using the item
+ var/mob/living/owner = null
+ /// Network we're connected to, if any
+ var/datum/mining_beacon_network/network = null
+ /// Closest node within our network (that we can see)to us
+ var/datum/component/candela_node/closest_node
+ /// Beam visual connecting our user to their closest node
+ var/datum/beam/beam_visual = null
+
+/datum/candela_item_handler/New(obj/item/parent, active_slots = NONE, storage_active_slots = NONE, datum/callback/on_network_cut_callback = null)
+ . = ..()
+ src.parent = parent
+ src.active_slots = active_slots
+ src.storage_active_slots = storage_active_slots
+ src.on_network_cut_callback = on_network_cut_callback
+
+ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_parent_equipped))
+ RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_parent_dropped))
+ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_parent_moved))
+
+/datum/candela_item_handler/Destroy(force)
+ set_network(null)
+ set_owner(null)
+ UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_MOVABLE_MOVED))
+ parent = null
+ on_network_cut_callback = null
+ return ..()
+
+/datum/candela_item_handler/proc/on_parent_equipped(obj/item/source, mob/living/user, slot)
+ SIGNAL_HANDLER
+ if (slot & active_slots)
+ set_owner(user)
+
+/datum/candela_item_handler/proc/on_parent_dropped(obj/item/source, mob/living/user)
+ SIGNAL_HANDLER
+ set_owner(null)
+
+/datum/candela_item_handler/proc/on_parent_moved(obj/item/source, atom/old_loc, movement_dir, forced, list/old_locs, momentum_change)
+ SIGNAL_HANDLER
+
+ if (!storage_active_slots)
+ return
+
+ if (isitem(old_loc))
+ if (old_loc.loc == owner)
+ set_owner(null)
+ UnregisterSignal(old_loc, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED))
+
+ var/atom/parent_loc = parent.loc
+ if (!isitem(parent_loc))
+ return
+
+ RegisterSignal(parent_loc, COMSIG_ITEM_EQUIPPED, PROC_REF(on_storage_equipped))
+ RegisterSignal(parent_loc, COMSIG_ITEM_DROPPED, PROC_REF(on_storage_dropped))
+ if (astype(parent_loc.loc, /mob/living)?.get_slot_by_item(parent_loc) & storage_active_slots)
+ set_owner(parent_loc.loc)
+
+/datum/candela_item_handler/proc/on_storage_equipped(obj/item/source, mob/equipper, slot)
+ SIGNAL_HANDLER
+
+ if (slot & storage_active_slots)
+ set_owner(equipper)
+
+/datum/candela_item_handler/proc/on_storage_dropped(obj/item/source, mob/user)
+ SIGNAL_HANDLER
+ set_owner(null)
+
+/datum/candela_item_handler/proc/set_owner(mob/living/new_owner)
+ if (owner == new_owner)
+ return
+
+ if (owner)
+ network?.unlink_mob(src, owner)
+
+ owner = new_owner
+ network?.linked_beacon_items |= src
+ if (!owner)
+ set_closest_node(null)
+ return
+
+ if (network)
+ network.link_mob(src, owner)
+ locate_closest_node(silent = TRUE)
+
+/datum/candela_item_handler/proc/set_network(datum/mining_beacon_network/new_network, datum/component/candela_node/new_closest_node = null, merging = FALSE)
+ if (network == new_network)
+ if (new_closest_node)
+ set_closest_node(new_closest_node)
+ return
+
+ if (network)
+ if (owner)
+ network.unlink_mob(src, owner)
+ network.linked_beacon_items -= src
+
+ network = new_network
+
+ if (!network)
+ set_closest_node(null)
+ return
+
+ if (owner)
+ network.link_mob(src, owner)
+
+ if (merging)
+ return
+
+ network.linked_beacon_items |= src
+ if (new_closest_node)
+ set_closest_node(new_closest_node)
+ else
+ locate_closest_node()
+
+/// Locates the closest node within our network, or cuts the connection if none could be found
+/datum/candela_item_handler/proc/locate_closest_node(silent = FALSE)
+ if (!network)
+ return null
+
+ var/turf/our_turf = get_turf(parent)
+ var/cur_dist = MINING_BEACON_MAX_REACH + 1
+ var/cur_node = null
+ for (var/datum/component/candela_node/node as anything in network.linked_nodes)
+ var/turf/node_turf = get_turf(node.parent)
+ var/node_dist = get_dist_euclidean(our_turf, node_turf)
+ if (node_dist >= cur_dist)
+ continue
+
+ if (!can_see(our_turf, node_turf, MINING_BEACON_MAX_REACH) || !can_see(node_turf, our_turf, MINING_BEACON_MAX_REACH))
+ continue
+
+ cur_node = node
+ cur_dist = node_dist
+
+ if (cur_node)
+ set_closest_node(cur_node)
+ return cur_node
+
+ set_network(null)
+ if (owner && !silent)
+ parent.balloon_alert(owner, "connection lost!")
+
+/// Locates the closest node within any network to ourselves, and links to it and its network
+/datum/candela_item_handler/proc/locate_closest_network()
+ var/turf/our_turf = get_turf(parent)
+ var/cur_dist = MINING_BEACON_MAX_REACH + 1
+ var/datum/component/candela_node/cur_node = null
+ for (var/datum/mining_beacon_network/network as anything in GLOB.mining_beacon_networks)
+ for (var/datum/component/candela_node/node as anything in network.linked_nodes)
+ var/turf/node_turf = get_turf(node.parent)
+ var/node_dist = get_dist_euclidean(our_turf, node_turf)
+ if (node_dist >= cur_dist)
+ continue
+
+ if (!can_see(our_turf, node_turf, MINING_BEACON_MAX_REACH) || !can_see(node_turf, our_turf, MINING_BEACON_MAX_REACH))
+ continue
+
+ cur_node = node
+ cur_dist = node_dist
+
+ if (cur_node)
+ set_network(cur_node.network, cur_node)
+ return network
+
+ if (!network)
+ return null
+
+ set_network(null)
+ if (owner)
+ parent.balloon_alert(owner, "connection lost!")
+
+/datum/candela_item_handler/proc/set_closest_node(datum/component/candela_node/new_node)
+ if (new_node == closest_node)
+ return
+
+ if (closest_node)
+ UnregisterSignal(closest_node, COMSIG_QDELETING)
+
+ QDEL_NULL(beam_visual)
+ closest_node = new_node
+
+ if (!closest_node)
+ return
+
+ RegisterSignal(closest_node, COMSIG_QDELETING, PROC_REF(on_node_deleted))
+
+ if (!owner)
+ return
+
+ // Don't render a beam if another handler (added to the network before us) is already rendering one to the same node as to avoid spam/overlaps
+ var/list/handlers = network.linked_mobs[owner]
+ for (var/datum/candela_item_handler/other_handler as anything in handlers)
+ if (other_handler == src || other_handler.closest_node != closest_node) // shouldn't have a different closest node but just in case
+ continue
+
+ if (handlers.Find(other_handler) < handlers.Find(src))
+ return
+
+ redraw_beam()
+
+/datum/candela_item_handler/proc/redraw_beam()
+ QDEL_NULL(beam_visual)
+ beam_visual = owner.Beam(
+ closest_node.parent,
+ "1-full", 'icons/effects/beam.dmi',
+ beam_color = LIGHT_COLOR_MINING,
+ emissive = EMISSIVE_BLOOM,
+ override_target_pixel_x = closest_node.connection_pixel_x,
+ override_target_pixel_y = closest_node.connection_pixel_y,
+ emissive_alpha = 192,
+ alpha = 128,
+ layer = BELOW_MOB_LAYER
+ )
+
+/datum/candela_item_handler/proc/on_node_deleted(datum/source)
+ SIGNAL_HANDLER
+
+ closest_node = null
+ locate_closest_node()
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index aca65531264b..575ed646f535 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -200,6 +200,7 @@
/obj/item/clothing/suit/armor/bone/Initialize(mapload)
. = ..()
AddComponent(/datum/component/armor_plate, upgrade_item = /obj/item/clothing/accessory/talisman)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, /datum/bodypart_texture/mesh/drake)
allowed = GLOB.mining_suit_allowed
/obj/item/clothing/head/helmet/skull
diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm
index e75e36e55fa8..98ca17352c8e 100644
--- a/code/modules/mining/fulton.dm
+++ b/code/modules/mining/fulton.dm
@@ -18,6 +18,8 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
var/safe_for_living_creatures = TRUE
/// Maximum force that can be used to extract
var/max_force_fulton = MOVE_FORCE_STRONG
+ /// How long will the mob be paralyzed for?
+ var/paralyze_duration = 32 SECONDS
/obj/item/extraction_pack/examine()
. = ..()
@@ -62,10 +64,8 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
if(thing.anchored)
return NONE
- var/obj/structure/extraction_point/beacon = beacon_ref?.resolve()
+ var/atom/movable/beacon = get_beacon(user)
if(isnull(beacon))
- balloon_alert(user, "not linked!")
- beacon_ref = null
return ITEM_INTERACT_BLOCKING
var/area/area = get_area(thing)
if(!can_use_indoors)
@@ -111,7 +111,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
if(isliving(thing))
var/mob/living/creature = thing
- creature.Paralyze(32 SECONDS) // Keep them from moving during the duration of the extraction
+ creature.Paralyze(paralyze_duration) // Keep them from moving during the duration of the extraction
ADD_TRAIT(creature, TRAIT_FORCED_STANDING, FULTON_PACK_TRAIT) // Prevents animation jank from happening
if(creature.buckled)
creature.buckled.unbuckle_mob(creature, TRUE) // Unbuckle them to prevent anchoring problems
@@ -125,11 +125,17 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
var/mutable_appearance/balloon2 = mutable_appearance('icons/effects/fulton_balloon.dmi', "fulton_expand", layer = VEHICLE_LAYER, appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM | KEEP_APART)
balloon2.pixel_z = 10
holder_obj.add_overlay(balloon2)
- addtimer(CALLBACK(src, PROC_REF(create_balloon), thing, user, holder_obj, balloon2), 0.4 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(create_balloon), thing, user, holder_obj, balloon2, get_turf(beacon)), 0.4 SECONDS)
return ITEM_INTERACT_SUCCESS
-/obj/item/extraction_pack/proc/create_balloon(atom/movable/thing, mob/living/user, obj/effect/extraction_holder/holder_obj, mutable_appearance/balloon2)
- var/turf/beacon_turf = get_turf(beacon_ref.resolve())
+/obj/item/extraction_pack/proc/get_beacon(mob/living/user)
+ var/obj/structure/extraction_point/beacon = beacon_ref?.resolve()
+ if (isnull(beacon))
+ balloon_alert(user, "not linked!")
+ beacon_ref = null
+ return beacon
+
+/obj/item/extraction_pack/proc/create_balloon(atom/movable/thing, mob/living/user, obj/effect/extraction_holder/holder_obj, mutable_appearance/balloon2, turf/beacon_turf)
var/mutable_appearance/balloon = mutable_appearance('icons/effects/fulton_balloon.dmi', "fulton_balloon", layer = VEHICLE_LAYER, appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM | KEEP_APART)
balloon.pixel_z = 10
holder_obj.cut_overlay(balloon2)
@@ -190,11 +196,85 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
if(uses_left <= 0)
qdel(src)
+/obj/item/extraction_pack/networked
+ name = "networked fulton extraction pack"
+ desc = "A balloon that can be used to extract equipment or personnel to any fulton beacon or tapped ore vent within nearby \"Candela\" mining navigation networks. Anything not bolted down can be moved."
+ icon_state = "extraction_pack_networked"
+ paralyze_duration = 18 SECONDS
+
+/obj/item/extraction_pack/networked/attack_self(mob/user)
+ var/list/possible_beacons = list()
+ for(var/datum/weakref/point_ref as anything in GLOB.total_extraction_beacons)
+ var/obj/structure/extraction_point/extraction_point = point_ref.resolve()
+ if(isnull(extraction_point))
+ GLOB.total_extraction_beacons.Remove(point_ref)
+ continue
+ if(extraction_point.beacon_network in beacon_networks)
+ possible_beacons += extraction_point
+
+ for (var/datum/mining_beacon_network/network as anything in GLOB.mining_beacon_networks)
+ var/list/fulton_points = list()
+ var/node_located = FALSE
+ for (var/datum/component/candela_node/node as anything in network.linked_nodes)
+ if (node.fulton_point)
+ fulton_points += node.parent
+
+ if (node_located)
+ continue
+
+ if (get_dist(node.parent, user) <= MINING_BEACON_MAX_REACH && (user in viewers(MINING_BEACON_MAX_REACH, node.parent)))
+ node_located = TRUE
+
+ if (node_located)
+ possible_beacons |= fulton_points
+
+ if(!length(possible_beacons))
+ balloon_alert(user, "no beacons")
+ return
+
+ var/chosen_beacon = tgui_input_list(user, "Beacon to connect to", "Balloon Extraction Pack", sort_names(possible_beacons))
+ if(isnull(chosen_beacon))
+ return
+
+ beacon_ref = WEAKREF(chosen_beacon)
+ balloon_alert(user, "linked!")
+
+/obj/item/extraction_pack/networked/get_beacon(mob/living/user)
+ var/obj/structure/extraction_point/beacon = beacon_ref?.resolve()
+ if (isnull(beacon))
+ balloon_alert(user, "not linked!")
+ beacon_ref = null
+ return null
+
+ // Anything that isn't an extraction point must've came from a Candela network, go through all of its nodes check if we can access it
+ if (istype(beacon))
+ return beacon
+
+ for (var/datum/mining_beacon_network/network as anything in GLOB.mining_beacon_networks)
+ // Check if its even our target's network to begin with
+ var/target_net = FALSE
+ for (var/datum/component/candela_node/node as anything in network.linked_nodes)
+ if (node.parent == beacon)
+ target_net = TRUE
+ break
+
+ if (!target_net)
+ continue
+
+ for (var/datum/component/candela_node/node as anything in network.linked_nodes)
+ if (get_dist(node.parent, user) <= MINING_BEACON_MAX_REACH && (user in viewers(MINING_BEACON_MAX_REACH, node.parent)))
+ return beacon
+
+ balloon_alert(user, "our of network reach!")
+ return null
+
/obj/item/fulton_core
name = "extraction beacon assembly kit"
desc = "When built, emits a signal which fulton recovery devices can lock onto. Activate in hand to unfold into a beacon."
icon = 'icons/obj/fulton.dmi'
icon_state = "folded_extraction"
+ /// Structure to spawn
+ var/point_type = /obj/structure/extraction_point
/obj/item/fulton_core/attack_self(mob/user)
var/area/user_area = get_area(user)
@@ -205,10 +285,19 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
if(!do_after(user, 1.5 SECONDS, target = user) || QDELETED(src))
return
- new /obj/structure/extraction_point(get_turf(user))
+ new point_type(get_turf(user), user)
playsound(src, 'sound/items/deconstruct.ogg', vol = 50, vary = TRUE, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE)
qdel(src)
+/obj/item/fulton_core/networked
+ name = "networked extraction beacon assembly kit"
+ desc = "When built, emits a signal which fulton recovery devices within the same \"Candela\" navigation network can lock onto. Activate in hand to unfold into a beacon."
+ point_type = /obj/structure/extraction_point/networked
+
+/obj/item/fulton_core/syndicate
+ name = "suspicious extraction beacon assembly kit"
+ point_type = /obj/structure/extraction_point/syndicate
+
/obj/structure/extraction_point
name = "fulton recovery beacon"
desc = "A beacon for the fulton recovery system. Activate a pack in your hand to link it to a beacon."
@@ -217,20 +306,33 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
anchored = TRUE
density = FALSE
obj_flags = CAN_BE_HIT | UNIQUE_RENAME
+ /// String key used to check if a beacon can be accessed by a pack
var/beacon_network = "station"
+ /// What type of core do we drop when picked up
+ var/core_type = /obj/item/fulton_core
-/obj/structure/extraction_point/Initialize(mapload)
+/obj/structure/extraction_point/Initialize(mapload, mob/creator)
. = ..()
name += " ([rand(100,999)]) ([get_area_name(src, TRUE)])"
+ INVOKE_ASYNC(src, PROC_REF(poll_name), creator)
GLOB.total_extraction_beacons.Add(WEAKREF(src))
update_appearance(UPDATE_OVERLAYS)
+/obj/structure/extraction_point/proc/poll_name(mob/creator)
+ var/name_input = tgui_input_text(creator, "What would you like to name the beacon?", "Fulton Beacon", default = name, max_length = MAX_LABEL_LEN)
+ if (name_input && !QDELETED(src) && !QDELETED(creator) && creator.Adjacent(src))
+ name = name_input
+
+/obj/structure/extraction_point/Destroy(force)
+ GLOB.total_extraction_beacons -= WEAKREF(src)
+ return ..()
+
/obj/structure/extraction_point/attack_hand(mob/living/user, list/modifiers)
. = ..()
balloon_alert_to_viewers("undeploying...")
if(!do_after(user, 1.5 SECONDS, src))
return
- new /obj/item/fulton_core(drop_location())
+ new core_type(drop_location())
playsound(src, 'sound/items/deconstruct.ogg', vol = 50, vary = TRUE, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE)
qdel(src)
@@ -238,6 +340,20 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
. = ..()
. += emissive_appearance(icon, "[icon_state]_light", src, alpha = src.alpha)
+/obj/structure/extraction_point/syndicate
+ beacon_network = "syndicate"
+ core_type = /obj/item/fulton_core/syndicate
+
+/obj/structure/extraction_point/networked
+ name = "networked fulton recovery beacon"
+ desc = "A beacon for the fulton recovery system, capable of broadcasting its location through \"Candela\" navigation networks."
+ icon_state = "extraction_point_networked"
+ core_type = /obj/item/fulton_core/networked
+
+/obj/structure/extraction_point/networked/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/candela_node, new /datum/mining_beacon_network(), null, connection_pixel_x = base_pixel_w, connection_pixel_y = base_pixel_z - 2)
+
/obj/effect/extraction_holder
name = "extraction holder"
desc = "you shouldn't see this"
@@ -264,3 +380,4 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
/obj/item/extraction_pack/syndicate
name = "syndicate fulton extraction pack"
can_use_indoors = TRUE
+ beacon_networks = list("station", "syndicate")
diff --git a/code/modules/mining/lavaland/mining_loot/clothing.dm b/code/modules/mining/lavaland/mining_loot/clothing.dm
index 5e1084076149..3031865762a4 100644
--- a/code/modules/mining/lavaland/mining_loot/clothing.dm
+++ b/code/modules/mining/lavaland/mining_loot/clothing.dm
@@ -33,6 +33,7 @@
RegisterSignal(user, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(check_health))
icon_state = "memento_mori_active"
active_owner = user
+ ADD_TRAIT(src, TRAIT_DANGEROUS_UNEQUIP, TRAIT_GENERIC)
/obj/item/clothing/neck/necklace/memento_mori/proc/mori()
icon_state = "memento_mori"
@@ -43,6 +44,7 @@
active_owner = null
to_chat(stored_owner, span_userdanger("You feel your life rapidly slipping away from you!"))
stored_owner.dust(just_ash = TRUE, drop_items = TRUE)
+ REMOVE_TRAIT(src, TRAIT_DANGEROUS_UNEQUIP, TRAIT_GENERIC)
/obj/item/clothing/neck/necklace/memento_mori/proc/check_health(mob/living/source)
SIGNAL_HANDLER
diff --git a/code/modules/mining/lavaland/mining_loot/consumables.dm b/code/modules/mining/lavaland/mining_loot/consumables.dm
index 5ce7ef933ae9..cef7cadf0883 100644
--- a/code/modules/mining/lavaland/mining_loot/consumables.dm
+++ b/code/modules/mining/lavaland/mining_loot/consumables.dm
@@ -195,7 +195,7 @@
var/wing_type = get_wing_choice(exposed_human, chest)
if(!wing_type)
return
- var/obj/item/organ/wings/functional/wings = new wing_type()
+ var/obj/item/organ/wings/wings = new wing_type()
wings.Insert(exposed_human)
if(had_wings)
to_chat(exposed_human, span_userdanger("A terrible pain travels down your back as your wings change shape!"))
@@ -211,7 +211,7 @@
return wing_types[1]
var/list/radial_wings = list()
var/list/name2type = list()
- for(var/obj/item/organ/wings/functional/possible_type as anything in wing_types)
+ for(var/obj/item/organ/wings/possible_type as anything in wing_types)
var/datum/sprite_accessory/accessory = SSaccessories.feature_list[FEATURE_WINGS][possible_type::sprite_accessory_override::name] //get the singleton instance
var/image/img = image(icon = accessory.icon, icon_state = "m_wingsopen_[accessory.icon_state]_BEHIND") //Process the HUD elements
img.transform *= 0.5
diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm b/code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm
index 86aa364acaec..dfb7dd271d44 100644
--- a/code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm
+++ b/code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm
@@ -43,6 +43,7 @@
/obj/item/clothing/suit/hooded/cloak/drake/Initialize(mapload)
. = ..()
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, /datum/bodypart_texture/mesh/drake)
allowed = GLOB.mining_suit_allowed
/obj/item/clothing/head/hooded/cloakhood/drake
@@ -59,6 +60,10 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
+/obj/item/clothing/head/hooded/cloakhood/drake/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_HEAD, /datum/bodypart_texture/mesh/drake)
+
// Spectral blade
/obj/item/melee/ghost_sword
@@ -188,7 +193,7 @@
consumer.set_eye_color("#FEE5A3")
consumer.set_species(/datum/species/lizard)
consumer.dna.add_mutation(/datum/mutation/firebreath, MUTATION_SOURCE_MUTATOR)
- var/obj/item/organ/wings/functional/dragon/wings = new()
+ var/obj/item/organ/wings/dragon/wings = new()
wings.Insert(consumer)
if(2)
diff --git a/code/modules/mining/voucher_sets.dm b/code/modules/mining/voucher_sets.dm
index 7216487d7c69..456a77b1e8ce 100644
--- a/code/modules/mining/voucher_sets.dm
+++ b/code/modules/mining/voucher_sets.dm
@@ -51,13 +51,13 @@
/datum/voucher_set/mining/extraction_kit
name = "Extraction and Rescue Kit"
- description = "Contains a fulton extraction pack and a beacon signaller, which allows you to send back home minerals, items and dead bodies without having to use the mining shuttle. And as a bonus, you get 30 marker beacons to help you better mark your path."
+ description = "Contains a fulton extraction pack and a beacon signaller, which allows you to send minerals, items, dead bodies and yourself through the \"Candela\" navigation network. And as a bonus, you get 30 navigation beacons for free."
icon = 'icons/obj/fulton.dmi'
icon_state = "extraction_pack"
set_items = list(
- /obj/item/extraction_pack,
- /obj/item/fulton_core,
- /obj/item/stack/marker_beacon/thirty,
+ /obj/item/extraction_pack/networked,
+ /obj/item/fulton_core/networked,
+ /obj/item/stack/candela_beacon/thirty,
)
/datum/voucher_set/mining/resonator_kit
diff --git a/code/modules/mob/dead/new_player/latejoin_menu.dm b/code/modules/mob/dead/new_player/latejoin_menu.dm
index 0f74236b7c65..60136f77cde3 100644
--- a/code/modules/mob/dead/new_player/latejoin_menu.dm
+++ b/code/modules/mob/dead/new_player/latejoin_menu.dm
@@ -76,6 +76,7 @@ GLOBAL_DATUM_INIT(latejoin_menu, /datum/latejoin_menu, new)
"prioritized" = (job_datum in SSjob.prioritized_jobs),
"used_slots" = job_datum.current_positions,
"open_slots" = job_datum.total_positions < 0 ? "∞" : job_datum.total_positions,
+ "jobIcon" = job_datum.tgui_icon,
)
if(job_availability != JOB_AVAILABLE)
diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm
index 5c643461b159..90cb798ca2d8 100644
--- a/code/modules/mob/dead/observer/orbit.dm
+++ b/code/modules/mob/dead/observer/orbit.dm
@@ -166,7 +166,8 @@ GLOBAL_DATUM_INIT(orbit_menu, /datum/orbit_menu, new)
serialized["antag"] = antag.name
serialized["antag_group"] = antag.antagpanel_category
- serialized["antag_icon"] = antag.antag_hud_name
+ serialized["icon"] = antag.hud_icon
+ serialized["icon_state"] = antag.antag_hud_name
return serialized
@@ -213,27 +214,29 @@ GLOBAL_DATUM_INIT(orbit_menu, /datum/orbit_menu, new)
var/list/serialized = list()
serialized["health"] = FLOOR((player.health / player.maxHealth * 100), 1)
- if(issilicon(player))
- serialized["job"] = player.job
- serialized["icon"] = "borg"
- return serialized
var/obj/item/card/id/id_card = player.get_idcard(hand_first = FALSE)
- serialized["job"] = id_card?.get_trim_assignment()
- serialized["icon"] = id_card?.get_trim_sechud_icon_state()
+ serialized["job"] = id_card?.get_trim_assignment() || player.job
+ serialized["icon"] = id_card?.get_trim_sechud_icon() || DEFAULT_HUDS_DMI
+ if(issilicon(player))
+ serialized["icon_state"] = "borg"
+ else
+ serialized["icon_state"] = id_card?.get_trim_sechud_icon_state()
var/datum/job/job = player.mind?.assigned_role
if (isnull(job))
return serialized
serialized["mind_job"] = job.title
+ serialized["mind_job_icon"] = job.tgui_icon
var/datum/outfit/outfit = job.get_outfit()
if (isnull(outfit))
return serialized
var/datum/id_trim/trim = outfit.id_trim
if (!isnull(trim))
- serialized["mind_icon"] = trim::sechud_icon_state
+ serialized["mind_icon"] = trim::sechud_icon
+ serialized["mind_icon_state"] = trim::sechud_icon_state
return serialized
/// Gets a list: Misc data and whether it's critical. Handles all snowflakey type cases
diff --git a/code/modules/mob/living/basic/bots/bot_hud.dm b/code/modules/mob/living/basic/bots/bot_hud.dm
index 1e9bda4dc3f8..40a56177e47a 100644
--- a/code/modules/mob/living/basic/bots/bot_hud.dm
+++ b/code/modules/mob/living/basic/bots/bot_hud.dm
@@ -1,35 +1,35 @@
/mob/living/basic/bot/proc/diag_hud_set_bothealth()
- set_hud_image_state(DIAG_HUD, "huddiag[RoundDiagBar(health/maxHealth)]")
+ set_hud_image_state(DIAG_HUD, hud_state = "huddiag[RoundDiagBar(health/maxHealth)]")
/mob/living/basic/bot/proc/diag_hud_set_botstat() //On (With wireless on or off), Off, EMP'ed
if(bot_mode_flags & BOT_MODE_ON)
- set_hud_image_state(DIAG_STAT_HUD, "hudstat")
+ set_hud_image_state(DIAG_STAT_HUD, hud_state = "hudstat")
return
if(IS_UNCONSCIOUS_OR_CRIT(src))
- set_hud_image_state(DIAG_STAT_HUD, "hudoffline")
+ set_hud_image_state(DIAG_STAT_HUD, hud_state = "hudoffline")
return
- set_hud_image_state(DIAG_STAT_HUD, "huddead2")
+ set_hud_image_state(DIAG_STAT_HUD, hud_state = "huddead2")
/mob/living/basic/bot/proc/diag_hud_set_botmode() //Shows a bot's current operation
if(client) //If the bot is player controlled, it will not be following mode logic!
- set_hud_image_state(DIAG_BOT_HUD, "hudsentient")
+ set_hud_image_state(DIAG_BOT_HUD, hud_state = "hudsentient")
return
switch(mode)
if(BOT_SUMMON, BOT_RESPONDING) //Responding to PDA or AI summons
- set_hud_image_state(DIAG_BOT_HUD, "hudcalled")
+ set_hud_image_state(DIAG_BOT_HUD, hud_state = "hudcalled")
if(BOT_CLEANING, BOT_HEALING) //Cleanbot cleaning, Floorbot fixing, or Medibot Healing
- set_hud_image_state(DIAG_BOT_HUD, "hudworking")
+ set_hud_image_state(DIAG_BOT_HUD, hud_state = "hudworking")
if(BOT_PATROL, BOT_START_PATROL) //Patrol mode
- set_hud_image_state(DIAG_BOT_HUD, "hudpatrol")
+ set_hud_image_state(DIAG_BOT_HUD, hud_state = "hudpatrol")
if(BOT_PREP_ARREST, BOT_ARREST, BOT_HUNT) //STOP RIGHT THERE, CRIMINAL SCUM!
- set_hud_image_state(DIAG_BOT_HUD, "hudalert")
+ set_hud_image_state(DIAG_BOT_HUD, hud_state = "hudalert")
if(BOT_MOVING, BOT_DELIVER, BOT_GO_HOME, BOT_NAV) //Moving to target for normal bots, moving to deliver or go home for MULES.
- set_hud_image_state(DIAG_BOT_HUD, "hudmove")
+ set_hud_image_state(DIAG_BOT_HUD, hud_state = "hudmove")
else
- set_hud_image_state(DIAG_BOT_HUD, "")
+ set_hud_image_state(DIAG_BOT_HUD, hud_state = "")
///proc that handles drawing and transforming the bot's path onto diagnostic huds
/mob/living/basic/bot/proc/generate_bot_path(datum/move_loop/has_target/jps/source, list/path)
diff --git a/code/modules/mob/living/basic/bots/mulebot/mulebot_hud.dm b/code/modules/mob/living/basic/bots/mulebot/mulebot_hud.dm
index 3e1f26c85849..4a750e5bd951 100644
--- a/code/modules/mob/living/basic/bots/mulebot/mulebot_hud.dm
+++ b/code/modules/mob/living/basic/bots/mulebot/mulebot_hud.dm
@@ -1,11 +1,11 @@
/mob/living/basic/bot/mulebot/proc/set_cell_hud()
if(!has_power())
- set_hud_image_state(DIAG_BATT_HUD, "hudnobatt")
+ set_hud_image_state(DIAG_BATT_HUD, hud_state = "hudnobatt")
return
var/atom/movable/screen/mob_charge/charge_hud = hud_used?.screen_objects[HUD_MULEBOT_CHARGE]
charge_hud?.calculate_charge()
- set_hud_image_state(DIAG_BATT_HUD, "hudbatt[RoundDiagBar(cell.charge/cell.maxcharge)]")
+ set_hud_image_state(DIAG_BATT_HUD, hud_state = "hudbatt[RoundDiagBar(cell.charge/cell.maxcharge)]")
/atom/movable/screen/mob_charge
icon = 'icons/obj/machines/cell_charger.dmi'
diff --git a/code/modules/mob/living/basic/drone/_drone.dm b/code/modules/mob/living/basic/drone/_drone.dm
index 8cf2ea4d06bb..5ed711074e36 100644
--- a/code/modules/mob/living/basic/drone/_drone.dm
+++ b/code/modules/mob/living/basic/drone/_drone.dm
@@ -171,18 +171,18 @@
return length(lines) ? jointext(lines, "\n") : base_laws
/mob/living/basic/drone/med_hud_set_health()
- set_hud_image_state(DIAG_HUD, "huddiag[RoundDiagBar(health/maxHealth)]")
+ set_hud_image_state(DIAG_HUD, hud_state = "huddiag[RoundDiagBar(health/maxHealth)]")
/mob/living/basic/drone/med_hud_set_status()
if(stat == DEAD)
- set_hud_image_state(DIAG_STAT_HUD, "huddead2")
+ set_hud_image_state(DIAG_STAT_HUD, hud_state = "huddead2")
return
if(incapacitated)
- set_hud_image_state(DIAG_STAT_HUD, "hudoffline")
+ set_hud_image_state(DIAG_STAT_HUD, hud_state = "hudoffline")
return
- set_hud_image_state(DIAG_STAT_HUD, "hudstat")
+ set_hud_image_state(DIAG_STAT_HUD, hud_state = "hudstat")
/mob/living/basic/drone/Destroy()
GLOB.drones_list -= src
diff --git a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm
index 9caa17b06ac1..62932a529025 100644
--- a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm
+++ b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm
@@ -61,7 +61,7 @@ GLOBAL_LIST_INIT(strippable_gorilla_items, create_strippable_list(list(
/mob/living/basic/gorilla/Initialize(mapload)
. = ..()
- add_traits(list(TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, TRAIT_CHUNKYFINGERS), ROUNDSTART_TRAIT)
+ add_traits(list(TRAIT_SIMIAN, TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, TRAIT_CHUNKYFINGERS), INNATE_TRAIT)
AddElement(/datum/element/wall_tearer, allow_reinforced = FALSE)
AddElement(/datum/element/dextrous, can_throw = TRUE)
AddElement(/datum/element/footstep, FOOTSTEP_MOB_BAREFOOT)
diff --git a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_combat.bt.json b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_combat.bt.json
index 9a5556b1ece4..183fbe4a54b8 100644
--- a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_combat.bt.json
+++ b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_combat.bt.json
@@ -120,7 +120,8 @@
"type": "leaf",
"behavior": "/datum/bt_node/ai_behavior/maintain_distance/cover_minimum_distance",
"vars": {
- "target_key": "BB_CURRENT_TARGET"
+ "target_key": "BB_CURRENT_TARGET",
+ "face_target": false
}
}
]
diff --git a/code/modules/mob/living/basic/jungle/venus_human_trap.dm b/code/modules/mob/living/basic/jungle/venus_human_trap.dm
index b3dc776c33b9..7eea729b6f09 100644
--- a/code/modules/mob/living/basic/jungle/venus_human_trap.dm
+++ b/code/modules/mob/living/basic/jungle/venus_human_trap.dm
@@ -231,7 +231,7 @@
owner.balloon_alert(owner, "path blocked!")
return
- var/datum/beam/new_vine = owner.Beam(target_atom, icon_state = "vine", time = vine_duration * (ismob(target_atom) ? 1 : 2), beam_type = /obj/effect/ebeam/vine, emissive = FALSE)
+ var/datum/beam/new_vine = owner.Beam(target_atom, icon_state = "vine", time = vine_duration * (ismob(target_atom) ? 1 : 2), beam_type = /obj/effect/ebeam/vine, emissive = NONE)
var/component = target_atom.AddComponent(/datum/component/leash, owner, vine_grab_distance)
RegisterSignal(new_vine, COMSIG_QDELETING, PROC_REF(remove_vine), new_vine)
vines[new_vine] = component
diff --git a/code/modules/mob/living/basic/lavaland/basilisk/basilisk.bt.json b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.bt.json
index e3d26ddf95ba..de7b18a01aec 100644
--- a/code/modules/mob/living/basic/lavaland/basilisk/basilisk.bt.json
+++ b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.bt.json
@@ -89,7 +89,8 @@
"type": "leaf",
"behavior": "/datum/bt_node/ai_behavior/maintain_distance",
"vars": {
- "target_key": "BB_CURRENT_TARGET"
+ "target_key": "BB_CURRENT_TARGET",
+ "face_target": false
}
}
]
diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm
index f40de29f9b41..b0150a3c7af0 100644
--- a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm
+++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm
@@ -147,16 +147,6 @@
max_eggs_held = 1,\
)
-/mob/living/basic/mining/goldgrub/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
- . = ..()
- if(!istype(arrived, /obj/item/stack/ore))
- return
- if(!can_lay_eggs)
- return
- if(!istype(arrived, /obj/item/stack/ore/bluespace_crystal) || prob(60))
- return
- new /obj/item/food/egg/green/grub_egg(get_turf(src))
-
/mob/living/basic/mining/goldgrub/update_overlays()
. = ..()
if(has_emissive)
diff --git a/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm b/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm
index 219c193b996e..5ed33050a3ad 100644
--- a/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm
+++ b/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm
@@ -167,7 +167,7 @@
/obj/item/restraints/legcuffs/goliath_tentacle/proc/leash_target(mob/living/user)
leash = user.AddComponent(/datum/component/leash, owner = get_turf(user), distance = 1, silent = TRUE)
- beam_effect = user.Beam(get_turf(user), "goliath_tentacle", beam_type = /obj/effect/ebeam/goliath, emissive = FALSE)
+ beam_effect = user.Beam(get_turf(user), "goliath_tentacle", beam_type = /obj/effect/ebeam/goliath, emissive = NONE)
RegisterSignal(beam_effect.visuals, COMSIG_CLICK, PROC_REF(on_beam_click))
RegisterSignals(user, list(SIGNAL_ADDTRAIT(TRAIT_TENTACLE_IMMUNE), COMSIG_BRIMDUST_EXPLOSION), PROC_REF(release))
RegisterSignals(tentacle, list(COMSIG_QDELETING, COMSIG_GOLIATH_TENTACLE_RETRACTING), PROC_REF(on_tentacle_left))
@@ -228,7 +228,7 @@
if (!tentacle?.owner)
return ..()
leash = user.AddComponent(/datum/component/leash, owner = tentacle.owner, distance = get_dist(user, tentacle.owner), silent = TRUE)
- beam_effect = user.Beam(tentacle.owner, "goliath_tentacle", beam_type = /obj/effect/ebeam/goliath, emissive = FALSE)
+ beam_effect = user.Beam(tentacle.owner, "goliath_tentacle", beam_type = /obj/effect/ebeam/goliath, emissive = NONE)
RegisterSignal(beam_effect.visuals, COMSIG_CLICK, PROC_REF(on_beam_click))
RegisterSignals(user, list(SIGNAL_ADDTRAIT(TRAIT_TENTACLE_IMMUNE), COMSIG_BRIMDUST_EXPLOSION), PROC_REF(release))
RegisterSignals(tentacle.owner, list(COMSIG_QDELETING, COMSIG_MOB_STATCHANGE), PROC_REF(on_tentacle_left))
diff --git a/code/modules/mob/living/basic/lavaland/legion/legion.bt.json b/code/modules/mob/living/basic/lavaland/legion/legion.bt.json
index 451fa812723c..aefcaff19fb4 100644
--- a/code/modules/mob/living/basic/lavaland/legion/legion.bt.json
+++ b/code/modules/mob/living/basic/lavaland/legion/legion.bt.json
@@ -50,7 +50,8 @@
"type": "leaf",
"behavior": "/datum/bt_node/ai_behavior/maintain_distance",
"vars": {
- "target_key": "BB_CURRENT_TARGET"
+ "target_key": "BB_CURRENT_TARGET",
+ "face_target": false
}
},
{
diff --git a/code/modules/mob/living/basic/lavaland/legion/legion.dm b/code/modules/mob/living/basic/lavaland/legion/legion.dm
index b500ea6eaa20..74e38df28a52 100644
--- a/code/modules/mob/living/basic/lavaland/legion/legion.dm
+++ b/code/modules/mob/living/basic/lavaland/legion/legion.dm
@@ -33,6 +33,8 @@
var/mob/living/stored_mob = null
/// Do we have emissives?
var/has_emissive = TRUE
+ /// Used for replacing the word "human" or "monkey" in the description with the name of the species of the stored mob (if any)
+ var/desc_word_to_replace = "human"
/mob/living/basic/mining/legion/Initialize(mapload)
. = ..()
@@ -71,6 +73,22 @@
new corpse_type(loc)
return ..()
+/mob/living/basic/mining/legion/update_name()
+ . = ..()
+ if (stored_mob && (!HAS_TRAIT(stored_mob, TRAIT_LESSER_HUMANOID) || stored_mob == GLOB.the_one_and_only_punpun))
+ name = stored_mob.real_name
+ else
+ name = initial(name)
+
+/mob/living/basic/mining/legion/update_desc()
+ . = ..()
+ desc = initial(desc)
+ if(!stored_mob || !desc_word_to_replace)
+ return
+ var/replacement = LOWER_TEXT(astype(stored_mob, /mob/living/carbon)?.dna?.species?.name) || initial(stored_mob.name)
+ desc = replacetext(desc, desc_word_to_replace, replacement)
+
+
/mob/living/basic/mining/legion/update_overlays()
. = ..()
if (stat != DEAD && has_emissive) // Shouldn't really happen but just in case
@@ -80,8 +98,6 @@
/mob/living/basic/mining/legion/proc/consume(mob/living/carbon/human/consumed)
new /obj/effect/gibspawner/generic(consumed.loc)
gender = consumed.gender
- if (!ismonkey(consumed) || consumed == GLOB.the_one_and_only_punpun)
- name = consumed.real_name
consumed.investigate_log("has been killed by hivelord infestation.", INVESTIGATE_DEATHS)
consumed.death()
consumed.extinguish_mob()
@@ -93,6 +109,7 @@
ai_controller?.set_blackboard_key(BB_LEGION_RECENT_LINES, consumed.copy_recent_speech(line_chance = 80))
stored_mob = consumed
visible_message(span_warning("[src] staggers to [p_their()] feet!"))
+ update_appearance(UPDATE_NAME|UPDATE_DESC)
if (prob(75))
return
// Congratulations you have won a special prize: cancer
@@ -161,6 +178,7 @@
pixel_x = -16
sentience_type = SENTIENCE_BOSS
has_emissive = FALSE
+ desc_word_to_replace = ""
var/spawn_type = /mob/living/basic/mining/legion // APOC EDIT ADD - (Gray masses)
/mob/living/basic/mining/legion/large/Initialize(mapload)
@@ -172,6 +190,7 @@
max_spawned = 3,\
spawn_text = "peels itself off from",\
faction = faction,\
+ spawner_logic = SPAWN_CONTINUOUS_BEHAVIOR,\
) // APOC EDIT CHANGE - (Gray masses)
/// Create what we want to drop on death, in proc form so we can always return a static list
diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm
index 3c3147e57df9..78a0555d957e 100644
--- a/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm
+++ b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm
@@ -90,8 +90,8 @@
/// Returns the kind of legion we make out of the target
/mob/living/basic/mining/legion_brood/proc/get_legion_type(mob/living/carbon/human/target)
- if (ismonkey(target))
- return /mob/living/basic/mining/legion/monkey
+ if (HAS_TRAIT(target, TRAIT_LESSER_HUMANOID))
+ return /mob/living/basic/mining/legion/lesser
if (HAS_TRAIT(target, TRAIT_DWARF))
return /mob/living/basic/mining/legion/dwarf
return /mob/living/basic/mining/legion
@@ -136,6 +136,6 @@
has_emissive = FALSE
/mob/living/basic/mining/legion_brood/snow/get_legion_type(mob/living/target)
- if (ismonkey(target))
- return /mob/living/basic/mining/legion/monkey/snow
+ if (HAS_TRAIT(target, TRAIT_LESSER_HUMANOID))
+ return /mob/living/basic/mining/legion/lesser/snow
return /mob/living/basic/mining/legion/snow
diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_monkey.bt.json b/code/modules/mob/living/basic/lavaland/legion/legion_monkey.bt.json
index 6e8e16f2a27a..20784fea3390 100644
--- a/code/modules/mob/living/basic/lavaland/legion/legion_monkey.bt.json
+++ b/code/modules/mob/living/basic/lavaland/legion/legion_monkey.bt.json
@@ -50,7 +50,8 @@
"type": "leaf",
"behavior": "/datum/bt_node/ai_behavior/maintain_distance",
"vars": {
- "target_key": "BB_CURRENT_TARGET"
+ "target_key": "BB_CURRENT_TARGET",
+ "face_target": false
}
},
{
diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_monkey.dm b/code/modules/mob/living/basic/lavaland/legion/legion_monkey.dm
index 44b5b2009286..75f3871bb006 100644
--- a/code/modules/mob/living/basic/lavaland/legion/legion_monkey.dm
+++ b/code/modules/mob/living/basic/lavaland/legion/legion_monkey.dm
@@ -1,8 +1,8 @@
-/// Weak mob spawned if a legion infests a monkey
-/mob/living/basic/mining/legion/monkey
+/// Weak mob spawned if a legion infests a monkey or any lesser humanoid
+/mob/living/basic/mining/legion/lesser
name = "rabble"
desc = "You can see what was once a monkey under the shifting mass of corruption. It doesn't have enough biomass to reproduce."
- icon_state = "legion_monkey"
+ icon_state = "legion_lesser"
pass_flags = PASSTABLE
speed = 5
maxHealth = 40
@@ -15,33 +15,34 @@
attack_sound = 'sound/items/weapons/bite.ogg'
speak_emote = list("chimpers")
corpse_type = /obj/effect/mob_spawn/corpse/human/monkey
- ai_controller = /datum/ai_controller/basic_controller/legion_monkey
+ ai_controller = /datum/ai_controller/basic_controller/legion_lesser
+ desc_word_to_replace = "monkey"
-/mob/living/basic/mining/legion/monkey/Initialize(mapload)
+/mob/living/basic/mining/legion/lesser/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT)
AddComponent(/datum/component/regenerator, outline_colour = COLOR_SOFT_RED)
-/mob/living/basic/mining/legion/monkey/assign_abilities()
+/mob/living/basic/mining/legion/lesser/assign_abilities()
return
-/mob/living/basic/mining/legion/monkey/get_loot_list()
+/mob/living/basic/mining/legion/lesser/get_loot_list()
return
/// Icebox variant
-/mob/living/basic/mining/legion/monkey/snow
+/mob/living/basic/mining/legion/lesser/snow
name = "snow rabble"
desc = "You can see what was once a monkey under the densely packed snow. It doesn't look friendly."
icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi'
- icon_state = "snow_monkey"
+ icon_state = "snow_lesser"
has_emissive = FALSE
-/mob/living/basic/mining/legion/monkey/snow/Initialize(mapload)
+/mob/living/basic/mining/legion/lesser/snow/Initialize(mapload)
. = ..()
- AddComponent(/datum/component/appearance_on_aggro, aggro_state = "snow_monkey_alive") // Surprise! I was real!
+ AddComponent(/datum/component/appearance_on_aggro, aggro_state = "snow_lesser_alive") // Surprise! I was real!
/// Opportunistically hops in and out of vents, if it can find one and is not biting someone.
-/datum/ai_controller/basic_controller/legion_monkey
+/datum/ai_controller/basic_controller/legion_lesser
behavior_tree_json = "code/modules/mob/living/basic/lavaland/legion/legion_monkey.bt.json"
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
diff --git a/code/modules/mob/living/basic/lavaland/node_drone/node_drone.bt.json b/code/modules/mob/living/basic/lavaland/node_drone/node_drone.bt.json
index 935c577753eb..1333687ca2c8 100644
--- a/code/modules/mob/living/basic/lavaland/node_drone/node_drone.bt.json
+++ b/code/modules/mob/living/basic/lavaland/node_drone/node_drone.bt.json
@@ -58,13 +58,21 @@
]
},
{
- "type": "leaf",
- "behavior": "/datum/bt_node/ai_behavior/acquire_target/update_interaction_target",
+ "type": "decorator",
+ "decorator": "/datum/bt_node/decorator/bb_key_set",
"vars": {
- "target_key": "BB_CURRENT_HUNTING_TARGET",
- "target_source": "/datum/target_source/oview_single_type/ore_vent",
- "targeting_strategy": "/datum/targeting_strategy/ore_vent_unclaimed",
- "vision_range": 7
+ "observer_abort": "BT_ABORT_SELF",
+ "key": "BB_CURRENT_HUNTING_TARGET"
+ },
+ "child": {
+ "type": "leaf",
+ "behavior": "/datum/bt_node/ai_behavior/acquire_target/update_interaction_target",
+ "vars": {
+ "target_key": "BB_CURRENT_HUNTING_TARGET",
+ "target_source": "/datum/target_source/oview_single_type/ore_vent",
+ "targeting_strategy": "/datum/targeting_strategy/ore_vent_unclaimed",
+ "vision_range": 7
+ }
}
}
]
diff --git a/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm b/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm
index ad2f7b5ea752..f30e4358f17e 100644
--- a/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm
+++ b/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm
@@ -58,8 +58,9 @@
explosion(origin = src, light_impact_range = 1, smoke = 1)
/mob/living/basic/node_drone/Destroy()
- attached_vent?.node = null //clean our reference to the vent both ways.
- attached_vent = null
+ if(attached_vent)
+ attached_vent.node = null
+ attached_vent = null
return ..()
/mob/living/basic/node_drone/examine(mob/user)
@@ -78,30 +79,6 @@
if(flying_state == FLY_IN_STATE || flying_state == FLY_OUT_STATE)
icon_state = "mining_node_flying"
-/mob/living/basic/node_drone/update_overlays()
- . = ..()
- if(attached_vent)
- var/time_remaining = COOLDOWN_TIMELEFT(attached_vent, wave_cooldown)
- var/wave_timers
- switch(attached_vent?.boulder_size)
- if(BOULDER_SIZE_SMALL)
- wave_timers = WAVE_DURATION_SMALL
- if(BOULDER_SIZE_MEDIUM)
- wave_timers = WAVE_DURATION_MEDIUM
- if(BOULDER_SIZE_LARGE)
- wave_timers = WAVE_DURATION_LARGE
- var/remaining_fraction = (time_remaining / wave_timers)
- if(remaining_fraction <= 0.3)
- . += "node_progress_4"
- return
- if(remaining_fraction <= 0.55)
- . += "node_progress_3"
- return
- if(remaining_fraction <= 0.80)
- . += "node_progress_2"
- return
- . += "node_progress_1"
- return
/mob/living/basic/node_drone/proc/arrive(obj/structure/ore_vent/parent_vent)
attached_vent = parent_vent
diff --git a/code/modules/mob/living/basic/lavaland/tendril/tendril_actions.dm b/code/modules/mob/living/basic/lavaland/tendril/tendril_actions.dm
index 1750372e250a..cf40739d3240 100644
--- a/code/modules/mob/living/basic/lavaland/tendril/tendril_actions.dm
+++ b/code/modules/mob/living/basic/lavaland/tendril/tendril_actions.dm
@@ -83,7 +83,7 @@
. = ..()
if (!firer)
return
- tentacle_beam = Beam(firer, "goliath_tentacle", beam_type = (reel_in ? /obj/effect/ebeam/reacting : /obj/effect/ebeam), emissive = FALSE)
+ tentacle_beam = Beam(firer, "goliath_tentacle", beam_type = (reel_in ? /obj/effect/ebeam/reacting : /obj/effect/ebeam), emissive = NONE)
if (reel_in)
RegisterSignal(tentacle_beam, COMSIG_BEAM_ENTERED, PROC_REF(on_beam_entered))
@@ -100,7 +100,7 @@
holder.transform = transform
holder.pixel_x = (firer_turf.x - our_turf.x) * ICON_SIZE_X + pixel_x
holder.pixel_y = (firer_turf.y - our_turf.y) * ICON_SIZE_Y + pixel_y
- holder.Beam(firer, "goliath_tentacle", emissive = FALSE)
+ holder.Beam(firer, "goliath_tentacle", emissive = NONE)
var/anim_time = sqrt((holder.pixel_x / ICON_SIZE_X) ** 2 + (holder.pixel_y / ICON_SIZE_Y) ** 2) / (speed * SSprojectiles.wait * retract_speed)
animate(holder, pixel_x = 0, pixel_y = 0, time = anim_time)
QDEL_IN_CLIENT_TIME(holder, anim_time)
diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher.bt.json b/code/modules/mob/living/basic/lavaland/watcher/watcher.bt.json
index b408d011c4db..80c11305b3d1 100644
--- a/code/modules/mob/living/basic/lavaland/watcher/watcher.bt.json
+++ b/code/modules/mob/living/basic/lavaland/watcher/watcher.bt.json
@@ -78,7 +78,8 @@
"type": "leaf",
"behavior": "/datum/bt_node/ai_behavior/maintain_distance",
"vars": {
- "target_key": "BB_CURRENT_TARGET"
+ "target_key": "BB_CURRENT_TARGET",
+ "face_target": false
}
},
{
diff --git a/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm b/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm
index 1707d51ae185..f9df184f7c5e 100644
--- a/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm
+++ b/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm
@@ -56,7 +56,7 @@
/mob/living/basic/headslug/proc/check_and_implant(mob/living/basic/attacker, atom/target)
SIGNAL_HANDLER
- if (egg_lain || !iscarbon(target) || ismonkey(target))
+ if (egg_lain || !iscarbon(target) || HAS_TRAIT(target, TRAIT_LESSER_HUMANOID))
return
var/mob/living/carbon/victim = target
diff --git a/code/modules/mob/living/basic/space_fauna/morph.dm b/code/modules/mob/living/basic/space_fauna/morph.dm
index c0e92d20bbe3..ba539574b2bf 100644
--- a/code/modules/mob/living/basic/space_fauna/morph.dm
+++ b/code/modules/mob/living/basic/space_fauna/morph.dm
@@ -77,14 +77,14 @@
return ..()
//we hide medical hud while in regular state or an item
- set_hud_image_state(HEALTH_HUD, null)
+ set_hud_image_state(HEALTH_HUD, hud_state = null)
/mob/living/basic/morph/med_hud_set_status()
if(isliving(form_typepath))
return ..()
//we hide medical hud while in regular state or an item
- set_hud_image_state(STATUS_HUD, null)
+ set_hud_image_state(STATUS_HUD, hud_state = null)
/mob/living/basic/morph/death(gibbed)
if(HAS_TRAIT(src, TRAIT_DISGUISED))
diff --git a/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm b/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm
index 6f41f5c490e7..395861908406 100644
--- a/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm
+++ b/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm
@@ -20,6 +20,31 @@
return ..()
return ..(get_turf(revenant), 2)
+/datum/action/mirror_talk
+ name = "Mirror Talk"
+ desc = "Communicate with the living world through your prison."
+ background_icon_state = "bg_revenant"
+ overlay_icon_state = "bg_revenant_border"
+ button_icon = 'icons/mob/actions/actions_revenant.dmi'
+ button_icon_state = "mirror_talk"
+
+/datum/action/mirror_talk/IsAvailable(feedback = FALSE)
+ return ..() && istype(owner.loc, /obj/structure/mirror)
+
+
+/datum/action/mirror_talk/Trigger(mob/clicker, trigger_flags)
+ if(!..())
+ return FALSE
+ var/obj/structure/mirror/mirror = astype(clicker.loc)
+ if(!mirror)
+ return FALSE
+ var/message = tgui_input_text(clicker, "What do you wish to say?", "Mirror Talk", max_length = MAX_MESSAGE_LEN)
+ if(!message || QDELETED(src) || QDELETED(clicker) || !IsAvailable())
+ return FALSE
+ clicker.log_message("\"[message]\"", LOG_SAY)
+ mirror.say(message, spans = list(SPAN_REVENWARNING), sanitize = FALSE)
+ return TRUE
+
/datum/action/cooldown/spell/aoe/revenant
background_icon_state = "bg_revenant"
overlay_icon_state = "bg_revenant_border"
diff --git a/code/modules/mob/living/basic/space_fauna/revenant/revenant_harvest.dm b/code/modules/mob/living/basic/space_fauna/revenant/revenant_harvest.dm
index 91476554e4fc..4b3fd9e20752 100644
--- a/code/modules/mob/living/basic/space_fauna/revenant/revenant_harvest.dm
+++ b/code/modules/mob/living/basic/space_fauna/revenant/revenant_harvest.dm
@@ -58,11 +58,11 @@
to_chat(src, span_revennotice("[target_Their] soul burns with intelligence."))
essence_drained += rand(20, 30)
- if(target.stat != DEAD && !HAS_TRAIT(target, TRAIT_WEAK_SOUL))
+ if(target.stat != DEAD && !HAS_TRAIT(target, TRAIT_LESSER_HUMANOID))
to_chat(src, span_revennotice("[target_Their] soul blazes with life!"))
essence_drained += rand(40, 50)
- if(!target_has_client && HAS_TRAIT(target, TRAIT_WEAK_SOUL))
+ if(!target_has_client && HAS_TRAIT(target, TRAIT_LESSER_HUMANOID))
to_chat(src, span_revennotice("[target_Their] soul is weak and underdeveloped. They won't be worth very much."))
essence_drained = 5
@@ -123,7 +123,7 @@
change_essence_amount(essence_drained, FALSE, target)
- if(essence_drained <= 90 && target.stat != DEAD && !HAS_TRAIT(target, TRAIT_WEAK_SOUL))
+ if(essence_drained <= 90 && target.stat != DEAD && !HAS_TRAIT(target, TRAIT_LESSER_HUMANOID))
max_essence += 5
to_chat(src, span_revenboldnotice("The absorption of [target]'s living soul has increased your maximum essence level. Your new maximum essence is [max_essence]."))
diff --git a/code/modules/mob/living/basic/space_fauna/revenant/revenant_items.dm b/code/modules/mob/living/basic/space_fauna/revenant/revenant_items.dm
index b9007a7f7225..b02a4705f87a 100644
--- a/code/modules/mob/living/basic/space_fauna/revenant/revenant_items.dm
+++ b/code/modules/mob/living/basic/space_fauna/revenant/revenant_items.dm
@@ -18,13 +18,6 @@
/obj/item/ectoplasm/revenant/Destroy()
return ..()
-/obj/item/ectoplasm/revenant/proc/check_for_mirrors(turf/location, radius)
- PRIVATE_PROC(TRUE)
- for(var/obj/structure/mirror/mirror in view(radius, location))
- if(mirror.cursable && !mirror.GetComponent(/datum/component/revenant_prison))
- return mirror
- return null
-
/obj/item/ectoplasm/revenant/attack_self(mob/user)
if(inert)
return ..()
@@ -32,30 +25,18 @@
span_notice("[user] scatters [src] in all directions."),
span_notice("You scatter [src] across the area."),
)
- var/obj/structure/mirror/nearby_mirror = check_for_mirrors(drop_location(), 5)
- if(nearby_mirror)
- transfer_to_mirror(nearby_mirror)
user.dropItemToGround(src)
+ SEND_SIGNAL(src, COMSIG_RESIDUE_DISPERSE)
qdel(src)
/obj/item/ectoplasm/revenant/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
if(inert)
return
- var/obj/structure/mirror/nearby_mirror = check_for_mirrors(get_turf(hit_atom), 3)
- if(!nearby_mirror)
- visible_message(span_notice("[src] breaks into particles upon impact, which fade away to nothingness."))
- else
- transfer_to_mirror(nearby_mirror)
+ visible_message(span_notice("[src] breaks into particles upon impact, which fade away to nothingness."))
+ SEND_SIGNAL(src, COMSIG_RESIDUE_DISPERSE)
qdel(src)
-/obj/item/ectoplasm/revenant/proc/transfer_to_mirror(obj/structure/mirror/nearby_mirror)
- PRIVATE_PROC(TRUE)
- nearby_mirror.TakeComponent(GetComponent(/datum/component/revenant_prison))
- nearby_mirror.visible_message(span_revenwarning("A dismal moan echoes as particles of [src] fall onto [nearby_mirror]!"))
- log_game("A revenant was trapped inside [nearby_mirror]")
- message_admins("A revenant was trapped inside [nearby_mirror] [ADMIN_JMP(nearby_mirror)]")
-
/obj/item/ectoplasm/revenant/examine(mob/user)
. = ..()
if(inert)
@@ -72,9 +53,9 @@
/obj/item/ectoplasm/revenant/proc/reform()
if(QDELETED(src) || inert)
return
- if(!GetComponent(/datum/component/revenant_prison))
+ if(!(SEND_SIGNAL(src, COMSIG_RESIDUE_REFORM) & COMPONENT_RESIDUE_REFORM_SUCCESS))
+ inert = TRUE
return
message_admins("Revenant ectoplasm was left undestroyed for 1 minute and is reforming into a new revenant.")
- SEND_SIGNAL(src, COMSIG_REVENANT_RELEASE, cause = "ectoplasm reforming")
visible_message(span_revenboldnotice("[src] suddenly rises into the air before fading away."))
qdel(src)
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index 528e0419fffa..23310e7948ab 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -153,7 +153,7 @@
// Takes care blood loss and regeneration
/mob/living/carbon/human/handle_blood(seconds_per_tick)
// Under these circumstances blood handling is not necessary
- if(bodytemperature < BLOOD_STOP_TEMP || HAS_TRAIT(src, TRAIT_FAKEDEATH))
+ if(bodytemperature < BLOOD_STOP_TEMP || HAS_TRAIT_NOT_FROM(src, TRAIT_FAKEDEATH, QUIRK_TRAIT))
return
// Run the signal, still allowing mobs with noblood to "handle blood" in their own way
@@ -478,7 +478,7 @@
blood_data["donor"] = WEAKREF(src) // DARKPACK EDIT ADD - VITAE
// DARKPACK EDIT ADD START
blood_data["generation"] = get_generation()
- blood_data["clan"] = get_clan()?.name
+ blood_data["clan"] = get_clan()?.id
blood_data["real_name"] = real_name
// DARKPACK EDIT ADD END
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index a1458c8ab371..dbda0a81dc35 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -198,7 +198,6 @@
last_special = world.time + CLICK_CD_RANGE
cuff_resist(I)
-
/**
* Helper to break the cuffs from hands
* @param {obj/item} cuffs - The cuffs to break
@@ -208,16 +207,16 @@
/mob/living/carbon/proc/cuff_resist(obj/item/cuffs, breakouttime = null, cuff_break = 0)
if((cuff_break != INSTANT_CUFFBREAK) && (SEND_SIGNAL(src, COMSIG_MOB_REMOVING_CUFFS, cuffs) & COMSIG_MOB_BLOCK_CUFF_REMOVAL))
return //The blocking object should sent a fluff-appropriate to_chat about cuff removal being blocked
- if(cuffs.item_flags & BEING_REMOVED)
+ if(DOING_INTERACTION(src, REF(cuffs) ))
to_chat(src, span_warning("You're already attempting to remove [cuffs]!"))
return
- cuffs.item_flags |= BEING_REMOVED
+
if (isnull(breakouttime))
breakouttime = cuffs.breakouttime
if(!cuff_break)
visible_message(span_warning("[src] attempts to remove [cuffs]!"))
to_chat(src, span_notice("You attempt to remove [cuffs]... (This will take around [DisplayTimeText(breakouttime)] and you need to stand still.)"))
- if(do_after(src, breakouttime, target = src, timed_action_flags = IGNORE_HELD_ITEM, cog_icon = null))
+ if(do_after(src, breakouttime, target = src, timed_action_flags = IGNORE_HELD_ITEM, cog_icon = null, interaction_key = REF(cuffs) ))
. = clear_cuffs(cuffs, cuff_break)
else
to_chat(src, span_warning("You fail to remove [cuffs]!"))
@@ -233,7 +232,6 @@
else if(cuff_break == INSTANT_CUFFBREAK)
. = clear_cuffs(cuffs, cuff_break)
- cuffs.item_flags &= ~BEING_REMOVED
/mob/living/carbon/proc/uncuff()
if (handcuffed)
diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm
index d0d5015272b4..13e43e75ffaf 100644
--- a/code/modules/mob/living/carbon/human/_species.dm
+++ b/code/modules/mob/living/carbon/human/_species.dm
@@ -996,6 +996,18 @@ GLOBAL_LIST_EMPTY(features_by_species)
return FALSE
if(user.loc == target.loc)
return FALSE
+
+ // DARKPACK EDIT ADD START - POTENCE
+ if(user.st_get_stat(STAT_STRENGTH) >= 6) //We check if potence is active, then base off strength
+ var/shove_strength = user.st_get_stat(STAT_STRENGTH)
+ var/shove_distance = round(shove_strength / 2)
+ var/atom/throw_target = get_edge_target_turf(target, user.dir)
+ if(shove_strength >= 9) //If you have 9 or more strength, you knock your target back spinning. Distance based on strength, on hitting something they take damage.
+ target.throw_at(throw_target, shove_distance, 6, user, spin = TRUE)
+ else //If you have 6 or more strength, you'll basically do the same thing, but without the spin and at a lower throwback speed.
+ target.throw_at(throw_target, shove_distance, 4, user)
+ // DAKRPACK EDIT ADD END
+
user.disarm(target)
/datum/species/proc/spec_attack_hand(mob/living/carbon/human/owner, mob/living/carbon/human/target, datum/martial_art/attacker_style, modifiers)
@@ -1367,8 +1379,10 @@ GLOBAL_LIST_EMPTY(features_by_species)
/datum/species/proc/spec_stun(mob/living/carbon/human/H, amount)
if((H.movement_type & FLYING) && !H.buckled)
- var/obj/item/organ/wings/functional/wings = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
- if(wings)
+ var/obj/item/organ/wings/wings = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
+ //Only allow folding wings that are holding us up.
+ //Otherwise, the toggle may get flipped and skip flightworthiness checks :P
+ if(wings && HAS_TRAIT_FROM(H, TRAIT_MOVE_FLOATING, SPECIES_FLIGHT_TRAIT))
wings.toggle_flight(H)
wings.fly_slip(H)
. = min(stunmod * H.physiology.stun_mod * amount, LAZYMIN(H.physiology.max_stun_len, INFINITY))
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index b4c10eb528c8..ecde1c84be62 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -179,7 +179,7 @@
/datum/emote/living/carbon/human/wag
key = "wag"
key_third_person = "wags"
- message = "their tail."
+ message = "wags"
/datum/emote/living/carbon/human/wag/run_emote(mob/user, params, type_override, intentional)
. = ..()
@@ -195,9 +195,8 @@
. = ..()
var/obj/item/organ/tail/oranges_accessory = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
if(oranges_accessory.wag_flags & WAG_WAGGING)
- . = "stops wagging " + message
- else
- . = "wags " + message
+ . = "stops wagging"
+ . += " [user.p_their()] tail."
/datum/emote/living/carbon/human/wag/can_run_emote(mob/user, status_check, intentional, params)
var/obj/item/organ/tail/tail = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
@@ -212,7 +211,7 @@
/datum/emote/living/carbon/human/wing/run_emote(mob/user, params, type_override, intentional)
. = ..()
- var/obj/item/organ/wings/functional/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
+ var/obj/item/organ/wings/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
if(isnull(wings))
CRASH("[type] ran on a mob that has no wings!")
if(wings.wings_open)
@@ -221,12 +220,13 @@
wings.open_wings()
/datum/emote/living/carbon/human/wing/select_message_type(mob/user, intentional)
- var/obj/item/organ/wings/functional/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
+ var/obj/item/organ/wings/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
var/emote_verb = wings.wings_open ? "closes" : "opens"
return "[emote_verb] [message]"
/datum/emote/living/carbon/human/wing/can_run_emote(mob/user, status_check = TRUE, intentional, params)
- if(!istype(user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS), /obj/item/organ/wings/functional))
+ var/obj/item/organ/wings/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
+ if(!istype(wings) || !wings.has_open_sprite)
return FALSE
return ..()
@@ -273,49 +273,13 @@
addtimer(CALLBACK(eyes, TYPE_PROC_REF(/obj/item/organ/eyes, blink), 0.1 SECONDS, FALSE), i * 0.2 SECONDS)
eyes.animate_eyelids(user)
-///Snowflake emotes only for le epic chimp
-/datum/emote/living/carbon/human/monkey
-
-/datum/emote/living/carbon/human/monkey/can_run_emote(mob/user, status_check = TRUE, intentional, params)
- if(ismonkey(user))
- return ..()
- return FALSE
-
-/datum/emote/living/carbon/human/monkey/gnarl
- key = "gnarl"
- key_third_person = "gnarls"
- message = "gnarls and shows its teeth..."
- message_mime = "gnarls silently, baring its teeth..."
-
-/datum/emote/living/carbon/human/monkey/roll
- key = "roll"
- key_third_person = "rolls"
- message = "rolls."
- can_use_flags = EMOTE_CANUSE_REQUIRE_HANDS
-
-/datum/emote/living/carbon/human/monkey/scratch
- key = "scratch"
- key_third_person = "scratches"
- message = "scratches."
- can_use_flags = EMOTE_CANUSE_REQUIRE_HANDS
-
-/datum/emote/living/carbon/human/monkey/screech/roar
+/datum/emote/living/carbon/human/screech/roar
key = "roar"
key_third_person = "roars"
message = "roars!"
message_mime = "acts out a roar."
emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE
-/datum/emote/living/carbon/human/monkey/tail
- key = "tail"
- message = "waves their tail."
-
-/datum/emote/living/carbon/human/monkey/sign
- key = "sign"
- key_third_person = "signs"
- message_param = "signs the number %t."
- can_use_flags = EMOTE_CANUSE_REQUIRE_HANDS
-
/// emotes for glowy goobers
/datum/emote/living/carbon/human/glow
key = "glow"
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 25581a7dad8c..851b9f0f3f46 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -152,6 +152,19 @@
return to_add
+/datum/species/jelly/create_pref_unique_perks()
+ var/list/to_add = list()
+
+ to_add += list(list(
+ SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK,
+ SPECIES_PERK_ICON = FA_ICON_PERSON_RUNNING,
+ SPECIES_PERK_NAME = "Jelly Body",
+ SPECIES_PERK_DESC = "[plural_form] have bodies of malleable Jelly. \
+ You can squeeze through small cracks like grilles, provided you're not wearing clothes.",
+ ))
+
+ return to_add
+
/datum/action/innate/regenerate_limbs
name = "Regenerate Limbs"
check_flags = AB_CHECK_CONSCIOUS
diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm
index bd178237d769..b76f3f800c7e 100644
--- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm
+++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm
@@ -15,6 +15,8 @@
TRAIT_NO_BLOOD_OVERLAY,
TRAIT_NO_DNA_COPY,
TRAIT_NO_UNDERWEAR,
+ TRAIT_LESSER_HUMANOID,
+ TRAIT_SIMIAN,
)
no_equip_flags = ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_SUITSTORE
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN | SLIME_EXTRACT
@@ -111,7 +113,7 @@
/obj/item/organ/brain/primate //Ook Ook
name = "Primate Brain"
desc = "This wad of meat is small, but has enlarged occipital lobes for spotting bananas."
- organ_traits = list(TRAIT_CAN_STRIP, TRAIT_PRIMITIVE, TRAIT_GUN_NATURAL, TRAIT_WEAK_SOUL) // No literacy or advanced tool usage.
+ organ_traits = list(TRAIT_CAN_STRIP, TRAIT_PRIMITIVE, TRAIT_GUN_NATURAL) // No literacy or advanced tool usage.
actions_types = list(/datum/action/item_action/organ_action/toggle_trip)
/// Will this monkey stumble if they are crossed by a simple mob or a carbon in combat mode? Toggable by monkeys with clients, and is messed automatically set to true by monkey AI.
var/tripping = TRUE
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index a40de0b4df63..23a45a49d776 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -120,6 +120,12 @@
var/custom_message = user.death_message
if(custom_message)
message_animal_or_basic = custom_message
+
+ if(user.has_quirk(/datum/quirk/death_mimicry))
+ user.Unconscious(30 SECONDS, ignore_canstun=TRUE)
+ ADD_TRAIT(user, TRAIT_FAKEDEATH, QUIRK_TRAIT)
+ addtimer(TRAIT_CALLBACK_REMOVE(user, TRAIT_FAKEDEATH, QUIRK_TRAIT), 30 SECONDS)
+
. = ..()
message_animal_or_basic = initial(message_animal_or_basic)
@@ -173,17 +179,14 @@
return
wings.make_flap_sound(human_user)
- // open/close functional wings
- var/obj/item/organ/wings/functional/wings_functional = wings
- if(!istype(wings_functional))
+ if(!wings.has_open_sprite)
return
- var/open = FALSE
- if(wings_functional.wings_open)
- open = TRUE
- wings_functional.close_wings()
+ var/open = wings.wings_open
+ if(open)
+ wings.close_wings()
else
- wings_functional.open_wings()
- addtimer(CALLBACK(wings_functional, open ? TYPE_PROC_REF(/obj/item/organ/wings/functional, open_wings) : TYPE_PROC_REF(/obj/item/organ/wings/functional, close_wings)), wing_time)
+ wings.open_wings()
+ addtimer(CALLBACK(wings, open ? TYPE_PROC_REF(/obj/item/organ/wings, open_wings) : TYPE_PROC_REF(/obj/item/organ/wings, close_wings)), wing_time)
/datum/emote/living/flap/aflap
key = "aflap"
@@ -697,6 +700,7 @@
message_AI = "symphathetically yawns."
emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE
cooldown = 5 SECONDS
+ var/mouth_covered = FALSE // DARKPACK EDIT ADD
/datum/emote/living/yawn/run_emote(mob/user, params, type_override, intentional)
. = ..()
@@ -706,7 +710,7 @@
if(TIMER_COOLDOWN_FINISHED(user, COOLDOWN_YAWN_PROPAGATION))
TIMER_COOLDOWN_START(user, COOLDOWN_YAWN_PROPAGATION, cooldown * 3)
- if(astype(user, /mob/living/carbon)?.obscured_slots & HIDEFACE)
+ if(mouth_covered || astype(user, /mob/living/carbon)?.obscured_slots & HIDEFACE) // DARKPACK EDIT CHANGE
return // if your face is obscured, skip propagation
var/propagation_distance = user.client ? 5 : 2 // mindless mobs are less able to spread yawns
@@ -715,6 +719,15 @@
if(iter_living.incapacitated || TIMER_COOLDOWN_RUNNING(iter_living, COOLDOWN_YAWN_PROPAGATION))
continue
+ // DARKPACK EDIT ADD START
+ if(prob(50)) // Propagation is a not a guaranteed one. Keeps it fun when it happens.
+ continue
+ if(TIMER_COOLDOWN_RUNNING(iter_living, COOLDOWN_YAWN_WITNESSED))
+ continue
+
+ TIMER_COOLDOWN_START(iter_living, COOLDOWN_YAWN_WITNESSED, cooldown) // Prevents yawns from scaling extremely hard against large crowds
+ // DARKPACK EDIT ADD END
+
var/dist_between = get_dist(user, iter_living)
var/recently_examined = FALSE // if you yawn just after someone looks at you, it forces them to yawn as well. Tradecraft!
@@ -723,8 +736,19 @@
if(examine_time && (world.time - examine_time < YAWN_PROPAGATION_EXAMINE_WINDOW))
recently_examined = TRUE
- if(!recently_examined && !prob(YAWN_PROPAGATE_CHANCE_BASE - (YAWN_PROPAGATE_CHANCE_DECAY * dist_between)))
+ // DARKPACK EDIT CHANGE START
+ var/yawn_chance = YAWN_PROPAGATE_CHANCE_BASE
+ var/willpower_stat = astype(iter_living, /mob/living)?.st_get_stat(STAT_PERMANENT_WILLPOWER)
+ if(!isnull(willpower_stat))
+ if(willpower_stat <= 1)
+ yawn_chance = 75
+ else
+ yawn_chance = (10 - willpower_stat) * 2.5
+ yawn_chance = clamp(yawn_chance, 5, 50)
+
+ if(!recently_examined && !prob(yawn_chance - (YAWN_PROPAGATE_CHANCE_DECAY * dist_between)))
continue
+ // DARKPACK EDIT CHANGE END
var/yawn_delay = rand(0.2 SECONDS, 0.7 SECONDS) * dist_between
addtimer(CALLBACK(src, PROC_REF(propagate_yawn), iter_living), yawn_delay)
@@ -735,6 +759,15 @@
return
user.emote("yawn")
+// DARKPACK EDIT ADD START
+/datum/emote/living/yawn/covered
+ key = "yawncovered"
+ key_third_person = "yawncovered"
+ name = "yawn (Cover mouth)"
+ message = "covers their mouth before yawning."
+ mouth_covered = TRUE
+// DARKPACK EDIT ADD END
+
#undef YAWN_PROPAGATE_CHANCE_BASE
#undef YAWN_PROPAGATE_CHANCE_DECAY
@@ -846,6 +879,35 @@
/datum/emote/living/custom/replace_pronoun(mob/user, message)
return message
+///Emotes only for le epic chimps
+/datum/emote/living/monkey
+ abstract_type = /datum/emote/living/monkey
+ trait_required = TRAIT_SIMIAN
+
+/datum/emote/living/monkey/gnarl
+ key = "gnarl"
+ key_third_person = "gnarls"
+ message = "gnarls and shows its teeth..."
+ message_mime = "gnarls silently, baring its teeth..."
+
+/datum/emote/living/monkey/roll
+ key = "roll"
+ key_third_person = "rolls"
+ message = "rolls."
+ can_use_flags = EMOTE_CANUSE_REQUIRE_HANDS
+
+/datum/emote/living/monkey/scratch
+ key = "scratch"
+ key_third_person = "scratches"
+ message = "scratches."
+ can_use_flags = EMOTE_CANUSE_REQUIRE_HANDS
+
+/datum/emote/living/monkey/sign
+ key = "sign"
+ key_third_person = "signs"
+ message_param = "signs the number %t."
+ can_use_flags = EMOTE_CANUSE_REQUIRE_HANDS
+
/datum/emote/living/inhale
key = "inhale"
key_third_person = "inhales"
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 849be0838ffb..bc3c6988bad9 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1676,8 +1676,8 @@ GAME_VERB_PROC(/mob/living, mob_sleep, "Sleep", null)
/mob/living/basic/mining/mook/worker,
/mob/living/basic/mining/mook/worker/bard,
/mob/living/basic/mining/mook/worker/tribal_chief,
- /mob/living/basic/mining/legion/monkey,
- /mob/living/basic/mining/legion/monkey/snow,
+ /mob/living/basic/mining/legion/lesser,
+ /mob/living/basic/mining/legion/lesser/snow,
/mob/living/basic/mining/lobstrosity,
/mob/living/basic/mining/lobstrosity/lava,
/mob/living/basic/mining/ice_demon,
@@ -2186,6 +2186,7 @@ GLOBAL_LIST_EMPTY(fire_appearances)
VV_DROPDOWN_OPTION(VV_HK_GIVE_DELUSION_HALLUCINATION, "Give Delusion Hallucination")
VV_DROPDOWN_OPTION(VV_HK_GIVE_GUARDIAN_SPIRIT, "Give Guardian Spirit")
VV_DROPDOWN_OPTION(VV_HK_ADMIN_RENAME, "Force Change Name")
+ VV_DROPDOWN_OPTION(VV_HK_NAVIGATE_TO_MARKED_OBJECT, "Navigate To Marked Object")
/mob/living/vv_do_topic(list/href_list)
. = ..()
@@ -2234,6 +2235,18 @@ GLOBAL_LIST_EMPTY(fire_appearances)
))
message_admins("[key_name_admin(usr)] has forcibly changed the real name of [key_name(src)] from '[old_name]' to '[real_name]'[(replace_preferences ? " and their preferences" : "")]")
+ if(href_list[VV_HK_NAVIGATE_TO_MARKED_OBJECT])
+ if(!check_rights(R_ADMIN))
+ return
+
+ if(!usr.client.holder.marked_datum)
+ to_chat(usr, span_warning("You don't have any object marked."))
+ else if(!isatom(usr.client.holder.marked_datum))
+ to_chat(usr, span_warning("The object you have marked cannot be used as a target. Target must be an atom."))
+ else
+ create_navigation_line(usr.client.holder.marked_datum)
+
+
/mob/living/proc/move_to_error_room()
var/obj/effect/landmark/error/error_landmark = locate(/obj/effect/landmark/error) in GLOB.landmarks_list
if(error_landmark)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 86be920413be..0f57ec1ad825 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -848,6 +848,19 @@
//Take their lunch money
var/target_held_item = target.get_active_held_item()
var/append_message = weapon ? " with [weapon]" : ""
+
+ // DARKPACK EDIT ADD START - DISARM ROLLING
+ if(target_held_item)
+ var/disarm_difficulty = target.st_get_stat(STAT_STRENGTH)
+ var/disarm_roll = SSroll.storyteller_roll_datum(src, target, /datum/storyteller_roll/damage/attacker_disarm)
+ if(disarm_roll >= disarm_difficulty)
+ target.dropItemToGround(target_held_item)
+ append_message = "causing [target.p_them()] to drop [target_held_item]"
+ target.visible_message(span_danger("[target.name] drops \the [target_held_item]!"),
+ span_warning("You have the \the [target_held_item] yanked from your hand!"), null, COMBAT_MESSAGE_RANGE)
+
+ // DARKPACK EDIT ADD END
+
// If it's in our typecache, they're staggered and it exists, disarm. If they're knocked down, disarm too.
if(target_held_item && target.get_timed_status_effect_duration(/datum/status_effect/staggered) && is_type_in_typecache(target_held_item, GLOB.shove_disarming_types) || target_held_item && target.body_position == LYING_DOWN)
target.dropItemToGround(target_held_item)
diff --git a/code/modules/mob/living/navigation.dm b/code/modules/mob/living/navigation.dm
index 6e4111e6c2cd..d9134b1677b9 100644
--- a/code/modules/mob/living/navigation.dm
+++ b/code/modules/mob/living/navigation.dm
@@ -50,10 +50,13 @@ GAME_VERB_HIDDEN(/mob/living, navigate, "Navigate")
var/platform_code = tgui_input_list(src, "Select a location", "Navigate", sort_list(destination_list))
var/atom/navigate_target = destination_list[platform_code]
+ create_navigation_line(navigate_target)
+/mob/living/proc/create_navigation_line(atom/navigate_target)
if(isnull(navigate_target) || incapacitated)
return
+ cut_navigation()
var/finding_zchange = FALSE
COOLDOWN_START(src, navigate_cooldown, 15 SECONDS)
@@ -127,6 +130,9 @@ GAME_VERB_HIDDEN(/mob/living, navigate, "Navigate")
/mob/living/proc/cut_navigation()
SIGNAL_HANDLER
+ if(!length(client.navigation_images))
+ return
+
for(var/image/navigation_path in client.navigation_images)
client.images -= navigation_path
client.navigation_images.Cut()
diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm
index 1ad380a61d99..bcfc04b83939 100644
--- a/code/modules/mob/living/ventcrawling.dm
+++ b/code/modules/mob/living/ventcrawling.dm
@@ -7,13 +7,12 @@
to_chat(src, span_notice("You can ventcrawl! Use alt+click on vents to quickly travel about the station."))
/mob/living/carbon/human/notify_ventcrawler_on_login()
- if(!ismonkey(src))
+ if(!HAS_TRAIT(src, TRAIT_LESSER_HUMANOID))
return ..()
if(!istype(head, /obj/item/clothing/head/helmet/monkey_sentience)) //don't notify them about ventcrawling if they're wearing the sentience helmet, because they can't ventcrawl with it on, and if they take it off they'll no longer be in control of the mob.
return ..()
-
/// Checks if the mob is able to enter the vent, and provides feedback if they are unable to.
/mob/living/proc/can_enter_vent(obj/machinery/atmospherics/components/ventcrawl_target, provide_feedback = TRUE)
// Being able to always ventcrawl trumps being only able to ventcrawl when wearing nothing
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index ec702de5c5c1..9a1065a2f829 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -191,7 +191,7 @@
hud_list[hud] = list()
else
- var/image/I = image('icons/mob/huds/hud.dmi', src, "")
+ var/image/I = image(DEFAULT_HUDS_DMI, src, "")
I.appearance_flags = RESET_COLOR|PIXEL_SCALE|KEEP_APART
hud_list[hud] = I
set_hud_image_active(hud, update_huds = FALSE) //by default everything is active. but dont add it to huds to keep control.
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index f4f2edab0793..8ce70cd9522d 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -116,6 +116,7 @@ GAME_VERB_HIDDEN(/client, drop_item, "drop item")
//Sometimes you want to look like you're moving with a delay you don't actually have yet
visual_delay = 0
var/old_dir = mob.dir
+ var/old_loc = mob.loc
. = ..()
@@ -137,7 +138,7 @@ GAME_VERB_HIDDEN(/client, drop_item, "drop item")
// At this point we've moved the client's attached mob. This is one of the only ways to guess that a move was done
// as a result of player input and not because they were pulled or any other magic.
- SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOVED, direct, old_dir)
+ SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOVED, direct, old_dir, old_loc)
var/atom/movable/P = mob.pulling
if(P && !ismob(P) && P.density)
diff --git a/code/modules/mob/mob_say.dm b/code/modules/mob/mob_say.dm
index 99aba87e1203..ea4e8816ea9f 100644
--- a/code/modules/mob/mob_say.dm
+++ b/code/modules/mob/mob_say.dm
@@ -219,14 +219,14 @@ GAME_VERB(/mob, me_verb, VERB_ME, null)
mods[RADIO_EXTENSION] = GLOB.department_radio_keys[mods[RADIO_KEY]]
chop_to = length(key) + 2
else if(key == "," && !mods[LANGUAGE_EXTENSION])
- for(var/ld in GLOB.all_languages)
- var/datum/language/LD = ld
- if(initial(LD.key) == message[1 + length(message[1])])
+ for(var/datum/language/LD as anything in GLOB.all_languages)
+ var/lang_key = LD::key
+ if(lang_key && (lang_key == message[1 + length(message[1])]))
// No, you cannot speak in xenocommon just because you know the key
if(!can_speak_language(LD))
return message
mods[LANGUAGE_EXTENSION] = LD
- chop_to = length(key) + length(initial(LD.key)) + 1
+ chop_to = length(key) + length(lang_key) + 1
if(!mods[LANGUAGE_EXTENSION])
return message
else
diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm
index 6d8dcd03a7e2..333963119608 100644
--- a/code/modules/mob/mob_transformation_simple.dm
+++ b/code/modules/mob/mob_transformation_simple.dm
@@ -52,7 +52,7 @@
var/mob/living/carbon/new_mob = desired_mob
old_mob.dna.copy_dna(new_mob.dna, NONE)
new_mob.updateappearance(icon_update = TRUE, mutcolor_update = TRUE, mutations_overlay_update = TRUE)
- else if(ishuman(desired_mob) && (!ismonkey(desired_mob)))
+ else if(ishuman(desired_mob) && !HAS_TRAIT(desired_mob, TRAIT_LESSER_HUMANOID))
var/mob/living/carbon/human/new_human = desired_mob
client?.prefs.safe_transfer_prefs_to(new_human)
new_human.dna.update_dna_identity()
diff --git a/code/modules/mob_spawn/corpses/mining_corpses.dm b/code/modules/mob_spawn/corpses/mining_corpses.dm
index 2be66a4e6dfa..e5ba48507ac2 100644
--- a/code/modules/mob_spawn/corpses/mining_corpses.dm
+++ b/code/modules/mob_spawn/corpses/mining_corpses.dm
@@ -202,7 +202,8 @@
))
if(prob(30))
r_pocket = pick_weight(list(
- /obj/item/stack/marker_beacon = 20,
+ /obj/item/stack/candela_beacon = 20,
+ /obj/item/stack/marker_beacon = 15,
/obj/item/stack/spacecash/c1000 = 7,
/obj/item/reagent_containers/hypospray/medipen/survival = 2,
/obj/item/borg/upgrade/modkit/damage = 1,
diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm
index 08d7d76384ed..1cf5b3c31457 100644
--- a/code/modules/mod/mod_clothes.dm
+++ b/code/modules/mod/mod_clothes.dm
@@ -15,6 +15,7 @@
. = ..()
ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT)
AddComponent(/datum/component/hat_stabilizer, loose_hat = TRUE)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_HEAD, /datum/bodypart_texture/mesh/space)
/obj/item/clothing/suit/mod
name = "\improper MOD chestplate"
@@ -38,6 +39,7 @@
/obj/item/clothing/suit/mod/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT)
+ AddElement(/datum/element/equipment_bodypart_texture, BODY_ZONE_CHEST, /datum/bodypart_texture/mesh/space)
/obj/item/clothing/gloves/mod
name = "\improper MOD gauntlets"
diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm
index 8cd53a4b4c4b..f4fe36f03dcb 100644
--- a/code/modules/mod/mod_control.dm
+++ b/code/modules/mod/mod_control.dm
@@ -607,7 +607,7 @@
var/obj/item/mod/module/picked_module = locate(module_reference) in modules
if(!istype(picked_module))
return
- picked_module.on_select()
+ picked_module.on_select(user)
/obj/item/mod/control/shock(mob/living/shocking, chance, shock_source, siemens_coeff)
if(get_charge() < 1)
diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm
index b5df55220d2c..a048abeb7283 100644
--- a/code/modules/mod/mod_core.dm
+++ b/code/modules/mod/mod_core.dm
@@ -662,3 +662,100 @@
/obj/item/mod/core/soul/wizard
flags_1 = parent_type::flags_1 | NO_NEW_GAGS_PREVIEW_1
theme = THEME_WIZARD
+
+/obj/item/mod/core/candela
+ name = "\improper MOD luminetworked core"
+ desc = "A light, low-capacity networked MOD core capable of recharging from the \"Candela\" navigation network, offering a consistent supply of power for forward-operating miners."
+ icon_state = "mod-core-candela"
+ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.05, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.05, /datum/material/bluespace = SHEET_MATERIAL_AMOUNT)
+ /// How much charge we can store.
+ var/max_charge = 3 * STANDARD_CELL_CHARGE
+ /// How much charge we are currently storing.
+ var/charge = 3 * STANDARD_CELL_CHARGE
+ /// Amount of charge recovered per second when linked to a Candela network
+ var/charge_recovery_rate = STANDARD_CELL_CHARGE / 10 // 30 seconds to go from empty to full
+ /// Our network handler
+ var/datum/candela_item_handler/handler = null
+
+/obj/item/mod/core/candela/Initialize(mapload)
+ . = ..()
+ handler = new(src)
+
+/obj/item/mod/core/candela/Destroy()
+ QDEL_NULL(handler)
+ return ..()
+
+/obj/item/mod/core/candela/install(obj/item/mod/control/mod_unit)
+ . = ..()
+ RegisterSignal(mod_unit, COMSIG_MOD_WEARER_SET, PROC_REF(on_mod_wearer_set))
+ RegisterSignal(mod_unit, COMSIG_MOD_WEARER_UNSET, PROC_REF(on_mod_wearer_unset))
+
+/obj/item/mod/core/candela/uninstall()
+ UnregisterSignal(mod, list(COMSIG_MOD_WEARER_SET, COMSIG_MOD_WEARER_UNSET))
+ return ..()
+
+/obj/item/mod/core/candela/process(seconds_per_tick)
+ if (charge >= max_charge)
+ return
+
+ if (!handler.network)
+ handler.locate_closest_network()
+
+ if (handler.network?.powered & CANDELA_NETWORK_POWERED)
+ add_charge(charge_recovery_rate * seconds_per_tick)
+
+/obj/item/mod/core/candela/proc/on_mod_wearer_set(datum/source, mob/living/wearer)
+ SIGNAL_HANDLER
+
+ handler.set_owner(wearer)
+ START_PROCESSING(SSprocessing, src)
+
+/obj/item/mod/core/candela/proc/on_mod_wearer_unset(datum/source)
+ SIGNAL_HANDLER
+
+ handler.set_owner(null)
+ STOP_PROCESSING(SSprocessing, src)
+
+/obj/item/mod/core/candela/charge_source()
+ return src
+
+/obj/item/mod/core/candela/charge_amount()
+ return charge
+
+/obj/item/mod/core/candela/max_charge_amount()
+ return max_charge
+
+/obj/item/mod/core/candela/add_charge(amount)
+ charge = min(max_charge, charge + amount)
+ mod.update_charge_alert()
+ return TRUE
+
+/obj/item/mod/core/candela/subtract_charge(amount)
+ amount = min(amount, charge)
+ charge -= amount
+ mod.update_charge_alert()
+ return amount
+
+/obj/item/mod/core/candela/check_charge(amount)
+ return charge_amount() >= amount
+
+/obj/item/mod/core/candela/get_charge_icon_state()
+ switch(round(charge_amount() / max_charge_amount(), 0.01))
+ if(0.75 to INFINITY)
+ return SPACESUIT_CELL_HIGH
+ if(0.5 to 0.75)
+ return SPACESUIT_CELL_MID
+ if(0.25 to 0.5)
+ return SPACESUIT_CELL_LOW
+ if(0.02 to 0.25)
+ return SPACESUIT_CELL_VERY_LOW
+
+ return SPACESUIT_CELL_EMPTY
+
+/obj/item/mod/core/candela/get_chargebar_color()
+ switch(round(charge_amount() / max_charge_amount(), 0.01))
+ if(-INFINITY to 0.33)
+ return "bad"
+ if(0.33 to INFINITY)
+ return "cyan"
+
diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm
index 60a44065bb0f..5834a67dd237 100644
--- a/code/modules/mod/modules/_module.dm
+++ b/code/modules/mod/modules/_module.dm
@@ -244,7 +244,7 @@
if(!(allow_flags & MODULE_ALLOW_INCAPACITATED) && INCAPACITATED_IGNORING(mod.wearer, INCAPABLE_GRAB))
return FALSE
mod.wearer.face_atom(target)
- if(!used())
+ if(!used() || (SEND_SIGNAL(target, COMSIG_ATOM_MOD_MODULE_USED, src) & COMPONENT_INTERRUPT_MODULE_USE))
return FALSE
return TRUE
diff --git a/code/modules/mod/modules/module_holding.dm b/code/modules/mod/modules/module_holding.dm
index ee03210dfec1..df5e478243ba 100644
--- a/code/modules/mod/modules/module_holding.dm
+++ b/code/modules/mod/modules/module_holding.dm
@@ -59,12 +59,12 @@
storage_type = /datum/storage/bag_of_holding
create_storage(storage_type = /datum/storage/bag_of_holding)
atom_storage.set_locked(STORAGE_FULLY_LOCKED)
- item_flags |= BLUESPACE_INTERFERENCE
+ ADD_TRAIT(src, TRAIT_BLUESPACE_INTERFERENCE, TRAIT_GENERIC)
/obj/item/mod/module/storage/holding/proc/on_core_removed()
QDEL_NULL(atom_storage)
storage_type = null
- item_flags &= ~BLUESPACE_INTERFERENCE
+ REMOVE_TRAIT(src, TRAIT_BLUESPACE_INTERFERENCE, TRAIT_GENERIC)
/obj/item/mod/module/storage/holding/proc/try_install(_source, obj/item/mod/control/suit, mob/user)
SIGNAL_HANDLER
@@ -95,7 +95,6 @@
/obj/item/mod/module/storage/holding/prebuilt
prebuilt = TRUE
- item_flags = BLUESPACE_INTERFERENCE
/obj/item/mod/module/storage/holding/prebuilt/locked
core_removable = FALSE
diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm
index 249647cf7670..6255df1ab523 100644
--- a/code/modules/mod/modules/modules_engineering.dm
+++ b/code/modules/mod/modules/modules_engineering.dm
@@ -206,7 +206,7 @@
/obj/projectile/tether/fire(setAngle)
if(firer)
- line = firer.Beam(src, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi', emissive = FALSE)
+ line = firer.Beam(src, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi', emissive = NONE)
return ..()
/obj/projectile/tether/on_hit(atom/target, blocked = 0, pierce_hit)
diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm
index eaa4acc0b144..c3d874d08a13 100644
--- a/code/modules/mod/modules/modules_supply.dm
+++ b/code/modules/mod/modules/modules_supply.dm
@@ -792,3 +792,75 @@
lifespan = 1 SECONDS
fade = 1 SECONDS
spin = generator(GEN_NUM, -20, 20)
+
+/obj/item/mod/module/candela_spool
+ name = "\improper MOD \"Candela\" beacon spool module"
+ desc = "A set of tethers and connectors, capable of automatically deploying \"Candela\" beacons from within a MODsuit."
+ icon_state = "candela_spool"
+ module_type = MODULE_ACTIVE
+ use_energy_cost = DEFAULT_CHARGE_DRAIN
+ incompatible_modules = list(/obj/item/mod/module/candela_spool)
+ cooldown_time = 1 SECONDS
+ required_slots = list(ITEM_SLOT_BACK, ITEM_SLOT_GLOVES)
+ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.75)
+ /// Our network handler datum
+ /// We handle the network separately from the beacons we deploy, and supercede all of its' behaviors
+ var/datum/candela_item_handler/handler = null
+
+/obj/item/mod/module/candela_spool/Initialize(mapload)
+ . = ..()
+ handler = new(src, on_network_cut_callback = CALLBACK(src, PROC_REF(on_network_cut)))
+
+/obj/item/mod/module/candela_spool/Destroy()
+ QDEL_NULL(handler)
+ return ..()
+
+/obj/item/mod/module/candela_spool/on_install()
+ . = ..()
+ RegisterSignal(mod, COMSIG_ATOM_STORED_ITEM, PROC_REF(on_stored_item))
+
+/obj/item/mod/module/candela_spool/on_uninstall(deleting = FALSE)
+ . = ..()
+ UnregisterSignal(mod, COMSIG_ATOM_STORED_ITEM)
+
+/obj/item/mod/module/candela_spool/on_activation(mob/activator)
+ handler.set_owner(activator)
+
+/obj/item/mod/module/candela_spool/on_deactivation(mob/activator, display_message, deleting)
+ handler.set_owner(null)
+
+/obj/item/mod/module/candela_spool/on_select_use(atom/target)
+ . = ..()
+ if(!.)
+ return
+ attempt_deploy(mod.wearer, get_turf(mod.wearer))
+
+/obj/item/mod/module/candela_spool/proc/on_stored_item(datum/source, obj/item/stored, mob/user, force)
+ SIGNAL_HANDLER
+
+ if (!istype(stored, /obj/item/stack/candela_beacon))
+ return
+
+ // When storing linked beacons in our MODsuit, inherit their link for convinience
+ var/obj/item/stack/candela_beacon/beacons = stored
+ if (beacons.handler.network)
+ handler.set_network(beacons.handler.network, beacons.handler.closest_node)
+
+/// Callback to react to breaking LOS/reaching maximum distance with a beacon
+/obj/item/mod/module/candela_spool/proc/on_network_cut(atom/old_loc, old_dir, interrupt)
+ if (mod.wearer && handler.closest_node && !interrupt)
+ return attempt_deploy(mod.wearer, old_loc, silent = TRUE)
+ return FALSE
+
+/// Attempt to deploy a candela beacon at a given location
+/obj/item/mod/module/candela_spool/proc/attempt_deploy(mob/activator, atom/location, silent = FALSE)
+ var/obj/item/stack/candela_beacon/beacons = locate() in mod.atom_storage.real_location
+ if (isnull(beacons))
+ balloon_alert(activator, "no beacons!")
+ return FALSE
+
+ if (!beacons.place_beacon(activator, loc_override = location, handler_override = handler, silent = silent))
+ return FALSE
+
+ drain_power(use_energy_cost)
+ return TRUE
diff --git a/code/modules/modular_computers/file_system/programs/atmosscan.dm b/code/modules/modular_computers/file_system/programs/atmosscan.dm
index 8aa51e476cf9..94b25ca2d687 100644
--- a/code/modules/modular_computers/file_system/programs/atmosscan.dm
+++ b/code/modules/modular_computers/file_system/programs/atmosscan.dm
@@ -63,7 +63,6 @@
var/datum/gas_mixture/air = turf?.return_air()
data["gasmixes"] = list(gas_mixture_parser(air, "Location Reading"))
if(ATMOZPHERE_SCAN_CLICK)
- LAZYINITLIST(last_gasmix_data)
data["gasmixes"] = last_gasmix_data
return data
diff --git a/code/modules/modular_computers/file_system/programs/frontier.dm b/code/modules/modular_computers/file_system/programs/frontier.dm
index 0d6304b1f512..75385fa472c4 100644
--- a/code/modules/modular_computers/file_system/programs/frontier.dm
+++ b/code/modules/modular_computers/file_system/programs/frontier.dm
@@ -217,7 +217,7 @@
return TRUE
if("purchase_boost")
var/datum/scientific_partner/partner = locate(text2path(params["boost_seller"])) in SSresearch.scientific_partners
- var/datum/techweb_node/node = SSresearch.techweb_nodes[params["purchased_boost"]]
+ var/datum/techweb_node/node = SSresearch.techweb_nodes[text2path(params["purchased_boost"])]
if(partner && node)
var/possible_boost = partner.purchase_boost(linked_techweb, node)
if(possible_boost)
diff --git a/code/modules/pai/card.dm b/code/modules/pai/card.dm
index 0e2d0114c984..994cf0448fe3 100644
--- a/code/modules/pai/card.dm
+++ b/code/modules/pai/card.dm
@@ -40,9 +40,7 @@
to_chat(user, span_alert("Encryption Key ports not configured."))
return ITEM_INTERACT_BLOCKING
- pai.radio.attackby(tool, user, modifiers)
- to_chat(user, span_notice("You insert [tool] into the [src]."))
- return ITEM_INTERACT_SUCCESS
+ return pai.radio.install_key(user, tool)
/obj/item/pai_card/attack_self(mob/user)
if(!in_range(src, user))
diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm
index 19883a9e8817..3c61dcc0c1bd 100644
--- a/code/modules/power/apc/apc_main.dm
+++ b/code/modules/power/apc/apc_main.dm
@@ -273,7 +273,7 @@
offset_old = pixel_x
pixel_x = -APC_PIXEL_OFFSET
- var/image/hud_image = image(icon = 'icons/mob/huds/hud.dmi', icon_state = "apc_hacked")
+ var/image/hud_image = image(icon = DEFAULT_HUDS_DMI, icon_state = "apc_hacked")
hud_image.pixel_w = pixel_x
hud_image.pixel_z = pixel_y
hud_list = list(
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index a2ea753f07b5..a61ad7870dde 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -650,8 +650,8 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(
/obj/item/stack/cable_coil/proc/try_heal_loop(atom/interacting_with, mob/living/user, repeating = FALSE)
var/mob/living/carbon/human/attacked_humanoid = interacting_with
- var/obj/item/clothing/under/uniform = attacked_humanoid.w_uniform
- if(!istype(uniform) || uniform.repair_sensors(user))
+
+ if(astype(attacked_humanoid.w_uniform, /obj/item/clothing/under)?.repair_sensors(user))
return ITEM_INTERACT_SUCCESS
var/obj/item/bodypart/affecting = attacked_humanoid.get_bodypart(check_zone(user.zone_selected))
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index d0d3eeabf59f..69d222fd6ef7 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -249,7 +249,7 @@
/obj/item/stock_parts/power_store/cell/crystal_cell
name = "crystal power cell"
- desc = "A very high power cell made from crystallized plasma"
+ desc = "A high power cell made from crystallized plasma."
icon_state = "crystal_cell"
maxcharge = STANDARD_CELL_CHARGE * 50
chargerate = 0
diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm
index 02ae9239808a..762c6d32656b 100644
--- a/code/modules/power/lighting/light.dm
+++ b/code/modules/power/lighting/light.dm
@@ -438,7 +438,7 @@
return ITEM_INTERACT_SUCCESS
// attempt to stick weapon into light socket
- if(status != LIGHT_EMPTY || user.combat_mode)
+ if(status != LIGHT_EMPTY || user.combat_mode || istype(tool, /obj/item/lightreplacer))
return NONE
if(tool.item_flags & ABSTRACT)
@@ -449,6 +449,7 @@
do_sparks(3, TRUE, src)
if (prob(75))
electrocute_mob(user, get_area(src), src, (rand(7,10) * 0.1), TRUE)
+
return ITEM_INTERACT_SUCCESS
/obj/machinery/light/screwdriver_act(mob/living/user, obj/item/tool)
diff --git a/code/modules/power/lighting/light_mapping_helpers.dm b/code/modules/power/lighting/light_mapping_helpers.dm
index f8b27d62ea13..43dd8e46fa06 100644
--- a/code/modules/power/lighting/light_mapping_helpers.dm
+++ b/code/modules/power/lighting/light_mapping_helpers.dm
@@ -119,9 +119,12 @@
/obj/machinery/light/prince/ghost/Initialize(mapload)
. = ..()
- RegisterSignal(src, COMSIG_ATOM_ENTERED, PROC_REF(jumpscare))
+ var/static/list/loc_connections = list(
+ COMSIG_ATOM_ENTERED = PROC_REF(jumpscare),
+ )
+ AddElement(/datum/element/connect_loc, loc_connections)
-/obj/machinery/light/prince/ghost/proc/jumpscare(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
+/obj/machinery/light/prince/ghost/proc/jumpscare(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs)
SIGNAL_HANDLER
if(ishuman(arrived))
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index d5dece1759e5..f07e501dd13c 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -270,8 +270,8 @@
/obj/item/gun/ballistic/update_overlays()
. = ..()
- // DARKPACK EDIT ADD START - WORLD_ICON
- if(item_flags & ACTIVE_WORLD_ICON) // World icons have nothing but the base state atm
+ // DARKPACK EDIT ADD START - ONFLOOR_ICONS
+ if(item_flags & ACTIVE_ONFLOOR_ICON) // World icons have nothing but the base state atm
return
// DARKPACK EDIT ADD END
diff --git a/code/modules/projectiles/guns/special/meat_hook.dm b/code/modules/projectiles/guns/special/meat_hook.dm
index 35183e65b0f0..05534db2f3ab 100644
--- a/code/modules/projectiles/guns/special/meat_hook.dm
+++ b/code/modules/projectiles/guns/special/meat_hook.dm
@@ -67,7 +67,7 @@
/obj/projectile/hook/fire(setAngle)
if(firer)
- initial_chain = firer.Beam(src, icon_state = "chain", emissive = FALSE)
+ initial_chain = firer.Beam(src, icon_state = "chain", emissive = NONE)
ADD_TRAIT(firer, TRAIT_IMMOBILIZED, REF(src))
addtimer(TRAIT_CALLBACK_REMOVE(firer, TRAIT_IMMOBILIZED, REF(src)), IMMOBILIZATION_TIMER) // safety if we miss, if we get a hit we stay immobilized
return ..()
@@ -126,7 +126,7 @@
/// Uses fastprocessing to move our victim to the destination at a rather fast speed.
/datum/hook_and_move/proc/begin_pulling(atom/movable/firer, atom/movable/victim, atom/destination)
- return_chain = firer.Beam(victim, icon_state = "chain", emissive = FALSE)
+ return_chain = firer.Beam(victim, icon_state = "chain", emissive = NONE)
firer_ref_string = REF(firer)
ADD_TRAIT(victim, TRAIT_HOOKED, firer_ref_string)
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index d549acda7a46..a3fe7c8dbd6b 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -390,7 +390,7 @@
fail_message = "not a monkey!"
/obj/item/firing_pin/monkey/pin_auth(mob/living/user)
- if(!is_simian(user))
+ if(!HAS_TRAIT(user, TRAIT_SIMIAN))
playsound(src, SFX_SCREECH, 75, TRUE)
return FALSE
return TRUE
diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm
index b54694e14898..628a24e7e9a5 100644
--- a/code/modules/projectiles/projectile/bullets/shotgun.dm
+++ b/code/modules/projectiles/projectile/bullets/shotgun.dm
@@ -168,6 +168,7 @@
pain_mult = 0.5
jostle_pain_mult = 1.5
rip_time = 0.5 SECONDS
+ stealthy_embed = FALSE
/obj/projectile/bullet/pellet/flechette/donk
name = "\improper Donk Co. 'Donk Spike' flechette"
diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
index 14443afe34d3..f5c9d69e03e5 100644
--- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
@@ -1357,7 +1357,7 @@
/datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, metabolization_ratio)
. = ..()
var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
- if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || is_simian(drinker))
+ if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || HAS_TRAIT(drinker, TRAIT_SIMIAN))
var/heal = 1 * metabolization_ratio * seconds_per_tick
if(drinker.heal_bodypart_damage(brute = heal, burn = heal, updating_health = FALSE))
return UPDATE_MOB_HEALTH
diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm
index 4745c6fdb578..623f10cd7a4e 100644
--- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm
@@ -124,7 +124,7 @@
/datum/reagent/consumable/banana/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, metabolization_ratio)
. = ..()
var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
- if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || is_simian(affected_mob))
+ if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || HAS_TRAIT(affected_mob, TRAIT_SIMIAN))
if(affected_mob.heal_bodypart_damage(brute = 0.5 * metabolization_ratio * seconds_per_tick, burn = 0.5 * metabolization_ratio * seconds_per_tick, updating_health = FALSE))
return UPDATE_MOB_HEALTH
@@ -727,7 +727,7 @@
/datum/reagent/consumable/monkey_energy/on_mob_metabolize(mob/living/affected_mob)
. = ..()
- if(is_simian(affected_mob))
+ if(HAS_TRAIT(affected_mob, TRAIT_SIMIAN))
affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy)
/datum/reagent/consumable/monkey_energy/on_mob_end_metabolize(mob/living/affected_mob)
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index 03ba9a01b2f4..c56d709f4326 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -527,10 +527,23 @@
if(SPT_PROB(16, seconds_per_tick))
psychonaut.emote(pick("twitch","giggle"))
-/datum/reagent/drug/mushroomhallucinogen/on_mob_metabolize(mob/living/psychonaut)
+/datum/reagent/drug/mushroomhallucinogen/on_mob_add(mob/living/affected_mob, amount)
+ . = ..()
+ RegisterSignal(affected_mob, COMSIG_MOB_LOGIN, PROC_REF(trip))
+
+/datum/reagent/drug/mushroomhallucinogen/on_mob_delete(mob/living/affected_mob)
. = ..()
+ UnregisterSignal(affected_mob, COMSIG_MOB_LOGIN)
+/datum/reagent/drug/mushroomhallucinogen/on_mob_metabolize(mob/living/psychonaut)
+ . = ..()
psychonaut.add_mood_event("tripping", /datum/mood_event/high)
+ if(!psychonaut.client)
+ return // No need to mess with a mob's plane masters if they physically can't see it.
+ trip(psychonaut)
+
+/// Proc that handles the changes
+/datum/reagent/drug/mushroomhallucinogen/proc/trip(mob/living/psychonaut)
if(!psychonaut.hud_used)
return
diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm
index ee4f31c360f9..57997ad65cee 100644
--- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm
@@ -975,7 +975,7 @@ Basically, we fill the time between now and 2s from now with hands based off the
/datum/reagent/inverse/bath_salts/on_mob_metabolize(mob/living/carbon/affected_mob)
. = ..()
- if(is_simian(affected_mob))
+ if(HAS_TRAIT(affected_mob, TRAIT_SIMIAN))
affected_mob.gain_trauma(/datum/brain_trauma/special/primal_instincts, TRAUMA_RESILIENCE_ABSOLUTE)
affected_mob.add_traits(list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE, TRAIT_ANALGESIA, TRAIT_STIMULATED), type)
if(jungle_arts)
@@ -989,7 +989,7 @@ Basically, we fill the time between now and 2s from now with hands based off the
QDEL_NULL(jungle_arts)
affected_mob.remove_traits(list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE, TRAIT_ANALGESIA, TRAIT_STIMULATED), type)
affected_mob.Sleeping(30 SECONDS)
- if(is_simian(affected_mob))
+ if(HAS_TRAIT(affected_mob, TRAIT_SIMIAN))
affected_mob.cure_trauma_type(/datum/brain_trauma/special/primal_instincts, resilience = TRAUMA_RESILIENCE_ABSOLUTE)
@@ -999,7 +999,7 @@ Basically, we fill the time between now and 2s from now with hands based off the
holder.remove_reagent(type, volume)
return
- if(is_simian(affected_mob))
+ if(HAS_TRAIT(affected_mob, TRAIT_SIMIAN))
var/need_mob_update
need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 5 * metabolization_ratio * seconds_per_tick, required_organ_flag = affected_organ_flags)
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index cda2ef64b817..f2c13131ccf4 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -1426,6 +1426,7 @@
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS
affected_biotype = MOB_ORGANIC | MOB_MINERAL | MOB_PLANT // no healing ghosts
+ var/healing = 0.75
/datum/reagent/medicine/regen_jelly/expose_mob(mob/living/exposed_mob, reac_volume)
. = ..()
@@ -1438,7 +1439,7 @@
/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, metabolization_ratio)
. = ..()
- var/heal = -0.75 * metabolization_ratio * seconds_per_tick
+ var/heal = -healing * metabolization_ratio * seconds_per_tick
var/need_mob_update
need_mob_update = affected_mob.adjust_brute_loss(heal, updating_health = FALSE, required_bodytype = affected_bodytype)
need_mob_update += affected_mob.adjust_fire_loss(heal, updating_health = FALSE, required_bodytype = affected_bodytype)
@@ -1447,6 +1448,13 @@
if(need_mob_update)
return UPDATE_MOB_HEALTH
+// purple
+/datum/reagent/medicine/regen_jelly/diluted
+ name = "Diluted Regenerative Jelly"
+ description = "Regenerative slime jelly that has been diluted, resulting in it regenerating tissues slower, but lasting longer with the same volume."
+ metabolization_rate = 0.125 * REAGENTS_METABOLISM
+ healing = 0.45 // less than omnizine, actually
+
/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs
name = "Restorative Nanites"
description = "Miniature medical robots that swiftly restore bodily damage."
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index ccb37af326a5..4f3a38306411 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -299,6 +299,22 @@
continue
data += dna
+/obj/item/paper/guides/carnivorous_blood
+ name = "Thank you for your purchase!"
+ default_raw_text = "We thank you for your purchase of a sample of Carnivorous Blood for your \[MEDICAL RESEARCH\].\
+
We at Interdyne Pharmaceuticals love to see passion for the field of \[BLOODOLOGY\].\
+
We hope to see you succeed in your goal of \[JUSTGIVEIT\].\
+
Please exercise caution. Interdyne Pharmaceuticals is not responsible for bodily harm caused by the substance.\
+
\
+
☣BIOHAZARD WARNING☣\
+
++ ); + return (+ ++ + {reaction.reaction.required_reagents.map((reagent) => ( ++ + + ))} + {reaction.reaction.required_catalysts.length > 0 && ( + <> ++ + + {reaction.reaction.required_catalysts.map((catalyst) => ( ++ + + ))} + > + )} ++ + ++ + {getTemperatureMessage( + reaction.reaction.lower_temperature, + reaction.reaction.upper_temperature, + )} + ++ ++ + {getPHMessage(reaction.reaction.lower_ph, reaction.reaction.upper_ph)} + +
--- -- - {reaction.reaction.required_reagents.map((reagent) => ( -- - - ))} - {reaction.reaction.required_catalysts.length > 0 && ( - <> -- - - {reaction.reaction.required_catalysts.map((catalyst) => ( -- - - ))} - > - )} -- - -- - {getTemperatureMessage( - reaction.reaction.lower_temperature, - reaction.reaction.upper_temperature, - )} - -- -- - {getPHMessage( - reaction.reaction.lower_ph, - reaction.reaction.upper_ph, - )} - -