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 @@ [![resentment](.github/images/badges/built-with-resentment.svg)](.github/images/comics/131-bug-free.png) [![technical debt](.github/images/badges/contains-technical-debt.svg)](.github/images/comics/106-tech-debt-modified.png) [![forinfinityandbyond](.github/images/badges/made-in-byond.gif)](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☣\ + \ + " + /datum/reagent/toxin/slimejelly name = "Slime Jelly" description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL." diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 5c6668d4adc9..78ffede6c6c2 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -46,7 +46,7 @@ /datum/chemical_reaction/sodiumchloride results = list(/datum/reagent/consumable/salt = 2) required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/chlorine = 1) // That's what I said! Sodium Chloride! - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_FOOD | REACTION_TAG_COMPONENT + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_COMPONENT thermic_constant = 50 /datum/chemical_reaction/sodiumchloride/pre_reaction_other_checks(datum/reagents/holder) @@ -668,7 +668,7 @@ var/mob/living/carbon/maybe_monkey = holder.my_atom var/location = maybe_monkey.drop_location() if(iscarbon(maybe_monkey)) - if(ismonkey(maybe_monkey)) + if(HAS_TRAIT(maybe_monkey, TRAIT_LESSER_HUMANOID)) maybe_monkey.gib(DROP_ALL_REMAINS) to_chat(maybe_monkey, span_danger("You body is torn to shreds as a monkey bursts out of you!")) else @@ -689,7 +689,7 @@ var/mob/living/carbon/maybe_monkey = holder.my_atom var/location = maybe_monkey.drop_location() if(iscarbon(maybe_monkey)) - if(ismonkey(maybe_monkey)) + if(HAS_TRAIT(maybe_monkey, TRAIT_LESSER_HUMANOID)) maybe_monkey.gib(DROP_ALL_REMAINS) to_chat(maybe_monkey, span_danger("You body is torn to shreds as a pissed off monkey bursts out of you!")) else diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 308ffa980ba4..35bd078e88b8 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -287,8 +287,8 @@ . = ..() if(!fill_icon_thresholds) return - // DARKPACK EDIT ADD START - WORLD_ICON - if(item_flags & ACTIVE_WORLD_ICON) // world icons dont have reagent filling + // DARKPACK EDIT ADD START - ONFLOOR_ICONS + if(item_flags & ACTIVE_ONFLOOR_ICON) // world icons dont have reagent filling return // DARKPACK EDIT ADD END if(!reagents.total_volume) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index d13741380be1..94e9f18d8633 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -63,6 +63,7 @@ trans = round(reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user), CHEMICAL_VOLUME_ROUNDING) if(trans) to_chat(user, span_notice("You transfer [trans] unit\s of the solution.")) + playsound(src, 'sound/effects/droplet.ogg', 70, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) update_appearance() target.update_appearance() return ITEM_INTERACT_SUCCESS diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 73a7aa31c46a..9a5dbc22fa93 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -332,6 +332,19 @@ amount_per_transfer_from_this = 60 list_reagents = list(/datum/reagent/medicine/salbutamol = 10, /datum/reagent/medicine/c2/penthrite = 10, /datum/reagent/medicine/oxandrolone = 10, /datum/reagent/medicine/sal_acid = 10 ,/datum/reagent/medicine/omnizine = 10 ,/datum/reagent/medicine/leporazine = 10) +/obj/item/reagent_containers/hypospray/medipen/survival/luxury/purple + name = "luxury purple medipen" + desc = "Cutting edge bluespace technology allowed Nanotrasen to compact 60u of volume into a single medipen. Contains rare and powerful chemicals used to aid in exploration of very hard environments. This one is purple. WARNING: DO NOT MIX WITH EPINEPHRINE OR ATROPINE." + icon_state = "slimepen" + base_icon_state = "slimepen" + list_reagents = list(/datum/reagent/medicine/salbutamol = 10, /datum/reagent/medicine/c2/penthrite = 10, /datum/reagent/medicine/oxandrolone = 10, /datum/reagent/medicine/sal_acid = 10 ,/datum/reagent/medicine/regen_jelly/diluted = 5 ,/datum/reagent/toxin = 5 ,/datum/reagent/medicine/leporazine = 10) + +/obj/item/reagent_containers/hypospray/medipen/survival/luxury/purple/Initialize(mapload) + . = ..() + if(prob(0.1)) // idea by melbert + name = "luxury ourple medipen" + desc = replacetext(desc, "purple", "ourple") // i do not feel like copy-pasting the entire desc for a one-word change + /obj/item/reagent_containers/hypospray/medipen/atropine name = "atropine autoinjector" desc = "A rapid way to save a person from a critical injury state! Additionally contains a powerful coagulant to prevent blood loss." diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm index ab7ef61f0745..85503f586d12 100644 --- a/code/modules/religion/religion_sects.dm +++ b/code/modules/religion/religion_sects.dm @@ -15,7 +15,7 @@ /// Opening message when someone gets converted var/desc = "Oh My! What Do We Have Here?!!?!?!?" /// Tgui icon used by this sect - https://fontawesome.com/icons/ - var/tgui_icon = "bug" + var/tgui_icon = FA_ICON_BUG /// holder for alignments. var/alignment = ALIGNMENT_GOOD /// Does this require something before being available as an option? @@ -152,7 +152,7 @@ name = "Nanotrasen Approved God" desc = "Your run-of-the-mill sect, there are no benefits or boons associated." quote = "Nanotrasen Recommends!" - tgui_icon = "bible" + tgui_icon = FA_ICON_BIBLE /**** Mechanical God ****/ @@ -161,7 +161,7 @@ quote = "May you find peace in a metal shell." desc = "Bibles now recharge cyborgs and heal robotic limbs if targeted, but they \ do not heal organic limbs. You can now sacrifice cells, with favor depending on their charge." - tgui_icon = "robot" + tgui_icon = FA_ICON_ROBOT alignment = ALIGNMENT_NEUT desired_items = list(/obj/item/stock_parts/power_store = "with battery charge") rites_list = list(/datum/religion_rites/synthconversion, /datum/religion_rites/machine_blessing) @@ -235,7 +235,7 @@ name = "Pyre God" desc = "Sacrificing burning corpses with a lot of burn damage and candles grants you favor." quote = "It must burn! The primal energy must be respected." - tgui_icon = "fire-alt" + tgui_icon = FA_ICON_FIRE_ALT alignment = ALIGNMENT_NEUT max_favor = 10000 desired_items = list(/obj/item/flashlight/flare/candle = "already lit") @@ -267,7 +267,7 @@ name = "Greedy God" quote = "Greed is good." desc = "In the eyes of your mercantile deity, your wealth is your favor. Earn enough wealth to purchase some more business opportunities." - tgui_icon = "dollar-sign" + tgui_icon = FA_ICON_DOLLAR_SIGN altar_icon_state = "convertaltar-yellow" alignment = ALIGNMENT_EVIL //greed is not good wtf rites_list = list(/datum/religion_rites/greed/vendatray, /datum/religion_rites/greed/custom_vending) @@ -318,7 +318,7 @@ quote = "To feel the freedom, you must first understand captivity." desc = "Incapacitate yourself in any way possible. Bad mutations, lost limbs, traumas, \ even addictions. You will learn the secrets of the universe from your defeated shell." - tgui_icon = "user-injured" + tgui_icon = FA_ICON_USER_INJURED altar_icon_state = "convertaltar-burden" alignment = ALIGNMENT_NEUT candle_overlay = FALSE @@ -421,7 +421,7 @@ quote = "A good, honorable crusade against evil is required." desc = "Your deity requires fair fights from you. You may not attack the unready, the just, or the innocent. \ You earn favor by getting others to join the crusade, and you may spend favor to announce a battle, bypassing some conditions to attack." - tgui_icon = "scroll" + tgui_icon = FA_ICON_SCROLL altar_icon_state = "convertaltar-white" alignment = ALIGNMENT_GOOD rites_list = list(/datum/religion_rites/deaconize/crusader, /datum/religion_rites/forgive, /datum/religion_rites/summon_rules) @@ -444,7 +444,7 @@ name = "Maintenance God" quote = "Your kingdom in the darkness." desc = "Sacrifice the organic slurry created from rats dipped in welding fuel to gain favor. Exchange favor to adapt to the maintenance shafts." - tgui_icon = "eye" + tgui_icon = FA_ICON_EYE altar_icon_state = "convertaltar-maint" alignment = ALIGNMENT_EVIL //while maint is more neutral in my eyes, the flavor of it kinda pertains to rotting and becoming corrupted by the maints rites_list = list(/datum/religion_rites/maint_adaptation, /datum/religion_rites/adapted_eyes, /datum/religion_rites/adapted_food, /datum/religion_rites/ritual_totem) @@ -486,7 +486,7 @@ name = "Sparring God" quote = "Your next swing must be faster, neophyte. Steel your heart." desc = "Spar other crewmembers to gain favor or other rewards. Exchange favor to steel yourself against real battles." - tgui_icon = "fist-raised" + tgui_icon = FA_ICON_FIST_RAISED altar_icon_state = "convertaltar-orange" alignment = ALIGNMENT_NEUT rites_list = list( @@ -515,7 +515,7 @@ name = "Festival God" quote = "Everything follows a rhythm: the heartbeat of the universe!" desc = "Make wonderful music! Sooth or serrate your friends and foes with the beat." - tgui_icon = "music" + tgui_icon = FA_ICON_MUSIC altar_icon_state = "convertaltar-festival" alignment = ALIGNMENT_GOOD candle_overlay = FALSE diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 84cbb2f7eacf..80d474a706e0 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -2260,6 +2260,14 @@ RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_SUPPLY ) +/datum/design/module/mod_candela_spool + name = "Candela Spool Module" + materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 1.5) + build_path = /obj/item/mod/module/candela_spool + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_SUPPLY + ) + /datum/design/module/mod_organizer name = "Organizer Module" materials = list( diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 84ddf0049fa9..8e5291620584 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -94,7 +94,7 @@ var/datum/techweb_node/unlockable_node = SSresearch.techweb_nodes[node_path] data["node_data"] += list(list( "node_name" = unlockable_node.display_name, - "node_id" = node_path, + "node_path" = node_path, "node_hidden" = !!stored_research.hidden_nodes[node_path], )) else @@ -207,9 +207,10 @@ var/datum/techweb_node/node_to_discover = SSresearch.techweb_nodes[node_path] if(!istype(node_to_discover)) return FALSE + var/item_type = loaded_item.type if(!destroy_item()) return FALSE - SSblackbox.record_feedback("nested tally", "item_deconstructed", 1, list("[node_path]", "[loaded_item.type]")) + SSblackbox.record_feedback("nested tally", "item_deconstructed", 1, list("[node_path]", "[item_type]")) stored_research.unhide_node(node_to_discover) return TRUE diff --git a/code/modules/research/ordnance/doppler_array.dm b/code/modules/research/ordnance/doppler_array.dm index 3143ac15a120..37938c5a6085 100644 --- a/code/modules/research/ordnance/doppler_array.dm +++ b/code/modules/research/ordnance/doppler_array.dm @@ -276,7 +276,7 @@ // Make sure the list is indexed first. if(reaction_data.len) for (var/path in reaction_data[TANK_RESULTS_REACTION]) - var/datum/gas_reaction/reaction_path = path + var/datum/gas_reaction/standard/reaction_path = path record_data["reaction_results"] += initial(reaction_path.name) if(TANK_MERGE_OVERPRESSURE in reaction_data[TANK_RESULTS_MISC]) record_data["reaction_results"] += "Tank overpressurized before reaction" diff --git a/code/modules/research/techweb/nodes/mining_nodes.dm b/code/modules/research/techweb/nodes/mining_nodes.dm index b418af262644..dca91028059b 100644 --- a/code/modules/research/techweb/nodes/mining_nodes.dm +++ b/code/modules/research/techweb/nodes/mining_nodes.dm @@ -97,6 +97,7 @@ /datum/design/jackhammer, /datum/design/drill_diamond, /datum/design/mech_diamond_drill, + /datum/design/module/mod_candela_spool, ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) announce_channels = list(RADIO_CHANNEL_SUPPLY) diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index f2654e913d61..0590ff7692fc 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -130,6 +130,7 @@ Slimecrossing Armor item_flags = IMMUTABLE_SLOW slowdown = 4 emp_protection = EMP_PROTECTION_MODERATE + texture_type = /datum/bodypart_texture/mesh/biosuit_dark var/hit_reflect_chance = 40 /obj/item/clothing/suit/armor/heavy/adamantine/Initialize(mapload) diff --git a/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm b/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm index 245d1cb3485d..7bd48565a455 100644 --- a/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm +++ b/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm @@ -335,7 +335,7 @@ All ShuttleMove procs go here buckled.user_unbuckle_mob(src, src) return if(knockdown > 0) - if(buckled) + if(buckled || HAS_TRAIT(src, TRAIT_NEGATES_GRAVITY)) Immobilize(knockdown * 0.5) return Paralyze(knockdown) diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 3f9905fe4f93..fe9aafa89420 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -186,7 +186,7 @@ if(ishuman(owner)) if(spell_requirements & SPELL_REQUIRES_WIZARD_GARB) - if(!HAS_TRAIT(owner.get_item_by_slot(ITEM_SLOT_OCLOTHING), TRAIT_CASTING_CLOTHING) && !ismonkey(owner)) // Monkeys don't need robes to cast as they are inherently imbued with power from the banana dimension + if(!HAS_TRAIT(owner.get_item_by_slot(ITEM_SLOT_OCLOTHING), TRAIT_CASTING_CLOTHING) && !HAS_TRAIT(owner, TRAIT_LESSER_HUMANOID)) // Monkeys don't need robes to cast as they are inherently imbued with power from the banana dimension if(feedback) to_chat(owner, span_warning("You don't feel strong enough without your robe!")) return FALSE diff --git a/code/modules/spells/spell_types/conjure/simian.dm b/code/modules/spells/spell_types/conjure/simian.dm index 71d7602a80b3..6e5ab7be8fc3 100644 --- a/code/modules/spells/spell_types/conjure/simian.dm +++ b/code/modules/spells/spell_types/conjure/simian.dm @@ -53,7 +53,7 @@ /datum/action/cooldown/spell/conjure/simian/post_summon(atom/summoned_object, atom/cast_on) var/mob/living/alive_dude = summoned_object alive_dude.add_faction(list(FACTION_MONKEY)) - if(ismonkey(alive_dude)) + if(HAS_TRAIT(alive_dude, TRAIT_LESSER_HUMANOID)) equip_monky(alive_dude) return diff --git a/code/modules/spells/spell_types/shapeshift/_shapeshift.dm b/code/modules/spells/spell_types/shapeshift/_shapeshift.dm index 2c146b712714..6e7d737a1f85 100644 --- a/code/modules/spells/spell_types/shapeshift/_shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift/_shapeshift.dm @@ -170,7 +170,7 @@ polymorph_bot.bot_access_flags |= BOT_COVER_EMAGGED polymorph_bot.bot_mode_flags &= ~BOT_MODE_REMOTE_ENABLED - new_shape.storyteller_stats = caster.storyteller_stats // DARKPACK EDIT ADD - STORYTELLER_STATS + new_shape.replace_storyteller_stats(caster.storyteller_stats) // DARKPACK EDIT ADD - STORYTELLER_STATS return new_shape diff --git a/code/modules/surgery/bodyparts/bodypart_effects/bodypart_effect.dm b/code/modules/surgery/bodyparts/bodypart_effects/bodypart_effect.dm index 17b6a66b0ad5..289f3b48b20e 100644 --- a/code/modules/surgery/bodyparts/bodypart_effects/bodypart_effect.dm +++ b/code/modules/surgery/bodyparts/bodypart_effects/bodypart_effect.dm @@ -3,6 +3,7 @@ id = "bodypart_effect" duration = STATUS_EFFECT_PERMANENT processing_speed = STATUS_EFFECT_NORMAL_PROCESS + on_remove_on_mob_delete = TRUE /// List of bodyparts contributing to this effect var/list/bodyparts = list() @@ -21,8 +22,7 @@ bodyparts.Add(bodypart) - if(!is_active && bodyparts.len >= minimum_bodyparts) - activate() + check_active() /// Remove a bodypart from the effect. Deleting = TRUE is used during clean-up phase /datum/status_effect/grouped/bodypart_effect/proc/remove_bodypart(mob/living/carbon/old_owner, obj/item/bodypart/bodypart, deleting) @@ -36,8 +36,23 @@ if(bodyparts.len == 0 && !QDELETED(old_owner)) qdel(src) - else if(is_active && bodyparts.len < minimum_bodyparts) - deactivate() + else + check_active() + +/// Checks if we should be active or not +/datum/status_effect/grouped/bodypart_effect/proc/should_activate() + return bodyparts.len >= minimum_bodyparts + +/datum/status_effect/grouped/bodypart_effect/proc/check_active(...) + SIGNAL_HANDLER + + if(is_active) + if(!should_activate()) + deactivate() + + else + if(should_activate()) + activate() /// Signal called when a bodypart is removed /datum/status_effect/grouped/bodypart_effect/proc/on_bodypart_removed(obj/item/bodypart/bodypart, special) @@ -66,10 +81,15 @@ is_active = FALSE -/// Clean up all references and self-destruct -/datum/status_effect/grouped/bodypart_effect/Destroy() - deactivate() +/datum/status_effect/grouped/bodypart_effect/on_remove() + . = ..() + if(is_active) + deactivate() for(var/obj/item/bodypart/bodypart as anything in bodyparts) remove_bodypart(bodypart.owner, bodypart, deleting = TRUE) +// This should be redundant given on_remove, but there are a few edge cases where it gets skipped, so this is a safety net +/datum/status_effect/grouped/bodypart_effect/Destroy() + for(var/obj/item/bodypart/bodypart as anything in bodyparts) + remove_bodypart(bodypart.owner, bodypart, deleting = TRUE) return ..() diff --git a/code/modules/surgery/bodyparts/bodypart_effects/slime_passgrille.dm b/code/modules/surgery/bodyparts/bodypart_effects/slime_passgrille.dm new file mode 100644 index 000000000000..0019c945cc1f --- /dev/null +++ b/code/modules/surgery/bodyparts/bodypart_effects/slime_passgrille.dm @@ -0,0 +1,162 @@ +/// Gives PASSGRILLE so long as all of the bodyparts are slime (and some other conditions) +/datum/status_effect/grouped/bodypart_effect/slime_passgrille + id = "slime_passgrille" + tick_interval = STATUS_EFFECT_NO_TICK + +/datum/status_effect/grouped/bodypart_effect/slime_passgrille/on_apply() + . = ..() + RegisterSignals(owner, list(COMSIG_CARBON_POST_REMOVE_LIMB, COMSIG_CARBON_POST_ATTACH_LIMB), PROC_REF(check_active)) + +/datum/status_effect/grouped/bodypart_effect/slime_passgrille/on_remove() + . = ..() + UnregisterSignal(owner, list( + COMSIG_ATOM_BUMPED, + COMSIG_CARBON_POST_ATTACH_LIMB, + COMSIG_CARBON_POST_REMOVE_LIMB, + COMSIG_MOB_EQUIPPED_ITEM, + COMSIG_MOB_UNEQUIPPED_ITEM, + COMSIG_MOVABLE_MOVED, + )) + if(is_active) + deactivate() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/walking_through_grille) + +/datum/status_effect/grouped/bodypart_effect/slime_passgrille/should_activate() + for(var/obj/item/bodypart/other_part as anything in owner.get_bodyparts()) + if(other_part.pass_flags & PASSGRILLE) + continue + if(IS_ROBOTIC_LIMB(other_part) || !(other_part.biological_state & BIO_JELLY)) + return FALSE + + for(var/obj/item/organ/other_organ as anything in astype(owner, /mob/living/carbon).organs) // safe assertion + if(other_organ.pass_flags & PASSGRILLE) + continue + if(IS_ROBOTIC_ORGAN(other_organ)) // no check for jelly organs (yet), as half of their organs are normal fleshy things. + return FALSE + + return TRUE + +/datum/status_effect/grouped/bodypart_effect/slime_passgrille/activate() + . = ..() + RegisterSignal(owner, COMSIG_MOVABLE_BUMP, PROC_REF(on_bumped)) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + +/datum/status_effect/grouped/bodypart_effect/slime_passgrille/deactivate() + . = ..() + UnregisterSignal(owner, list( + COMSIG_MOVABLE_BUMP, + COMSIG_MOVABLE_MOVED, + )) + if(QDELING(owner)) + return + + if(owner.pass_flags & PASSGRILLE) + clear_passgrille() + if(try_spit_out()) + to_chat(owner, span_warning("You get squeezed out of the crevice you were within!")) + +/datum/status_effect/grouped/bodypart_effect/slime_passgrille/proc/try_spit_out() + var/turf/start_loc = get_turf(owner) + if(!isturf(start_loc) || !start_loc.is_blocked_turf(source_atom = owner)) + return FALSE + + if(spit_out(owner.dir)) + return TRUE + + if(spit_out(REVERSE_DIR(owner.dir))) + return TRUE + + return FALSE + +/datum/status_effect/grouped/bodypart_effect/slime_passgrille/proc/on_bumped(datum/source, atom/bumped) + SIGNAL_HANDLER + + if(!(bumped.pass_flags_self & PASSGRILLE)) + return + if(DOING_INTERACTION_WITH_TARGET(owner, bumped)) + return + var/turf/bump_turf = get_turf(bumped) + if(bump_turf.is_blocked_turf(source_atom = owner, ignore_atoms = list(bumped))) + return + + INVOKE_ASYNC(src, PROC_REF(try_squeeze_into), bumped) + +/datum/status_effect/grouped/bodypart_effect/slime_passgrille/proc/try_squeeze_into(atom/bumped) + var/squeeze_time = 3 SECONDS + var/warning_message = "" + var/list/items = owner.get_equipped_items(INCLUDE_HELD) + // squeeze time goes up if they have any items on - not for balance reasons, but just to let them now they're about to be stripped clean. + if(length(items)) + squeeze_time += 2 SECONDS + warning_message = " (This will drop all of your equipment!)" + // another check is made for dangerous_unequip items, which will also add to the squeeze time and give a more specific warning message. + for(var/obj/item/thing as anything in items) + if(HAS_TRAIT(thing, TRAIT_DANGEROUS_UNEQUIP)) + squeeze_time += 3 SECONDS + warning_message = " (This will drop ALL of your equipment, including [thing]!)" + break + + owner.visible_message( + span_warning("[owner] starts squeezing through the crevices within [bumped]..."), + span_notice("You start squeezing through the crevices within [bumped]...[warning_message]"), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + + if(!do_after(owner, squeeze_time, bumped) || QDELETED(src) || !is_active) + return + + owner.visible_message( + span_warning("[owner] squeezes into the crevices within [bumped]!"), + span_notice("You squeeze into the crevices within [bumped]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + + add_passgrille() + owner.forceMove(bumped.loc) + +/datum/status_effect/grouped/bodypart_effect/slime_passgrille/proc/spit_out(in_direction) + // intentionally uses range over range_turfs to get closest turfs first + for(var/turf/open/nearby_open_turf in range(2, get_step(owner, in_direction))) + if(nearby_open_turf.is_blocked_turf(exclude_mobs = TRUE, source_atom = owner)) + continue + owner.forceMove(nearby_open_turf) + owner.Paralyze(4 SECONDS) + owner.Knockdown(8 SECONDS) + owner.adjust_jitter(12 SECONDS) + owner.bleed(36) // leaves a pool o jelly behind + return TRUE + + return FALSE + +/datum/status_effect/grouped/bodypart_effect/slime_passgrille/proc/on_move(datum/source, atom/old_loc) + SIGNAL_HANDLER + + if(!(owner.pass_flags & PASSGRILLE)) + return + + for(var/atom/blocker as anything in owner.loc) + if(blocker.pass_flags_self & PASSGRILLE) + return + + // leaving grilles = back to normal. (though the effect is still active) + clear_passgrille() + +/datum/status_effect/grouped/bodypart_effect/slime_passgrille/proc/add_passgrille() + owner.add_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_UNDENSE, TRAIT_PULL_BLOCKED, TRAIT_UI_BLOCKED), TRAIT_STATUS_EFFECT(id)) + owner.pass_flags |= PASSGRILLE + owner.add_movespeed_modifier(/datum/movespeed_modifier/walking_through_grille) + + var/mob/living/carbon/carbon_owner = owner + carbon_owner.dna.species.update_no_equip_flags(owner, ALL) + +/datum/status_effect/grouped/bodypart_effect/slime_passgrille/proc/clear_passgrille() + owner.remove_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_UNDENSE, TRAIT_PULL_BLOCKED, TRAIT_UI_BLOCKED), TRAIT_STATUS_EFFECT(id)) + owner.pass_flags &= ~PASSGRILLE + owner.remove_movespeed_modifier(/datum/movespeed_modifier/walking_through_grille) + + var/mob/living/carbon/carbon_owner = owner + carbon_owner.dna.species.update_no_equip_flags(owner, initial(carbon_owner.dna.species.no_equip_flags)) + +/datum/movespeed_modifier/walking_through_grille + id = "walking_through_grille" + multiplicative_slowdown = 3 diff --git a/code/modules/surgery/bodyparts/default_parts.dm b/code/modules/surgery/bodyparts/default_parts.dm index 7fe821a6c16f..2f8af6b5e431 100644 --- a/code/modules/surgery/bodyparts/default_parts.dm +++ b/code/modules/surgery/bodyparts/default_parts.dm @@ -36,7 +36,7 @@ /// Offset to apply to equipment worn on the neck var/datum/worn_feature_offset/worn_neck_offset /// Which functional (i.e. flightpotion) wing types (if any) does this bodypart support? If count is >1 a radial menu is used to choose between all icons in list - var/list/wing_types = list(/obj/item/organ/wings/functional/angel) + var/list/wing_types = list(/obj/item/organ/wings/angel) /obj/item/bodypart/chest/apply_ownership(mob/living/carbon/new_owner) . = ..() diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 1e63a819c963..867199baaad6 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -242,7 +242,7 @@ robotic_emp_paralyze_damage_percent_threshold = 0.6 - wing_types = list(/obj/item/organ/wings/functional/robotic) + wing_types = list(/obj/item/organ/wings/robotic) var/wired = FALSE var/obj/item/stock_parts/power_store/cell = null diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm index e90cb5a7a518..2ea94b3fdb5c 100644 --- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm @@ -13,7 +13,7 @@ icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = SPECIES_LIZARD is_dimorphic = TRUE - wing_types = list(/obj/item/organ/wings/functional/dragon) + wing_types = list(/obj/item/organ/wings/dragon) zombie_color = LIZARD_ZOMBIE_COLOR /obj/item/bodypart/chest/lizard/get_butt_sprite() diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm index b2883f134257..5c59fc077190 100644 --- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm @@ -93,6 +93,7 @@ burn_modifier = 0.5 // = 1/2x generic burn damage head_flags = HEAD_EYECOLOR | HEAD_EYESPRITES | HEAD_HAIR | HEAD_FACIAL_HAIR butcher_replacement = null + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/slime_passgrille) /obj/item/bodypart/chest/jelly biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JELLY) @@ -100,8 +101,9 @@ is_dimorphic = TRUE dmg_overlay_type = null burn_modifier = 0.5 // = 1/2x generic burn damage - wing_types = list(/obj/item/organ/wings/functional/slime) + wing_types = list(/obj/item/organ/wings/slime) butcher_replacement = null + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/slime_passgrille) /obj/item/bodypart/chest/jelly/get_butt_sprite() return icon('icons/mob/butts.dmi', BUTT_SPRITE_SLIME) @@ -112,6 +114,7 @@ dmg_overlay_type = null burn_modifier = 0.5 // = 1/2x generic burn damage butcher_replacement = null + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/slime_passgrille) /obj/item/bodypart/arm/right/jelly biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JELLY) @@ -119,6 +122,7 @@ dmg_overlay_type = null burn_modifier = 0.5 // = 1/2x generic burn damage butcher_replacement = null + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/slime_passgrille) /obj/item/bodypart/leg/left/jelly biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JELLY) @@ -126,6 +130,7 @@ dmg_overlay_type = null burn_modifier = 0.5 // = 1/2x generic burn damage butcher_replacement = null + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/slime_passgrille) /obj/item/bodypart/leg/right/jelly biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JELLY) @@ -133,6 +138,7 @@ dmg_overlay_type = null burn_modifier = 0.5 // = 1/2x generic burn damage butcher_replacement = null + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/slime_passgrille) ///SLIME /obj/item/bodypart/head/jelly/slime @@ -251,7 +257,7 @@ limb_id = SPECIES_FLYPERSON is_dimorphic = TRUE should_draw_greyscale = FALSE - wing_types = list(/obj/item/organ/wings/functional/fly) + wing_types = list(/obj/item/organ/wings/fly) bodypart_traits = list(TRAIT_TACKLING_FRAIL_ATTACKER) /obj/item/bodypart/arm/left/fly @@ -350,7 +356,7 @@ should_draw_greyscale = FALSE dmg_overlay_type = null bodypart_flags = BODYPART_UNHUSKABLE - wing_types = list(/obj/item/organ/wings/functional/skeleton) + wing_types = list(/obj/item/organ/wings/skeleton) scarrable = FALSE butcher_replacement = null diff --git a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm index 35d95fc37525..c0d33445ab8d 100644 --- a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm @@ -16,7 +16,7 @@ limb_id = SPECIES_MOTH is_dimorphic = TRUE should_draw_greyscale = FALSE - wing_types = list(/obj/item/organ/wings/functional/moth/megamoth, /obj/item/organ/wings/functional/moth/mothra) + wing_types = list(/obj/item/organ/wings/megamoth, /obj/item/organ/wings/mothra) bodypart_traits = list(TRAIT_TACKLING_WINGED_ATTACKER) /obj/item/bodypart/chest/moth/get_butt_sprite() diff --git a/code/modules/surgery/operations/operation_dissection.dm b/code/modules/surgery/operations/operation_dissection.dm index 409e8c6134dc..1ca1e554c7b8 100644 --- a/code/modules/surgery/operations/operation_dissection.dm +++ b/code/modules/surgery/operations/operation_dissection.dm @@ -73,7 +73,7 @@ if(ishuman(target)) var/mob/living/carbon/human/human_target = target if(human_target.dna?.species) - if(ismonkey(human_target)) + if(HAS_TRAIT(human_target, TRAIT_LESSER_HUMANOID)) reward /= 5 else if(isabductor(human_target)) reward *= 4 diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index e737a9736421..9bef1bd4c922 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -146,13 +146,22 @@ ) dyable = TRUE offset_location = ENTIRE_BODY + /// Tracks if it's currently wagging or not var/wagging = FALSE + /// If TRUE the tail is shown when over supported suits like space suits + var/mesh_in_suits = FALSE /datum/bodypart_overlay/mutant/tail/get_base_icon_state() return "[wagging ? "wagging_" : ""][sprite_datum.icon_state]" //add the wagging tag if we be wagging /datum/bodypart_overlay/mutant/tail/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner, mob/living/carbon/owner) - return ..() && !(bodypart_owner.owner?.obscured_slots & HIDEJUMPSUIT) + if(!(bodypart_owner.owner?.obscured_slots & HIDEJUMPSUIT)) + return ..() + if(!mesh_in_suits) + return FALSE + if(locate(/datum/bodypart_texture/mesh) in bodypart_owner.bodypart_textures) + return ..() + return FALSE /obj/item/organ/tail/cat name = "tail" @@ -248,6 +257,7 @@ /datum/bodypart_overlay/mutant/tail/lizard feature_key = FEATURE_TAIL_LIZARD draw_on_husks = HUSK_OVERLAY_GRAYSCALE + mesh_in_suits = TRUE /obj/item/organ/tail/lizard/fake name = "fabricated lizard tail" diff --git a/code/modules/surgery/organs/external/wings/functional_wings.dm b/code/modules/surgery/organs/external/wings/functional_wings.dm deleted file mode 100644 index 63f06575f3ff..000000000000 --- a/code/modules/surgery/organs/external/wings/functional_wings.dm +++ /dev/null @@ -1,244 +0,0 @@ -#define FUNCTIONAL_WING_FORCE 2.25 NEWTONS - -///hud action for starting and stopping flight -/datum/action/innate/flight - name = "Toggle Flight" - check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_IMMOBILE|AB_CHECK_INCAPACITATED - button_icon = 'modular_darkpack/master_files/icons/hud/actions.dmi' // DARKPACK EDIT CHANGE - ORIGINAL: button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "fly" // DARKPACK EDIT CHANGE - ORIGINAL: button_icon_state = "flight" - -/datum/action/innate/flight/Activate() - var/mob/living/carbon/human/human = owner - var/obj/item/organ/wings/functional/wings = human.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) - if(wings?.can_fly()) - wings.toggle_flight(human) - -///The true wings that you can use to fly and shit (you cant actually shit with them) -/obj/item/organ/wings/functional - ///The flight action object - var/datum/action/innate/flight/fly - - bodypart_overlay = /datum/bodypart_overlay/mutant/wings/functional - - ///Are our wings open or closed? - var/wings_open = FALSE - ///We cant hide this wings in suit - var/cant_hide = FALSE - - food_reagents = list(/datum/reagent/flightpotion = 5) - - var/drift_force = FUNCTIONAL_WING_FORCE - -/obj/item/organ/wings/functional/Initialize(mapload) - . = ..() - AddComponent( \ - /datum/component/jetpack, \ - TRUE, \ - drift_force, \ - COMSIG_WINGS_OPENED, \ - COMSIG_WINGS_CLOSED, \ - null, \ - CALLBACK(src, PROC_REF(can_fly)), \ - CALLBACK(src, PROC_REF(can_fly)), \ - ) - -/obj/item/organ/wings/functional/Destroy() - QDEL_NULL(fly) - return ..() - -/obj/item/organ/wings/functional/grind_results() - return list(/datum/reagent/flightpotion = 5) - -/obj/item/organ/wings/functional/on_mob_insert(mob/living/carbon/receiver, special, movement_flags) - . = ..() - - if(QDELETED(fly)) - fly = new - fly.Grant(receiver) - -/obj/item/organ/wings/functional/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags) - . = ..() - fly?.Remove(organ_owner) - if(wings_open) - toggle_flight(organ_owner) - -/obj/item/organ/wings/functional/on_life(seconds_per_tick) - . = ..() - handle_flight(owner) - -///Called on_life(). Handle flight code and check if we're still flying -/obj/item/organ/wings/functional/proc/handle_flight(mob/living/carbon/human/human) - if(!HAS_TRAIT_FROM(human, TRAIT_MOVE_FLOATING, SPECIES_FLIGHT_TRAIT)) - return FALSE - if(!can_fly()) - toggle_flight(human) - return FALSE - return TRUE - -///Check if we're still eligible for flight (wings covered, atmosphere too thin, etc) -/obj/item/organ/wings/functional/proc/can_fly() - var/mob/living/carbon/human/human = owner - if(IS_UNCONSCIOUS_OR_CRIT(human) || human.body_position == LYING_DOWN || isnull(human.client)) - return FALSE - //Jumpsuits have tail holes, so it makes sense they have wing holes too - if(!cant_hide && (human.obscured_slots & HIDEJUMPSUIT)) - to_chat(human, span_warning("Your clothing blocks your wings from extending!")) - return FALSE - var/turf/location = get_turf(human) - if(!location) - return FALSE - - var/datum/gas_mixture/environment = location.return_air() - if(environment?.return_pressure() < HAZARD_LOW_PRESSURE + 10) - to_chat(human, span_warning("The atmosphere is too thin for you to fly!")) - return FALSE - return TRUE - -///Slipping but in the air? -/obj/item/organ/wings/functional/proc/fly_slip(mob/living/carbon/human/human) - var/obj/buckled_obj - if(human.buckled) - buckled_obj = human.buckled - - to_chat(human, span_notice("Your wings spazz out and launch you!")) - - playsound(human.loc, 'sound/misc/slip.ogg', 50, TRUE, -3) - - for(var/obj/item/choking_hazard in human.held_items) - human.accident(choking_hazard) - - var/olddir = human.dir - - human.stop_pulling() - if(buckled_obj) - buckled_obj.unbuckle_mob(human) - step(buckled_obj, olddir) - else - human.AddComponent(/datum/component/force_move, get_ranged_target_turf(human, olddir, 4), TRUE) - return TRUE - -///UNSAFE PROC, should only be called through the Activate or other sources that check for CanFly -/obj/item/organ/wings/functional/proc/toggle_flight(mob/living/carbon/human/human) - if(!HAS_TRAIT_FROM(human, TRAIT_MOVE_FLOATING, SPECIES_FLIGHT_TRAIT)) - human.physiology.stun_mod *= 2 - human.add_traits(list(TRAIT_MOVE_FLOATING, TRAIT_IGNORING_GRAVITY, TRAIT_NOGRAV_ALWAYS_DRIFT), SPECIES_FLIGHT_TRAIT) - human.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/wings) - human.AddElement(/datum/element/forced_gravity, 0) - ADD_TRAIT(human, TRAIT_PASSTABLE, SPECIES_FLIGHT_TRAIT) - open_wings() - to_chat(human, span_notice("You beat your wings and begin to hover gently above the ground...")) - human.set_resting(FALSE, TRUE) - human.refresh_gravity() - return - - human.physiology.stun_mod *= 0.5 - human.remove_traits(list(TRAIT_MOVE_FLOATING, TRAIT_IGNORING_GRAVITY, TRAIT_NOGRAV_ALWAYS_DRIFT), SPECIES_FLIGHT_TRAIT) - human.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/wings) - human.RemoveElement(/datum/element/forced_gravity, 0) - REMOVE_TRAIT(human, TRAIT_PASSTABLE, SPECIES_FLIGHT_TRAIT) - to_chat(human, span_notice("You settle gently back onto the ground...")) - close_wings() - human.refresh_gravity() - -///SPREAD OUR WINGS AND FLLLLLYYYYYY -/obj/item/organ/wings/functional/proc/open_wings() - var/datum/bodypart_overlay/mutant/wings/functional/overlay = bodypart_overlay - overlay.open_wings() - wings_open = TRUE - owner.update_body_parts() - SEND_SIGNAL(src, COMSIG_WINGS_OPENED, owner) - -///close our wings -/obj/item/organ/wings/functional/proc/close_wings() - var/datum/bodypart_overlay/mutant/wings/functional/overlay = bodypart_overlay - wings_open = FALSE - overlay.close_wings() - owner.update_body_parts() - - if(isturf(owner?.loc)) - var/turf/location = loc - location.Entered(src, NONE) - - SEND_SIGNAL(src, COMSIG_WINGS_CLOSED, owner) - -///Bodypart overlay of function wings, including open and close functionality! -/datum/bodypart_overlay/mutant/wings/functional - ///Are our wings currently open? Change through open_wings or close_wings() - VAR_PRIVATE/wings_open = FALSE - -/datum/bodypart_overlay/mutant/wings/functional/get_global_feature_list() - if(wings_open) - return SSaccessories.feature_list[FEATURE_WINGS_OPEN] - return ..() - -///Update our wingsprite to the open wings variant -/datum/bodypart_overlay/mutant/wings/functional/proc/open_wings() - wings_open = TRUE - feature_key = FEATURE_WINGS_OPEN - set_appearance_from_name(sprite_datum.name) //It'll look for the same name again, but this time from the open wings list - -///Update our wingsprite to the closed wings variant -/datum/bodypart_overlay/mutant/wings/functional/proc/close_wings() - wings_open = FALSE - feature_key = initial(feature_key) - set_appearance_from_name(sprite_datum.name) - -/datum/bodypart_overlay/mutant/wings/functional/icon_render_key(obj/item/bodypart/limb) - . = ..() - . += wings_open ? "open" : "closed" - -///angel wings, which relate to humans. comes with holiness. -/obj/item/organ/wings/functional/angel - name = "angel wings" - desc = "Holier-than-thou attitude not included." - sprite_accessory_override = /datum/sprite_accessory/wings_open/angel - - organ_traits = list(TRAIT_HOLY) - -///dragon wings, which relate to lizards. -/obj/item/organ/wings/functional/dragon - name = "dragon wings" - desc = "Hey, HEY- NOT lizard wings. Dragon wings. Mighty dragon wings." - sprite_accessory_override = /datum/sprite_accessory/wings/dragon - -///robotic wings, which relate to androids. -/obj/item/organ/wings/functional/robotic - name = "robotic wings" - desc = "Using microscopic hover-engines, or \"microwings,\" as they're known in the trade, these tiny devices are able to lift a few grams at a time. Gather enough of them, and you can lift impressively large things." - organ_flags = ORGAN_ROBOTIC - sprite_accessory_override = /datum/sprite_accessory/wings/robotic - -///skeletal wings, which relate to skeletal races. -/obj/item/organ/wings/functional/skeleton - name = "skeletal wings" - desc = "Powered by pure edgy-teenager-notebook-scribblings. Just kidding. But seriously, how do these keep you flying?!" - sprite_accessory_override = /datum/sprite_accessory/wings/skeleton - -/obj/item/organ/wings/functional/moth/make_flap_sound(mob/living/carbon/wing_owner) - playsound(wing_owner, 'sound/mobs/humanoids/moth/moth_flutter.ogg', 50, TRUE) - -///mothra wings, which relate to moths. -/obj/item/organ/wings/functional/moth/mothra - name = "mothra wings" - desc = "Fly like the mighty mothra of legend once did." - sprite_accessory_override = /datum/sprite_accessory/wings/mothra - -///megamoth wings, which relate to moths as an alternate choice. they're both pretty cool. -/obj/item/organ/wings/functional/moth/megamoth - name = "megamoth wings" - desc = "Don't get murderous." - sprite_accessory_override = /datum/sprite_accessory/wings/megamoth - -///fly wings, which relate to flies. -/obj/item/organ/wings/functional/fly - name = "fly wings" - desc = "Fly as a fly." - sprite_accessory_override = /datum/sprite_accessory/wings/fly - -///slime wings, which relate to slimes. -/obj/item/organ/wings/functional/slime - name = "slime wings" - desc = "How does something so squishy even fly?" - sprite_accessory_override = /datum/sprite_accessory/wings/slime - -#undef FUNCTIONAL_WING_FORCE diff --git a/code/modules/surgery/organs/external/wings/moth_wings.dm b/code/modules/surgery/organs/external/wings/moth_wings.dm index f026771f9170..0b43e97544a0 100644 --- a/code/modules/surgery/organs/external/wings/moth_wings.dm +++ b/code/modules/surgery/organs/external/wings/moth_wings.dm @@ -10,25 +10,17 @@ bodypart_overlay = /datum/bodypart_overlay/mutant/wings/moth restyle_flags = EXTERNAL_RESTYLE_FLESH + //Not very capable under normal circumstances, try as they might. + flight_level = WINGS_FLIGHTLESS + has_open_sprite = FALSE + flap_sound = 'sound/mobs/humanoids/moth/moth_flutter.ogg' + ///Are we burned? var/burnt = FALSE ///Store our old datum here for if our burned wings are healed var/original_sprite_datum - var/drift_force = MOTH_WING_FORCE - -/obj/item/organ/wings/moth/Initialize(mapload) - . = ..() - AddComponent( \ - /datum/component/jetpack, \ - TRUE, \ - drift_force, \ - COMSIG_ORGAN_IMPLANTED, \ - COMSIG_ORGAN_REMOVED, \ - null, \ - CALLBACK(src, PROC_REF(allow_flight)), \ - null, \ - ) + drift_force = MOTH_WING_FORCE /obj/item/organ/wings/moth/on_mob_insert(mob/living/carbon/receiver) . = ..() @@ -39,23 +31,14 @@ . = ..() UnregisterSignal(organ_owner, list(COMSIG_HUMAN_BURNING, COMSIG_LIVING_POST_FULLY_HEAL)) -/obj/item/organ/wings/moth/make_flap_sound(mob/living/carbon/wing_owner) - playsound(wing_owner, 'sound/mobs/humanoids/moth/moth_flutter.ogg', 50, TRUE) - /obj/item/organ/wings/moth/can_soften_fall() return !burnt -/obj/item/organ/wings/moth/proc/allow_flight() - if(!owner || !owner.client) - return FALSE - if(owner.has_gravity()) - return FALSE - if((owner.obscured_slots & HIDEMUTWINGS) || burnt) +/obj/item/organ/wings/moth/allow_flight() + if(burnt) return FALSE - var/datum/gas_mixture/current = owner.loc.return_air() - if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) - return TRUE - return FALSE + return ..() + ///check if our wings can burn off ;_; /obj/item/organ/wings/moth/proc/try_burn_wings(mob/living/carbon/human/human) @@ -112,3 +95,21 @@ return burnt ? burn_datum.icon_state : sprite_datum.icon_state #undef MOTH_WING_FORCE + + +// These look like moth wings. They sound like moth wings. They are not moth wings by any shared interaction besides their flap sounds. +// Don't try it. Burn states, driftability, forced sprite accessory overrides... + +///mothra wings, which relate to moths. +/obj/item/organ/wings/mothra + name = "mothra wings" + desc = "Fly like the mighty mothra of legend once did." + sprite_accessory_override = /datum/sprite_accessory/wings/mothra + flap_sound = 'sound/mobs/humanoids/moth/moth_flutter.ogg' + +///megamoth wings, which relate to moths as an alternate choice. they're both pretty cool. +/obj/item/organ/wings/megamoth + name = "megamoth wings" + desc = "Don't get murderous." + sprite_accessory_override = /datum/sprite_accessory/wings/megamoth + flap_sound = 'sound/mobs/humanoids/moth/moth_flutter.ogg' diff --git a/code/modules/surgery/organs/external/wings/wings.dm b/code/modules/surgery/organs/external/wings/wings.dm index 5ee9dd81e919..9229c4b78351 100644 --- a/code/modules/surgery/organs/external/wings/wings.dm +++ b/code/modules/surgery/organs/external/wings/wings.dm @@ -1,4 +1,6 @@ -///Wing base type. doesn't really do anything +#define DEFAULT_WING_FORCE 2.25 NEWTONS + +///Wing base type. can do things :> /obj/item/organ/wings name = "wings" desc = "Spread your wings and FLLLLLLLLYYYYY!" @@ -8,18 +10,255 @@ slot = ORGAN_SLOT_EXTERNAL_WINGS use_mob_sprite_as_obj_sprite = TRUE - bodypart_overlay = /datum/bodypart_overlay/mutant/wings + bodypart_overlay = /datum/bodypart_overlay/mutant/wings/functional organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL abstract_type = /obj/item/organ/wings + ///The flight action object + var/datum/action/innate/flight/fly + + ///Are our wings open or closed? + var/wings_open = FALSE + ///We cant hide these wings in suit + var/cant_hide = FALSE + ///The level of flight this organ provides, from passive 0G drift to magic flight + var/flight_level = WINGS_AIRWORTHY + ///Does this wing type have open/close sprite variants + var/has_open_sprite = TRUE + ///Sound played on the *flap emote, if any + var/flap_sound + + var/drift_force = DEFAULT_WING_FORCE + ///Checks if the wings can soften short falls /obj/item/organ/wings/proc/can_soften_fall() return TRUE -///Implement as needed to play a sound effect on *flap emote +///Set flap_sound to play the sound when emoting *flap /obj/item/organ/wings/proc/make_flap_sound(mob/living/carbon/wing_owner) - return + if(isnull(flap_sound)) + return + playsound(wing_owner, flap_sound, 50, TRUE) + +/obj/item/organ/wings/Initialize(mapload) + setup_jetpack() + if(flight_level > WINGS_FLIGHTLESS) + // only flightful wings get orange juice + food_reagents = list(/datum/reagent/flightpotion = 5) + . = ..() + +/** + * update proc to kick our jetpack component whenever circumstances change + * + * Flightless wings never generate lift of their own, drifting in 0G and hook + * the organ being implanted/removed. Anything airworthy flies under its own power, so we + * hook the wings being opened/closed instead + */ +/obj/item/organ/wings/proc/setup_jetpack() + if(flight_level <= WINGS_FLIGHTLESS) + AddComponent( \ + /datum/component/jetpack, \ + TRUE, \ + drift_force, \ + COMSIG_ORGAN_IMPLANTED, \ + COMSIG_ORGAN_REMOVED, \ + null, \ + CALLBACK(src, PROC_REF(allow_flight)), \ + null, \ + ) + return + + AddComponent( \ + /datum/component/jetpack, \ + TRUE, \ + drift_force, \ + COMSIG_WINGS_OPENED, \ + COMSIG_WINGS_CLOSED, \ + null, \ + CALLBACK(src, PROC_REF(can_fly)), \ + CALLBACK(src, PROC_REF(can_fly)), \ + ) + +/obj/item/organ/wings/Destroy() + QDEL_NULL(fly) + return ..() + +///You only get the juice if your wings are worth a damn +/obj/item/organ/wings/grind_results() + if(flight_level <= WINGS_FLIGHTLESS) + return null + return list(/datum/reagent/flightpotion = 5) + +/obj/item/organ/wings/on_mob_insert(mob/living/carbon/receiver, special, movement_flags) + . = ..() + update_flight(receiver) + +/obj/item/organ/wings/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + fly?.Remove(organ_owner) + if(wings_open) + toggle_flight(organ_owner) + +//If some goober tries to varedit the flight_level instead of running the set_flight() proc, we take care of that +/obj/item/organ/wings/vv_edit_var(var_name, var_value) + if(var_name == NAMEOF(src, flight_level)) + set_flight(owner, var_value) + return TRUE + return ..() + +/obj/item/organ/wings/proc/set_flight(mob/living/carbon/organ_owner, state = null) + organ_owner ||= owner + if(!isnull(state) && state != flight_level) + //Force landing while old binds are still live + if(wings_open && !isnull(organ_owner)) + toggle_flight(organ_owner) + flight_level = state + setup_jetpack() + update_flight(organ_owner) + +/obj/item/organ/wings/proc/update_flight(mob/living/carbon/organ_owner) + organ_owner ||= owner + if(isnull(organ_owner)) + return + + fly?.Remove(organ_owner) + if(wings_open) + toggle_flight(organ_owner) + + if(flight_level <= WINGS_FLIGHTLESS) + return + if(QDELETED(fly)) + fly = new + fly.Grant(organ_owner) + +/obj/item/organ/wings/on_life(seconds_per_tick) + . = ..() + handle_flight(owner) + +///Called on_life(). Handle flight code and check if we're still flying +/obj/item/organ/wings/proc/handle_flight(mob/living/carbon/human/human) + if(!HAS_TRAIT_FROM(human, TRAIT_MOVE_FLOATING, SPECIES_FLIGHT_TRAIT)) + return FALSE + if(!can_fly()) + toggle_flight(human) + return FALSE + return TRUE + +///Check if still eligible for active flight (wings covered, atmosphere too thin, etc) +/obj/item/organ/wings/proc/can_fly() + var/mob/living/carbon/human/human = owner + if(IS_UNCONSCIOUS_OR_CRIT(human) || human.body_position == LYING_DOWN || isnull(human.client)) + return FALSE + if(flight_level < WINGS_AIRWORTHY) //Them wings are useless! + return FALSE + var/datum/bodypart_overlay/mutant/wings/wing_overlay = bodypart_overlay + if(!cant_hide && wing_overlay && (human.obscured_slots & wing_overlay.slot_blocker)) + to_chat(human, span_warning("Your clothing blocks your wings from extending!")) + return FALSE + var/turf/location = get_turf(human) + if(!location) + return FALSE + if(flight_level < WINGS_MAGIC) + var/datum/gas_mixture/environment = location.return_air() + if(environment?.return_pressure() < HAZARD_LOW_PRESSURE + 10) + to_chat(human, span_warning("The atmosphere is too thin for you to fly!")) + return FALSE + return TRUE + +///Check if we can passively drift in low-gravity. Used by WINGS_FLIGHTLESS jetpack component +/obj/item/organ/wings/proc/allow_flight() + if(!owner || !owner.client) + return FALSE + if(owner.has_gravity()) + return FALSE + var/datum/bodypart_overlay/mutant/wings/wing_overlay = bodypart_overlay + if(!cant_hide && wing_overlay && (owner.obscured_slots & wing_overlay.slot_blocker)) + return FALSE + var/datum/gas_mixture/current = owner.loc?.return_air() + if(current && (current.return_pressure() >= ONE_ATMOSPHERE * 0.85)) + return TRUE + return FALSE + +///Slipping but in the air? +/obj/item/organ/wings/proc/fly_slip(mob/living/carbon/human/human) + var/obj/buckled_obj + if(human.buckled) + buckled_obj = human.buckled + + to_chat(human, span_notice("Your wings spazz out and launch you!")) + + playsound(human.loc, 'sound/misc/slip.ogg', 50, TRUE, -3) + + for(var/obj/item/choking_hazard in human.held_items) + human.accident(choking_hazard) + + var/olddir = human.dir + + human.stop_pulling() + if(buckled_obj) + buckled_obj.unbuckle_mob(human) + step(buckled_obj, olddir) + else + human.AddComponent(/datum/component/force_move, get_ranged_target_turf(human, olddir, 4), TRUE) + return TRUE + +///UNSAFE PROC, should only be called through the Activate or other sources that check for CanFly +/obj/item/organ/wings/proc/toggle_flight(mob/living/carbon/human/human) + if(!HAS_TRAIT_FROM(human, TRAIT_MOVE_FLOATING, SPECIES_FLIGHT_TRAIT)) + human.physiology.stun_mod *= 2 + human.add_traits(list(TRAIT_MOVE_FLOATING, TRAIT_IGNORING_GRAVITY, TRAIT_NOGRAV_ALWAYS_DRIFT), SPECIES_FLIGHT_TRAIT) + human.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/wings) + human.AddElement(/datum/element/forced_gravity, 0) + ADD_TRAIT(human, TRAIT_PASSTABLE, SPECIES_FLIGHT_TRAIT) + open_wings() + to_chat(human, span_notice("You beat your wings and begin to hover gently above the ground...")) + human.set_resting(FALSE, TRUE) + human.refresh_gravity() + return + + human.physiology.stun_mod *= 0.5 + human.remove_traits(list(TRAIT_MOVE_FLOATING, TRAIT_IGNORING_GRAVITY, TRAIT_NOGRAV_ALWAYS_DRIFT), SPECIES_FLIGHT_TRAIT) + human.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/wings) + human.RemoveElement(/datum/element/forced_gravity, 0) + REMOVE_TRAIT(human, TRAIT_PASSTABLE, SPECIES_FLIGHT_TRAIT) + to_chat(human, span_notice("You settle gently back onto the ground...")) + close_wings() + human.refresh_gravity() + +///Spread wings. Activate Jetpack component +/obj/item/organ/wings/proc/open_wings() + wings_open = TRUE + if(has_open_sprite) + var/datum/bodypart_overlay/mutant/wings/overlay = bodypart_overlay + overlay?.open_wings() + owner.update_body_parts() + SEND_SIGNAL(src, COMSIG_WINGS_OPENED, owner) + +///Close wings. Deactivate jetpack component +/obj/item/organ/wings/proc/close_wings() + wings_open = FALSE + if(has_open_sprite) + var/datum/bodypart_overlay/mutant/wings/overlay = bodypart_overlay + overlay?.close_wings() + owner.update_body_parts() + if(isturf(owner?.loc)) + var/turf/location = loc + location.Entered(src, NONE) + SEND_SIGNAL(src, COMSIG_WINGS_CLOSED, owner) + +///hud action for starting and stopping flight +/datum/action/innate/flight + name = "Toggle Flight" + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_IMMOBILE|AB_CHECK_INCAPACITATED + button_icon = 'modular_darkpack/master_files/icons/hud/actions.dmi' // DARKPACK EDIT CHANGE - ORIGINAL: button_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "fly" // DARKPACK EDIT CHANGE - ORIGINAL: button_icon_state = "flight" + +/datum/action/innate/flight/Activate() + var/mob/living/carbon/human/human = owner + var/obj/item/organ/wings/wings = human.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + if(wings?.can_fly()) + wings.toggle_flight(human) ///Bodypart overlay of default wings. Does not have any wing functionality /datum/bodypart_overlay/mutant/wings @@ -35,3 +274,76 @@ /datum/bodypart_overlay/mutant/wings/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner, mob/living/carbon/owner) return ..() && !(bodypart_owner.owner?.obscured_slots & slot_blocker) + +/datum/bodypart_overlay/mutant/wings/proc/open_wings() + return + +/datum/bodypart_overlay/mutant/wings/proc/close_wings() + return + +///Bodypart overlay of functional wings, including open and close sprite functionality! +/datum/bodypart_overlay/mutant/wings/functional + ///Are our wings currently open? Change through open_wings or close_wings() + VAR_PRIVATE/wings_open = FALSE + +/datum/bodypart_overlay/mutant/wings/functional/get_global_feature_list() + if(wings_open) + return SSaccessories.feature_list[FEATURE_WINGS_OPEN] + return ..() + +///Update our wingsprite to the open wings variant +/datum/bodypart_overlay/mutant/wings/functional/open_wings() + wings_open = TRUE + feature_key = FEATURE_WINGS_OPEN + set_appearance_from_name(sprite_datum.name) //It'll look for the same name again, but this time from the open wings list + +///Update our wingsprite to the closed wings variant +/datum/bodypart_overlay/mutant/wings/functional/close_wings() + wings_open = FALSE + feature_key = initial(feature_key) + set_appearance_from_name(sprite_datum.name) + +/datum/bodypart_overlay/mutant/wings/functional/icon_render_key(obj/item/bodypart/limb) + . = ..() + . += wings_open ? "open" : "closed" + +///angel wings, which relate to humans. comes with holiness. +/obj/item/organ/wings/angel + name = "angel wings" + desc = "Holier-than-thou attitude not included." + sprite_accessory_override = /datum/sprite_accessory/wings_open/angel + + organ_traits = list(TRAIT_HOLY) + +///dragon wings, which relate to lizards. +/obj/item/organ/wings/dragon + name = "dragon wings" + desc = "Hey, HEY- NOT lizard wings. Dragon wings. Mighty dragon wings." + sprite_accessory_override = /datum/sprite_accessory/wings/dragon + +///robotic wings, which relate to androids. +/obj/item/organ/wings/robotic + name = "robotic wings" + desc = "Using microscopic hover-engines, or \"microwings,\" as they're known in the trade, these tiny devices are able to lift a few grams at a time. Gather enough of them, and you can lift impressively large things." + organ_flags = ORGAN_ROBOTIC + sprite_accessory_override = /datum/sprite_accessory/wings/robotic + +///skeletal wings, which relate to skeletal races. +/obj/item/organ/wings/skeleton + name = "skeletal wings" + desc = "Powered by pure edgy-teenager-notebook-scribblings. Just kidding. But seriously, how do these keep you flying?!" + sprite_accessory_override = /datum/sprite_accessory/wings/skeleton + +///fly wings, which relate to flies. +/obj/item/organ/wings/fly + name = "fly wings" + desc = "Fly as a fly." + sprite_accessory_override = /datum/sprite_accessory/wings/fly + +///slime wings, which relate to slimes. +/obj/item/organ/wings/slime + name = "slime wings" + desc = "How does something so squishy even fly?" + sprite_accessory_override = /datum/sprite_accessory/wings/slime + +#undef DEFAULT_WING_FORCE diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index ee197db3eeac..2f57cc04f5dc 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -523,7 +523,9 @@ . += wait_time if (anim_times && !sync_blinking) // Make sure that we're somewhat in sync with the other eye - animate(time = anim_times[i + 1] - wait_time) + var/offset_time = anim_times[i + 1] - wait_time + if(offset_time) // For some reason having time == 0 in this case breaks animate + animate(time = offset_time) animate(alpha = 255, time = 0) animate(time = BLINK_DURATION) if (i != cycles) diff --git a/code/modules/surgery/organs/internal/lungs/_lungs.dm b/code/modules/surgery/organs/internal/lungs/_lungs.dm index e3f76278b6a3..8efbbe44f135 100644 --- a/code/modules/surgery/organs/internal/lungs/_lungs.dm +++ b/code/modules/surgery/organs/internal/lungs/_lungs.dm @@ -612,7 +612,7 @@ // Breath has more than 0 moles of gas. // Route gases through mask filter if breather is wearing one. var/obj/item/clothing/mask/worn_mask = breather.get_item_by_slot(ITEM_SLOT_MASK) - if(istype(worn_mask) && (worn_mask.clothing_flags & GAS_FILTERING) && worn_mask.has_filter) + if(istype(worn_mask) && worn_mask.has_filter) breath = worn_mask.consume_filter(breath) // Breath has 0 moles of gas, and we can breathe space else if(HAS_TRAIT(breather, TRAIT_NO_BREATHLESS_DAMAGE)) diff --git a/code/modules/tgui_panel/audio.dm b/code/modules/tgui_panel/audio.dm index 680696159943..93de5c1e0aa7 100644 --- a/code/modules/tgui_panel/audio.dm +++ b/code/modules/tgui_panel/audio.dm @@ -40,3 +40,7 @@ if(!is_ready()) return window.send_message("audio/stopMusic") + +// Dummy reference so BYOND includes the chat highlight sounds in the client resource pack, if it isn't included in any `.DM` file. +/datum/tgui_panel + var/static/list/_chat_highlight_sounds = list('sound/misc/highlight_sounds/Beep.ogg') diff --git a/code/modules/tgui_panel/tgui_panel.dm b/code/modules/tgui_panel/tgui_panel.dm index 73e54464f636..28e76fd268fe 100644 --- a/code/modules/tgui_panel/tgui_panel.dm +++ b/code/modules/tgui_panel/tgui_panel.dm @@ -107,25 +107,10 @@ if(type == "verbs/request_verbs") client.init_verbs() - return TRUE + if(!client?.holder) + return TRUE - if(type == "verbs/request_typepaths") - var/parent_text = payload["parent"] - var/browse_type = text2path(parent_text) - if(isnull(browse_type)) - browse_type = /datum - var/list/children = list() - for(var/child_type in typesof(browse_type)) - if(child_type == browse_type) - continue - // Only include direct children (one level deeper) - var/child_text = "[child_type]" - var/parent_len = length(parent_text || "/datum") - var/remainder = copytext(child_text, parent_len + 1) - if(findtext(remainder, "/", 2)) - continue - children += child_text - window.send_message("verbs/typepaths", list("parent" = parent_text, "paths" = children)) + window.send_asset(get_asset_datum(/datum/asset/json/spawn_menu)) return TRUE if(type == "verbs/request_targets") @@ -175,6 +160,8 @@ var/target = resolve_verb_target(verb_path) if(!target) return TRUE + if(!(verb_path in client.verbs) && !(client.mob && (verb_path in client.mob.verbs))) + return TRUE var/list/resolved_args = resolve_invoke_args(payload["args"], meta.arguments) call(target, meta.body_path)(resolved_args) return TRUE @@ -193,10 +180,14 @@ var/value = raw_args[meta.name] if(meta.arg_type & VERB_ARG_TYPE_NUM) value = text2num(value) - else if(!(meta.arg_type & VERB_ARG_TYPE_TYPEPATH) && istext(value)) + else if(meta.arg_type & VERB_ARG_TYPE_ENTITY && istext(value)) var/located = locate(value) - if(located) - value = located + if(!located) + continue + var/list/valid_targets = meta.get_targets(client) + if(length(valid_targets) && !(located in valid_targets)) + continue + value = located resolved[meta.name] = value return resolved diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 0fcde4450fb2..1b69c2bc6501 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -230,6 +230,7 @@ #include "language_transfer.dm" #include "leash.dm" #include "lesserform.dm" +#include "light_replacer.dm" #include "limbsanity.dm" #include "ling_decap.dm" #include "liver.dm" diff --git a/code/modules/unit_tests/combat.dm b/code/modules/unit_tests/combat.dm index 113abac1339c..0072e999d27f 100644 --- a/code/modules/unit_tests/combat.dm +++ b/code/modules/unit_tests/combat.dm @@ -90,7 +90,7 @@ TEST_ASSERT_EQUAL(victim.loc.x, run_loc_floor_bottom_left.x + 2, "Victim wasn't moved back after being pushed") TEST_ASSERT(!victim.has_status_effect(/datum/status_effect/incapacitating/knockdown), "Victim was knocked down despite not being against a wall") - TEST_ASSERT_EQUAL(victim.get_active_held_item(), toolbox, "Victim dropped toolbox despite not being against a wall") + //TEST_ASSERT_EQUAL(victim.get_active_held_item(), toolbox, "Victim dropped toolbox despite not being against a wall") DARKPACK EDIT REMOVAL - 1359 "Re-adds Potence Throwing" adds disarming without being against a wall so we don't care about this anymore attacker.forceMove(get_step(attacker, EAST)) diff --git a/code/modules/unit_tests/interaction_door.dm b/code/modules/unit_tests/interaction_door.dm index 3d67b9b8ba1d..0c2e180ca7a8 100644 --- a/code/modules/unit_tests/interaction_door.dm +++ b/code/modules/unit_tests/interaction_door.dm @@ -27,3 +27,48 @@ click_wrapper(janitor, real_door) TEST_ASSERT(!real_door.density, "Airlock could not be opened by janitor keyring") + +/// Tests that door remotes can perform their various functions on airlocks +/datum/unit_test/door_remote + +/datum/unit_test/door_remote/Run() + var/mob/living/carbon/human/consistent/captain = EASY_ALLOCATE() + var/obj/item/door_remote/remote = EASY_ALLOCATE() + var/obj/machinery/door/airlock/instant/entrance = allocate(/obj/machinery/door/airlock/instant, get_step(run_loc_floor_bottom_left, EAST)) + + entrance.req_access = list(ACCESS_COMMAND) + captain.put_in_active_hand(remote) + + click_wrapper(captain, entrance) + TEST_ASSERT(entrance.density, "Door remote opened a door it should not have had access to in melee") + + remote.access_list = list(ACCESS_COMMAND) + click_wrapper(captain, entrance) + TEST_ASSERT(!entrance.density, "Door remote failed to open a door it should have had access to in melee") + + entrance.req_access = null + captain.forceMove(run_loc_floor_top_right) + click_wrapper(captain, entrance) + TEST_ASSERT(entrance.density, "Door remote failed to close a door with no access requirements at range") + + remote.attack_self(captain) + click_wrapper(captain, entrance) + TEST_ASSERT(entrance.locked, "Door remote failed to bolt a door") + + remote.attack_self(captain) + click_wrapper(captain, entrance) + TEST_ASSERT(entrance.emergency, "Door remote failed to set a door to emergency access") + + remote.obj_flags = EMAGGED + remote.attack_self(captain) + click_wrapper(captain, entrance) + TEST_ASSERT(entrance.isElectrified(), "Door remote failed to shock a door while emagged") + + remote.attack_self(captain) + click_wrapper(captain, entrance) + TEST_ASSERT(entrance.main_power_timer, "Door remote failed to depower a door while emagged") + + entrance.unbolt() + remote.attack_self(captain) + click_wrapper(captain, entrance) + TEST_ASSERT(entrance.density, "Door remote successfully opened a door that was depowered") diff --git a/code/modules/unit_tests/language_key_conflicts.dm b/code/modules/unit_tests/language_key_conflicts.dm index 4ae8443e9e0c..ca5c42946511 100644 --- a/code/modules/unit_tests/language_key_conflicts.dm +++ b/code/modules/unit_tests/language_key_conflicts.dm @@ -4,12 +4,12 @@ /datum/unit_test/language_key_conflicts/Run() var/list/used_keys = list() - for(var/datum/language/language as anything in subtypesof(/datum/language)) + for(var/datum/language/language as anything in valid_subtypesof(/datum/language)) var/name = language::name var/key = language::key if(!key) - TEST_FAIL("[name] ([language]) does not have a prefix!") - else if(used_keys[key]) + continue + if(used_keys[key]) var/datum/language/conflicting_language = used_keys[key] TEST_FAIL("[name] ([language]) uses the '[key]' prefix, which is also used by [conflicting_language::name] ([conflicting_language])!") else diff --git a/code/modules/unit_tests/light_replacer.dm b/code/modules/unit_tests/light_replacer.dm new file mode 100644 index 000000000000..21605f5d02a6 --- /dev/null +++ b/code/modules/unit_tests/light_replacer.dm @@ -0,0 +1,43 @@ +/// Tests whether a [normal/bluespace] light replacer is capable of replacing a [broken/absent/burnt] light within a [near/far] [normal/bulb/floor] light fixure, and that resources are properly consumed, and all that. +/datum/unit_test/light_replacer + +/datum/unit_test/light_replacer/Run() + var/mob/living/carbon/human/consistent/janitor = EASY_ALLOCATE() + var/obj/item/lightreplacer/replacer = EASY_ALLOCATE() + var/obj/item/lightreplacer/blue/rangedreplacer = EASY_ALLOCATE() + var/obj/machinery/light/current_close_light = allocate(/obj/machinery/light/unbroken, run_loc_floor_bottom_left) + var/obj/machinery/light/far_bulb = allocate(/obj/machinery/light/small/unbroken, run_loc_floor_top_right) + + janitor.put_in_active_hand(replacer) + far_bulb.break_light_tube(TRUE) + + click_wrapper(janitor, current_close_light) + TEST_ASSERT_EQUAL(replacer.uses, initial(replacer.uses), "Light replacer consumed resources replacing an already intact tube") + + click_wrapper(janitor, far_bulb) + TEST_ASSERT_EQUAL(far_bulb.status, LIGHT_BROKEN, "Normal light replacer fixed a light from range") + + current_close_light.break_light_tube(TRUE) + click_wrapper(janitor, current_close_light) + TEST_ASSERT_EQUAL(current_close_light.status, LIGHT_OK, "Light replacer failed to replace a tube") + TEST_ASSERT_NOTEQUAL(replacer.uses, initial(replacer.uses), "Light replacer did not consume resources replacing a tube") + + janitor.put_in_active_hand(rangedreplacer, TRUE) + qdel(current_close_light) + current_close_light = allocate(/obj/machinery/light/floor/unbroken, run_loc_floor_bottom_left) + current_close_light.burn_out() + + click_wrapper(janitor, far_bulb) + TEST_ASSERT_EQUAL(far_bulb.status, LIGHT_OK, "Ranged light replacer failed to replace broken bulb from range") + + click_wrapper(janitor, current_close_light) + TEST_ASSERT_EQUAL(current_close_light.status, LIGHT_OK, "Ranged light replacer failed to replace burnt floor bulb in melee") + +/obj/machinery/light/unbroken + allow_break_on_init = FALSE + +/obj/machinery/light/floor/unbroken + allow_break_on_init = FALSE + +/obj/machinery/light/small/unbroken + allow_break_on_init = FALSE diff --git a/code/modules/unit_tests/screenshots/screenshot_digi_leg_test.png b/code/modules/unit_tests/screenshots/screenshot_digi_leg_test.png index cd2bed113601..e845f2b58e60 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_digi_leg_test.png and b/code/modules/unit_tests/screenshots/screenshot_digi_leg_test.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_shifter_dire.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_shifter_dire.png index f881901300db..3a474d0fb469 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_shifter_dire.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_shifter_dire.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_shifter_feral.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_shifter_feral.png index bfb6d4dd4bab..f5cb13d58c59 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_shifter_feral.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_shifter_feral.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_shifter_war.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_shifter_war.png index f26cac5b753e..940a2a873da7 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_shifter_war.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_shifter_war.png differ diff --git a/code/modules/unit_tests/weird_food.dm b/code/modules/unit_tests/weird_food.dm index a3b3f0fe203b..0df0c441a82e 100644 --- a/code/modules/unit_tests/weird_food.dm +++ b/code/modules/unit_tests/weird_food.dm @@ -3,7 +3,7 @@ /datum/unit_test/moth_food/Run() var/obj/item/clothing/suit/armor/bulletproof/light_snack = allocate(/obj/item/clothing/suit/armor/bulletproof) - light_snack.create_moth_snack() + light_snack.moth_snack = light_snack.create_moth_snack() var/datum/component/edible/eatability = light_snack.moth_snack.GetComponent(/datum/component/edible) eatability.eat_time = 0 diff --git a/code/modules/vending/coffee.dm b/code/modules/vending/coffee.dm index 29eeb0018b5a..26d47f8e0028 100644 --- a/code/modules/vending/coffee.dm +++ b/code/modules/vending/coffee.dm @@ -32,6 +32,15 @@ all_products_free = TRUE // DARKPACK EDIT ADD END +/obj/machinery/vending/coffee/Initialize(mapload) + . = ..() + if(!mapload || !is_station_level(z) || !HAS_TRAIT(SSstation, STATION_TRAIT_VENDING_SHORTAGE)) + return + + for(var/datum/data/vending_product/product_record as anything in product_records + coin_records + hidden_records) + product_record.amount = 0 + credits_contained += rand(1, 5) + /obj/item/vending_refill/coffee machine_name = "Solar's Best Hot Drinks" icon_state = "refill_joe" diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index aab8ab39e8a2..fa08fef6a726 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -54,6 +54,15 @@ /datum/reagent/consumable/ethanol/neurotoxin = 1, ) +/obj/machinery/vending/cola/Initialize(mapload) + . = ..() + if(!mapload || !is_station_level(z) || !HAS_TRAIT(SSstation, STATION_TRAIT_VENDING_SHORTAGE)) + return + + for(var/datum/data/vending_product/product_record as anything in product_records + coin_records + hidden_records) + product_record.amount = 0 + credits_contained += rand(1, 5) + /obj/machinery/vending/cola/on_dispense(obj/item/vended_item, dispense_returned = FALSE) // Only apply to newly dispensed items if(dispense_returned) diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm index 8c85066ead9b..5bb2f4bf4033 100644 --- a/code/modules/vending/snack.dm +++ b/code/modules/vending/snack.dm @@ -46,6 +46,15 @@ extra_price = PAYCHECK_CREW payment_department = ACCOUNT_SRV +/obj/machinery/vending/snack/Initialize(mapload) + . = ..() + if(!mapload || !is_station_level(z) || !HAS_TRAIT(SSstation, STATION_TRAIT_VENDING_SHORTAGE)) + return + + for(var/datum/data/vending_product/product_record as anything in product_records + coin_records + hidden_records) + product_record.amount = 0 + credits_contained += rand(1, 5) + /obj/item/vending_refill/snack machine_name = "Getmore Chocolate Corp" diff --git a/code/modules/vending/vendor/_vending.dm b/code/modules/vending/vendor/_vending.dm index 06e39084b98c..9dd21633c09d 100644 --- a/code/modules/vending/vendor/_vending.dm +++ b/code/modules/vending/vendor/_vending.dm @@ -187,6 +187,11 @@ //the path of the fish_source datum to use for the fishing_spot component var/fish_source_path = /datum/fish_source/vending + /** + * used to check for discounting and for displaying discounted prices in the UI; not a static proc-local var because the code for displaying and applying + * discounts isn't unified across DM and tgui + */ + var/static/datum/id_trim/job/big_boss_trim = /datum/id_trim/job/captain /datum/armor/machinery_vending melee = 20 diff --git a/code/modules/vending/vendor/inventory.dm b/code/modules/vending/vendor/inventory.dm index 9aa454275b7b..5d04238d55f4 100644 --- a/code/modules/vending/vendor/inventory.dm +++ b/code/modules/vending/vendor/inventory.dm @@ -189,7 +189,7 @@ */ // DARKPACK EDIT CHANGE START - ECONOMY - if(!proceed_payment(card_used, living_user, item_record, price_to_use, params["discountless"])) + if(!proceed_payment(card_used, living_user, item_record, price_to_use, params["premium"])) return if(last_shopper != REF(user) || purchase_message_cooldown < world.time) @@ -270,9 +270,9 @@ * mob_paying - the mob that is trying to purchase the item. * product_to_vend - the product record of the item we're trying to vend. * price_to_use - price of the item we're trying to vend. - * discountless - whether or not to apply discounts + * premium - whether or not to apply premium pricing */ -/obj/machinery/vending/proc/proceed_payment(obj/item/card/credit/paying_creditcard, mob/living/mob_paying, datum/data/vending_product/product_to_vend, price_to_use, discountless) +/obj/machinery/vending/proc/proceed_payment(obj/item/card/credit/paying_creditcard, mob/living/mob_paying, datum/data/vending_product/product_to_vend, price_to_use, premium) PROTECTED_PROC(TRUE) //returned items are free @@ -283,8 +283,8 @@ var/datum/bank_account/account = paying_creditcard.registered_account //deduct money from person - //if(!discountless && account.account_job?.paycheck_department == payment_department) - // price_to_use = max(round(price_to_use * DEPARTMENT_DISCOUNT), 1) //No longer free, but signifigantly cheaper. + // if(discount_check(paying_id_card, premium)) + // price_to_use = max(round(price_to_use * DEPARTMENT_DISCOUNT), 1) //No longer free, but signifigantly cheaper. if(attempt_charge(src, mob_paying, price_to_use) & COMPONENT_OBJ_CANCEL_CHARGE) speak("You do not possess the funds to purchase [product_to_vend.name].") flick(icon_deny,src) @@ -296,3 +296,11 @@ credits_contained += round(price_to_use * VENDING_CREDITS_COLLECTION_AMOUNT) return TRUE // DARKPACK EDIT END START - ECONOMY + +/obj/machinery/vending/proc/discount_check(obj/item/card/id/paying_id_card, premium) + PROTECTED_PROC(TRUE) + if(premium) + return FALSE + var/datum/bank_account/account = paying_id_card.registered_account + //captain gets a discount in every department + return istype(paying_id_card.trim, big_boss_trim) || account.account_job?.paycheck_department == payment_department diff --git a/code/modules/vending/vendor/ui_data.dm b/code/modules/vending/vendor/ui_data.dm index 1a88d66d3bc0..0614f22e7680 100644 --- a/code/modules/vending/vendor/ui_data.dm +++ b/code/modules/vending/vendor/ui_data.dm @@ -114,6 +114,7 @@ user_data = list() user_data["name"] = card_used.registered_account.account_holder user_data["cash"] = fetch_balance_to_use(card_used) + held_cash + user_data["is_captain_card"] = FALSE if(card_used.registered_account.account_job) user_data["job"] = card_used.registered_account.account_job.title user_data["department"] = card_used.registered_account.account_job.paycheck_department diff --git a/code/modules/wiremod/dcs_components/component_boris_circuit_container.dm b/code/modules/wiremod/dcs_components/component_boris_circuit_container.dm index 81e950991012..289e7c2d82de 100644 --- a/code/modules/wiremod/dcs_components/component_boris_circuit_container.dm +++ b/code/modules/wiremod/dcs_components/component_boris_circuit_container.dm @@ -16,7 +16,7 @@ . = ..() RegisterSignal(parent, COMSIG_ATOM_ATTACK_AI, PROC_REF(on_ai_click)) var/atom/parent_atom = parent - var/image/indicator_image = image('icons/mob/huds/hud.dmi', parent_atom, "hudtracking", pixel_x = 8) + var/image/indicator_image = image(DEFAULT_HUDS_DMI, parent_atom, "hudtracking", pixel_x = 8) SET_PLANE_EXPLICIT(indicator_image, ABOVE_LIGHTING_PLANE, parent_atom) indicator_weakref = WEAKREF(parent_atom.add_alt_appearance( /datum/atom_hud/alternate_appearance/basic/ais, diff --git a/config/darkpack_config.txt b/config/darkpack_config.txt index e4a12dce3c0f..20ac46815817 100644 --- a/config/darkpack_config.txt +++ b/config/darkpack_config.txt @@ -51,6 +51,17 @@ ROUNDSTART_SPLATS splat_kinfolk ROUNDSTART_SPLATS splat_garou ROUNDSTART_SPLATS splat_corax +#WHITELISTED_SPLATS splat_garou +#WHITELISTED_SPLATS splat_corax + +#WHITELISTED_CLANS baali +#WHITELISTED_CLANS healer_salubri +#WHITELISTED_CLANS warrior_salubri +#WHITELISTED_CLANS true_brujah +#WHITELISTED_CLANS cappadocian +#WHITELISTED_CLANS harbinger + + ## If dead people and ghosts can LOOC to people who are alive. DISABLE_GHOST_LOOC diff --git a/config/dynamic.toml b/config/dynamic.toml index 970281b85fff..dde43057df73 100644 --- a/config/dynamic.toml +++ b/config/dynamic.toml @@ -364,7 +364,7 @@ repeatable_weight_decrease = 2 repeatable = 1 minimum_required_age = 0 -["Midround Mass Changelings"] +["Mass Changelings"] weight.1 = 0 weight.2 = 3 weight.3 = 4 @@ -437,7 +437,7 @@ repeatable_weight_decrease = 2 repeatable = 1 minimum_required_age = 0 -["Midround Mass Traitors"] +["Mass Traitors"] weight.1 = 0 weight.2 = 3 weight.3 = 8 diff --git a/html/changelogs/archive/2026-08.yml b/html/changelogs/archive/2026-08.yml index cbec9ff4d204..15be0c5fb280 100644 --- a/html/changelogs/archive/2026-08.yml +++ b/html/changelogs/archive/2026-08.yml @@ -130,9 +130,7 @@ 2026-08-15: Dangerlurking: - rscadd: Adds path of Asakku along with its V20 book description. - - rscadd: 'Adds the otherworldly bearing in the morality defines. - - :cl:' + - rscadd: 'Adds the otherworldly bearing in the morality defines.' FalloutFalcon: - code_imp: Fixes Russian shit code relating to social roles on npcs - code_imp: Optimizes walls by not rendering frills when they aren't visible @@ -237,10 +235,56 @@ Stutternov: - bugfix: Fixes issue on Dread Gaze that was causing people to run away for entire rounds. Adjusted to 2 minute timer. + - bugfix: Fixes issue on Dread Gaze that was causing people to run away for entire + rounds. Adjusted to 2 minute timer. chazzyjazzy: - rscdel: Removes Beekeeping supply pack from the warehouse - rscdel: Removes Monkey Cubes supply pack from the warehouse + breadcrombs: + - sound: the vicissitude surgery implant toolset has been given a new more organic + sound +2026-08-22: + FalloutFalcon: + - rscadd: Adds a subtype to yawns for a covered yawn to prevent propagation + - balance: Willpower scales the change for a yawn to propagate to you + - balance: You only roll a chance for automatic yawn propagation from the first + yawn you witness + - balance: Yawn propagation only happens on half of yawns + breadcrombs: + - rscadd: Bonecrafting now drops the brain along with all head organs when used + on a corpses + - rscadd: Bonecrafting can now deal damage to selected target limbs rather than + the chest all the time and can also wound +2026-08-23: + ShirouAjisai: + - rscadd: Added phone contacts to every phone. You know your own co-workers now.. + waow.... +2026-08-24: + Stutternov: + - rscadd: Adds shove-knockback with active potence + - rscadd: Adds disarming based on your strength roll vs opponents overall strength. +2026-08-26: + KCartridge: + - rscadd: Four Pride flags +2026-08-27: + breadcrombs: + - rscadd: Medicine Skill level 3 and 4 allows better wound tending on patients 2026-08-28: + Dusk-a: + - balance: Only fera can use fetishes now + FalloutFalcon: + - balance: open flames on tables wont set fire to turfs + - balance: candles wont set fire to turfs + cam_dev: + - rscadd: adds anthropic taste quirk for kindred + chazzyjazzy: + - rscadd: adds oversized jacket, trenchcoat (alt) and a massive furry winter jacket + to the loadout which can all be recolored + dwinters99: + - balance: Dagger of Retribution is now in line with the knife + kimesik: + - rscadd: Giovannis and Leopoldites automatically learn Italian and Latin respectively. + - rscadd: Banu Haqim and Setites automatically learn Arabic. SoreYew: - map: Changed Armory Stock - map: Added bathroom to Millennium Tower 3rd floor, and a washing machine to the @@ -249,6 +293,27 @@ the 1st floor - map: added a janitorial closet to the 1st floor 2026-08-29: + FalloutFalcon: + - rscadd: Add Bawns; a barrier that surrounds and protects caerns + - bugfix: BSD are actually givin the wrymtained trait (not the sprite) + - bugfix: Haunted lights should actually break. + Psychodeath42: + - bugfix: Mask of a Thousand Faces now properly hides your hideous features + chazzyjazzy: + - admin: ritual runes now print unique logs in game.log, Ward and Blood curse rituals + print the specific caster as well as the victim in attack.log + - refactor: lampposts are now an /obj/machinery/light/floor instead of an /obj/structure, + please run the updatepaths script!!! dwinters99: + - balance: Bogatyr armor reduced in effectiveness to be equal to Police armor + - rscadd: '2 new sets of Bogatyr armor: Captain armor (admin-spawn or mapspawn only, + equal to old Bogatyr armor) and Heavy Bone Armor (craftable, equal to EOD armor, + requires 7 human corpses and 10 bloodpoints)' - rscdel: Sabbat no longer are assigned an antag datum - bugfix: removes a regression with torches caused by a duplicate file +2026-08-31: + FalloutFalcon: + - code_imp: Clampings to appearance is properly enforced + FalloutFalcon, ShirouAjisai: + - rscadd: Added garou accessories for crinos. All credit goes to Fallcon for the + backend work here. diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 81f3e155f532..0e26139a7929 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/mob/actions/actions_revenant.dmi b/icons/mob/actions/actions_revenant.dmi index da015b8c0ba2..088341fa2d6f 100644 Binary files a/icons/mob/actions/actions_revenant.dmi and b/icons/mob/actions/actions_revenant.dmi differ diff --git a/icons/mob/clothing/digi_template_equipment.dmi b/icons/mob/clothing/digi_template_equipment.dmi index 319bd875041c..4514670741f6 100644 Binary files a/icons/mob/clothing/digi_template_equipment.dmi and b/icons/mob/clothing/digi_template_equipment.dmi differ diff --git a/icons/mob/clothing/tail_suit_mask.dmi b/icons/mob/clothing/tail_suit_mask.dmi new file mode 100644 index 000000000000..d57e5db611f9 Binary files /dev/null and b/icons/mob/clothing/tail_suit_mask.dmi differ diff --git a/icons/mob/inhands/items/tiles_lefthand.dmi b/icons/mob/inhands/items/tiles_lefthand.dmi index 8bf2417299d6..49e0bbd6e0f6 100644 Binary files a/icons/mob/inhands/items/tiles_lefthand.dmi and b/icons/mob/inhands/items/tiles_lefthand.dmi differ diff --git a/icons/mob/inhands/items/tiles_righthand.dmi b/icons/mob/inhands/items/tiles_righthand.dmi index b4376dee0ab6..a6382a30ea56 100644 Binary files a/icons/mob/inhands/items/tiles_righthand.dmi and b/icons/mob/inhands/items/tiles_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/chainsaw_lefthand.dmi b/icons/mob/inhands/weapons/chainsaw_lefthand.dmi index e7da8d0ee5da..25804372784d 100644 Binary files a/icons/mob/inhands/weapons/chainsaw_lefthand.dmi and b/icons/mob/inhands/weapons/chainsaw_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/chainsaw_righthand.dmi b/icons/mob/inhands/weapons/chainsaw_righthand.dmi index 902c2b4ee07a..9c2e5e256617 100644 Binary files a/icons/mob/inhands/weapons/chainsaw_righthand.dmi and b/icons/mob/inhands/weapons/chainsaw_righthand.dmi differ diff --git a/icons/mob/simple/icemoon/icemoon_monsters.dmi b/icons/mob/simple/icemoon/icemoon_monsters.dmi index a909a7ca7b5a..edc3d4d566d3 100644 Binary files a/icons/mob/simple/icemoon/icemoon_monsters.dmi and b/icons/mob/simple/icemoon/icemoon_monsters.dmi differ diff --git a/icons/mob/simple/lavaland/lavaland_monsters.dmi b/icons/mob/simple/lavaland/lavaland_monsters.dmi index 1b7be6f3f091..26feb460e12f 100644 Binary files a/icons/mob/simple/lavaland/lavaland_monsters.dmi and b/icons/mob/simple/lavaland/lavaland_monsters.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_construction.dmi b/icons/obj/clothing/modsuit/mod_construction.dmi index c8f1a2f4960a..c1448e49a4db 100644 Binary files a/icons/obj/clothing/modsuit/mod_construction.dmi and b/icons/obj/clothing/modsuit/mod_construction.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index 4e4b07b70fff..3bf20f1187ee 100644 Binary files a/icons/obj/clothing/modsuit/mod_modules.dmi and b/icons/obj/clothing/modsuit/mod_modules.dmi differ diff --git a/icons/obj/fulton.dmi b/icons/obj/fulton.dmi index 3d92a8fea3a9..b9d6b625d28a 100644 Binary files a/icons/obj/fulton.dmi and b/icons/obj/fulton.dmi differ diff --git a/icons/obj/medical/syringe.dmi b/icons/obj/medical/syringe.dmi index 2c98f8b11321..bed211e7f108 100644 Binary files a/icons/obj/medical/syringe.dmi and b/icons/obj/medical/syringe.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index f284a1539b58..8f00571956f6 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/mining_zones/terrain.dmi b/icons/obj/mining_zones/terrain.dmi index edbd2958a691..2d0c2e037028 100644 Binary files a/icons/obj/mining_zones/terrain.dmi and b/icons/obj/mining_zones/terrain.dmi differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index 3d1258039000..a83dc3cdfae9 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index 166879dae575..77732e5f3c28 100644 Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ diff --git a/icons/obj/weapons/chainsaw.dmi b/icons/obj/weapons/chainsaw.dmi index b2a0385e70b6..a791bb1d64d4 100644 Binary files a/icons/obj/weapons/chainsaw.dmi and b/icons/obj/weapons/chainsaw.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index a0afc5be4f6e..6663a5f3b966 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/turf/floors/carpet_bear.dmi b/icons/turf/floors/carpet_bear.dmi new file mode 100644 index 000000000000..e89ce169c97c Binary files /dev/null and b/icons/turf/floors/carpet_bear.dmi differ diff --git a/icons/turf/floors/carpet_bear.png b/icons/turf/floors/carpet_bear.png new file mode 100644 index 000000000000..d06f37097069 Binary files /dev/null and b/icons/turf/floors/carpet_bear.png differ diff --git a/icons/turf/floors/carpet_bear.png.toml b/icons/turf/floors/carpet_bear.png.toml new file mode 100644 index 000000000000..28871a8913c9 --- /dev/null +++ b/icons/turf/floors/carpet_bear.png.toml @@ -0,0 +1,2 @@ +output_name = "carpet_bear" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_bearpolar.dmi b/icons/turf/floors/carpet_bearpolar.dmi new file mode 100644 index 000000000000..50f9a8ea63e7 Binary files /dev/null and b/icons/turf/floors/carpet_bearpolar.dmi differ diff --git a/icons/turf/floors/carpet_bearpolar.png b/icons/turf/floors/carpet_bearpolar.png new file mode 100644 index 000000000000..35935558e178 Binary files /dev/null and b/icons/turf/floors/carpet_bearpolar.png differ diff --git a/icons/turf/floors/carpet_bearpolar.png.toml b/icons/turf/floors/carpet_bearpolar.png.toml new file mode 100644 index 000000000000..02900cd75329 --- /dev/null +++ b/icons/turf/floors/carpet_bearpolar.png.toml @@ -0,0 +1,2 @@ +output_name = "carpet_bearpolar" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_carp.dmi b/icons/turf/floors/carpet_carp.dmi new file mode 100644 index 000000000000..90b9d549fce1 Binary files /dev/null and b/icons/turf/floors/carpet_carp.dmi differ diff --git a/icons/turf/floors/carpet_carp.png b/icons/turf/floors/carpet_carp.png new file mode 100644 index 000000000000..4379e24a438e Binary files /dev/null and b/icons/turf/floors/carpet_carp.png differ diff --git a/icons/turf/floors/carpet_carp.png.toml b/icons/turf/floors/carpet_carp.png.toml new file mode 100644 index 000000000000..ae2f85f7f5d4 --- /dev/null +++ b/icons/turf/floors/carpet_carp.png.toml @@ -0,0 +1,2 @@ +output_name = "carpet_carp" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_goliath.dmi b/icons/turf/floors/carpet_goliath.dmi new file mode 100644 index 000000000000..d78f7294a5ae Binary files /dev/null and b/icons/turf/floors/carpet_goliath.dmi differ diff --git a/icons/turf/floors/carpet_goliath.png b/icons/turf/floors/carpet_goliath.png new file mode 100644 index 000000000000..4f45c4081272 Binary files /dev/null and b/icons/turf/floors/carpet_goliath.png differ diff --git a/icons/turf/floors/carpet_goliath.png.toml b/icons/turf/floors/carpet_goliath.png.toml new file mode 100644 index 000000000000..298cd388b488 --- /dev/null +++ b/icons/turf/floors/carpet_goliath.png.toml @@ -0,0 +1,2 @@ +output_name = "carpet_goliath" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_lizard.dmi b/icons/turf/floors/carpet_lizard.dmi new file mode 100644 index 000000000000..f136b2be36f2 Binary files /dev/null and b/icons/turf/floors/carpet_lizard.dmi differ diff --git a/icons/turf/floors/carpet_lizard.png b/icons/turf/floors/carpet_lizard.png new file mode 100644 index 000000000000..b05dfb579bde Binary files /dev/null and b/icons/turf/floors/carpet_lizard.png differ diff --git a/icons/turf/floors/carpet_lizard.png.toml b/icons/turf/floors/carpet_lizard.png.toml new file mode 100644 index 000000000000..3ccfb7142ad4 --- /dev/null +++ b/icons/turf/floors/carpet_lizard.png.toml @@ -0,0 +1,2 @@ +output_name = "carpet_lizard" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_moth.dmi b/icons/turf/floors/carpet_moth.dmi new file mode 100644 index 000000000000..641ce53b5ec6 Binary files /dev/null and b/icons/turf/floors/carpet_moth.dmi differ diff --git a/icons/turf/floors/carpet_moth.png b/icons/turf/floors/carpet_moth.png new file mode 100644 index 000000000000..7e2a40d2a22e Binary files /dev/null and b/icons/turf/floors/carpet_moth.png differ diff --git a/icons/turf/floors/carpet_moth.png.toml b/icons/turf/floors/carpet_moth.png.toml new file mode 100644 index 000000000000..937263bf6b4d --- /dev/null +++ b/icons/turf/floors/carpet_moth.png.toml @@ -0,0 +1,2 @@ +output_name = "carpet_moth" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_skin.dmi b/icons/turf/floors/carpet_skin.dmi new file mode 100644 index 000000000000..c9f55f86dd5f Binary files /dev/null and b/icons/turf/floors/carpet_skin.dmi differ diff --git a/icons/turf/floors/carpet_skin.png b/icons/turf/floors/carpet_skin.png new file mode 100644 index 000000000000..063a75ed5f49 Binary files /dev/null and b/icons/turf/floors/carpet_skin.png differ diff --git a/icons/turf/floors/carpet_skin.png.toml b/icons/turf/floors/carpet_skin.png.toml new file mode 100644 index 000000000000..3188d9416cc0 --- /dev/null +++ b/icons/turf/floors/carpet_skin.png.toml @@ -0,0 +1,2 @@ +output_name = "carpet_skin" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/glass_stained_black.dmi b/icons/turf/floors/glass_stained_black.dmi new file mode 100644 index 000000000000..b906bee44fb1 Binary files /dev/null and b/icons/turf/floors/glass_stained_black.dmi differ diff --git a/icons/turf/floors/glass_stained_black.png b/icons/turf/floors/glass_stained_black.png new file mode 100644 index 000000000000..3c9a073c1ee4 Binary files /dev/null and b/icons/turf/floors/glass_stained_black.png differ diff --git a/icons/turf/floors/glass_stained_black.png.toml b/icons/turf/floors/glass_stained_black.png.toml new file mode 100644 index 000000000000..24602e7f5954 --- /dev/null +++ b/icons/turf/floors/glass_stained_black.png.toml @@ -0,0 +1,2 @@ +output_name = "glass_stained_black" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/glass_stained_blue.dmi b/icons/turf/floors/glass_stained_blue.dmi new file mode 100644 index 000000000000..1eb891d8e30d Binary files /dev/null and b/icons/turf/floors/glass_stained_blue.dmi differ diff --git a/icons/turf/floors/glass_stained_blue.png b/icons/turf/floors/glass_stained_blue.png new file mode 100644 index 000000000000..a83d5f168c7f Binary files /dev/null and b/icons/turf/floors/glass_stained_blue.png differ diff --git a/icons/turf/floors/glass_stained_blue.png.toml b/icons/turf/floors/glass_stained_blue.png.toml new file mode 100644 index 000000000000..1956857d8fbc --- /dev/null +++ b/icons/turf/floors/glass_stained_blue.png.toml @@ -0,0 +1,2 @@ +output_name = "glass_stained_blue" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/glass_stained_green.dmi b/icons/turf/floors/glass_stained_green.dmi new file mode 100644 index 000000000000..7d58c9ebb389 Binary files /dev/null and b/icons/turf/floors/glass_stained_green.dmi differ diff --git a/icons/turf/floors/glass_stained_green.png b/icons/turf/floors/glass_stained_green.png new file mode 100644 index 000000000000..a4a364bf44ed Binary files /dev/null and b/icons/turf/floors/glass_stained_green.png differ diff --git a/icons/turf/floors/glass_stained_green.png.toml b/icons/turf/floors/glass_stained_green.png.toml new file mode 100644 index 000000000000..210b36dead8f --- /dev/null +++ b/icons/turf/floors/glass_stained_green.png.toml @@ -0,0 +1,2 @@ +output_name = "glass_stained_green" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/glass_stained_orange.dmi b/icons/turf/floors/glass_stained_orange.dmi new file mode 100644 index 000000000000..36af79703161 Binary files /dev/null and b/icons/turf/floors/glass_stained_orange.dmi differ diff --git a/icons/turf/floors/glass_stained_orange.png b/icons/turf/floors/glass_stained_orange.png new file mode 100644 index 000000000000..faf8989bb1be Binary files /dev/null and b/icons/turf/floors/glass_stained_orange.png differ diff --git a/icons/turf/floors/glass_stained_orange.png.toml b/icons/turf/floors/glass_stained_orange.png.toml new file mode 100644 index 000000000000..af468bf4f08e --- /dev/null +++ b/icons/turf/floors/glass_stained_orange.png.toml @@ -0,0 +1,2 @@ +output_name = "glass_stained_orange" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/glass_stained_purple.dmi b/icons/turf/floors/glass_stained_purple.dmi new file mode 100644 index 000000000000..9d32ffd5c944 Binary files /dev/null and b/icons/turf/floors/glass_stained_purple.dmi differ diff --git a/icons/turf/floors/glass_stained_purple.png b/icons/turf/floors/glass_stained_purple.png new file mode 100644 index 000000000000..e26926605a89 Binary files /dev/null and b/icons/turf/floors/glass_stained_purple.png differ diff --git a/icons/turf/floors/glass_stained_purple.png.toml b/icons/turf/floors/glass_stained_purple.png.toml new file mode 100644 index 000000000000..c064b7fa1514 --- /dev/null +++ b/icons/turf/floors/glass_stained_purple.png.toml @@ -0,0 +1,2 @@ +output_name = "glass_stained_purple" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/glass_stained_red.dmi b/icons/turf/floors/glass_stained_red.dmi new file mode 100644 index 000000000000..48c55eb6c9e0 Binary files /dev/null and b/icons/turf/floors/glass_stained_red.dmi differ diff --git a/icons/turf/floors/glass_stained_red.png b/icons/turf/floors/glass_stained_red.png new file mode 100644 index 000000000000..1de45947db5c Binary files /dev/null and b/icons/turf/floors/glass_stained_red.png differ diff --git a/icons/turf/floors/glass_stained_red.png.toml b/icons/turf/floors/glass_stained_red.png.toml new file mode 100644 index 000000000000..4d68363c7492 --- /dev/null +++ b/icons/turf/floors/glass_stained_red.png.toml @@ -0,0 +1,2 @@ +output_name = "glass_stained_red" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/glass_stained_white.dmi b/icons/turf/floors/glass_stained_white.dmi new file mode 100644 index 000000000000..e46003ef787b Binary files /dev/null and b/icons/turf/floors/glass_stained_white.dmi differ diff --git a/icons/turf/floors/glass_stained_white.png b/icons/turf/floors/glass_stained_white.png new file mode 100644 index 000000000000..7ede54ec6b9c Binary files /dev/null and b/icons/turf/floors/glass_stained_white.png differ diff --git a/icons/turf/floors/glass_stained_white.png.toml b/icons/turf/floors/glass_stained_white.png.toml new file mode 100644 index 000000000000..408e98fcd357 --- /dev/null +++ b/icons/turf/floors/glass_stained_white.png.toml @@ -0,0 +1,2 @@ +output_name = "glass_stained_white" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/glass_stained_yellow.dmi b/icons/turf/floors/glass_stained_yellow.dmi new file mode 100644 index 000000000000..b2ea59bea3a8 Binary files /dev/null and b/icons/turf/floors/glass_stained_yellow.dmi differ diff --git a/icons/turf/floors/glass_stained_yellow.png b/icons/turf/floors/glass_stained_yellow.png new file mode 100644 index 000000000000..217ffc7bf01c Binary files /dev/null and b/icons/turf/floors/glass_stained_yellow.png differ diff --git a/icons/turf/floors/glass_stained_yellow.png.toml b/icons/turf/floors/glass_stained_yellow.png.toml new file mode 100644 index 000000000000..068d6739ca36 --- /dev/null +++ b/icons/turf/floors/glass_stained_yellow.png.toml @@ -0,0 +1,2 @@ +output_name = "glass_stained_yellow" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/walls/adamantine_wall.dmi b/icons/turf/walls/adamantine_wall.dmi new file mode 100644 index 000000000000..2df382f2f646 Binary files /dev/null and b/icons/turf/walls/adamantine_wall.dmi differ diff --git a/icons/turf/walls/adamantine_wall.png b/icons/turf/walls/adamantine_wall.png new file mode 100644 index 000000000000..f6852ff7bdad Binary files /dev/null and b/icons/turf/walls/adamantine_wall.png differ diff --git a/icons/turf/walls/adamantine_wall.png.toml b/icons/turf/walls/adamantine_wall.png.toml new file mode 100644 index 000000000000..7ed9b72f45c3 --- /dev/null +++ b/icons/turf/walls/adamantine_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "adamantine_wall" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/walls/bone_wall.dmi b/icons/turf/walls/bone_wall.dmi new file mode 100644 index 000000000000..12faff99af92 Binary files /dev/null and b/icons/turf/walls/bone_wall.dmi differ diff --git a/icons/turf/walls/bone_wall.png b/icons/turf/walls/bone_wall.png new file mode 100644 index 000000000000..fc43971867b4 Binary files /dev/null and b/icons/turf/walls/bone_wall.png differ diff --git a/icons/turf/walls/bone_wall.png.toml b/icons/turf/walls/bone_wall.png.toml new file mode 100644 index 000000000000..2b6f135aebcc --- /dev/null +++ b/icons/turf/walls/bone_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "bone_wall" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/walls/false_walls.dmi b/icons/turf/walls/false_walls.dmi index 300659d4d1c9..b9c44a9b1d5b 100644 Binary files a/icons/turf/walls/false_walls.dmi and b/icons/turf/walls/false_walls.dmi differ diff --git a/icons/turf/walls/hauntium_wall.dmi b/icons/turf/walls/hauntium_wall.dmi new file mode 100644 index 000000000000..91c4cc52c6dd Binary files /dev/null and b/icons/turf/walls/hauntium_wall.dmi differ diff --git a/icons/turf/walls/hauntium_wall.png b/icons/turf/walls/hauntium_wall.png new file mode 100644 index 000000000000..8c3e5afd499e Binary files /dev/null and b/icons/turf/walls/hauntium_wall.png differ diff --git a/icons/turf/walls/hauntium_wall.png.toml b/icons/turf/walls/hauntium_wall.png.toml new file mode 100644 index 000000000000..d744d24275c8 --- /dev/null +++ b/icons/turf/walls/hauntium_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "hauntium_wall" +template = "bitmask/diagonal_32x32" diff --git a/icons/turf/walls/metal_hydrogen_wall.dmi b/icons/turf/walls/metal_hydrogen_wall.dmi new file mode 100644 index 000000000000..d8d23614fff0 Binary files /dev/null and b/icons/turf/walls/metal_hydrogen_wall.dmi differ diff --git a/icons/turf/walls/metal_hydrogen_wall.png b/icons/turf/walls/metal_hydrogen_wall.png new file mode 100644 index 000000000000..dda2c2adee40 Binary files /dev/null and b/icons/turf/walls/metal_hydrogen_wall.png differ diff --git a/icons/turf/walls/metal_hydrogen_wall.png.toml b/icons/turf/walls/metal_hydrogen_wall.png.toml new file mode 100644 index 000000000000..4c48d64af3b7 --- /dev/null +++ b/icons/turf/walls/metal_hydrogen_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "metal_hydrogen_wall" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/walls/mythril_wall.dmi b/icons/turf/walls/mythril_wall.dmi new file mode 100644 index 000000000000..b49e63f8cd57 Binary files /dev/null and b/icons/turf/walls/mythril_wall.dmi differ diff --git a/icons/turf/walls/mythril_wall.png b/icons/turf/walls/mythril_wall.png new file mode 100644 index 000000000000..fd61c88a623a Binary files /dev/null and b/icons/turf/walls/mythril_wall.png differ diff --git a/icons/turf/walls/mythril_wall.png.toml b/icons/turf/walls/mythril_wall.png.toml new file mode 100644 index 000000000000..d86bef23b997 --- /dev/null +++ b/icons/turf/walls/mythril_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "mythril_wall" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/walls/runite_wall.dmi b/icons/turf/walls/runite_wall.dmi new file mode 100644 index 000000000000..1a7ef276e6a2 Binary files /dev/null and b/icons/turf/walls/runite_wall.dmi differ diff --git a/icons/turf/walls/runite_wall.png b/icons/turf/walls/runite_wall.png new file mode 100644 index 000000000000..04622fea9f83 Binary files /dev/null and b/icons/turf/walls/runite_wall.png differ diff --git a/icons/turf/walls/runite_wall.png.toml b/icons/turf/walls/runite_wall.png.toml new file mode 100644 index 000000000000..2ce63c4d8373 --- /dev/null +++ b/icons/turf/walls/runite_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "runite_wall" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/walls/sandbasalt_wall.dmi b/icons/turf/walls/sandbasalt_wall.dmi new file mode 100644 index 000000000000..1a3c211a422e Binary files /dev/null and b/icons/turf/walls/sandbasalt_wall.dmi differ diff --git a/icons/turf/walls/sandbasalt_wall.png b/icons/turf/walls/sandbasalt_wall.png new file mode 100644 index 000000000000..4eea35f02fce Binary files /dev/null and b/icons/turf/walls/sandbasalt_wall.png differ diff --git a/icons/turf/walls/sandbasalt_wall.png.toml b/icons/turf/walls/sandbasalt_wall.png.toml new file mode 100644 index 000000000000..995d2cf1fa29 --- /dev/null +++ b/icons/turf/walls/sandbasalt_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "sandbasalt_wall" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/walls/sandstone_ornate_wall.dmi b/icons/turf/walls/sandstone_ornate_wall.dmi new file mode 100644 index 000000000000..b58f92ff37b3 Binary files /dev/null and b/icons/turf/walls/sandstone_ornate_wall.dmi differ diff --git a/icons/turf/walls/sandstone_ornate_wall.png b/icons/turf/walls/sandstone_ornate_wall.png new file mode 100644 index 000000000000..aa37bc148aed Binary files /dev/null and b/icons/turf/walls/sandstone_ornate_wall.png differ diff --git a/icons/turf/walls/sandstone_ornate_wall.png.toml b/icons/turf/walls/sandstone_ornate_wall.png.toml new file mode 100644 index 000000000000..18b0c2be0d31 --- /dev/null +++ b/icons/turf/walls/sandstone_ornate_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "sandstone_ornate_wall" +template = "bitmask/diagonal_32x32.toml" diff --git a/modular_darkpack/master_files/code/game/atom/atom_examine.dm b/modular_darkpack/master_files/code/game/atom/atom_examine.dm index fa1a97cd7f45..20d8db75a447 100644 --- a/modular_darkpack/master_files/code/game/atom/atom_examine.dm +++ b/modular_darkpack/master_files/code/game/atom/atom_examine.dm @@ -1,5 +1,5 @@ /obj/item/get_examine_icon(mob/user) - if(item_flags & ACTIVE_WORLD_ICON) + if(item_flags & ACTIVE_ONFLOOR_ICON) return icon2html(initial(icon), user, initial(icon_state)) else return icon2html(src, user) diff --git a/modular_darkpack/master_files/code/game/objects/items.dm b/modular_darkpack/master_files/code/game/objects/items.dm index f435bbd73031..48f1f60c2d86 100644 --- a/modular_darkpack/master_files/code/game/objects/items.dm +++ b/modular_darkpack/master_files/code/game/objects/items.dm @@ -3,8 +3,10 @@ ///Set to null to disallow breaking. var/cuff_break_strength_needed = null + // ONFLOOR_ICONS var/onflooricon var/onflooricon_state + var/masquerade_violating // STORYTELLR_STATS diff --git a/modular_darkpack/master_files/code/modules/client/preferences_savefile.dm b/modular_darkpack/master_files/code/modules/client/preferences_savefile.dm index a1eb3d9fe5f2..69603ead4cdf 100644 --- a/modular_darkpack/master_files/code/modules/client/preferences_savefile.dm +++ b/modular_darkpack/master_files/code/modules/client/preferences_savefile.dm @@ -7,16 +7,49 @@ var/list/discipline_levels = list() // Alternative job titles stored in preferences. Assoc list, ie. alt_job_titles["Scientist"] = "Cytologist" var/list/alt_job_titles = list() - /// Whether this player is whitelisted to bypass discipline sheet validation limits + /// Whether this player is whitelisted to bypass discipline sheet validation limits /// LEGACY var/discipline_trusted = FALSE /datum/preferences/load_preferences() discipline_trusted = savefile.get_entry("discipline_trusted", FALSE) // deserialization and its consequences + + // WHITELIST + var/list/saved = savefile.get_entry("player_whitelists") + if(isnull(saved) || !islist(saved) || !length(saved)) + player_whitelists = get_default_player_whitelists().Copy() + else + player_whitelists = saved + + var/alist/defaults = get_default_player_whitelists() + for(var/key, bool in defaults) + if(!(key in player_whitelists)) + to_chat(parent, span_boldnotice("New whitelist key added to whitelists: [key] [bool ? "TRUE": "FALSE"].")) + player_whitelists[key] = bool + + for(var/key in saved) + if(!(key in defaults)) + to_chat(parent, span_boldnotice("Bad whitelist key has been removed from whitelists")) + player_whitelists[key] = null + + if(discipline_trusted && !player_whitelists[WHITELIST_TRUSTED]) // backwards compatibility + player_whitelists[WHITELIST_TRUSTED] = TRUE + if(!isnull(parent)) + to_chat(parent, span_boldnotice("Great news! Your existing trusted status was successfully migrated to the new splat whitelist system.")) + + discipline_trusted = player_whitelists[WHITELIST_TRUSTED] + // WHITELIST + . = ..() /datum/preferences/save_preferences() savefile.set_entry("discipline_trusted", discipline_trusted) // since existing load/save is per character, save and load it from a level above that + + // WHITELIST + if(!isnull(player_whitelists)) + savefile.set_entry("player_whitelists", player_whitelists) + // WHITELIST + . = ..() /datum/preferences/load_character(slot) diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm index 2351c447fa6e..e0e654444670 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm @@ -31,22 +31,23 @@ if(obscured_slots & HIDEFACE) return - switch(get_clan()?.alt_sprite) - if("nosferatu") - . += span_warning("[p_They()] look[p_s()] utterly deformed and inhuman!
") - if("gargoyle") - . += span_warning("[p_They()] seem[p_s()] to be made out of stone!
") - if("kiasyd") - if (!is_eyes_covered()) - . += span_boldwarning("[p_They()] [p_have()] no whites in [p_their()] eyes!
") - if("rotten1") - . += span_warning("[p_They()] seem[p_s()] oddly gaunt.
") - if("rotten2") - . += span_warning("[p_They()] [p_have()] a corpselike complexion.
") - if("rotten3") - . += span_boldwarning("[p_They()] [p_are()] a decayed corpse!
") - if("rotten4") - . += span_boldwarning("[p_They()] [p_are()] a skeletonised corpse!
") + if(HAS_TRAIT(src, TRAIT_MASQUERADE_VIOLATING_FACE) || HAS_TRAIT(src, TRAIT_MASQUERADE_VIOLATING_EYES)) + switch(get_clan()?.alt_sprite) + if("nosferatu") + . += span_warning("[p_They()] look[p_s()] utterly deformed and inhuman!
") + if("gargoyle") + . += span_warning("[p_They()] seem[p_s()] to be made out of stone!
") + if("kiasyd") + if (!is_eyes_covered()) + . += span_boldwarning("[p_They()] [p_have()] no whites in [p_their()] eyes!
") + if("rotten1") + . += span_warning("[p_They()] seem[p_s()] oddly gaunt.
") + if("rotten2") + . += span_warning("[p_They()] [p_have()] a corpselike complexion.
") + if("rotten3") + . += span_boldwarning("[p_They()] [p_are()] a decayed corpse!
") + if("rotten4") + . += span_boldwarning("[p_They()] [p_are()] a skeletonised corpse!
") if(iszomboid(src) && !(obscured_slots & HIDEFACE)) // for necromancy player-controlled zombies . += span_danger("[p_They()] [p_are()] a decayed corpse!
") diff --git a/modular_darkpack/master_files/code/modules/mob/living/living.dm b/modular_darkpack/master_files/code/modules/mob/living/living.dm index ffc42bb4bc1b..572c319df9ab 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/living.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/living.dm @@ -1,11 +1,11 @@ /mob/living/Initialize(mapload) . = ..() - storyteller_stats = create_new_stat_prefs(storyteller_stats) + replace_storyteller_stats(create_new_stat_prefs(storyteller_stats)) become_area_sensitive(ZONE_TRAIT) update_zone_hud(src, get_area(src)) // AREAS - (Zone hud) /mob/living/Destroy(force) - storyteller_stats = null + clear_storyteller_stats() beastmaster_minions = null minion_command_components = null QDEL_LAZYLIST(splats) diff --git a/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune.dm b/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune.dm index f18792d173c0..65a04ff19119 100644 --- a/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune.dm +++ b/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune.dm @@ -40,6 +40,10 @@ *What happens when the ritual rune executes successfully */ /obj/ritual_rune/proc/complete() + if(last_activator) + last_activator.log_message("has successfully completed casting the ritual '[name]'.", LOG_GAME) + else + log_game("someone has successfully completed casting the ritual '[name]'.") return /* diff --git a/modular_darkpack/master_files/icons/ui/chat/language.dmi b/modular_darkpack/master_files/icons/ui/chat/language.dmi index b7833a2d4424..a2738650de6b 100644 Binary files a/modular_darkpack/master_files/icons/ui/chat/language.dmi and b/modular_darkpack/master_files/icons/ui/chat/language.dmi differ diff --git a/modular_darkpack/modules/areas/code/interiors/city_interiors.dm b/modular_darkpack/modules/areas/code/interiors/city_interiors.dm index 3533d6f97b07..ff12dc675ae8 100644 --- a/modular_darkpack/modules/areas/code/interiors/city_interiors.dm +++ b/modular_darkpack/modules/areas/code/interiors/city_interiors.dm @@ -1,10 +1,3 @@ -/area/vtm/interior/shop - name = "\improper Shop" - icon_state = "shop" - fire_controled = TRUE - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/shop.ogg' - ambient_buzz_vol = 20 - /area/vtm/interior/laundromat name = "Laundromat" icon_state = "shop" diff --git a/modular_darkpack/modules/areas/code/interiors/garou.dm b/modular_darkpack/modules/areas/code/interiors/garou.dm index 62f5291725d2..53ca10b7ed49 100644 --- a/modular_darkpack/modules/areas/code/interiors/garou.dm +++ b/modular_darkpack/modules/areas/code/interiors/garou.dm @@ -6,6 +6,13 @@ zone_type = ZONE_ELYSIUM gauntlet_rating = 5 +/area/vtm/interior/cog/caern/bawn + name = "Children of Gaia Bawn" + +/area/vtm/interior/cog/caern/bawn/LateInitialize() + . = ..() + AddComponent(/datum/component/bawn_area, /obj/structure/werewolf_totem/children_of_gaia) + /area/vtm/interior/cog/pantry name = "Earth's Bounty Food Pantry" icon_state = "cog_pantry" diff --git a/modular_darkpack/modules/areas/code/interiors/shops.dm b/modular_darkpack/modules/areas/code/interiors/shops.dm new file mode 100644 index 000000000000..3dc079c85e2c --- /dev/null +++ b/modular_darkpack/modules/areas/code/interiors/shops.dm @@ -0,0 +1,72 @@ +/area/vtm/interior/shop + name = "\improper Shop" + icon_state = "shop" + fire_controled = TRUE + ambient_buzz = 'modular_darkpack/modules/ambience/sounds/shop.ogg' + ambient_buzz_vol = 20 + + +/area/vtm/interior/shop/gummaguts + name = "Gummaguts" + +/area/vtm/interior/shop/bubway + name = "Bubway" + +/area/vtm/interior/shop/bacotell + name = "Baco Tell" + +/area/vtm/interior/shop/otolleys + name = "O'Tolleys" + +/area/vtm/interior/shop/red_dragon + name = "Red Dragon" + +/area/vtm/interior/shop/coffee_shop + name = "\improper Coffee Shop" + + +/area/vtm/interior/shop/clothing_store + name ="\improper Clothing Shop" + +/area/vtm/interior/shop/costume_store + name ="\improper Costume Shop" + +/area/vtm/interior/shop/ishu + name = "Hot Ishu" + + +/area/vtm/interior/shop/grocery + name = "\improper Grocery Store" + +/area/vtm/interior/shop/gasstation + name = "\improper Gas Station" + +/area/vtm/interior/shop/camping_store + name = "\improper Camping Store" + +/area/vtm/interior/shop/music_store + name = "\improper Music Store" + +/area/vtm/interior/shop/hardware_store + name = "\improper Hardware Store" + +/area/vtm/interior/shop/camping_store + name = "\improper Camping Store" + +/area/vtm/interior/shop/pawnshop + name = "\improper Pawn Shop" + +/area/vtm/interior/shop/gunshop + name = "\improper Gun Store" + +/area/vtm/interior/shop/smoke_shop + name = "\improper Smoke Shop" + +/area/vtm/interior/shop/skate_shop + name = "\improper Skate Shop" + +/area/vtm/interior/shop/flower_shop + name = "Community Garden" + +/area/vtm/interior/shop/pharmacy + name = "\improper Pharmacy" diff --git a/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm b/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm index 054424abe8f1..eb42ed870a9b 100644 --- a/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm +++ b/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm @@ -30,6 +30,13 @@ // DARKPACK TODO - FRENZY - tgui_input, yes or no to continue feeding in spite of the prey being excluded, if so, frenzy and path/humanity hit return + // anthropic taste flaw + if(HAS_TRAIT(src, TRAIT_ANTHROPIC_TASTE) && istype(bit_living, /mob/living/basic)) + SEND_SOUND(src, sound('modular_darkpack/modules/blood_drinking/sounds/need_blood.ogg', volume = 75)) + to_chat(src, span_warning("You despise this kind of prey.")) + // DARKPACK TODO - FRENZY - tgui_input, yes or no to continue feeding in spite of the prey being excluded, if so, frenzy and path/humanity hit + return + // victim of the masquerade flaw if(HAS_TRAIT(src, TRAIT_VICTIM_OF_THE_MASQUERADE)) var/datum/quirk/darkpack/victim_of_the_masquerade/votm = src.get_quirk(/datum/quirk/darkpack/victim_of_the_masquerade) diff --git a/modular_darkpack/modules/clothes/code/head.dm b/modular_darkpack/modules/clothes/code/head.dm index b41bdb2cbbd1..aef4cbb6c57c 100644 --- a/modular_darkpack/modules/clothes/code/head.dm +++ b/modular_darkpack/modules/clothes/code/head.dm @@ -262,14 +262,30 @@ wound = 40 /obj/item/clothing/head/vampire/bogatyr - name = "Bogatyr helmet" + name = "bone helmet" desc = "A regal helmet made of unknown materials." - icon_state = "bogatyr_helmet" - armor_type = /datum/armor/bogatyr_helmet + icon_state = "bogatyr_helmet_light" + armor_type = /datum/armor/police_helmet flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR visor_flags_inv = HIDEFACE|HIDESNOUT flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/clothing/head/vampire/bogatyr/captain + name = "golden bone helmet" + icon_state = "bogatyr_captain_helmet" + armor_type = /datum/armor/bogatyr_helmet + +/obj/item/clothing/head/vampire/bogatyr/captain/heavy // ! Craftable only. + name = "reinforced golden bone helmet" + armor_type = /datum/armor/eod_helmet + w_class = WEIGHT_CLASS_BULKY + +/obj/item/clothing/head/vampire/bogatyr/heavy + name = "heavy bone greathelm" + icon_state = "bogatyr_helmet" + armor_type = /datum/armor/eod_helmet w_class = WEIGHT_CLASS_BULKY /datum/armor/bogatyr_helmet diff --git a/modular_darkpack/modules/clothes/code/suit.dm b/modular_darkpack/modules/clothes/code/suit.dm index d6ee5a761e7a..ee3a7dea9fcb 100644 --- a/modular_darkpack/modules/clothes/code/suit.dm +++ b/modular_darkpack/modules/clothes/code/suit.dm @@ -205,6 +205,39 @@ desc = "A red hood with an ornate golden trim, marked with the emblem of House Tremere." icon_state = "magister_hood" +/obj/item/clothing/suit/hooded/robes/apprentice + name = "apprentice robes" + desc = "A purple robe with an ornate trim, marked with the emblem of House Tremere." + icon_state = "apprentice_robes" + hoodtype = /obj/item/clothing/head/hooded/robes_hood/apprentice + +/obj/item/clothing/head/hooded/robes_hood/apprentice + name = "apprentice hood" + desc = "A purple hood with an ornate trim, marked with the emblem of House Tremere." + icon_state = "apprentice_hood" + +/obj/item/clothing/suit/hooded/robes/tremere_capeless + name = "capeless tremere robes" + desc = "Black robes with red highlights, marked with the emblem of House Tremere." + icon_state = "tremere_robes_capeless" + hoodtype = /obj/item/clothing/head/hooded/robes_hood/tremere_capeless + +/obj/item/clothing/head/hooded/robes_hood/tremere_capeless + name = "tremere hood" + desc = "A black hood with red highlights, marked with the emblem of House Tremere." + icon_state = "tremere_hood_capeless" + +/obj/item/clothing/suit/hooded/robes/magister_capeless + name = "capeless magister robes" + desc = "A red robe with an ornate golden trim, marked with the emblem of House Tremere." + icon_state = "magister_robes_capeless" + hoodtype = /obj/item/clothing/head/hooded/robes_hood/magister_capeless + +/obj/item/clothing/head/hooded/robes_hood/magister_capeless + name = "magister hood" + desc = "A red hood with ornate trim, marked with the emblem of House Tremere." + icon_state = "magister_hood_capeless" + /obj/item/clothing/suit/vampire/coat name = "brown coat" desc = "A warm and heavy brown coat." @@ -497,17 +530,35 @@ wound = 50 /obj/item/clothing/suit/vampire/bogatyr - name = "bogatyr armor" + name = "bone armor" desc = "A regal set of armor made of unknown materials." - icon_state = "bogatyr_armor" + icon_state = "bogatyr_armor_light" body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS flags_inv = HIDEJUMPSUIT clothing_flags = THICKMATERIAL cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + slowdown = 0.5 + w_class = WEIGHT_CLASS_NORMAL + armor_type = /datum/armor/bulletproof_vest + +/obj/item/clothing/suit/vampire/bogatyr/captain + name = "golden bone armor" + icon_state = "bogatyr_captain_armor" + armor_type = /datum/armor/highly_protective_vest + +/obj/item/clothing/suit/vampire/bogatyr/captain/heavy // ! Craftable only. + name = "reinforced golden bone armor" + armor_type = /datum/armor/eod_suit + w_class = WEIGHT_CLASS_BULKY slowdown = 1 + +/obj/item/clothing/suit/vampire/bogatyr/heavy + name = "heavy bone harness" + icon_state = "bogatyr_armor" + armor_type = /datum/armor/eod_suit w_class = WEIGHT_CLASS_BULKY - armor_type = /datum/armor/highly_protective_vest + slowdown = 1 /obj/item/clothing/suit/vampire/labcoat name = "labcoat" diff --git a/modular_darkpack/modules/clothes/icons/clothing.dmi b/modular_darkpack/modules/clothes/icons/clothing.dmi index e77dde1c92e1..285e3ec7a868 100644 Binary files a/modular_darkpack/modules/clothes/icons/clothing.dmi and b/modular_darkpack/modules/clothes/icons/clothing.dmi differ diff --git a/modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi b/modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi index f27b559063bd..be88d4fd3d3d 100644 Binary files a/modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi and b/modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi differ diff --git a/modular_darkpack/modules/clothes/icons/worn.dmi b/modular_darkpack/modules/clothes/icons/worn.dmi index d293e22366b2..0220c1726853 100644 Binary files a/modular_darkpack/modules/clothes/icons/worn.dmi and b/modular_darkpack/modules/clothes/icons/worn.dmi differ diff --git a/modular_darkpack/modules/decor/code/decor.dm b/modular_darkpack/modules/decor/code/decor.dm index 11117feae57f..b6a49bfe5c9b 100644 --- a/modular_darkpack/modules/decor/code/decor.dm +++ b/modular_darkpack/modules/decor/code/decor.dm @@ -33,101 +33,49 @@ layer = ABOVE_ALL_MOB_LAYER anchored = TRUE -/obj/structure/lamppost +/obj/machinery/light/floor/lamppost name = "lamppost" desc = "Gives some light to the streets." icon = 'modular_darkpack/modules/decor/icons/lamppost.dmi' - base_icon_state = "base" - layer = SPACEVINE_LAYER // Cant even with flav bro - Fallcon + icon_state = "base" + bulb_colour = "#ffde9b" + allow_break_on_init = FALSE + plane = GAME_PLANE pixel_w = -32 + layer = SPACEVINE_LAYER anchored = TRUE density = FALSE // APOC EDIT CHANGE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF - var/number_of_lamps - var/list/my_lights = list() -/obj/structure/lamppost/Initialize(mapload) +/obj/machinery/light/floor/lamppost/Initialize(mapload) . = ..() var/area/vtm/my_area = get_area(src) if(check_holidays(FESTIVE_SEASON)) if(istype(my_area) && my_area.outdoors) icon_state = "[initial(icon_state)]-snow" - RegisterSignal(my_area, COMSIG_AREA_POWER_CHANGE, PROC_REF(on_power_change)) - // DARKPACK TODO - fuseboxes and areas aren't meaningfully connected to each other, and thusly aren't meaningfully connected to lights/devices that may need poer. - // TLDR we need to basically re-evaluate how we approach power... the current system is flavcode spaghetti shit. - if(my_area.powered(AREA_USAGE_LIGHT)) - create_lights() - -/obj/structure/lamppost/proc/on_power_change(area/A) - SIGNAL_HANDLER + update_appearance() +// note - change this when we get more robust lamppost sprites - for now we only have one for each lamppost type +/obj/machinery/light/floor/lamppost/update_icon_state() + .=..() + icon_state = initial(icon_state) - if(A.power_light) - create_lights() - else - QDEL_LIST(my_lights) - -/obj/structure/lamppost/proc/create_lights() - QDEL_LIST(my_lights) - switch(number_of_lamps) - if(1) - new_light(get_step(loc, dir)) - if(2) - new_light(get_step(loc, dir)) - new_light(get_step(loc, turn(dir, 180))) - if(3) - new_light(get_step(loc, dir)) - new_light(get_step(loc, turn(dir, -90))) - new_light(get_step(loc, turn(dir, 90))) - if(4) - new_light(get_step(loc, NORTH)) - new_light(get_step(loc, SOUTH)) - new_light(get_step(loc, EAST)) - new_light(get_step(loc, WEST)) - else - new_light(loc) - -/obj/structure/lamppost/proc/new_light(location) - my_lights += new /obj/effect/decal/lamplight(location) - -/obj/structure/lamppost/Destroy(force) - UnregisterSignal(get_area(src), COMSIG_AREA_POWER_CHANGE) - QDEL_LIST(my_lights) - . = ..() - - -/obj/effect/decal/lamplight - alpha = 0 - -// DARKPACK TODO - Fix lol. -/obj/effect/decal/lamplight/NeverShouldHaveComeHere(turf/here_turf) - return FALSE - -/obj/effect/decal/lamplight/Initialize(mapload) - . = ..() - set_light(4, 3, "#ffde9b") - -/obj/structure/lamppost/one +/obj/machinery/light/floor/lamppost/one icon_state = "one" - number_of_lamps = 1 -/obj/structure/lamppost/two +/obj/machinery/light/floor/lamppost/two icon_state = "two" - number_of_lamps = 2 -/obj/structure/lamppost/three +/obj/machinery/light/floor/lamppost/three icon_state = "three" - number_of_lamps = 3 -/obj/structure/lamppost/four +/obj/machinery/light/floor/lamppost/four icon_state = "four" - number_of_lamps = 4 -/obj/structure/lamppost/sidewalk +/obj/machinery/light/floor/lamppost/sidewalk icon_state = "civ" - number_of_lamps = 5 -/obj/structure/lamppost/sidewalk/chinese +/obj/machinery/light/floor/lamppost/sidewalk/chinese icon_state = "chinese" /obj/structure/trafficlight diff --git a/modular_darkpack/modules/ert/code/items/first_team.dm b/modular_darkpack/modules/ert/code/items/first_team.dm index 0be78c8acdf5..1e8cc63e21ec 100644 --- a/modular_darkpack/modules/ert/code/items/first_team.dm +++ b/modular_darkpack/modules/ert/code/items/first_team.dm @@ -366,13 +366,13 @@ /obj/item/gun/ballistic/automatic/l6_saw/darkpack/update_icon_state() . = ..() - if(item_flags & ACTIVE_WORLD_ICON) + if(item_flags & ACTIVE_ONFLOOR_ICON) return inhand_icon_state = "[base_icon_state][magazine ? "mag":"nomag"]" /obj/item/gun/ballistic/automatic/l6_saw/darkpack/update_overlays() . = ..() - if(item_flags & ACTIVE_WORLD_ICON) + if(item_flags & ACTIVE_ONFLOOR_ICON) return . += "px249f_door_[cover_open ? "open" : "closed"]" diff --git a/modular_darkpack/modules/flags/code/loadout.dm b/modular_darkpack/modules/flags/code/loadout.dm index f70e92e7289e..3fc05c635cb7 100644 --- a/modular_darkpack/modules/flags/code/loadout.dm +++ b/modular_darkpack/modules/flags/code/loadout.dm @@ -21,3 +21,19 @@ /datum/loadout_item/pocket_items/transpride name = "flag, trans" item_path = /obj/item/sign/flag/pride/trans + +/datum/loadout_item/pocket_items/mlm + name = "flag, mlm" + item_path = /obj/item/sign/flag/pride/mlm + +/datum/loadout_item/pocket_items/rabies + name = "flag, rabies" + item_path = /obj/item/sign/flag/pride/rabies + +/datum/loadout_item/pocket_items/enby + name = "flag, non-binary" + item_path = /obj/item/sign/flag/pride/enby + +/datum/loadout_item/pocket_items/inter + name = "flag, intersex" + item_path = /obj/item/sign/flag/pride/inter diff --git a/modular_darkpack/modules/flags/code/pride_flags.dm b/modular_darkpack/modules/flags/code/pride_flags.dm index 9ad665653923..425d478417bf 100644 --- a/modular_darkpack/modules/flags/code/pride_flags.dm +++ b/modular_darkpack/modules/flags/code/pride_flags.dm @@ -61,6 +61,38 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/pride/pan, 32) MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/pride/trans, 32) +/obj/structure/sign/flag/pride/mlm + name = "men-loving-men pride flag" + desc = "The flag of men-loving-men pride." + icon_state = "flag_mlm" + item_flag = /obj/item/sign/flag/pride/mlm + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/pride/mlm, 32) + +/obj/structure/sign/flag/pride/rabies + name = "rabies pride flag" + desc = "The flag of rabies pride." + icon_state = "flag_rabies" + item_flag = /obj/item/sign/flag/pride/rabies + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/pride/rabies, 32) + +/obj/structure/sign/flag/pride/enby + name = "non-binary pride flag" + desc = "The flag of non-binary pride." + icon_state = "flag_enby" + item_flag = /obj/item/sign/flag/pride/enby + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/pride/enby, 32) + +/obj/structure/sign/flag/pride/inter + name = "intersex pride flag" + desc = "The flag of intersex pride." + icon_state = "flag_inter" + item_flag = /obj/item/sign/flag/pride/inter + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/pride/inter, 32) + // FOLDED /obj/item/sign/flag/pride @@ -116,3 +148,27 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/pride/trans, 32) desc = "The folded flag of trans pride." icon_state = "folded_pride_trans" sign_path = /obj/structure/sign/flag/pride/trans + +/obj/item/sign/flag/pride/mlm + name = "folded men-loving-men pride flag" + desc = "The folded flag of men-loving-men pride." + icon_state = "folded_pride_mlm" + sign_path = /obj/structure/sign/flag/pride/mlm + +/obj/item/sign/flag/pride/rabies + name = "folded rabies pride flag" + desc = "The folded flag of rabies pride." + icon_state = "folded_pride_rabies" + sign_path = /obj/structure/sign/flag/pride/rabies + +/obj/item/sign/flag/pride/enby + name = "folded non-binary pride flag" + desc = "The folded flag of non-binary pride." + icon_state = "folded_pride_enby" + sign_path = /obj/structure/sign/flag/pride/enby + +/obj/item/sign/flag/pride/inter + name = "folded intersex pride flag" + desc = "The folded flag of intersex pride." + icon_state = "folded_pride_inter" + sign_path = /obj/structure/sign/flag/pride/inter diff --git a/modular_darkpack/modules/flags/code/pride_pins.dm b/modular_darkpack/modules/flags/code/pride_pins.dm new file mode 100644 index 000000000000..7877ea3714be --- /dev/null +++ b/modular_darkpack/modules/flags/code/pride_pins.dm @@ -0,0 +1,5 @@ +/datum/atom_skin/pride_pin/rabies + preview_name = "Rabies Pride" + new_icon_state = "pride_rabies" + new_icon = 'modular_darkpack/modules/flags/icons/pride_pins.dmi' + new_worn_icon = 'modular_darkpack/modules/flags/icons/pride_pins_worn.dmi' diff --git a/modular_darkpack/modules/flags/code/recipes.dm b/modular_darkpack/modules/flags/code/recipes.dm index b1bb33c39d51..9740984477b8 100644 --- a/modular_darkpack/modules/flags/code/recipes.dm +++ b/modular_darkpack/modules/flags/code/recipes.dm @@ -45,3 +45,36 @@ ) result = /obj/item/sign/flag/pride/trans category = CAT_FURNITURE + +/datum/crafting_recipe/mlm + name = "mlm pride flag" + reqs = list( + /obj/item/stack/sheet/cloth = 3, + ) + result = /obj/item/sign/flag/pride/mlm + category = CAT_FURNITURE + +/datum/crafting_recipe/rabies + name = "rabies pride flag" + reqs = list( + /obj/item/stack/sheet/cloth = 3, + ) + result = /obj/item/sign/flag/pride/rabies + category = CAT_FURNITURE + +/datum/crafting_recipe/enby + name = "non-binary pride flag" + reqs = list( + /obj/item/stack/sheet/cloth = 3, + ) + result = /obj/item/sign/flag/pride/enby + category = CAT_FURNITURE + +/datum/crafting_recipe/inter + name = "intersex pride flag" + reqs = list( + /obj/item/stack/sheet/cloth = 3, + ) + result = /obj/item/sign/flag/pride/inter + category = CAT_FURNITURE + diff --git a/modular_darkpack/modules/flags/icons/pride_flags.dmi b/modular_darkpack/modules/flags/icons/pride_flags.dmi index 0d86bcb111d3..1f46b470564a 100644 Binary files a/modular_darkpack/modules/flags/icons/pride_flags.dmi and b/modular_darkpack/modules/flags/icons/pride_flags.dmi differ diff --git a/modular_darkpack/modules/flags/icons/pride_pins.dmi b/modular_darkpack/modules/flags/icons/pride_pins.dmi new file mode 100644 index 000000000000..dea4c25b98a6 Binary files /dev/null and b/modular_darkpack/modules/flags/icons/pride_pins.dmi differ diff --git a/modular_darkpack/modules/flags/icons/pride_pins_worn.dmi b/modular_darkpack/modules/flags/icons/pride_pins_worn.dmi new file mode 100644 index 000000000000..e3b987e38852 Binary files /dev/null and b/modular_darkpack/modules/flags/icons/pride_pins_worn.dmi differ diff --git a/modular_darkpack/modules/jobs/code/_departments.dm b/modular_darkpack/modules/jobs/code/_departments.dm index 55420e018485..58c63b743323 100644 --- a/modular_darkpack/modules/jobs/code/_departments.dm +++ b/modular_darkpack/modules/jobs/code/_departments.dm @@ -126,6 +126,7 @@ /datum/job_department/city_services department_name = DEPARTMENT_CITY_SERVICES department_bitflags = DEPARTMENT_BITFLAG_CITY_SERVICES + department_experience_type = EXP_TYPE_SERVICES display_order = 14 // give its own ui color? @@ -134,8 +135,7 @@ department_name = DEPARTMENT_SOCIETY_OF_LEOPOLD department_bitflags = DEPARTMENT_BITFLAG_SOCIETY_OF_LEOPOLD department_head = /datum/job/vampire/abbe - // why are you reusing the church xp. - department_experience_type = EXP_TYPE_CHURCH + department_experience_type = EXP_TYPE_SOCIETY_OF_LEOPOLD display_order = 15 ui_color = "#fff022" diff --git a/modular_darkpack/modules/jobs/code/_jobs.dm b/modular_darkpack/modules/jobs/code/_jobs.dm index f31c0912168a..9195476f531c 100644 --- a/modular_darkpack/modules/jobs/code/_jobs.dm +++ b/modular_darkpack/modules/jobs/code/_jobs.dm @@ -108,6 +108,11 @@ ((guestbook_flags & GUESTBOOK_DEPARTMENT) && length(common_departments))) spawned.mind.guestbook.add_guest(spawned, player_mob, player_mob.mind.name, player_mob.mind.name, silent = TRUE) +/datum/job/vampire + abstract_type = /datum/job/vampire + exp_required_type = EXP_TYPE_PLAYTIME + exp_granted_type = EXP_TYPE_PLAYTIME + /** * This type is used to indicate a lack of a job. * The mind variable assigned_role will point here by default. diff --git a/modular_darkpack/modules/jobs/code/anarchs/baron.dm b/modular_darkpack/modules/jobs/code/anarchs/baron.dm index 2fc867529b19..2cafd9fe23e0 100644 --- a/modular_darkpack/modules/jobs/code/anarchs/baron.dm +++ b/modular_darkpack/modules/jobs/code/anarchs/baron.dm @@ -13,14 +13,27 @@ /datum/job_department/anarch, ) - known_contacts = list("Bouncer", "Emissary", "Sweeper", "Prince", "Sheriff") + exp_requirements = EXP_REQ_HEAD + exp_required_type_department = EXP_TYPE_ANARCH + + known_contacts = list( + JOB_BRUISER, + JOB_EMISSARY, + JOB_SWEEPER, + JOB_TAPSTER, + JOB_PRINCE, + JOB_SHERIFF, + JOB_SENESCHAL, + JOB_HARPY, + JOB_DEALER + ) allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_BAALI, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_CAITIFF, VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_SAMEDI, VAMPIRE_CLAN_NAGARAJA) allowed_splats = list(SPLAT_KINDRED) description = "You lead the Anarchs in the City. A Camarilla faction that values freedom and individuality. While not a fan of the traditions, you still respect the Masquerade." minimum_masquerade = 3 /datum/outfit/job/vampire/baron - name = "Baron" + name = JOB_BARON jobtype = /datum/job/vampire/baron id = /obj/item/card/baron diff --git a/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm b/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm index ee3cf10de71a..cb5f2d547614 100644 --- a/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm +++ b/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm @@ -24,7 +24,13 @@ "Molotov", ) - known_contacts = list("Baron", "Bouncer", "Emissary", "Sweeper") + known_contacts = list( + JOB_BARON, + JOB_TAPSTER, + JOB_EMISSARY, + JOB_SWEEPER, + JOB_BRUISER + ) allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_CAITIFF, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD, VAMPIRE_CLAN_CAPPADOCIAN, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_HEALER_SALUBRI, VAMPIRE_CLAN_SAMEDI, VAMPIRE_CLAN_NAGARAJA) allowed_splats = list(SPLAT_KINDRED, SPLAT_GHOUL) maximal_generation = 9 @@ -33,7 +39,7 @@ minimum_masquerade = 2 /datum/outfit/job/vampire/bruiser - name = "Bruiser" + name = JOB_BRUISER jobtype = /datum/job/vampire/bruiser id = /obj/item/card/bruiser diff --git a/modular_darkpack/modules/jobs/code/anarchs/emissary.dm b/modular_darkpack/modules/jobs/code/anarchs/emissary.dm index d2722725efdb..7c1a1ac7076b 100644 --- a/modular_darkpack/modules/jobs/code/anarchs/emissary.dm +++ b/modular_darkpack/modules/jobs/code/anarchs/emissary.dm @@ -13,14 +13,24 @@ /datum/job_department/anarch, ) - known_contacts = list("Baron", "Bouncer", "Emissary", "Sweeper", "Prince", "Sheriff") + known_contacts = list( + JOB_BARON, + JOB_BRUISER, + JOB_SWEEPER, + JOB_TAPSTER, + JOB_PRINCE, + JOB_SHERIFF, + JOB_SENESCHAL, + JOB_HARPY, + JOB_DEALER + ) allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_CAITIFF, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD, VAMPIRE_CLAN_CAPPADOCIAN, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_HEALER_SALUBRI, VAMPIRE_CLAN_SAMEDI, VAMPIRE_CLAN_NAGARAJA) allowed_splats = list(SPLAT_KINDRED) description = "You are a diplomat for the anarchs. Make deals, keep the peace, all through words, not violence. But the latter may come to pass if the former fails." minimum_masquerade = 2 /datum/outfit/job/vampire/emissary - name = "emissary" + name = JOB_EMISSARY jobtype = /datum/job/vampire/emissary id = /obj/item/card/emissary diff --git a/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm b/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm index 38a5d3123a09..84922bc55cd3 100644 --- a/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm +++ b/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm @@ -13,14 +13,20 @@ /datum/job_department/anarch, ) - known_contacts = list("Baron", "Bouncer", "Emissary", "Sweeper") + known_contacts = list( + JOB_BARON, + JOB_BRUISER, + JOB_EMISSARY, + JOB_TAPSTER, + JOB_SWEEPER + ) allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_CAITIFF, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD, VAMPIRE_CLAN_CAPPADOCIAN, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_HEALER_SALUBRI, VAMPIRE_CLAN_SAMEDI, VAMPIRE_CLAN_NAGARAJA) allowed_splats = list(SPLAT_KINDRED, SPLAT_GHOUL) description = "You are the observer of the anarchs. You watch out for any new kindred, suspicious individuals, and any new rumors near the anarch turf, and then report it to your anarchs." minimum_masquerade = 2 /datum/outfit/job/vampire/sweeper - name = "Sweeper" + name = JOB_SWEEPER jobtype = /datum/job/vampire/sweeper id = /obj/item/card/sweeper diff --git a/modular_darkpack/modules/jobs/code/anarchs/tapster.dm b/modular_darkpack/modules/jobs/code/anarchs/tapster.dm index a1dea1c3635d..3efc62832d99 100644 --- a/modular_darkpack/modules/jobs/code/anarchs/tapster.dm +++ b/modular_darkpack/modules/jobs/code/anarchs/tapster.dm @@ -25,14 +25,20 @@ ) */ - known_contacts = list("Baron", "Bouncer", "Emissary", "Sweeper") + known_contacts = list( + JOB_BARON, + JOB_BRUISER, + JOB_EMISSARY, + JOB_SWEEPER, + JOB_TAPSTER + ) allowed_splats = list(SPLAT_NONE, SPLAT_GHOUL) splat_slots = list(SPLAT_NONE = 2, SPLAT_GHOUL = 2) description = "You are an employee of the local smoke shop. Serve the eclectic clients that pass through, and try not to ask too many questions." // APOC EDIT CHANGE - JOBS minimum_masquerade = 0 /datum/outfit/job/vampire/tapster - name = "Tapster" + name = JOB_TAPSTER jobtype = /datum/job/vampire/tapster id = /obj/item/card/tapster diff --git a/modular_darkpack/modules/jobs/code/camarilla/harpy.dm b/modular_darkpack/modules/jobs/code/camarilla/harpy.dm index dc9c5d7c338d..194edcfb6cd9 100644 --- a/modular_darkpack/modules/jobs/code/camarilla/harpy.dm +++ b/modular_darkpack/modules/jobs/code/camarilla/harpy.dm @@ -9,10 +9,7 @@ config_tag = "HARPY" req_admin_notify = 1 minimal_player_age = 10 - exp_requirements = 180 - exp_required_type = EXP_TYPE_CAMARILLA - exp_required_type_department = EXP_TYPE_CAMARILLA - exp_granted_type = EXP_TYPE_CAMARILLA + job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/harpy @@ -28,12 +25,26 @@ allowed_splats = list(SPLAT_KINDRED) - known_contacts = list("Prince","Sheriff","Tremere Regent","Dealer","Emissary","Baron","Primogens") + known_contacts = list( + JOB_PRINCE, + JOB_SHERIFF, + JOB_SENESCHAL, + JOB_CHANTRY_REGENT, + JOB_DEALER, + JOB_EMISSARY, + JOB_BARON, + JOB_PRIMOGEN_BANU_HAQIM, + JOB_PRIMOGEN_TOREADOR, + JOB_PRIMOGEN_LASOMBRA, + JOB_PRIMOGEN_MALKAVIAN, + JOB_PRIMOGEN_VENTRUE, + JOB_PRIMOGEN_NOSFERATU + ) allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_DOMINATE_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_BANU_HAQIM_VIZIER, VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_TLACIQUE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD, VAMPIRE_CLAN_SAMEDI, VAMPIRE_CLAN_NAGARAJA) /datum/outfit/job/vampire/harpy - name = "Harpy" + name = JOB_HARPY jobtype = /datum/job/vampire/harpy ears = /obj/item/radio/headset/darkpack diff --git a/modular_darkpack/modules/jobs/code/camarilla/hound.dm b/modular_darkpack/modules/jobs/code/camarilla/hound.dm index 0f980d846e77..0ae7d3792e9a 100644 --- a/modular_darkpack/modules/jobs/code/camarilla/hound.dm +++ b/modular_darkpack/modules/jobs/code/camarilla/hound.dm @@ -7,10 +7,6 @@ spawn_positions = 7 supervisors = SUPERVISOR_SHERIFF minimal_player_age = 7 - exp_requirements = 20 - exp_required_type = EXP_TYPE_CAMARILLA - exp_required_type_department = EXP_TYPE_CAMARILLA - exp_granted_type = EXP_TYPE_CAMARILLA config_tag = "HOUND" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/hound @@ -26,10 +22,15 @@ allowed_splats = list(SPLAT_KINDRED, SPLAT_GHOUL) allowed_clans = list(VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_DOMINATE_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_BANU_HAQIM_VIZIER, VAMPIRE_CLAN_TLACIQUE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD, VAMPIRE_CLAN_CAPPADOCIAN, VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_SAMEDI, VAMPIRE_CLAN_NAGARAJA) - known_contacts = list("Prince", "Sheriff") + known_contacts = list( + JOB_PRINCE, + JOB_SHERIFF, + JOB_SENESCHAL, + JOB_HOUND + ) /datum/outfit/job/vampire/hound - name = "Hound" + name = JOB_HOUND jobtype = /datum/job/vampire/hound ears = /obj/item/radio/headset/darkpack diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/banu_haqim.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/banu_haqim.dm index 4816a28c0b25..2ace6c81251a 100644 --- a/modular_darkpack/modules/jobs/code/camarilla/primogens/banu_haqim.dm +++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/banu_haqim.dm @@ -8,10 +8,7 @@ supervisors = SUPERVISOR_TRADITIONS req_admin_notify = 1 minimal_player_age = 14 - exp_requirements = 180 - exp_required_type = EXP_TYPE_CAMARILLA - exp_required_type_department = EXP_TYPE_CAMARILLA - exp_granted_type = EXP_TYPE_CAMARILLA + exp_requirements = EXP_REQ_HEAD config_tag = "PRIMOGEN_BANU_HAQIM" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/banuprim @@ -27,10 +24,20 @@ allowed_splats = list(SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_BANU_HAQIM_VIZIER) - known_contacts = list("Prince") + known_contacts = list( + JOB_PRINCE, + JOB_SHERIFF, + JOB_SENESCHAL, + JOB_HARPY, + JOB_PRIMOGEN_TOREADOR, + JOB_PRIMOGEN_LASOMBRA, + JOB_PRIMOGEN_MALKAVIAN, + JOB_PRIMOGEN_VENTRUE, + JOB_PRIMOGEN_NOSFERATU + ) /datum/outfit/job/vampire/banuprim - name = "Primogen Banu Haqim" + name = JOB_PRIMOGEN_BANU_HAQIM jobtype = /datum/job/vampire/primogen_banu ears = /obj/item/radio/headset/darkpack diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm index d5090b7b1ad3..3c49f735b8ec 100644 --- a/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm +++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm @@ -8,10 +8,7 @@ supervisors = SUPERVISOR_TRADITIONS req_admin_notify = 1 minimal_player_age = 14 - exp_requirements = 180 - exp_required_type = EXP_TYPE_CAMARILLA - exp_required_type_department = EXP_TYPE_CAMARILLA - exp_granted_type = EXP_TYPE_CAMARILLA + exp_requirements = EXP_REQ_HEAD config_tag = "PRIMOGEN_LASOMBRA" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/lasombraprim @@ -28,10 +25,21 @@ allowed_splats = list(SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_LASOMBRA) - known_contacts = list("Prince") + known_contacts = list( + JOB_PRINCE, + JOB_SHERIFF, + JOB_SENESCHAL, + JOB_HARPY, + JOB_PRIMOGEN_BANU_HAQIM, + JOB_PRIMOGEN_TOREADOR, + JOB_PRIMOGEN_MALKAVIAN, + JOB_PRIMOGEN_VENTRUE, + JOB_PRIMOGEN_NOSFERATU, + JOB_CHANTRY_REGENT + ) /datum/outfit/job/vampire/lasombraprim - name = "Primogen Lasombra" + name = JOB_PRIMOGEN_LASOMBRA jobtype = /datum/job/vampire/primogen_lasombra ears = /obj/item/radio/headset/darkpack diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm index 174c2c996329..22f812ddde85 100644 --- a/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm +++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm @@ -8,10 +8,7 @@ supervisors = SUPERVISOR_TRADITIONS req_admin_notify = 1 minimal_player_age = 14 - exp_requirements = 180 - exp_required_type = EXP_TYPE_CAMARILLA - exp_required_type_department = EXP_TYPE_CAMARILLA - exp_granted_type = EXP_TYPE_CAMARILLA + exp_requirements = EXP_REQ_HEAD config_tag = "PRIMOGEN_MALKAVIAN" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/malkav @@ -28,10 +25,21 @@ allowed_splats = list(SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_DOMINATE_MALKAVIAN) - known_contacts = list("Prince") + known_contacts = list( + JOB_PRINCE, + JOB_SHERIFF, + JOB_SENESCHAL, + JOB_HARPY, + JOB_PRIMOGEN_BANU_HAQIM, + JOB_PRIMOGEN_TOREADOR, + JOB_PRIMOGEN_LASOMBRA, + JOB_PRIMOGEN_VENTRUE, + JOB_PRIMOGEN_NOSFERATU, + JOB_CHANTRY_REGENT + ) /datum/outfit/job/vampire/malkav - name = "Primogen Malkavian" + name = JOB_PRIMOGEN_MALKAVIAN jobtype = /datum/job/vampire/primogen_malkavian ears = /obj/item/radio/headset/darkpack diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm index 9f5d30d84860..659eca7886e2 100644 --- a/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm +++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm @@ -8,10 +8,7 @@ supervisors = SUPERVISOR_TRADITIONS req_admin_notify = 1 minimal_player_age = 14 - exp_requirements = 180 - exp_required_type = EXP_TYPE_CAMARILLA - exp_required_type_department = EXP_TYPE_CAMARILLA - exp_granted_type = EXP_TYPE_CAMARILLA + exp_requirements = EXP_REQ_HEAD config_tag = "PRIMOGEN_NOSFERATU" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/nosferatu @@ -28,10 +25,20 @@ allowed_splats = list(SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_NOSFERATU) - known_contacts = list("Prince") + known_contacts = list( + JOB_PRINCE, + JOB_SHERIFF, + JOB_SENESCHAL, + JOB_HARPY, + JOB_PRIMOGEN_BANU_HAQIM, + JOB_PRIMOGEN_TOREADOR, + JOB_PRIMOGEN_LASOMBRA, + JOB_PRIMOGEN_MALKAVIAN, + JOB_PRIMOGEN_VENTRUE + ) /datum/outfit/job/vampire/nosferatu - name = "Primogen Nosferatu" + name = JOB_PRIMOGEN_NOSFERATU jobtype = /datum/job/vampire/primogen_nosferatu ears = /obj/item/radio/headset/darkpack diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm index b9ccff0ea6e2..1e3886caa54c 100644 --- a/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm +++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm @@ -8,10 +8,7 @@ supervisors = SUPERVISOR_TRADITIONS req_admin_notify = 1 minimal_player_age = 14 - exp_requirements = 180 - exp_required_type = EXP_TYPE_CAMARILLA - exp_required_type_department = EXP_TYPE_CAMARILLA - exp_granted_type = EXP_TYPE_CAMARILLA + exp_requirements = EXP_REQ_HEAD config_tag = "PRIMOGEN_TOREADOR" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/toreador @@ -28,10 +25,22 @@ allowed_splats = list(SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_TOREADOR) - known_contacts = list("Prince") + known_contacts = list( + JOB_PRINCE, + JOB_SHERIFF, + JOB_SENESCHAL, + JOB_HARPY, + JOB_CLUB_WORKER, + JOB_PRIMOGEN_BANU_HAQIM, + JOB_PRIMOGEN_LASOMBRA, + JOB_PRIMOGEN_MALKAVIAN, + JOB_PRIMOGEN_VENTRUE, + JOB_PRIMOGEN_NOSFERATU, + JOB_CHANTRY_REGENT + ) /datum/outfit/job/vampire/toreador - name = "Primogen Toreador" + name = JOB_PRIMOGEN_TOREADOR jobtype = /datum/job/vampire/primogen_toreador ears = /obj/item/radio/headset/darkpack diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm index 2a4ae75592e8..1cae00c12665 100644 --- a/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm +++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm @@ -8,10 +8,7 @@ supervisors = SUPERVISOR_TRADITIONS req_admin_notify = 1 minimal_player_age = 14 - exp_requirements = 180 - exp_required_type = EXP_TYPE_CAMARILLA - exp_required_type_department = EXP_TYPE_CAMARILLA - exp_granted_type = EXP_TYPE_CAMARILLA + exp_requirements = EXP_REQ_HEAD config_tag = "PRIMOGEN_VENTRUE" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/ventrue @@ -27,10 +24,21 @@ allowed_splats = list(SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_VENTRUE) - known_contacts = list("Prince") + known_contacts = list( + JOB_PRINCE, + JOB_SHERIFF, + JOB_SENESCHAL, + JOB_HARPY, + JOB_PRIMOGEN_BANU_HAQIM, + JOB_PRIMOGEN_TOREADOR, + JOB_PRIMOGEN_LASOMBRA, + JOB_PRIMOGEN_MALKAVIAN, + JOB_PRIMOGEN_NOSFERATU, + JOB_CHANTRY_REGENT + ) /datum/outfit/job/vampire/ventrue - name = "Primogen Ventrue" + name = JOB_PRIMOGEN_VENTRUE jobtype = /datum/job/vampire/primogen_ventrue ears = /obj/item/radio/headset/darkpack diff --git a/modular_darkpack/modules/jobs/code/camarilla/prince.dm b/modular_darkpack/modules/jobs/code/camarilla/prince.dm index e86b3edde072..9b2e778f2594 100644 --- a/modular_darkpack/modules/jobs/code/camarilla/prince.dm +++ b/modular_darkpack/modules/jobs/code/camarilla/prince.dm @@ -8,10 +8,8 @@ supervisors = SUPERVISOR_TRADITIONS req_admin_notify = 1 minimal_player_age = 14 - exp_requirements = 180 - exp_required_type = EXP_TYPE_CAMARILLA + exp_requirements = EXP_REQ_CRITICAL exp_required_type_department = EXP_TYPE_CAMARILLA - exp_granted_type = EXP_TYPE_CAMARILLA config_tag = "PRINCE" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/prince @@ -28,20 +26,26 @@ allowed_clans = list(VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_DOMINATE_MALKAVIAN, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_BANU_HAQIM_VIZIER) known_contacts = list( - "Sheriff", - "Seneschal", - "Dealer", - "Tremere Regent", - "Primogens", - "Baron", - "Voivode" + JOB_SHERIFF, + JOB_SENESCHAL, + JOB_HARPY, + JOB_DEALER, + JOB_CHANTRY_REGENT, + JOB_PRIMOGEN_BANU_HAQIM, + JOB_PRIMOGEN_TOREADOR, + JOB_PRIMOGEN_LASOMBRA, + JOB_PRIMOGEN_MALKAVIAN, + JOB_PRIMOGEN_VENTRUE, + JOB_PRIMOGEN_NOSFERATU, + JOB_BARON, + JOB_VOIVODE ) /datum/job/vampire/prince/get_captaincy_announcement(mob/living/captain) return "Prince [captain.real_name] is in the city!" /datum/outfit/job/vampire/prince - name = "Prince" + name = JOB_PRINCE jobtype = /datum/job/vampire/prince ears = /obj/item/radio/headset/darkpack diff --git a/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm b/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm index b4d93e481a52..530ab2a19d9a 100644 --- a/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm +++ b/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm @@ -8,10 +8,7 @@ supervisors = SUPERVISOR_PRINCE req_admin_notify = 1 minimal_player_age = 10 - exp_requirements = 180 - exp_required_type = EXP_TYPE_CAMARILLA - exp_required_type_department = EXP_TYPE_CAMARILLA - exp_granted_type = EXP_TYPE_CAMARILLA + exp_requirements = EXP_REQ_MINOR config_tag = "SENESCHAL" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/clerk @@ -26,10 +23,23 @@ allowed_splats = list(SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_DOMINATE_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_BANU_HAQIM_VIZIER, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_TLACIQUE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD) - known_contacts = list("Prince","Sheriff","Tremere Regent","Dealer","Primogens") + known_contacts = list( + JOB_PRINCE, + JOB_SHERIFF, + JOB_CHANTRY_REGENT, + JOB_DEALER, + JOB_EMISSARY, + JOB_BARON, + JOB_PRIMOGEN_BANU_HAQIM, + JOB_PRIMOGEN_TOREADOR, + JOB_PRIMOGEN_LASOMBRA, + JOB_PRIMOGEN_MALKAVIAN, + JOB_PRIMOGEN_VENTRUE, + JOB_PRIMOGEN_NOSFERATU + ) /datum/outfit/job/vampire/clerk - name = "Seneschal" + name = JOB_SENESCHAL jobtype = /datum/job/vampire/clerk ears = /obj/item/radio/headset/darkpack diff --git a/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm b/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm index ad4bd4741b58..5017b24790d5 100644 --- a/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm +++ b/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm @@ -8,10 +8,7 @@ supervisors = SUPERVISOR_PRINCE req_admin_notify = 1 minimal_player_age = 14 - exp_requirements = 120 - exp_required_type = EXP_TYPE_CAMARILLA - exp_required_type_department = EXP_TYPE_CAMARILLA - exp_granted_type = EXP_TYPE_CAMARILLA + exp_requirements = EXP_REQ_MINOR config_tag = "SHERIFF" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/sheriff @@ -26,10 +23,16 @@ allowed_splats = list(SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_DOMINATE_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_BANU_HAQIM_VIZIER, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_TLACIQUE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_SAMEDI, VAMPIRE_CLAN_NAGARAJA) - known_contacts = list("Prince","Seneschal","Dealer") + known_contacts = list( + JOB_PRINCE, + JOB_SENESCHAL, + JOB_DEALER, + JOB_HARPY, + JOB_HOUND + ) /datum/outfit/job/vampire/sheriff - name = "Sheriff" + name = JOB_SHERIFF jobtype = /datum/job/vampire/sheriff ears = /obj/item/radio/headset/darkpack diff --git a/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm b/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm index 30112046d41e..7fde64e27b32 100644 --- a/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm +++ b/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm @@ -4,7 +4,6 @@ total_positions = 4 spawn_positions = 4 supervisors = SUPERVISOR_SENESCHAL_PUBLIC - exp_granted_type = EXP_TYPE_CAMARILLA config_tag = "TOWER_EMPLOYEE" outfit = /datum/outfit/job/vampire/towerwork job_flags = CITY_JOB_FLAGS @@ -24,14 +23,20 @@ maximal_generation = 9 maximum_immortal_age = 200 - known_contacts = list("Prince", "Sheriff", "Seneschal") + known_contacts = list( + JOB_PRINCE, + JOB_SHERIFF, + JOB_SENESCHAL, + JOB_HOUND, + JOB_TOWERWORK + ) allowed_splats = list(SPLAT_NONE, SPLAT_GHOUL, SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_DOMINATE_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_BANU_HAQIM_VIZIER, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_TLACIQUE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD, VAMPIRE_CLAN_CAPPADOCIAN, VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_SAMEDI, VAMPIRE_CLAN_NAGARAJA) description = "You work directly for the Millenium Tower and its administrative staff in a variety of ways, you may even be a personal retainer of one of the top three, to the point that any oddities that you may see over night or hear are either things you are already aware or you simply laugh them off and try not to think about it." minimum_masquerade = 4 /datum/outfit/job/vampire/towerwork - name = "Tower Employee" + name = JOB_TOWERWORK jobtype = /datum/job/vampire/towerwork id = /obj/item/card/tower_employee diff --git a/modular_darkpack/modules/jobs/code/clinic/director.dm b/modular_darkpack/modules/jobs/code/clinic/director.dm index 4229413981c9..a3414de9b64a 100644 --- a/modular_darkpack/modules/jobs/code/clinic/director.dm +++ b/modular_darkpack/modules/jobs/code/clinic/director.dm @@ -4,21 +4,29 @@ total_positions = 1 spawn_positions = 1 supervisors = "the Hospital Administrator" - exp_required_type_department = EXP_TYPE_CLINIC config_tag = "CLINIC_DIRECTOR" outfit = /datum/outfit/job/vampire/clinic_director job_flags = CITY_JOB_FLAGS + + exp_required_type_department = EXP_TYPE_CLINIC + exp_requirements = EXP_REQ_HEAD + display_order = JOB_DISPLAY_ORDER_CLINICS_DIRECTOR departments_list = list( /datum/job_department/clinic, ) + known_contacts = list( + JOB_DOCTOR, + JOB_PRIMOGEN_MALKAVIAN + ) + description = "Keep Saint John's clinic up and running. Collect blood by helping mortals at the Clinic." allowed_splats = list(SPLAT_KINDRED, SPLAT_GHOUL, SPLAT_NONE) allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_HEALER_SALUBRI, VAMPIRE_CLAN_BAALI, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_GIOVANNI, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_CAITIFF, VAMPIRE_CLAN_KIASYD, VAMPIRE_CLAN_NAGARAJA) /datum/outfit/job/vampire/clinic_director - name = "Clinic Director" + name = JOB_CLINIC_DIRECTOR jobtype = /datum/job/vampire/clinic_director ears = /obj/item/radio/headset/darkpack @@ -27,7 +35,7 @@ shoes = /obj/item/clothing/shoes/vampire/white suit = /obj/item/clothing/suit/vampire/labcoat/director gloves = /obj/item/clothing/gloves/vampire/latex - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/clinic_director r_pocket = /obj/item/vamp/keys/clinics_director backpack_contents = list(/obj/item/card/credit=1, /obj/item/storage/medkit/darkpack/doctor=1) diff --git a/modular_darkpack/modules/jobs/code/clinic/doctor.dm b/modular_darkpack/modules/jobs/code/clinic/doctor.dm index 7f1c0e083e9c..ed866624d632 100644 --- a/modular_darkpack/modules/jobs/code/clinic/doctor.dm +++ b/modular_darkpack/modules/jobs/code/clinic/doctor.dm @@ -4,7 +4,6 @@ total_positions = 4 spawn_positions = 4 supervisors = "the Clinic Director" - exp_required_type_department = EXP_TYPE_CLINIC config_tag = "DOCTOR" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/clinic_doctor @@ -14,6 +13,12 @@ /datum/job_department/clinic, ) + known_contacts = list( + JOB_CLINIC_DIRECTOR, + JOB_DOCTOR, + JOB_PRIMOGEN_MALKAVIAN + ) + description = "Help your fellow kindred in all matters medicine related. Sell blood. Keep your human colleagues ignorant." maximal_generation = 9 maximum_immortal_age = 200 @@ -36,7 +41,7 @@ /datum/outfit/job/vampire/clinic_doctor - name = "Doctor" + name = JOB_DOCTOR jobtype = /datum/job/vampire/doctor ears = /obj/item/radio/headset/darkpack @@ -45,7 +50,7 @@ shoes = /obj/item/clothing/shoes/vampire/white suit = /obj/item/clothing/suit/vampire/labcoat gloves = /obj/item/clothing/gloves/vampire/latex - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/doctor r_pocket = /obj/item/vamp/keys/clinic backpack_contents = list(/obj/item/card/credit=1, /obj/item/storage/medkit/darkpack/doctor=1) diff --git a/modular_darkpack/modules/jobs/code/garou/councillor.dm b/modular_darkpack/modules/jobs/code/garou/councillor.dm index 9bfc9dea083f..88114074f414 100644 --- a/modular_darkpack/modules/jobs/code/garou/councillor.dm +++ b/modular_darkpack/modules/jobs/code/garou/councillor.dm @@ -8,10 +8,8 @@ supervisors = SUPERVISOR_LITANY req_admin_notify = 1 minimal_player_age = 25 - exp_requirements = 180 - exp_required_type = EXP_TYPE_GAIA + exp_requirements = EXP_REQ_HEAD exp_required_type_department = EXP_TYPE_GAIA - exp_granted_type = EXP_TYPE_GAIA config_tag = "COUNCILLOR" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/councillor @@ -25,19 +23,20 @@ ) known_contacts = list( - "Truthcatcher", - "Warder", - "Wyrmfoe", - "Guardian" + JOB_GAROU_TRUTHCATCHER, + JOB_GAROU_WARDER, + JOB_GAROU_WYRMFOE, + JOB_GAROU_GUARDIAN, + JOB_GAROU_COUNCIL ) /datum/outfit/job/vampire/councillor - name = "Sept Councillor" + name = JOB_GAROU_COUNCIL jobtype = /obj/item/card/park_ranger/oversight id = /obj/item/card/park_ranger/oversight uniform = /obj/item/clothing/under/vampire/turtleneck_white suit = /obj/item/clothing/suit/vampire/coat/winter/alt shoes = /obj/item/clothing/shoes/vampire/jackboots/work - l_pocket = /obj/item/smartphone // DARKPACK TODO - Garou phone network. Glasswalkers only? + l_pocket = /obj/item/smartphone/garou_council // DARKPACK TODO - Garou phone network. Glasswalkers only? backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol/darkpack/deagle=1, /obj/item/phone_book=1, /obj/item/card/credit/rich=1) diff --git a/modular_darkpack/modules/jobs/code/garou/guardian.dm b/modular_darkpack/modules/jobs/code/garou/guardian.dm index 23b2d8c18175..8b7521578b3c 100644 --- a/modular_darkpack/modules/jobs/code/garou/guardian.dm +++ b/modular_darkpack/modules/jobs/code/garou/guardian.dm @@ -8,10 +8,7 @@ supervisors = /datum/job/vampire/warder req_admin_notify = 1 minimal_player_age = 25 - exp_requirements = 50 - exp_required_type = EXP_TYPE_GAIA exp_required_type_department = EXP_TYPE_GAIA - exp_granted_type = EXP_TYPE_GAIA config_tag = "GUARDIAN" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/guardian @@ -25,14 +22,15 @@ ) known_contacts = list( - "Councillor", - "Truthcatcher", - "Warder", - "Wyrmfoe" + JOB_GAROU_COUNCIL, + JOB_GAROU_TRUTHCATCHER, + JOB_GAROU_WARDER, + JOB_GAROU_WYRMFOE, + JOB_GAROU_GUARDIAN ) /datum/outfit/job/vampire/guardian - name = "Sept Guardian" + name = JOB_GAROU_GUARDIAN jobtype = /datum/job/vampire/guardian id = /obj/item/card/park_ranger @@ -42,5 +40,5 @@ belt = /obj/item/melee/baton/vamp gloves = /obj/item/clothing/gloves/vampire/leather suit = /obj/item/clothing/suit/vampire/jacket - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/garou_guardian backpack_contents = list(/obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm b/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm index c0f610d7e326..8cd8e3b0933a 100644 --- a/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm +++ b/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm @@ -8,13 +8,11 @@ supervisors = SUPERVISOR_LITANY req_admin_notify = 1 minimal_player_age = 25 - exp_requirements = 100 - exp_required_type = EXP_TYPE_GAIA + exp_requirements = EXP_REQ_MINOR exp_required_type_department = EXP_TYPE_GAIA - exp_granted_type = EXP_TYPE_GAIA config_tag = "TRUTHCATCHER" job_flags = CITY_JOB_FLAGS - outfit = /datum/outfit/job/vampire/trutchcatcher + outfit = /datum/outfit/job/vampire/truthcatcher allowed_splats = list(SPLAT_GAROU) allowed_tribes = TRIBE_LIST_GAIA @@ -26,14 +24,14 @@ ) known_contacts = list( - "Councillor", - "Warder", - "Wyrmfoe", - "Guardian" + JOB_GAROU_COUNCIL, + JOB_GAROU_WARDER, + JOB_GAROU_WYRMFOE, + JOB_GAROU_GUARDIAN ) -/datum/outfit/job/vampire/trutchcatcher - name = "Sept Truthcatcher" +/datum/outfit/job/vampire/truthcatcher + name = JOB_GAROU_TRUTHCATCHER jobtype = /datum/job/vampire/truthcatcher id = /obj/item/card/park_ranger/guide @@ -41,6 +39,6 @@ suit = /obj/item/clothing/suit/vampire/coat/winter/alt gloves = /obj/item/clothing/gloves/vampire/work shoes = /obj/item/clothing/shoes/vampire/jackboots/work - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/garou_truthcatcher backpack_contents = list(/obj/item/phone_book=1, /obj/item/veil_contract, /obj/item/card/credit/rich=1) diff --git a/modular_darkpack/modules/jobs/code/garou/warder.dm b/modular_darkpack/modules/jobs/code/garou/warder.dm index 5d991a16154f..81c1516ffb05 100644 --- a/modular_darkpack/modules/jobs/code/garou/warder.dm +++ b/modular_darkpack/modules/jobs/code/garou/warder.dm @@ -8,10 +8,8 @@ supervisors = SUPERVISOR_LITANY req_admin_notify = 1 minimal_player_age = 25 - exp_requirements = 100 - exp_required_type = EXP_TYPE_GAIA + exp_requirements = EXP_REQ_MINOR exp_required_type_department = EXP_TYPE_GAIA - exp_granted_type = EXP_TYPE_GAIA config_tag = "WARDER" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/warder @@ -26,14 +24,14 @@ ) known_contacts = list( - "Councillor", - "Truthcatcher", - "Wyrmfoe", - "Guardian" + JOB_GAROU_COUNCIL, + JOB_GAROU_TRUTHCATCHER, + JOB_GAROU_WYRMFOE, + JOB_GAROU_GUARDIAN ) /datum/outfit/job/vampire/warder - name = "Sept Warder" + name = JOB_GAROU_WARDER jobtype = /datum/job/vampire/warder id = /obj/item/card/park_ranger/leader @@ -44,5 +42,5 @@ belt = /obj/item/storage/belt/sheath/vamp/sabre suit = /obj/item/clothing/suit/vampire/vest/medieval glasses = /obj/item/clothing/glasses/vampire/sun - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/garou_warder backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol/darkpack/deagle=1, /obj/item/veil_contract, /obj/item/card/credit/rich=1) diff --git a/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm b/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm index 30091dc9cb7d..9087bcbf75e1 100644 --- a/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm +++ b/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm @@ -8,10 +8,8 @@ supervisors = SUPERVISOR_LITANY req_admin_notify = 1 minimal_player_age = 25 - exp_requirements = 100 - exp_required_type = EXP_TYPE_GAIA + exp_requirements = EXP_REQ_MINOR exp_required_type_department = EXP_TYPE_GAIA - exp_granted_type = EXP_TYPE_GAIA config_tag = "WYRMFOE" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/wyrmfoe @@ -25,14 +23,14 @@ ) known_contacts = list( - "Councillor", - "Truthcatcher", - "Wyrmfoe", - "Guardian" + JOB_GAROU_COUNCIL, + JOB_GAROU_TRUTHCATCHER, + JOB_GAROU_WARDER, + JOB_GAROU_GUARDIAN ) /datum/outfit/job/vampire/wyrmfoe - name = "Sept Wyrmfoe" + name = JOB_GAROU_WYRMFOE jobtype = /datum/job/vampire/wyrmfoe id = /obj/item/card/park_ranger/biologist @@ -40,5 +38,5 @@ suit = /obj/item/clothing/suit/vampire/labcoat gloves = /obj/item/clothing/gloves/vampire/work shoes = /obj/item/clothing/shoes/vampire/jackboots/work - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/garou_wyrmfoe backpack_contents = list(/obj/item/phone_book=1, /obj/item/card/credit/rich=1) diff --git a/modular_darkpack/modules/jobs/code/giovanni/capo.dm b/modular_darkpack/modules/jobs/code/giovanni/capo.dm index 589e2881f17d..39b06af3688a 100644 --- a/modular_darkpack/modules/jobs/code/giovanni/capo.dm +++ b/modular_darkpack/modules/jobs/code/giovanni/capo.dm @@ -8,18 +8,30 @@ outfit = /datum/outfit/job/vampire/capo job_flags = CITY_JOB_FLAGS display_order = 1 - exp_required_type_department = EXP_TYPE_GIOVANNI departments_list = list( /datum/job_department/giovanni, ) + exp_required_type_department = EXP_TYPE_GIOVANNI + exp_requirements = EXP_REQ_HEAD + + known_contacts = list( + JOB_LA_FAMIGLIA, + JOB_LA_SQUADRA, + JOB_PRINCE, + JOB_SENESCHAL, + JOB_SHERIFF, + JOB_BARON, + JOB_EMISSARY + ) + description = "Pure blood runs through your veins and, with it, old power. Throughout your long life you have learnt to hold onto two things and never let go: money, and family." minimum_masquerade = 0 allowed_splats = list(SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_GIOVANNI) /datum/outfit/job/vampire/capo - name = "Capo" + name = JOB_CAPO jobtype = /datum/job/vampire/capo glasses = /obj/item/clothing/glasses/vampire/sun diff --git a/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm b/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm index 92fd139c298a..733956d6fc8d 100644 --- a/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm +++ b/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm @@ -13,6 +13,12 @@ /datum/job_department/giovanni, ) + known_contacts = list( + JOB_CAPO, + JOB_LA_SQUADRA, + JOB_LA_FAMIGLIA + ) + allowed_splats = list(SPLAT_GHOUL, SPLAT_NONE, SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_CAITIFF) maximal_generation = 9 @@ -21,7 +27,7 @@ minimum_masquerade = 0 /datum/outfit/job/vampire/famiglia - name = "La Famiglia" + name = JOB_LA_FAMIGLIA jobtype = /datum/job/vampire/famiglia glasses = /obj/item/clothing/glasses/vampire/sun uniform = /obj/item/clothing/under/vampire/suit @@ -30,3 +36,7 @@ l_pocket = /obj/item/smartphone/giovanni_famiglia r_pocket = /obj/item/vamp/keys/giovanni backpack_contents = list(/obj/item/card/credit=1) + +/datum/outfit/job/vampire/famiglia/post_equip(mob/living/carbon/human/H) + . = ..() + H.grant_language(/datum/language/italian, source = "job") diff --git a/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm b/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm index bd713ff7881c..d198390d036f 100644 --- a/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm +++ b/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm @@ -13,6 +13,12 @@ /datum/job_department/giovanni, ) + known_contacts = list( + JOB_LA_FAMIGLIA, + JOB_CAPO, + JOB_LA_SQUADRA + ) + description = "Whether born or Embraced into the family, you are one of the Giovanni. Be you a necromancer, financier or lowly fledgling, remember that so long as you stand with your family, they too will stand with you." maximal_generation = 9 maximum_immortal_age = 200 @@ -21,7 +27,7 @@ allowed_clans = list(VAMPIRE_CLAN_GIOVANNI) /datum/outfit/job/vampire/squadra - name = "La Squadra" + name = JOB_LA_SQUADRA jobtype = /datum/job/vampire/squadra glasses = /obj/item/clothing/glasses/vampire/sun @@ -32,10 +38,8 @@ r_pocket = /obj/item/vamp/keys/giovanni backpack_contents = list(/obj/item/card/credit/rich=1, /obj/item/ritual_tome/necromancy=1, /obj/item/vamp/keys/graveyard = 1) - /datum/job/vampire/squadra/after_spawn(mob/living/spawned, client/player_client) . = ..() var/obj/structure/vaultdoor/pincode/bank/door = locate() in GLOB.vault_doors if(door) spawned.mind.add_memory(/datum/memory/key/bank_vault_code, remembered_code = door.pincode) - diff --git a/modular_darkpack/modules/jobs/code/hunters/abbe.dm b/modular_darkpack/modules/jobs/code/hunters/abbe.dm index dfbf906aed44..fb39be89a7d6 100644 --- a/modular_darkpack/modules/jobs/code/hunters/abbe.dm +++ b/modular_darkpack/modules/jobs/code/hunters/abbe.dm @@ -11,14 +11,24 @@ job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/abbe + exp_requirements = EXP_REQ_HEAD + exp_required_type_department = EXP_TYPE_SOCIETY_OF_LEOPOLD + display_order = JOB_DISPLAY_ORDER_ABBE departments_list = list( /datum/job_department/society_of_leopold, ) + + known_contacts = list( + JOB_CONDOTTIERI, + JOB_INQUISITOR, + JOB_NOVICE + ) + allowed_splats = list(SPLAT_NONE) /datum/outfit/job/vampire/abbe - name = "Abbe" + name = JOB_ABBE jobtype = /datum/job/vampire/abbe id = /obj/item/card/hunter @@ -35,3 +45,8 @@ . = ..() if(H.mind) H.mind.set_holy_role(HOLY_ROLE_HIGHPRIEST) + +/datum/outfit/job/vampire/abbe/post_equip(mob/living/carbon/human/H) + . = ..() + H.grant_language(/datum/language/latin, source = "job") + H.grant_language(/datum/language/italian, source = "job") diff --git a/modular_darkpack/modules/jobs/code/hunters/condottieri.dm b/modular_darkpack/modules/jobs/code/hunters/condottieri.dm index d67095064b66..cbf4baa8f476 100644 --- a/modular_darkpack/modules/jobs/code/hunters/condottieri.dm +++ b/modular_darkpack/modules/jobs/code/hunters/condottieri.dm @@ -17,10 +17,17 @@ /datum/job_department/society_of_leopold, ) + known_contacts = list( + JOB_ABBE, + JOB_INQUISITOR, + JOB_NOVICE, + JOB_CONDOTTIERI + ) + allowed_splats = list(SPLAT_NONE) /datum/outfit/job/vampire/condottieri - name = "Condottieri" + name = JOB_CONDOTTIERI jobtype = /datum/job/vampire/condottieri id = /obj/item/card/hunter @@ -38,3 +45,7 @@ . = ..() if(H.mind) H.mind.set_holy_role(HOLY_ROLE_PRIEST) + +/datum/outfit/job/vampire/condottieri/post_equip(mob/living/carbon/human/H) + . = ..() + H.grant_language(/datum/language/latin, source = "job") diff --git a/modular_darkpack/modules/jobs/code/hunters/inquisitor.dm b/modular_darkpack/modules/jobs/code/hunters/inquisitor.dm index 5977188d7a3c..ba8b7638a841 100644 --- a/modular_darkpack/modules/jobs/code/hunters/inquisitor.dm +++ b/modular_darkpack/modules/jobs/code/hunters/inquisitor.dm @@ -15,11 +15,19 @@ departments_list = list( /datum/job_department/society_of_leopold, ) + + known_contacts = list( + JOB_ABBE, + JOB_CONDOTTIERI, + JOB_NOVICE, + JOB_INQUISITOR + ) + splat_slots = list(SPLAT_GHOUL = 1, SPLAT_KINFOLK = 1, SPLAT_NONE = 3) allowed_splats = list(SPLAT_NONE, SPLAT_GHOUL, SPLAT_KINFOLK) // infiltrators and betrayal arcs /datum/outfit/job/vampire/inquisitor - name = "Inquisitor" + name = JOB_INQUISITOR jobtype = /datum/job/vampire/inquisitor id = /obj/item/card/hunter @@ -37,3 +45,7 @@ . = ..() if(H.mind) H.mind.set_holy_role(HOLY_ROLE_PRIEST) + +/datum/outfit/job/vampire/inquisitor/post_equip(mob/living/carbon/human/H) + . = ..() + H.grant_language(/datum/language/latin, source = "job") diff --git a/modular_darkpack/modules/jobs/code/hunters/novice.dm b/modular_darkpack/modules/jobs/code/hunters/novice.dm index 31d61248fbaa..d481076ba348 100644 --- a/modular_darkpack/modules/jobs/code/hunters/novice.dm +++ b/modular_darkpack/modules/jobs/code/hunters/novice.dm @@ -16,11 +16,18 @@ /datum/job_department/society_of_leopold, ) + known_contacts = list( + JOB_ABBE, + JOB_CONDOTTIERI, + JOB_INQUISITOR, + JOB_NOVICE + ) + allowed_splats = list(SPLAT_NONE) /datum/outfit/job/vampire/novice - name = "Novice" + name = JOB_NOVICE jobtype = /datum/job/vampire/novice id = /obj/item/card/hunter @@ -36,3 +43,7 @@ . = ..() if(H.mind) H.mind.set_holy_role(HOLY_ROLE_DEACON) + +/datum/outfit/job/vampire/novice/post_equip(mob/living/carbon/human/H) + . = ..() + H.grant_language(/datum/language/latin, source = "job") diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/citizen.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/citizen.dm index 1eecac4916c9..b4a0832b0700 100644 --- a/modular_darkpack/modules/jobs/code/miscelllaneous/citizen.dm +++ b/modular_darkpack/modules/jobs/code/miscelllaneous/citizen.dm @@ -5,7 +5,6 @@ total_positions = -1 spawn_positions = -1 outfit = /datum/outfit/job/vampire/citizen - exp_granted_type = EXP_TYPE_KINDRED config_tag = "CITIZEN" display_order = JOB_DISPLAY_ORDER_CITIZEN departments_list = list( diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm index a22a7911fce1..cb42c6c94141 100644 --- a/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm +++ b/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm @@ -13,6 +13,11 @@ /datum/job_department/strip_club ) + known_contacts = list( + JOB_CLUB_WORKER, + JOB_PRIMOGEN_TOREADOR + ) + alt_titles = list( "Club Worker", "Stripper", @@ -29,9 +34,9 @@ minimum_masquerade = 3 /datum/outfit/job/vampire/club_worker - name = "Stripper" + name = JOB_CLUB_WORKER jobtype = /datum/job/vampire/citizen - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/club_worker r_pocket = /obj/item/vamp/keys/strip backpack_contents = list(/obj/item/card/credit=1) uses_default_clan_clothes = TRUE diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/janitor.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/janitor.dm index 2bbed73d6dfa..15a8cb7cca68 100644 --- a/modular_darkpack/modules/jobs/code/miscelllaneous/janitor.dm +++ b/modular_darkpack/modules/jobs/code/miscelllaneous/janitor.dm @@ -16,13 +16,17 @@ maximum_immortal_age = 100 minimum_masquerade = 0 + known_contacts = list( + JOB_STREET_JANITOR + ) + /datum/outfit/job/vampire/janitor - name = "Street Janitor" + name = JOB_STREET_JANITOR jobtype = /datum/job/vampire/janitor id = /obj/item/card/cleaning uniform = /obj/item/clothing/under/vampire/janitor - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/janitor r_pocket = /obj/item/vamp/keys/cleaning shoes = /obj/item/clothing/shoes/vampire/jackboots/work gloves = /obj/item/clothing/gloves/vampire/cleaning diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/priest.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/priest.dm index 43f23704042a..5357627c2079 100644 --- a/modular_darkpack/modules/jobs/code/miscelllaneous/priest.dm +++ b/modular_darkpack/modules/jobs/code/miscelllaneous/priest.dm @@ -18,6 +18,11 @@ maximum_immortal_age = 100 description = "Be the shepherd of the flock in " + CITY_NAME + ", lead them to salvation, piety and righteousness." + known_contacts = list( + JOB_PRIEST, + JOB_PRIMOGEN_LASOMBRA + ) + alt_titles = list( "Priest", "Nun", @@ -31,13 +36,13 @@ ) /datum/outfit/job/vampire/priest - name = "Priest" + name = JOB_PRIEST jobtype = /datum/job/vampire/priest uniform = /obj/item/clothing/under/vampire/graveyard shoes = /obj/item/clothing/shoes/vampire/jackboots id = /obj/item/card/hunter - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/priest r_pocket = /obj/item/flashlight l_hand = /obj/item/vamp/keys/church back = /obj/item/storage/backpack/satchel diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/red_news.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/red_news.dm index 434bbe972bc3..ef2b5f3a11be 100644 --- a/modular_darkpack/modules/jobs/code/miscelllaneous/red_news.dm +++ b/modular_darkpack/modules/jobs/code/miscelllaneous/red_news.dm @@ -5,7 +5,6 @@ total_positions = 2 spawn_positions = 2 outfit = /datum/outfit/job/vampire/red_news_reporter - exp_granted_type = EXP_TYPE_SPIRAL config_tag = "RED_NEWS_REPORTER" display_order = JOB_DISPLAY_ORDER_RED_NEWS_REPORTER departments_list = list( @@ -22,11 +21,14 @@ ) disallowed_clans = list(VAMPIRE_CLAN_CAPPADOCIAN, VAMPIRE_CLAN_SAMEDI, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD, VAMPIRE_CLAN_NOSFERATU) + known_contacts = list( + JOB_RED_NEWS_REPORTER + ) /datum/outfit/job/vampire/red_news_reporter name = JOB_RED_NEWS_REPORTER jobtype = /datum/job/vampire/red_news_reporter - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/red_news backpack_contents = list(/obj/item/card/credit) uniform = /obj/item/clothing/under/vampire/suit l_hand = /obj/item/broadcast_camera diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/taxi.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/taxi.dm index 348520bd5132..6b256f03dfc8 100644 --- a/modular_darkpack/modules/jobs/code/miscelllaneous/taxi.dm +++ b/modular_darkpack/modules/jobs/code/miscelllaneous/taxi.dm @@ -13,17 +13,21 @@ /datum/job_department/city_services, ) + known_contacts = list( + JOB_TAXI_DRIVER + ) + description = "Drive people in the city." minimum_masquerade = 0 //Not including a max generation for reasons of Caine. /datum/outfit/job/vampire/taxi - name = "Taxi Driver" + name = JOB_TAXI_DRIVER jobtype = /datum/job/vampire/taxi glasses = /obj/item/clothing/glasses/vampire/sun uniform = /obj/item/clothing/under/vampire/suit shoes = /obj/item/clothing/shoes/vampire - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/taxi r_pocket = /obj/item/vamp/keys/taxi backpack_contents = list(/obj/item/card/credit=1, /obj/item/melee/vamp/tire=1) diff --git a/modular_darkpack/modules/jobs/code/pentex/affairs.dm b/modular_darkpack/modules/jobs/code/pentex/affairs.dm index 7689936c9556..21f067a86aeb 100644 --- a/modular_darkpack/modules/jobs/code/pentex/affairs.dm +++ b/modular_darkpack/modules/jobs/code/pentex/affairs.dm @@ -8,10 +8,8 @@ supervisors = "the Board and the Branch Lead" req_admin_notify = 1 minimal_player_age = 25 - exp_requirements = 150 - exp_required_type = EXP_TYPE_SPIRAL + exp_requirements = EXP_REQ_MINOR exp_required_type_department = EXP_TYPE_SPIRAL - exp_granted_type = EXP_TYPE_SPIRAL config_tag = "PENTEX_AFFAIRS" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/affairs @@ -29,7 +27,9 @@ known_contacts = list( JOB_PENTEX_LEAD, JOB_PENTEX_EXEC, - JOB_PENTEX_SEC_CHIEF + JOB_PENTEX_SEC_CHIEF, + JOB_PENTEX_EMPLOYEE, + JOB_PENTEX_SEC ) paycheck = PAYCHECK_COMMAND @@ -45,6 +45,6 @@ id = /obj/item/card/pentex/affairs uniform = /obj/item/clothing/under/vampire/pentex_suit shoes = /obj/item/clothing/shoes/vampire/businessblack - l_pocket = /obj/item/smartphone // /affairsagent - todo subtype + l_pocket = /obj/item/smartphone/endron_affairs r_pocket = /obj/item/vamp/keys/pentex backpack_contents = list(/obj/item/phone_book=1, /obj/item/veil_contract, /obj/item/card/credit/rich=1) diff --git a/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm b/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm index 6fabedd599c7..ab154e0abc7b 100644 --- a/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm +++ b/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm @@ -8,10 +8,8 @@ supervisors = "the Board" req_admin_notify = 1 minimal_player_age = 25 - exp_requirements = 180 - exp_required_type = EXP_TYPE_SPIRAL + exp_requirements = EXP_REQ_HEAD exp_required_type_department = EXP_TYPE_SPIRAL - exp_granted_type = EXP_TYPE_SPIRAL config_tag = "PENTEX_BRANCH_LEAD" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/branch_lead @@ -35,7 +33,9 @@ known_contacts = list( JOB_PENTEX_EXEC, JOB_PENTEX_AFFAIRS, - JOB_PENTEX_SEC_CHIEF + JOB_PENTEX_SEC_CHIEF, + JOB_PENTEX_EMPLOYEE, + JOB_PENTEX_SEC ) paycheck = PAYCHECK_COMMAND @@ -52,6 +52,6 @@ uniform = /obj/item/clothing/under/vampire/pentex_executive_suit shoes = /obj/item/clothing/shoes/vampire/businessblack suit = /obj/item/clothing/suit/vampire/pentex_labcoat_alt - l_pocket = /obj/item/smartphone // /branch_lead - TODO: phone subtype + l_pocket = /obj/item/smartphone/endron_lead r_pocket = /obj/item/vamp/keys/pentex backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol/darkpack/deagle=1, /obj/item/phone_book=1, /obj/item/card/credit/prince=1) diff --git a/modular_darkpack/modules/jobs/code/pentex/employee.dm b/modular_darkpack/modules/jobs/code/pentex/employee.dm index df8c2fdf2348..46dd544e8e7a 100644 --- a/modular_darkpack/modules/jobs/code/pentex/employee.dm +++ b/modular_darkpack/modules/jobs/code/pentex/employee.dm @@ -8,10 +8,7 @@ supervisors = "the Board and the Branch Lead" req_admin_notify = 1 minimal_player_age = 25 - exp_requirements = 50 - exp_required_type = EXP_TYPE_SPIRAL exp_required_type_department = EXP_TYPE_SPIRAL - exp_granted_type = EXP_TYPE_SPIRAL config_tag = "PENTEX_EMPLOYEE" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/employee @@ -37,7 +34,10 @@ known_contacts = list( JOB_PENTEX_LEAD, JOB_PENTEX_EXEC, - JOB_PENTEX_AFFAIRS + JOB_PENTEX_AFFAIRS, + JOB_PENTEX_SEC_CHIEF, + JOB_PENTEX_SEC, + JOB_PENTEX_EMPLOYEE ) paycheck = PAYCHECK_CREW @@ -55,5 +55,5 @@ gloves = /obj/item/clothing/gloves/vampire/work shoes = /obj/item/clothing/shoes/vampire r_pocket = /obj/item/vamp/keys/pentex - l_pocket = /obj/item/smartphone // /employee - todo subtype + l_pocket = /obj/item/smartphone/endron_employee backpack_contents = list(/obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/pentex/executive.dm b/modular_darkpack/modules/jobs/code/pentex/executive.dm index 19ff697805cc..ecae694cca2f 100644 --- a/modular_darkpack/modules/jobs/code/pentex/executive.dm +++ b/modular_darkpack/modules/jobs/code/pentex/executive.dm @@ -8,10 +8,8 @@ supervisors = "the Board and the Branch Lead" req_admin_notify = 1 minimal_player_age = 25 - exp_requirements = 150 - exp_required_type = EXP_TYPE_SPIRAL + exp_requirements = EXP_REQ_HEAD exp_required_type_department = EXP_TYPE_SPIRAL - exp_granted_type = EXP_TYPE_SPIRAL config_tag = "PENTEX_EXECUTIVE" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/executive @@ -41,7 +39,9 @@ known_contacts = list( JOB_PENTEX_LEAD, JOB_PENTEX_AFFAIRS, - JOB_PENTEX_SEC_CHIEF + JOB_PENTEX_SEC_CHIEF, + JOB_PENTEX_EMPLOYEE, + JOB_PENTEX_SEC ) paycheck = PAYCHECK_COMMAND @@ -57,6 +57,6 @@ id = /obj/item/card/pentex/executive uniform = /obj/item/clothing/under/vampire/pentex_executive_suit shoes = /obj/item/clothing/shoes/vampire/businessblack - l_pocket = /obj/item/smartphone // /pentex_exec - todo: subtype + l_pocket = /obj/item/smartphone/endron_exec r_pocket = /obj/item/vamp/keys/pentex backpack_contents = list(/obj/item/phone_book=1, /obj/item/card/credit/seneschal=1) diff --git a/modular_darkpack/modules/jobs/code/pentex/sec.dm b/modular_darkpack/modules/jobs/code/pentex/sec.dm index a30353cf9ad2..ce45b00f1c3a 100644 --- a/modular_darkpack/modules/jobs/code/pentex/sec.dm +++ b/modular_darkpack/modules/jobs/code/pentex/sec.dm @@ -8,10 +8,7 @@ supervisors = "the Board, Branch Lead, and Chief of Security" req_admin_notify = 1 minimal_player_age = 25 - exp_requirements = 100 - exp_required_type = EXP_TYPE_SPIRAL - exp_required_type_department = EXP_TYPE_SPIRAL - exp_granted_type = EXP_TYPE_SPIRAL + exp_requirements = EXP_REQ_MINOR config_tag = "PENTEX_SEC" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/pentex_sec @@ -30,7 +27,9 @@ JOB_PENTEX_LEAD, JOB_PENTEX_EXEC, JOB_PENTEX_AFFAIRS, - JOB_PENTEX_SEC_CHIEF + JOB_PENTEX_SEC_CHIEF, + JOB_PENTEX_EMPLOYEE, + JOB_PENTEX_SEC ) paycheck = PAYCHECK_CREW @@ -49,6 +48,6 @@ gloves = /obj/item/clothing/gloves/vampire/work suit = /obj/item/clothing/suit/vampire/vest belt = /obj/item/storage/belt/holster/detective/darkpack/endron - l_pocket = /obj/item/smartphone // /sec - todo subtype + l_pocket = /obj/item/smartphone/endron_security r_pocket = /obj/item/vamp/keys/pentex backpack_contents = list(/obj/item/phone_book=1, /obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/pentex/secchief.dm b/modular_darkpack/modules/jobs/code/pentex/secchief.dm index 7a2e7e4a7b59..34cfcd323f7f 100644 --- a/modular_darkpack/modules/jobs/code/pentex/secchief.dm +++ b/modular_darkpack/modules/jobs/code/pentex/secchief.dm @@ -8,10 +8,8 @@ supervisors = "the Board and the Branch Lead" req_admin_notify = 1 minimal_player_age = 25 - exp_requirements = 150 - exp_required_type = EXP_TYPE_SPIRAL + exp_requirements = EXP_REQ_MINOR exp_required_type_department = EXP_TYPE_SPIRAL - exp_granted_type = EXP_TYPE_SPIRAL config_tag = "PENTEX_SECCHIEF" job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/secchief @@ -29,7 +27,9 @@ known_contacts = list( JOB_PENTEX_LEAD, JOB_PENTEX_EXEC, - JOB_PENTEX_AFFAIRS + JOB_PENTEX_AFFAIRS, + JOB_PENTEX_EMPLOYEE, + JOB_PENTEX_SEC ) paycheck = PAYCHECK_COMMAND @@ -38,7 +38,7 @@ liver_traits = list(TRAIT_ROYAL_METABOLISM) /datum/outfit/job/vampire/secchief - name = "Endron Chief of Security" + name = JOB_PENTEX_SEC_CHIEF jobtype = /datum/job/vampire/secchief ears = /obj/item/radio/headset/darkpack @@ -50,6 +50,6 @@ suit = /obj/item/clothing/suit/vampire/vest belt = /obj/item/storage/belt/holster/detective/darkpack/endron glasses = /obj/item/clothing/glasses/vampire/sun - l_pocket = /obj/item/smartphone // /secchief - todo subtype + l_pocket = /obj/item/smartphone/endron_sec_chief r_pocket = /obj/item/vamp/keys/pentex backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol/darkpack/deagle=1, /obj/item/phone_book=1, /obj/item/veil_contract, /obj/item/card/credit/rich=1) diff --git a/modular_darkpack/modules/jobs/code/police/captain.dm b/modular_darkpack/modules/jobs/code/police/captain.dm index 1e4183d11274..64bc0b083da4 100644 --- a/modular_darkpack/modules/jobs/code/police/captain.dm +++ b/modular_darkpack/modules/jobs/code/police/captain.dm @@ -13,13 +13,21 @@ /datum/job_department/police, ) + exp_requirements = EXP_REQ_HEAD + allowed_splats = list(SPLAT_NONE) description = "Underpaid, overworked, and understrength. Do your best to keep the order in " + CITY_NAME + ". Keep the officers in line." minimum_masquerade = 0 + known_contacts = list( + JOB_POLICE_SERGEANT, + JOB_EMERGENCY_DISPATCHER, + JOB_FEDERAL_INVESTIGATOR + ) + /datum/outfit/job/vampire/police_captain - name = "Police Captain" + name = JOB_POLICE_CAPTAIN jobtype = /datum/job/vampire/police_captain ears = /obj/item/radio/headset/darkpack/police @@ -28,7 +36,7 @@ suit = /obj/item/clothing/suit/vampire/vest/police/captain belt = /obj/item/storage/belt/holster/detective/darkpack/officer id = /obj/item/card/police/captain - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/police_captain r_pocket = /obj/item/vamp/keys/police/secure/captain backpack_contents = list( /obj/item/card/credit = 1, diff --git a/modular_darkpack/modules/jobs/code/police/dispatcher.dm b/modular_darkpack/modules/jobs/code/police/dispatcher.dm index 822a5b67cc21..d8e8ae5c96c6 100644 --- a/modular_darkpack/modules/jobs/code/police/dispatcher.dm +++ b/modular_darkpack/modules/jobs/code/police/dispatcher.dm @@ -19,15 +19,20 @@ description = "Report emergencies to the correct emergency service." minimum_masquerade = 0 - known_contacts = list("Police Captain") + known_contacts = list( + JOB_POLICE_CAPTAIN, + JOB_POLICE_SERGEANT, + JOB_POLICE_OFFICER, + JOB_EMERGENCY_DISPATCHER + ) /datum/outfit/job/vampire/dispatcher - name = "Dispatcher" + name = JOB_EMERGENCY_DISPATCHER jobtype = /datum/job/vampire/dispatcher uniform = /obj/item/clothing/under/vampire/office ears = /obj/item/radio/headset/darkpack shoes = /obj/item/clothing/shoes/vampire/businessblack id = /obj/item/card/government - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/dispatch r_pocket = /obj/item/vamp/keys/dispatch backpack_contents = list(/obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/police/fbi.dm b/modular_darkpack/modules/jobs/code/police/fbi.dm index 75b247a8b663..1fa6357001e9 100644 --- a/modular_darkpack/modules/jobs/code/police/fbi.dm +++ b/modular_darkpack/modules/jobs/code/police/fbi.dm @@ -8,11 +8,15 @@ outfit = /datum/outfit/job/vampire/fbi job_flags = CITY_JOB_FLAGS display_order = JOB_DISPLAY_ORDER_FBI - exp_required_type_department = EXP_TYPE_NATIONAL_SECURITY departments_list = list( /datum/job_department/police, ) + known_contacts = list( + JOB_POLICE_CAPTAIN, + JOB_FEDERAL_INVESTIGATOR + ) + allowed_splats = list(SPLAT_NONE) description = "Enforce the Law." minimum_masquerade = 0 @@ -20,7 +24,7 @@ known_contacts = list("Police Captain") /datum/outfit/job/vampire/fbi - name = "Federal Investigator" + name = JOB_FEDERAL_INVESTIGATOR jobtype = /datum/job/vampire/fbi ears = /obj/item/radio/headset/darkpack/police @@ -30,7 +34,7 @@ belt = /obj/item/storage/belt/holster/detective/darkpack/fbi id = /obj/item/card/police/fbi gloves = /obj/item/clothing/gloves/vampire/investigator - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/federal_investigator r_pocket = /obj/item/vamp/keys/police/federal backpack_contents = list(/obj/item/card/police/sergeant=1, /obj/item/camera/detective=1, /obj/item/camera_film=1, /obj/item/taperecorder=1, /obj/item/tape=1, /obj/item/card/credit=1, /obj/item/ammo_box/darkpack/c45acp/hp=1, /obj/item/storage/medkit/darkpack/ifak=1) diff --git a/modular_darkpack/modules/jobs/code/police/police.dm b/modular_darkpack/modules/jobs/code/police/police.dm index 7cfcb6d9ba67..9debd994a237 100644 --- a/modular_darkpack/modules/jobs/code/police/police.dm +++ b/modular_darkpack/modules/jobs/code/police/police.dm @@ -8,7 +8,6 @@ outfit = /datum/outfit/job/vampire/police_officer job_flags = CITY_JOB_FLAGS display_order = JOB_DISPLAY_ORDER_POLICE - exp_required_type_department = EXP_TYPE_POLICE departments_list = list( /datum/job_department/police, ) @@ -25,10 +24,14 @@ description = "Enforce the Law." minimum_masquerade = 0 - known_contacts = list("Police Captain") + known_contacts = list( + JOB_POLICE_CAPTAIN, + JOB_POLICE_SERGEANT, + JOB_EMERGENCY_DISPATCHER + ) /datum/outfit/job/vampire/police_officer - name = "Police Officer" + name = JOB_POLICE_OFFICER jobtype = /datum/job/vampire/police_officer ears = /obj/item/radio/headset/darkpack/police @@ -37,7 +40,7 @@ suit = /obj/item/clothing/suit/vampire/vest/police belt = /obj/item/storage/belt/security/police id = /obj/item/card/police - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/police_officer r_pocket = /obj/item/vamp/keys/police backpack_contents = list(/obj/item/card/credit=1, /obj/item/ammo_box/darkpack/c9mm = 1, /obj/item/storage/medkit/darkpack/ifak = 1, /obj/item/bodycam_upgrade = 1) diff --git a/modular_darkpack/modules/jobs/code/police/sergeant.dm b/modular_darkpack/modules/jobs/code/police/sergeant.dm index 40ca2f17258e..a8e25f66fd75 100644 --- a/modular_darkpack/modules/jobs/code/police/sergeant.dm +++ b/modular_darkpack/modules/jobs/code/police/sergeant.dm @@ -8,7 +8,7 @@ outfit = /datum/outfit/job/vampire/police_sergeant job_flags = CITY_JOB_FLAGS display_order = JOB_DISPLAY_ORDER_POLICE_SERGEANT - exp_required_type_department = EXP_TYPE_POLICE + exp_requirements = EXP_REQ_MINOR departments_list = list( /datum/job_department/police, ) @@ -25,10 +25,13 @@ description = "Enforce the law. Keep the officers in line. Follow what the Captain says." minimum_masquerade = 0 - known_contacts = list("Police Captain") + known_contacts = list( + JOB_POLICE_CAPTAIN, + JOB_EMERGENCY_DISPATCHER + ) /datum/outfit/job/vampire/police_sergeant - name = "Police Sergeant" + name = JOB_POLICE_SERGEANT jobtype = /datum/job/vampire/police_sergeant ears = /obj/item/radio/headset/darkpack/police @@ -37,7 +40,7 @@ suit = /obj/item/clothing/suit/vampire/vest/police/sergeant belt = /obj/item/storage/belt/holster/detective/darkpack/officer id = /obj/item/card/police/sergeant - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/police_sergeant r_pocket = /obj/item/vamp/keys/police/secure backpack_contents = list(/obj/item/card/credit=1, /obj/item/ammo_box/darkpack/c9mm = 1, /obj/item/restraints/handcuffs = 1, /obj/item/melee/baton/vamp = 1, /obj/item/storage/medkit/darkpack/ifak = 1, /obj/item/bodycam_upgrade = 1) diff --git a/modular_darkpack/modules/jobs/code/sabbat/ductus.dm b/modular_darkpack/modules/jobs/code/sabbat/ductus.dm index 53475c592d65..c4d01183b4f4 100644 --- a/modular_darkpack/modules/jobs/code/sabbat/ductus.dm +++ b/modular_darkpack/modules/jobs/code/sabbat/ductus.dm @@ -8,22 +8,30 @@ outfit = /datum/outfit/job/vampire/sabbatductus allowed_splats = list(SPLAT_KINDRED) job_flags = CITY_JOB_FLAGS - exp_required_type_department = EXP_TYPE_SABBAT departments_list = list( /datum/job_department/sabbat, ) + + exp_requirements = EXP_REQ_HEAD + exp_required_type_department = EXP_TYPE_SABBAT + description = "You are a Ductus and Pack Leader of your Sabbat pack. You are charged with rebellion against the Elders and the Camarilla, against the Jyhad, against the Masquerade and the Traditions, and the recognition of Caine as the true Dark Father of all Kindred kind. NOTE: BY PLAYING THIS ROLE YOU AGREE TO AND HAVE READ THE SERVER'S RULES ON ESCALATION FOR ANTAGS. KEEP THINGS INTERESTING AND ENGAGING FOR BOTH SIDES. KILLING PLAYERS JUST BECAUSE YOU CAN MAY RESULT IN A ROLEBAN." minimum_masquerade = 0 display_order = JOB_DISPLAY_ORDER_SABBATDUCTUS whitelisted = TRUE + known_contacts = list( + JOB_SABBAT_PACK, + JOB_SABBAT_PRIEST + ) + /datum/antagonist/sabbatist/ductus antag_hud_name = "ductus_priest" /datum/outfit/job/vampire/sabbatductus - name = "Sabbat Ductus" + name = JOB_SABBAT_DUCTUS jobtype = /datum/job/vampire/sabbatductus - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/sabbat_ductus r_pocket = /obj/item/vamp/keys/sabbat uses_default_clan_clothes = TRUE backpack_contents = list(/obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/sabbat/pack.dm b/modular_darkpack/modules/jobs/code/sabbat/pack.dm index 83e1d6d69041..6be07d429549 100644 --- a/modular_darkpack/modules/jobs/code/sabbat/pack.dm +++ b/modular_darkpack/modules/jobs/code/sabbat/pack.dm @@ -8,7 +8,6 @@ outfit = /datum/outfit/job/vampire/sabbatpack job_flags = CITY_JOB_FLAGS allowed_splats = list(SPLAT_KINDRED) - exp_required_type_department = EXP_TYPE_SABBAT departments_list = list( /datum/job_department/sabbat, ) @@ -20,10 +19,15 @@ display_order = JOB_DISPLAY_ORDER_SABBATPACK whitelisted = TRUE + known_contacts = list( + JOB_SABBAT_DUCTUS, + JOB_SABBAT_PRIEST + ) + /datum/outfit/job/vampire/sabbatpack - name = "Sabbat Pack" + name = JOB_SABBAT_PACK jobtype = /datum/job/vampire/sabbatpack - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/sabbat_pack r_pocket = /obj/item/vamp/keys/sabbat uses_default_clan_clothes = TRUE backpack_contents = list(/obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/sabbat/priest.dm b/modular_darkpack/modules/jobs/code/sabbat/priest.dm index 0a13e0828793..3759152d8325 100644 --- a/modular_darkpack/modules/jobs/code/sabbat/priest.dm +++ b/modular_darkpack/modules/jobs/code/sabbat/priest.dm @@ -8,7 +8,7 @@ outfit = /datum/outfit/job/vampire/sabbatpriest allowed_splats = list(SPLAT_KINDRED) job_flags = CITY_JOB_FLAGS - exp_required_type_department = EXP_TYPE_SABBAT + departments_list = list( /datum/job_department/sabbat, ) @@ -18,10 +18,15 @@ display_order = JOB_DISPLAY_ORDER_SABBATPRIEST whitelisted = TRUE + known_contacts = list( + JOB_SABBAT_DUCTUS, + JOB_SABBAT_PACK + ) + /datum/outfit/job/vampire/sabbatpriest - name = "Sabbat Priest" + name = JOB_SABBAT_PRIEST jobtype = /datum/job/vampire/sabbatpriest - l_pocket = /obj/item/smartphone + l_pocket = /obj/item/smartphone/sabbat_priest r_pocket = /obj/item/vamp/keys/sabbat suit = /obj/item/clothing/suit/vampire/noddist head = /obj/item/clothing/head/vampire/noddist_mask diff --git a/modular_darkpack/modules/jobs/code/supply/dealer.dm b/modular_darkpack/modules/jobs/code/supply/dealer.dm index 66bf314be100..146f53afdc14 100644 --- a/modular_darkpack/modules/jobs/code/supply/dealer.dm +++ b/modular_darkpack/modules/jobs/code/supply/dealer.dm @@ -9,19 +9,29 @@ outfit = /datum/outfit/job/vampire/dealer display_order = JOB_DISPLAY_ORDER_DEALER - exp_required_type_department = EXP_TYPE_WAREHOUSE departments_list = list( /datum/job_department/supply, ) - known_contacts = list("Prince", "Seneschal", "Sheriff", "Baron") + exp_requirements = EXP_REQ_MINOR + exp_required_type_department = EXP_TYPE_WAREHOUSE + + known_contacts = list( + JOB_PRINCE, + JOB_SENESCHAL, + JOB_SHERIFF, + JOB_BARON, + JOB_SUPPLY_TECH, + JOB_HARPY, + JOB_EMISSARY + ) allowed_splats = list(SPLAT_KINDRED, SPLAT_GHOUL, SPLAT_GAROU, SPLAT_NONE) splat_slots = list(SPLAT_NONE = 1) description = "You provide both legal and illegal supplies to those that get busy during the night. You are your own person yet you know people are out for you. Time to buckle in..." minimum_masquerade = 0 /datum/outfit/job/vampire/dealer - name = "Dealer" + name = JOB_DEALER jobtype = /datum/job/vampire/dealer uniform = /obj/item/clothing/under/vampire/suit shoes = /obj/item/clothing/shoes/vampire/jackboots diff --git a/modular_darkpack/modules/jobs/code/supply/supply_tech.dm b/modular_darkpack/modules/jobs/code/supply/supply_tech.dm index 71f6f2d51712..a745da5a8b38 100644 --- a/modular_darkpack/modules/jobs/code/supply/supply_tech.dm +++ b/modular_darkpack/modules/jobs/code/supply/supply_tech.dm @@ -8,8 +8,8 @@ job_flags = CITY_JOB_FLAGS outfit = /datum/outfit/job/vampire/supply_tech + display_order = JOB_DISPLAY_ORDER_SUPPLY - exp_required_type_department = EXP_TYPE_WAREHOUSE departments_list = list( /datum/job_department/supply, ) @@ -20,8 +20,12 @@ maximum_immortal_age = 200 minimum_masquerade = 0 + known_contacts = list( + JOB_DEALER + ) + /datum/outfit/job/vampire/supply_tech - name = "Supply Technician" + name = JOB_SUPPLY_TECH jobtype = /datum/job/vampire/supply uniform = /obj/item/clothing/under/vampire/suit shoes = /obj/item/clothing/shoes/vampire/jackboots diff --git a/modular_darkpack/modules/jobs/code/tremere/archivist.dm b/modular_darkpack/modules/jobs/code/tremere/archivist.dm index d82508c7000f..8e25160d300c 100644 --- a/modular_darkpack/modules/jobs/code/tremere/archivist.dm +++ b/modular_darkpack/modules/jobs/code/tremere/archivist.dm @@ -7,7 +7,6 @@ config_tag = "CHANTRY_ARCHIVIST" outfit = /datum/outfit/job/vampire/archivist job_flags = CITY_JOB_FLAGS - exp_required_type_department = EXP_TYPE_CHANTRY departments_list = list( /datum/job_department/chantry, ) @@ -19,10 +18,14 @@ minimum_masquerade = 3 allowed_splats = list(SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_TREMERE) - known_contacts = list("Tremere Regent") + known_contacts = list( + JOB_CHANTRY_REGENT, + JOB_CHANTRY_ARCHIVIST, + JOB_CHANTRY_GARGOYLE + ) /datum/outfit/job/vampire/archivist - name = "Archivist" + name = JOB_CHANTRY_ARCHIVIST jobtype = /datum/job/vampire/archivist id = /obj/item/card/archive diff --git a/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm b/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm index ae4174802d7e..42ae8527dcd5 100644 --- a/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm +++ b/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm @@ -7,7 +7,6 @@ config_tag = "CHANTRY_GARGOYLE" outfit = /datum/outfit/job/vampire/gargoyle job_flags = CITY_JOB_FLAGS - exp_required_type_department = EXP_TYPE_CHANTRY departments_list = list( /datum/job_department/chantry, ) @@ -19,10 +18,14 @@ minimum_masquerade = 3 allowed_splats = list(SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_GARGOYLE) - known_contacts = list("Tremere Regent") + known_contacts = list( + JOB_CHANTRY_REGENT, + JOB_CHANTRY_ARCHIVIST, + JOB_CHANTRY_GARGOYLE + ) /datum/outfit/job/vampire/gargoyle - name = "Chantry Gargoyle" + name = JOB_CHANTRY_GARGOYLE jobtype = /datum/job/vampire/gargoyle id = /obj/item/card/archive glasses = /obj/item/clothing/glasses/vampire/red diff --git a/modular_darkpack/modules/jobs/code/tremere/regent.dm b/modular_darkpack/modules/jobs/code/tremere/regent.dm index 199672b1d445..5ab80b55b2a3 100644 --- a/modular_darkpack/modules/jobs/code/tremere/regent.dm +++ b/modular_darkpack/modules/jobs/code/tremere/regent.dm @@ -13,15 +13,23 @@ ) display_order = JOB_DISPLAY_ORDER_REGENT + exp_requirements = EXP_REQ_HEAD + description = "Lead the Chantry. You serve as both the Regent and Tremere Primogen. You report to the Tremere Lord of this region first, Prince second." minimum_masquerade = 4 allowed_splats = list(SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_TREMERE) - known_contacts = list("Prince") + known_contacts = list( + JOB_PRINCE, + JOB_CHANTRY_GARGOYLE, + JOB_CHANTRY_ARCHIVIST, + JOB_SHERIFF, + JOB_SENESCHAL + ) /datum/outfit/job/vampire/regent - name = "Chantry Regent" + name = JOB_CHANTRY_REGENT jobtype = /datum/job/vampire/regent id = /obj/item/card/regent diff --git a/modular_darkpack/modules/jobs/code/tzimisce/bogatyr.dm b/modular_darkpack/modules/jobs/code/tzimisce/bogatyr.dm index 27dc2f822c46..2517f50452ed 100644 --- a/modular_darkpack/modules/jobs/code/tzimisce/bogatyr.dm +++ b/modular_darkpack/modules/jobs/code/tzimisce/bogatyr.dm @@ -22,10 +22,16 @@ maximum_immortal_age = 200 minimum_masquerade = 2 - known_contacts = list("Prince", "Baron", "Sheriff") + known_contacts = list( + JOB_PRINCE, + JOB_BARON, + JOB_SHERIFF, + JOB_VOIVODE, + JOB_ZADRUGA + ) /datum/outfit/job/vampire/bogatyr - name = "Bogatyr" + name = JOB_BOGATYR jobtype = /datum/job/vampire/bogatyr id = /obj/item/card/bogatyr glasses = /obj/item/clothing/glasses/vampire/yellow diff --git a/modular_darkpack/modules/jobs/code/tzimisce/voivode.dm b/modular_darkpack/modules/jobs/code/tzimisce/voivode.dm index 504648e4ce91..b4f196ae9875 100644 --- a/modular_darkpack/modules/jobs/code/tzimisce/voivode.dm +++ b/modular_darkpack/modules/jobs/code/tzimisce/voivode.dm @@ -7,22 +7,30 @@ config_tag = "VOIVODE" outfit = /datum/outfit/job/vampire/voivode job_flags = CITY_JOB_FLAGS - exp_required_type_department = EXP_TYPE_MANOR departments_list = list( /datum/job_department/manor, ) display_order = JOB_DISPLAY_ORDER_VOIVODE + exp_required_type_department = EXP_TYPE_MANOR + exp_requirements = EXP_REQ_HEAD + allowed_splats = list(SPLAT_KINDRED) allowed_clans = list(VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_OLD_CLAN_TZIMISCE) // APOC EDIT CHANGE - JOBS - (Voivode) description = "You are a leader of the Seer's Voivodate. A congregation of Seer clans, leading the new Voivodate in the face of near systemic Collapse. Oversee the Hospitality on your lands, and guard the Sarcophagus of the Voivode-in-Waiting in Waiting kept in your basement." // APOC EDIT CHANGE - JOBS - (Voivode) minimum_masquerade = 2 - known_contacts = list("Prince", "Baron", "Sheriff") + known_contacts = list( + JOB_PRINCE, + JOB_BARON, + JOB_SHERIFF, + JOB_BOGATYR, + JOB_ZADRUGA + ) /datum/outfit/job/vampire/voivode - name = "Voivode" + name = JOB_VOIVODE jobtype = /datum/job/vampire/voivode id = /obj/item/card/voivode glasses = /obj/item/clothing/glasses/vampire/yellow diff --git a/modular_darkpack/modules/jobs/code/tzimisce/zadruga.dm b/modular_darkpack/modules/jobs/code/tzimisce/zadruga.dm index e34781ae02e9..dabeac41d97c 100644 --- a/modular_darkpack/modules/jobs/code/tzimisce/zadruga.dm +++ b/modular_darkpack/modules/jobs/code/tzimisce/zadruga.dm @@ -17,10 +17,16 @@ description = "You were born in servitude to the Master of the Manor: your father served the Voivode, as did his father. Now, you carry their blood, and with it their responsibilities." minimum_masquerade = 2 - known_contacts = list("Prince", "Baron", "Sheriff") + known_contacts = list( + JOB_PRINCE, + JOB_BARON, + JOB_SHERIFF, + JOB_BOGATYR, + JOB_VOIVODE + ) /datum/outfit/job/vampire/zadruga - name = "Zadruga" + name = JOB_ZADRUGA jobtype = /datum/job/vampire/zadruga id = /obj/item/card/bogatyr glasses = /obj/item/clothing/glasses/vampire/yellow diff --git a/modular_darkpack/modules/languages/code/languages/garou_tongue.dm b/modular_darkpack/modules/languages/code/languages/garou_tongue.dm deleted file mode 100644 index c1441d775846..000000000000 --- a/modular_darkpack/modules/languages/code/languages/garou_tongue.dm +++ /dev/null @@ -1,31 +0,0 @@ -/datum/language/garou_tongue - name = "Garou Tongue" - desc = "A guttural and pitchy language also known as 'High Tongue', the language of the Garou capable of being learned and spoken by Garou. It is hard to speak in human form." - key = "w" - flags = LANGUAGE_TONGUELESS_SPEECH - space_chance = 40 - syllables = list( - "to", "lo", "of", "li", "ka", "ha", "he", "ah", "ny", "ro", - "li", "me", "ad", "he", "ah", "um", "co", "ga", "gar", "fa", - "el", "ra", "ia", "of", "os", "ra", "ta", "na", "ga", "ho", - "lu", "lu", "fe", "zi", "mo", "sha", "ru", "te", "vo", "ni", - "xa", "jo", "da", "ku", "pe", "su", "yo", "ve", "mi", "ba" - ) - icon_state = "garou" - default_priority = 10 - -/datum/language/primal_tongue - name = "Primal Tongue" - desc = "A language inherently known to all Garou breeds at birth, able to be spoken only in Lupus, Crinos and Hispo forms." - key = "p" - flags = LANGUAGE_TONGUELESS_SPEECH - space_chance = 40 - syllables = list ( - "gra", "grr", "gru", "gha", "sha", "zho", "yip", "whu", "zar", "ruk", - "kra", "hya", "tza", "ska", "yrr", "fru", "thra", "hwo", "vra", "snar", - "kru", "pha", "gha", "hro", "tzo", "wha", "brak", "thru", "chur", "dra", - "vru", "sna", "yru", "hru", "yla", "fro", "rik", "zru", "skra", "zhu", - "kro", "thro", "zyi", "sha", "hza", "mru", "wru", "bruk", "hka", "tza" - ) - icon_state = "garou" - default_priority = 10 diff --git a/modular_darkpack/modules/loadout/code/categories/suit.dm b/modular_darkpack/modules/loadout/code/categories/suit.dm index 320eaedaad63..7988fc407cfd 100644 --- a/modular_darkpack/modules/loadout/code/categories/suit.dm +++ b/modular_darkpack/modules/loadout/code/categories/suit.dm @@ -45,6 +45,18 @@ /datum/loadout_item/suit/coat/leopardcoat item_path = /obj/item/clothing/suit/vampire/coat/leopard +/datum/loadout_item/suit/jacket/oversizedjacket + name = "Oversized Jacket" + item_path = /obj/item/clothing/suit/jacket/oversized + +/datum/loadout_item/suit/jacket/fancyfurcoat + name = "Fancy Fur Coat" + item_path = /obj/item/clothing/suit/jacket/fancy + +/datum/loadout_item/suit/jacket/trenchcoatalt + name = "Trenchcoat (Alt)" + item_path = /obj/item/clothing/suit/toggle/jacket/trenchcoat + // Jackets /datum/loadout_item/suit/jacket abstract_type = /datum/loadout_item/suit/jacket diff --git a/modular_darkpack/modules/matrix/code/matrix.dm b/modular_darkpack/modules/matrix/code/matrix.dm index e7d9deced043..7d7882fb64d0 100644 --- a/modular_darkpack/modules/matrix/code/matrix.dm +++ b/modular_darkpack/modules/matrix/code/matrix.dm @@ -58,8 +58,8 @@ ADMIN_VERB_AND_CONTEXT_MENU(matrix_mob_verb, R_ADMIN, "Matrix Mob", "Matrix (des GLOB.joined_player_list -= despawning_mob.ckey - //handle_objectives() SSmasquerade.matrix_masquerade_breacher(despawning_mob, TRUE) + despawning_mob.client?.prefs?.save_character() despawning_mob.ghostize(FALSE) QDEL_NULL(despawning_mob) diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/anthropic_taste.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/anthropic_taste.dm new file mode 100644 index 000000000000..2fdba1092770 --- /dev/null +++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/anthropic_taste.dm @@ -0,0 +1,10 @@ +/datum/quirk/darkpack/anthropic_taste + name = "Anthropic Taste" + desc = "You cannot drink the blood of simple creatures, such as cats, deer, or szlachta." + value = -2 + mob_trait = TRAIT_ANTHROPIC_TASTE + gain_text = span_notice("You find the blood of simple creatures unbearable.") + lose_text = span_notice("You think you could feed off of simple creatures again.") + allowed_splats = list(SPLAT_KINDRED) + icon = FA_ICON_CAT + failure_message = "You feel that you can once again feed off simple creatures." diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/disfigured.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/disfigured.dm index 612c24686d6a..83c7b95ef33f 100644 --- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/disfigured.dm +++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/disfigured.dm @@ -18,14 +18,10 @@ var/mob/living/carbon/human/human_holder = astype(quirk_holder) if(!human_holder) return - appearance_to_subtract = human_holder.st_get_stat(STAT_APPEARANCE)-2 if(human_holder.st_get_stat(STAT_APPEARANCE) > 2) - human_holder.st_add_stat_mod(STAT_APPEARANCE, -appearance_to_subtract, "Disfigured") to_chat(human_holder, span_warning("Your appearance stat has been lowered as you cannot have an appearance value greater than two.")) + human_holder.st_add_stat_clamp(STAT_APPEARANCE, 2, type) /datum/quirk/darkpack/disfigured/remove() . = ..() - var/mob/living/carbon/human/human_holder = astype(quirk_holder) - if(!human_holder) - return - human_holder.st_remove_stat_mod(STAT_APPEARANCE, "Disfigured") + quirk_holder.st_remove_stat_clamp(STAT_APPEARANCE, type) diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/horrific_appearance_quirk.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/horrific_appearance_quirk.dm index 5a39527890a0..2b402b4bd9a5 100644 --- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/horrific_appearance_quirk.dm +++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/horrific_appearance_quirk.dm @@ -21,5 +21,8 @@ human_holder.rot_body(3) if (500 to INFINITY) human_holder.rot_body(4) - if(human_holder.st_get_stat(STAT_APPEARANCE) > 0) - human_holder.st_add_stat_mod(STAT_APPEARANCE, -(STAT_APPEARANCE), "Monstrous") + human_holder.st_add_stat_clamp(STAT_APPEARANCE, 0, type) + +/datum/quirk/darkpack/horrific_appearance/remove() + . = ..() + quirk_holder.st_remove_stat_clamp(STAT_APPEARANCE, type) diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/monstrous_quirk.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/monstrous_quirk.dm index 3fa3bda5fa06..8392c3de4f26 100644 --- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/monstrous_quirk.dm +++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/monstrous_quirk.dm @@ -16,6 +16,9 @@ if(!human_holder) return human_holder.rot_body(1) - ADD_TRAIT(human_holder, TRAIT_MASQUERADE_VIOLATING_FACE, "Monstrous") - if(human_holder.st_get_stat(STAT_APPEARANCE) > 0) - human_holder.st_add_stat_mod(STAT_APPEARANCE, -human_holder.st_get_stat(STAT_APPEARANCE), "Monstrous") + ADD_TRAIT(human_holder, TRAIT_MASQUERADE_VIOLATING_FACE, type) + human_holder.st_add_stat_clamp(STAT_APPEARANCE, 0, type) + +/datum/quirk/darkpack/monstrous/remove() + . = ..() + quirk_holder.st_remove_stat_clamp(STAT_APPEARANCE, type) diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/no_sense_of_taste.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/no_sense_of_taste.dm index bfcd24f81195..5f193d89717a 100644 --- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/no_sense_of_taste.dm +++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/no_sense_of_taste.dm @@ -6,17 +6,6 @@ trouble gauging the difference between good and bad food and drink."} value = -1 icon = FA_ICON_GRIN_TONGUE_SQUINT + mob_trait = TRAIT_AGEUSIA forbidden_splats = list(SPLAT_KINDRED) ttrpg_sources = list(/datum/source_book/htr3/pg = 118) - -/datum/quirk/darkpack/no_sense_of_taste/add(client/client_source) - var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) - if(!tongue) - return - tongue.sense_of_taste = FALSE - -/datum/quirk/darkpack/no_sense_of_taste/remove() - var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) - if(!tongue) - return - tongue.sense_of_taste = initial(tongue.sense_of_taste) diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/giovanni_sanguine_incongruity.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/giovanni_sanguine_incongruity.dm index a7e279b11981..13e138e49c20 100644 --- a/modular_darkpack/modules/merits_flaws/code/positive_quirks/giovanni_sanguine_incongruity.dm +++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/giovanni_sanguine_incongruity.dm @@ -20,7 +20,7 @@ var/datum/splat/vampire/kindred/kindred = get_kindred_splat(human_holder) if(kindred) if(istype(kindred.clan, /datum/subsplat/vampire_clan/giovanni)) - REMOVE_TRAIT(human_holder, TRAIT_PAINFUL_VAMPIRE_KISS, CLAN_TRAIT) + REMOVE_TRAIT(human_holder, TRAIT_PAINFUL_VAMPIRE_KISS, SUBSPLAT_TRAIT) if(human_holder.chronological_age >= 300) human_holder.rot_body(2) diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/stillness_of_death.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/stillness_of_death.dm index 59354b7445cc..3e7bfe741b63 100644 --- a/modular_darkpack/modules/merits_flaws/code/positive_quirks/stillness_of_death.dm +++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/stillness_of_death.dm @@ -43,7 +43,7 @@ active = TRUE ADD_TRAIT(owner, TRAIT_IMMOBILIZED, "statue_form") ADD_TRAIT(owner, TRAIT_MUTE, "statue_form") - REMOVE_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, CLAN_TRAIT) + REMOVE_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, SUBSPLAT_TRAIT) owner.name = "Statue of a Gargoyle" var/newcolor = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) owner.add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) @@ -58,7 +58,7 @@ REMOVE_TRAIT(owner, TRAIT_IMMOBILIZED, "statue_form") REMOVE_TRAIT(owner, TRAIT_MUTE, "statue_form") - ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, CLAN_TRAIT) + ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, SUBSPLAT_TRAIT) owner.remove_atom_colour(FIXED_COLOUR_PRIORITY) owner.name = original_name diff --git a/modular_darkpack/modules/occult_artifacts/code/_artifact.dm b/modular_darkpack/modules/occult_artifacts/code/_artifact.dm index 2c5a68a5ba8d..522e6de26b55 100644 --- a/modular_darkpack/modules/occult_artifacts/code/_artifact.dm +++ b/modular_darkpack/modules/occult_artifacts/code/_artifact.dm @@ -55,11 +55,16 @@ if(src in artifact_identifier?.get_all_contents()) bind(artifact_identifier) +/obj/item/occult_artifact/proc/can_be_used_by(mob/living/user) + return TRUE + /obj/item/occult_artifact/proc/bind(mob/user) if(!identified) return if(owner) // Dont bind twice return + if(!can_be_used_by(user)) + return owner = user var/datum/controller/subsystem/processing/subsystem = locate(subsystem_type) in Master.subsystems @@ -110,6 +115,10 @@ to_chat(artifact_identifier, span_warning("You've seen some occult artifacts, trinkets, and powerful relics, but this, you've either never seen it before, or it's power can only be awakened by few...")) return + if(!can_be_used_by(artifact_identifier)) + to_chat(artifact_identifier, span_warning("There's a presence inside of this object that refuses to cooperate with you.")) + return + to_chat(artifact_identifier, span_cult("You might have seen this before in an occult text. You start identifying it...")) if(!do_after(artifact_identifier, 1 TURNS, src)) return diff --git a/modular_darkpack/modules/occult_artifacts/code/_werewolf.dm b/modular_darkpack/modules/occult_artifacts/code/_werewolf.dm index 106d887b986e..b0ffdd9622ec 100644 --- a/modular_darkpack/modules/occult_artifacts/code/_werewolf.dm +++ b/modular_darkpack/modules/occult_artifacts/code/_werewolf.dm @@ -14,6 +14,9 @@ GLOBAL_LIST_INIT(animal_spirits, world.file2list("modular_darkpack/modules/occul var/spirit_name = "Glitchimus" var/spirit_type = "ahelp" +/obj/item/occult_artifact/werewolf/can_be_used_by(mob/living/user) + return !!get_werewolf_splat(user) + /proc/generate_spirit_name(spirit_type) // TODO: make this better. there are 50+ spirits in WoD, and that's not condusive to this format. var/spirit_name var/spirit_table diff --git a/modular_darkpack/modules/occult_artifacts/code/fetishes/dagger_of_retribution.dm b/modular_darkpack/modules/occult_artifacts/code/fetishes/dagger_of_retribution.dm index 5e2c55097ac8..9bd3a3a58013 100644 --- a/modular_darkpack/modules/occult_artifacts/code/fetishes/dagger_of_retribution.dm +++ b/modular_darkpack/modules/occult_artifacts/code/fetishes/dagger_of_retribution.dm @@ -6,18 +6,25 @@ worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' worn_icon_state = "knife" icon_state = "dagger" - force = 30 - wound_bonus = -5 - throwforce = 15 - attack_verb_continuous = list("slashes", "cuts") - attack_verb_simple = list("slash", "cut") + force = 1 LETHAL_TTRPG_DAMAGE + attack_difficulty = 4 + wound_bonus = 5 + exposed_wound_bonus = 15 + demolition_mod = 0.75 + tool_behaviour = TOOL_KNIFE + throw_speed = 3 + throw_range = 6 + throwforce = 10 + attack_verb_continuous = list("slashes", "slices", "tears", "lacerates", "rips", "dices", "cuts") + attack_verb_simple = list("slash", "slice", "tear", "lacerate", "rip", "dice", "cut") hitsound = 'sound/items/weapons/slash.ogg' - armour_penetration = 35 - block_chance = 5 sharpness = SHARP_EDGED - w_class = WEIGHT_CLASS_SMALL slot_flags = ITEM_SLOT_BELT resistance_flags = FIRE_PROOF + obj_flags = CONDUCTS_ELECTRICITY + operating_sound = SFX_KNIFE_SLICE + pickup_sound = SFX_KNIFE_PICKUP + drop_sound = SFX_KNIFE_DROP subsystem_type = /datum/controller/subsystem/processing/fastprocess spirit_type = SPIRIT_VENGEANCE diff --git a/modular_darkpack/modules/onfloor_icons/code/dynamic_item_icon.dm b/modular_darkpack/modules/onfloor_icons/code/dynamic_item_icon.dm index f9052eee82ab..d64f12a18fcd 100644 --- a/modular_darkpack/modules/onfloor_icons/code/dynamic_item_icon.dm +++ b/modular_darkpack/modules/onfloor_icons/code/dynamic_item_icon.dm @@ -40,8 +40,8 @@ item.icon = initial(item.icon) item.pixel_w = initial(item.pixel_w) - if(item.item_flags & ACTIVE_WORLD_ICON) - item.item_flags &= ~ACTIVE_WORLD_ICON + if(item.item_flags & ACTIVE_ONFLOOR_ICON) + item.item_flags &= ~ACTIVE_ONFLOOR_ICON item.update_icon() item.update_greyscale() @@ -53,8 +53,8 @@ if (item.onflooricon_state) item.icon_state = item.onflooricon_state - if(!(item.item_flags & ACTIVE_WORLD_ICON)) - item.item_flags |= ACTIVE_WORLD_ICON + if(!(item.item_flags & ACTIVE_ONFLOOR_ICON)) + item.item_flags |= ACTIVE_ONFLOOR_ICON item.update_icon() //item.update_greyscale() diff --git a/modular_darkpack/modules/phones/code/phone_subtypes.dm b/modular_darkpack/modules/phones/code/phone_subtypes.dm index ee4c4bdb4616..c56b3e588c09 100644 --- a/modular_darkpack/modules/phones/code/phone_subtypes.dm +++ b/modular_darkpack/modules/phones/code/phone_subtypes.dm @@ -174,7 +174,7 @@ /obj/item/smartphone/liaison contact_networks_pre_init = list( - alist(NETWORK_ID = ANARCH_NETWORK, OUR_ROLE = "Club Promotor", USE_JOB_TITLE = FALSE) + alist(NETWORK_ID = ANARCH_NETWORK, OUR_ROLE = "Club Promoter", USE_JOB_TITLE = FALSE) ) /obj/item/smartphone/tapster @@ -246,3 +246,116 @@ contact_networks_pre_init = list( alist(NETWORK_ID = SOCIETY_OF_LEOPOLD_NETWORK, OUR_ROLE = "Abbé", USE_JOB_TITLE = TRUE) ) + +// CIVILIAN + +/obj/item/smartphone/janitor + contact_networks_pre_init = list( + alist(NETWORK_ID = CIVILIAN_NETWORK, OUR_ROLE = "Janitor", USE_JOB_TITLE = TRUE) + ) + +/obj/item/smartphone/taxi + contact_networks_pre_init = list( + alist(NETWORK_ID = CIVILIAN_NETWORK, OUR_ROLE = "Taxi Driver", USE_JOB_TITLE = TRUE) + ) + +/obj/item/smartphone/club_worker + contact_networks_pre_init = list( + alist(NETWORK_ID = CIVILIAN_NETWORK, OUR_ROLE = "Club Worker", USE_JOB_TITLE = TRUE) + ) + +/obj/item/smartphone/priest + contact_networks_pre_init = list( + alist(NETWORK_ID = CIVILIAN_NETWORK, OUR_ROLE = "Priest", USE_JOB_TITLE = TRUE) + ) + +/obj/item/smartphone/clinic_director + contact_networks_pre_init = list( + alist(NETWORK_ID = MEDICAL_NETWORK, OUR_ROLE = "Clinic Director", USE_JOB_TITLE = TRUE) + ) + +/obj/item/smartphone/red_news + contact_networks_pre_init = list( + alist(NETWORK_ID = MEDICAL_NETWORK, OUR_ROLE = "Red News Reporter", USE_JOB_TITLE = TRUE) + ) + +/obj/item/smartphone/doctor + contact_networks_pre_init = list( + alist(NETWORK_ID = MEDICAL_NETWORK, OUR_ROLE = "Clinic Staff", USE_JOB_TITLE = FALSE) + ) + +// SEPT + +/obj/item/smartphone/garou_council + contact_networks_pre_init = list( + alist(NETWORK_ID = GAROU_NETWORK, OUR_ROLE = "NPS Oversight Committee", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/garou_guardian + contact_networks_pre_init = list( + alist(NETWORK_ID = GAROU_NETWORK, OUR_ROLE = "Park Ranger", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/garou_truthcatcher + contact_networks_pre_init = list( + alist(NETWORK_ID = GAROU_NETWORK, OUR_ROLE = "Park Guide", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/garou_warder + contact_networks_pre_init = list( + alist(NETWORK_ID = GAROU_NETWORK, OUR_ROLE = "Lead Park Ranger", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/garou_wyrmfoe + contact_networks_pre_init = list( + alist(NETWORK_ID = GAROU_NETWORK, OUR_ROLE = "NPS Biologist", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/garou_keeper + contact_networks_pre_init = list( + alist(NETWORK_ID = GAROU_NETWORK, OUR_ROLE = "Park Staff", USE_JOB_TITLE = FALSE) + ) + +// POLICE + +/obj/item/smartphone/police_captain + contact_networks_pre_init = list( + alist(NETWORK_ID = POLICE_NETWORK, OUR_ROLE = "SFPD Captain", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/dispatch + contact_networks_pre_init = list( + alist(NETWORK_ID = POLICE_NETWORK, OUR_ROLE = "Emergency Dispatcher", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/federal_investigator + contact_networks_pre_init = list( + alist(NETWORK_ID = POLICE_NETWORK, OUR_ROLE = "Federal Investigator", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/police_officer + contact_networks_pre_init = list( + alist(NETWORK_ID = POLICE_NETWORK, OUR_ROLE = "SFPD Officer", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/police_sergeant + contact_networks_pre_init = list( + alist(NETWORK_ID = POLICE_NETWORK, OUR_ROLE = "SFPD Sergeant", USE_JOB_TITLE = FALSE) + ) + +// SABBAT + +/obj/item/smartphone/sabbat_ductus + contact_networks_pre_init = list( + alist(NETWORK_ID = SABBAT_NETWORK, OUR_ROLE = "Shift Manager", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/sabbat_pack + contact_networks_pre_init = list( + alist(NETWORK_ID = SABBAT_NETWORK, OUR_ROLE = "Dipshit Co-worker", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/sabbat_priest + contact_networks_pre_init = list( + alist(NETWORK_ID = SABBAT_NETWORK, OUR_ROLE = "Assistant Manager", USE_JOB_TITLE = FALSE) + ) diff --git a/modular_darkpack/modules/powers/code/admin_discipline_editor.dm b/modular_darkpack/modules/powers/code/admin_preference_editor.dm similarity index 76% rename from modular_darkpack/modules/powers/code/admin_discipline_editor.dm rename to modular_darkpack/modules/powers/code/admin_preference_editor.dm index aa4acd106d75..978bb2f8822e 100644 --- a/modular_darkpack/modules/powers/code/admin_discipline_editor.dm +++ b/modular_darkpack/modules/powers/code/admin_preference_editor.dm @@ -1,32 +1,32 @@ -/datum/admin_discipline_editor +/datum/admin_preference_editor var/target_ckey = "" var/selected_slot = 0 var/datum/preferences/target_prefs = null var/loaded_offline = FALSE var/not_found = FALSE - var/list/discipline_cache = null + var/static/list/discipline_cache = null -/datum/admin_discipline_editor/Destroy() +/datum/admin_preference_editor/Destroy() if(loaded_offline) QDEL_NULL(target_prefs) target_prefs = null return ..() -/datum/admin_discipline_editor/ui_interact(mob/user, datum/tgui/ui) +/datum/admin_preference_editor/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "AdminDisciplineEditor") + ui = new(user, src, "AdminPreferenceEditor") ui.open() -/datum/admin_discipline_editor/ui_state(mob/user) +/datum/admin_preference_editor/ui_state(mob/user) return ADMIN_STATE(R_ADMIN) -/datum/admin_discipline_editor/ui_data(mob/user) +/datum/admin_preference_editor/ui_data(mob/user) var/list/data = list() data["target_ckey"] = target_ckey data["selected_slot"] = selected_slot data["not_found"] = not_found - data["is_trusted"] = target_prefs?.discipline_trusted || FALSE + data["is_trusted"] = target_prefs?.has_whitelist(WHITELIST_TRUSTED) || FALSE data["character_slots"] = list() data["discipline_levels"] = list() data["clan_disciplines"] = list() @@ -49,7 +49,7 @@ if(!C || !C.mob) continue connected += ckey - if(C.prefs?.discipline_trusted) + if(C.prefs?.has_whitelist(WHITELIST_TRUSTED)) trusted_ckeys += ckey if(ishuman(C.mob)) var/list/validation = validate_mob_sheet(C.mob) @@ -95,11 +95,27 @@ data["clan_disciplines"] += disc_str clan_discs += disc_str - data["discipline_validation"] = validate_discipline_sheet(target_prefs.discipline_levels, clan_discs, target_prefs.discipline_trusted) + data["discipline_validation"] = validate_discipline_sheet(target_prefs.discipline_levels, clan_discs, target_prefs.has_whitelist(WHITELIST_TRUSTED)) + + var/splat_path = target_prefs?.read_preference(/datum/preference/choiced/splats) + if(!ispath(splat_path, /datum/splat/vampire)) + data["clan_name"] = null + data["clan_disciplines"] = list() + + var/client/target_client = GLOB.directory[target_ckey] + // if they have a value for screen_maps, they are in the character creator. + // an admin shouldnt be editing the same slot at the same time or it will risk wiping the slot + data["is_editing_character"] = target_client && length(target_client.screen_maps) > 0 + var/list/target_wl + if(target_prefs) + target_wl = target_prefs.get_all_whitelisted_entries() + + data["player_whitelists"] = target_wl || list() + data["whitelist_definitions"] = get_whitelist_definitions() return data -/datum/admin_discipline_editor/proc/build_discipline_cache() +/datum/admin_preference_editor/proc/build_discipline_cache() if(discipline_cache) return discipline_cache @@ -124,7 +140,7 @@ return discipline_cache -/datum/admin_discipline_editor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) +/datum/admin_preference_editor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return @@ -200,15 +216,26 @@ log_admin("[key_name_admin(ui.user)] set [ADMIN_LOOKUPFLW(target_ckey)]'s character [character_name] to generation [new_gen]).") return TRUE - if("toggle_trusted") + if("set_whitelist") if(!target_prefs) return FALSE - target_prefs.discipline_trusted = !target_prefs.discipline_trusted + var/whitelist_id = params["id"] + if(!istext(whitelist_id) || !length(whitelist_id)) + return FALSE + var/should_grant = text2num(params["grant"]) + if(should_grant) + target_prefs.grant_whitelist(whitelist_id) + else + target_prefs.revoke_whitelist(whitelist_id) target_prefs.save_preferences() - message_admins("[ui.user] [target_prefs.discipline_trusted ? "granted" : "revoked"] trusted discipline whitelist for [ADMIN_LOOKUPFLW(target_ckey)].") + var/granted_revoked = should_grant ? "granted" : "revoked" + message_admins("[key_name_admin(ui.user)] [granted_revoked] whitelist '[whitelist_id]' for [ADMIN_LOOKUPFLW(target_ckey)].") + log_admin("[key_name_admin(ui.user)] [granted_revoked] whitelist '[whitelist_id]' for [ADMIN_LOOKUPFLW(target_ckey)].") + // SSoverwatch.record_action(null, "[key_name_admin(ui.user)] [granted_revoked] whitelist '[whitelist_id]' for [ADMIN_LOOKUPFLW(target_ckey)].") return TRUE -/datum/admin_discipline_editor/proc/load_target(search_ckey) + +/datum/admin_preference_editor/proc/load_target(search_ckey) if(loaded_offline && target_prefs) qdel(target_prefs) target_prefs = null @@ -237,7 +264,7 @@ selected_slot = 1 return TRUE -ADMIN_VERB(discipline_menu, R_ADMIN, "Discipline Menu", "Edit a player's disciplines.", ADMIN_CATEGORY_SECOND_CITY) - var/datum/admin_discipline_editor/editor = new +ADMIN_VERB(admin_preference_editor, R_ADMIN, "Discipline/Preference Editor", "Edit and view a player's disciplines and preferences.", ADMIN_CATEGORY_SECOND_CITY) + var/datum/admin_preference_editor/editor = new editor.ui_interact(user.mob) - BLACKBOX_LOG_ADMIN_VERB("Discipline Menu") + BLACKBOX_LOG_ADMIN_VERB("Discipline/Preference Editor") diff --git a/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm b/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm index 8fa7afb7c649..94c1fe661e2f 100644 --- a/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm +++ b/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm @@ -125,6 +125,7 @@ target_type = TARGET_HUMAN range = 7 + cooldown_length = 30 SECONDS vitae_cost = 0 duration_length = 3 SECONDS @@ -148,10 +149,10 @@ /datum/discipline_power/daimoinon/fear_of_the_void_below/activate(mob/living/carbon/human/target) . = ..() to_chat(target, span_warning("Your mind is enveloped by your greatest fear!")) - if(prob(50)) // REPLACE THIS - the people hate hardstuns - target.Paralyze(6 SECONDS) + if(prob(50)) + target.AdjustKnockdown(6 SECONDS, daze_amount = 4 SECONDS) else - target.Sleeping(6 SECONDS) + target.Immobilize(6 SECONDS) //CONFLAGRATION /datum/discipline_power/daimoinon/conflagration diff --git a/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm index 48b32ed9f725..b0e817b3c4ca 100644 --- a/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm +++ b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm @@ -276,10 +276,10 @@ if(target_splat?.clan?.alt_sprite) owner.set_body_sprite(target_splat.clan.alt_sprite, target_splat.clan.alt_sprite_greyscale, TRUE) else - if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_FACE in owner_splat.clan.clan_traits)) - REMOVE_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, CLAN_TRAIT) - if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_EYES in owner_splat.clan.clan_traits)) - REMOVE_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_EYES, CLAN_TRAIT) + if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_FACE in owner_splat.clan.subsplat_traits)) + REMOVE_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, SUBSPLAT_TRAIT) + if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_EYES in owner_splat.clan.subsplat_traits)) + REMOVE_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_EYES, SUBSPLAT_TRAIT) if(original_sprite == "rotten4" || original_sprite == "rotten3") REMOVE_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, MAGIC_TRAIT) owner.set_body_sprite(SPECIES_HUMAN, TRUE, TRUE) @@ -296,10 +296,10 @@ original_dna.copy_dna(owner.dna, 0) owner.name = original_name - if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_FACE in owner_splat.clan.clan_traits)) - ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, CLAN_TRAIT) - if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_EYES in owner_splat.clan.clan_traits)) - ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_EYES, CLAN_TRAIT) + if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_FACE in owner_splat.clan.subsplat_traits)) + ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, SUBSPLAT_TRAIT) + if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_EYES in owner_splat.clan.subsplat_traits)) + ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_EYES, SUBSPLAT_TRAIT) if(original_sprite == "rotten4" || original_sprite == "rotten3") ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, MAGIC_TRAIT) diff --git a/modular_darkpack/modules/powers/code/discipline/quietus/components/scorptions_touch.dm b/modular_darkpack/modules/powers/code/discipline/quietus/components/scorptions_touch.dm index 9548c2b7f98c..9e48059ca037 100644 --- a/modular_darkpack/modules/powers/code/discipline/quietus/components/scorptions_touch.dm +++ b/modular_darkpack/modules/powers/code/discipline/quietus/components/scorptions_touch.dm @@ -77,7 +77,12 @@ to_chat(user, span_warning("Your venomous touch burns [victim]!")) to_chat(victim, span_userdanger("You feel a burning poison sap your strength!")) - qdel(src) + var/obj/item/weapon = parent + if(istype(weapon, /obj/item/melee/touch_attack/quietus)) + qdel(src) + qdel(weapon) + else + qdel(src) /datum/component/scorpions_touch_poison/proc/remove_poison(mob/living/carbon/human/victim) if(!victim || QDELETED(victim)) diff --git a/modular_darkpack/modules/powers/code/discipline/serpentis.dm b/modular_darkpack/modules/powers/code/discipline/serpentis.dm index 2548b1162b65..c78f9611c423 100644 --- a/modular_darkpack/modules/powers/code/discipline/serpentis.dm +++ b/modular_darkpack/modules/powers/code/discipline/serpentis.dm @@ -152,7 +152,7 @@ else owner.st_add_stat_mod(STAT_STAMINA, 2, "Serpentis") // permanently on with no downsides according to dav20. its staying at fort one bro ADD_TRAIT(owner, TRAIT_SERPENTIS_SKIN, DISCIPLINE_TRAIT(type)) //ideally this would either be blatantly obvious or not so much depending on the choice. I guess masq violating face trait will work for obvious. - owner.st_add_stat_mod(STAT_APPEARANCE, -(owner.st_get_stat(STAT_APPEARANCE) - 1), "Serpentis") + owner.st_add_stat_clamp(STAT_APPEARANCE, 0, "Serpentis") /* owner.Stun(duration_length) owner.petrify(duration_length, "Serpentis") @@ -167,7 +167,7 @@ else owner.st_remove_stat_mod(STAT_STAMINA, 2, "Serpentis") REMOVE_TRAIT(owner, TRAIT_SERPENTIS_SKIN, DISCIPLINE_TRAIT(type)) - owner.st_remove_stat_mod(STAT_APPEARANCE, "Serpentis") + owner.st_remove_stat_clamp(STAT_APPEARANCE, "Serpentis") //THE FORM OF THE COBRA diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/crafting_recipes.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/crafting_recipes.dm index 601c202741b4..8cfef97374a0 100644 --- a/modular_darkpack/modules/powers/code/discipline/vicissitude/crafting_recipes.dm +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/crafting_recipes.dm @@ -5,6 +5,45 @@ result = /obj/item/clothing/suit/vampire/trench/tzi category = CAT_TZIMISCE +/datum/crafting_recipe/tzi_heavyarmor // Requires 5 mulched humans and 3 blood points of vitae + name = "Bone Armor (Cuirass)" + desc = "A regal cuirass made of flesh and bone. An ancient recipe, rarely made today due to it's extraordinarily prohibitive cost. It is, however, exceptionally protective. Requires Vicissitude 3." + time = 15 SECONDS + reqs = list(/obj/item/stack/sheet/meat = 100, /obj/item/spine = 5, /datum/reagent/blood/vitae = 200, /datum/reagent/blood = 500) + structures = list(/obj/structure/table) + result = /obj/item/clothing/suit/vampire/bogatyr/heavy + category = CAT_TZIMISCE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_SKIP_MATERIALS_PARITY // Maybe we fix this one day when our items are more sane + +/datum/crafting_recipe/tzi_heavyarmor/helmet + name = "Bone Armor (Helmet)" + desc = "A regal winged greathelm made of flesh and bone. An ancient recipe, rarely made today due to it's prohibitive cost. It is, however, exceptionally protective. Requires Vicissitude 3." + time = 10 SECONDS + reqs = list(/obj/item/stack/sheet/meat = 40, /obj/item/spine = 2, /datum/reagent/blood/vitae = 100, /datum/reagent/blood = 200) + result = /obj/item/clothing/head/vampire/bogatyr/heavy + +/datum/crafting_recipe/tzi_heavyarmor/check_requirements(mob/user, list/collected_requirements) + var/mob/living/living_user = astype(user) + var/datum/discipline/disc = living_user?.get_discipline(/datum/discipline/vicissitude) + if(disc.level >= 3) + return TRUE + else + return FALSE + +/datum/crafting_recipe/tzi_upgrade_armor + name = "Bone Armor (Upgrade)" + desc = "A regal golden helmet, reinforced with fleshcrafting." + time = 5 SECONDS + reqs = list(/obj/item/clothing/suit/vampire/bogatyr/heavy = 1, /obj/item/clothing/suit/vampire/bogatyr/captain = 1) + result = /obj/item/clothing/suit/vampire/bogatyr/captain/heavy + category = CAT_TZIMISCE + +/datum/crafting_recipe/tzi_upgrade_armor/helmet + name = "Bone Helmet (Upgrade)" + desc = "A set of regal golden armor, reinforced with fleshcrafting." + reqs = list(/obj/item/clothing/head/vampire/bogatyr/heavy = 1, /obj/item/clothing/head/vampire/bogatyr/captain = 1) + result = /obj/item/clothing/head/vampire/bogatyr/captain/heavy + /datum/crafting_recipe/tzi_heart name = "Second Heart (Antistun)" time = 50 diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/objects/surgery_tools.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/objects/surgery_tools.dm index 498886581540..2957b295fb25 100644 --- a/modular_darkpack/modules/powers/code/discipline/vicissitude/objects/surgery_tools.dm +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/objects/surgery_tools.dm @@ -15,6 +15,8 @@ /obj/item/blood_filter/augment/vicissitude, /obj/item/healthanalyzer/vicissitude, /obj/item/shockpaddles/cyborg/vicissitude) + extend_sound = 'modular_darkpack/modules/powers/sounds/vicissitude.ogg' + retract_sound = 'modular_darkpack/modules/powers/sounds/vicissitude.ogg' /obj/item/retractor/augment/vicissitude name = "retracting appendage" diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm index de69f873a946..22be775d5d02 100644 --- a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm @@ -135,21 +135,29 @@ var/obj/item/bodypart/arm/left/l_arm = target.get_bodypart(BODY_ZONE_L_ARM) var/obj/item/bodypart/leg/right/r_leg = target.get_bodypart(BODY_ZONE_R_LEG) var/obj/item/bodypart/leg/left/l_leg = target.get_bodypart(BODY_ZONE_L_LEG) + var/obj/item/bodypart/head = target.get_bodypart(BODY_ZONE_HEAD) r_arm?.drop_limb() l_arm?.drop_limb() r_leg?.drop_limb() l_leg?.drop_limb() + head?.drop_organs() new /obj/item/stack/sheet/meat/twenty(target.loc) new /obj/item/guts(target.loc) new /obj/item/spine(target.loc) qdel(target) else target.emote("scream") - target.apply_damage(roll LETHAL_TTRPG_DAMAGE, BRUTE, BODY_ZONE_CHEST) + var/target_zone = owner.zone_selected + var/obj/item/bodypart/limb = target.get_bodypart(target_zone) + if(!limb) + target.apply_damage(roll LETHAL_TTRPG_DAMAGE, BRUTE, BODY_ZONE_CHEST, wound_bonus = 10) + return + target.apply_damage(roll LETHAL_TTRPG_DAMAGE, BRUTE, target_zone, wound_bonus = 10) if(roll >= 5) - target.visible_message(span_danger("[target]'s rib cage curves inwards grotesquely!"), span_danger("Your feel your ribcages curve inwards and pierce your heart!")) - target.adjust_blood_pool(-(round(target.bloodpool * 0.5))) // A vampire who scores five or more successes on the roll (...) cause the affected vampire to lose half his blood points. - + // A vampire who scores five or more successes on the roll (...) cause the affected vampire to lose half his blood points. + if((target_zone == BODY_ZONE_CHEST)) + target.visible_message(span_danger("[target]'s rib cage curves inwards grotesquely!"), span_danger("Your feel your ribcages curve inwards and pierce your heart!")) + target.adjust_blood_pool(-(round(target.bloodpool * 0.5))) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /datum/discipline_power/vicissitude/horrid_form diff --git a/modular_darkpack/modules/powers/code/discipline_pref_middleware.dm b/modular_darkpack/modules/powers/code/discipline_pref_middleware.dm index 4017f4560f67..d0d9ae5369a2 100644 --- a/modular_darkpack/modules/powers/code/discipline_pref_middleware.dm +++ b/modular_darkpack/modules/powers/code/discipline_pref_middleware.dm @@ -7,9 +7,10 @@ GLOBAL_LIST_INIT(rare_discipline_types, list( /datum/discipline/obtenebration, /datum/discipline/thaumaturgy, /datum/discipline/necromancy, - /datum/discipline/daimoinon, /datum/discipline/valeren, - // melpominee not yet implemented but will go here + /datum/discipline/obeah, + /datum/discipline/daimoinon, + /datum/discipline/melpominee, )) // warns a player if they have no discipline dots assigned before joining @@ -118,13 +119,6 @@ GLOBAL_LIST_INIT(rare_discipline_types, list( data["clan_disciplines"] = list() data["clan_name"] = null var/clan_value = preferences.read_preference(/datum/preference/choiced/subsplat/vampire_clan) - if(clan_value) - var/datum/subsplat/vampire_clan/clan_datum = get_vampire_clan(clan_value) - if(clan_datum) - data["clan_name"] = clan_datum.name - for(var/disc_type in clan_datum.clan_disciplines) - if(ispath(disc_type, /datum/discipline)) - data["clan_disciplines"] += "[disc_type]" var/discipline_count = 0 var/list/counted_discs = list() @@ -146,7 +140,7 @@ GLOBAL_LIST_INIT(rare_discipline_types, list( data["discipline_points_spent"] = points_spent data["discipline_tier"] = budget_info["tier"] data["discipline_tier_details"] = budget_info["details"] - data["is_trusted"] = preferences.discipline_trusted || FALSE + data["is_trusted"] = preferences?.has_whitelist(WHITELIST_TRUSTED) data["max_trusted_generation"] = MAX_TRUSTED_GENERATION data["max_public_generation"] = MAX_PUBLIC_GENERATION data["highest_generation_limit"] = HIGHEST_GENERATION_LIMIT @@ -257,8 +251,15 @@ GLOBAL_LIST_INIT(rare_discipline_types, list( if(!isnewplayer(user) && ("[user.client.prefs.default_slot]" in user.persistent_client.joined_as_slots)) to_chat(user, span_warning("You may not adjust discipline dots of characters that have played in the current round.")) return FALSE - - preferences.discipline_levels = list() + var/clan_value = preferences.read_preference(/datum/preference/choiced/subsplat/vampire_clan) + if(!clan_value) + return FALSE + preferences.discipline_levels = list() // restore them to default + var/datum/subsplat/vampire_clan/clan_datum = get_vampire_clan(clan_value) // then give them their default clan discs. clear_discipline_levels fires from changing clans + if(clan_datum) + for(var/disc_type in clan_datum.clan_disciplines) + if(ispath(disc_type, /datum/discipline)) + preferences.discipline_levels += disc_type preferences.save_character() return TRUE diff --git a/modular_darkpack/modules/preferences/height_preference.dm b/modular_darkpack/modules/preferences/height_preference.dm index dfd427431c2e..78a42e019ab4 100644 --- a/modular_darkpack/modules/preferences/height_preference.dm +++ b/modular_darkpack/modules/preferences/height_preference.dm @@ -1,5 +1,5 @@ /datum/preference/numeric/height - category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_key = "height" savefile_identifier = PREFERENCE_CHARACTER priority = PREFERENCE_PRIORITY_WORLD_OF_DARKNESS diff --git a/modular_darkpack/modules/retail/code/_retail.dm b/modular_darkpack/modules/retail/code/_retail.dm index 45f144715517..3a22139e5d41 100644 --- a/modular_darkpack/modules/retail/code/_retail.dm +++ b/modular_darkpack/modules/retail/code/_retail.dm @@ -10,6 +10,7 @@ density = FALSE anchored = TRUE anchored_tabletop_offset = 6 + var/take_area_name = TRUE var/owner_needed = TRUE //Does an npc need to be here for this var/mob/living/carbon/human/npc/my_owner //tracks existence of owner var/payment_department = ACCOUNT_SRV @@ -26,6 +27,9 @@ RegisterSignal(my_owner, COMSIG_QDELETING, PROC_REF(cleanup_owner)) build_inventory() + if(take_area_name) + name = get_area_name(src, TRUE) + /obj/structure/retail/proc/cleanup_owner() SIGNAL_HANDLER diff --git a/modular_darkpack/modules/retail/code/stores/flower_shop.dm b/modular_darkpack/modules/retail/code/stores/flower_shop.dm index 5bf443250d2a..4d2551fff8fb 100644 --- a/modular_darkpack/modules/retail/code/stores/flower_shop.dm +++ b/modular_darkpack/modules/retail/code/stores/flower_shop.dm @@ -1,5 +1,4 @@ /obj/structure/retail/flower_shop - name = "Community Garden" desc = "The only 24hr flower shop in SanFran." products_list = list( new /datum/data/vending_product("Gardening Gloves", /obj/item/clothing/gloves/botanic_leather, 45), diff --git a/modular_darkpack/modules/retail/code/stores/restaurant/coffee_shop.dm b/modular_darkpack/modules/retail/code/stores/restaurant/coffee_shop.dm index 2760bb6cf7db..103815d780f9 100644 --- a/modular_darkpack/modules/retail/code/stores/restaurant/coffee_shop.dm +++ b/modular_darkpack/modules/retail/code/stores/restaurant/coffee_shop.dm @@ -1,5 +1,4 @@ /obj/structure/retail/coffee_shop - name = "Coffee Shop" desc = "Mmmm, Donuts... Overpriced, but warm. The best you'll be getting on a night like this." owner_needed = FALSE product_types = list( diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_curse_rune.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_curse_rune.dm index e31e8d385ab5..7097424cb87c 100644 --- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_curse_rune.dm +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_curse_rune.dm @@ -114,6 +114,7 @@ if(H.real_name == curse_target) found_target = TRUE H.adjust_agg_loss(25 + activator_bonus) + log_combat(last_activator, curse_target, "bloodcursed") playsound(H.loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) to_chat(H, span_warning("You feel dark energy tearing at your very being!")) H.Stun(2) diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_trap.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_trap.dm index 1f191bf5cfe2..0f7f7061e9a8 100644 --- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_trap.dm +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_trap.dm @@ -17,6 +17,7 @@ if(isliving(arrived) && activated) var/mob/living/L = arrived L.adjust_fire_loss(50 + activator_bonus) + log_combat(last_activator, arrived, "'s ward rune was triggered by") playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) qdel(src) diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/bloodwalk.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/bloodwalk.dm index 5b1391aa7bd7..160d0ce51ba7 100644 --- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/bloodwalk.dm +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/bloodwalk.dm @@ -12,7 +12,7 @@ var/blood_data = B.data if(blood_data) var/generation = blood_data["generation"] - var/clan = blood_data["clan"] + var/clan = LOWER_TEXT(blood_data["clan"]) var/real_name = blood_data["real_name"] var/message = generate_message(generation, clan, real_name) to_chat(last_activator, "[message]") diff --git a/modular_darkpack/modules/splats/code/prefrences/splat_middleware.dm b/modular_darkpack/modules/splats/code/prefrences/splat_middleware.dm index f7a35c778227..2427371f8061 100644 --- a/modular_darkpack/modules/splats/code/prefrences/splat_middleware.dm +++ b/modular_darkpack/modules/splats/code/prefrences/splat_middleware.dm @@ -36,3 +36,12 @@ for (var/spritesheet_key in to_insert) Insert(spritesheet_key, to_insert[spritesheet_key]) + +/datum/preference_middleware/splat/get_ui_static_data(mob/user) + . = ..() + + var/list/names_to_key = list() + for(var/datum/subsplat/vampire_clan/clan as anything in GLOB.vampire_clans) + names_to_key[clan::name] = clan::id + .["clan_names_to_key"] = names_to_key + diff --git a/modular_darkpack/modules/splats/code/splat_configs.dm b/modular_darkpack/modules/splats/code/splat_configs.dm index 06f159a8a209..27696e9b6e88 100644 --- a/modular_darkpack/modules/splats/code/splat_configs.dm +++ b/modular_darkpack/modules/splats/code/splat_configs.dm @@ -1,5 +1,7 @@ /// List of roundstart splats' their splat_id's GLOBAL_LIST_EMPTY(roundstart_splats) +GLOBAL_LIST_EMPTY(whitelisted_splats) +GLOBAL_LIST_EMPTY(default_player_whitelists) /datum/config_entry/keyed_list/roundstart_splats //splats you can play as from the get go. key_mode = KEY_MODE_TEXT @@ -9,9 +11,22 @@ GLOBAL_LIST_EMPTY(roundstart_splats) if(key_name in GLOB.splat_list) return TRUE - log_config("ERROR: [key_name] is not a valid race ID.") + log_config("ERROR: [key_name] is not a valid splat ID.") return FALSE + +/datum/config_entry/keyed_list/whitelisted_splats //splats you can play as from the get go. + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + +/datum/config_entry/keyed_list/whitelisted_splats/ValidateListEntry(key_name, key_value) + if(key_name in GLOB.splat_list) + return TRUE + + log_config("ERROR: [key_name] is not a valid splat ID.") + return FALSE + + /** * Checks if a splat is eligible to be picked at roundstart. * @@ -23,6 +38,12 @@ GLOBAL_LIST_EMPTY(roundstart_splats) return TRUE return FALSE +/datum/splat/proc/requires_whitelist() + if(id in (CONFIG_GET(keyed_list/whitelisted_splats))) + return TRUE + return FALSE + + /** * Generates splat available to choose in character setup at roundstart * @@ -47,3 +68,35 @@ GLOBAL_LIST_EMPTY(roundstart_splats) GLOB.roundstart_splats = generate_selectable_splats() return GLOB.roundstart_splats + + +/proc/get_default_player_whitelists() + RETURN_TYPE(/alist) + + if (!GLOB.default_player_whitelists.len) + var/alist/defs = alist( + WHITELIST_TRUSTED = FALSE, + WHITELIST_TIMELIMITS = FALSE, + SPLAT_NONE = TRUE, + ) + + for(var/splat_id in get_selectable_splats()) + var/splat_type = GLOB.splat_list[splat_id] + var/datum/splat/splat = GLOB.splat_prototypes[splat_type] + + defs[splat_id] = !splat.requires_whitelist() + + var/list/clan_whitelist_values = CONFIG_GET(keyed_list/whitelisted_clans) + for(var/clan_name in GLOB.vampire_clan_list) + var/datum/subsplat/vampire_clan/clan = get_vampire_clan(clan_name) + if(!clan) + continue + + if(clan.id in clan_whitelist_values) + defs[clan.id] = FALSE + else + defs[clan.id] = TRUE + + GLOB.default_player_whitelists = defs + + return GLOB.default_player_whitelists diff --git a/modular_darkpack/modules/splats/code/splat_management.dm b/modular_darkpack/modules/splats/code/splat_management.dm index 04b1e4b14c09..b17efd31b386 100644 --- a/modular_darkpack/modules/splats/code/splat_management.dm +++ b/modular_darkpack/modules/splats/code/splat_management.dm @@ -62,7 +62,7 @@ return TRUE -/// Returns the splat with the highest priority, with a prefrence for ones first assigned. +/// Returns the splat with the highest priority, with a preference for ones first assigned. /mob/living/proc/get_primary_splat(splat_type, count_splat = TRUE, count_halfsplat = TRUE) RETURN_TYPE(/datum/splat) diff --git a/modular_darkpack/modules/splats/code/subsplat/_subsplat.dm b/modular_darkpack/modules/splats/code/subsplat/_subsplat.dm index 6b655a62c6e0..1a39b2dbc074 100644 --- a/modular_darkpack/modules/splats/code/subsplat/_subsplat.dm +++ b/modular_darkpack/modules/splats/code/subsplat/_subsplat.dm @@ -16,11 +16,14 @@ var/name /// Description of what the splat is and what it does var/desc - /// If set, the roleplay level that is displayed in prefrences as a guide to players. + /// If set, the roleplay level that is displayed in preferences as a guide to players. var/roleplay_level /// ID for trait sources and whatnot var/id + /// List of traits that are applied to members of this subsplat + var/list/subsplat_traits = list() + /// Typepath of keys for this subsplats's exclusive hideout var/obj/item/vamp/keys/subsplat_keys /// If we check the list of ids of city doors before granting the subsplat key @@ -34,6 +37,10 @@ RegisterSignal(gaining_mob, COMSIG_MOB_LOGIN, PROC_REF(on_join_round)) RegisterSignal(gaining_mob, COMSIG_HUMAN_CHARACTER_SETUP_FINISHED, PROC_REF(apply_after_setup)) + // Add unique subsplat features as traits + for (var/trait in subsplat_traits) + ADD_TRAIT(gaining_mob, trait, SUBSPLAT_TRAIT) + /** * Undoes the effects of on_gain more or less * remove the effects of gaining the subsplat. @@ -44,6 +51,11 @@ /datum/subsplat/proc/on_lose(mob/living/carbon/human/losing_mob) SHOULD_CALL_PARENT(TRUE) UnregisterSignal(losing_mob, list(COMSIG_MOB_LOGIN, COMSIG_HUMAN_CHARACTER_SETUP_FINISHED)) + + // Remove unique subsplat feature traits + for (var/trait in subsplat_traits) + REMOVE_TRAIT(losing_mob, trait, SUBSPLAT_TRAIT) + return diff --git a/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm b/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm index 41f7f2a2acc4..2ddd408d6e78 100644 --- a/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm +++ b/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm @@ -79,6 +79,10 @@ . -= 1 */ +/datum/storyteller_roll/damage/attacker_disarm + numerical = TRUE + applicable_stats = list(STAT_STRENGTH) + /datum/storyteller_roll/shooting bumper_text = "shooting" applicable_stats = list(STAT_DEXTERITY, STAT_FIREARMS) diff --git a/modular_darkpack/modules/storyteller_stats/code/_st_stats.dm b/modular_darkpack/modules/storyteller_stats/code/_st_stats.dm index 02f42bf7e6e9..c0dc8c49c5bb 100644 --- a/modular_darkpack/modules/storyteller_stats/code/_st_stats.dm +++ b/modular_darkpack/modules/storyteller_stats/code/_st_stats.dm @@ -15,6 +15,8 @@ VAR_PROTECTED/bonus_score = 0 /// Temporary bonus score applied to this stat from various ingame sources. These are directly added to results rather then added to dice pool VAR_PROTECTED/auto_success_score = 0 + /// Temporary number that clamps a stat to less-then or equal to said value + VAR_PROTECTED/stat_clamp_score /// The minimum score this stat can be. var/min_score = 0 /// The maximum score this stat can be. @@ -30,6 +32,8 @@ var/list/modifiers /// LAZYLIST. A dictionary of auto success scores to this attribute. var/list/auto_successes + /// LAZYLIST. A dictionary of stat clamps to this attribute. + var/list/stat_clamps /// What score does this stat start out with at character creation. var/starting_score = 0 /// How many points are in this stat category that the player can use. Used in abstract classes only. @@ -38,16 +42,20 @@ var/freebie_cost_spent = 0 // Score +/datum/st_stat/proc/get_pure_score() + return score -/datum/st_stat/proc/get_score(include_bonus = TRUE, include_auto_sucesses = TRUE) +/datum/st_stat/proc/get_score(include_bonus = TRUE, include_auto_sucesses = TRUE, include_stat_clamps = TRUE) SHOULD_NOT_OVERRIDE(TRUE) + var/using_score = score if(include_bonus) - if(include_auto_sucesses) - return score + bonus_score + auto_success_score - else - return score + bonus_score - else - return score + using_score += bonus_score + if(include_auto_sucesses) + using_score += auto_success_score + + if(include_stat_clamps && !isnull(stat_clamp_score)) + return min(using_score, stat_clamp_score) + return using_score /datum/st_stat/proc/get_bonus_score() SHOULD_NOT_OVERRIDE(TRUE) @@ -137,6 +145,24 @@ auto_success_score += auto_successes[source] auto_success_score = clamp(auto_success_score, 0, 10) + +/datum/st_stat/proc/add_stat_clamps(amount, source) + SHOULD_NOT_OVERRIDE(TRUE) + LAZYSET(stat_clamps, source, amount) + update_stat_clamps() + +/datum/st_stat/proc/remove_stat_clamps(source) + SHOULD_NOT_OVERRIDE(TRUE) + LAZYREMOVE(stat_clamps, source) + update_stat_clamps() + +/datum/st_stat/proc/update_stat_clamps() + SHOULD_NOT_OVERRIDE(TRUE) + stat_clamp_score = null + for(var/source in stat_clamps) + if(isnull(stat_clamp_score) || (stat_clamps[source] <= stat_clamp_score)) + stat_clamp_score = stat_clamps[source] + // Points /datum/st_stat/proc/get_points() @@ -196,5 +222,11 @@ freebie_cost_spent += amount return TRUE +/datum/st_stat/proc/link_mob(mob/living/our_mob) + return + +/datum/st_stat/proc/unlink_mob(mob/living/our_mob) + return + /datum/st_stat/proc/update_mob(mob/living/our_mob, initial) return diff --git a/modular_darkpack/modules/storyteller_stats/code/global_procs.dm b/modular_darkpack/modules/storyteller_stats/code/global_procs.dm index 70e8baa900df..bbf8e4e63f46 100644 --- a/modular_darkpack/modules/storyteller_stats/code/global_procs.dm +++ b/modular_darkpack/modules/storyteller_stats/code/global_procs.dm @@ -12,7 +12,7 @@ /proc/update_middleware_stats(list/preference_storyteller_stats) var/datum/st_stat/stat_courage = preference_storyteller_stats[STAT_COURAGE] var/datum/st_stat/stat_permenant_willpower = preference_storyteller_stats[STAT_PERMANENT_WILLPOWER] - stat_permenant_willpower.add_stat_mod(clamp(-(stat_permenant_willpower.get_score(include_bonus = FALSE) - 10), 0, stat_courage.get_score(include_bonus = TRUE)), "COURAGE") + stat_permenant_willpower.add_stat_mod(clamp(-(stat_permenant_willpower.get_pure_score() - 10), 0, stat_courage.get_score(include_bonus = TRUE)), "COURAGE") var/datum/st_stat/stat_temporary_willpower = preference_storyteller_stats[STAT_TEMPORARY_WILLPOWER] stat_temporary_willpower.set_score(stat_permenant_willpower.get_score(include_bonus = TRUE)) diff --git a/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/medicine_skill_surgery.dm b/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/medicine_skill_surgery.dm new file mode 100644 index 000000000000..abc51793d9cc --- /dev/null +++ b/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/medicine_skill_surgery.dm @@ -0,0 +1,9 @@ +//Function for giving a player upgraded wound tending based on their current medical skill +/datum/st_stat/ability/medicine/proc/check_medicine_wound_tending(mob/living/source, atom/movable/operating_on, list/possible_operations) + SIGNAL_HANDLER + + var/medicine = source.st_get_stat(STAT_MEDICINE) + if(medicine >= 4) + possible_operations += /datum/surgery_operation/basic/tend_wounds/combo/upgraded + else if(medicine >= 3) + possible_operations += /datum/surgery_operation/basic/tend_wounds/combo diff --git a/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm b/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm index d67ab257a4cc..333aca3a40ab 100644 --- a/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm +++ b/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm @@ -1,21 +1,21 @@ /// Get a specific mob's stat from its stats list. -/mob/living/proc/st_get_stat(stat_path, include_bonus, include_auto_successes) +/mob/living/proc/st_get_stat(stat_path, include_bonus, include_auto_successes, include_stat_clamps) var/datum/st_stat/given_stat = storyteller_stats[stat_path] - return given_stat?.get_score(include_bonus, include_auto_successes) + return given_stat?.get_score(include_bonus, include_auto_successes, include_stat_clamps) /// Wrapper for st_get_stat to reduce copypaste. Get a specific mob's stat from its stats list. -/mob/living/proc/st_get_stats(list/stat_list, include_bonus, include_auto_successes) +/mob/living/proc/st_get_stats(list/stat_list, include_bonus, include_auto_successes, include_stat_clamps) var/total_score = 0 for(var/stat_path in stat_list) var/datum/st_stat/given_stat = storyteller_stats[stat_path] - total_score += given_stat?.get_score(include_bonus, include_auto_successes) + total_score += given_stat?.get_score(include_bonus, include_auto_successes, include_stat_clamps) return total_score /// Set a specific mob's stat from its stats list. /mob/living/proc/st_set_stat(stat_path, amount) var/datum/st_stat/given_stat = storyteller_stats[stat_path] var/score = given_stat?.set_score(amount) - update_modifiers_from_stats() + given_stat.update_mob(src) return score /// Changes a specific mob's stat from its stats list by the given amount. @@ -26,40 +26,73 @@ score = given_stat?.increase_score(amount) else score = given_stat?.decrease_score(amount) - update_modifiers_from_stats() + given_stat.update_mob(src) return score /mob/living/proc/st_add_stat_mod(stat_path, amount, source) var/datum/st_stat/given_stat = storyteller_stats[stat_path] var/score = given_stat?.add_stat_mod(amount, source) - update_modifiers_from_stats() + given_stat.update_mob(src) return score /mob/living/proc/st_remove_stat_mod(stat_path, source) var/datum/st_stat/given_stat = storyteller_stats[stat_path] var/score = given_stat?.remove_stat_mod(source) - update_modifiers_from_stats() + given_stat.update_mob(src) return score /mob/living/proc/st_add_auto_successes(stat_path, amount, source) var/datum/st_stat/given_stat = storyteller_stats[stat_path] var/score = given_stat?.add_auto_successes(amount, source) - update_modifiers_from_stats() + given_stat.update_mob(src) return score /mob/living/proc/st_remove_auto_successes(stat_path, source) var/datum/st_stat/given_stat = storyteller_stats[stat_path] var/score = given_stat?.remove_auto_successes(source) - update_modifiers_from_stats() + given_stat.update_mob(src) return score +/mob/living/proc/st_add_stat_clamp(stat_path, amount, source) + var/datum/st_stat/given_stat = storyteller_stats[stat_path] + var/score = given_stat?.add_stat_clamps(amount, source) + given_stat.update_mob(src) + return score + +/mob/living/proc/st_remove_stat_clamp(stat_path, source) + var/datum/st_stat/given_stat = storyteller_stats[stat_path] + var/score = given_stat?.remove_stat_clamps(source) + given_stat.update_mob(src) + return score + +/mob/living/proc/replace_storyteller_stats(list/new_stat_list, initial = FALSE) + if(length(storyteller_stats)) + unlink_st_stats() + + storyteller_stats = new_stat_list + link_st_stats() + update_modifiers_from_stats(initial) + +/mob/living/proc/clear_storyteller_stats() + unlink_st_stats() + storyteller_stats = null + +/mob/living/proc/link_st_stats() + for(var/stat_path in storyteller_stats) + var/datum/st_stat/given_stat = storyteller_stats[stat_path] + given_stat.link_mob(src) + +/mob/living/proc/unlink_st_stats() + for(var/stat_path in storyteller_stats) + var/datum/st_stat/taken_stat = storyteller_stats[stat_path] + taken_stat.unlink_mob(src) + /mob/living/proc/update_modifiers_from_stats(initial = FALSE) for(var/stat_typepath in storyteller_stats) var/datum/st_stat/stat_datum = storyteller_stats[stat_typepath] stat_datum.update_mob(src, initial) /datum/preferences/proc/apply_stats_from_prefs(mob/living/carbon/human/character) - character.storyteller_stats = preference_storyteller_stats.Copy() - character.update_modifiers_from_stats(TRUE) + character.replace_storyteller_stats(preference_storyteller_stats.Copy(), TRUE) diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/default_abilities.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/default_abilities.dm index c5facd817c5f..1a5913e8fa19 100644 --- a/modular_darkpack/modules/storyteller_stats/code/st_stats/default_abilities.dm +++ b/modular_darkpack/modules/storyteller_stats/code/st_stats/default_abilities.dm @@ -141,6 +141,12 @@ name = "Medicine" description = "Affects your character's knowledge of anatomy, medicine, and emergency first aid protocols. Used in Vicissitude." +/datum/st_stat/ability/medicine/link_mob(mob/living/our_mob) + RegisterSignal(our_mob, COMSIG_LIVING_OPERATING_ON, PROC_REF(check_medicine_wound_tending)) + +/datum/st_stat/ability/medicine/unlink_mob(mob/living/our_mob) + UnregisterSignal(our_mob, COMSIG_LIVING_OPERATING_ON) + /datum/st_stat/ability/occult subcategory = "Knowledges" name = "Occult" diff --git a/modular_darkpack/modules/storyteller_stats/code/stat_pref_middleware.dm b/modular_darkpack/modules/storyteller_stats/code/stat_pref_middleware.dm index d4ac3140b003..4c6b413e50f6 100644 --- a/modular_darkpack/modules/storyteller_stats/code/stat_pref_middleware.dm +++ b/modular_darkpack/modules/storyteller_stats/code/stat_pref_middleware.dm @@ -20,7 +20,7 @@ stat_data["subcategory"] = stat.subcategory stat_data["max_score"] = stat.max_score stat_data["points"] = stat.get_points() - stat_data["score"] = stat.get_score(include_bonus = FALSE) + stat_data["score"] = stat.get_pure_score() stat_data["bonus_score"] = max(stat.get_bonus_score(), 0) // Dont go below 0 as this is to display bonuses and doesnt have handling for negative bonus score atm stat_data["abstract_type"] = "[stat.abstract_type]" data["stats"]["[stat.type]"] = stat_data @@ -36,13 +36,13 @@ var/datum/st_stat/stat_path = preferences.preference_storyteller_stats[text2path(params["stat"])] var/datum/st_stat/abstract_stat = preferences.preference_storyteller_stats[stat_path.abstract_type] var/datum/st_stat/freebie_point_stat = preferences.preference_storyteller_stats[STAT_FREEBIE_POINTS] - var/old_value = stat_path.get_score(include_bonus = FALSE) + var/old_value = stat_path.get_pure_score() if(!stat_path.can_increase_score(1)) // Have we reached the max_score of the stat? return FALSE // If we have, then return early. - if((stat_path.get_score(include_bonus = FALSE) + 1) > stat_path.starting_score) + if((stat_path.get_pure_score() + 1) > stat_path.starting_score) if(abstract_stat.can_decrease_points(1)) // Can we spend points on this stat? abstract_stat.decrease_points(1) // Spend a point. else @@ -57,7 +57,7 @@ update_middleware_stats(preferences.preference_storyteller_stats) - var/new_value = stat_path.get_score(include_bonus = FALSE) + var/new_value = stat_path.get_pure_score() var/real_name = user.client.prefs.read_preference(/datum/preference/name/real_name) user.log_message("increased stat '[stat_path.name]' from [old_value] to [new_value] on [real_name]", LOG_STATS) return TRUE @@ -72,12 +72,12 @@ var/datum/st_stat/stat_path = preferences.preference_storyteller_stats[text2path(params["stat"])] var/datum/st_stat/abstract_stat = preferences.preference_storyteller_stats[stat_path.abstract_type] var/datum/st_stat/freebie_point_stat = preferences.preference_storyteller_stats[STAT_FREEBIE_POINTS] - var/old_value = stat_path.get_score(include_bonus = FALSE) + var/old_value = stat_path.get_pure_score() if(!stat_path.can_decrease_score(1)) return FALSE - if((stat_path.get_score(include_bonus = FALSE) - 1) >= stat_path.starting_score) + if((stat_path.get_pure_score() - 1) >= stat_path.starting_score) if(freebie_point_stat.can_increase_freebie_points(stat_path.freebie_point_cost)) // Can we regain freebie points? freebie_point_stat.increase_freebie_points(stat_path.freebie_point_cost) // Regain freebie points. else @@ -88,7 +88,7 @@ if(stat_path.stat_flags & AFFECTS_STATS) update_middleware_stats(preferences.preference_storyteller_stats) - var/new_value = stat_path.get_score(include_bonus = FALSE) + var/new_value = stat_path.get_pure_score() var/real_name = user.client.prefs.read_preference(/datum/preference/name/real_name) user.log_message("decreased stat '[stat_path.name]' from [old_value] to [new_value] on '[real_name]'", LOG_STATS) return TRUE diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/preferences/generation.dm b/modular_darkpack/modules/vampire_the_masquerade/code/preferences/generation.dm index 6b27ba0fa2ab..0dd729bead0d 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/preferences/generation.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/preferences/generation.dm @@ -8,13 +8,13 @@ maximum = HIGHEST_GENERATION_LIMIT /datum/preference/numeric/generation/is_valid(value, datum/preferences/preferences) - var/min = preferences?.discipline_trusted ? MAX_TRUSTED_GENERATION : MAX_PUBLIC_GENERATION + var/min = preferences?.has_whitelist(WHITELIST_TRUSTED) ? MAX_TRUSTED_GENERATION : MAX_PUBLIC_GENERATION return isnum(value) && value >= min && value <= HIGHEST_GENERATION_LIMIT /datum/preference/numeric/generation/deserialize(input, datum/preferences/preferences) if(istext(input)) input = text2num(input) - var/min = preferences?.discipline_trusted ? MAX_TRUSTED_GENERATION : MAX_PUBLIC_GENERATION + var/min = preferences?.has_whitelist(WHITELIST_TRUSTED) ? MAX_TRUSTED_GENERATION : MAX_PUBLIC_GENERATION return sanitize_float(input, min, HIGHEST_GENERATION_LIMIT, 1, rand(min, HIGHEST_GENERATION_LIMIT)) /datum/preference/numeric/generation/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/__vampire_clan.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/__vampire_clan.dm index 1b3d5652bd9a..d9e4953a4b4e 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/__vampire_clan.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/__vampire_clan.dm @@ -9,8 +9,6 @@ var/list/clan_disciplines = list() /// List of Disciplines that are rejected by this Clan var/list/restricted_disciplines = list() - /// List of traits that are applied to members of this Clan - var/list/clan_traits = list() /// The Clan's unique body sprite var/alt_sprite @@ -69,20 +67,12 @@ if (no_facial) gaining_mob.set_facial_hairstyle("Shaved", update = FALSE) - // Add unique Clan features as traits - for (var/trait in clan_traits) - ADD_TRAIT(gaining_mob, trait, CLAN_TRAIT) - // Mostly for summons to not kill you. gaining_mob.add_faction(id) /datum/subsplat/vampire_clan/on_lose(mob/living/carbon/human/losing_mob) . = ..() - // Remove unique Clan feature traits - for (var/trait in clan_traits) - REMOVE_TRAIT(losing_mob, trait, CLAN_TRAIT) - // Sets the losing_mob back to their default body sprite if (alt_sprite) losing_mob.set_body_sprite(ignore_clan = TRUE) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clan_pref.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clan_pref.dm index 3733cb4a7f45..0404f6cf5cb0 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clan_pref.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clan_pref.dm @@ -17,3 +17,13 @@ /datum/preference/choiced/subsplat/vampire_clan/post_set_preference(mob/user, value) var/datum/subsplat/vampire_clan/clan = get_vampire_clan(value) clan?.show_lore(user) + +/* +/datum/preference/choiced/subsplat/vampire_clan/compile_constant_data() + var/list/data = ..() + var/list/names_to_key = list() + for(var/datum/subsplat/vampire_clan/clan in GLOB.vampire_clans) + names_to_key[clan.name] = clan.id + data["names_to_key"] = names_to_key + return data +*/ diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/baali/baali.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/baali/baali.dm index 6592c682fcf4..12b4a2218f92 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/baali/baali.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/baali/baali.dm @@ -11,7 +11,7 @@ /datum/discipline/daimoinon ) - clan_traits = list( + subsplat_traits = list( TRAIT_REPELLED_BY_HOLINESS ) male_clothes = /obj/item/clothing/under/vampire/baali diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/banu_haqim.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/banu_haqim.dm index 28bbb25556c7..fb93e73a9d35 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/banu_haqim.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/banu_haqim.dm @@ -11,7 +11,7 @@ /datum/discipline/obfuscate, /datum/discipline/quietus ) - clan_traits = list( + subsplat_traits = list( TRAIT_VITAE_ADDICTION ) male_clothes = /obj/item/clothing/under/vampire/bandit @@ -34,4 +34,8 @@ /datum/discipline/auspex, /datum/discipline/quietus ) - clan_traits = list() + subsplat_traits = list() + +/datum/subsplat/vampire_clan/banu_haqim/on_join_round(mob/living/carbon/human/joining) + . = ..() + joining.grant_language(/datum/language/arabic) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/brujah.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/brujah.dm index 87d5d7c3f4c9..80b89b09e90c 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/brujah.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/brujah.dm @@ -11,7 +11,7 @@ /datum/discipline/potence, /datum/discipline/presence ) - clan_traits = list( + subsplat_traits = list( TRAIT_DIFFICULT_FRENZY ) male_clothes = /obj/item/clothing/under/vampire/brujah diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/gargoyle.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/gargoyle.dm index 788d248182a2..955cc8dcf51d 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/gargoyle.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/gargoyle.dm @@ -10,7 +10,7 @@ /datum/discipline/potence, /datum/discipline/visceratika ) - clan_traits = list( + subsplat_traits = list( TRAIT_CANNOT_RESIST_MIND_CONTROL, TRAIT_MASQUERADE_VIOLATING_FACE, TRAIT_WEAK_TO_DOMINATE, diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/giovanni.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/giovanni.dm index b686a391e96a..65fbcb79a8a4 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/giovanni.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/giovanni.dm @@ -10,7 +10,7 @@ /datum/discipline/dominate, /datum/discipline/necromancy ) - clan_traits = list( + subsplat_traits = list( TRAIT_PAINFUL_VAMPIRE_KISS ) male_clothes = /obj/item/clothing/under/vampire/suit diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/healer_salubri.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/healer_salubri.dm index 26e27aff97a1..5c484179a988 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/healer_salubri.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/healer_salubri.dm @@ -10,7 +10,7 @@ /datum/discipline/fortitude, /datum/discipline/obeah ) - clan_traits = list( + subsplat_traits = list( TRAIT_CONSENSUAL_FEEDING_ONLY, TRAIT_IRRESISTIBLE_VITAE ) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/kiasyd/kiasyd.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/kiasyd/kiasyd.dm index a480f1d5f3e0..272515282347 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/kiasyd/kiasyd.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/kiasyd/kiasyd.dm @@ -10,7 +10,7 @@ /datum/discipline/obtenebration, /datum/discipline/mytherceria ) - clan_traits = list( + subsplat_traits = list( TRAIT_MASQUERADE_VIOLATING_EYES ) alt_sprite = "kiasyd" diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/lasombra/lasombra.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/lasombra/lasombra.dm index 4b07f6300532..e57d67c04d00 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/lasombra/lasombra.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/lasombra/lasombra.dm @@ -10,7 +10,7 @@ /datum/discipline/dominate, /datum/discipline/obtenebration ) - clan_traits = list( + subsplat_traits = list( TRAIT_REJECTED_BY_TECHNOLOGY, TRAIT_NO_MIRROR_REFLECTION, TRAIT_INVISIBLE_TO_CAMERA diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/nagaraja.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/nagaraja.dm index 2dc50c8fff9b..37b335b9fdbd 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/nagaraja.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/nagaraja.dm @@ -10,7 +10,7 @@ /datum/discipline/dominate, /datum/discipline/necromancy ) - clan_traits = list(TRAIT_ORGANOVORE) + subsplat_traits = list(TRAIT_ORGANOVORE) male_clothes = /obj/item/clothing/under/vampire/emo female_clothes = /obj/item/clothing/under/vampire/emo whitelisted = FALSE diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/nosferatu.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/nosferatu.dm index 07a2d212a235..1f523cae864a 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/nosferatu.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/nosferatu.dm @@ -12,7 +12,7 @@ /datum/discipline/potence, /datum/discipline/obfuscate ) - clan_traits = list( + subsplat_traits = list( TRAIT_MASQUERADE_VIOLATING_FACE, TRAIT_VENTCRAWLER_ALWAYS ) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/samedi.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/samedi.dm index 0e479e724f8f..2f058021a9a1 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/samedi.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/samedi.dm @@ -10,7 +10,7 @@ /datum/discipline/thanatosis ) alt_sprite = "rotten4" - clan_traits = list( + subsplat_traits = list( TRAIT_MASQUERADE_VIOLATING_FACE ) whitelisted = TRUE diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/setite.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/setite.dm index e27355e23dd6..5cd4dcd8bb71 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/setite.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/setite.dm @@ -11,7 +11,7 @@ /datum/discipline/presence, /datum/discipline/serpentis ) - clan_traits = list( + subsplat_traits = list( TRAIT_LIGHT_WEAKNESS ) male_clothes = /obj/item/clothing/under/vampire/slickback @@ -39,3 +39,8 @@ /datum/discipline/presence, /datum/discipline/serpentis ) + +/datum/subsplat/vampire_clan/setite/on_join_round(mob/living/carbon/human/joining) + . = ..() + joining.grant_language(/datum/language/arabic) +//We don't have Mesoamerican languages. diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/toreador.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/toreador.dm index 2172029569e0..3030135e459b 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/toreador.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/toreador.dm @@ -11,7 +11,7 @@ /datum/discipline/celerity, /datum/discipline/presence ) - clan_traits = list( + subsplat_traits = list( TRAIT_SENSITIVE_HUMANITY ) male_clothes = /obj/item/clothing/under/vampire/toreador diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/ventrue.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/ventrue.dm index ccff6123a40a..51f6195d8135 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/ventrue.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/ventrue.dm @@ -11,7 +11,7 @@ /datum/discipline/fortitude, /datum/discipline/presence ) - clan_traits = list( + subsplat_traits = list( TRAIT_FEEDING_RESTRICTION ) male_clothes = /obj/item/clothing/under/vampire/ventrue diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/warrior_salubri.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/warrior_salubri.dm index 380911b0355e..5159cf3664b9 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/warrior_salubri.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/warrior_salubri.dm @@ -9,7 +9,7 @@ /datum/discipline/fortitude, /datum/discipline/valeren ) - clan_traits = list() + subsplat_traits = list() male_clothes = /obj/item/clothing/under/vampire/salubri female_clothes = /obj/item/clothing/under/vampire/salubri/female enlightenment = FALSE diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/trusted_whitelist.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/trusted_whitelist.dm new file mode 100644 index 000000000000..08082f61d435 --- /dev/null +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/trusted_whitelist.dm @@ -0,0 +1,76 @@ +/datum/config_entry/keyed_list/whitelisted_clans //splats you can play as from the get go. + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + +/datum/config_entry/keyed_list/whitelisted_clans/ValidateListEntry(key_name, key_value) + for(var/clan_name in GLOB.vampire_clan_list) + var/datum/subsplat/vampire_clan/clan = get_vampire_clan(clan_name) + if(!clan) + continue + if(clan.id == key_name) + return TRUE + + log_config("ERROR: [key_name] is not a valid clan ID.") + return FALSE + + +// remember kids, you should always obtain enthusiastic informed values before proceeding +/datum/preference/choiced/subsplat/vampire_clan/create_informed_default_value(datum/preferences/preferences) + if(preferences && !preferences.has_whitelist(WHITELIST_TRUSTED)) + var/list/safe_choices = list() + for(var/choice in get_choices()) + var/datum/subsplat/vampire_clan/clan = get_vampire_clan(choice) + if(!clan || !(clan.id in CONFIG_GET(keyed_list/whitelisted_clans))) + safe_choices += choice + else if(preferences.has_whitelist(clan.id)) + safe_choices += choice + if(length(safe_choices)) + return pick(safe_choices) + return ..() + +/datum/preference/choiced/subsplat/vampire_clan/is_valid(value, datum/preferences/preferences) + if(preferences && !preferences.has_whitelist(WHITELIST_TRUSTED)) + var/datum/subsplat/vampire_clan/clan = get_vampire_clan(value) + if(clan?.id in CONFIG_GET(keyed_list/whitelisted_clans)) + if(!preferences.has_whitelist(clan.id)) + to_chat(preferences.parent, span_warning("The [clan.name] clan requires a special whitelisting process. Feel free to apply for it on Discord!")) + return FALSE + return ..() + +// helper procs to make absolutely sure unwhitelisted people cannot join with whitelisted splats +// useful in-case a regime member removes a trusted player from the whitelist +// so they cant continue to play on the trusted character with that clan selected +/proc/get_restricted_clan(mob/dead/new_player/new_player) + var/client/C = new_player.client + if(!C?.prefs) + return null + if(C.prefs.has_whitelist(WHITELIST_TRUSTED)) + return null + + var/datum/preference/preference_entry = GLOB.preference_entries[/datum/preference/choiced/subsplat/vampire_clan] + if(preference_entry.is_accessible(C.prefs)) + return null + + var/selected = C.prefs.read_preference(/datum/preference/choiced/subsplat/vampire_clan) + var/datum/subsplat/vampire_clan/clan = get_vampire_clan(selected) + if(clan?.id in CONFIG_GET(keyed_list/whitelisted_clans)) + if(!C.prefs.has_whitelist(clan.id)) + return clan + return null + +/atom/movable/screen/lobby/button/ready/Click(location, control, params) + var/mob/dead/new_player/new_player = hud.mymob + if(new_player.ready == PLAYER_NOT_READY) + var/datum/subsplat/vampire_clan/clan = get_restricted_clan(new_player) + if(clan) + to_chat(new_player, span_warning("[clan.name] requires a special whitelisting process. Feel free to apply for it on Discord!")) + return + return ..() + +/atom/movable/screen/lobby/button/join/Click(location, control, params) + var/mob/dead/new_player/new_player = hud.mymob + var/datum/subsplat/vampire_clan/clan = get_restricted_clan(new_player) + if(clan) + to_chat(new_player, span_warning("[clan.name] requires a special whitelisting process. Feel free to apply for it on Discord!")) + return + return ..() diff --git a/modular_darkpack/modules/walls/code/walls.dm b/modular_darkpack/modules/walls/code/walls.dm index 1cc097f5847a..c81aaacd421e 100644 --- a/modular_darkpack/modules/walls/code/walls.dm +++ b/modular_darkpack/modules/walls/code/walls.dm @@ -16,6 +16,9 @@ /obj/effect/wall_frill/Initialize(mapload) . = ..() + if(isnull(loc)) + . = INITIALIZE_HINT_QDEL + CRASH("[type] created in nullspace, this should not happen!") // Turfs don't really move, so we set the reset timer to an abstractly high number so we can enable and disable seethrough at will AddComponent(/datum/component/seethrough, SEE_THROUGH_MAP_WALLS, perimeter_reset_timer = 24 HOURS) update_seethrough() @@ -131,7 +134,10 @@ return if(!wall_frill) - wall_frill = new(get_step(src, NORTH)) + var/turf/north = get_step(src, NORTH) + if(isnull(north)) // edge of the map + return + wall_frill = new(north) wall_frill.icon = frill_icon wall_frill.name = name wall_frill.desc = desc diff --git a/modular_darkpack/modules/weapons/code/crafting_recipes.dm b/modular_darkpack/modules/weapons/code/crafting_recipes.dm index a2e8bb4f8cb0..496409e51417 100644 --- a/modular_darkpack/modules/weapons/code/crafting_recipes.dm +++ b/modular_darkpack/modules/weapons/code/crafting_recipes.dm @@ -4,3 +4,10 @@ reqs = list(/obj/item/stack/sheet/mineral/wood = 2) result = /obj/item/vampire_stake category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/molotov + name = "Molotov" + time = 50 + reqs = list(/obj/item/reagent_containers/cup/glass/bottle/beer/vampire = 1, /obj/item/stack/sheet/cloth = 1, /obj/item/gas_can = 1) + result = /obj/item/molotov + category = CAT_WEAPON_RANGED diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/corvid/_bird.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/corvid/_bird.dm index e650f726d3a4..b2e9f21636ca 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/corvid/_bird.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/corvid/_bird.dm @@ -64,11 +64,14 @@ /mob/living/basic/corvid/update_overlays() . = ..() - var/mutable_appearance/eyes_overlay = mutable_appearance(icon, "eyes[HAS_TRAIT(src, TRAIT_MOVE_FLYING) ? "_flying" : ""]") - SET_PLANE(eyes_overlay, ABOVE_LIGHTING_PLANE, src) + /* + var/mutable_appearance/eyes_overlay = mutable_appearance(icon, "eyes[HAS_TRAIT(src, TRAIT_MOVE_FLYING) ? "_flying" : ""]", -EYES_LAYER, src) eyes_overlay.color = sprite_eye_color - // eyes_overlay.layer = ABOVE_LIGHTING_LAYER . += eyes_overlay + */ + + var/mutable_appearance/emissive_overlay = emissive_appearance(icon, "eyes[HAS_TRAIT(src, TRAIT_MOVE_FLYING) ? "_flying" : ""]", src, effect_type = EMISSIVE_SPECULAR) + . += emissive_overlay /datum/action/innate/togglecorvidflight // this action handles corvid forms toggle their flight, and swaps their sprite to be of the relevant type. name = "Toggle Flight" diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/caern/bawn.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/caern/bawn.dm new file mode 100644 index 000000000000..4511d0cca9d7 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/caern/bawn.dm @@ -0,0 +1,124 @@ +// A bawn is the border around a caern. +/obj/effect/realistic_fog/bawn + name = "dizzying fog" + alpha_lower = 20 + alpha_upper = 80 + var/linked_totem_path + var/obj/structure/werewolf_totem/linked_totem + +/obj/effect/realistic_fog/bawn/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(check_allow_through), + ) + AddElement(/datum/element/connect_loc, loc_connections) + return INITIALIZE_HINT_LATELOAD + +/obj/effect/realistic_fog/bawn/LateInitialize() + for(var/obj/structure/werewolf_totem/totem in GLOB.totems) + if(istype(linked_totem, linked_totem_path)) + linked_totem = totem + RegisterSignal(totem, COMSIG_QDELETING, PROC_REF(on_totem_death)) + break + +/obj/effect/realistic_fog/bawn/proc/check_allow_through(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) + SIGNAL_HANDLER + + if(!allow_pass(arrived)) + linked_totem.kick_out(arrived) + +/obj/effect/realistic_fog/bawn/proc/allow_pass(atom/movable/mover) + if(!isliving(mover)) + return TRUE + + if(is_friend_of_caern(mover)) + return TRUE + + for(var/mob/living/friend in range(3, mover)) + if(is_friend_of_caern(friend)) + return TRUE + + return FALSE + +/obj/effect/realistic_fog/bawn/proc/is_friend_of_caern(mob/living/potential_friend) + if(linked_totem) + return linked_totem.is_friend_of_totem(potential_friend) + + return TRUE + +/obj/effect/realistic_fog/bawn/gaia + linked_totem_path = /obj/structure/werewolf_totem/generic/gaia + +/obj/effect/realistic_fog/bawn/children_of_gaia + linked_totem_path = /obj/structure/werewolf_totem/children_of_gaia + +/obj/effect/realistic_fog/bawn/proc/on_totem_death(atom/source) + SIGNAL_HANDLER + + qdel(src) + + +/// Area component that makes all movement inside get tracked by motion sensitive cameras +/datum/component/bawn_area + dupe_mode = COMPONENT_DUPE_UNIQUE // Only one area will ever exist, so only one component will ever exist + + var/obj/structure/werewolf_totem/linked_totem + +/datum/component/bawn_area/Initialize(linked_totem_path) + // By the way, this component should be added in LateInitialize(). + if(!isarea(parent)) + return COMPONENT_INCOMPATIBLE + + for(var/obj/structure/werewolf_totem/totem in GLOB.totems) + if(istype(totem, linked_totem_path)) + linked_totem = totem + RegisterSignal(totem, COMSIG_QDELETING, PROC_REF(on_totem_death)) + break + + if(!linked_totem) + return COMPONENT_INCOMPATIBLE + +/datum/component/bawn_area/RegisterWithParent() + RegisterSignal(parent, COMSIG_AREA_ENTERED, PROC_REF(on_entered)) + +/datum/component/bawn_area/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_AREA_ENTERED) + +/datum/component/bawn_area/proc/on_entered(area/_source, atom/movable/gain, area/_old_area) + SIGNAL_HANDLER + + if(!allow_pass(gain)) + linked_totem.kick_out(gain) + +/datum/component/bawn_area/proc/on_totem_death(atom/source) + SIGNAL_HANDLER + qdel(src) + +/datum/component/bawn_area/proc/allow_pass(atom/movable/mover) + if(!isliving(mover)) + return TRUE + + if(is_friend_of_caern(mover)) + return TRUE + + for(var/mob/living/friend in range(3, mover)) + if(is_friend_of_caern(friend)) + return TRUE + + return FALSE + +/datum/component/bawn_area/proc/is_friend_of_caern(mob/living/potential_friend) + if(linked_totem) + return linked_totem.is_friend_of_totem(potential_friend) + + return TRUE + + +/obj/effect/landmark/bawn_entrance + var/linked_totem_path + +/obj/effect/landmark/bawn_entrance/gaia + linked_totem_path = /obj/structure/werewolf_totem/generic/gaia + +/obj/effect/landmark/bawn_entrance/gaia/children_of_gaia + linked_totem_path = /obj/structure/werewolf_totem/children_of_gaia diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/caern/totems.dm similarity index 73% rename from modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm rename to modular_darkpack/modules/werewolf_the_apocalypse/code/caern/totems.dm index 0844e4ddd124..a8861c11cdd2 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/caern/totems.dm @@ -16,7 +16,8 @@ light_power = 0.5 damage_deflection = 5 - var/tribes = list() + var/friendly_trait + var/friendly_tribes COOLDOWN_DECLARE(rage_notify_cd) @@ -28,8 +29,8 @@ . = ..() var/list/candidates = list() for(var/obj/effect/landmark/teleport_mark/T in GLOB.landmarks_list) - for(var/entry in T.tribes) - if(entry in tribes) + for(var/entry in T.friendly_tribes) + if(entry in friendly_tribes) candidates += T break @@ -110,27 +111,29 @@ if(damage_change < 0) if(broken) - to_chat(human, span_userdanger("YOUR TOTEM IS DESTROYED")) + to_chat(human, span_userdanger("A TOTEM'S SPIRIT WEEPS IN PAIN AS IT'S TOTEM SHATTERS.")) SEND_SOUND(human, sound('sound/effects/tendril_destroyed.ogg', volume = 50)) - shifter_splat.adjust_gnosis(-5, FALSE) + shifter_splat.adjust_rage(3, FALSE) else - to_chat(human, span_userdanger("YOUR TOTEM IS BREAKING DOWN")) + to_chat(human, span_userdanger("A TOTEM's CRY CAN BE HEARD ACROSS THE CITY.")) SEND_SOUND(human, sound('modular_darkpack/modules/werewolf_the_apocalypse/sounds/bumps.ogg', volume = 50)) shifter_splat.adjust_rage(1, FALSE) else - to_chat(human, span_boldnotice("YOUR TOTEM IS RESTORED")) + to_chat(human, span_boldnotice("A TOTEM'S SPIRIT THANKS ITS ALLIES.")) SEND_SOUND(human, sound('modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/inspire.ogg', volume = 50)) shifter_splat.adjust_gnosis(1, FALSE) /// Returns true or false wether or not the totems benificial affects will target this mob /obj/structure/werewolf_totem/proc/is_friend_of_totem(mob/living/potential_friend) - var/datum/splat/werewolf/friends_splat = get_werewolf_splat(potential_friend) - if(!friends_splat) // RN the only totem effect relys on a werewolf splat - return FALSE - if(!friends_splat.tribe) // Dont fuck over tribeless fera. Prob need a better way to determine freinds tho + if(friendly_trait && HAS_TRAIT(potential_friend, friendly_trait)) return TRUE - if(!(friends_splat.tribe.name in tribes)) - return FALSE + + if(friendly_tribes) + var/datum/splat/werewolf/friends_splat = get_werewolf_splat(potential_friend) + if(!friends_splat) // RN the only totem effect relys on a werewolf splat + return FALSE + if(!(friends_splat.tribe?.name in friendly_tribes)) // APOC EDIT CHANGE - (I should really upstream this.) + return FALSE return TRUE @@ -147,16 +150,16 @@ return var/obj/umbra_portal/prev = locate() in get_step(src, SOUTH) if(!prev) - if(shifter_splat.auspice?.name == AUSPICE_THEURGE) + if(HAS_TRAIT(user, TRAIT_OPENS_MOONGATES)) if(!opening) opening = TRUE if(do_after(user, 10 SECONDS, src)) spawn_portal() opening = FALSE else - to_chat(user, span_warning("You need a Theurge to open the Moon Gates!")) + to_chat(user, span_warning("You need someone who can open the Moon Gates!")) else - if(shifter_splat.auspice?.name == AUSPICE_THEURGE) + if(HAS_TRAIT(user, TRAIT_OPENS_MOONGATES)) collapse_portal(prev) /obj/structure/werewolf_totem/proc/spawn_portal() @@ -166,7 +169,9 @@ playsound(src, 'modular_darkpack/modules/deprecated/sounds/portal.ogg', 50, FALSE) var/obj/umbra_portal/U = new (get_step(src, SOUTH)) // New code doesnt relay on ID for these two's connections buy why not. - U.id = "[pick(tribes)][rand(1, 999)]" + U.id = "[rand(1, 999)]" + if(length(friendly_tribes)) + U.id += "[pick(friendly_tribes)]" var/obj/umbra_portal/P = new (teleport_turf) P.id = U.id U.link_portal(P) @@ -176,27 +181,41 @@ qdel(old_portal.exit) qdel(old_portal) +/obj/structure/werewolf_totem/proc/kick_out(mob/living/stinky_guy) + if(!istype(stinky_guy)) + return + + stinky_guy.set_confusion_if_lower(10 SECONDS) + stinky_guy.set_eye_blur_if_lower(30 SECONDS) + to_chat(stinky_guy, span_boldwarning("You get turned around and mixed up in a strange fog.")) + for(var/obj/effect/landmark/bawn_entrance/landmark in GLOB.landmarks_list) + if(!istype(src, landmark.linked_totem_path)) + continue + var/turf/kickout_turf = get_turf(landmark) + stinky_guy.forceMove(kickout_turf) + break + /obj/structure/werewolf_totem/wendigo name = "\improper " + TRIBE_GALESTALKERS + " totem" - tribes = list(TRIBE_GALESTALKERS) + friendly_tribes = list(TRIBE_GALESTALKERS) light_color = "#81ff4f" /obj/structure/werewolf_totem/children_of_gaia name = "\improper " + TRIBE_CHILDREN_OF_GAIA + " totem" - tribes = list(TRIBE_CHILDREN_OF_GAIA) + friendly_tribes = list(TRIBE_CHILDREN_OF_GAIA) light_color = "#00CEC8" /obj/structure/werewolf_totem/bone_gnawer name = "\improper " + TRIBE_BONE_GNAWERS + " totem" light_color = "#FFA500" - tribes = list(TRIBE_BONE_GNAWERS) + friendly_tribes = list(TRIBE_BONE_GNAWERS) /obj/structure/werewolf_totem/glasswalker name = "\improper " + TRIBE_GLASS_WALKERS + " totem" icon_state = "glassw" base_icon_state = "glassw" light_color = "#35b0ff" - tribes = list(TRIBE_GLASS_WALKERS) + friendly_tribes = list(TRIBE_GLASS_WALKERS) /obj/structure/werewolf_totem/spiral name = "spiral totem" @@ -204,51 +223,54 @@ icon_state = "spiral" base_icon_state = "spiral" light_color = "#ff5235" - tribes = list(TRIBE_BLACK_SPIRAL_DANCERS) - + friendly_tribes = list(TRIBE_BLACK_SPIRAL_DANCERS) /obj/structure/werewolf_totem/generic + abstract_type = /obj/structure/werewolf_totem/generic + +/obj/structure/werewolf_totem/generic/gaia light_color = "#81ff4f" - tribes = TRIBE_LIST_GAIA + friendly_tribes = TRIBE_LIST_GAIA + friendly_trait = TRAIT_GAIA_CAERN_FRIEND /obj/structure/werewolf_totem/generic/wyld light_color = "#81ff4f" - tribes = TRIBE_LIST_WYLD + friendly_tribes = TRIBE_LIST_WYLD /obj/structure/werewolf_totem/generic/weaver icon_state = "glassw" base_icon_state = "glassw" light_color = "#35b0ff" - tribes = TRIBE_LIST_WEAVER + friendly_tribes = TRIBE_LIST_WEAVER /obj/structure/werewolf_totem/generic/wyrm icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/spiral_totem.dmi' icon_state = "spiral" base_icon_state = "spiral" light_color = "#ff5235" - tribes = TRIBE_LIST_WYRM + friendly_tribes = TRIBE_LIST_WYRM /obj/structure/werewolf_totem/generic/alltribes - tribes = TRIBE_LIST_ALL + friendly_tribes = TRIBE_LIST_ALL // This things type path sucks /obj/effect/landmark/teleport_mark name = "totem Exit Mark" icon_state = "portal_exit" - var/tribes = list() + var/friendly_tribes /obj/effect/landmark/teleport_mark/gaia - tribes = TRIBE_LIST_GAIA + friendly_tribes = TRIBE_LIST_GAIA /obj/effect/landmark/teleport_mark/wyld - tribes = TRIBE_LIST_WYLD + friendly_tribes = TRIBE_LIST_WYLD /obj/effect/landmark/teleport_mark/weaver - tribes = TRIBE_LIST_WEAVER + friendly_tribes = TRIBE_LIST_WEAVER /obj/effect/landmark/teleport_mark/wyrm - tribes = TRIBE_LIST_WYRM + friendly_tribes = TRIBE_LIST_WYRM /obj/effect/landmark/teleport_mark/alltribes - tribes = TRIBE_LIST_ALL + friendly_tribes = TRIBE_LIST_ALL diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/changing_breeds/corax.dm similarity index 100% rename from modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm rename to modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/changing_breeds/corax.dm diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/_customization.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/_customization.dm new file mode 100644 index 000000000000..fbfa42644bfb --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/_customization.dm @@ -0,0 +1,26 @@ +/datum/preference/choiced/fera_feature + abstract_type = /datum/preference/choiced/fera_feature + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES + priority = PREFERENCE_PRIORITY_WORLD_OF_DARKNESS + // must_have_relevant_trait = TRUE + must_be_accessible = TRUE + var/feature_key + var/splat_id + +/datum/preference/choiced/fera_feature/init_possible_values() + return assoc_to_keys_features(SSaccessories.feature_list[feature_key]) + + +/datum/preference/choiced/fera_feature/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features[feature_key] = value + +/datum/preference/choiced/fera_feature/is_accessible(datum/preferences/preferences) + . = ..() + var/datum/splat/splat_path = preferences.read_preference(/datum/preference/choiced/splats) + if(!ispath(splat_path) || splat_path::id != splat_id) + return FALSE + + +/datum/sprite_accessory/fera_feature + abstract_type = /datum/sprite_accessory/fera_feature diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/fera_body.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/fera_body.dm new file mode 100644 index 000000000000..d99e9337dd41 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/fera_body.dm @@ -0,0 +1,52 @@ +/datum/sprite_accessory/fera_feature/body + abstract_type = /datum/sprite_accessory/fera_feature/body + + + +/datum/preference/choiced/fera_feature/garou_body + savefile_key = "garou_body" + feature_key = FEATURE_FERA_BODY(SPLAT_GAROU) + splat_id = SPLAT_GAROU + + +/datum/sprite_accessory/fera_feature/body/garou + abstract_type = /datum/sprite_accessory/fera_feature/body/garou + +/datum/sprite_accessory/fera_feature/body/garou/scar_1 + name = "Right Eye Scar" + icon_state = "scar1" + +/datum/sprite_accessory/fera_feature/body/garou/scar_2 + name = "Left Eye Scar" + icon_state = "scar2" + +/datum/sprite_accessory/fera_feature/body/garou/scar_3 + name = "Nose Scar" + icon_state = "scar3" + +/datum/sprite_accessory/fera_feature/body/garou/scar_4 + name = "Chest Scar" + icon_state = "scar4" + +/datum/sprite_accessory/fera_feature/body/garou/scar_5 + name = "Leg Scar" + icon_state = "scar5" + +/datum/sprite_accessory/fera_feature/body/garou/scar_6 + name = "Head Scar" + icon_state = "scar6" + +/datum/sprite_accessory/fera_feature/body/garou/scar_7 + name = "Shoulder Scar" + icon_state = "scar7" + +/datum/sprite_accessory/fera_feature/body/garou/scar_8 + name = "Right Artificial Arm" + icon_state = "scar8" + +/datum/sprite_accessory/fera_feature/body/garou/scar_9 + name = "Left Artificial Arm" + icon_state = "scar9" + +/datum/dna_block/feature/accessory/garou_body + feature_key = FEATURE_FERA_BODY(SPLAT_GAROU) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/fera_clothes.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/fera_clothes.dm new file mode 100644 index 000000000000..02f7c86b3dd0 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/fera_clothes.dm @@ -0,0 +1,76 @@ +/datum/sprite_accessory/fera_feature/clothes + abstract_type = /datum/sprite_accessory/fera_feature/clothes + + + +/datum/preference/choiced/fera_feature/garou_clothes + savefile_key = "garou_clothes" + feature_key = FEATURE_FERA_CLOTHES(SPLAT_GAROU) + splat_id = SPLAT_GAROU + + +/datum/sprite_accessory/fera_feature/clothes/garou + abstract_type = /datum/sprite_accessory/fera_feature/clothes/garou + +/datum/sprite_accessory/fera_feature/clothes/garou/loincloth + name = "Loincloth" + icon_state = "loincloth" + +/datum/sprite_accessory/fera_feature/clothes/garou/green_tribal + name = "Green Tribal Accessories" + icon_state = "green_tribal" + +/datum/sprite_accessory/fera_feature/clothes/garou/beige_tribal + name = "Beige Tribal Accessories" + icon_state = "beige_tribal" + +/datum/sprite_accessory/fera_feature/clothes/garou/leather_mantle + name = "Leather Mantle" + icon_state = "leather_mantle" + +/datum/sprite_accessory/fera_feature/clothes/garou/studs + name = "Studs" + icon_state = "studs" + +/datum/sprite_accessory/fera_feature/clothes/garou/dark_mantle + name = "Dark Mantle" + icon_state = "dark_mantle" + +/datum/sprite_accessory/fera_feature/clothes/garou/loincloth_armband + name = "Loincloth & Armband" + icon_state = "loincloth_armband" + +/datum/sprite_accessory/fera_feature/clothes/garou/skull_necklace + name = "Skull Necklace" + icon_state = "skull_necklace" + +/datum/sprite_accessory/fera_feature/clothes/garou/metal_armour // yuck br*tish + name = "Metal Armor" // Fixed it teehee + icon_state = "metal_armour" // Vile disgusting spelling + +/datum/sprite_accessory/fera_feature/clothes/garou/fur_mantle + name = "Fur Mantle" + icon_state = "fur_mantle" + +/datum/sprite_accessory/fera_feature/clothes/garou/fur_necklace_and_vambrace + name = "Fur Necklace & Vambraces" + icon_state = "fur_necklace_and_vambrace" + +/datum/sprite_accessory/fera_feature/clothes/garou/armour_loincloth // yuck br*tish again... + name = "Armor & Loincloth" // Fixed it lalalala + icon_state = "armour_loincloth" + +/datum/sprite_accessory/fera_feature/clothes/garou/red_cloak // litle red riding hood + name = "Red Cloak" + icon_state = "red_cloak" + +/datum/sprite_accessory/fera_feature/clothes/garou/formal_tribal + name = "Formal Tribal Attire" + icon_state = "formal_tribal" + +/datum/sprite_accessory/fera_feature/clothes/garou/dollar_necklace + name = "$$$ Bling" + icon_state = "dollar_necklace" + +/datum/dna_block/feature/accessory/garou_clothes + feature_key = FEATURE_FERA_CLOTHES(SPLAT_GAROU) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/fera_hair.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/fera_hair.dm new file mode 100644 index 000000000000..472d77946158 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/fera_hair.dm @@ -0,0 +1,33 @@ + +/datum/sprite_accessory/fera_feature/hair + abstract_type = /datum/sprite_accessory/fera_feature/hair + + + +/datum/preference/choiced/fera_feature/garou_hair + savefile_key = "garou_hair" + feature_key = FEATURE_FERA_HAIR(SPLAT_GAROU) + splat_id = SPLAT_GAROU + + +/datum/sprite_accessory/fera_feature/hair/garou + abstract_type = /datum/sprite_accessory/fera_feature/hair/garou + +/datum/sprite_accessory/fera_feature/hair/garou/hair_1 + name = "Mohawk" + icon_state = "hair1" + +/datum/sprite_accessory/fera_feature/hair/garou/hair_2 + name = "Long" + icon_state = "hair2" + +/datum/sprite_accessory/fera_feature/hair/garou/hair_3 + name = "Undercut" + icon_state = "hair3" + +/datum/sprite_accessory/fera_feature/hair/garou/hair_4 + name = "Beard" + icon_state = "hair4" + +/datum/dna_block/feature/accessory/garou_hair + feature_key = FEATURE_FERA_HAIR(SPLAT_GAROU) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/fur.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/fur_color.dm similarity index 73% rename from modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/fur.dm rename to modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/fur_color.dm index 88ddb49c6672..2c611855d712 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/fur.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/customization/fur_color.dm @@ -1,17 +1,19 @@ /datum/preference/choiced/fera_fur_color - abstract_type = /datum/preference/choiced/fera_fur_color - savefile_key = "fur_color" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES priority = PREFERENCE_PRIORITY_WORLD_OF_DARKNESS - main_feature_name = "Fera Fur Color" - relevant_inherent_trait = TRAIT_FERA_FUR must_have_relevant_trait = TRUE must_be_accessible = TRUE + + abstract_type = /datum/preference/choiced/fera_fur_color + savefile_key = "fur_color" + + main_feature_name = "Fera Fur Color" + relevant_inherent_trait = TRAIT_FERA_FUR var/splat_id -/datum/preference/choiced/fera_fur_color/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) - target.dna.features[FEATURE_FUR_COLOR] = value +/datum/preference/choiced/fera_fur_color/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features[FEATURE_FERA_FUR_COLOR] = value /datum/preference/choiced/fera_fur_color/is_accessible(datum/preferences/preferences) . = ..() @@ -19,17 +21,19 @@ if(!ispath(splat_path) || splat_path::id != splat_id) return FALSE +/datum/preference/choiced/fera_fur_color/init_possible_values() + return assoc_to_keys(GLOB.fera_fur_colors[splat_id]) + /datum/preference/choiced/fera_fur_color/garou savefile_key = "garou_fur_color" splat_id = SPLAT_GAROU -/datum/preference/choiced/fera_fur_color/garou/init_possible_values() - return assoc_to_keys(GLOB.garou_fur_colors) /datum/preference/choiced/fera_fur_color/corax savefile_key = "corax_fur_color" splat_id = SPLAT_CORAX -/datum/preference/choiced/fera_fur_color/corax/init_possible_values() - return assoc_to_keys(GLOB.corax_fur_colors) + +/datum/dna_block/feature/fera_fur_color + feature_key = FEATURE_FERA_FUR_COLOR diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm index 90ed73d3c5c8..095b2f1872a1 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm @@ -71,11 +71,20 @@ if(shifter_splat?.transformation_stats && shifter_splat.transformation_stats[id]) return shifter_splat.transformation_stats[id] +/datum/species/human/shifter/proc/get_stat_clamps(mob/living/carbon/human/human) + var/datum/splat/werewolf/shifter/shifter_splat = get_shifter_splat(human) + if(shifter_splat?.transformation_stat_clamps && shifter_splat.transformation_stat_clamps[id]) + return shifter_splat.transformation_stat_clamps[id] + /datum/species/human/shifter/proc/add_buffs(mob/living/carbon/human/human) for(var/key, value in get_buffs(human)) if(!should_add_buff(human, key, value)) continue human.st_add_stat_mod(key, value, type) + for(var/key, value in get_stat_clamps(human)) + if(!should_add_buff(human, key, value)) + continue + human.st_add_stat_clamp(key, value, type) /datum/species/human/shifter/proc/should_add_buff(mob/living/carbon/human/human, datum/st_stat/buff_type, amount) return TRUE @@ -83,13 +92,28 @@ /datum/species/human/shifter/proc/clear_buffs(mob/living/carbon/human/human) for(var/key, value in get_buffs(human)) human.st_remove_stat_mod(key, type) + for(var/key, value in get_stat_clamps(human)) + human.st_remove_stat_clamp(key, type) /datum/species/human/shifter/proc/is_veil_breaching_form(mob/living/carbon/human/human) return veil_breaching_form /// Fetch the mobs fur color from their features. /datum/species/human/shifter/proc/get_fur_color(mob/living/carbon/human/human) - return human.dna.features[FEATURE_FUR_COLOR] ? human.dna.features[FEATURE_FUR_COLOR] : "black" + return human.dna.features[FEATURE_FERA_FUR_COLOR] || "black" + + +/datum/species/human/shifter/proc/get_feature_icon_state(mob/living/carbon/human/human, feature_key) + var/feature_dna = human.dna.features[feature_key] + if(!feature_dna) + return + var/alist/splat_feature_styles = SSaccessories.feature_list[feature_key] + if(!splat_feature_styles) + return + var/datum/sprite_accessory/feature_sprite_datum = splat_feature_styles[feature_dna] + if(!feature_sprite_datum) + return + return feature_sprite_datum::icon_state /// Fetch the mob dmi from our splat @@ -105,26 +129,65 @@ if(!custom_body_render) return FALSE - human.remove_overlay(BODYPARTS_LAYER) + var/datum/splat/werewolf/shifter/shifter_splat = get_shifter_splat(human) + var/splat_id = shifter_splat?.id || SPLAT_GAROU var/fur_color = get_fur_color(human) var/mob_icon = get_mob_icon(human) - var/main_iconstate = "" + var/postfix_info = "" + + human.remove_overlay(BODYPARTS_LAYER) + var/main_icon_state = "" if(HAS_TRAIT(human, TRAIT_WYRMTAINTED_SPRITE)) - main_iconstate += "spiral" - main_iconstate += fur_color - if(has_flight_icon_states && HAS_TRAIT(human, TRAIT_FERA_FLIGHT) && HAS_TRAIT(human, TRAIT_MOVE_FLYING) && HAS_TRAIT(human, TRAIT_NO_FLOATING_ANIM)) - main_iconstate += "_flying" + main_icon_state += "spiral" + main_icon_state += fur_color + if(should_append_flying_to_icon(human)) + postfix_info += "_flying" else if(human.body_position == LYING_DOWN) - main_iconstate += "_rest" - - human.overlays_standing[BODYPARTS_LAYER] = list(image(mob_icon, main_iconstate)) + postfix_info += "_rest" + human.overlays_standing[BODYPARTS_LAYER] = list(image(mob_icon, icon_state = main_icon_state + postfix_info, layer = -BODYPARTS_LAYER)) human.apply_overlay(BODYPARTS_LAYER) + + human.remove_overlay(EYES_LAYER) + var/mutable_appearance/eyes_overlay = mutable_appearance(mob_icon, "eyes" + postfix_info, -EYES_LAYER) + eyes_overlay.color = human.eye_color_left + var/mutable_appearance/emissive_overlay = emissive_appearance(mob_icon, "eyes" + postfix_info, human, effect_type = EMISSIVE_SPECULAR) + emissive_overlay.color = COLOR_WHITE + human.overlays_standing[EYES_LAYER] = list(eyes_overlay, emissive_overlay) + human.apply_overlay(EYES_LAYER) + + + human.remove_overlay(BODY_ADJ_LAYER) + var/body_icon_state = get_feature_icon_state(human, FEATURE_FERA_BODY(splat_id)) + if(body_icon_state) + var/mutable_appearance/body_image = mutable_appearance(mob_icon, body_icon_state + postfix_info, -BODY_ADJ_LAYER) + human.overlays_standing[BODY_ADJ_LAYER] = list(body_image) + human.apply_overlay(BODY_ADJ_LAYER) + + human.remove_overlay(HAIR_LAYER) + var/hair_icon_state = get_feature_icon_state(human, FEATURE_FERA_HAIR(splat_id)) + if(hair_icon_state) + var/mutable_appearance/hair_layer = mutable_appearance(mob_icon, hair_icon_state + postfix_info, -HAIR_LAYER) + hair_layer.color = human.hair_color + human.overlays_standing[HAIR_LAYER] = list(hair_layer) + human.apply_overlay(HAIR_LAYER) + + + human.remove_overlay(UNIFORM_LAYER) + var/uniform_icon_state = get_feature_icon_state(human, FEATURE_FERA_CLOTHES(splat_id)) + if(uniform_icon_state) + var/mutable_appearance/outfit_layer = mutable_appearance(mob_icon, uniform_icon_state + postfix_info, -UNIFORM_LAYER) + human.overlays_standing[UNIFORM_LAYER] = list(outfit_layer) + human.apply_overlay(UNIFORM_LAYER) + return TRUE +/datum/species/human/shifter/proc/should_append_flying_to_icon(mob/living/carbon/human/human) + return has_flight_icon_states && HAS_TRAIT(human, TRAIT_FERA_FLIGHT) && HAS_TRAIT(human, TRAIT_MOVE_FLYING) && HAS_TRAIT(human, TRAIT_NO_FLOATING_ANIM) + /datum/species/human/shifter/update_damage_overlays(mob/living/carbon/human/human) if(!custom_damage_render) return FALSE diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm index 4685c8a89eb6..9a90ffe4d63a 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm @@ -79,6 +79,7 @@ splat_traits = list( TRAIT_FERA_RENOWN, + TRAIT_GAIA_CAERN_FRIEND, // Without them having there own tribes or declared alligence. This is the best way to determine. ) // incompatible_splats = list(/datum/splat/werewolf/shifter) // TODO: Becoming a shifter should get rid of your kinfolk splat @@ -105,6 +106,7 @@ var/list/transformation_list = list() /// Stats added and removed upon gaining the species of the splat. Assoc list indexed by the species ids for each form var/list/transformation_stats + var/list/transformation_stat_clamps var/transform_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/transform.ogg' COOLDOWN_DECLARE(transform_cd) /** @@ -224,7 +226,6 @@ STAT_STAMINA = 3, STAT_DEXTERITY = 1, STAT_MANIPULATION = -3, - // STAT_APPEARANCE = 0 // NOT YET SUPPORTED ), SPECIES_FERA_DIRE = list( STAT_STRENGTH = 3, @@ -239,6 +240,11 @@ STAT_MANIPULATION = -3, ) ) + transformation_stat_clamps = list( + SPECIES_FERA_WAR = list( + STAT_APPEARANCE = 0 + ), + ) mimmicing_animal = /mob/living/basic/pet/dog/wolf /datum/splat/werewolf/shifter/corax @@ -265,7 +271,6 @@ STAT_DEXTERITY = 1, STAT_MANIPULATION = -2, STAT_PERCEPTION = 3, - // STAT_APPEARANCE = 0 // NOT YET SUPPORTED ), SPECIES_FERA_FERAL = list( STAT_STRENGTH = -1, @@ -274,6 +279,11 @@ STAT_PERCEPTION = 4, ) ) + transformation_stat_clamps = list( + SPECIES_FERA_WAR = list( + STAT_APPEARANCE = 0 + ), + ) transform_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/corax_transform.ogg' mob_icons = list( SPECIES_FERA_WAR = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/corax_forms/crinos.dmi', diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm index e43fa49cdae7..6e4d1cc3bc5c 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm @@ -91,6 +91,7 @@ /datum/subsplat/werewolf/auspice/garou/theurge name = AUSPICE_THEURGE desc = "The Crescent Moons can be strange and enigmatic, prone to falling into the convoluted symbolic logic of the spirits they truck with rather than the more familiar logic of humanity. Those Theurges born under the waning moon frequently have a harsher, more adversarial relationship with the spirit world - they tend to excel at binding and forcing spirits to their will, and are more vicious when battling spirits. Theurges born under the waxing moon tend to be more generous and open with the spirits, charming and cajoling rather than intimidating and threatening." + subsplat_traits = list(TRAIT_OPENS_MOONGATES) start_rage = 2 gifts_provided = list( /datum/action/cooldown/power/gift/mothers_touch, diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm index 02f75b986c38..2af705e6e7c7 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm @@ -116,7 +116,7 @@ // /datum/action/cooldown/power/gift/resist_pain, // DARKPACK TODO - (Selectable Gifts) // /datum/action/cooldown/power/gift/sense_wyrm, // DARKPACK TODO - (Selectable Gifts) ) - // tribe_trait = TRAIT_WYRMTAINTED_SPRITE + subsplat_traits = list(TRAIT_WYRMTAINTED) /datum/subsplat/werewolf/tribe/garou/blackspiraldancers/psychomania_effect(mob/living/target, mob/living/owner) target.playsound_local(target, "modular_darkpack/modules/powers/sounds/daimonion_laughs/demonlaugh3.ogg", 50, FALSE) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/crinos.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/crinos.dmi index 9debf63f88ee..d75326bde329 100644 Binary files a/modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/crinos.dmi and b/modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/crinos.dmi differ diff --git a/modular_darkpack/modules/whitelist/code/whitelist_enforcement.dm b/modular_darkpack/modules/whitelist/code/whitelist_enforcement.dm new file mode 100644 index 000000000000..e0318f6227ff --- /dev/null +++ b/modular_darkpack/modules/whitelist/code/whitelist_enforcement.dm @@ -0,0 +1,42 @@ +/mob/dead/new_player/proc/get_restricted_splat_name() + var/client/C = client + if(!C?.prefs) + return null + var/splat_path = C.prefs.read_preference(/datum/preference/choiced/splats) + if(!ispath(splat_path, /datum/splat)) + if(!C.prefs.has_whitelist(SPLAT_NONE)) + return "Human" + return null + var/datum/splat/splat = GLOB.splat_prototypes[splat_path] + if(!splat) + return null + if(!isnull(splat.id) && !C.prefs.has_whitelist(splat.id)) + return splat.name + return null + +/atom/movable/screen/lobby/button/ready/Click(location, control, params) + var/mob/dead/new_player/new_player = hud.mymob + if(new_player.ready == PLAYER_NOT_READY) + var/splat_name = new_player.get_restricted_splat_name() + if(splat_name) + to_chat(new_player, span_warning("[splat_name] requires a special whitelisting process. Feel free to apply for it on Discord!")) + return + return ..() + +/atom/movable/screen/lobby/button/join/Click(location, control, params) + var/mob/dead/new_player/new_player = hud.mymob + var/splat_name = new_player.get_restricted_splat_name() + if(splat_name) + to_chat(new_player, span_warning("[splat_name] requires a special whitelisting process. Feel free to apply for it on Discord!")) + return + return ..() + +/datum/preference/choiced/splats/is_valid(value, datum/preferences/preferences) + if(preferences) + var/splat_id = SPLAT_NONE + if(ispath(value, /datum/splat)) + var/datum/splat/splat = GLOB.splat_prototypes[value] + splat_id = splat?.id || SPLAT_NONE + if(!isnull(splat_id) && !preferences.has_whitelist(splat_id)) + return FALSE + return ..() diff --git a/modular_darkpack/modules/whitelist/code/whitelist_prefs.dm b/modular_darkpack/modules/whitelist/code/whitelist_prefs.dm new file mode 100644 index 000000000000..a54e9dfc0213 --- /dev/null +++ b/modular_darkpack/modules/whitelist/code/whitelist_prefs.dm @@ -0,0 +1,98 @@ +/datum/preferences + var/list/player_whitelists + +/// Assoc list of id by whitelist state. +/datum/preferences/proc/get_player_whitelists() + RETURN_TYPE(/alist) + if(isnull(player_whitelists)) + player_whitelists = get_default_player_whitelists().Copy() + return player_whitelists + + +/// returns a flat list of true entires. +/datum/preferences/proc/get_all_whitelisted_entries() + RETURN_TYPE(/list) + var/list/flat_list = list() + var/list/alist/pref_whitelist = get_player_whitelists() + for(var/key, bool in pref_whitelist) + if(bool) + flat_list += key + return flat_list + +/datum/preferences/proc/has_whitelist(whitelist_id) + return get_player_whitelists()[whitelist_id] + +/datum/preferences/proc/grant_whitelist(whitelist_id) + var/list/wl = get_player_whitelists() + if(wl[whitelist_id]) + return + wl[whitelist_id] = TRUE + if(whitelist_id == WHITELIST_TRUSTED) + discipline_trusted = TRUE + +/datum/preferences/proc/revoke_whitelist(whitelist_id) + if(whitelist_id == SPLAT_NONE) // as funny as it would be, this should probably be protected + return + var/list/wl = get_player_whitelists() + if(!wl[whitelist_id]) + return + wl[whitelist_id] = FALSE + if(whitelist_id == WHITELIST_TRUSTED) + discipline_trusted = FALSE + +/datum/preference_middleware/disciplines/get_ui_data(mob/user) + var/list/data = ..() + var/datum/preferences/prefs = user?.client?.prefs + var/list/player_wl + if(prefs) + player_wl = prefs.get_all_whitelisted_entries() + data["player_whitelists"] = player_wl ? player_wl.Copy() : list() + return data + +/datum/admin_preference_editor/proc/get_whitelist_definitions() + var/alist/defaults = get_default_player_whitelists() + var/list/defs = list() + + defs[SPLAT_NONE] = list( + "name" = "Human", + "description" = "Access to play as a human.", + "category" = "splat", + "is_default" = defaults[SPLAT_NONE], + ) + for(var/splat_id in get_selectable_splats()) + var/splat_type = GLOB.splat_list[splat_id] + var/datum/splat/splat = GLOB.splat_prototypes[splat_type] + + defs[splat_id] = list( + "name" = splat.name, + "description" = "Access to play as a [splat.name].", + "category" = "splat", + "is_default" = defaults[splat_id], + ) + + defs[WHITELIST_TRUSTED] = list( + "name" = "Trusted", + "description" = "Bypasses discipline sheet limits, and allows them to be a lower generation kindred.", + "category" = "access", + "is_default" = defaults[WHITELIST_TRUSTED], + ) + defs[WHITELIST_TIMELIMITS] = list( + "name" = "Bypass Time Requirements", + "description" = "Bypasses time requierments for jobs.", + "category" = "access", + "is_default" = defaults[WHITELIST_TIMELIMITS], + ) + + + for(var/clan_name in GLOB.vampire_clan_list) + var/datum/subsplat/vampire_clan/clan = get_vampire_clan(clan_name) + if(!clan) + continue + defs[clan.id] = list( + "name" = clan.name, + "description" = "Access to play [clan.name] without requiring trusted whitelist", + "category" = "clan", + "is_default" = defaults[clan.id] + ) + + return defs diff --git a/modular_zapoc/modules/jobs/code/voivode.dm b/modular_zapoc/modules/jobs/code/voivode.dm index 6aa21eed36e2..c42fa4380494 100644 --- a/modular_zapoc/modules/jobs/code/voivode.dm +++ b/modular_zapoc/modules/jobs/code/voivode.dm @@ -18,7 +18,13 @@ allowed_clans = list(VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_OLD_CLAN_TZIMISCE, VAMPIRE_CLAN_HEALER_SALUBRI, VAMPIRE_CLAN_WARRIOR_SALUBRI, VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY) description = "You belong to the Seer's Voivodate, a resurgance of the pre-existing California Voivodate. Above all you must respect the Hospitality, and the Voivodes." - known_contacts = list("Voivode", "Zadruga", "Bogatyr", "Bogatyr Captain") + + known_contacts = list( + JOB_VOIVODE, + JOB_BOGATYR_CAPTAIN, + JOB_BOGATYR, + JOB_ZADRUGA + ) /datum/outfit/job/vampire/voivodate_citizen name = JOB_VOIVODATE_CITIZEN @@ -44,7 +50,18 @@ description = "Captain of the Bogatyri, protectors of the Seer's Voivodate. You lead them in the protection of your family and the Voivode-in-Waiting who sleeps in the basement. Serve the Voivodes, and enforce the Hospitality on your family's lands." display_order = JOB_DISPLAY_ORDER_BOGATYR_CAPTAIN - known_contacts = list("Prince", "Baron", "Sheriff", "Emissary", "Seneschal", "Zadruga", "Bogatyr") + + known_contacts = list( + JOB_PRINCE, + JOB_BARON, + JOB_SHERIFF, + JOB_EMISSARY, + JOB_SENESCHAL, + JOB_VOIVODE, + JOB_BOGATYR, + JOB_ZADRUGA, + JOB_VOIVODATE_CITIZEN, + ) /datum/outfit/job/vampire/bogatyr/captain name = "Bogatyr Captain" diff --git a/sound/effects/license.txt b/sound/effects/license.txt index cf6d51c352d2..e82d2e28cdd1 100644 --- a/sound/effects/license.txt +++ b/sound/effects/license.txt @@ -23,3 +23,10 @@ https://freesound.org/people/rottako/sounds/693581/ by Rottako. https://freesound.org/people/rottako/sounds/693582/ by Rottako. Cleaned up and trimmed by ArcaneMusic. licensed as Creative Commons 0. + +node_drilling.ogg was made using: +https://freesound.org/people/jedg/sounds/505826/ -- License: Creative Commons 0 +Trimmed and effects added by ArcaneMusic. + +node_victory.ogg was made by ArcaneMusic +FL-studio, Flex Plugin. -- License: Creative Commons 0 diff --git a/sound/effects/node_drilling.ogg b/sound/effects/node_drilling.ogg new file mode 100644 index 000000000000..7eb2001101e4 Binary files /dev/null and b/sound/effects/node_drilling.ogg differ diff --git a/sound/effects/node_victory.ogg b/sound/effects/node_victory.ogg new file mode 100644 index 000000000000..e3c39f14d379 Binary files /dev/null and b/sound/effects/node_victory.ogg differ diff --git a/sound/misc/highlight_sounds/Beep.ogg b/sound/misc/highlight_sounds/Beep.ogg new file mode 100644 index 000000000000..8d9dc959cee8 Binary files /dev/null and b/sound/misc/highlight_sounds/Beep.ogg differ diff --git a/sound/misc/highlight_sounds/attributions.txt b/sound/misc/highlight_sounds/attributions.txt new file mode 100644 index 000000000000..26216febac96 --- /dev/null +++ b/sound/misc/highlight_sounds/attributions.txt @@ -0,0 +1 @@ +["Beep.ogg"], Sourced from "https://freesound.org/people/AnthonyRox/sounds/740420/", Copyright: "AnthonyRox", license: "CC0-1.0" diff --git a/tgstation.dme b/tgstation.dme index 3335b5e73014..4b1072f5948f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -480,6 +480,7 @@ #include "code\__DEFINES\~darkpack\subsystems.dm" #include "code\__DEFINES\~darkpack\vampire_clan.dm" #include "code\__DEFINES\~darkpack\walls.dm" +#include "code\__DEFINES\~darkpack\whitelist.dm" #include "code\__DEFINES\~darkpack\xp_and_freebie.dm" #include "code\__DEFINES\~darkpack\ai\ai_blackboard.dm" #include "code\__DEFINES\~darkpack\dcs\beastmaster_signals.dm" @@ -1364,6 +1365,7 @@ #include "code\datums\components\callouts.dm" #include "code\datums\components\caltrop.dm" #include "code\datums\components\can_flash_from_behind.dm" +#include "code\datums\components\candela_node.dm" #include "code\datums\components\chasm.dm" #include "code\datums\components\chuunibyou.dm" #include "code\datums\components\cleaner.dm" @@ -1822,6 +1824,7 @@ #include "code\datums\elements\elevation.dm" #include "code\datums\elements\empprotection.dm" #include "code\datums\elements\envenomable_casing.dm" +#include "code\datums\elements\equipment_bodypart_texture.dm" #include "code\datums\elements\examine_lore.dm" #include "code\datums\elements\eyestab.dm" #include "code\datums\elements\falling_hazard.dm" @@ -2212,6 +2215,7 @@ #include "code\datums\quirks\positive_quirks\chip_connector.dm" #include "code\datums\quirks\positive_quirks\chipped.dm" #include "code\datums\quirks\positive_quirks\clown_enjoyer.dm" +#include "code\datums\quirks\positive_quirks\death_mimicry.dm" #include "code\datums\quirks\positive_quirks\drunk_healing.dm" #include "code\datums\quirks\positive_quirks\empath.dm" #include "code\datums\quirks\positive_quirks\freerunning.dm" @@ -3298,8 +3302,10 @@ #include "code\game\objects\structures\gym\weight_machine_action.dm" #include "code\game\objects\structures\icemoon\cave_entrance.dm" #include "code\game\objects\structures\lavaland\geyser.dm" -#include "code\game\objects\structures\lavaland\gulag_vent.dm" -#include "code\game\objects\structures\lavaland\ore_vent.dm" +#include "code\game\objects\structures\lavaland\vent_mining\boss_vent.dm" +#include "code\game\objects\structures\lavaland\vent_mining\gulag_vent.dm" +#include "code\game\objects\structures\lavaland\vent_mining\ore_vent.dm" +#include "code\game\objects\structures\lavaland\vent_mining\vent_misc.dm" #include "code\game\objects\structures\plaques\_plaques.dm" #include "code\game\objects\structures\plaques\static_plaques.dm" #include "code\game\objects\structures\signboards\_signboard.dm" @@ -3613,6 +3619,7 @@ #include "code\modules\antagonists\blood_worm\blood_worm_tester.dm" #include "code\modules\antagonists\blood_worm\blood_worm_text_feedback.dm" #include "code\modules\antagonists\blood_worm\actions\_base_action.dm" +#include "code\modules\antagonists\blood_worm\actions\bloodworm_info.dm" #include "code\modules\antagonists\blood_worm\actions\cocoon.dm" #include "code\modules\antagonists\blood_worm\actions\inject_blood.dm" #include "code\modules\antagonists\blood_worm\actions\invade_corpse.dm" @@ -4320,6 +4327,7 @@ #include "code\modules\client\preferences\ghost.dm" #include "code\modules\client\preferences\ghost_lighting.dm" #include "code\modules\client\preferences\glasses.dm" +#include "code\modules\client\preferences\height.dm" #include "code\modules\client\preferences\hemiplegic.dm" #include "code\modules\client\preferences\heterochromatic.dm" #include "code\modules\client\preferences\hotkeys.dm" @@ -5346,6 +5354,8 @@ #include "code\modules\mining\equipment\survival_pod.dm" #include "code\modules\mining\equipment\vent_pointer.dm" #include "code\modules\mining\equipment\wormhole_jaunter.dm" +#include "code\modules\mining\equipment\candela_network\candela_beacons.dm" +#include "code\modules\mining\equipment\candela_network\candela_item_handler.dm" #include "code\modules\mining\equipment\kinetic_crusher\kinetic_crusher.dm" #include "code\modules\mining\equipment\kinetic_crusher\kinetic_crusher_trophies.dm" #include "code\modules\mining\equipment\kinetic_crusher\trophies_fauna.dm" @@ -6818,6 +6828,7 @@ #include "code\modules\surgery\bodyparts\bodypart_effects\nyxosynthesis.dm" #include "code\modules\surgery\bodyparts\bodypart_effects\photosynthesis.dm" #include "code\modules\surgery\bodyparts\bodypart_effects\plasma_based.dm" +#include "code\modules\surgery\bodyparts\bodypart_effects\slime_passgrille.dm" #include "code\modules\surgery\bodyparts\species_parts\android_parts.dm" #include "code\modules\surgery\bodyparts\species_parts\ethereal_bodyparts.dm" #include "code\modules\surgery\bodyparts\species_parts\ghost_bodyparts.dm" @@ -6867,7 +6878,6 @@ #include "code\modules\surgery\organs\external\restyling.dm" #include "code\modules\surgery\organs\external\spines.dm" #include "code\modules\surgery\organs\external\tails.dm" -#include "code\modules\surgery\organs\external\wings\functional_wings.dm" #include "code\modules\surgery\organs\external\wings\moth_wings.dm" #include "code\modules\surgery\organs\external\wings\wings.dm" #include "code\modules\surgery\organs\internal\appendix\_appendix.dm" @@ -7381,6 +7391,7 @@ #include "modular_darkpack\modules\areas\code\interiors\library.dm" #include "modular_darkpack\modules\areas\code\interiors\millennium_tower.dm" #include "modular_darkpack\modules\areas\code\interiors\sewers.dm" +#include "modular_darkpack\modules\areas\code\interiors\shops.dm" #include "modular_darkpack\modules\areas\code\outsides\__outside.dm" #include "modular_darkpack\modules\areas\code\outsides\city_outsides.dm" #include "modular_darkpack\modules\areas\code\outsides\forest.dm" @@ -7557,6 +7568,7 @@ #include "modular_darkpack\modules\flags\code\flags.dm" #include "modular_darkpack\modules\flags\code\loadout.dm" #include "modular_darkpack\modules\flags\code\pride_flags.dm" +#include "modular_darkpack\modules\flags\code\pride_pins.dm" #include "modular_darkpack\modules\flags\code\recipes.dm" #include "modular_darkpack\modules\flavor_text\code\config.dm" #include "modular_darkpack\modules\flavor_text\code\custom_examine_text.dm" @@ -7667,7 +7679,6 @@ #include "modular_darkpack\modules\languages\code\languages\english.dm" #include "modular_darkpack\modules\languages\code\languages\farsi.dm" #include "modular_darkpack\modules\languages\code\languages\french.dm" -#include "modular_darkpack\modules\languages\code\languages\garou_tongue.dm" #include "modular_darkpack\modules\languages\code\languages\german.dm" #include "modular_darkpack\modules\languages\code\languages\greek.dm" #include "modular_darkpack\modules\languages\code\languages\hebrew.dm" @@ -7732,6 +7743,7 @@ #include "modular_darkpack\modules\merits_flaws\code\config.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\amnesia.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\animal_musk.dm" +#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\anthropic_taste.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\bad_sight.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\banned_transformation.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\beacon_of_the_unholy.dm" @@ -7916,7 +7928,7 @@ #include "modular_darkpack\modules\pixel_shift\code\pixel_shift_component.dm" #include "modular_darkpack\modules\pixel_shift\code\pixel_shift_keybind.dm" #include "modular_darkpack\modules\postal\code\postal.dm" -#include "modular_darkpack\modules\powers\code\admin_discipline_editor.dm" +#include "modular_darkpack\modules\powers\code\admin_preference_editor.dm" #include "modular_darkpack\modules\powers\code\discipline_actions.dm" #include "modular_darkpack\modules\powers\code\discipline_configs.dm" #include "modular_darkpack\modules\powers\code\discipline_gain.dm" @@ -8112,6 +8124,7 @@ #include "modular_darkpack\modules\storyteller_stats\code\global_procs.dm" #include "modular_darkpack\modules\storyteller_stats\code\logging.dm" #include "modular_darkpack\modules\storyteller_stats\code\stat_pref_middleware.dm" +#include "modular_darkpack\modules\storyteller_stats\code\mob_affecting_adjustments\medicine_skill_surgery.dm" #include "modular_darkpack\modules\storyteller_stats\code\mob_affecting_adjustments\mob_procs.dm" #include "modular_darkpack\modules\storyteller_stats\code\mob_affecting_adjustments\movespeed_modifier.dm" #include "modular_darkpack\modules\storyteller_stats\code\mob_affecting_adjustments\recalculate_max_health.dm" @@ -8161,6 +8174,7 @@ #include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clan_mark.dm" #include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clan_mark_pref.dm" #include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clan_pref.dm" +#include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\trusted_whitelist.dm" #include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clans\banu_haqim.dm" #include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clans\brujah.dm" #include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clans\caitiff.dm" @@ -8239,7 +8253,6 @@ #include "modular_darkpack\modules\werewolf_the_apocalypse\code\glyphs.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\hud.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\silver_damage.dm" -#include "modular_darkpack\modules\werewolf_the_apocalypse\code\totems.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\werewolf_globals.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\basic_mobs\wolf.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\basic_mobs\banes\_banes.dm" @@ -8247,13 +8260,15 @@ #include "modular_darkpack\modules\werewolf_the_apocalypse\code\basic_mobs\banes\suffocating.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\basic_mobs\corvid\_bird.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\basic_mobs\corvid\bird_ai.dm" -#include "modular_darkpack\modules\werewolf_the_apocalypse\code\changing_breeds\corax.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\caern\bawn.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\caern\totems.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\_gift.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\ahroun.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\galliard.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\philodox.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\ragabash.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\theurge.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\changing_breeds\corax.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\innate\eye_drink.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\innate\howling.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\black_furies.dm" @@ -8273,10 +8288,14 @@ #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\glasswalkers\glasswalkers.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\auspice.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\breed.dm" -#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\fur.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\renown.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\tribe.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\wyrm_taint.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\customization\_customization.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\customization\fera_body.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\customization\fera_clothes.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\customization\fera_hair.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\customization\fur_color.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\species\fera_organs.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\species\fera_species.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\species\flight_action.dm" @@ -8301,6 +8320,8 @@ #include "modular_darkpack\modules\werewolf_the_apocalypse\code\weapons\klaives.dm" #include "modular_darkpack\modules\westfield_mall\code\mall_areas.dm" #include "modular_darkpack\modules\westfield_mall\code\modular_rooms.dm" +#include "modular_darkpack\modules\whitelist\code\whitelist_enforcement.dm" +#include "modular_darkpack\modules\whitelist\code\whitelist_prefs.dm" #include "modular_darkpack\modules\z_travel\code\helpers.dm" #include "modular_darkpack\modules\z_travel\code\manhole.dm" #include "modular_darkpack\modules\z_travel\code\transfer_point.dm" diff --git a/tgui/packages/common/verb-constants.ts b/tgui/packages/common/verb-constants.ts index b30a47191ac1..6e0efbda298e 100644 --- a/tgui/packages/common/verb-constants.ts +++ b/tgui/packages/common/verb-constants.ts @@ -54,3 +54,27 @@ export function isListArg(arg: VerbArgBase): boolean { arg.options.length > 0 ); } + +/** + * Filters typepaths to show direct children matching the query. + */ +export function filterTypepaths( + allPaths: string[], + query: string, + limit = 0, +): string[] { + const lower = query.toLowerCase(); + const parentPrefix = lower.endsWith('/') + ? lower + : lower.slice(0, lower.lastIndexOf('/') + 1); + const results: string[] = []; + for (const p of allPaths) { + const pl = p.toLowerCase(); + if (!pl.startsWith(parentPrefix)) continue; + if (pl.slice(parentPrefix.length).includes('/')) continue; + if (!pl.startsWith(lower)) continue; + results.push(p); + if (limit > 0 && results.length >= limit) break; + } + return results; +} diff --git a/tgui/packages/tgui-dev-server/dreamseeker.ts b/tgui/packages/tgui-dev-server/dreamseeker.ts index 90e26b914c43..e5cc7305bcb8 100644 --- a/tgui/packages/tgui-dev-server/dreamseeker.ts +++ b/tgui/packages/tgui-dev-server/dreamseeker.ts @@ -63,7 +63,10 @@ export class DreamSeeker { return instances; } - const command = 'netstat -ano | findstr TCP | findstr 0.0.0.0:0'; + const command = + process.platform === 'win32' + ? 'netstat -ano | findstr TCP | findstr 0.0.0.0:0' + : "ss -tln | grep '0.0.0.0:\\*'"; try { const { stdout } = await promisify(exec)(command, { diff --git a/tgui/packages/tgui-panel/chat/renderer.tsx b/tgui/packages/tgui-panel/chat/renderer.tsx index 26207ed1cbd2..8de9b5236b55 100644 --- a/tgui/packages/tgui-panel/chat/renderer.tsx +++ b/tgui/packages/tgui-panel/chat/renderer.tsx @@ -105,6 +105,56 @@ function updateMessageBadge(message) { } } +/** + * Highlight chat sounds - Cooldown check + play sound for client. + */ +const HIGHLIGHT_SOUND_COOLDOWN_SECONDS = 3; +let lastHighlightSoundAt = 0; + +function playHighlightSound(soundFile: string, volume: number) { + const now = Date.now(); + if (now - lastHighlightSoundAt < HIGHLIGHT_SOUND_COOLDOWN_SECONDS * 1000) { + return; + } + + lastHighlightSoundAt = now; + Byond.command(`.sound '${soundFile}' volume=${Math.round(volume * 100)}`); +} + +const RADIO_CHANNEL_LABEL = /^\[[^\]]+\]\s*/; + +// Check if a text node is a radio channel name, e.g. "[Radio] ". +function isRadioChannelName(node: Text): boolean { + const text = node.textContent || ''; + const match = RADIO_CHANNEL_LABEL.exec(text); + return Boolean( + node.parentElement?.classList.contains('name') && + match && + match[0].length === text.length, + ); +} + +// Split the radio channel label from the name node so that it can be highlighted separately. (used to avoid highlighting radio channel names) +function splitRadioChannelLabel(root: HTMLElement): void { + const nameNodes = root.querySelectorAll('.name'); + for (let i = 0; i < nameNodes.length; i++) { + const firstChild = nameNodes[i].firstChild; + if (firstChild?.nodeType !== Node.TEXT_NODE) { + continue; + } + const text = firstChild.textContent || ''; + const match = RADIO_CHANNEL_LABEL.exec(text); + if (match && match[0].length < text.length) { + (firstChild as Text).splitText(match[0].length); + } + } +} + +// Check if a message is a self-action message, such as "You put on your helmet.", we don't want to highlight it as, it's you doing the action. +function isSelfActionMessage(text: string): boolean { + return /^\s*You\b/.test(text); +} + class ChatRenderer { loaded: boolean; rootNode: HTMLElement | null; @@ -186,7 +236,9 @@ class ChatRenderer { tryFlushQueue() { if (this.isReady() && this.queue.length > 0) { - this.processBatch(this.queue); + this.processBatch(this.queue, { + suppressHighlightSound: true, + }); this.queue = []; } } @@ -239,6 +291,10 @@ class ChatRenderer { const matchWord = setting.matchWord; const matchCase = setting.matchCase; const enabled = setting.enabled; + const playSound = Boolean(setting.playSound); + const soundFile = + setting.soundFile || 'sound/misc/highlight_sounds/Beep.ogg'; + const soundVolume = Number(setting.soundVolume ?? 0.5); const jobs = String(setting.jobFilter || '') .split(',') .map((str) => str.trim().toLowerCase()) @@ -321,6 +377,9 @@ class ChatRenderer { highlightRegex, highlightColor, highlightWholeMessage, + playSound, + soundFile, + soundVolume, jobs, characters, }); @@ -383,9 +442,17 @@ class ChatRenderer { processBatch( batch, - options: { prepend?: boolean; notifyListeners?: boolean } = {}, + options: { + prepend?: boolean; + notifyListeners?: boolean; + suppressHighlightSound?: boolean; + } = {}, ) { - const { prepend, notifyListeners = true } = options; + const { + prepend, + notifyListeners = true, + suppressHighlightSound = false, + } = options; const now = Date.now(); // Queue up messages until chat is ready if (!this.isReady()) { @@ -489,6 +556,8 @@ class ChatRenderer { // Highlight text if (!message.avoidHighlighting && this.highlightParsers) { + splitRadioChannelLabel(node); + let messageHighlighted = false; this.highlightParsers .filter((parser) => parser.enabled && this.matchesFilters(parser)) .forEach((parser) => { @@ -497,6 +566,7 @@ class ChatRenderer { parser.highlightRegex, parser.highlightWords, (text) => createHighlightNode(text, parser.highlightColor), + (textNode) => !isRadioChannelName(textNode), // Exclude radio channel names from highlighting ); if (highlighted && parser.highlightWholeMessage) { node.className += ' ChatMessage--highlighted'; @@ -505,6 +575,19 @@ class ChatRenderer { parser.highlightColor, ); } + // Highlight sounds - Plays a sound once per message if enabled, will not play if the text was prased. (aka when relogging or reapplying chat). + if (highlighted && parser.playSound && !messageHighlighted) { + messageHighlighted = true; + if ( + !suppressHighlightSound && + !isSelfActionMessage(node.textContent || '') + ) { + playHighlightSound( + parser.soundFile, + parser.soundVolume ?? 0.5, + ); + } + } }); } // Linkify text @@ -623,6 +706,7 @@ class ChatRenderer { // Repopulate the chat log this.processBatch(messages, { notifyListeners: false, + suppressHighlightSound: true, }); } diff --git a/tgui/packages/tgui-panel/chat/replaceInTextNode.ts b/tgui/packages/tgui-panel/chat/replaceInTextNode.ts index f58ca0fe4fd3..e3bd03024112 100644 --- a/tgui/packages/tgui-panel/chat/replaceInTextNode.ts +++ b/tgui/packages/tgui-panel/chat/replaceInTextNode.ts @@ -13,6 +13,8 @@ type ReplaceInTextNodeParams = { captureAdjust?: (str: string) => string; }; +type HighlightNodeFilter = (node: Text) => boolean; + /** * Replaces text matching a regular expression with a custom node. */ @@ -165,6 +167,7 @@ export function highlightNode( /** List of words to highlight */ words: string[], createNode: NodeCreator = createHighlightNode, + filter: HighlightNodeFilter = () => true, ): number { if (!createNode) { createNode = createHighlightNode; @@ -174,10 +177,10 @@ export function highlightNode( for (let i = 0; i < childNodes.length; i++) { const node = childNodes[i]; // Is a text node - if (node.nodeType === 3) { + if (node.nodeType === 3 && filter(node as Text)) { n += replaceInTextNode(regex, words, createNode)(node); } else { - n += highlightNode(node, regex, words, createNode); + n += highlightNode(node, regex, words, createNode, filter); } } return n; diff --git a/tgui/packages/tgui-panel/chat/use-chat-persistence.ts b/tgui/packages/tgui-panel/chat/use-chat-persistence.ts index 2d8b537f935a..7797c9e1b7e6 100644 --- a/tgui/packages/tgui-panel/chat/use-chat-persistence.ts +++ b/tgui/packages/tgui-panel/chat/use-chat-persistence.ts @@ -1,4 +1,4 @@ -import { storage, type StorageDiagnostic } from 'common/storage'; +import { type StorageDiagnostic, storage } from 'common/storage'; import DOMPurify from 'dompurify'; import { useAtom, useAtomValue } from 'jotai'; import { useEffect } from 'react'; @@ -87,7 +87,10 @@ export function useChatPersistence() { ); if (batch.length) { - chatRenderer.processBatch(batch, { prepend: true }); + chatRenderer.processBatch(batch, { + prepend: true, + suppressHighlightSound: true, + }); } } @@ -109,6 +112,7 @@ export function useChatPersistence() { chatRenderer.processBatch(batch, { prepend: true, + suppressHighlightSound: true, }); console.log(`Restored chat with ${messages.length} messages`); diff --git a/tgui/packages/tgui-panel/events/handlers/assets.ts b/tgui/packages/tgui-panel/events/handlers/assets.ts index fc814f9fd6cb..e4a1e5e45aa3 100644 --- a/tgui/packages/tgui-panel/events/handlers/assets.ts +++ b/tgui/packages/tgui-panel/events/handlers/assets.ts @@ -6,3 +6,7 @@ const loadedMappings = {} as Record; export function handleLoadAssets(payload: Record): void { loadMappings(payload, loadedMappings); } + +export function resolveAsset(name: string): string { + return loadedMappings[name] || name; +} diff --git a/tgui/packages/tgui-panel/events/listeners.ts b/tgui/packages/tgui-panel/events/listeners.ts index 243699bfaa00..1131fb1373df 100644 --- a/tgui/packages/tgui-panel/events/listeners.ts +++ b/tgui/packages/tgui-panel/events/listeners.ts @@ -15,7 +15,6 @@ import { handleHotkeyMode, handleRemoveVerbs, handleTargets, - handleTypepaths, handleVerbsInit, } from '../verbs/handlers'; import { handleLoadAssets } from './handlers/assets'; @@ -29,7 +28,6 @@ const listeners = { 'verbs/init': handleVerbsInit, 'verbs/remove': handleRemoveVerbs, 'verbs/targets': handleTargets, - 'verbs/typepaths': handleTypepaths, 'verbs/hotkey_mode': handleHotkeyMode, 'asset/stylesheet': loadStyleSheet, 'asset/mappings': handleLoadAssets, diff --git a/tgui/packages/tgui-panel/settings/TextHighlight.tsx b/tgui/packages/tgui-panel/settings/TextHighlight.tsx index 7d28efa74d42..c63b9e890b40 100644 --- a/tgui/packages/tgui-panel/settings/TextHighlight.tsx +++ b/tgui/packages/tgui-panel/settings/TextHighlight.tsx @@ -5,13 +5,17 @@ import { Button, ColorBox, Divider, + Dropdown, Floating, Icon, Input, + Knob, Section, Stack, TextArea, } from 'tgui-core/components'; +import { toFixed } from 'tgui-core/math'; + import { chatRenderer } from '../chat/renderer'; import { characterProfilesAtom, currentCharacterAtom } from '../game/atoms'; import { WARN_AFTER_HIGHLIGHT_AMT } from './constants'; @@ -65,6 +69,15 @@ export function TextHighlightSettings(props) { ); } +const HIGHLIGHT_SOUND_OPTIONS = [ + { label: 'Beep', value: 'sound/misc/highlight_sounds/Beep.ogg' }, + { label: 'Pillow Hit', value: 'sound/items/pillow/pillow_hit.ogg' }, + { label: 'Coin Flip', value: 'sound/items/coinflip.ogg' }, + { label: 'Pen Click', value: 'sound/items/pen_click.ogg' }, + { label: 'Rattling Keys', value: 'sound/items/rattling_keys.ogg' }, + { label: 'Honk!', value: 'sound/items/bikehorn.ogg' }, +]; + const oneCharacterRegex = /^(\[.*\]|\\.|.)$/; function extractRegex(highlight: string): string | null { @@ -95,6 +108,9 @@ function TextHighlightSetting(props) { highlightWholeMessage, matchWord, matchCase, + playSound, + soundFile, + soundVolume, jobFilter, characterFilter, } = highlightSettingById[id]; @@ -199,6 +215,73 @@ function TextHighlightSetting(props) { Case + + + + updateHighlight({ + id, + playSound: !playSound, + }) + } + > + Sound + + + + + + option.label)} + selected={ + HIGHLIGHT_SOUND_OPTIONS.find( + (option) => option.value === soundFile, + )?.label ?? 'Beep' + } + disabled={!playSound} + onSelected={(label) => { + const option = HIGHLIGHT_SOUND_OPTIONS.find( + (item) => item.label === label, + ); + if (!option) { + return; + } + updateHighlight({ + id, + soundFile: option.value, + }); + }} + /> + + + + + `${toFixed(value * 100)}%`} + onChange={(_event, value) => { + if (!playSound) { + return; + } + updateHighlight({ + id, + soundVolume: value, + }); + }} + /> + + p.toLowerCase().startsWith(currentToken.toLowerCase())) - .slice(0, 8) + ? filterTypepaths(typepaths, currentToken, 8) : []; const targetSuggestions = @@ -178,12 +178,12 @@ export function CommandBar() { const focusSignal = useAtomValue(focusCommandBarAtom); const clearSignal = useAtomValue(clearCommandBarAtom); const hotkeys = useAtomValue(hotkeysAtom); + const initializeSignal = useAtomValue(initializeCommandBarAtom); const [input, setInput] = useState(''); const [selectedIndex, setSelectedIndex] = useState(0); const [selectedVerb, setSelectedVerb] = useState(null); const [filledArgs, setFilledArgs] = useState([]); - const [lastTypepathRequest, setLastTypepathRequest] = useState(''); - const [mode, setMode] = useState('Command'); + const [mode, setMode] = useState('Say'); const inputRef = useRef(null); const historyRef = useRef([]); const [historyIndex, setHistoryIndex] = useState(-1); @@ -218,6 +218,12 @@ export function CommandBar() { Byond.sendMessage('verbs/request_verbs'); }, []); + useEffect(() => { + if (mode !== 'Command') { + enterChatMode(mode); + } + }, [initializeSignal]); + useEffect(() => { if (focusSignal > 0) { inputRef.current?.focus(); @@ -232,11 +238,7 @@ export function CommandBar() { useEffect(() => { if (clearSignal > 0) { - if (mode !== 'Command') { - enterChatMode(mode); - } else { - resetState(); - } + resetState(); } }, [clearSignal]); @@ -270,7 +272,6 @@ export function CommandBar() { setSelectedVerb(null); setFilledArgs([]); setSelectedIndex(0); - setLastTypepathRequest(''); }; const enterChatMode = (chatMode: Mode) => { @@ -279,7 +280,6 @@ export function CommandBar() { setSelectedVerb(verb); setFilledArgs([]); setSelectedIndex(0); - setLastTypepathRequest(''); setInput(serializeInput(verb, [], suffixForArg(verb.args[0]))); }; @@ -299,7 +299,6 @@ export function CommandBar() { setSelectedVerb(verb); setFilledArgs([]); setSelectedIndex(0); - setLastTypepathRequest(''); setInput(serializeInput(verb, [], suffixForArg(verb.args[0]))); const firstArg = verb.args[0]; if (firstArg && isEntityArg(firstArg)) { @@ -317,8 +316,6 @@ export function CommandBar() { }; const selectTypepath = (path: string) => { - Byond.sendMessage('verbs/request_typepaths', { parent: path }); - setLastTypepathRequest(`${path}/`); if (!selectedVerb) return; const prefix = filledArgs.length > 0 ? `${filledArgs.join(' ')} ` : ''; setInput(`${toKebab(selectedVerb.name)} ${prefix}${path}/`); @@ -557,25 +554,6 @@ export function CommandBar() { } } } - - if (selectedVerb && isCurrentArgTypepath) { - const token = value.slice( - toKebab(selectedVerb.name).length + - 1 + - filledArgs.join(' ').length + - (filledArgs.length > 0 ? 1 : 0), - ); - const lastSlash = token.lastIndexOf('/'); - if (lastSlash >= 0) { - const parentPrefix = token.slice(0, lastSlash + 1); - if (parentPrefix !== lastTypepathRequest) { - setLastTypepathRequest(parentPrefix); - Byond.sendMessage('verbs/request_typepaths', { - parent: token.slice(0, lastSlash) || '/datum', - }); - } - } - } }; const placeholder = selectedVerb diff --git a/tgui/packages/tgui-panel/verbs/atoms.ts b/tgui/packages/tgui-panel/verbs/atoms.ts index 1d91aa3de37b..1376121e4bff 100644 --- a/tgui/packages/tgui-panel/verbs/atoms.ts +++ b/tgui/packages/tgui-panel/verbs/atoms.ts @@ -21,4 +21,5 @@ export const adminTargetsAtom = atom([]); export const typepathsAtom = atom([]); export const focusCommandBarAtom = atom(0); export const clearCommandBarAtom = atom(0); +export const initializeCommandBarAtom = atom(0); export const hotkeysAtom = atom(true); diff --git a/tgui/packages/tgui-panel/verbs/handlers.ts b/tgui/packages/tgui-panel/verbs/handlers.ts index 38fba8083f3f..89db29cba673 100644 --- a/tgui/packages/tgui-panel/verbs/handlers.ts +++ b/tgui/packages/tgui-panel/verbs/handlers.ts @@ -1,3 +1,5 @@ +import { fetchRetry } from 'tgui-core/http'; +import { resolveAsset } from '../events/handlers/assets'; import { store } from '../events/store'; import { adminTargetsAtom, @@ -5,13 +7,31 @@ import { clearCommandBarAtom, focusCommandBarAtom, hotkeysAtom, + initializeCommandBarAtom, type Target, typepathsAtom, type Verb, } from './atoms'; +let typepathsLoaded = false; + +function loadTypepaths() { + if (typepathsLoaded) return; + typepathsLoaded = true; + fetchRetry(resolveAsset('spawn_menu_atom_data.json')) + .then((response) => response.json()) + .then((data: { types: Record }) => { + store.set(typepathsAtom, Object.keys(data.types)); + }) + .catch(() => { + typepathsLoaded = false; + }); +} + export function handleVerbsInit(payload: { verbs: Verb[] }) { store.set(adminVerbsAtom, payload.verbs || []); + store.set(initializeCommandBarAtom, (n) => n + 1); + loadTypepaths(); } export function handleAddVerbs(payload: { verbs: Verb[] }) { @@ -37,10 +57,6 @@ export function handleTargets(payload: { targets: Target[] }) { store.set(adminTargetsAtom, payload.targets || []); } -export function handleTypepaths(payload: { paths: string[] }) { - store.set(typepathsAtom, payload.paths || []); -} - export function handleFocusCommandBar() { store.set(focusCommandBarAtom, (n) => n + 1); } diff --git a/tgui/packages/tgui/interfaces/AdminDisciplineEditor.tsx b/tgui/packages/tgui/interfaces/AdminDisciplineEditor.tsx deleted file mode 100644 index 92a24b3b7316..000000000000 --- a/tgui/packages/tgui/interfaces/AdminDisciplineEditor.tsx +++ /dev/null @@ -1,487 +0,0 @@ -import { useState } from 'react'; - -import { useBackend } from 'tgui/backend'; -import { Box, Button, DmIcon, Icon, Input, NumberInput, Section, Stack, Tooltip } from 'tgui-core/components'; -import { Window } from '../layouts'; - -type DisciplineInfo = { - name: string; - desc: string; - max_level: number; - rarity: 'rare' | 'common'; - icon?: string; - icon_state?: string; -}; - -type DisciplineValidation = { - total: number; - additional: number; - additional_rare: number; - valid: boolean; - violations: string[]; -}; - -type Data = { - target_ckey: string; - selected_slot: number; - not_found: boolean; - is_trusted: boolean; - character_slots: { slot: number; name: string }[]; - discipline_levels: Record; - clan_disciplines: string[]; - disciplines: Record; - discipline_validation: DisciplineValidation | null; - connected_ckeys: string[]; - invalid_ckeys: string[]; - trusted_ckeys: string[]; - character_name: string | null; - character_age: number | null; - immortal_age: number | null; - clan_name: string | null; - splat_name: string | null; - generation: number | null; - flavor_text: string | null; - headshot: string | null; -}; - -type DisciplineCardProps = { - path: string; - discipline: DisciplineInfo; - level: number; - isClanDiscipline: boolean; - clanName: string | null; - isAdditional: boolean; - onDotClick: (position: number) => void; -}; - -function DisciplineCard(props: DisciplineCardProps) { - const { discipline, level, isClanDiscipline, clanName, isAdditional, onDotClick } = props; - const isRare = discipline.rarity === 'rare'; - - return ( - -
- - {discipline.icon && discipline.icon_state && ( - - - - )} - - - {isClanDiscipline && clanName && ( - - ({clanName} Clan Discipline) - - )} - - {isRare ? 'Rare Discipline' : 'Common Discipline'} - - {discipline.desc} - - } - > - - {discipline.name} - {isClanDiscipline && ( - - - - )} - - - - - - {!isAdditional && ( - - Clan - - )} - - {isRare ? 'Rare' : 'Common'} - - - - - - {Array.from({ length: discipline.max_level }, (_, i) => { - const position = i + 1; - const filled = position <= level; - return ( - - onDotClick(position)} - style={{ cursor: 'pointer', fontSize: '13px', margin: '0 2px' }} - /> - - ); - })} - - - -
-
- ); -} - -export function AdminDisciplineEditor() { - const { act, data } = useBackend(); - const { - target_ckey, - selected_slot, - not_found, - is_trusted, - character_slots, - discipline_levels, - clan_disciplines, - disciplines, - discipline_validation, - connected_ckeys, - invalid_ckeys, - trusted_ckeys, - character_name, - character_age, - immortal_age, - clan_name, - splat_name, - generation, - flavor_text, - headshot, - } = data; - - const [ckeyInput, setCkeyInput] = useState(''); - const clanSet = new Set(clan_disciplines || []); - const allDisciplines = disciplines || {}; - const levels = discipline_levels || {}; - const connected = connected_ckeys || []; - const invalidSet = new Set(invalid_ckeys || []); - const trustedSet = new Set(trusted_ckeys || []); - - const handleDotClick = (path: string, position: number, currentLevel: number) => { - const newLevel = position <= currentLevel ? (position === 1 ? 0 : position) : position; - act('set_discipline_level', { discipline: path, level: newLevel }); - }; - - const disciplineEntries = Object.entries(allDisciplines); - - return ( - - - - -
- {connected.length === 0 && ( - - No players online. - - )} - {connected.map((ckey) => ( - - - - ))} -
-
- -
- - - setCkeyInput(value)} - onEnter={() => act('search_ckey', { ckey: ckeyInput })} - /> - - - - - - {!!not_found && ( - - No player found for ckey "{target_ckey}". - - )} -
- {target_ckey && !not_found && character_slots.length > 0 && ( -
- {target_ckey}'s character slots - - - - - - - } - > - - {character_slots.map(({ slot, name }) => ( - - - - ))} - -
- )} - {selected_slot > 0 && character_name && ( -
- - - - {character_name} - - - {character_age !== null && ( - - - Living Age: - - - {character_age} - - - )} - {immortal_age !== null && ( - - - Immortal Age: - - - {immortal_age} - - - )} - {character_age !== null && immortal_age !== null && ( - - - Chronological Age: - - - {character_age + immortal_age} - - - )} - {splat_name && ( - - - Splat: - - - {splat_name} - - - )} - {clan_name && ( - - - Clan: - - - {clan_name} - - - )} - {generation !== null && ( - - - Generation: - - - act('set_generation', { generation: value }) - } - /> - - )} - - {flavor_text && ( - - {flavor_text} - - )} - - - - {headshot && ( - - )} - - - -
- )} - {discipline_validation && ( -
- - - - Total disciplines: - - 5 ? 'red' : 'white'}> - {discipline_validation.total} / 5 - - - - - Non-Clan Rares in Use: - - = 2 ? 'red' : 'white'} - > - {discipline_validation.additional_rare} - - - - {is_trusted ? ( - - - Trusted - - ) : discipline_validation.valid ? ( - - - In compliance - - ) : ( - - - - Invalid! - - - )} - - -
- )} - - {selected_slot > 0 && splat_name === 'Human' && ( - - This character cannot be assigned disciplines or gifts. - - )} - {selected_slot > 0 && splat_name !== 'Human' && ( - - {disciplineEntries.map(([path, discipline]) => { - const level = levels[path] ?? 0; - return ( - handleDotClick(path, position, level)} - /> - ); - })} - - )} -
-
-
-
- ); -} diff --git a/tgui/packages/tgui/interfaces/AdminPreferenceEditor.tsx b/tgui/packages/tgui/interfaces/AdminPreferenceEditor.tsx new file mode 100644 index 000000000000..bd1e0494d582 --- /dev/null +++ b/tgui/packages/tgui/interfaces/AdminPreferenceEditor.tsx @@ -0,0 +1,519 @@ +import { useState } from 'react'; +import { useBackend } from 'tgui/backend'; +import { Box, Button, Divider, DmIcon, Icon, Input, NumberInput, Section, Stack, Tooltip } from 'tgui-core/components'; +import { Window } from '../layouts'; + +type DisciplineInfo = { + name: string; + desc: string; + max_level: number; + rarity: 'rare' | 'common'; + icon?: string; + icon_state?: string; +}; + +type DisciplineValidation = { + total: number; + additional: number; + additional_rare: number; + valid: boolean; + violations: string[]; +}; + +type WhitelistDefinition = { + name: string; + description: string; + category: 'splat' | 'access' | 'clan'; + is_default: boolean; +}; + +type Data = { + target_ckey: string; + selected_slot: number; + not_found: boolean; + is_trusted: boolean; + character_slots: { slot: number; name: string }[]; + discipline_levels: Record; + clan_disciplines: string[]; + disciplines: Record; + discipline_validation: DisciplineValidation | null; + connected_ckeys: string[]; + invalid_ckeys: string[]; + trusted_ckeys: string[]; + is_editing_character: boolean; + character_name: string | null; + character_age: number | null; + immortal_age: number | null; + clan_name: string | null; + generation: number | null; + splat_name: string | null; + flavor_text: string | null; + headshot: string | null; + player_whitelists: string[]; + whitelist_definitions: Record; +}; + +type DisciplineCardProps = { + path: string; + discipline: DisciplineInfo; + level: number; + isOwned: boolean; + isClanDiscipline: boolean; + clanName: string | null; + isAdditional: boolean; + onDotClick: (position: number) => void; + onRemove: (path: string) => void; +}; + +function DisciplineCard(props: DisciplineCardProps) { + const { discipline, level, isOwned, isClanDiscipline, clanName, path, isAdditional, onDotClick, onRemove } = props; + const isRare = discipline.rarity === 'rare'; + + return ( + + +
+ {isOwned && ( + onRemove(path)} + /> + )} + + + {discipline.icon && discipline.icon_state && ( + + + + )} + + + {isClanDiscipline && clanName && ( + + ({clanName} Clan Discipline) + + )} + + {isRare ? 'Rare Discipline' : 'Common Discipline'} + + {discipline.desc} + + } + > + + {discipline.name} + {isClanDiscipline && ( + + + + )} + + + + + + {!isAdditional && ( + + Clan + + )} + + {isRare ? 'Rare' : 'Common'} + + + + + + {Array.from({ length: discipline.max_level }, (_, i) => { + const position = i + 1; + const filled = position <= level; + return ( + + onDotClick(position)} + style={{ cursor: 'pointer', fontSize: '11px', margin: '0 1px' }} + /> + + ); + })} + + + +
+
+ ); +} + +const WHITELIST_CATEGORY_LABELS: Record = { + splat: 'Splat Access', + access: 'Access Level', + clan: 'Clan Access', +}; + +function WhitelistSection(props: { + playerWhitelists: string[]; + whitelistDefinitions: Record; + onToggle: (id: string, currentlyHas: boolean) => void; +}) { + const { playerWhitelists, whitelistDefinitions, onToggle } = props; + const whitelistSet = new Set(playerWhitelists); + const categories = ['splat', 'access', 'clan'] as const; + + return ( +
+ + {categories.map((category) => { + const entries = Object.entries(whitelistDefinitions).filter( + ([, wl]) => wl.category === category, + ); + if (!entries.length) return null; + return ( + + + {WHITELIST_CATEGORY_LABELS[category]} + + + {entries.map(([id, wl]) => { + const has = whitelistSet.has(id); + return ( + + + + + + ); + })} + + + ); + })} + +
+ ); +} + +export function AdminPreferenceEditor() { + const { act, data } = useBackend(); + const { + target_ckey, + selected_slot, + not_found, + is_trusted, + character_slots, + discipline_levels, + clan_disciplines, + disciplines, + discipline_validation, + connected_ckeys, + invalid_ckeys, + trusted_ckeys, + is_editing_character, + character_name, + character_age, + immortal_age, + clan_name, + splat_name, + generation, + flavor_text, + headshot, + player_whitelists, + whitelist_definitions, + } = data; + + const [ckeyInput, setCkeyInput] = useState(''); + const clanSet = new Set(clan_disciplines || []); + const allDisciplines = disciplines || {}; + const levels = discipline_levels || {}; + const connected = connected_ckeys || []; + const invalidSet = new Set(invalid_ckeys || []); + const trustedSet = new Set(trusted_ckeys || []); + + const handleDotClick = (path: string, position: number, currentLevel: number) => { + const newLevel = position <= currentLevel ? (position === 1 ? 0 : position) : position; + act('set_discipline_level', { discipline: path, level: newLevel }); + }; + + const handleRemove = (path: string) => { + act('set_discipline_level', { discipline: path, level: 0 }); + }; + + const handleWhitelistToggle = (id: string, currentlyHas: boolean) => { + act('set_whitelist', { id, grant: currentlyHas ? 0 : 1 }); + }; + + const disciplineEntries = Object.entries(allDisciplines); + + return ( + + + + +
+ {connected.length === 0 && No players online.} + {connected.map((ckey) => ( + + + + ))} +
+
+ +
+ + + setCkeyInput(value)} + onEnter={() => act('search_ckey', { ckey: ckeyInput })} + /> + + + + + + {!!not_found && ( + + No player found for ckey "{target_ckey}". + + )} +
+ + {target_ckey && !not_found && ( + + )} + + {target_ckey && !not_found && character_slots.length > 0 && ( +
+ + {character_slots.map(({ slot, name }) => ( + + + + ))} + +
+ )} + {selected_slot > 0 && character_name && ( + <> +
+ + + {character_name} + + + Living Age: + {character_age} + + + Immortal Age: + {immortal_age} + + + Clan: + {clan_name} + + + Splat: + {splat_name} + + {generation !== null && ( + + + Generation: + + + act('set_generation', { generation: value }) + } + /> + + )} + + {flavor_text && ( + + {flavor_text} + + )} + + + + {headshot && } + + + +
+ + {is_editing_character ? ( +
+ + + + + + + CHARACTER IS BEING EDITED + + + + +
For safety, you cannot make changes to {target_ckey}'s sheet while they have the character setup menu open.
+ You should probably ask {target_ckey} to spawn in, just to be safe.
+
+
+
+
+ ) : ( + <> + {discipline_validation && ( +
+ + + Total disciplines: + 5 ? 'red' : 'white'}> + {discipline_validation.total} / 5 + + + + Non-Clan Rares: + = 2 ? 'red' : 'white'}> + {discipline_validation.additional_rare} + + + + {is_trusted ? ( + + Trusted + + ) : ( + <> + + Untrusted + + + {discipline_validation.valid ? ( + In compliance + ) : ( + + + Invalid Configuration + + + )} + + + )} + + +
+ )} + {splat_name === 'Human' ? ( + + This character cannot be assigned disciplines or gifts. + + ) : ( + + {disciplineEntries.map(([path, discipline]) => { + const level = levels[path] ?? 0; + const isOwned = path in levels; + return ( + handleDotClick(path, position, level)} + onRemove={handleRemove} + /> + ); + })} + + )} + + )} + + )} +
+
+
+
+ ); +} diff --git a/tgui/packages/tgui/interfaces/AdminVerbPanel.tsx b/tgui/packages/tgui/interfaces/AdminVerbPanel.tsx index 3e42d1d74838..18a1a7cd34d5 100644 --- a/tgui/packages/tgui/interfaces/AdminVerbPanel.tsx +++ b/tgui/packages/tgui/interfaces/AdminVerbPanel.tsx @@ -1,4 +1,5 @@ import { storage } from 'common/storage'; +import { fetchRetry } from 'tgui-core/http'; import { ARG_SOURCE_LIST, ARG_TYPE_MESSAGE, @@ -8,8 +9,8 @@ import { ARG_TYPE_SOUND, ARG_TYPE_TEXT, ARG_TYPE_TYPEPATH, + filterTypepaths, isEntityArg, - isTypepathArg, } from 'common/verb-constants'; import { useCallback, useEffect, useState } from 'react'; import { @@ -24,6 +25,7 @@ import { TextArea, } from 'tgui-core/components'; +import { resolveAsset } from '../assets'; import { useBackend } from '../backend'; import { Window } from '../layouts'; @@ -54,16 +56,10 @@ type TargetEntry = { job?: string; }; -type TypepathData = { - parent: string; - paths: string[]; -}; - type Data = { verbs: Verb[]; categories: string[]; targets: TargetEntry[]; - typepaths?: TypepathData; }; function isPickableEntityArg(arg: VerbArgument): boolean { @@ -178,9 +174,6 @@ export function AdminVerbPanel() { setArgValues({}); setSelectedTarget(null); act('select_verb', { verb_type: verb.type }); - if (verb.arguments.some(isTypepathArg)) { - act('request_typepaths', { parent: '/datum' }); - } }; const entityArg = selectedVerb?.arguments.find(isPickableEntityArg) ?? null; @@ -642,35 +635,24 @@ type TypepathInputProps = { function TypepathInput(props: TypepathInputProps) { const { arg, value, onChange } = props; - const { act, data } = useBackend(); - const [lastRequested, setLastRequested] = useState(''); - const typepaths = data.typepaths; - const children = typepaths?.paths || []; + const [allTypepaths, setAllTypepaths] = useState([]); const inputValue = (value as string) || ''; - const suggestions = inputValue - ? children.filter((p) => - p.toLowerCase().startsWith(inputValue.toLowerCase()), - ) - : children; - - const handleChange = (val: string) => { - onChange(val); - if (val.endsWith('/')) { - const parent = val.slice(0, -1) || '/datum'; - if (parent !== lastRequested) { - setLastRequested(parent); - act('request_typepaths', { parent }); - } - } - }; + useEffect(() => { + fetchRetry(resolveAsset('spawn_menu_atom_data.json')) + .then((response) => response.json()) + .then((data: { types: Record }) => { + setAllTypepaths(Object.keys(data.types)); + }) + .catch(() => {}); + }, []); + + const suggestions = inputValue.startsWith('/') + ? filterTypepaths(allTypepaths, inputValue) + : []; const selectPath = (path: string) => { onChange(`${path}/`); - if (path !== lastRequested) { - setLastRequested(path); - act('request_typepaths', { parent: path }); - } }; return ( @@ -682,7 +664,7 @@ function TypepathInput(props: TypepathInputProps) {
diff --git a/tgui/packages/tgui/interfaces/AppearanceDebug/index.tsx b/tgui/packages/tgui/interfaces/AppearanceDebug/index.tsx index a7ffab3210d6..46788107ffd6 100644 --- a/tgui/packages/tgui/interfaces/AppearanceDebug/index.tsx +++ b/tgui/packages/tgui/interfaces/AppearanceDebug/index.tsx @@ -5,8 +5,10 @@ import { Box, Button, ByondUi, + ColorBox, Dropdown, InfinitePlane, + Input, Stack, } from 'tgui-core/components'; import { Window } from '../../layouts'; @@ -457,6 +459,8 @@ export function AppearanceDebug() { mapRefHover, mapRefSelected, updateWarning, + forcedPlane, + backdropColor, } = data; const [planeFilter, setPlaneFilter] = useState(null); const [hideEmissives, setHideEmissives] = useState(false); @@ -568,7 +572,9 @@ export function AppearanceDebug() { }px`} > planeToText[a] - planeToText[b], + )} placeholder="Filter by Plane" selected={planeFilter || ''} searchInput @@ -613,7 +619,7 @@ export function AppearanceDebug() { left="12px" top="42px" width="172px" - height="172px" + height="227px" pl="6px" pr="6px" style={{ zIndex: 3 }} @@ -621,12 +627,64 @@ export function AppearanceDebug() { + + + + planeToText[a] - planeToText[b], + )} + placeholder="Set Forced Plane" + selected={ + Object.keys(planeToText).findLast( + (x) => planeToText[x] === forcedPlane, + ) || '' + } + searchInput + onSelected={(value) => { + if (!(value in planeToText)) act('resetForcedPlane'); + act('setForcedPlane', { plane: planeToText[value] }); + }} + width="" + /> + ); - } - // otherwise, just display the name + const [forceFloating, setForceFloating] = useState(false); + return ( - + { + if (setParentForceFloating) { + setParentForceFloating(state); + } + if (!state) { + setForceFloating(false); + } + }} + content={ + + + + + + + + } + > + + ); }; diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole/BuyingShuttle.tsx b/tgui/packages/tgui/interfaces/CommunicationsConsole/BuyingShuttle.tsx index 8dc574acc025..a9ccc39cd70b 100644 --- a/tgui/packages/tgui/interfaces/CommunicationsConsole/BuyingShuttle.tsx +++ b/tgui/packages/tgui/interfaces/CommunicationsConsole/BuyingShuttle.tsx @@ -58,6 +58,17 @@ function ShuttleCard(props: ShuttleCardProps) { emagged, } = data; + const isButtonDisabled = budget < shuttle.creditCost; + + let buttonTooltip: string | undefined; + if (budget < shuttle.creditCost) { + buttonTooltip = `You need ${shuttle.creditCost - budget} more ${displayed_currency_full_name}.`; + } else if (shuttle.department_locked) { + buttonTooltip = `Requires ${shuttle.department_name} Department to have the highest employees count.`; + } else if (shuttle.emagOnly) { + buttonTooltip = EMAG_SHUTTLE_NOTICE; + } + return (
act('purchaseShuttle', { shuttle: shuttle.ref, }) } - tooltip={ - budget < shuttle.creditCost - ? `You need ${shuttle.creditCost - budget} more ${displayed_currency_full_name}.` - : shuttle.emagOnly - ? EMAG_SHUTTLE_NOTICE - : undefined - } + tooltip={buttonTooltip} tooltipPosition="left" > - {shuttle.emagOnly && !emagged - ? 'Buy' - : `${shuttle.creditCost} ${displayed_currency_name}`} + {shuttle.department_locked + ? 'Locked' + : shuttle.emagOnly && !emagged + ? 'Buy' + : `${shuttle.creditCost} ${displayed_currency_name}`} } > @@ -101,6 +114,15 @@ function ShuttleCard(props: ShuttleCardProps) { {shuttle.prerequisites && Prerequisites: {shuttle.prerequisites}} + {!!shuttle.department_locked && ( + + This shuttle can only be purchased if {shuttle.department_name}{' '} + Department has biggest number of employees! + + )}
); } diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole/types.ts b/tgui/packages/tgui/interfaces/CommunicationsConsole/types.ts index 78add72e91d2..262fefe46e3a 100644 --- a/tgui/packages/tgui/interfaces/CommunicationsConsole/types.ts +++ b/tgui/packages/tgui/interfaces/CommunicationsConsole/types.ts @@ -24,6 +24,8 @@ export type Shuttle = { price: number; ref: string; refund: number; + department_locked: boolean; + department_name: string; }; type Message = { diff --git a/tgui/packages/tgui/interfaces/CrewConsole.tsx b/tgui/packages/tgui/interfaces/CrewConsole.tsx index df24ce61c09b..f84eb0310a5b 100644 --- a/tgui/packages/tgui/interfaces/CrewConsole.tsx +++ b/tgui/packages/tgui/interfaces/CrewConsole.tsx @@ -239,6 +239,7 @@ const CrewTableEntry = (props: CrewTableEntryProps) => { burndam, brutedam, area, + ref, } = sensor_data; return ( @@ -295,7 +296,7 @@ const CrewTableEntry = (props: CrewTableEntryProps) => { ); }, @@ -257,6 +283,7 @@ type MainFeatureProps = { handleSelect: (newClothing: string) => void; randomization?: RandomSetting; setRandomization: (newSetting: RandomSetting) => void; + isLocked?: (choice: string) => boolean; // DARKPACK EDIT ADD }; function MainFeature(props: MainFeatureProps) { @@ -267,6 +294,7 @@ function MainFeature(props: MainFeatureProps) { handleSelect, randomization, setRandomization, + isLocked, // DARKPACK EDIT ADD } = props; const supplementalFeature = catalog.supplemental_feature; @@ -288,6 +316,7 @@ function MainFeature(props: MainFeatureProps) { ] } onSelect={handleSelect} + isLocked={isLocked} // DARKPACK EDIT ADD /> } > @@ -413,7 +442,7 @@ export function PreferenceList(props: PreferenceListProps) { value={value} /> )} - {/*DARKPACK EDIT END */} + {/*DARKPACK EDIT END */}
@@ -463,7 +492,13 @@ export function MainPage(props: MainPageProps) { const [multiNameInputOpen, setMultiNameInputOpen] = useState(false); const [vocalsInputOpen, setVocalsInputOpen] = useState(false); // DARKPACK EDIT ADDITION const [randomToggleEnabled] = useRandomToggleState(); - const [pendingConfirm, setPendingConfirm] = useState<(() => void) | null>(null); // DARKPACK EDIT ADD - for popups + const [pendingConfirm, setPendingConfirm] = useState<(() => void) | null>( + null, + ); // DARKPACK EDIT ADD - for popups + // DARKPACK EDIT START + const whitelistSet = new Set(data.player_whitelists || []); + const isTrusted = whitelistSet.has('trusted'); + // DARKPACK EDIT END const serverData = useServerPrefs(); @@ -492,8 +527,12 @@ export function MainPage(props: MainPageProps) { ...data.character_preferences.non_contextual, }; // DARKPACK EDIT ADD START - tracking age changes - const immortalAgeValue = nonContextualPreferences.immortal_age as number | undefined; - const immortalAgeServerData = serverData?.immortal_age as { minimum: number; maximum: number; step: number } | undefined; + const immortalAgeValue = nonContextualPreferences.immortal_age as + | number + | undefined; + const immortalAgeServerData = serverData?.immortal_age as + | { minimum: number; maximum: number; step: number } + | undefined; // DARKPACK EDIT ADD END if (randomBodyEnabled) { @@ -540,18 +579,21 @@ export function MainPage(props: MainPageProps) { maxHeight="auto" // DARKPACK EDIT ADD START overrides={{ - immortal_age: immortalAgeValue !== undefined ? ( - setPendingConfirm(() => () => { - createSetPreference(act, 'immortal_age')(value); - act('clear_discipline_levels'); - })} - /> - ) : undefined, + immortal_age: + immortalAgeValue !== undefined ? ( + + setPendingConfirm(() => () => { + createSetPreference(act, 'immortal_age')(value); + act('clear_discipline_levels'); + }) + } + /> + ) : undefined, }} // DARKPACK EDIT ADD END /> @@ -597,60 +639,13 @@ export function MainPage(props: MainPageProps) { )} {/* DARKPACK EDIT START - popup for clan, age, etc. changes */} {pendingConfirm !== null && ( - { + pendingConfirm?.(); + setPendingConfirm(null); }} - > - - - Change Character Details? - - - Changing significant character details (Clan, age, etc.) will wipe ALL of your existing disciplines. - This cannot be undone. Are you sure? - - - - - - - - - - - + onCancel={() => setPendingConfirm(null)} + /> )} {/* DARKPACK EDIT END*/} @@ -693,15 +688,15 @@ export function MainPage(props: MainPageProps) { }} /> - {/* DARKPACK EDIT ADDITION START */} - - { - setVocalsInputOpen(true); - }} - /> - - {/* DARKPACK EDIT ADDITION END */} + {/* DARKPACK EDIT ADDITION START */} + + { + setVocalsInputOpen(true); + }} + /> + + {/* DARKPACK EDIT ADDITION END */} @@ -732,7 +727,19 @@ export function MainPage(props: MainPageProps) { } : baseSelect; // DARKPACK EDIT END - + // DARKPACK EDIT START - lock icons for whitelisted clans + const isChoiceLocked = + clothingKey === 'vampire_clan' + ? (choice: string) => { + const whitelistId = data.clan_names_to_key[choice]; + return ( + !!whitelistId && + !isTrusted && + !whitelistSet.has(whitelistId) + ); + } + : undefined; + // DARKPACK EDIT END return ( {!catalog ? ( @@ -745,6 +752,7 @@ export function MainPage(props: MainPageProps) { handleSelect={handleSelect} randomization={randomizationOfMainFeatures[clothingKey]} setRandomization={createSetRandomization(clothingKey)} + isLocked={isChoiceLocked} // DARKPACK EDIT ADD /> )} diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/SplatsPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/SplatsPage.tsx index aa6cca155333..6dfcba2f7382 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/SplatsPage.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/SplatsPage.tsx @@ -1,6 +1,8 @@ // THIS IS A DARKPACK UI FILE +import { useState } from 'react'; import { useBackend } from 'tgui/backend'; +import { ConfirmModal } from '../components/ConfirmModal'; import { BlockQuote, Box, @@ -112,6 +114,10 @@ type SplatsPageInnerProps = { function SplatsPageInner(props: SplatsPageInnerProps) { const { act, data } = useBackend(); const setSplats = createSetPreference(act, 'splats'); + const [pendingConfirm, setPendingConfirm] = useState<(() => void) | null>( + null, + ); + const whitelistSet = new Set(data.player_whitelists || []); const splats: [string, Splats][] = Object.entries(props.splats).map( ([splats, data]) => { @@ -142,24 +148,54 @@ function SplatsPageInner(props: SplatsPageInnerProps) { {splats.map(([splatsKey, splats]) => { + const isLocked = !!splatsKey && !whitelistSet.has(splatsKey); return ( ); })} @@ -214,6 +250,16 @@ function SplatsPageInner(props: SplatsPageInnerProps) { + {/* confirm dialog for splat changes */} + {pendingConfirm !== null && ( + { + pendingConfirm?.(); + setPendingConfirm(null); + }} + onCancel={() => setPendingConfirm(null)} + /> + )} ); } diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/components/ConfirmModal.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/components/ConfirmModal.tsx new file mode 100644 index 000000000000..56b5726e027d --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/components/ConfirmModal.tsx @@ -0,0 +1,62 @@ +// THIS IS A DARKPACK UI FILE + +import { Box, Button, Stack } from 'tgui-core/components'; + +const DEFAULT_BODY = "Changing significant character details (Clan, age, etc.) will wipe ALL of your existing disciplines. This cannot be undone. Are you sure?"; + +type Props = { + title?: string; + body?: string; + onConfirm: () => void; + onCancel: () => void; +}; + +export function ConfirmModal(props: Props) { + const { title = 'Change Character Details?', body = DEFAULT_BODY, onConfirm, onCancel } = props; + + return ( + + + + {title} + + + {body} + + + + + + + + + + + + ); +} diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_fur_color.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_fera.tsx similarity index 50% rename from tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_fur_color.tsx rename to tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_fera.tsx index f6bb6b7f0fa4..78db68478435 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_fur_color.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_fera.tsx @@ -10,3 +10,19 @@ export const corax_fur_color: FeatureChoiced = { name: 'Corax Feather Color', component: FeatureDropdownInput, }; + + +export const garou_hair: FeatureChoiced = { + name: 'Garou Hair', + component: FeatureDropdownInput, +}; + +export const garou_body: FeatureChoiced = { + name: 'Garou Body', + component: FeatureDropdownInput, +}; + +export const garou_clothes: FeatureChoiced = { + name: 'Garou Clothes', + component: FeatureDropdownInput, +}; diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_height.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_height.tsx index def14e845419..1d1aabbfd8c8 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_height.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_height.tsx @@ -1,19 +1,68 @@ // THIS IS A DARKPACK UI FILE -import { type FeatureNumeric, type FeatureValueProps, type FeatureNumericData, FeatureNumberInput } from '../base'; -import { Stack, Box } from 'tgui-core/components'; +import { useState } from 'react'; +import { Button, Slider, Stack } from 'tgui-core/components'; +import type { + FeatureNumeric, + FeatureNumericData, + FeatureValueProps, +} from '../base'; type HeightServerData = FeatureNumericData & { height_labels: Record; }; +// on the back end, the height value 6 is around 4'10, which is 58 inches according to google so thats our baseline +const minimum_height = 58; // heights are integers on the back end, which sucks, but we cope by doing math on the front end i guess -function HeightInput(props: FeatureValueProps) { +function HeightInput( + props: FeatureValueProps, +) { + const { serverData, handleSetValue, value } = props; + const min = serverData?.minimum ?? 6; + const max = serverData?.maximum ?? 18; + const serverStep = serverData?.step ?? 2; // increments of 2. theres only 7 'real' heights, or height values that change the sprite + const inchSpan = serverData ? (max - min) * serverStep : 24; // all possible front end values, where only half are actual back end values. its written like this in-case some stinker goes and changes one of the height values, it doesnt brick saves + const [displayInch, setDisplayInch] = useState((value - min) * serverStep); + + // setting the (invisible, remove format() if you need this to make sense) slider value to 4 is floor(4/4)*2+6 and turns into a back end value of 8, or 5'2" on the front end. i think that's math:tm:. please dont judge me if im doing this wrong + // setting it to 8 is floor(8/4)*2+6, or 10 on the back end (which is a defined height value!!), front end is 5'6". bc theres a back end value on the new number, we update the sprite! yippee! + const snapToBackend = (inch: number) => + min + Math.floor(inch / (serverStep * serverStep)) * serverStep; + const inches = minimum_height + displayInch; + const label = `${Math.floor(inches / 12)}'${inches % 12}"`; + const adjust = (delta: number) => { + const next = Math.max(0, Math.min(inchSpan, displayInch + delta)); + setDisplayInch(next); + handleSetValue(snapToBackend(next)); + }; return ( - + + + ))} + + + + )} + + ) : ( + + No Gas Selected + + )} + + + +
+ + {(query ? results : gasInfo) + .sort((a, b) => (a.name > b.name ? 1 : -1)) + .map((gas) => ( + + + + ))} + +
+
+ ); } -function ReactionHandbook(props) { +type ReactionHandbookProps = { + setTab?: (tab: number) => void; +}; + +function ReactionHandbook(props: ReactionHandbookProps) { const { data } = useBackend(); const { reactionInfo } = data; + const { setTab } = props; const [activeGasId, setActiveGasId] = useAtom(activeGasAtom); const [activeReactionId, setActiveReactionId] = useAtom(activeReactionAtom); const [reactionActiveInput, setReactionActiveInput] = useState(false); @@ -145,84 +313,149 @@ function ReactionHandbook(props) { (reaction) => reaction.id === activeReactionId, ); + const { query, setQuery, results } = useFuzzySearch({ + searchArray: reactionInfo, + matchStrategy: 'smart', + getSearchString: (item) => item.name, + }); + return (
- setActiveReactionId( - reactionInfo.find((reaction) => - reaction.name.toLowerCase().startsWith(keyword.toLowerCase()), - )?.id || '', - ) - } + title="Reaction Lookup" + onChange={(keyword) => setQuery(keyword)} + onEnter={(keyword) => { + const foundReaction = reactionInfo.find((reaction) => + reaction.name.toLowerCase().startsWith(keyword.toLowerCase()), + ); + if (foundReaction) { + setActiveReactionId(foundReaction.id); + } + }} + inputText={query} activeInput={reactionActiveInput} setActiveInput={setReactionActiveInput} /> } > - {relevantReaction && ( - <> - {relevantReaction.description} - {'Relevant Factors:'} - - {relevantReaction.factors.map((factor) => ( - setActiveGasId(String(factor.factor_id))} - content={factor.factor_name} - /> - ) : factor.tooltip ? ( - - - + + + {relevantReaction ? ( + <> + + > {relevantReaction.name} + + + {relevantReaction.description} + + +
+ + {relevantReaction.factors.map((factor) => ( + { + setActiveGasId(String(factor.factor_id)); + setTab?.(HandbookTab.Gases); + }} + fluid + > + {factor.factor_name} + + ) : factor.tooltip ? ( + + + + {`${factor.factor_name}:`} + + + + ) : ( + factor.factor_name + ) + } > - {`${factor.factor_name}:`} - - - - ) : ( - factor.factor_name - ) - } + {factor.desc} + + ))} + +
+
+ + ) : ( + - {factor.desc} -
- ))} -
- - )} + No reaction selected + + )} + + + +
+ + {(query ? results : reactionInfo) + .sort((a, b) => (a.name > b.name ? 1 : -1)) + .map((reaction) => ( + + + + ))} + +
+
+
); } -type HandbookContentProps = { - vertical?: boolean; -}; +export function AtmosHandbookContent() { + const [tab, setTab] = useState(HandbookTab.Gases); -export function AtmosHandbookContent(props: HandbookContentProps) { - return props.vertical ? ( - <> - - - - ) : ( - - - + return ( + + + + setTab(HandbookTab.Gases)} + > + Gases + + setTab(HandbookTab.Reactions)} + > + Reactions + + - + {tab === HandbookTab.Reactions ? ( + + ) : ( + + )} ); diff --git a/tgui/packages/tgui/interfaces/common/GasmixParser.tsx b/tgui/packages/tgui/interfaces/common/GasmixParser.tsx index 2987c64e8890..892022eb97e3 100644 --- a/tgui/packages/tgui/interfaces/common/GasmixParser.tsx +++ b/tgui/packages/tgui/interfaces/common/GasmixParser.tsx @@ -1,13 +1,17 @@ -import { Box, Button, LabeledList } from 'tgui-core/components'; +import { Box, Button, LabeledList, Stack } from 'tgui-core/components'; + +type GasEntry = [string, string, number]; // ID, name, and amount. + +type ReactionEntry = [string, string, number]; // ID, name, and amount. export type Gasmix = { name?: string; - gases: [string, string, number][]; // ID, name, and amount. + gases: GasEntry[]; // ID, name, and amount. temperature: number; volume: number; pressure: number; total_moles: number; - reactions: [string, string, number][]; // ID, name, and amount. + reactions: ReactionEntry[]; // ID, name, and amount. reference: string; }; @@ -37,101 +41,134 @@ export const GasmixParser = (props: GasmixParserProps) => { const { gases, temperature, volume, pressure, total_moles, reactions } = gasmix; - return !total_moles ? ( - - No Gas Detected! - - ) : ( - - {gases.map((gas) => ( - gasesOnClick(gas[0])} /> - ) : ( - gas[1] - ) - } - key={gas[1]} - > - {gas[2].toFixed(2) + - ' mol (' + - ((gas[2] / total_moles) * 100).toFixed(2) + - ' %)'} - - ))} - temperatureOnClick()} - /> - ) : ( - 'Temperature' - ) - } - > - {`${total_moles ? temperature.toFixed(2) : '-'} K`} - - volumeOnClick()} /> - ) : ( - 'Volume' - ) - } - > - {`${total_moles ? volume.toFixed(2) : '-'} L`} - - pressureOnClick()} /> - ) : ( - 'Pressure' - ) - } - > - {`${total_moles ? pressure.toFixed(2) : '-'} kPa`} - - {detailedReactions ? ( - reactions.map((reaction) => ( - reactionOnClick(reaction[0])} - /> - ) : ( - reaction[1] - ) - } - > - {reaction[2]} - - )) - ) : ( - - {reactions.length - ? reactions.map((reaction, index) => - reactionOnClick ? ( - + if (total_moles <= 0) { + return ( + + No Gas Detected! + + ); + } + + return ( + + + + + {gases.map((gas) => ( + gasesOnClick(gas[0])}> + {gas[1]} + + ) : ( + gas[1] + ) + } + key={gas[1]} + > + {gas[2].toFixed(2) + + ' mol (' + + ((gas[2] / total_moles) * 100).toFixed(2) + + ' %)'} + + ))} + + + + reactionOnClick(reaction[0])} + content={'Temperature'} + onClick={() => temperatureOnClick()} /> - - ) : ( -
{reaction[1]}
- ), - ) - : 'No reactions detected'} -
+ ) : ( + 'Temperature' + ) + } + > + {`${total_moles ? temperature.toFixed(2) : '-'} K`} + + volumeOnClick()} + /> + ) : ( + 'Volume' + ) + } + > + {`${total_moles ? volume.toFixed(2) : '-'} L`} + + pressureOnClick()} + /> + ) : ( + 'Pressure' + ) + } + > + {`${total_moles ? pressure.toFixed(2) : '-'} kPa`} + +
+
+
+ + {!!reactions.length && ( + + + + Active Reactions + + {detailedReactions ? ( + + {reactions.map((reaction) => ( + + {reactionOnClick ? ( + + ) : ( + reaction[1] + )} + - {reaction[2]} + + ))} + + ) : ( + + + {reactions.map((reaction) => ( + + {reactionOnClick ? ( + + ) : ( + reaction[1] + )} + + ))} + + + )} + + )} - + ); }; diff --git a/tgui/packages/tgui/interfaces/common/JobToIcon.ts b/tgui/packages/tgui/interfaces/common/JobToIcon.ts deleted file mode 100644 index d2a473f3b058..000000000000 --- a/tgui/packages/tgui/interfaces/common/JobToIcon.ts +++ /dev/null @@ -1,59 +0,0 @@ -export type AvailableJob = keyof typeof JOB2ICON; - -/** Icon map of jobs to their fontawesome5 (free) counterpart. */ -export const JOB2ICON = { - AI: 'eye', - Assistant: 'toolbox', - 'Atmospheric Technician': 'fan', - Bartender: 'cocktail', - 'Bit Avatar': 'code', - Bitrunner: 'gamepad', - Botanist: 'seedling', - 'Bridge Assistant': 'building-shield', - Captain: 'crown', - 'Cargo Gorilla': 'paw', - 'Cargo Technician': 'box', - 'CentCom Commander': 'star', - 'CentCom Head Intern': 'pen-fancy', - 'CentCom Intern': 'pen-alt', - 'CentCom Official': 'medal', - Chaplain: 'cross', - Chef: 'utensils', - Chemist: 'prescription-bottle', - 'Chief Engineer': 'user-astronaut', - 'Chief Medical Officer': 'user-md', - Clown: 'face-grin-tears', - Cook: 'utensils', - Coroner: 'skull', - Curator: 'book', - 'Cyber Police': 'qrcode', - Cyborg: 'robot', - Detective: 'user-secret', - Geneticist: 'dna', - 'Head of Personnel': 'dog', - 'Head of Security': 'user-shield', - 'Big Brother': 'eye', - Janitor: 'soap', - Lawyer: 'gavel', - 'Medical Doctor': 'staff-snake', - Mime: 'comment-slash', - Paramedic: 'truck-medical', - 'Personal AI': 'mobile-alt', - Prisoner: 'lock', - Psychologist: 'brain', - Quartermaster: 'sack-dollar', - 'Research Director': 'user-graduate', - Roboticist: 'battery-half', - Scientist: 'flask', - 'Security Officer (Cargo)': 'shield-halved', - 'Security Officer (Engineering)': 'shield-halved', - 'Security Officer (Medical)': 'shield-halved', - 'Security Officer (Science)': 'shield-halved', - 'Security Officer': 'shield-halved', - 'Shaft Miner': 'digging', - 'Station Engineer': 'gears', - 'Syndicate Operative': 'dragon', - 'Veteran Security Advisor': 'ribbon', - 'Pun Pun': 'paw', - Warden: 'handcuffs', -} as const; diff --git a/tools/UpdatePaths/Scripts/DarkPack/1373_lamppost_refactor.txt b/tools/UpdatePaths/Scripts/DarkPack/1373_lamppost_refactor.txt new file mode 100644 index 000000000000..6348d5abf08b --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/1373_lamppost_refactor.txt @@ -0,0 +1,2 @@ +/obj/structure/lamppost : /obj/machinery/light/floor/lamppost{@OLD} +/obj/structure/lamppost/@SUBTYPES : /obj/machinery/light/floor/lamppost/@SUBTYPES {@OLD}