diff --git a/.github/actions/restore_or_install_byond/action.yml b/.github/actions/restore_or_install_byond/action.yml
index 5a8d970d8441..07012a1f2bb6 100644
--- a/.github/actions/restore_or_install_byond/action.yml
+++ b/.github/actions/restore_or_install_byond/action.yml
@@ -29,20 +29,44 @@ runs:
echo "BYOND_MAJOR=$BYOND_MAJOR" >> $GITHUB_ENV
echo "BYOND_MINOR=$BYOND_MINOR" >> $GITHUB_ENV
- - name: Find fastest APT mirror
+ # Try to grab libcurl from the cache
+ # If we fail, find the nearest server, download it, and upload it to the cache.
+ # Only required for BYOND versions 516.1664+
+ - name: Restore libcurl cache
+ id: restore_libcurl_cache
if: env.BYOND_MAJOR >= 516 && env.BYOND_MINOR >= 1664
+ uses: actions/cache/restore@v6.1.0
+ with:
+ path: ~/apt-cache
+ key: ${{ runner.os }}-libcurl-i386
+ - name: Install 32-bit libcurl from cache
+ if: env.BYOND_MAJOR >= 516 && env.BYOND_MINOR >= 1664 && steps.restore_libcurl_cache.outputs.cache-hit
+ shell: bash
+ run: |
+ sudo dpkg --add-architecture i386
+ sudo dpkg -i ~/apt-cache/*.deb
+ - name: Find fastest APT mirror
+ if: env.BYOND_MAJOR >= 516 && env.BYOND_MINOR >= 1664 && !steps.restore_libcurl_cache.outputs.cache-hit
uses: vegardit/fast-apt-mirror.sh@v1
with:
sample-size: 8192
sample-time: 5
- name: Install 32-bit libcurl
- # Only required in 516.1664+
- if: env.BYOND_MAJOR >= 516 && env.BYOND_MINOR >= 1664
+ if: env.BYOND_MAJOR >= 516 && env.BYOND_MINOR >= 1664 && !steps.restore_libcurl_cache.outputs.cache-hit
shell: bash
run: |
sudo dpkg --add-architecture i386
sudo apt-get update -qq
- sudo apt-get install -y --no-install-recommends libcurl4t64:i386
+ sudo rm -f /var/cache/apt/archives/*.deb
+ sudo apt-get install -y -o Keep-Downloaded-Packages=true --no-install-recommends libcurl4t64:i386
+ mkdir -p ~/apt-cache
+ cp /var/cache/apt/archives/*.deb ~/apt-cache/
+ - name: Save libcurl cache
+ if: env.BYOND_MAJOR >= 516 && env.BYOND_MINOR >= 1664 && !steps.restore_libcurl_cache.outputs.cache-hit
+ uses: actions/cache/save@v6.1.0
+ with:
+ path: ~/apt-cache
+ key: ${{ steps.restore_libcurl_cache.outputs.cache-primary-key }}
# The use of `actions/cache/restore` and `actions/cache/save` here is deliberate, as we want to
# save the BYOND install to a cache as early as possible. If we used just `actions/cache`, it
@@ -50,7 +74,7 @@ runs:
# is cancelled, we already have a cache to restore from.
- name: Restore BYOND cache
id: restore_byond_cache
- uses: actions/cache/restore@v5
+ uses: actions/cache/restore@v6.1.0
with:
path: ~/BYOND
key: ${{ runner.os }}-byond-${{ env.BYOND_MAJOR }}-${{ env.BYOND_MINOR }}
@@ -60,7 +84,7 @@ runs:
run: bash tools/ci/install_byond.sh
- name: Save BYOND cache
if: ${{ !steps.restore_byond_cache.outputs.cache-hit }}
- uses: actions/cache/save@v5
+ uses: actions/cache/save@v6.1.0
with:
path: ~/BYOND
key: ${{ steps.restore_byond_cache.outputs.cache-primary-key }}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index af27d2682104..1337140710ce 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -8,6 +8,14 @@
"editor.insertSpaces": false,
"git.branchProtection": ["master"],
"gitlens.advanced.blame.customArguments": ["-w"],
+ "json.schemas": [
+ {
+ "fileMatch": ["**/build_flags.jsonc"],
+ "schema": {
+ "allowTrailingCommas": true
+ }
+ }
+ ],
"tgstationTestExplorer.project.resultsType": "json",
"[javascript][typescript][javascriptreact][typescriptreact][css][json][jsonc]": {
"editor.defaultFormatter": "biomejs.biome",
@@ -27,6 +35,6 @@
},
"Lua.diagnostics.enable": false,
"ss13BuildFlags.baseTask": "Build All",
- "ss13BuildFlags.configPath": "tools/build/build_flags.json",
+ "ss13BuildFlags.configPath": "tools/build/build_flags.jsonc",
"ss13BuildFlags.injectionMode": "cli-args"
}
diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm
index 6f86429720ac..73c4ea161220 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm
@@ -533,7 +533,7 @@
/turf/open/floor/iron,
/area/ruin/planetengi)
"cJ" = (
-/obj/item/modular_computer/pda/engineering,
+/obj/item/modular_computer/pda/crew/engineering,
/turf/open/floor/iron,
/area/ruin/planetengi)
"cL" = (
diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm
index e520d14def61..037dea7bfd66 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm
@@ -3508,7 +3508,7 @@
pixel_x = 5;
pixel_y = 7
},
-/obj/item/mmi/syndie{
+/obj/item/brain_processor/organic/syndie{
pixel_x = 7;
pixel_y = 6
},
diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm
index 2d65f7ff2a09..0a6d0ace1734 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm
@@ -842,7 +842,7 @@
/area/ruin/syndielab)
"Xm" = (
/obj/structure/closet/crate/secure/trashcart,
-/obj/item/relic,
+/obj/item/assembly/relic,
/obj/item/storage/bag/trash/filled{
pixel_y = 1;
pixel_x = 6
diff --git a/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm b/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm
index d0a89db3bc8e..62bd94b02c90 100644
--- a/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm
+++ b/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm
@@ -87,7 +87,7 @@
/turf/open/misc/asteroid/airless,
/area/space)
"C" = (
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/turf/open/misc/asteroid/airless,
/area/space)
"D" = (
diff --git a/_maps/RandomRuins/SpaceRuins/dragoontomb.dmm b/_maps/RandomRuins/SpaceRuins/dragoontomb.dmm
index 459e2a312c13..4a0cc491f768 100644
--- a/_maps/RandomRuins/SpaceRuins/dragoontomb.dmm
+++ b/_maps/RandomRuins/SpaceRuins/dragoontomb.dmm
@@ -65,7 +65,7 @@
/obj/structure/stone_tile/cracked{
dir = 8
},
-/obj/item/relic/lavaland,
+/obj/item/assembly/relic/lavaland,
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/unpowered/no_grav)
"en" = (
@@ -466,7 +466,7 @@
/area/ruin/unpowered/no_grav)
"Ew" = (
/obj/structure/stone_tile/slab,
-/obj/item/relic/lavaland,
+/obj/item/assembly/relic/lavaland,
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/unpowered/no_grav)
"Fh" = (
@@ -698,7 +698,7 @@
/obj/structure/stone_tile{
dir = 4
},
-/obj/item/relic/lavaland,
+/obj/item/assembly/relic/lavaland,
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/unpowered/no_grav)
"PW" = (
@@ -864,7 +864,7 @@
/turf/closed/wall/tomb,
/area/ruin/unpowered/no_grav)
"WP" = (
-/obj/item/relic/lavaland,
+/obj/item/assembly/relic/lavaland,
/obj/structure/stone_tile/slab,
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/unpowered/no_grav)
diff --git a/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm b/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm
index a98f08c19488..e6013745b638 100644
--- a/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm
+++ b/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm
@@ -233,7 +233,7 @@
/area/ruin/space/unpowered)
"pl" = (
/obj/structure/table,
-/obj/item/relic{
+/obj/item/assembly/relic{
pixel_y = 5
},
/turf/open/floor/mineral/plastitanium/red/airless,
diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
index 2a24e4b989a7..a4b3caaa014b 100644
--- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
@@ -7694,7 +7694,7 @@
/obj/structure/closet/crate/secure/science{
req_access = list("away_science")
},
-/obj/item/relic,
+/obj/item/assembly/relic,
/obj/item/transfer_valve,
/obj/item/raw_anomaly_core/bluespace,
/obj/item/raw_anomaly_core/random,
diff --git a/_maps/RandomRuins/SpaceRuins/pod_crash.dmm b/_maps/RandomRuins/SpaceRuins/pod_crash.dmm
index 98062e3e59ca..ae0610c4ec04 100644
--- a/_maps/RandomRuins/SpaceRuins/pod_crash.dmm
+++ b/_maps/RandomRuins/SpaceRuins/pod_crash.dmm
@@ -38,7 +38,7 @@
},
/obj/effect/mob_spawn/corpse/human/cargo_tech,
/obj/effect/decal/cleanable/glass/titanium,
-/obj/item/modular_computer/pda/cargo,
+/obj/item/modular_computer/pda/crew/cargo,
/obj/effect/decal/cleanable/blood/old,
/obj/effect/decal/cleanable/dirt,
/obj/effect/mapping_helpers/broken_floor,
diff --git a/_maps/RandomZLevels/heretic.dmm b/_maps/RandomZLevels/heretic.dmm
index a341d6e28ddb..6746d0d080d3 100644
--- a/_maps/RandomZLevels/heretic.dmm
+++ b/_maps/RandomZLevels/heretic.dmm
@@ -8176,7 +8176,7 @@
"Qz" = (
/obj/structure/table,
/obj/machinery/light/floor,
-/obj/item/gun/energy/shrink_ray/one_shot,
+/obj/item/gun/energy/recharge/shrink_ray/one_shot,
/turf/open/floor/iron/large,
/area/awaymission/caves/heretic_laboratory_clean)
"QA" = (
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm
index 44a446d9480d..beb2169e86cc 100644
--- a/_maps/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/RandomZLevels/moonoutpost19.dmm
@@ -6830,9 +6830,9 @@
/area/awaymission/moonoutpost19/arrivals)
"WP" = (
/obj/structure/table,
-/obj/item/mmi,
-/obj/item/mmi,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
+/obj/item/brain_processor/organic,
+/obj/item/brain_processor/organic,
/obj/structure/alien/weeds,
/obj/effect/turf_decal/stripes/line{
dir = 1
diff --git a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
index ba90617d069d..f9b462f3c7e6 100644
--- a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
+++ b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
@@ -20274,9 +20274,9 @@
/area/station/service/kitchen)
"fqD" = (
/obj/structure/table,
-/obj/item/mmi,
-/obj/item/mmi,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
+/obj/item/brain_processor/organic,
+/obj/item/brain_processor/organic,
/obj/effect/turf_decal/tile/dark_blue/anticorner,
/obj/item/borg/upgrade/rename{
pixel_y = 14
@@ -35079,7 +35079,7 @@
/area/station/service/kitchen/abandoned)
"jpG" = (
/obj/structure/table/reinforced,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/turf/open/floor/iron/dark/textured_large,
/area/station/ai/satellite/chamber)
"jqd" = (
@@ -64748,6 +64748,7 @@
pixel_x = 5;
pixel_y = 2
},
+/obj/item/producepad,
/turf/open/floor/iron/dark,
/area/station/service/hydroponics)
"rkM" = (
@@ -65362,6 +65363,7 @@
id = "hydropony_shutters";
name = "Hydroponics Shutters"
},
+/obj/item/producepad,
/turf/open/floor/iron/dark/smooth_large,
/area/station/service/kitchen)
"rtf" = (
@@ -74997,7 +74999,7 @@
/area/station/hallway/secondary/command)
"tXT" = (
/obj/structure/table,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/obj/effect/turf_decal/trimline/purple/filled/line,
/obj/machinery/camera/autoname/directional/south,
/turf/open/floor/iron/dark,
@@ -83864,7 +83866,7 @@
/area/station/medical/pharmacy)
"wlx" = (
/obj/structure/rack,
-/obj/effect/spawner/random/maintenance,
+/obj/effect/spawner/random/maintenance/no_decals,
/obj/item/storage/toolbox/fishing,
/obj/item/storage/box/lights/mixed{
pixel_x = -8;
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 11cee3833fc6..5d47ff966340 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -836,8 +836,8 @@
"akf" = (
/obj/structure/table/reinforced,
/obj/item/bodypart/chest/robot,
-/obj/item/mmi,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
+/obj/item/brain_processor/organic,
/obj/structure/extinguisher_cabinet/directional/north,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
@@ -8718,7 +8718,7 @@
/turf/open/floor/iron/dark,
/area/station/engineering/atmos)
"ccY" = (
-/obj/item/relic,
+/obj/item/assembly/relic,
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/crate/cardboard,
/obj/item/book/manual/wiki/experimentor,
@@ -15706,7 +15706,7 @@
dir = 6
},
/obj/structure/table,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/obj/machinery/camera/autoname/directional/south,
/turf/open/floor/iron/dark,
/area/station/engineering/circuit_workshop)
@@ -17206,7 +17206,7 @@
network = list("ss13","rd")
},
/obj/structure/table,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/science/circuits)
@@ -30708,7 +30708,7 @@
"hxT" = (
/obj/structure/table/reinforced,
/obj/structure/sign/poster/official/random/directional/south,
-/obj/item/relic,
+/obj/item/assembly/relic,
/obj/effect/spawner/random/maintenance,
/obj/effect/turf_decal/tile/neutral/half/contrasted,
/turf/open/floor/iron,
@@ -32095,7 +32095,7 @@
/obj/machinery/door/firedoor/border_only{
dir = 1
},
-/obj/item/relic,
+/obj/item/assembly/relic,
/obj/item/assembly/signaler{
pixel_x = 6;
pixel_y = 5
@@ -41380,7 +41380,7 @@
/area/station/maintenance/port/aft)
"kfj" = (
/obj/structure/table/reinforced,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/obj/item/assembly/prox_sensor,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
@@ -42829,7 +42829,7 @@
/obj/structure/table/reinforced,
/obj/item/crowbar,
/obj/item/wrench,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/obj/machinery/status_display/ai/directional/east,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
@@ -43424,6 +43424,7 @@
},
/obj/item/paper_bin,
/obj/item/pen,
+/obj/item/producepad,
/turf/open/floor/iron,
/area/station/service/hydroponics)
"kGA" = (
@@ -71332,6 +71333,7 @@
},
/obj/item/storage/bag/plants,
/obj/item/reagent_containers/cup/watering_can,
+/obj/item/producepad,
/turf/open/floor/iron,
/area/station/service/kitchen)
"rES" = (
@@ -88668,9 +88670,9 @@
/area/station/maintenance/department/science/xenobiology)
"vPV" = (
/obj/structure/table/reinforced,
-/obj/item/mmi,
-/obj/item/mmi,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
+/obj/item/brain_processor/organic,
+/obj/item/brain_processor/organic,
/obj/structure/sign/departments/medbay/alt/directional/south,
/obj/machinery/status_display/ai/directional/west,
/turf/open/floor/iron,
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index 081c77c3965f..1efde3349bc3 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -8,18 +8,16 @@
/obj/structure/sign/warning/radiation/rad_area/directional/north,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
-"aap" = (
-/obj/effect/spawner/random/engineering/tracking_beacon,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
-"aaq" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"aax" = (
/turf/open/floor/plating,
/area/station/maintenance/central/greater)
+"aay" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 5
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
"aaI" = (
/obj/structure/closet/wardrobe/white,
/obj/item/clothing/shoes/jackboots,
@@ -116,6 +114,13 @@
},
/turf/open/floor/iron,
/area/station/science/robotics/lab)
+"abN" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/machinery/meter/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"abT" = (
/obj/structure/table,
/obj/item/folder/white,
@@ -171,6 +176,11 @@
/obj/effect/turf_decal/tile/neutral/half/contrasted,
/turf/open/floor/iron,
/area/station/commons/fitness)
+"acS" = (
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/spawner/structure/window/reinforced/plasma,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/project)
"adf" = (
/obj/structure/table,
/obj/machinery/recharger{
@@ -209,6 +219,16 @@
},
/turf/open/lava/plasma/ice_moon,
/area/icemoon/underground/explored)
+"adM" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4{
+ dir = 10
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"adP" = (
/obj/machinery/door/firedoor{
dir = 8
@@ -228,6 +248,13 @@
},
/turf/open/misc/asteroid/snow/coldroom,
/area/icemoon/underground/explored)
+"adX" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible,
+/obj/effect/turf_decal/siding/wideplating/corner{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"adY" = (
/obj/structure/cable,
/obj/effect/spawner/structure/window/reinforced,
@@ -251,16 +278,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
-"aen" = (
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
- dir = 5
- },
-/obj/effect/turf_decal/siding/wideplating{
- dir = 1
- },
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
"aer" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 4
@@ -308,14 +325,6 @@
/obj/effect/spawner/random/structure/crate,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
-"afR" = (
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 10
- },
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"afU" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 4
@@ -396,19 +405,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/mine/production)
-"agY" = (
-/obj/machinery/door/poddoor/shutters/window/preopen{
- dir = 1;
- id = "Atmospherics Project Shutters";
- name = "Atmospherics Project Shutters"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/trimline/yellow/warning{
- dir = 1
- },
-/obj/machinery/door/firedoor/heavy,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"ahm" = (
/obj/machinery/newscaster/directional/west,
/obj/machinery/firealarm/directional/south,
@@ -451,6 +447,25 @@
/obj/structure/platform/iron,
/turf/open/floor/iron/dark/textured,
/area/station/security/range)
+"aij" = (
+/obj/machinery/atmospherics/components/tank/plasma{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/turf/open/floor/iron/dark/textured_large,
+/area/station/maintenance/disposal/incinerator)
+"aim" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"ait" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -477,11 +492,6 @@
dir = 1
},
/area/station/command/heads_quarters/rd)
-"aiJ" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"aiQ" = (
/obj/machinery/modular_computer/preset/id,
/obj/machinery/computer/security/telescreen/vault/directional/north,
@@ -663,16 +673,29 @@
/obj/machinery/light/small/directional/north,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
+"alj" = (
+/obj/machinery/camera/directional/west{
+ c_tag = "Atmospherics - Air"
+ },
+/turf/open/floor/engine/air,
+/area/station/engineering/atmos)
+"alo" = (
+/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{
+ color = "#0000ff";
+ dir = 4;
+ name = "Supply multi deck pipe adapter"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"alp" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/directional/west,
/turf/open/floor/catwalk_floor/iron_smooth,
/area/station/security/eva)
-"alq" = (
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/iron/grimy,
-/area/station/maintenance/aft/greater)
"alv" = (
/obj/machinery/holopad,
/obj/structure/cable,
@@ -716,21 +739,6 @@
"alT" = (
/turf/open/floor/carpet,
/area/station/command/heads_quarters/qm)
-"amg" = (
-/obj/machinery/door/poddoor/shutters/window/preopen{
- dir = 4;
- id = "Atmospherics HFR Shutters";
- name = "Atmospherics HFR Shutters"
- },
-/obj/effect/turf_decal/trimline/yellow/warning{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/door/firedoor/heavy,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"ami" = (
/obj/structure/cable,
/turf/open/floor/iron/corner{
@@ -848,14 +856,6 @@
/obj/structure/sign/warning/no_smoking/circle/directional/north,
/turf/open/floor/iron/dark/telecomms,
/area/station/tcommsat/server)
-"anI" = (
-/obj/effect/turf_decal/stripes/red/line{
- dir = 8
- },
-/obj/machinery/light/directional/east,
-/obj/structure/sign/warning/no_smoking/directional/east,
-/turf/open/floor/iron/textured,
-/area/station/engineering/atmos)
"anK" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 4
@@ -959,6 +959,13 @@
},
/turf/open/floor/iron/white,
/area/station/medical/virology)
+"aoF" = (
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 5
+ },
+/turf/open/openspace/icemoon/keep_below,
+/area/icemoon/underground/explored)
"aoM" = (
/obj/structure/table,
/obj/effect/turf_decal/siding/white{
@@ -1146,6 +1153,12 @@
},
/turf/open/floor/iron,
/area/station/command/bridge)
+"aqF" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/underground/explored)
"aqH" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 10
@@ -1217,6 +1230,12 @@
/obj/effect/turf_decal/tile/green/full,
/turf/open/floor/iron/dark/smooth_large,
/area/station/medical/virology)
+"arC" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/mix_input{
+ dir = 1
+ },
+/turf/open/floor/engine/airless,
+/area/station/engineering/atmos)
"arG" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -1300,11 +1319,6 @@
},
/turf/open/floor/iron,
/area/mine/production)
-"asM" = (
-/obj/machinery/light/directional/east,
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"asN" = (
/obj/effect/turf_decal/tile/bar/opposingcorners,
/obj/machinery/status_display/ai/directional/north,
@@ -1510,6 +1524,10 @@
dir = 1
},
/area/station/hallway/secondary/exit/departure_lounge)
+"avf" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"avh" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth,
@@ -1519,15 +1537,6 @@
/obj/structure/sign/warning/cold_temp/directional/north,
/turf/open/floor/iron/smooth,
/area/mine/eva)
-"avk" = (
-/obj/machinery/duct,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/iron/dark/corner{
- dir = 1
- },
-/area/station/engineering/atmos)
"avq" = (
/obj/structure/table,
/obj/effect/turf_decal/tile/dark_green{
@@ -1571,6 +1580,13 @@
/obj/effect/landmark/firealarm_sanity,
/turf/open/floor/iron/white,
/area/station/maintenance/aft/greater)
+"avU" = (
+/obj/effect/spawner/structure/window/ice,
+/obj/machinery/atmospherics/pipe/heat_exchanging/junction{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"awa" = (
/turf/open/openspace,
/area/station/science/ordnance/office)
@@ -1667,31 +1683,11 @@
/obj/item/radio/intercom/directional/north,
/turf/open/floor/iron/dark,
/area/station/science/robotics/lab)
-"awL" = (
-/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/dark_red/line,
-/obj/effect/turf_decal/trimline/dark_red/line{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_blue/mid_joiner{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"awM" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/obj/machinery/light/small/directional/north,
/turf/open/floor/iron/dark,
/area/station/security/courtroom)
-"awO" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/item/trash/raisins,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"awR" = (
/obj/machinery/conveyor{
dir = 1;
@@ -1704,6 +1700,15 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/disposal)
+"awW" = (
+/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/white{
+ color = "#008000"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"axd" = (
/obj/structure/table,
/obj/item/mod/module/plasma_stabilizer,
@@ -1805,22 +1810,6 @@
/obj/structure/sign/poster/random/directional/north,
/turf/open/floor/plating,
/area/station/maintenance/aft/greater)
-"ayq" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
- cycle_id = "atmos-entrance"
- },
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/duct,
-/obj/machinery/door/airlock/atmos/glass{
- name = "Atmospherics"
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos)
-"ayC" = (
-/obj/structure/stairs/west,
-/turf/open/floor/iron/smooth,
-/area/station/engineering/lobby)
"ayG" = (
/obj/structure/lattice/catwalk,
/obj/structure/railing/corner,
@@ -1860,6 +1849,29 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron,
/area/mine/laborcamp)
+"azd" = (
+/obj/structure/table,
+/obj/item/storage/belt/utility,
+/obj/item/t_scanner,
+/obj/item/t_scanner,
+/obj/item/t_scanner,
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = -8
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = -8
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = 4
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/storage/gas)
"aze" = (
/obj/structure/railing{
dir = 8
@@ -1891,10 +1903,6 @@
/obj/structure/cable,
/turf/open/floor/iron/dark/smooth_large,
/area/station/command/heads_quarters/hos)
-"azB" = (
-/obj/effect/turf_decal/bot_red,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"azN" = (
/obj/structure/rack,
/obj/item/tank/internals/emergency_oxygen{
@@ -1912,6 +1920,26 @@
/obj/effect/turf_decal/delivery/red,
/turf/open/floor/iron/dark/textured,
/area/station/hallway/secondary/entry)
+"azS" = (
+/obj/effect/turf_decal/tile/purple/opposingcorners,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
+"azU" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/machinery/light_switch/directional/north{
+ pixel_x = -6
+ },
+/obj/structure/cable,
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos/mix)
"aAe" = (
/obj/structure/window/reinforced/spawner/directional/south,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -1926,6 +1954,29 @@
/obj/effect/turf_decal/tile/blue/half/contrasted,
/turf/open/floor/iron,
/area/station/command/bridge)
+"aAA" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/sign/warning/cold_temp/directional/north,
+/obj/machinery/camera/directional/north{
+ c_tag = "Xenobiology Pens Hall - Fore";
+ network = list("ss13","rd","xeno")
+ },
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
+"aAK" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow,
+/turf/open/floor/iron/dark/corner{
+ dir = 4
+ },
+/area/station/engineering/atmos)
"aAM" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -1942,6 +1993,21 @@
name = "Holodeck Projector Floor"
},
/area/station/holodeck/rec_center)
+"aBn" = (
+/obj/item/toy/snowball{
+ pixel_x = 3;
+ pixel_y = 1
+ },
+/obj/item/toy/snowball{
+ pixel_x = -9;
+ pixel_y = 9
+ },
+/obj/item/toy/snowball{
+ pixel_x = 6;
+ pixel_y = 5
+ },
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"aBE" = (
/obj/machinery/door/airlock{
name = "Custodial Closet"
@@ -2104,6 +2170,12 @@
/obj/item/binoculars,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
+"aDm" = (
+/obj/machinery/space_heater,
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/structure/sign/warning/gas_mask/directional/west,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"aDo" = (
/obj/structure/chair/office{
dir = 4
@@ -2112,6 +2184,19 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/wood,
/area/station/service/library)
+"aDp" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/red/line{
+ dir = 4
+ },
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"aDr" = (
/obj/machinery/vending/cigarette,
/obj/machinery/light/small/directional/south,
@@ -2135,6 +2220,12 @@
/obj/effect/spawner/structure/window/hollow/reinforced/middle,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"aDN" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"aDS" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -2232,6 +2323,13 @@
/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"aFq" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/structure/cable,
+/turf/open/floor/iron/freezer,
+/area/station/science/xenobiology)
"aFt" = (
/obj/machinery/dna_scannernew,
/turf/open/floor/iron/dark,
@@ -2276,6 +2374,20 @@
dir = 10
},
/area/station/science/research)
+"aGt" = (
+/obj/machinery/camera/directional/west{
+ c_tag = "Xenobiology Kill Chamber";
+ network = list("ss13","rd","xeno")
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/iron/freezer,
+/area/station/science/xenobiology)
"aGB" = (
/obj/machinery/telecomms/processor/preset_two,
/turf/open/floor/iron/dark/telecomms,
@@ -2296,23 +2408,6 @@
/obj/machinery/portable_atmospherics/canister,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
-"aHt" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/obj/structure/table/reinforced,
-/obj/machinery/button/door/incinerator_vent_atmos_aux{
- pixel_x = -6;
- pixel_y = -1
- },
-/obj/machinery/button/door/incinerator_vent_atmos_main{
- pixel_x = 6;
- pixel_y = -1
- },
-/obj/machinery/button/ignition/incinerator/atmos{
- pixel_y = 9
- },
-/turf/open/floor/iron/dark,
-/area/station/maintenance/disposal/incinerator)
"aHz" = (
/obj/structure/cable,
/obj/effect/spawner/structure/window/reinforced,
@@ -2423,6 +2518,12 @@
/obj/structure/closet/toolcloset,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"aIJ" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
+ dir = 4
+ },
+/turf/open/floor/glass/reinforced,
+/area/station/engineering/atmos)
"aIN" = (
/obj/machinery/door/window/brigdoor/security/cell/left/directional/west{
id = "Cell 3";
@@ -2618,14 +2719,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/science/xenobiology)
-"aLJ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"aLX" = (
/obj/machinery/door/airlock/maintenance,
/obj/structure/cable,
@@ -2672,6 +2765,16 @@
/obj/structure/sign/poster/contraband/random/directional/west,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/central)
+"aMj" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{
+ dir = 2
+ },
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
"aMr" = (
/obj/structure/chair/office{
dir = 4
@@ -2843,15 +2946,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/engineering/engine_smes)
-"aPk" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible,
-/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"aPl" = (
/obj/effect/turf_decal/tile/purple,
/obj/machinery/camera/directional/south{
@@ -2859,6 +2953,12 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
+"aPs" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"aPA" = (
/obj/structure/fence{
dir = 2;
@@ -2880,6 +2980,14 @@
/obj/machinery/light/floor,
/turf/open/floor/iron/dark/textured,
/area/station/security/warden)
+"aPP" = (
+/obj/effect/spawner/structure/window/reinforced/plasma,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/maintenance/disposal/incinerator)
"aPV" = (
/obj/effect/spawner/random/trash/mess,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -2898,11 +3006,6 @@
/obj/item/clothing/shoes/jackboots,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"aQj" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/siding/wood,
-/turf/open/floor/wood,
-/area/station/maintenance/aft/greater)
"aQm" = (
/obj/structure/sign/warning/directional/west,
/obj/machinery/light/small/directional/west,
@@ -2949,6 +3052,13 @@
/obj/effect/turf_decal/tile/yellow/fourcorners,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
+"aRc" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/red/line,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"aRe" = (
/obj/structure/cable/multilayer/multiz,
/obj/effect/turf_decal/stripes/line{
@@ -3013,14 +3123,6 @@
},
/turf/open/floor/iron/dark,
/area/station/ai/satellite/interior)
-"aRR" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden,
-/turf/open/floor/iron/large,
-/area/station/engineering/atmos/storage/gas)
"aRX" = (
/obj/machinery/light_switch/directional/west,
/obj/machinery/camera/directional/west{
@@ -3032,13 +3134,6 @@
},
/turf/open/floor/iron,
/area/station/commons/vacant_room/commissary)
-"aSe" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Mix Outlet Pump"
- },
-/turf/open/floor/glass/reinforced,
-/area/station/engineering/atmos/pumproom)
"aSh" = (
/obj/effect/turf_decal/loading_area{
dir = 4
@@ -3059,6 +3154,12 @@
/obj/effect/turf_decal/box,
/turf/open/floor/iron/dark,
/area/station/science/ordnance/office)
+"aSE" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input{
+ dir = 1
+ },
+/turf/open/floor/engine/plasma,
+/area/station/engineering/atmos)
"aSH" = (
/obj/machinery/flasher/portable,
/obj/effect/turf_decal/tile/red/half/contrasted,
@@ -3084,18 +3185,6 @@
},
/turf/open/floor/iron/checker,
/area/station/hallway/secondary/service)
-"aSS" = (
-/obj/effect/turf_decal/trimline/dark_red/end,
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/smart/simple/pink/visible,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
-"aTc" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"aTf" = (
/obj/structure/fence/corner{
dir = 10
@@ -3285,19 +3374,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/carpet,
/area/station/service/chapel)
-"aUS" = (
-/obj/machinery/meter{
- name = "Mixed Air Tank In"
- },
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
-/turf/closed/wall/r_wall,
-/area/station/engineering/atmos)
-"aUT" = (
-/obj/effect/spawner/random/structure/crate,
-/obj/effect/mapping_helpers/broken_floor,
-/obj/structure/sign/poster/random/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"aVb" = (
/obj/effect/turf_decal/siding/wood{
dir = 1
@@ -3363,6 +3439,15 @@
/obj/item/radio/intercom/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/virology)
+"aVY" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/status_display/ai/directional/east,
+/turf/open/floor/iron/textured,
+/area/station/engineering/atmos/mix)
"aWc" = (
/obj/structure/railing{
dir = 8
@@ -3418,6 +3503,14 @@
/obj/machinery/light/small/dim/directional/north,
/turf/open/floor/iron/white/textured_large,
/area/station/medical/medbay/central)
+"aXj" = (
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/mapping_helpers/airlock/access/all/science/ordnance,
+/obj/machinery/door/airlock/maintenance{
+ name = "Ordnance Lab Maintenance"
+ },
+/turf/open/floor/iron/white,
+/area/station/science/ordnance/office)
"aXl" = (
/obj/machinery/firealarm/directional/east,
/obj/structure/railing,
@@ -3441,6 +3534,25 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"aXu" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
+"aXB" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Basement to Pure";
+ dir = 8
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/corners,
+/turf/open/floor/iron/textured_large,
+/area/station/engineering/atmos)
"aXG" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -3493,6 +3605,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/freezer,
/area/station/service/kitchen/coldroom)
+"aYI" = (
+/obj/machinery/door/airlock/maintenance,
+/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
+/obj/effect/mapping_helpers/airlock/unres/delayed{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/airlock/abandoned,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"aYJ" = (
/turf/open/floor/iron/white,
/area/station/science/research)
@@ -3599,6 +3720,10 @@
dir = 8
},
/area/station/engineering/atmos/storage/gas)
+"aZZ" = (
+/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,
+/turf/open/misc/asteroid/snow/icemoon,
+/area/icemoon/surface/outdoors/less_spawns)
"baf" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -3664,13 +3789,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/science/ordnance)
-"baQ" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"baR" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -3697,6 +3815,12 @@
},
/turf/open/floor/iron,
/area/station/command/heads_quarters/rd)
+"bba" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/supply/visible{
+ dir = 8
+ },
+/turf/open/floor/glass/reinforced,
+/area/station/engineering/atmos/pumproom)
"bbo" = (
/turf/open/floor/iron,
/area/station/construction)
@@ -3706,14 +3830,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
-"bbs" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- dir = 4;
- initialize_directions = 8
- },
-/obj/effect/turf_decal/bot_red,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"bbv" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -3900,6 +4016,23 @@
/obj/effect/spawner/structure/window/reinforced/plasma,
/turf/open/floor/plating/icemoon,
/area/station/engineering/atmos)
+"bej" = (
+/obj/machinery/light/small/directional/west,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/duct,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/line,
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"ben" = (
/obj/machinery/bluespace_beacon,
/obj/effect/turf_decal/stripes/line{
@@ -3932,6 +4065,12 @@
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
+"beS" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"beW" = (
/obj/machinery/vending/security,
/obj/item/radio/intercom/directional/north,
@@ -3952,6 +4091,12 @@
/obj/effect/spawner/structure/window/hollow/reinforced/end,
/turf/open/floor/plating,
/area/mine/eva/lower)
+"bfI" = (
+/obj/structure/reagent_dispensers/fueltank,
+/obj/effect/turf_decal/tile/purple/opposingcorners,
+/obj/machinery/light/small/dim/directional/east,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"bfL" = (
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -3984,13 +4129,6 @@
},
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
-"bfU" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage/gas)
"bfV" = (
/obj/structure/table/wood,
/obj/effect/turf_decal/siding/wood/corner{
@@ -3998,19 +4136,25 @@
},
/turf/open/floor/wood,
/area/station/security/courtroom)
+"bga" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/binary/pump/layer2{
+ dir = 8;
+ name = "Basement Input"
+ },
+/obj/machinery/light/small/directional/north,
+/obj/effect/turf_decal/box,
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos/hfr_room)
"bge" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/crate,
/obj/effect/spawner/random/maintenance/two,
/turf/open/floor/plating,
/area/station/maintenance/aft/greater)
-"bgs" = (
-/obj/structure/sign/poster/random/directional/east,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"bgx" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/starboard/aft)
@@ -4121,6 +4265,18 @@
},
/turf/open/floor/plating,
/area/mine/production)
+"bif" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/blue/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"bin" = (
/obj/effect/turf_decal/stripes/asteroid/line{
dir = 4
@@ -4134,6 +4290,10 @@
dir = 8
},
/area/mine/living_quarters)
+"bir" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"bit" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/rack,
@@ -4180,16 +4340,6 @@
/obj/effect/turf_decal/tile/yellow/full,
/turf/open/floor/iron/white/smooth_large,
/area/station/medical/pharmacy)
-"biU" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/machinery/duct,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"biY" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/port/fore)
@@ -4226,6 +4376,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
+"bjm" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output{
+ dir = 1
+ },
+/turf/open/floor/engine/plasma,
+/area/station/engineering/atmos)
"bjn" = (
/obj/machinery/door/window/left/directional/east{
name = "Containment Pen 11";
@@ -4289,6 +4445,13 @@
},
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
+"bkf" = (
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/hallway/primary/aft)
"bkg" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/small/directional/north,
@@ -4558,38 +4721,34 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/command/vault)
-"bnL" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/door/airlock/maintenance_hatch,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
+"bnX" = (
+/obj/machinery/button/door/directional/east{
+ id = "xenobio7";
+ name = "Xenobio Pen 7 Blast Door";
+ req_access = list("xenobiology")
+ },
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"bnZ" = (
/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible/layer2{
dir = 1
},
/turf/open/floor/iron,
/area/station/science/ordnance)
-"boc" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Exfiltrate to Waste"
+"bog" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{
+ dir = 8
},
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/structure/railing/corner/end{
- dir = 4
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
+/obj/machinery/duct,
+/obj/effect/turf_decal/trimline/red/line,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"bol" = (
/turf/open/floor/iron/dark/textured,
/area/station/security/prison)
-"bos" = (
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
- dir = 5
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"boC" = (
/obj/structure/railing/corner/end{
dir = 8
@@ -4603,6 +4762,13 @@
/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible,
/turf/closed/wall/r_wall,
/area/station/maintenance/department/medical/central)
+"boR" = (
+/obj/effect/turf_decal/box/white{
+ color = "#0077AA"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/engine,
+/area/station/engineering/atmos/hfr_room)
"boS" = (
/obj/structure/disposaloutlet{
dir = 4
@@ -4628,6 +4794,14 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark/textured,
/area/station/engineering/engine_smes)
+"bph" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/project)
"bpm" = (
/obj/effect/turf_decal/tile/red/anticorner/contrasted{
dir = 4
@@ -4673,14 +4847,6 @@
/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
-"bpw" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/landmark/event_spawn,
-/obj/structure/railing/corner/end/flip{
- dir = 4
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"bpK" = (
/obj/machinery/door/airlock/maintenance,
/obj/effect/mapping_helpers/airlock/unres/delayed,
@@ -4693,10 +4859,6 @@
/obj/machinery/airalarm/directional/north,
/turf/open/floor/plating,
/area/station/maintenance/department/electrical)
-"bpR" = (
-/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"bpT" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -4759,6 +4921,14 @@
/obj/machinery/airalarm/directional/west,
/turf/open/floor/circuit,
/area/station/ai/satellite/hallway)
+"bqC" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Pure to Filter";
+ dir = 8
+ },
+/obj/effect/turf_decal/box/red,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"bqF" = (
/obj/structure/chair{
dir = 4
@@ -4879,16 +5049,6 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"bsg" = (
-/obj/effect/landmark/start/hangover,
-/obj/effect/turf_decal/siding/yellow{
- dir = 1
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/iron/large,
-/area/station/engineering/lobby)
"bsi" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
@@ -5087,22 +5247,6 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/iron/large,
/area/station/engineering/storage_shared)
-"buo" = (
-/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/engineering/atmos/pumproom)
-"buv" = (
-/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{
- color = "#ff0000";
- dir = 4;
- name = "Scrubbers multi deck pipe adapter"
- },
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"buF" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/structure/chair/sofa/bench/left{
@@ -5415,10 +5559,13 @@
},
/turf/open/floor/iron/dark,
/area/station/commons/storage/primary)
-"byH" = (
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
+"byC" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{
+ dir = 1
+ },
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"byJ" = (
/obj/effect/turf_decal/tile/bar/opposingcorners,
/obj/effect/turf_decal/siding/wood{
@@ -5508,12 +5655,6 @@
/obj/effect/mapping_helpers/airlock/access/all/supply/mining,
/turf/open/floor/iron/large,
/area/mine/mechbay)
-"bzE" = (
-/obj/structure/railing{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"bzQ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -5564,6 +5705,16 @@
dir = 1
},
/area/station/service/chapel)
+"bAL" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos/hfr_room)
"bAX" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
@@ -5605,22 +5756,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/engineering/supermatter/room)
-"bBM" = (
-/obj/effect/decal/cleanable/cobweb,
-/obj/structure/cable,
-/obj/structure/closet/secure_closet/atmospherics,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/disposal/incinerator)
"bBO" = (
/obj/effect/spawner/random/decoration/flower,
/obj/structure/flora/rock/pile/icy/style_random,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
-"bBW" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/engineering/atmos/pumproom)
"bBY" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -5697,6 +5837,16 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/smooth,
/area/station/engineering/lobby)
+"bCI" = (
+/obj/machinery/camera/directional/west{
+ c_tag = "Xenobiology Test Chamber";
+ network = list("ss13","test","rd","xeno")
+ },
+/turf/open/floor/engine/xenobio,
+/area/station/science/xenobiology)
+"bCJ" = (
+/turf/closed/wall/ice,
+/area/station/maintenance/aft/lesser)
"bCN" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
@@ -5721,16 +5871,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
-"bCT" = (
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"bCY" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light_switch/directional/north,
@@ -5751,6 +5891,14 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
+"bDm" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"bDq" = (
/obj/effect/turf_decal/bot,
/obj/machinery/portable_atmospherics/canister/oxygen,
@@ -5828,6 +5976,13 @@
},
/turf/open/floor/iron/dark,
/area/station/service/chapel)
+"bEx" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/green/visible,
+/turf/open/floor/iron/cafeteria,
+/area/station/engineering/atmos)
"bEy" = (
/obj/item/storage/box/bodybags,
/obj/item/reagent_containers/syringe{
@@ -5911,6 +6066,10 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
+"bFo" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible,
+/turf/open/floor/glass/reinforced,
+/area/station/engineering/atmos)
"bFq" = (
/obj/effect/spawner/random/structure/crate,
/turf/open/floor/plating,
@@ -5935,6 +6094,10 @@
},
/turf/open/floor/iron/dark/smooth_half,
/area/station/medical/morgue)
+"bFI" = (
+/obj/machinery/newscaster/directional/north,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"bFP" = (
/obj/structure/fence/corner{
dir = 6
@@ -5962,12 +6125,6 @@
/obj/item/trash/syndi_cakes,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"bGa" = (
-/obj/effect/turf_decal/siding/yellow{
- dir = 8
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"bGc" = (
/obj/machinery/computer/cargo/request,
/obj/effect/turf_decal/tile/brown/half/contrasted,
@@ -6060,14 +6217,6 @@
dir = 4
},
/area/station/command/heads_quarters/rd)
-"bHc" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/railing{
- dir = 4
- },
-/obj/item/kirbyplants/random/dead,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"bHj" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -6079,15 +6228,6 @@
},
/turf/open/floor/iron/dark,
/area/station/engineering/storage/tech)
-"bHu" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/obj/machinery/light_switch/directional/north,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"bHF" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
@@ -6113,15 +6253,10 @@
/obj/effect/turf_decal/tile/yellow/half/contrasted,
/turf/open/floor/iron/white,
/area/station/medical/pharmacy)
-"bIa" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Air to Distro"
- },
-/obj/item/radio/intercom/directional/north,
-/obj/effect/turf_decal/siding/wideplating,
+"bHT" = (
+/obj/effect/turf_decal/tile/green/half/contrasted,
/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
+/area/station/security/prison/garden)
"bIc" = (
/obj/effect/turf_decal/trimline/neutral/warning{
dir = 4
@@ -6193,25 +6328,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/medbay/aft)
-"bIU" = (
-/obj/structure/table,
-/obj/item/stack/sheet/glass/fifty,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos)
-"bIV" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/machinery/button/door/directional/east{
- id = "Atmospherics HFR Shutters";
- name = "Atmospherics HFR Shutters";
- req_access = list("atmospherics")
- },
-/obj/effect/turf_decal/trimline/red/filled/end{
- dir = 4
- },
-/obj/machinery/light/small/red/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"bJa" = (
/obj/structure/railing{
dir = 4
@@ -6243,12 +6359,6 @@
/obj/effect/turf_decal/tile/red/half/contrasted,
/turf/open/floor/iron/dark/textured,
/area/station/security/armory/upper)
-"bJD" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"bJQ" = (
/obj/structure/table/wood,
/obj/item/stack/package_wrap,
@@ -6266,6 +6376,13 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/security/execution/education)
+"bKn" = (
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/blue/line,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"bKp" = (
/obj/machinery/door/airlock/maintenance{
name = "Firefighting Equipment"
@@ -6442,6 +6559,18 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
+"bNh" = (
+/obj/effect/mapping_helpers/broken_floor,
+/obj/structure/railing,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
+"bNx" = (
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wideplating/corner,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"bNy" = (
/obj/item/toy/snowball{
pixel_x = 9;
@@ -6455,22 +6584,6 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
-"bNE" = (
-/obj/machinery/door/airlock/atmos/glass{
- name = "Atmospherics Monitoring"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
- cycle_id = "atmos-entrance"
- },
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage/gas)
"bNJ" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron/dark/side,
@@ -6555,6 +6668,14 @@
},
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
+"bOP" = (
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/textured,
+/area/station/maintenance/disposal/incinerator)
"bOS" = (
/obj/machinery/door/airlock/external{
name = "Escape Pod Three";
@@ -6581,16 +6702,21 @@
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/plating,
/area/station/ai/satellite/maintenance)
+"bPk" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 10
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
"bPl" = (
/obj/structure/table/wood,
/obj/item/folder/blue,
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood,
/area/station/security/courtroom)
-"bPn" = (
-/obj/structure/girder,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"bPp" = (
/obj/machinery/door/firedoor{
dir = 4
@@ -6637,19 +6763,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/port/lesser)
-"bPt" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 8
- },
-/obj/structure/railing{
- dir = 8
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"bPw" = (
/turf/open/floor/iron/grimy,
/area/station/commons/vacant_room/office)
@@ -6667,18 +6780,6 @@
/obj/item/kirbyplants/random/dead,
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
-"bPY" = (
-/obj/machinery/atmospherics/pipe/multiz/pink/visible{
- dir = 8;
- name = "Exfiltrate"
- },
-/obj/effect/turf_decal/tile/neutral/diagonal_centre,
-/obj/effect/turf_decal/tile/red/diagonal_edge,
-/obj/structure/railing{
- dir = 4
- },
-/turf/open/floor/iron/dark/diagonal,
-/area/station/engineering/atmos/storage)
"bQh" = (
/obj/item/radio/intercom/directional/north,
/turf/open/floor/iron/dark/corner{
@@ -6696,6 +6797,11 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/cargo/storage)
+"bQJ" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"bQN" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -6767,26 +6873,10 @@
},
/turf/open/floor/plating,
/area/mine/eva/lower)
-"bRE" = (
-/obj/effect/turf_decal/trimline/yellow/filled/line,
-/obj/machinery/status_display/evac/directional/south,
-/obj/effect/turf_decal/siding/yellow/corner{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"bRG" = (
/obj/effect/turf_decal/tile/red/half/contrasted,
/turf/open/floor/iron,
/area/station/security/brig/upper)
-"bRH" = (
-/obj/structure/grille/broken,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"bRL" = (
/obj/effect/turf_decal/loading_area{
dir = 1
@@ -6867,13 +6957,14 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/engineering/engine_smes)
-"bTx" = (
-/obj/machinery/portable_atmospherics/pump,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
+"bTu" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden,
-/turf/open/floor/iron/showroomfloor,
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 4
+ },
+/turf/open/floor/iron,
/area/station/engineering/atmos)
"bTE" = (
/obj/machinery/door/airlock/external{
@@ -7020,6 +7111,12 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/iron/textured,
/area/station/maintenance/fore)
+"bVI" = (
+/obj/structure/stairs/west,
+/turf/open/floor/iron/stairs/medium{
+ dir = 4
+ },
+/area/station/engineering/atmos/hfr_room)
"bVL" = (
/obj/machinery/space_heater,
/obj/structure/sign/poster/official/random/directional/east,
@@ -7094,19 +7191,18 @@
},
/turf/open/floor/iron/dark/smooth_half,
/area/station/medical/morgue)
-"bWy" = (
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible,
-/obj/machinery/light/floor,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
+"bWE" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/wood,
+/area/station/maintenance/aft/lesser)
"bWH" = (
/turf/open/floor/iron/stairs/medium{
dir = 8
},
/area/station/science/ordnance)
-"bWK" = (
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"bWM" = (
/obj/structure/stairs/south,
/turf/open/floor/iron/stairs/medium{
@@ -7147,10 +7243,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/command/gateway)
-"bXf" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"bXl" = (
/obj/machinery/air_sensor/nitrous_tank,
/turf/open/floor/engine/n2o,
@@ -7158,6 +7250,14 @@
"bXm" = (
/turf/closed/wall,
/area/station/commons/storage/tools)
+"bXn" = (
+/obj/structure/reagent_dispensers/plumbed,
+/obj/effect/turf_decal/bot_white,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/iron/large,
+/area/station/engineering/atmos)
"bXo" = (
/obj/effect/turf_decal/bot{
dir = 1
@@ -7280,17 +7380,6 @@
/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
-"bYY" = (
-/obj/effect/decal/cleanable/cobweb,
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/machinery/duct,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"bZb" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 1
@@ -7475,6 +7564,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
+"cbx" = (
+/obj/machinery/light/warm/directional/north,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/portable_atmospherics/canister,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/maintenance/disposal/incinerator)
"cby" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 8
@@ -7490,23 +7588,6 @@
/obj/machinery/light/small/directional/south,
/turf/open/floor/iron/dark/textured,
/area/station/security/armory)
-"cbC" = (
-/obj/machinery/meter,
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/layer_manifold/pink/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/structure/sign/warning/no_smoking/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage)
-"ccg" = (
-/obj/machinery/light/directional/west,
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"cch" = (
/obj/item/radio/intercom/prison/directional/north,
/obj/effect/turf_decal/tile/red/full,
@@ -7640,13 +7721,6 @@
/obj/machinery/status_display/ai/directional/north,
/turf/open/floor/iron/cafeteria,
/area/station/command/heads_quarters/rd)
-"ccZ" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
- dir = 6
- },
-/obj/structure/lattice/catwalk,
-/turf/open/openspace/icemoon/keep_below,
-/area/icemoon/underground/explored)
"cdg" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk{
@@ -7664,6 +7738,16 @@
},
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
+"cdN" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "Atmospherics Blast Door"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/storage/gas)
"cef" = (
/obj/machinery/biogenerator,
/obj/effect/turf_decal/trimline/green/filled/line{
@@ -7783,21 +7867,6 @@
},
/turf/open/floor/catwalk_floor/iron_smooth,
/area/station/maintenance/fore/lesser)
-"cfl" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 1
- },
-/obj/effect/turf_decal/siding/yellow/corner{
- dir = 8
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"cfr" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -7821,6 +7890,16 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/station/service/hydroponics)
+"cfA" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/cable,
+/obj/machinery/light_switch/directional/west,
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4,
+/obj/structure/disposalpipe/junction{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"cfC" = (
/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
@@ -7937,6 +8016,11 @@
},
/turf/open/floor/glass/reinforced,
/area/station/hallway/primary/starboard)
+"chL" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"chO" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 4
@@ -7995,15 +8079,6 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
-"cip" = (
-/obj/machinery/atmospherics/components/tank/air{
- dir = 3;
- initialize_directions = 3
- },
-/obj/effect/mapping_helpers/burnt_floor,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"ciG" = (
/obj/machinery/door/airlock/external{
name = "Security Yard";
@@ -8029,11 +8104,6 @@
/obj/effect/spawner/random/trash/cigbutt,
/turf/open/floor/iron/dark,
/area/station/science/breakroom)
-"ciU" = (
-/obj/structure/barricade/wooden,
-/obj/structure/sign/warning/cold_temp/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"cjE" = (
/obj/structure/disposalpipe/segment,
/obj/effect/mapping_helpers/airlock/access/all/security/general,
@@ -8093,19 +8163,19 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
-"ckN" = (
-/obj/structure/cable,
-/obj/machinery/newscaster/directional/south,
-/obj/effect/turf_decal/trimline/dark_blue/line,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"ckQ" = (
/obj/structure/rack,
/obj/effect/spawner/random/maintenance/two,
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/turf/open/floor/iron/white,
/area/station/maintenance/port/fore)
+"clh" = (
+/obj/effect/decal/cleanable/blood/tracks,
+/obj/structure/fence/cut/large{
+ dir = 4
+ },
+/turf/open/misc/asteroid/snow/icemoon,
+/area/icemoon/underground/explored)
"cll" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -8122,6 +8192,15 @@
},
/turf/open/floor/iron/smooth_large,
/area/station/cargo/warehouse)
+"clB" = (
+/obj/structure/closet/emcloset,
+/obj/structure/sign/warning/cold_temp/directional/north,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/light/small/dim/directional/east,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"clI" = (
/obj/structure/sign/warning/biohazard/directional/north,
/turf/open/misc/asteroid/snow/icemoon,
@@ -8159,10 +8238,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/general,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
-"cma" = (
-/obj/structure/closet/firecloset,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"cmq" = (
/obj/machinery/door/airlock/external{
name = "External Access"
@@ -8178,18 +8253,6 @@
/obj/structure/sign/warning/electric_shock/directional/north,
/turf/open/floor/plating,
/area/station/maintenance/department/security)
-"cmw" = (
-/obj/machinery/firealarm/directional/north,
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/obj/machinery/atmospherics/components/binary/valve/digital/on{
- dir = 4;
- name = "Exfiltrate Control"
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage)
"cmx" = (
/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -8205,13 +8268,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/break_room)
-"cmJ" = (
-/obj/item/radio/intercom/directional/north,
-/obj/machinery/atmospherics/pipe/smart/simple/general/visible{
- dir = 6
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"cmL" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -8238,16 +8294,6 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/wood,
/area/station/maintenance/space_hut/cabin)
-"cmY" = (
-/obj/effect/turf_decal/tile/neutral/diagonal_centre,
-/obj/machinery/atmospherics/pipe/multiz/pink/visible{
- dir = 4;
- name = "Exfiltrate"
- },
-/obj/effect/turf_decal/tile/red/diagonal_edge,
-/obj/structure/sign/warning/fire/directional/north,
-/turf/open/floor/iron/dark/diagonal,
-/area/station/engineering/atmos/mix)
"cmZ" = (
/obj/item/clothing/suit/hooded/wintercoat/engineering,
/obj/effect/decal/cleanable/blood/old,
@@ -8323,12 +8369,23 @@
/obj/machinery/power/apc/auto_name/directional/east,
/turf/open/floor/iron,
/area/mine/laborcamp)
+"cnN" = (
+/obj/machinery/atmospherics/pipe/layer_manifold/purple/visible,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/station/engineering/atmos)
"cnQ" = (
/obj/effect/turf_decal/tile/brown{
dir = 4
},
/turf/open/floor/iron,
/area/station/commons/storage/mining)
+"cnZ" = (
+/obj/machinery/pipedispenser/disposal,
+/obj/effect/turf_decal/bot_white,
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron/smooth_large,
+/area/station/engineering/atmos)
"cod" = (
/obj/effect/turf_decal/tile/yellow/half/contrasted{
dir = 1
@@ -8341,6 +8398,16 @@
/obj/structure/closet/crate,
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
+"cot" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/machinery/newscaster/directional/west,
+/obj/structure/closet/firecloset,
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"coL" = (
/obj/effect/turf_decal/tile/red/anticorner/contrasted{
dir = 8
@@ -8351,6 +8418,12 @@
/obj/machinery/vending/cola/sodie,
/turf/open/floor/iron,
/area/station/security/prison/visit)
+"coQ" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"coT" = (
/obj/structure/table,
/obj/item/storage/wallet,
@@ -8381,12 +8454,6 @@
/obj/structure/sign/poster/official/random/directional/east,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"cpl" = (
-/obj/machinery/camera/directional/south{
- c_tag = "Atmospherics Storage Room - East"
- },
-/turf/open/openspace,
-/area/station/engineering/atmos/storage)
"cpm" = (
/turf/closed/wall/r_wall,
/area/station/command/heads_quarters/hop)
@@ -8450,6 +8517,13 @@
/obj/effect/turf_decal/box,
/turf/open/floor/iron/freezer,
/area/station/service/kitchen/coldroom)
+"cqd" = (
+/obj/structure/rack,
+/obj/item/crowbar,
+/obj/item/picket_sign,
+/obj/structure/sign/warning/cold_temp/directional/north,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"cqf" = (
/obj/machinery/portable_atmospherics/canister,
/turf/open/floor/plating,
@@ -8508,15 +8582,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"cqO" = (
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"cqW" = (
/obj/vehicle/ridden/secway,
/obj/structure/cable,
@@ -8539,6 +8604,14 @@
/obj/structure/sign/departments/security/directional/west,
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
+"crg" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"crn" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -8635,6 +8708,12 @@
"csT" = (
/turf/open/floor/circuit/telecomms/mainframe,
/area/station/tcommsat/server)
+"csX" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"ctj" = (
/obj/effect/landmark/start/hangover,
/obj/structure/disposalpipe/segment,
@@ -8658,15 +8737,6 @@
/obj/machinery/power/port_gen/pacman/pre_loaded,
/turf/open/floor/plating,
/area/station/maintenance/fore)
-"ctr" = (
-/obj/machinery/portable_atmospherics/pump,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/iron/showroomfloor,
-/area/station/engineering/atmos)
"ctC" = (
/obj/structure/fence/corner{
dir = 8
@@ -8809,6 +8879,15 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/science/ordnance)
+"cvl" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment,
+/obj/machinery/firealarm/directional/east,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"cvn" = (
/obj/effect/turf_decal/siding/white{
dir = 4
@@ -8876,16 +8955,6 @@
},
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"cvN" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"cvS" = (
/turf/closed/wall,
/area/station/maintenance/department/medical/central)
@@ -8901,6 +8970,14 @@
/obj/effect/turf_decal/tile/yellow,
/turf/open/floor/iron,
/area/station/maintenance/port/fore)
+"cwf" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"cwj" = (
/obj/machinery/requests_console/directional/south{
department = "Atmospherics";
@@ -9024,6 +9101,18 @@
dir = 6
},
/area/station/security/prison/safe)
+"cyd" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/effect/turf_decal/stripes/white/line,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos)
"cyh" = (
/obj/structure/cable,
/obj/effect/spawner/structure/window/reinforced,
@@ -9195,13 +9284,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply,
/turf/open/floor/iron/white,
/area/station/medical/virology)
-"cAu" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"cAB" = (
/obj/effect/turf_decal/stripes/line,
/obj/machinery/airalarm/directional/west,
@@ -9262,20 +9344,23 @@
/obj/effect/turf_decal/tile/green/full,
/turf/open/floor/iron/dark/smooth_large,
/area/station/medical/virology)
-"cAR" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden,
-/obj/structure/cable,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/iron/large,
-/area/station/engineering/atmos/storage/gas)
"cAT" = (
/obj/machinery/status_display/evac/directional/north,
/turf/open/floor/iron/dark,
/area/station/medical/chemistry)
+"cBb" = (
+/obj/structure/cable,
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/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/station/maintenance/aft/greater)
"cBk" = (
/obj/machinery/door/firedoor{
dir = 8
@@ -9290,6 +9375,11 @@
},
/turf/open/floor/iron/dark/textured,
/area/station/hallway/primary/central)
+"cBs" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"cBv" = (
/obj/machinery/button/door/directional/east{
id = "misclab";
@@ -9336,6 +9426,16 @@
"cBY" = (
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/unexplored/rivers/deep/shoreline)
+"cCa" = (
+/obj/effect/landmark/start/hangover,
+/obj/effect/turf_decal/siding/yellow{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/turf/open/floor/iron/large,
+/area/station/engineering/lobby)
"cCb" = (
/obj/structure/flora/tree/pine/style_random,
/turf/open/misc/asteroid/snow/icemoon,
@@ -9383,23 +9483,15 @@
/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/medical/virology)
-"cDh" = (
-/obj/structure/grille/broken,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/machinery/duct,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
-"cDk" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/landmark/generic_maintenance_landmark,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+"cDe" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
dir = 4
},
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"cDv" = (
/obj/item/stack/rods/fifty,
/obj/structure/rack,
@@ -9426,13 +9518,6 @@
/obj/effect/mapping_helpers/airlock/unres/delayed,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"cDz" = (
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
- dir = 4
- },
-/obj/machinery/light/floor,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"cDB" = (
/obj/structure/cable,
/obj/effect/turf_decal/siding/yellow/corner{
@@ -9522,6 +9607,14 @@
/obj/effect/spawner/random/trash/cigbutt,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
+"cEJ" = (
+/obj/machinery/door/airlock/external{
+ name = "External Access"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/external,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"cEL" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -9554,6 +9647,12 @@
/obj/effect/spawner/structure/window/reinforced/tinted,
/turf/open/floor/plating,
/area/station/maintenance/fore)
+"cFs" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{
+ dir = 8
+ },
+/turf/closed/wall,
+/area/station/engineering/atmos)
"cFJ" = (
/obj/effect/spawner/random/structure/steam_vent,
/turf/open/floor/plating,
@@ -9595,10 +9694,6 @@
/obj/structure/cable,
/turf/open/floor/iron/dark/smooth_large,
/area/station/command/eva)
-"cGu" = (
-/obj/structure/closet/crate,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"cGA" = (
/turf/open/floor/plating,
/area/station/maintenance/department/medical/central)
@@ -9615,13 +9710,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/carpet/blue,
/area/station/security/prison/work)
-"cGQ" = (
-/obj/structure/sign/poster/official/random/directional/west,
-/obj/effect/turf_decal/tile/green/anticorner/contrasted{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/security/prison/garden)
"cGZ" = (
/obj/machinery/airalarm/directional/north,
/turf/open/floor/iron/stairs/medium{
@@ -9648,12 +9736,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/central)
-"cHm" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"cHs" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -9727,6 +9809,12 @@
/obj/item/coin/diamond,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
+"cII" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"cIP" = (
/obj/machinery/bookbinder,
/obj/structure/sign/poster/official/random/directional/west,
@@ -10086,14 +10174,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/wood,
/area/station/service/lawoffice)
-"cNx" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/duct,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/lobby)
"cNI" = (
/obj/machinery/door/poddoor/preopen{
id = "xenobio7";
@@ -10145,12 +10225,6 @@
},
/turf/open/floor/iron,
/area/station/science/xenobiology)
-"cOi" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output{
- dir = 8
- },
-/turf/open/floor/engine/vacuum,
-/area/station/engineering/atmos)
"cOp" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/red/half,
@@ -10198,6 +10272,11 @@
/obj/machinery/airalarm/directional/north,
/turf/open/floor/iron,
/area/station/security/prison/mess)
+"cPc" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/effect/turf_decal/weather/snow,
+/turf/open/floor/plating/icemoon,
+/area/icemoon/underground/explored)
"cPd" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -10222,6 +10301,11 @@
dir = 1
},
/area/station/commons/storage/mining)
+"cPn" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/reagent_dispensers/watertank,
+/turf/open/floor/iron/showroomfloor,
+/area/station/maintenance/department/medical/morgue)
"cPp" = (
/obj/item/stack/cable_coil{
amount = 5
@@ -10283,12 +10367,6 @@
/obj/machinery/wall_healer/directional/south,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
-"cQr" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light/small/directional/south,
-/obj/machinery/portable_atmospherics/canister/air,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"cQw" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/brown{
@@ -10346,10 +10424,32 @@
/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner,
/turf/open/floor/iron/dark/smooth_large,
/area/station/medical/morgue)
+"cQX" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 9
+ },
+/turf/open/floor/glass/reinforced,
+/area/station/engineering/atmos/pumproom)
"cRg" = (
/obj/structure/cable,
/turf/open/floor/iron/dark/textured,
/area/station/security/warden)
+"cRh" = (
+/obj/structure/grille/broken,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
+"cRn" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 10
+ },
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"cRq" = (
/obj/structure/table,
/obj/item/holosign_creator/atmos{
@@ -10389,6 +10489,19 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central)
+"cRI" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/machinery/door/firedoor,
+/obj/effect/mapping_helpers/airlock/unres/delayed,
+/obj/effect/mapping_helpers/airlock/access/all/science/ordnance,
+/obj/machinery/door/airlock/maintenance{
+ name = "Ordnance Lab Maintenance"
+ },
+/turf/open/floor/plating,
+/area/station/science/ordnance/testlab)
"cRK" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -10405,10 +10518,14 @@
/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
-"cRO" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/turf/closed/wall,
-/area/station/engineering/atmos)
+"cRW" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/obj/effect/turf_decal/tile/green/half/contrasted{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/station/security/prison/garden)
"cSe" = (
/obj/structure/table,
/obj/item/flashlight{
@@ -10426,6 +10543,16 @@
initial_gas_mix = "ICEMOON_ATMOS"
},
/area/icemoon/underground/explored)
+"cSk" = (
+/obj/structure/table,
+/obj/item/tgui_book/manual/dsm{
+ pixel_y = 5;
+ pixel_x = 3
+ },
+/obj/item/book/manual/wiki/tgc,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/wood,
+/area/station/maintenance/aft/lesser)
"cSo" = (
/obj/machinery/conveyor{
id = "gulag";
@@ -10467,12 +10594,27 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
+"cTe" = (
+/obj/machinery/duct,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron,
+/area/station/engineering/lobby)
"cTh" = (
/obj/structure/table/wood,
/obj/item/paper_bin,
/obj/item/pen,
/turf/open/floor/iron/grimy,
/area/station/commons/vacant_room/office)
+"cTn" = (
+/obj/structure/sign/warning/docking/directional/north,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"cTs" = (
/obj/machinery/door/firedoor,
/obj/structure/cable,
@@ -10552,6 +10694,13 @@
/obj/machinery/status_display/ai/directional/south,
/turf/open/floor/iron/dark,
/area/station/service/hydroponics)
+"cUV" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/project)
"cVk" = (
/obj/item/storage/box/evidence{
pixel_x = -10;
@@ -10592,13 +10741,18 @@
},
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
-"cWq" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/obj/effect/turf_decal/tile/green/half/contrasted{
+"cWs" = (
+/obj/effect/turf_decal/stripes/corner{
dir = 1
},
-/turf/open/floor/iron,
-/area/station/security/prison/garden)
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/obj/structure/cable,
+/obj/effect/landmark/event_spawn,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
+ dir = 10
+ },
+/turf/open/floor/iron/large,
+/area/station/engineering/atmos/storage/gas)
"cWC" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -10612,6 +10766,18 @@
/obj/effect/spawner/structure/window/reinforced/tinted,
/turf/open/floor/plating,
/area/station/service/chapel/office)
+"cWS" = (
+/obj/effect/turf_decal/siding/wideplating/corner{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos/pumproom)
"cWX" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -10668,21 +10834,6 @@
/obj/machinery/light/floor,
/turf/open/floor/wood,
/area/station/commons/lounge)
-"cXR" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/sign/warning/cold_temp/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
-"cXV" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/trimline/dark_red/filled/line{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"cXX" = (
/obj/machinery/door/window/right/directional/west{
name = "Containment Pen 11";
@@ -10700,20 +10851,6 @@
/obj/machinery/newscaster/directional/north,
/turf/open/floor/iron/grimy,
/area/station/security/detectives_office)
-"cYi" = (
-/obj/effect/turf_decal/trimline/dark_red/line,
-/obj/effect/turf_decal/trimline/dark_red/line{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_blue/mid_joiner{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"cYj" = (
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/stripes/white/line,
@@ -10731,6 +10868,13 @@
},
/turf/open/floor/wood,
/area/station/command/heads_quarters/captain)
+"cYn" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Port to Filter"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/mix)
"cYo" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/stripes/line{
@@ -10791,6 +10935,13 @@
dir = 4
},
/area/station/service/chapel)
+"cYZ" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/table_frame,
+/obj/effect/spawner/random/maintenance,
+/obj/item/melee/baton/security/cattleprod,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"cZa" = (
/obj/machinery/light/small/directional/north,
/turf/open/floor/iron,
@@ -10827,6 +10978,18 @@
/obj/machinery/holopad,
/turf/open/floor/iron/smooth_large,
/area/station/science/cytology)
+"cZi" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "Atmospherics Blast Door"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/atmos)
"cZk" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/small/dim/directional/east,
@@ -11002,6 +11165,13 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
+"dbt" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"dbw" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
@@ -11107,17 +11277,6 @@
},
/turf/open/floor/iron,
/area/station/engineering/lobby)
-"dcE" = (
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_green/end{
- dir = 1
- },
-/obj/machinery/meter,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"dcG" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -11225,13 +11384,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/showroomfloor,
/area/station/security/prison/toilet)
-"ddA" = (
-/obj/effect/mapping_helpers/broken_floor,
-/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"ddQ" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/item/kirbyplants/random,
@@ -11275,6 +11427,18 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
+"dey" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4{
+ dir = 9
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"deD" = (
/obj/machinery/modular_computer/preset/id{
dir = 4
@@ -11338,11 +11502,6 @@
"dfB" = (
/turf/open/floor/iron/white/corner,
/area/station/hallway/primary/starboard)
-"dfQ" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/engineering/atmos/storage/gas)
"dfR" = (
/obj/item/toy/snowball{
pixel_x = 3;
@@ -11408,13 +11567,6 @@
/obj/machinery/smartfridge,
/turf/open/floor/iron/dark,
/area/station/service/kitchen)
-"dgZ" = (
-/obj/machinery/airalarm/directional/south,
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/dark_blue/line,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"dha" = (
/obj/machinery/door/airlock/security/glass{
id_tag = "permaouter";
@@ -11441,11 +11593,6 @@
"dhq" = (
/turf/closed/mineral/random/labormineral/ice,
/area/icemoon/surface/outdoors/labor_camp)
-"dhv" = (
-/obj/effect/mapping_helpers/broken_floor,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"dhH" = (
/obj/machinery/light/small/directional/west,
/obj/effect/turf_decal/weather/snow/corner{
@@ -11453,11 +11600,11 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
-"dhR" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/bookcase/random,
-/turf/open/floor/iron/grimy,
-/area/station/maintenance/aft/greater)
+"dhL" = (
+/obj/effect/spawner/random/trash/mess,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/wood,
+/area/station/maintenance/aft/lesser)
"dhS" = (
/obj/machinery/door/airlock{
name = "Permabrig Showers"
@@ -11579,6 +11726,15 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"djB" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/computer/atmos_control/nocontrol/incinerator{
+ dir = 8
+ },
+/obj/item/radio/intercom/directional/east,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/iron/dark/textured,
+/area/station/maintenance/disposal/incinerator)
"djC" = (
/obj/effect/decal/remains/human,
/obj/item/reagent_containers/cup/glass/bottle/wine{
@@ -11665,6 +11821,10 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/central/greater)
+"dkc" = (
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/engine/airless,
+/area/station/engineering/atmos)
"dkg" = (
/obj/structure/table/glass,
/obj/machinery/computer/records/medical/laptop,
@@ -11781,14 +11941,6 @@
},
/turf/open/floor/plating,
/area/station/construction)
-"dlS" = (
-/obj/item/crowbar/red,
-/obj/effect/mapping_helpers/broken_floor,
-/obj/effect/spawner/random/maintenance,
-/obj/structure/rack,
-/obj/effect/decal/cleanable/cobweb,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"dmb" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/power/apc/auto_name/directional/west,
@@ -11855,6 +12007,24 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/science/xenobiology)
+"dne" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/cable,
+/obj/machinery/light/floor,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/yellow{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"dng" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 4
@@ -11866,6 +12036,15 @@
/obj/item/radio/intercom/directional/west,
/turf/open/floor/iron,
/area/station/command/heads_quarters/rd)
+"dni" = (
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/effect/turf_decal/stripes/white/line,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos)
"dnk" = (
/obj/structure/dresser,
/turf/open/floor/carpet,
@@ -11938,14 +12117,6 @@
"dom" = (
/turf/closed/wall/ice,
/area/station/service/kitchen/coldroom)
-"don" = (
-/obj/machinery/portable_atmospherics/canister,
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/bot,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light/small/directional/east,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"dop" = (
/obj/structure/fence/door/opened{
dir = 4
@@ -11969,6 +12140,10 @@
},
/turf/closed/wall,
/area/station/maintenance/starboard/upper)
+"dot" = (
+/obj/item/chair/stool,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"dow" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
@@ -12040,6 +12215,13 @@
/obj/structure/tank_holder/extinguisher,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
+"dpr" = (
+/obj/structure/sign/poster/official/random/directional/east,
+/obj/machinery/portable_atmospherics/canister,
+/obj/structure/railing,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"dpx" = (
/obj/effect/spawner/random/maintenance,
/obj/structure/disposalpipe/segment,
@@ -12056,17 +12238,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
-"dpC" = (
-/obj/structure/closet/crate/bin,
-/obj/effect/spawner/random/contraband/prison,
-/obj/item/trash/sosjerky,
-/obj/item/trash/boritos,
-/obj/item/trash/can,
-/obj/effect/turf_decal/tile/green/anticorner/contrasted{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/station/security/prison/garden)
"dpH" = (
/obj/structure/rack,
/obj/effect/spawner/random/maintenance,
@@ -12085,6 +12256,12 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"dqr" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"dqw" = (
/obj/machinery/holopad,
/turf/open/floor/iron,
@@ -12112,6 +12289,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
+"dqM" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"dqO" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
@@ -12174,12 +12359,6 @@
/obj/item/mod/module/thermal_regulator,
/turf/open/floor/iron/dark,
/area/station/engineering/engine_smes)
-"drh" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/glass/reinforced,
-/area/station/engineering/atmos/pumproom)
"drr" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white,
@@ -12195,6 +12374,16 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/commons/dorms)
+"dru" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/obj/machinery/portable_atmospherics/pump,
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos)
"drw" = (
/obj/structure/closet/toolcloset,
/obj/effect/decal/cleanable/dirt,
@@ -12227,18 +12416,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/maintenance/disposal/incinerator)
-"drK" = (
-/obj/machinery/light/small/directional/south,
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible/layer2,
-/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{
- dir = 8
- },
-/obj/machinery/airlock_sensor/incinerator_atmos{
- pixel_y = 32
- },
-/turf/open/floor/engine,
-/area/station/maintenance/disposal/incinerator)
"drR" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
@@ -12303,6 +12480,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
+"dsL" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"dsR" = (
/obj/machinery/conveyor/inverted{
dir = 10;
@@ -12334,11 +12519,6 @@
/obj/structure/bookcase/random/reference,
/turf/open/floor/wood,
/area/station/service/library)
-"dtc" = (
-/obj/structure/sign/warning/cold_temp/directional/north,
-/obj/structure/closet/emcloset/anchored,
-/turf/open/floor/plating,
-/area/station/engineering/atmos)
"dth" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/engineering/glass{
@@ -12365,6 +12545,17 @@
/obj/effect/turf_decal/tile/green/anticorner/contrasted,
/turf/open/floor/iron,
/area/station/command/bridge)
+"dtx" = (
+/obj/structure/rack,
+/obj/structure/sign/poster/contraband/random/directional/north,
+/obj/item/stack/sheet/glass{
+ amount = 20;
+ pixel_x = -3;
+ pixel_y = 6
+ },
+/obj/item/stack/rods/ten,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"dty" = (
/obj/structure/table,
/obj/effect/spawner/random/food_or_drink/donkpockets,
@@ -12393,9 +12584,23 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
+"due" = (
+/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/white{
+ color = "#008000"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"duh" = (
/turf/closed/wall/r_wall,
/area/station/engineering/transit_tube)
+"duq" = (
+/obj/effect/turf_decal/siding/yellow/corner,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/engineering/lobby)
"duE" = (
/obj/machinery/atmospherics/components/binary/tank_compressor{
dir = 4
@@ -12463,12 +12668,15 @@
/obj/effect/turf_decal/weather/snow/corner,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"dvq" = (
+"dvr" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/landmark/generic_maintenance_landmark,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"dvw" = (
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/tile/red{
@@ -12514,13 +12722,6 @@
/obj/structure/flora/tree/dead/style_random,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"dvZ" = (
-/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,
-/obj/effect/turf_decal/weather/snow/corner{
- dir = 4
- },
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"dwj" = (
/obj/machinery/atmospherics/components/binary/pump/off,
/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{
@@ -12539,12 +12740,6 @@
/obj/effect/decal/cleanable/cobweb,
/turf/open/openspace/icemoon/keep_below,
/area/station/maintenance/port/lesser)
-"dws" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/siding/wood,
-/turf/open/floor/wood,
-/area/station/maintenance/aft/greater)
"dww" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -12554,6 +12749,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
+"dwx" = (
+/obj/structure/ladder,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"dwE" = (
/obj/structure/railing{
dir = 8
@@ -12695,12 +12894,11 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/security/courtroom)
-"dyg" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
+"dyo" = (
/obj/effect/mapping_helpers/burnt_floor,
-/obj/effect/turf_decal/weather/snow,
-/turf/open/floor/plating/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
+/obj/effect/spawner/random/structure/crate,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"dyA" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4,
/obj/effect/turf_decal/stripes/line,
@@ -12774,6 +12972,12 @@
},
/turf/open/floor/iron/dark,
/area/station/service/chapel)
+"dzI" = (
+/obj/machinery/atmospherics/components/unary/passive_vent/layer2{
+ dir = 8
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/underground/explored)
"dzJ" = (
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -12911,16 +13115,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
-"dBK" = (
-/obj/machinery/disposal/bin,
-/obj/machinery/light/directional/south,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/machinery/firealarm/directional/south,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage/gas)
"dBN" = (
/obj/effect/turf_decal/tile/bar/opposingcorners,
/obj/machinery/requests_console/auto_name/directional/north,
@@ -12953,6 +13147,12 @@
"dBZ" = (
/turf/open/floor/iron,
/area/station/cargo/sorting)
+"dCp" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"dCy" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
@@ -12995,6 +13195,12 @@
},
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/ce)
+"dCX" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output{
+ dir = 1
+ },
+/turf/open/floor/engine/o2,
+/area/station/engineering/atmos)
"dCZ" = (
/obj/effect/turf_decal/stripes/corner,
/obj/effect/turf_decal/tile/red/half/contrasted,
@@ -13040,12 +13246,6 @@
"dDw" = (
/turf/closed/wall,
/area/station/medical/surgery/fore)
-"dDy" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/dark_blue/corner,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"dDz" = (
/obj/structure/closet/crate,
/obj/effect/spawner/random/maintenance/two,
@@ -13191,41 +13391,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark,
/area/station/engineering/transit_tube)
-"dFp" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Air to Mix"
- },
-/obj/effect/turf_decal/siding/wideplating{
- dir = 8
- },
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
"dFt" = (
/turf/closed/wall,
/area/station/hallway/secondary/exit/departure_lounge)
-"dFA" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/grimy,
-/area/station/maintenance/aft/greater)
-"dFC" = (
-/obj/effect/turf_decal/bot,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"dFF" = (
/obj/structure/chair{
dir = 8
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
-"dFG" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"dFO" = (
/obj/machinery/light/directional/north,
/obj/structure/sign/departments/evac/directional/north,
@@ -13244,10 +13418,6 @@
dir = 5
},
/area/station/security/prison/safe)
-"dFZ" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"dGe" = (
/obj/effect/decal/cleanable/food/egg_smudge,
/turf/open/floor/plating,
@@ -13272,13 +13442,6 @@
},
/turf/open/floor/iron/dark/textured_large,
/area/station/engineering/storage/tech)
-"dGK" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"dGO" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -13342,6 +13505,14 @@
/obj/item/wrench,
/turf/open/floor/plating,
/area/station/medical/virology)
+"dHp" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable,
+/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/station/maintenance/aft/greater)
"dHs" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark/side{
@@ -13381,13 +13552,12 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
/area/mine/production)
-"dIl" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+"dIr" = (
+/obj/machinery/firealarm/directional/north,
+/turf/open/floor/iron/stairs/medium{
dir = 4
},
-/obj/effect/turf_decal/bot_red,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
+/area/station/engineering/atmos/hfr_room)
"dIx" = (
/obj/effect/spawner/random/structure/grille,
/turf/open/floor/plating,
@@ -13410,6 +13580,17 @@
},
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
+"dIO" = (
+/turf/open/openspace,
+/area/station/engineering/atmos)
+"dIY" = (
+/obj/effect/turf_decal/tile/dark/anticorner/contrasted,
+/obj/machinery/atmospherics/components/binary/pump/off{
+ dir = 1;
+ name = "CO2 To Pure"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"dJd" = (
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 1
@@ -13448,6 +13629,12 @@
},
/turf/open/floor/iron/white,
/area/station/science/genetics)
+"dKa" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"dKe" = (
/obj/machinery/conveyor{
dir = 4;
@@ -13474,6 +13661,9 @@
/obj/structure/window/reinforced/spawner/directional/north,
/turf/open/floor/iron,
/area/mine/living_quarters)
+"dKx" = (
+/turf/open/floor/iron/dark/textured_large,
+/area/station/maintenance/department/medical/central)
"dKy" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/preopen{
@@ -13541,6 +13731,13 @@
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
+"dLp" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/obj/machinery/firealarm/directional/north,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"dLr" = (
/obj/structure/disposalpipe/trunk{
dir = 8
@@ -13634,6 +13831,16 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white,
/area/station/medical/medbay/aft)
+"dMs" = (
+/obj/machinery/meter/monitored/distro_loop,
+/obj/machinery/atmospherics/pipe/smart/manifold/supply/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wideplating/corner{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
"dMv" = (
/obj/item/clothing/gloves/color/rainbow,
/obj/item/clothing/head/soft/rainbow,
@@ -13658,6 +13865,19 @@
},
/turf/open/floor/iron,
/area/station/command/bridge)
+"dNu" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable,
+/obj/effect/landmark/firealarm_sanity,
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "Atmospherics Blast Door"
+ },
+/obj/structure/sign/warning/gas_mask/directional/east,
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4,
+/obj/machinery/light/small/dim/directional/east,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/engineering/atmos/hfr_room)
"dNw" = (
/obj/structure/chair/office{
dir = 8
@@ -13755,28 +13975,12 @@
/obj/effect/turf_decal/tile/red/half,
/turf/open/floor/iron/smooth_half,
/area/station/security/brig/upper)
-"dPj" = (
-/obj/structure/ladder,
-/obj/effect/turf_decal/tile/neutral/diagonal_centre,
-/obj/effect/turf_decal/tile/dark_blue/diagonal_edge,
-/turf/open/floor/iron/dark/diagonal,
-/area/station/engineering/atmos/storage)
"dPq" = (
/obj/structure/rack,
/obj/effect/spawner/random/techstorage/rnd_all,
/obj/effect/turf_decal/bot,
/turf/open/floor/iron/large,
/area/station/engineering/storage/tech)
-"dPy" = (
-/obj/machinery/camera/directional/west{
- c_tag = "Xenobiology Kill Chamber";
- network = list("ss13","rd","xeno")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"dPG" = (
/obj/machinery/mech_bay_recharge_port,
/obj/structure/extinguisher_cabinet/directional/north,
@@ -13800,11 +14004,6 @@
/obj/effect/mapping_helpers/airlock/access/any/service/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"dQl" = (
-/obj/structure/closet/emcloset,
-/obj/structure/sign/warning/cold_temp/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"dQo" = (
/obj/machinery/button/door/directional/east{
id = "pharmacy_shutters2";
@@ -13850,6 +14049,15 @@
/obj/effect/spawner/structure/window/reinforced/tinted,
/turf/open/floor/plating,
/area/station/security/prison/toilet)
+"dQU" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/trimline/red/arrow_cw{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"dQZ" = (
/obj/machinery/door/window/right/directional/west{
name = "Containment Pen 9";
@@ -13896,6 +14104,13 @@
dir = 1
},
/area/station/command/gateway)
+"dRW" = (
+/obj/machinery/computer/atmos_control/nitrogen_tank{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow/half/contrasted,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"dRX" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -14051,21 +14266,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/medical/surgery/fore)
-"dUv" = (
-/obj/structure/rack,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/mask/gas,
-/obj/item/clothing/mask/gas,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/item/clothing/glasses/meson/engine/tray,
-/obj/item/clothing/glasses/meson/engine/tray,
-/turf/open/floor/iron/showroomfloor,
-/area/station/engineering/atmos)
"dUL" = (
/obj/machinery/door/poddoor/preopen{
id = "maint1"
@@ -14266,13 +14466,6 @@
/mob/living/basic/bot/secbot/pingsky,
/turf/open/floor/iron/dark,
/area/station/ai/satellite/interior)
-"dXP" = (
-/obj/effect/turf_decal/trimline/yellow/filled/shrink_cw{
- dir = 4
- },
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"dXU" = (
/obj/effect/decal/cleanable/generic,
/turf/open/floor/plating,
@@ -14308,19 +14501,6 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
-"dYI" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"dYP" = (
/obj/item/toy/snowball{
pixel_x = -11;
@@ -14370,6 +14550,14 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
+"dZP" = (
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/siding/yellow{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"dZQ" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -14511,9 +14699,6 @@
/obj/structure/flora/rock/pile/icy/style_random,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
-"ebr" = (
-/turf/open/openspace,
-/area/station/engineering/atmos/storage)
"ebv" = (
/obj/machinery/light/small/directional/east,
/obj/effect/turf_decal/stripes/corner{
@@ -14551,6 +14736,11 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"ecr" = (
+/obj/structure/rack,
+/obj/effect/spawner/random/clothing/backpack,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"ecs" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -14632,16 +14822,6 @@
},
/turf/open/floor/iron,
/area/station/science/robotics/mechbay)
-"edw" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"edN" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/disposalpipe/segment,
@@ -14791,10 +14971,6 @@
/obj/effect/spawner/random/armory/riot_shield,
/turf/open/floor/iron/dark/textured,
/area/station/security/armory)
-"egp" = (
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"egF" = (
/obj/structure/filingcabinet,
/obj/item/folder/documents,
@@ -14818,10 +14994,6 @@
/obj/effect/decal/cleanable/blood/gibs/old,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"egV" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/engineering/lobby)
"egY" = (
/obj/machinery/door/poddoor/shutters/preopen{
dir = 8;
@@ -14922,14 +15094,6 @@
/obj/structure/sign/warning/cold_temp,
/turf/closed/wall/r_wall,
/area/station/engineering/storage_shared)
-"ehR" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible,
-/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/engineering/atmos/pumproom)
"ehU" = (
/obj/machinery/door/firedoor/border_only,
/obj/structure/railing,
@@ -14965,6 +15129,15 @@
"eio" = (
/turf/open/floor/iron/smooth,
/area/station/security/holding_cell)
+"eiA" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/crate/engineering/atmos,
+/obj/item/tank/internals/emergency_oxygen/engi/empty,
+/obj/item/clothing/mask/gas,
+/obj/effect/spawner/random/maintenance,
+/obj/effect/spawner/random/engineering/tool,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"eiD" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/vending/sustenance/labor_camp,
@@ -15055,29 +15228,12 @@
/obj/effect/mapping_helpers/airlock/access/all/science/ordnance,
/turf/open/floor/engine/vacuum,
/area/station/science/ordnance/burnchamber)
-"ejQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
- },
-/turf/open/floor/plating,
-/area/station/engineering/lobby)
"ejT" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/status_display/ai/directional/north,
/turf/open/floor/carpet/royalblue,
/area/station/command/heads_quarters/captain)
-"ekh" = (
-/obj/machinery/camera/directional/west{
- c_tag = "Atmospherics - Central"
- },
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Port to Infiltrate"
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"ekj" = (
/obj/structure/closet,
/obj/effect/spawner/random/clothing/costume,
@@ -15103,11 +15259,6 @@
},
/turf/open/floor/iron,
/area/station/commons/storage/primary)
-"ekq" = (
-/obj/effect/spawner/random/structure/crate,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"ekE" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -15132,6 +15283,18 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/commons/fitness)
+"ekY" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 4;
+ name = "External to Filter"
+ },
+/obj/effect/turf_decal/trimline/red/arrow_ccw,
+/obj/effect/turf_decal/box/red,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"elj" = (
/obj/effect/landmark/start/depsec/engineering,
/obj/structure/cable,
@@ -15166,6 +15329,15 @@
"elw" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/starboard/upper)
+"ely" = (
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/structure/sign/warning/radiation/rad_area/directional/west,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos/hfr_room)
"elE" = (
/obj/structure/rack,
/obj/item/clothing/suit/hazardvest,
@@ -15236,11 +15408,6 @@
dir = 1
},
/area/station/security/brig)
-"emT" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"ena" = (
/obj/structure/lattice/catwalk,
/obj/structure/railing{
@@ -15306,17 +15473,6 @@
},
/turf/open/floor/catwalk_floor/iron_smooth,
/area/station/maintenance/port/lesser)
-"eoD" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
- dir = 6
- },
-/obj/effect/turf_decal/siding/yellow/corner{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"eoE" = (
/obj/machinery/firealarm/directional/east,
/obj/machinery/status_display/ai/directional/north,
@@ -15336,10 +15492,6 @@
/obj/effect/turf_decal/tile/red/half/contrasted,
/turf/open/floor/iron/dark,
/area/station/security/checkpoint/science)
-"eoP" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"eoS" = (
/obj/machinery/door/morgue{
dir = 4;
@@ -15394,6 +15546,16 @@
},
/turf/open/floor/wood,
/area/station/security/courtroom)
+"epU" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
"epY" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -15606,6 +15768,12 @@
},
/turf/open/floor/iron/dark,
/area/station/cargo/miningdock)
+"esm" = (
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/obj/structure/cable,
+/turf/open/floor/iron/large,
+/area/station/engineering/atmos)
"eso" = (
/obj/machinery/telecomms/receiver/preset_left,
/turf/open/floor/iron/dark/telecomms,
@@ -15706,13 +15874,6 @@
/obj/structure/sign/warning/directional/north,
/turf/open/lava/plasma/ice_moon,
/area/icemoon/underground/explored)
-"etB" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/simple/brown/visible{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"etD" = (
/obj/structure/rack,
/obj/item/book/bible,
@@ -15780,6 +15941,18 @@
/obj/machinery/airalarm/directional/west,
/turf/open/floor/carpet,
/area/station/command/heads_quarters/captain)
+"euk" = (
+/turf/open/floor/plating/snowed/icemoon,
+/area/station/maintenance/aft/lesser)
+"eup" = (
+/obj/machinery/button/door/directional/east{
+ id = "xenobio9";
+ name = "Xenobio Pen 9 Blast Door";
+ req_access = list("xenobiology")
+ },
+/obj/machinery/light/floor,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"euq" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -15793,15 +15966,39 @@
},
/turf/open/floor/iron,
/area/station/engineering/main)
+"eut" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos/storage/gas)
"euw" = (
/obj/structure/rack,
/obj/item/storage/toolbox/mechanical,
/turf/open/floor/iron/smooth,
/area/mine/eva)
+"euC" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"euI" = (
/obj/structure/statue/snow/snowman,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
+"euL" = (
+/obj/effect/turf_decal/siding/wideplating/corner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
"euM" = (
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -15858,6 +16055,10 @@
},
/turf/open/floor/iron/dark,
/area/station/security/range)
+"ewc" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"ewi" = (
/obj/machinery/navbeacon{
codes_txt = "delivery;dir=8";
@@ -15951,6 +16152,15 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
+"exF" = (
+/obj/machinery/door/airlock/research/glass{
+ name = "Kill Chamber";
+ normalspeed = 0
+ },
+/obj/effect/mapping_helpers/airlock/access/all/science/xenobio,
+/obj/structure/plasticflaps/kitchen,
+/turf/open/floor/iron/freezer,
+/area/station/science/xenobiology)
"exL" = (
/obj/item/trash/cheesie,
/obj/effect/decal/cleanable/dirt,
@@ -16031,6 +16241,12 @@
/obj/structure/window/reinforced/spawner/directional/south,
/turf/open/floor/iron,
/area/station/science/xenobiology)
+"eyX" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/mix)
"eyZ" = (
/obj/structure/table/wood,
/obj/item/pai_card,
@@ -16097,6 +16313,12 @@
/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/department/cargo)
+"ezW" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/item/chair,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"eAb" = (
/obj/structure/chair{
dir = 1
@@ -16218,6 +16440,15 @@
},
/turf/open/floor/iron,
/area/station/engineering/main)
+"eBJ" = (
+/obj/machinery/computer/atmos_alert/station_only{
+ dir = 8
+ },
+/obj/structure/curtain/bounty{
+ pixel_x = 32
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/storage/gas)
"eBL" = (
/obj/machinery/holopad,
/turf/open/floor/iron,
@@ -16277,6 +16508,11 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
+"eCK" = (
+/obj/structure/closet/secure_closet/atmospherics,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos)
"eCR" = (
/obj/structure/signpost{
desc = "Now, where to go from here? That's a timeless question."
@@ -16324,13 +16560,6 @@
},
/turf/open/floor/iron/dark,
/area/station/ai/satellite/interior)
-"eDj" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/effect/turf_decal/bot_white,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"eDq" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
@@ -16384,6 +16613,10 @@
/obj/machinery/door/firedoor,
/turf/open/floor/iron/smooth_large,
/area/station/command/heads_quarters/hos)
+"eDW" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"eEl" = (
/obj/structure/railing{
dir = 8
@@ -16415,6 +16648,12 @@
dir = 1
},
/area/station/maintenance/department/cargo)
+"eEG" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"eEO" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -16426,19 +16665,6 @@
},
/turf/open/floor/plating/icemoon,
/area/station/science/ordnance/bomb/planet)
-"eEY" = (
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
-"eFd" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/station/engineering/atmos/storage/gas)
"eFh" = (
/obj/structure/table,
/obj/effect/spawner/random/entertainment/cigarette_pack,
@@ -16551,18 +16777,6 @@
},
/turf/open/floor/iron/dark,
/area/station/commons/fitness)
-"eGN" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
-"eGT" = (
-/obj/structure/fence/cut/large{
- dir = 1
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"eGV" = (
/obj/effect/spawner/random/lavaland_mob/raptor,
/turf/open/misc/asteroid/snow/icemoon,
@@ -16595,6 +16809,19 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/catwalk_floor/iron_smooth,
/area/station/maintenance/department/medical/central)
+"eHf" = (
+/obj/structure/table/reinforced,
+/obj/item/hfr_box/body/waste_output{
+ pixel_x = 5;
+ pixel_y = -1
+ },
+/obj/item/hfr_box/body/moderator_input{
+ pixel_x = -5;
+ pixel_y = 8
+ },
+/obj/machinery/newscaster/directional/west,
+/turf/open/floor/iron/dark/smooth_large,
+/area/station/engineering/atmos/hfr_room)
"eHg" = (
/obj/effect/turf_decal/trimline/yellow/filled/warning{
dir = 4
@@ -16615,6 +16842,13 @@
/obj/item/clothing/under/costume/jabroni,
/turf/open/floor/iron,
/area/station/maintenance/starboard/fore)
+"eHm" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/chair/sofa/right/brown{
+ dir = 1
+ },
+/turf/open/floor/iron/grimy,
+/area/station/maintenance/aft/lesser)
"eHo" = (
/obj/effect/turf_decal/bot,
/obj/machinery/shower/directional/north,
@@ -16717,6 +16951,13 @@
},
/turf/open/floor/iron/dark,
/area/station/science/breakroom)
+"eIH" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{
+ dir = 8
+ },
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/mix)
"eII" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 9
@@ -16738,6 +16979,12 @@
/obj/structure/sign/warning/electric_shock/directional/east,
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
+"eIX" = (
+/obj/effect/spawner/random/maintenance/two,
+/obj/structure/rack,
+/obj/effect/spawner/random/engineering/flashlight,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"eJe" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -16758,14 +17005,14 @@
dir = 5
},
/area/station/science/research)
-"eJx" = (
-/obj/machinery/newscaster/directional/east,
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 5
- },
-/obj/machinery/holopad,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
+"eJv" = (
+/obj/structure/sign/poster/random/directional/east,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"eJz" = (
/obj/effect/turf_decal/plaque{
icon_state = "L12"
@@ -16776,11 +17023,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"eJI" = (
-/obj/structure/closet/emcloset,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"eJK" = (
/obj/structure/flora/bush/flowers_pp/style_random,
/obj/structure/flora/bush/sparsegrass/style_random,
@@ -16828,6 +17070,11 @@
/obj/effect/turf_decal/tile/yellow/fourcorners,
/turf/open/floor/iron/dark/textured,
/area/station/hallway/primary/aft)
+"eKi" = (
+/obj/effect/spawner/structure/window/reinforced/plasma,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/hfr_room)
"eKl" = (
/obj/effect/turf_decal/stripes/box,
/obj/machinery/destructive_scanner,
@@ -16940,14 +17187,6 @@
},
/turf/open/floor/iron/white,
/area/station/maintenance/aft/greater)
-"eMr" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
-/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/station/engineering/atmos)
"eME" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -16970,6 +17209,15 @@
/obj/effect/mapping_helpers/airlock/access/any/service/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
+"eMZ" = (
+/obj/effect/landmark/start/station_engineer,
+/obj/machinery/light/floor,
+/obj/effect/turf_decal/siding/yellow{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron,
+/area/station/engineering/lobby)
"eNh" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -17047,13 +17295,6 @@
dir = 8
},
/area/station/science/research)
-"eOB" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/trimline/neutral/end{
- dir = 8
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"eOJ" = (
/obj/structure/railing{
dir = 4
@@ -17138,6 +17379,15 @@
/obj/machinery/light/small/directional/north,
/turf/open/floor/iron,
/area/station/cargo/miningdock)
+"ePN" = (
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/mapping_helpers/airlock/access/all/science/ordnance,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/door/airlock/maintenance{
+ name = "Ordnance Lab Maintenance"
+ },
+/turf/open/floor/plating,
+/area/station/science/ordnance)
"ePP" = (
/obj/machinery/camera/directional/south{
c_tag = "Starboard Primary Hallway Center West"
@@ -17220,15 +17470,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
-"eRx" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/door/airlock/maintenance/glass,
-/obj/effect/mapping_helpers/airlock/unres/delayed,
-/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"eRE" = (
/obj/structure/fence/post{
dir = 2
@@ -17375,6 +17616,21 @@
/obj/structure/sign/warning/no_smoking/circle/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/medbay/aft)
+"eUe" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/door/airlock/highsecurity{
+ name = "Atmospherics Access"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/hfr_room)
"eUf" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -17474,19 +17730,6 @@
},
/turf/open/floor/plating,
/area/station/medical/chem_storage)
-"eUK" = (
-/obj/structure/table,
-/obj/item/stack/sheet/iron/fifty{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/stack/sheet/plasteel/twenty{
- pixel_x = 3;
- pixel_y = -2
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"eUL" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/obj/structure/cable,
@@ -17561,10 +17804,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
-"eVI" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"eVO" = (
/obj/machinery/door/airlock/external{
glass = 1;
@@ -17601,6 +17840,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply,
/turf/open/floor/iron/white,
/area/station/medical/virology)
+"eWa" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 1
+ },
+/turf/closed/wall/r_wall,
+/area/station/engineering/atmos)
"eWc" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -17627,6 +17872,13 @@
/obj/machinery/portable_atmospherics/canister/plasma,
/turf/open/floor/engine/plasma,
/area/station/engineering/atmos)
+"eWn" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/landmark/firealarm_sanity,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"eWF" = (
/obj/machinery/camera/directional/east{
c_tag = "Arrivals Escape Pod 2"
@@ -17722,6 +17974,18 @@
"eXH" = (
/turf/closed/wall/r_wall,
/area/station/medical/chemistry)
+"eXW" = (
+/obj/machinery/door/airlock/atmos/glass{
+ name = "Port Control"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/iron/textured_large,
+/area/station/engineering/atmos/mix)
"eYe" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -17847,10 +18111,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/department/cargo)
-"eZu" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"eZz" = (
/obj/item/storage/fancy/cigarettes/cigpack_mindbreaker,
/turf/open/misc/asteroid/snow/icemoon,
@@ -17868,6 +18128,12 @@
/obj/structure/cable,
/turf/open/floor/iron/dark/smooth_large,
/area/station/command/eva)
+"eZH" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
+ dir = 9
+ },
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"eZK" = (
/obj/machinery/recycler{
dir = 8
@@ -17941,6 +18207,19 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
+"faB" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 1;
+ name = "O2 to Airmix"
+ },
+/obj/machinery/camera/directional/south{
+ c_tag = "Atmospherics - South"
+ },
+/obj/effect/turf_decal/box/white{
+ color = "#00FFFF"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"faF" = (
/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -18038,6 +18317,29 @@
},
/turf/open/floor/iron,
/area/station/commons/fitness)
+"fbV" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/obj/structure/railing/corner/end{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/arrow_cw{
+ dir = 4
+ },
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
+"fbX" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{
+ dir = 4
+ },
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/mix)
"fbY" = (
/obj/effect/spawner/random/trash/hobo_squat,
/turf/open/floor/plating,
@@ -18077,24 +18379,21 @@
/obj/machinery/status_display/evac/directional/north,
/turf/open/floor/iron/dark,
/area/station/service/hydroponics)
-"fcN" = (
-/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{
+"fcC" = (
+/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible{
+ dir = 4
+ },
+/obj/effect/spawner/structure/window/hollow/reinforced/plasma/middle{
dir = 8
},
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
+/turf/open/floor/plating,
+/area/station/maintenance/disposal/incinerator)
"fcP" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 9
},
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
-"fcQ" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input{
- dir = 8
- },
-/turf/open/floor/engine/n2o,
-/area/station/engineering/atmos)
"fcR" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/airalarm/directional/north,
@@ -18148,6 +18447,21 @@
"fdp" = (
/turf/open/floor/iron,
/area/mine/eva/lower)
+"fds" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "Atmospherics Blast Door"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/sign/warning/radiation/rad_area/directional/east,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/smooth_large,
+/area/station/engineering/atmos/hfr_room)
"fdy" = (
/obj/effect/turf_decal/tile/yellow{
dir = 8
@@ -18312,10 +18626,6 @@
/obj/structure/cable,
/turf/open/floor/carpet/royalblue,
/area/station/command/heads_quarters/captain)
-"fgs" = (
-/obj/effect/spawner/random/trash/grille_or_waste,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"fgx" = (
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/directional/west,
@@ -18384,6 +18694,28 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/fore)
+"fhA" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/multiz/violet/visible{
+ dir = 8;
+ name = "Basement Output"
+ },
+/obj/effect/turf_decal/box/red/corners,
+/obj/effect/turf_decal/box/red/corners{
+ dir = 8
+ },
+/turf/open/floor/iron/textured_large,
+/area/station/engineering/atmos)
+"fhC" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{
+ dir = 6
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"fhI" = (
/obj/structure/cable,
/obj/effect/turf_decal/siding/dark_red,
@@ -18421,19 +18753,6 @@
/obj/structure/sign/warning/secure_area/directional/north,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
-"fij" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 8
- },
-/obj/structure/railing/corner{
- dir = 1
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"fil" = (
/obj/structure/table/glass,
/obj/machinery/microwave/engineering/cell_included,
@@ -18451,21 +18770,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
-"fiq" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/structure/closet/secure_closet/medical2,
-/obj/machinery/light/small/directional/south,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
-"fiu" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/station/maintenance/disposal/incinerator)
"fiv" = (
/obj/effect/turf_decal/weather/snow/corner{
dir = 6
@@ -18486,10 +18790,6 @@
},
/turf/open/floor/plating,
/area/station/engineering/supermatter/engine)
-"fiA" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"fiD" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -18536,12 +18836,6 @@
/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
/turf/open/floor/plating/snowed/coldroom,
/area/station/service/kitchen/coldroom)
-"fjg" = (
-/obj/machinery/shower/directional/west,
-/obj/effect/turf_decal/trimline/blue,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"fjt" = (
/obj/machinery/door/window/left/directional/east{
name = "Containment Pen 9";
@@ -18733,13 +19027,6 @@
"fmc" = (
/turf/closed/wall,
/area/station/hallway/primary/aft)
-"fmf" = (
-/obj/effect/landmark/generic_maintenance_landmark,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"fmg" = (
/obj/structure/disposalpipe/junction/yjunction{
dir = 1
@@ -18777,14 +19064,25 @@
/obj/machinery/plumbing/sender,
/turf/open/floor/plating,
/area/station/medical/chemistry)
-"fmA" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 9
+"fmK" = (
+/obj/machinery/door/airlock/atmos/glass{
+ name = "Incinerator"
},
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
+"fmS" = (
+/obj/machinery/light/warm/directional/east,
+/turf/open/openspace,
+/area/station/engineering/atmos)
"fmU" = (
/obj/structure/railing/corner{
dir = 4
@@ -18810,13 +19108,21 @@
},
/turf/open/floor/iron/textured,
/area/station/security/brig)
-"fnA" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
+"fnw" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "Atmospherics Blast Door"
+ },
+/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/sign/warning/radiation/rad_area/directional/east,
+/obj/structure/sign/warning/gas_mask/directional/north,
+/turf/open/floor/iron/smooth_large,
+/area/station/engineering/atmos/hfr_room)
"fnF" = (
/obj/structure/chair/sofa/middle/brown,
/turf/open/floor/carpet/blue,
@@ -18889,11 +19195,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
-"fpJ" = (
-/obj/structure/fireaxecabinet/directional/west,
-/obj/machinery/suit_storage_unit/atmos,
-/turf/open/floor/iron/dark/textured,
-/area/station/engineering/atmos)
+"fpU" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 9
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
"fqd" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -18903,6 +19210,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/cargo/office)
+"fqi" = (
+/obj/effect/spawner/random/structure/closet_private,
+/obj/effect/spawner/random/contraband/permabrig_weapon,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"fqj" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -18917,18 +19229,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"fqA" = (
-/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
-/obj/effect/turf_decal/siding/wideplating{
- dir = 8
- },
-/obj/structure/cable,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
"fqJ" = (
/obj/effect/turf_decal/trimline/white/filled/warning,
/turf/open/genturf,
@@ -19011,23 +19311,10 @@
},
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
-"frz" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/landmark/generic_maintenance_landmark,
-/obj/item/chair,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"frD" = (
/obj/machinery/air_sensor/oxygen_tank,
/turf/open/floor/engine/o2,
/area/station/engineering/atmos)
-"frE" = (
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/iron/dark/corner,
-/area/station/engineering/atmos/storage/gas)
"frF" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -19144,6 +19431,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/mine/laborcamp)
+"fti" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/firealarm/directional/west,
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"ftk" = (
/obj/item/chair/wood,
/obj/item/toy/plush/moth{
@@ -19215,11 +19509,15 @@
},
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"fuD" = (
-/obj/structure/tank_holder/extinguisher,
-/obj/structure/sign/poster/random/directional/north,
+"fuo" = (
+/obj/effect/spawner/random/engineering/tank,
/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
+/area/station/maintenance/department/medical/central)
+"fuA" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/item/chair/stool/bar,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"fuH" = (
/turf/closed/mineral/snowmountain/coldroom,
/area/icemoon/underground/explored)
@@ -19305,13 +19603,6 @@
/obj/machinery/light/directional/north,
/turf/open/floor/iron/smooth,
/area/station/security/execution/transfer)
-"fvR" = (
-/obj/structure/cable,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/turf/open/floor/iron/dark/textured,
-/area/station/maintenance/disposal/incinerator)
"fwf" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -19338,13 +19629,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"fwq" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Port to Filter"
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"fwx" = (
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
@@ -19365,18 +19649,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/maintenance/starboard/aft)
-"fwI" = (
-/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/machinery/duct,
-/obj/machinery/door/firedoor/heavy,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"fwM" = (
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -19386,11 +19658,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
-"fwO" = (
-/obj/machinery/space_heater,
-/obj/structure/cable,
-/turf/open/floor/iron/showroomfloor,
-/area/station/engineering/atmos)
"fwQ" = (
/obj/structure/secure_safe/caps_spare,
/obj/structure/table/reinforced,
@@ -19427,6 +19694,13 @@
/obj/effect/turf_decal/tile/red/anticorner/contrasted,
/turf/open/floor/iron,
/area/station/security/checkpoint/supply)
+"fxo" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos)
"fxR" = (
/obj/machinery/telecomms/hub/preset,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -19445,6 +19719,15 @@
},
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
+"fxX" = (
+/obj/machinery/camera/directional/west{
+ c_tag = "Atmospherics - Incinerator"
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"fxY" = (
/obj/effect/turf_decal/bot,
/obj/machinery/light/small/directional/north,
@@ -19565,19 +19848,6 @@
"fzK" = (
/turf/closed/wall,
/area/station/service/bar)
-"fzO" = (
-/obj/effect/mapping_helpers/airlock/abandoned,
-/obj/machinery/door/airlock/maintenance{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental,
-/obj/effect/mapping_helpers/airlock/unres/delayed{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"fzQ" = (
/obj/structure/chair/office{
dir = 8
@@ -19592,6 +19862,13 @@
/obj/structure/cable,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
+"fAn" = (
+/obj/effect/turf_decal/stripes/corner,
+/obj/structure/railing/corner/end{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/hallway/primary/aft)
"fAF" = (
/obj/structure/rack,
/obj/item/clothing/gloves/boxing/green,
@@ -19606,6 +19883,14 @@
/obj/item/clothing/mask/breath/muzzle,
/turf/open/floor/iron/dark,
/area/station/science/robotics/lab)
+"fAK" = (
+/obj/machinery/atmospherics/pipe/multiz/violet/visible{
+ dir = 8;
+ name = "Basement Output"
+ },
+/obj/effect/turf_decal/box/red,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos/hfr_room)
"fAP" = (
/obj/machinery/keycard_auth/wall_mounted/directional/east,
/turf/open/floor/iron/dark/smooth_large,
@@ -19724,21 +20009,42 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
+"fCS" = (
+/obj/machinery/camera/directional/north{
+ c_tag = "Atmospherics Distribution Loop"
+ },
+/obj/effect/turf_decal/siding/wideplating/corner,
+/obj/machinery/meter/monitored/waste_loop,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
+"fCV" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible,
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
+"fCY" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"fDc" = (
/obj/structure/chair/office,
/obj/effect/landmark/start/warden,
/turf/open/floor/iron/showroomfloor,
/area/station/security/warden)
-"fDe" = (
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_green/end{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"fDf" = (
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/box/red/corners{
@@ -19765,6 +20071,12 @@
dir = 8
},
/area/station/security/prison)
+"fDq" = (
+/obj/structure/chair/sofa/left/brown{
+ dir = 4
+ },
+/turf/open/floor/iron/grimy,
+/area/station/maintenance/aft/lesser)
"fDI" = (
/obj/structure/table/wood,
/obj/machinery/computer/records/medical/laptop{
@@ -19816,23 +20128,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/commons/fitness)
-"fEL" = (
-/obj/machinery/holopad,
-/obj/machinery/duct,
-/obj/effect/turf_decal/bot,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/iron/large,
-/area/station/engineering/lobby)
-"fER" = (
-/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{
- dir = 4
- },
-/turf/open/floor/glass/reinforced,
-/area/station/engineering/atmos/pumproom)
+"fEE" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden/layer2,
+/obj/effect/spawner/structure/window/hollow/reinforced/plasma/middle,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/project)
"fEV" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -19847,6 +20147,14 @@
/obj/effect/mapping_helpers/airlock/access/all/supply/mining,
/turf/open/floor/stone,
/area/mine/eva/lower)
+"fEW" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/airalarm/directional/south,
+/obj/structure/closet/secure_closet/medical2,
+/turf/open/floor/iron,
+/area/station/science/xenobiology)
"fEZ" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
@@ -19902,12 +20210,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/solars/port/aft)
-"fFC" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"fFD" = (
/obj/structure/railing,
/obj/effect/turf_decal/tile/brown/half/contrasted,
@@ -19979,19 +20281,6 @@
},
/turf/open/floor/plating,
/area/station/service/hydroponics)
-"fHQ" = (
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{
- dir = 5
- },
-/obj/effect/turf_decal/trimline/dark_green/corner{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/dark_green/line{
- dir = 10
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"fHS" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -20040,6 +20329,9 @@
"fIt" = (
/turf/closed/wall/r_wall,
/area/icemoon/underground/explored)
+"fIv" = (
+/turf/open/floor/iron,
+/area/station/engineering/atmos/project)
"fIx" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/yellow/opposingcorners,
@@ -20056,16 +20348,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/department/medical/central)
-"fJe" = (
-/obj/machinery/door/airlock/external{
- name = "Atmospherics External Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/turf/open/floor/plating,
-/area/station/engineering/atmos)
"fJj" = (
/obj/machinery/door/poddoor/preopen{
id = "lawyer_blast";
@@ -20106,17 +20388,59 @@
dir = 1
},
/area/station/medical/morgue)
+"fJB" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/table/reinforced,
+/obj/machinery/button/door/incinerator_vent_atmos_aux{
+ pixel_x = -6;
+ pixel_y = -1
+ },
+/obj/machinery/button/door/incinerator_vent_atmos_main{
+ pixel_x = 6;
+ pixel_y = -1
+ },
+/obj/machinery/button/ignition/incinerator/atmos{
+ pixel_y = 9
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/iron/dark/textured,
+/area/station/maintenance/disposal/incinerator)
+"fJE" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"fJL" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input{
dir = 1
},
/turf/open/floor/engine/n2,
/area/station/engineering/atmos)
+"fJN" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/light/floor,
+/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"fJS" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/duct,
/turf/open/floor/iron,
/area/station/service/hydroponics)
+"fJT" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/emcloset,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"fJZ" = (
/obj/effect/turf_decal/tile/red,
/obj/structure/railing/corner,
@@ -20148,11 +20472,17 @@
/obj/machinery/iv_drip,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
-"fKr" = (
-/obj/machinery/airalarm/directional/north,
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
+"fKk" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"fKv" = (
/obj/structure/fluff/tram_rail{
pixel_y = 17
@@ -20169,15 +20499,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"fKI" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"fKO" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -20239,10 +20560,6 @@
"fLe" = (
/turf/open/floor/plating,
/area/station/engineering/lobby)
-"fLh" = (
-/obj/structure/closet/toolcloset,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"fLq" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/red/half/contrasted{
@@ -20282,12 +20599,14 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
-"fLP" = (
-/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{
+"fLN" = (
+/obj/structure/cable,
+/obj/item/radio/intercom/directional/north,
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4{
dir = 10
},
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"fLQ" = (
/obj/machinery/computer/operating{
dir = 8
@@ -20339,6 +20658,13 @@
/obj/structure/cable,
/turf/open/floor/vault,
/area/station/security/prison/rec)
+"fMi" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"fMt" = (
/obj/effect/turf_decal/bot{
dir = 1
@@ -20370,11 +20696,6 @@
dir = 1
},
/area/station/security/lockers)
-"fNa" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/emcloset,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"fNc" = (
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/directional/north,
@@ -20399,6 +20720,10 @@
dir = 1
},
/area/station/engineering/engine_smes)
+"fNs" = (
+/obj/effect/spawner/random/medical/patient_stretcher,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"fNv" = (
/obj/effect/turf_decal/stripes/line,
/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible,
@@ -20434,6 +20759,18 @@
dir = 1
},
/area/station/hallway/primary/port)
+"fNR" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer2{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/meter/layer2,
+/obj/machinery/meter/layer4,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos/hfr_room)
"fNZ" = (
/obj/structure/table/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -20486,15 +20823,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
-"fOU" = (
-/obj/machinery/atmospherics/components/unary/passive_vent{
- dir = 1
- },
-/obj/effect/turf_decal/weather/snow/corner{
- dir = 6
- },
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"fPb" = (
/obj/effect/turf_decal/trimline/blue/filled/line,
/obj/structure/cable,
@@ -20508,13 +20836,6 @@
},
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"fPv" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"fPA" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -20561,12 +20882,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/ai/satellite/maintenance)
-"fQc" = (
-/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"fQe" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -20705,6 +21020,13 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/command/eva)
+"fTa" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/frame/computer{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"fTb" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -20737,6 +21059,36 @@
"fTj" = (
/turf/open/floor/catwalk_floor/iron,
/area/mine/laborcamp)
+"fTo" = (
+/obj/machinery/atmospherics/components/trinary/mixer{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/white/corners{
+ color = "#800080"
+ },
+/obj/effect/turf_decal/box/white/corners{
+ dir = 8;
+ color = "#800080"
+ },
+/turf/open/floor/iron/textured_large,
+/area/station/engineering/atmos)
+"fTr" = (
+/obj/structure/cable,
+/obj/machinery/duct,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/siding/yellow{
+ dir = 6
+ },
+/obj/structure/railing/corner/end/flip{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron,
+/area/station/engineering/lobby)
"fTx" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -20759,18 +21111,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/carpet/red,
/area/station/security/prison/work)
-"fTG" = (
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 9
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
-"fTH" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/maintenance/disposal/incinerator)
"fTR" = (
/obj/machinery/light/directional/north,
/obj/structure/sign/warning/electric_shock/directional/north,
@@ -20816,6 +21156,12 @@
/obj/structure/closet/emcloset,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"fUx" = (
+/obj/effect/turf_decal/siding/yellow{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"fUL" = (
/obj/effect/turf_decal/trimline/blue/filled/corner{
dir = 8
@@ -20835,14 +21181,10 @@
"fUR" = (
/turf/closed/wall,
/area/station/hallway/secondary/entry)
-"fUW" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/extinguisher_cabinet/directional/east,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
+"fUX" = (
+/obj/machinery/light/small/red/directional/west,
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"fVf" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -20904,6 +21246,11 @@
},
/turf/open/floor/engine,
/area/station/maintenance/disposal/incinerator)
+"fVG" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"fVJ" = (
/obj/structure/window/reinforced/spawner/directional/west,
/obj/item/book/manual/wiki/cooking_to_serve_man,
@@ -20952,31 +21299,10 @@
},
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"fWF" = (
-/obj/effect/spawner/random/structure/steam_vent,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
-"fWL" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = -11;
- pixel_y = 7
- },
-/obj/item/pen{
- pixel_x = 1;
- pixel_y = 9
- },
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/wood,
-/area/station/maintenance/aft/greater)
"fWN" = (
/obj/effect/turf_decal/tile/green/half/contrasted,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
-"fWO" = (
-/obj/effect/spawner/random/trash/mess,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"fWS" = (
/obj/structure/mineral_door/wood,
/obj/structure/barricade/wooden/crude/snow,
@@ -20995,6 +21321,12 @@
},
/turf/open/floor/carpet,
/area/station/command/heads_quarters/captain)
+"fXg" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plating,
+/area/station/security/checkpoint/engineering)
"fXq" = (
/obj/item/clothing/head/cone{
pixel_x = 3
@@ -21030,13 +21362,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
-"fXX" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/door/airlock/maintenance_hatch{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"fYi" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -21050,6 +21375,17 @@
/obj/machinery/newscaster/directional/south,
/turf/open/floor/stone,
/area/station/service/bar/atrium)
+"fYD" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 8
+ },
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/siding/yellow{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"fYH" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -21084,14 +21420,6 @@
},
/turf/open/floor/iron/large,
/area/station/hallway/secondary/entry)
-"fYY" = (
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/machinery/disposal/bin,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"fZf" = (
/obj/machinery/mining_weather_monitor/directional/west,
/obj/effect/turf_decal/tile/brown{
@@ -21218,13 +21546,6 @@
},
/turf/open/floor/iron/white,
/area/station/science/lab)
-"gax" = (
-/obj/effect/turf_decal/box/corners{
- dir = 1
- },
-/obj/effect/turf_decal/box/corners,
-/turf/open/floor/engine,
-/area/station/engineering/atmos/hfr_room)
"gaA" = (
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored/graveyard)
@@ -21369,10 +21690,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/stone,
/area/station/service/bar/atrium)
-"gcT" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"gcU" = (
/obj/structure/railing/corner/end/flip{
dir = 4
@@ -21382,12 +21699,6 @@
},
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
-"gcV" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/glass/reinforced,
-/area/station/engineering/atmos/pumproom)
"gcZ" = (
/obj/structure/table,
/obj/item/storage/bag/tray,
@@ -21408,11 +21719,11 @@
/obj/structure/sign/warning/directional/north,
/turf/open/floor/iron,
/area/mine/laborcamp)
-"gdv" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
+"gdo" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/structure/flipped_table,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"gdx" = (
/obj/item/bedsheet/red,
/obj/machinery/light/small/dim/directional/east,
@@ -21554,11 +21865,10 @@
/obj/effect/turf_decal/siding/yellow,
/turf/open/floor/iron,
/area/station/engineering/storage)
-"gfu" = (
-/obj/structure/closet,
-/obj/effect/spawner/random/maintenance,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
+"gfs" = (
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/engine/plasma,
+/area/station/engineering/atmos)
"gfw" = (
/obj/machinery/light/small/directional/west,
/obj/structure/table,
@@ -21577,6 +21887,20 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/cafeteria,
/area/station/commons/storage/art)
+"gfN" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"gga" = (
/obj/machinery/light/small/directional/west,
/obj/effect/spawner/random/trash/hobo_squat,
@@ -21623,17 +21947,15 @@
},
/turf/open/floor/iron,
/area/station/service/hydroponics)
+"ggF" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/structure/closet/crate/critter,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"ggG" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/engineering/storage_shared)
-"ggK" = (
-/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{
- dir = 8
- },
-/obj/structure/sign/poster/official/random/directional/west,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"ggR" = (
/obj/machinery/computer/teleporter{
dir = 8
@@ -21737,16 +22059,6 @@
/obj/structure/sign/warning/directional/north,
/turf/open/floor/engine,
/area/station/engineering/supermatter/engine)
-"giv" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/mapping_helpers/broken_floor,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/wood,
-/area/station/maintenance/aft/greater)
"giO" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/spawner/random/trash/grille_or_waste,
@@ -21816,6 +22128,15 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/medical/morgue)
+"gjB" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/railing/corner/end/flip{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"gjI" = (
/obj/effect/spawner/random/structure/tank_holder,
/obj/effect/turf_decal/tile/yellow,
@@ -21936,14 +22257,6 @@
/obj/machinery/vitals_reader/directional/north,
/turf/open/floor/iron/large,
/area/station/medical/treatment_center)
-"gkY" = (
-/obj/machinery/atmospherics/components/binary/pump/off{
- dir = 1;
- name = "N2 To Pure"
- },
-/obj/effect/turf_decal/tile/red/anticorner/contrasted,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"gkZ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -22066,12 +22379,6 @@
/obj/structure/extinguisher_cabinet/directional/south,
/turf/open/floor/iron/white,
/area/station/medical/virology)
-"gmJ" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Port to Infiltrate/Filter"
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"gmO" = (
/obj/structure/frame/machine,
/obj/item/circuitboard/machine/chem_master,
@@ -22125,15 +22432,6 @@
dir = 5
},
/area/mine/laborcamp/security)
-"gnB" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 8
- },
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/turf/open/floor/iron/large,
-/area/station/engineering/lobby)
"gnJ" = (
/obj/effect/turf_decal/siding/thinplating/dark,
/obj/effect/turf_decal/trimline/green/filled/line{
@@ -22160,6 +22458,22 @@
/obj/structure/sign/departments/medbay/alt/directional/south,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
+"gnW" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 1
+ },
+/obj/machinery/light/warm/directional/south,
+/obj/item/radio/intercom/directional/south,
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Mix to Filter"
+ },
+/obj/effect/turf_decal/box/red/corners{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/red/corners,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
"gnX" = (
/obj/effect/decal/cleanable/blood/tracks{
dir = 4
@@ -22197,6 +22511,16 @@
},
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
+"gof" = (
+/obj/machinery/duct,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
+ dir = 5
+ },
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos)
"gov" = (
/obj/machinery/door/window/left/directional/west{
name = "Janitorial Delivery";
@@ -22212,12 +22536,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/department/chapel)
-"goE" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Pure to Port"
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"goF" = (
/obj/machinery/duct,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -22349,6 +22667,12 @@
},
/turf/open/floor/iron,
/area/station/commons/storage/tools)
+"gqi" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
+ dir = 6
+ },
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"gqj" = (
/obj/structure/railing/corner{
dir = 1
@@ -22490,13 +22814,6 @@
/obj/effect/turf_decal/tile/blue/full,
/turf/open/floor/iron/white/smooth_large,
/area/station/medical/psychology)
-"grI" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"grL" = (
/obj/machinery/light/small/directional/east,
/turf/open/misc/asteroid/snow/icemoon,
@@ -22584,12 +22901,6 @@
/obj/item/pen,
/turf/open/floor/iron,
/area/station/commons/locker)
-"gtg" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer1{
- dir = 8
- },
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"gti" = (
/turf/open/openspace,
/area/station/maintenance/starboard/aft)
@@ -22693,10 +23004,6 @@
},
/turf/open/floor/iron,
/area/station/cargo/sorting)
-"guU" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden,
-/turf/closed/wall,
-/area/station/engineering/atmos)
"gvc" = (
/obj/machinery/door/airlock/external{
glass = 1;
@@ -22719,14 +23026,6 @@
/obj/item/kirbyplants/random,
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
-"gvf" = (
-/obj/machinery/button/door/directional/east{
- id = "xenobio8";
- name = "Xenobio Pen 8 Blast DOors";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"gvj" = (
/obj/structure/cable,
/turf/open/floor/iron,
@@ -22777,6 +23076,9 @@
/obj/effect/mapping_helpers/airlock/red_alert_access,
/turf/open/floor/iron/dark/smooth_large,
/area/station/medical/storage)
+"gwe" = (
+/turf/open/floor/plating,
+/area/station/science/xenobiology)
"gwl" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/obj/effect/turf_decal/tile/red{
@@ -22820,6 +23122,12 @@
/obj/structure/light_construct/directional/east,
/turf/open/floor/iron,
/area/station/construction)
+"gwy" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"gwz" = (
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/blue/opposingcorners{
@@ -22890,6 +23198,11 @@
},
/turf/open/floor/plating,
/area/station/maintenance/fore)
+"gxE" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/generic_maintenance_landmark,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"gxO" = (
/obj/structure/table/reinforced,
/obj/item/hand_labeler{
@@ -22903,11 +23216,6 @@
/obj/item/storage/box,
/turf/open/floor/iron,
/area/station/cargo/sorting)
-"gxP" = (
-/obj/structure/reagent_dispensers/plumbed,
-/obj/effect/turf_decal/bot_white,
-/turf/open/floor/iron/large,
-/area/station/engineering/atmos)
"gxR" = (
/obj/structure/table,
/obj/item/stack/sheet/plasteel{
@@ -23020,6 +23328,13 @@
},
/turf/open/floor/iron/smooth,
/area/station/engineering/lobby)
+"gzO" = (
+/obj/structure/rack,
+/obj/item/clothing/suit/hooded/wintercoat/science,
+/obj/item/flashlight,
+/obj/item/clothing/glasses/meson,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"gzY" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
@@ -23077,6 +23392,20 @@
},
/turf/open/floor/iron/grimy,
/area/station/service/chapel/office)
+"gAF" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/stripes/white/corner{
+ dir = 1
+ },
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos)
"gAJ" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/mapping_helpers/broken_floor,
@@ -23094,6 +23423,14 @@
/obj/structure/falsewall,
/turf/open/floor/plating,
/area/station/security/prison)
+"gAS" = (
+/obj/structure/table,
+/obj/item/trash/candle{
+ pixel_y = 12
+ },
+/obj/machinery/light/small/dim/directional/west,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"gAV" = (
/obj/structure/railing{
dir = 4
@@ -23103,6 +23440,11 @@
dir = 1
},
/area/station/security/prison)
+"gAY" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"gAZ" = (
/obj/effect/turf_decal/tile/purple,
/turf/open/floor/iron,
@@ -23138,6 +23480,14 @@
/obj/machinery/light/floor,
/turf/open/floor/iron,
/area/station/security/brig/upper)
+"gBo" = (
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
+/obj/effect/turf_decal/trimline/blue/line{
+ dir = 8
+ },
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"gBv" = (
/obj/machinery/door/window/left/directional/south{
name = "Engineering Delivery";
@@ -23148,13 +23498,15 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron/textured_large,
/area/station/engineering/storage)
-"gBx" = (
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
+"gBD" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/power/apc/auto_name/directional/south,
+/obj/structure/cable,
/turf/open/floor/iron,
-/area/station/engineering/atmos)
+/area/station/engineering/atmos/project)
"gBJ" = (
/obj/effect/turf_decal/tile/bar/opposingcorners,
/obj/effect/turf_decal/siding/wood/corner{
@@ -23225,6 +23577,14 @@
},
/turf/open/floor/iron,
/area/station/engineering/lobby)
+"gCM" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/portable_atmospherics/canister,
+/turf/open/floor/iron/textured,
+/area/station/engineering/atmos/mix)
"gCP" = (
/obj/structure/punching_bag,
/obj/effect/turf_decal/bot,
@@ -23520,16 +23880,6 @@
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"gHl" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer1{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow/anticorner/contrasted,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"gHq" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -23545,6 +23895,17 @@
},
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"gHB" = (
+/obj/structure/table/reinforced,
+/obj/item/book/manual/wiki/atmospherics,
+/obj/item/holosign_creator/atmos,
+/obj/item/holosign_creator/atmos,
+/obj/machinery/camera/directional/west{
+ c_tag = "Atmospherics - Project Room";
+ name = "atmospherics camera"
+ },
+/turf/open/floor/iron/dark/smooth_large,
+/area/station/engineering/atmos/hfr_room)
"gHD" = (
/obj/machinery/status_display/evac/directional/north,
/obj/machinery/light/directional/north,
@@ -23561,6 +23922,12 @@
},
/turf/open/floor/iron/white,
/area/station/medical/virology)
+"gHO" = (
+/obj/structure/closet/secure_closet/atmospherics,
+/obj/machinery/status_display/ai/directional/east,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos)
"gHP" = (
/obj/machinery/space_heater/improvised_chem_heater,
/obj/effect/decal/cleanable/dirt,
@@ -23597,6 +23964,15 @@
/obj/structure/sign/warning/biohazard/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/virology)
+"gIi" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/wood,
+/area/station/maintenance/aft/lesser)
"gIl" = (
/obj/machinery/door/airlock/maintenance{
name = "Cytology Maintenance"
@@ -23645,6 +24021,21 @@
},
/turf/open/floor/iron,
/area/station/security/brig/upper)
+"gIO" = (
+/obj/machinery/igniter/incinerator_atmos,
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 5
+ },
+/turf/open/floor/engine/vacuum,
+/area/station/maintenance/disposal/incinerator)
+"gIW" = (
+/obj/machinery/status_display/ai/directional/north,
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on,
+/obj/structure/sign/clock/directional/west,
+/obj/effect/turf_decal/bot_red,
+/turf/open/floor/iron/textured,
+/area/station/engineering/atmos/pumproom)
"gIY" = (
/turf/closed/wall,
/area/station/medical/medbay/central)
@@ -23652,12 +24043,16 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
-"gJs" = (
-/obj/machinery/portable_atmospherics/canister,
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
+"gJv" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden,
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos/storage/gas)
"gJz" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
@@ -23751,6 +24146,14 @@
/obj/structure/window/reinforced/spawner/directional/south,
/turf/open/floor/engine,
/area/station/science/xenobiology)
+"gLk" = (
+/obj/machinery/duct,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/blue/line,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"gLn" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 1
@@ -23840,6 +24243,15 @@
},
/turf/open/floor/iron,
/area/station/command/heads_quarters/hop)
+"gMr" = (
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/stripes/white/corner,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos)
"gMt" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/decal/cleanable/dirt/dust,
@@ -23978,6 +24390,11 @@
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron/large,
/area/station/hallway/primary/port)
+"gOn" = (
+/obj/effect/mapping_helpers/broken_floor,
+/obj/structure/closet/emcloset,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"gOx" = (
/obj/effect/turf_decal/loading_area,
/obj/effect/turf_decal/tile/neutral/half/contrasted,
@@ -24018,15 +24435,12 @@
},
/turf/open/floor/plating,
/area/mine/production)
-"gOY" = (
-/obj/structure/railing/corner{
- dir = 4
- },
-/obj/structure/railing/corner{
- dir = 1
+"gPi" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden/layer2{
+ dir = 8
},
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/underground/explored)
"gPn" = (
/obj/machinery/door/airlock/security/glass{
name = "Armory"
@@ -24130,6 +24544,20 @@
/obj/effect/mapping_helpers/airlock/access/all/service/chapel_office,
/turf/open/floor/iron/dark,
/area/station/service/chapel/office)
+"gQV" = (
+/obj/effect/spawner/random/structure/musician/piano/random_piano,
+/turf/open/floor/wood,
+/area/station/maintenance/aft/lesser)
+"gQY" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
+/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/blue/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"gRg" = (
/obj/machinery/light/small/directional/north,
/obj/structure/window/reinforced/spawner/directional/east,
@@ -24181,11 +24609,6 @@
},
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
-"gRI" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"gSd" = (
/obj/structure/fence/door{
dir = 4
@@ -24204,6 +24627,14 @@
/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark/textured_large,
/area/station/cargo/bitrunning/den)
+"gSi" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{
+ dir = 8
+ },
+/obj/structure/closet/emcloset,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"gSl" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 9
@@ -24287,11 +24718,6 @@
/obj/structure/closet/crate,
/turf/open/floor/plating,
/area/station/construction)
-"gTi" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"gTq" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -24337,18 +24763,6 @@
"gTK" = (
/turf/closed/wall,
/area/station/engineering/engine_smes)
-"gTQ" = (
-/obj/machinery/computer/station_alert{
- dir = 8
- },
-/obj/machinery/button/door/directional/south{
- id = "atmos"
- },
-/obj/machinery/light_switch/directional/south{
- pixel_x = -10
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage/gas)
"gTW" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -24387,6 +24801,18 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/mine/laborcamp)
+"gUE" = (
+/obj/structure/sign/poster/official/random/directional/west,
+/obj/effect/turf_decal/tile/green/anticorner/contrasted{
+ dir = 8
+ },
+/obj/item/trash/can,
+/obj/item/trash/boritos,
+/obj/item/trash/sosjerky,
+/obj/structure/closet/crate/bin,
+/obj/effect/spawner/random/contraband/prison,
+/turf/open/floor/iron/smooth,
+/area/station/security/prison/garden)
"gUQ" = (
/obj/structure/fence/door{
dir = 4
@@ -24396,6 +24822,12 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
+"gUT" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/generic,
+/obj/effect/spawner/random/trash/moisture_trap,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"gUY" = (
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
@@ -24536,21 +24968,6 @@
/obj/structure/plasticflaps/kitchen,
/turf/open/floor/plating,
/area/station/service/kitchen/coldroom)
-"gWn" = (
-/obj/machinery/atmospherics/components/trinary/filter/flipped{
- dir = 4;
- name = "Exfiltrate Filter"
- },
-/obj/effect/turf_decal/trimline/dark_red/filled/warning{
- dir = 10
- },
-/obj/effect/turf_decal/trimline/dark_red/filled/warning{
- dir = 5
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/structure/sign/warning/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"gWt" = (
/obj/structure/filingcabinet,
/obj/machinery/airalarm/directional/north,
@@ -24563,6 +24980,9 @@
},
/turf/open/floor/iron/dark,
/area/station/security/checkpoint/engineering)
+"gWD" = (
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"gWV" = (
/obj/structure/chair/stool/directional/north,
/obj/effect/decal/cleanable/dirt/dust,
@@ -24575,6 +24995,14 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/security/interrogation)
+"gXa" = (
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/blue/line,
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"gXf" = (
/obj/machinery/duct,
/obj/machinery/door/poddoor/preopen{
@@ -24634,6 +25062,13 @@
/obj/machinery/airalarm/directional/south,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
+"gXv" = (
+/obj/machinery/computer/atmos_control/carbon_tank{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/dark/half/contrasted,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"gXD" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/decal/cleanable/dirt,
@@ -24826,17 +25261,15 @@
/obj/machinery/light/small/dim/directional/north,
/turf/open/floor/vault,
/area/station/security/prison/rec)
-"gZT" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 9
- },
-/obj/machinery/camera/directional/north{
- c_tag = "Atmospherics - HFR North"
+"gZW" = (
+/obj/structure/table,
+/obj/item/book/manual/wiki/atmospherics,
+/obj/item/analyzer,
+/obj/structure/curtain/bounty{
+ pixel_x = 32
},
-/obj/machinery/power/apc/auto_name/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos)
"hac" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{
dir = 9
@@ -24915,6 +25348,11 @@
/obj/effect/spawner/random/trash/box,
/turf/open/floor/iron/grimy,
/area/station/commons/vacant_room/office)
+"hbv" = (
+/obj/effect/turf_decal/weather/snow/corner,
+/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,
+/turf/open/floor/plating/snowed/icemoon,
+/area/icemoon/surface/outdoors/less_spawns)
"hby" = (
/turf/open/floor/plating,
/area/station/maintenance/disposal)
@@ -24971,16 +25409,6 @@
},
/turf/open/floor/iron/smooth,
/area/station/engineering/lobby)
-"hcG" = (
-/obj/structure/lattice/catwalk,
-/obj/structure/railing{
- dir = 1
- },
-/obj/structure/railing/corner{
- dir = 8
- },
-/turf/open/openspace,
-/area/station/engineering/atmos/storage)
"hcI" = (
/obj/structure/cable,
/obj/effect/turf_decal/trimline/red/filled/line{
@@ -25011,6 +25439,10 @@
},
/turf/open/floor/iron,
/area/station/cargo/storage)
+"hcU" = (
+/obj/effect/spawner/random/structure/tank_holder,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"hcZ" = (
/obj/structure/railing/wooden_fence,
/turf/open/floor/plating/snowed/smoothed/icemoon,
@@ -25070,6 +25502,21 @@
/obj/structure/cable,
/turf/open/floor/iron/dark/textured,
/area/station/security/interrogation)
+"hdS" = (
+/obj/machinery/camera/directional/west{
+ c_tag = "Atmospherics - N2"
+ },
+/turf/open/floor/engine/n2,
+/area/station/engineering/atmos)
+"hdU" = (
+/obj/machinery/portable_atmospherics/pipe_scrubber,
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos)
+"hef" = (
+/obj/effect/landmark/generic_maintenance_landmark,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"heg" = (
/obj/effect/spawner/random/engineering/canister,
/turf/open/floor/plating,
@@ -25094,18 +25541,6 @@
/obj/effect/mapping_helpers/airlock/access/all/supply/mining,
/turf/open/floor/iron/smooth,
/area/mine/mechbay)
-"heE" = (
-/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{
- dir = 9
- },
-/obj/structure/fence{
- dir = 4
- },
-/obj/effect/turf_decal/weather/snow/corner{
- dir = 6
- },
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"heX" = (
/obj/structure/cable,
/turf/open/floor/wood,
@@ -25157,6 +25592,13 @@
},
/turf/open/floor/circuit,
/area/station/ai/satellite/chamber)
+"hfP" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Air to Distro"
+ },
+/turf/open/floor/glass/reinforced,
+/area/station/engineering/atmos/pumproom)
"hfZ" = (
/obj/structure/table,
/obj/effect/decal/cleanable/dirt,
@@ -25176,11 +25618,14 @@
"hgr" = (
/turf/open/floor/glass/reinforced,
/area/station/hallway/secondary/entry)
-"hgK" = (
-/obj/structure/ladder,
-/obj/effect/landmark/blobstart,
-/turf/open/floor/iron/dark/textured_large,
-/area/station/maintenance/department/medical/central)
+"hgH" = (
+/obj/structure/table,
+/obj/item/clothing/suit/hooded/wintercoat/science{
+ pixel_y = 4
+ },
+/obj/item/flashlight/flare,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"hgM" = (
/turf/closed/wall,
/area/station/security/execution/transfer)
@@ -25207,20 +25652,6 @@
/obj/effect/turf_decal/box,
/turf/open/floor/iron/dark/textured,
/area/station/security/prison/workout)
-"hht" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/cyan,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/iron/checker,
-/area/station/engineering/atmos)
"hhu" = (
/obj/structure/window/reinforced/spawner/directional/east,
/obj/machinery/portable_atmospherics/canister/oxygen,
@@ -25371,11 +25802,6 @@
"hjM" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/department/medical/morgue)
-"hjR" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/engineering/atmos/project)
"hjV" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -25399,20 +25825,18 @@
dir = 1
},
/area/station/security/office)
+"hkb" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/effect/spawner/structure/window/ice,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"hkd" = (
/obj/machinery/light/small/directional/west,
/turf/open/floor/plating,
/area/station/maintenance/department/electrical)
-"hkp" = (
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"hkt" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -25459,12 +25883,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/central/greater)
-"hlp" = (
-/obj/structure/chair/stool/directional/south{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"hlu" = (
/obj/machinery/door/firedoor{
dir = 4
@@ -25543,6 +25961,13 @@
/obj/item/paper,
/turf/open/floor/iron,
/area/station/security/checkpoint/customs/auxiliary)
+"hmv" = (
+/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wideplating,
+/turf/open/floor/iron/textured_large,
+/area/station/engineering/atmos)
"hmx" = (
/obj/structure/chair{
dir = 1
@@ -25596,10 +26021,6 @@
/obj/structure/mirror/directional/east,
/turf/open/floor/iron/freezer,
/area/station/commons/toilet/locker)
-"hnd" = (
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"hnp" = (
/obj/structure/table,
/obj/effect/decal/cleanable/dirt,
@@ -25624,6 +26045,11 @@
},
/turf/open/floor/iron,
/area/station/cargo/lobby)
+"hnE" = (
+/obj/item/radio/intercom/directional/south,
+/obj/machinery/light/warm/directional/south,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"hnN" = (
/obj/machinery/camera/directional/west{
c_tag = "Xenobiology Pens Observation - Port Aft";
@@ -25695,25 +26121,6 @@
/obj/machinery/newscaster/directional/south,
/turf/open/floor/iron/white,
/area/station/medical/virology)
-"hoT" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 8
- },
-/obj/structure/cable,
-/obj/machinery/status_display/ai/directional/north,
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
-"hoV" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible,
-/turf/open/floor/plating,
-/area/station/engineering/atmos/pumproom)
"hoZ" = (
/obj/effect/spawner/random/entertainment/arcade{
dir = 4
@@ -25898,6 +26305,11 @@
/obj/machinery/door/firedoor/heavy,
/turf/open/floor/iron/smooth_large,
/area/station/science/ordnance)
+"hqJ" = (
+/obj/effect/spawner/structure/window/reinforced/plasma,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/maintenance/disposal/incinerator)
"hqS" = (
/obj/effect/turf_decal/stripes/red/box,
/obj/machinery/door/poddoor/massdriver_trash,
@@ -26104,6 +26516,17 @@
/obj/structure/sign/warning/secure_area/directional/north,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
+"htL" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{
+ dir = 8
+ },
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
"htO" = (
/obj/structure/chair/office{
dir = 4
@@ -26218,6 +26641,10 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
+"hvj" = (
+/obj/machinery/space_heater,
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos)
"hvm" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
@@ -26401,12 +26828,6 @@
/obj/structure/sign/xenobio_guide/directional/north,
/turf/open/openspace,
/area/station/science/xenobiology)
-"hzo" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/landmark/firealarm_sanity,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"hzz" = (
/obj/structure/table/glass,
/obj/item/clothing/gloves/latex,
@@ -26634,15 +27055,6 @@
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/iron,
/area/station/maintenance/starboard/fore)
-"hBE" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/camera/directional/west{
- c_tag = "Atmospherics Incinerator"
- },
-/obj/machinery/atmospherics/components/tank/plasma,
-/obj/machinery/firealarm/directional/west,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"hBG" = (
/obj/effect/turf_decal/siding/green{
dir = 8
@@ -26674,6 +27086,13 @@
dir = 4
},
/area/mine/eva)
+"hCu" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
+/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"hCC" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 1
@@ -26687,6 +27106,18 @@
/obj/structure/cable,
/turf/open/floor/catwalk_floor/iron_smooth,
/area/station/commons/storage/mining)
+"hCL" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/spawner/structure/window,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/mix)
+"hCT" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"hCV" = (
/obj/structure/table/wood,
/obj/item/hand_tele{
@@ -26743,12 +27174,6 @@
dir = 1
},
/area/station/service/chapel)
-"hDh" = (
-/obj/machinery/computer/atmos_alert/station_only{
- dir = 8
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage/gas)
"hDp" = (
/turf/open/floor/engine,
/area/station/science/genetics)
@@ -26802,11 +27227,23 @@
/obj/structure/closet/emcloset,
/turf/open/floor/iron/dark,
/area/mine/eva)
+"hEn" = (
+/obj/effect/turf_decal/arrows/white,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/engine,
+/area/station/engineering/atmos/hfr_room)
"hEv" = (
/obj/structure/chair/stool/directional/west,
/obj/effect/spawner/random/trash/cigbutt,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
+"hEy" = (
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"hED" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
@@ -26930,16 +27367,6 @@
/obj/machinery/light/small/dim/directional/north,
/turf/open/floor/vault,
/area/station/security/prison/rec)
-"hGs" = (
-/obj/structure/lattice/catwalk,
-/obj/structure/railing{
- dir = 4
- },
-/obj/structure/railing{
- dir = 8
- },
-/turf/open/openspace,
-/area/station/engineering/atmos/storage)
"hGH" = (
/turf/closed/wall,
/area/station/security/lockers)
@@ -27036,13 +27463,6 @@
/obj/structure/sign/warning/directional/north,
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"hIA" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/station/engineering/atmos/pumproom)
"hIE" = (
/obj/effect/turf_decal/tile/red,
/obj/machinery/firealarm/directional/south,
@@ -27162,14 +27582,6 @@
"hJH" = (
/turf/open/openspace,
/area/station/science/research)
-"hKi" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/landmark/event_spawn,
-/obj/structure/cable,
-/turf/open/floor/iron/edge{
- dir = 8
- },
-/area/station/engineering/lobby)
"hKu" = (
/obj/structure/sign/poster/official/cleanliness/directional/east,
/obj/structure/closet/secure_closet/medical2,
@@ -27185,6 +27597,12 @@
/obj/structure/chair,
/turf/open/floor/iron,
/area/station/cargo/storage)
+"hKW" = (
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{
+ dir = 8
+ },
+/turf/closed/wall/r_wall,
+/area/station/maintenance/aft/lesser)
"hKY" = (
/obj/machinery/navbeacon{
codes_txt = "delivery;dir=1";
@@ -27211,22 +27629,6 @@
/obj/structure/sign/warning/electric_shock/directional/north,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"hLS" = (
-/obj/machinery/computer/atmos_control/nitrous_tank{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/iron/white/corner,
-/area/station/engineering/atmos)
-"hLX" = (
-/obj/structure/girder,
-/obj/structure/grille,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"hLZ" = (
/obj/machinery/telecomms/bus/preset_three,
/turf/open/floor/circuit/telecomms/mainframe,
@@ -27312,6 +27714,18 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/stone,
/area/station/commons/lounge)
+"hNf" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 8
+ },
+/turf/closed/wall/r_wall,
+/area/station/maintenance/disposal/incinerator)
+"hNg" = (
+/obj/structure/sign/warning/secure_area/directional/north,
+/obj/machinery/shower/directional/south,
+/obj/structure/fluff/shower_drain,
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos)
"hNh" = (
/obj/structure/chair/office{
dir = 8
@@ -27436,17 +27850,6 @@
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
-"hOX" = (
-/obj/machinery/camera/directional/west{
- c_tag = "Atmospherics - North West"
- },
-/obj/machinery/light/directional/west,
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/effect/turf_decal/siding/yellow{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"hPe" = (
/obj/structure/cable/multilayer/connected,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -27521,11 +27924,6 @@
/obj/effect/turf_decal/siding/brown,
/turf/open/floor/iron,
/area/station/cargo/drone_bay)
-"hPO" = (
-/obj/machinery/firealarm/directional/south,
-/obj/effect/turf_decal/trimline/yellow/filled/line,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"hPT" = (
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -27551,6 +27949,12 @@
/obj/machinery/status_display/evac/directional/south,
/turf/open/floor/iron,
/area/station/tcommsat/computer)
+"hQp" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{
+ dir = 1
+ },
+/turf/open/floor/engine/n2o,
+/area/station/engineering/atmos)
"hQt" = (
/obj/structure/cable,
/obj/effect/spawner/structure/window/hollow/reinforced/middle{
@@ -27558,30 +27962,11 @@
},
/turf/open/floor/plating,
/area/station/security/brig)
-"hQu" = (
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"hQv" = (
/obj/item/kirbyplants/random/dead,
/obj/machinery/light/small/broken/directional/east,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
-"hQK" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/table,
-/obj/item/trash/candle{
- pixel_y = 12
- },
-/obj/machinery/power/apc/auto_name/directional/west,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"hQQ" = (
/obj/docking_port/stationary/escape_pod{
dir = 4
@@ -27603,6 +27988,10 @@
},
/turf/open/floor/wood,
/area/station/maintenance/port/aft)
+"hRy" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"hRA" = (
/turf/closed/wall,
/area/station/medical/psychology)
@@ -27653,23 +28042,6 @@
/obj/effect/landmark/start/medical_doctor,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
-"hRQ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/obj/structure/sign/warning/cold_temp/directional/north,
-/obj/machinery/camera/directional/north{
- c_tag = "Xenobiology Pens Hall - Fore";
- network = list("ss13","rd","xeno")
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
-"hRX" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/generic,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"hSe" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -27677,6 +28049,15 @@
/obj/structure/railing/corner,
/turf/open/floor/iron,
/area/mine/eva)
+"hSh" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"hSm" = (
/obj/structure/table,
/obj/item/paper/crumpled{
@@ -27712,21 +28093,29 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/port/lesser)
+"hSy" = (
+/obj/machinery/firealarm/directional/west,
+/obj/machinery/light/floor,
+/obj/machinery/button/door/directional/west{
+ pixel_x = -22;
+ id = "xenobia10";
+ name = "Xenobio Pen 10 Blast Door";
+ req_access = list("xenobiology")
+ },
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"hSF" = (
/obj/machinery/atmospherics/components/tank/air{
dir = 8
},
/turf/open/floor/plating,
/area/station/medical/virology)
-"hSZ" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 4
- },
-/obj/machinery/firealarm/directional/east,
+"hSR" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/floor,
/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
+/area/station/engineering/atmos/hfr_room)
"hTk" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
@@ -27837,6 +28226,13 @@
/obj/effect/decal/cleanable/blood/drip,
/turf/open/floor/iron,
/area/station/maintenance/starboard/fore)
+"hUm" = (
+/obj/machinery/portable_atmospherics/canister/nitrogen,
+/obj/effect/turf_decal/bot,
+/obj/machinery/light/small/directional/north,
+/obj/structure/sign/calendar/directional/north,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/storage/gas)
"hUx" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -28102,22 +28498,6 @@
},
/turf/open/floor/plating,
/area/station/cargo/sorting)
-"hYH" = (
-/obj/machinery/airalarm/directional/north,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/railing/corner{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 9
- },
-/obj/structure/cable,
-/obj/structure/disposalpipe/junction{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"hYL" = (
/obj/structure/closet/lasertag/blue,
/obj/effect/landmark/start/hangover,
@@ -28300,6 +28680,12 @@
},
/turf/open/floor/iron/large,
/area/station/engineering/lobby)
+"iaR" = (
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/obj/effect/turf_decal/bot,
+/obj/structure/sign/poster/contraband/atmosia_independence/directional/north,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/storage/gas)
"iaT" = (
/obj/effect/spawner/random/trash/mess,
/turf/open/floor/plating,
@@ -28447,14 +28833,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/starboard/upper)
-"icF" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/binary/pump/on{
- name = "Incinerator Output Pump";
- target_pressure = 4500
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"icN" = (
/obj/structure/window/reinforced/spawner/directional/north,
/obj/structure/window/reinforced/spawner/directional/east{
@@ -28587,6 +28965,13 @@
/obj/structure/stairs/north,
/turf/open/floor/iron/stairs/medium,
/area/station/cargo/storage)
+"ieE" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/table/reinforced,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/iron/dark/textured,
+/area/station/maintenance/disposal/incinerator)
"ieJ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -28599,19 +28984,22 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark,
/area/station/ai/satellite/atmos)
+"ifm" = (
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/structure/cable,
+/obj/structure/sign/warning/no_smoking/directional/north,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/structure/rack,
+/obj/item/wrench,
+/obj/item/analyzer,
+/turf/open/floor/iron/checker,
+/area/station/engineering/atmos/mix)
"ifX" = (
/obj/machinery/vending/wardrobe/cargo_wardrobe,
/turf/open/floor/iron,
/area/station/cargo/storage)
-"ifY" = (
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red/opposingcorners{
- dir = 1
- },
-/turf/open/floor/iron/white/corner,
-/area/station/engineering/atmos)
"ifZ" = (
/obj/machinery/shower/directional/south,
/obj/item/soap/nanotrasen,
@@ -28633,10 +29021,6 @@
"igm" = (
/turf/closed/wall/ice,
/area/mine/living_quarters)
-"ign" = (
-/obj/structure/railing,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"igt" = (
/obj/structure/chair{
dir = 8
@@ -28750,6 +29134,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/science/explab)
+"ihv" = (
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/engineering/lobby)
"ihx" = (
/obj/machinery/door/airlock/security/glass{
name = "Armory"
@@ -28796,10 +29184,6 @@
},
/turf/open/floor/iron,
/area/station/cargo/lobby)
-"iiB" = (
-/obj/effect/turf_decal/siding/wood,
-/turf/open/floor/wood,
-/area/station/maintenance/aft/greater)
"iiE" = (
/obj/structure/table/wood,
/obj/effect/turf_decal/tile/bar/opposingcorners,
@@ -28861,17 +29245,6 @@
},
/turf/open/floor/iron/dark/textured,
/area/station/security/office)
-"ijp" = (
-/obj/effect/turf_decal/siding/yellow,
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 9
- },
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"ijv" = (
/obj/effect/decal/cleanable/blood/tracks{
dir = 4
@@ -28894,6 +29267,15 @@
/obj/effect/turf_decal/tile/green/half/contrasted,
/turf/open/floor/iron,
/area/station/security/prison/garden)
+"ijF" = (
+/obj/machinery/camera/directional/east{
+ c_tag = "Atmospherics - West"
+ },
+/obj/machinery/status_display/evac/directional/east,
+/obj/machinery/vending/wardrobe/atmos_wardrobe,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos)
"ijJ" = (
/obj/machinery/vending/cigarette,
/obj/effect/turf_decal/tile/red/full,
@@ -28902,13 +29284,12 @@
},
/turf/open/floor/iron/smooth_large,
/area/station/security/brig/upper)
-"ijK" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 1;
- name = "O2 to Airmix"
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
+"ijO" = (
+/obj/structure/sign/poster/official/wtf_is_co2/directional/west,
+/obj/effect/spawner/random/trash/mess,
+/obj/structure/closet/firecloset,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"ijT" = (
/obj/structure/transit_tube/horizontal,
/turf/open/floor/plating,
@@ -28996,6 +29377,15 @@
/obj/machinery/light/directional/east,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
+"ikD" = (
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wideplating/corner{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"ikL" = (
/obj/machinery/status_display/ai/directional/west,
/obj/effect/turf_decal/siding/wood{
@@ -29098,12 +29488,27 @@
/obj/effect/spawner/random/structure/steam_vent,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
+"imm" = (
+/obj/effect/landmark/blobstart,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"imo" = (
/obj/machinery/holopad,
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/science/robotics/mechbay)
+"imv" = (
+/obj/effect/turf_decal/siding/wideplating/corner{
+ dir = 8
+ },
+/obj/structure/sign/poster/official/random/directional/north,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"imH" = (
/obj/structure/rack,
/obj/effect/spawner/random/clothing/gloves,
@@ -29111,13 +29516,6 @@
/obj/item/clothing/mask/breath,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
-"imJ" = (
-/obj/structure/cable,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible/layer2,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"imN" = (
/obj/machinery/light/small/directional/south,
/turf/open/floor/iron,
@@ -29145,6 +29543,13 @@
},
/turf/open/floor/iron/dark,
/area/station/commons/storage/mining)
+"imR" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/rack,
+/obj/effect/spawner/random/trash/janitor_supplies,
+/obj/effect/spawner/random/food_or_drink/donkpockets,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"ini" = (
/obj/structure/falsewall,
/turf/open/floor/plating,
@@ -29232,15 +29637,6 @@
/obj/structure/closet/crate/bin,
/turf/open/floor/wood,
/area/station/commons/vacant_room/office)
-"ioz" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 5
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"ioE" = (
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/stripes/white/line{
@@ -29254,18 +29650,6 @@
/obj/effect/spawner/structure/window/hollow/reinforced/middle,
/turf/open/floor/plating,
/area/station/medical/morgue)
-"ioO" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/trimline/red/filled/warning{
- dir = 1
- },
-/obj/machinery/door/poddoor/shutters/radiation/preopen{
- id = "Atmospherics HFR Shutters"
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"ioQ" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -29291,11 +29675,6 @@
},
/turf/open/floor/plating,
/area/station/service/chapel)
-"ipw" = (
-/obj/structure/rack,
-/obj/effect/spawner/random/maintenance/two,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"ipA" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -29384,14 +29763,16 @@
},
/turf/open/openspace,
/area/station/cargo/storage)
-"irG" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
+"irO" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/airalarm/directional/east,
+/obj/effect/mapping_helpers/airalarm/all_access,
+/obj/structure/table/reinforced,
+/obj/item/clipboard,
+/obj/item/paper,
+/obj/item/pen,
+/turf/open/floor/iron/dark/textured,
+/area/station/maintenance/disposal/incinerator)
"irQ" = (
/obj/structure/chair/pew{
dir = 1
@@ -29401,21 +29782,6 @@
dir = 8
},
/area/station/service/chapel)
-"isb" = (
-/obj/machinery/atmospherics/components/binary/pump/off{
- dir = 1;
- name = "Infiltrate to Exfiltrate"
- },
-/obj/effect/turf_decal/loading_area{
- color = "#439C1E";
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_red/warning{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"ise" = (
/obj/machinery/airalarm/directional/north,
/turf/open/floor/iron,
@@ -29436,12 +29802,6 @@
/obj/machinery/light/small/directional/north,
/turf/open/floor/carpet/blue,
/area/station/medical/psychology)
-"isu" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible/layer2,
-/obj/machinery/air_sensor/incinerator_tank,
-/turf/open/floor/engine/vacuum,
-/area/station/maintenance/disposal/incinerator)
"isx" = (
/obj/effect/turf_decal/tile/yellow{
dir = 4
@@ -29482,6 +29842,15 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/catwalk_floor/iron_smooth,
/area/station/maintenance/port/aft)
+"isN" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
+/obj/effect/spawner/structure/window,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/pumproom)
"isP" = (
/obj/effect/landmark/start/medical_doctor,
/turf/open/floor/iron/white,
@@ -29493,6 +29862,13 @@
},
/turf/open/lava/plasma/ice_moon,
/area/icemoon/underground/explored)
+"isV" = (
+/obj/machinery/door/airlock/maintenance{
+ name = "Atmospherics Maintenance"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"isX" = (
/obj/structure/closet/radiation,
/obj/structure/sign/warning/electric_shock/directional/north,
@@ -29638,6 +30014,13 @@
/obj/structure/closet/emcloset,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
+"ivE" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"ivF" = (
/turf/closed/wall,
/area/station/maintenance/disposal)
@@ -29783,6 +30166,14 @@
/obj/effect/turf_decal/tile/red/half/contrasted,
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
+"ixF" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/trinary/filter/flipped/layer2{
+ dir = 4
+ },
+/obj/effect/turf_decal/box,
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"ixG" = (
/obj/effect/turf_decal/bot{
dir = 1
@@ -29793,14 +30184,6 @@
/obj/machinery/light/small/directional/east,
/turf/open/floor/iron/dark,
/area/station/engineering/engine_smes)
-"ixK" = (
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/airlock/research{
- name = "Ordnance Lab"
- },
-/obj/effect/mapping_helpers/airlock/access/all/science/ordnance,
-/turf/open/floor/iron/white,
-/area/station/science/ordnance/office)
"ixZ" = (
/obj/machinery/door/airlock/command/glass{
name = "Chief Engineer"
@@ -29814,10 +30197,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/ce)
-"iye" = (
-/obj/structure/bookcase/random,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"iyg" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/obj/effect/turf_decal/tile/red/half/contrasted{
@@ -29858,14 +30237,6 @@
/obj/machinery/photocopier/prebuilt,
/turf/open/floor/iron/white,
/area/station/medical/medbay/aft)
-"iyQ" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/machinery/duct,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"iyY" = (
/obj/effect/spawner/structure/window/reinforced/tinted,
/turf/open/floor/plating,
@@ -30077,11 +30448,6 @@
/obj/structure/cable,
/turf/open/floor/iron/showroomfloor,
/area/station/security/prison/work)
-"iCq" = (
-/obj/structure/rack,
-/obj/item/stack/rods/ten,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"iCz" = (
/obj/structure/table/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -30126,6 +30492,13 @@
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
/area/station/maintenance/fore)
+"iDf" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/brown/visible/layer2,
+/turf/closed/wall/r_wall,
+/area/station/maintenance/disposal/incinerator)
"iDp" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/closed/wall,
@@ -30147,11 +30520,12 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron,
/area/station/science/xenobiology)
-"iDQ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
+"iDZ" = (
+/obj/machinery/camera/directional/west{
+ c_tag = "Atmospherics - Mix"
+ },
+/turf/open/floor/engine/airless,
+/area/station/engineering/atmos)
"iEt" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -30235,6 +30609,14 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central)
+"iFn" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/grille/broken,
+/obj/effect/spawner/random/structure/steam_vent,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"iFs" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/disposalpipe/segment{
@@ -30248,6 +30630,13 @@
/obj/effect/spawner/random/trash/janitor_supplies,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
+"iFN" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/structure/closet/radiation,
+/turf/open/floor/iron/checker,
+/area/station/engineering/atmos)
"iFX" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -30311,6 +30700,10 @@
},
/turf/open/floor/iron,
/area/station/security/brig/upper)
+"iGC" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"iGH" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/disposalpipe/segment{
@@ -30345,6 +30738,24 @@
},
/turf/open/floor/iron/dark,
/area/station/science/ordnance/office)
+"iHd" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Internal to Filter"
+ },
+/obj/effect/turf_decal/trimline/red/arrow_cw,
+/obj/effect/turf_decal/box/red/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/red/corners{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"iHp" = (
/turf/closed/wall/r_wall,
/area/station/ai/satellite/chamber)
@@ -30395,14 +30806,6 @@
dir = 1
},
/area/station/service/bar)
-"iIs" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"iIA" = (
/obj/effect/turf_decal/bot,
/turf/open/floor/iron,
@@ -30457,19 +30860,6 @@
dir = 8
},
/area/station/command/heads_quarters/rd)
-"iJD" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/research{
- name = "Ordnance Launch Room"
- },
-/obj/effect/mapping_helpers/airlock/unres/delayed,
-/obj/effect/mapping_helpers/airlock/access/all/science/ordnance,
-/turf/open/floor/plating,
-/area/station/science/ordnance/testlab)
"iJE" = (
/obj/structure/rack,
/obj/structure/window/reinforced/spawner/directional/north,
@@ -30488,14 +30878,6 @@
},
/turf/open/floor/iron,
/area/mine/laborcamp/security)
-"iJK" = (
-/obj/structure/lattice/catwalk,
-/obj/structure/railing,
-/obj/structure/railing{
- dir = 1
- },
-/turf/open/openspace,
-/area/station/engineering/atmos/storage)
"iJL" = (
/obj/effect/landmark/start/hangover,
/turf/open/floor/plastic,
@@ -30607,10 +30989,6 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
/area/mine/production)
-"iLf" = (
-/obj/machinery/atmospherics/pipe/smart/simple/brown/visible,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"iLh" = (
/turf/closed/wall,
/area/station/maintenance/port/lesser)
@@ -30637,6 +31015,11 @@
/obj/item/flashlight/lantern,
/turf/open/floor/iron/dark,
/area/station/service/chapel)
+"iLv" = (
+/obj/effect/turf_decal/tile/purple/opposingcorners,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"iLy" = (
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 8
@@ -30654,13 +31037,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/entry)
-"iLE" = (
-/obj/structure/railing{
- dir = 1
- },
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"iLK" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -30678,15 +31054,6 @@
/obj/structure/railing/corner,
/turf/open/floor/stone,
/area/station/commons/lounge)
-"iMf" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 4
- },
-/obj/machinery/holopad,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"iMg" = (
/obj/effect/turf_decal/tile/red/half/contrasted,
/obj/machinery/button/flasher{
@@ -30741,6 +31108,23 @@
"iMT" = (
/turf/open/floor/iron,
/area/station/commons/storage/primary)
+"iNe" = (
+/obj/effect/turf_decal/siding/wideplating,
+/obj/structure/cable,
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
+"iNh" = (
+/obj/machinery/door/airlock/atmos/glass{
+ name = "Distribution Loop"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/pumproom)
"iNl" = (
/obj/structure/fence/cut/large{
dir = 1
@@ -30816,6 +31200,18 @@
},
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"iOe" = (
+/obj/effect/turf_decal/stripes/corner,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/railing/corner/end{
+ dir = 4
+ },
+/obj/structure/disposalpipe/junction{
+ dir = 2
+ },
+/turf/open/floor/iron,
+/area/station/engineering/lobby)
"iOh" = (
/obj/effect/turf_decal/weather/snow/corner{
dir = 8
@@ -30833,6 +31229,26 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/mine/eva)
+"iOD" = (
+/obj/effect/turf_decal/siding/wideplating,
+/obj/machinery/atmospherics/components/binary/pump/layer4{
+ dir = 4;
+ name = "Pure to Incinerator"
+ },
+/obj/machinery/atmospherics/components/binary/pump/layer2{
+ dir = 4;
+ name = "Pure to Basement"
+ },
+/obj/item/radio/intercom/directional/north,
+/obj/machinery/light/warm/directional/north,
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/turf/open/floor/iron/textured_large,
+/area/station/engineering/atmos)
"iOF" = (
/obj/machinery/door/poddoor/preopen{
id = "heads_meeting";
@@ -30858,13 +31274,6 @@
},
/turf/open/floor/iron,
/area/station/security/checkpoint/supply)
-"iOZ" = (
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"iPm" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -30963,11 +31372,6 @@
/obj/machinery/status_display/ai/directional/south,
/turf/open/floor/iron,
/area/station/cargo/miningdock)
-"iQF" = (
-/obj/effect/turf_decal/trimline/yellow/filled/line,
-/obj/machinery/airalarm/directional/south,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"iQK" = (
/obj/structure/table,
/obj/item/dice/d4{
@@ -30979,16 +31383,6 @@
/obj/structure/sign/poster/official/random/directional/south,
/turf/open/floor/iron,
/area/station/cargo/storage)
-"iQM" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/airalarm/directional/south,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"iQN" = (
/obj/machinery/firealarm/directional/east,
/obj/structure/cable,
@@ -31002,6 +31396,10 @@
/obj/effect/spawner/structure/window/reinforced/tinted,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
+"iQV" = (
+/obj/structure/fence,
+/turf/open/misc/asteroid/snow/icemoon,
+/area/icemoon/surface/outdoors/less_spawns)
"iQX" = (
/obj/structure/chair/sofa/bench{
dir = 1
@@ -31040,13 +31438,6 @@
},
/turf/open/floor/iron/dark/smooth_large,
/area/station/security/checkpoint/engineering)
-"iRw" = (
-/obj/machinery/camera/directional/east{
- c_tag = "Atmospherics - West"
- },
-/obj/machinery/status_display/evac/directional/east,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"iRx" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -31086,12 +31477,6 @@
/obj/item/radio/intercom/directional/west,
/turf/open/floor/iron,
/area/station/security/brig/upper)
-"iSl" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Mix to Port"
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"iSn" = (
/obj/structure/table,
/obj/effect/spawner/random/maintenance/three,
@@ -31166,6 +31551,16 @@
/obj/effect/spawner/random/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
+"iTC" = (
+/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
+ dir = 10
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
+"iTD" = (
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"iTP" = (
/obj/item/reagent_containers/cup/bucket,
/obj/effect/turf_decal/trimline/green/filled/line,
@@ -31176,10 +31571,23 @@
"iTR" = (
/turf/open/floor/carpet,
/area/station/command/heads_quarters/hop)
-"iTY" = (
-/obj/machinery/light/small/directional/east,
-/turf/open/floor/engine/plasma,
-/area/station/engineering/atmos)
+"iUj" = (
+/obj/machinery/computer/turbine_computer{
+ dir = 1;
+ mapping_id = "main_turbine"
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/machinery/power/terminal{
+ dir = 8
+ },
+/obj/machinery/light/warm/directional/south,
+/obj/machinery/newscaster/directional/south,
+/turf/open/floor/iron/dark/textured,
+/area/station/maintenance/disposal/incinerator)
"iUm" = (
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating,
@@ -31327,6 +31735,11 @@
/obj/machinery/light/small/dim/directional/south,
/turf/open/floor/plating,
/area/station/maintenance/department/chapel)
+"iWw" = (
+/obj/effect/turf_decal/tile/purple/opposingcorners,
+/obj/structure/reagent_dispensers/watertank,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"iWA" = (
/obj/structure/closet,
/obj/effect/spawner/random/clothing/gloves,
@@ -31378,16 +31791,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/construction)
-"iXq" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "N2O to Pure"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/iron/cafeteria,
-/area/station/engineering/atmos)
+"iXB" = (
+/obj/structure/table/reinforced,
+/obj/item/pipe_dispenser,
+/obj/item/multitool,
+/obj/machinery/status_display/evac/directional/west,
+/obj/structure/sign/poster/official/moth_hardhat/directional/south,
+/turf/open/floor/iron/dark/smooth_large,
+/area/station/engineering/atmos/hfr_room)
"iXC" = (
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
@@ -31398,12 +31809,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/station/maintenance/department/chapel)
-"iXK" = (
-/obj/structure/reagent_dispensers/plumbed{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"iXM" = (
/obj/structure/table,
/obj/item/stack/sheet/iron/five,
@@ -31446,16 +31851,6 @@
"iYb" = (
/turf/closed/wall,
/area/station/maintenance/central/greater)
-"iYd" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 8
- },
-/obj/machinery/duct,
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/structure/sign/warning/radiation/rad_area/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"iYk" = (
/obj/structure/table,
/obj/item/storage/box/chemimp{
@@ -31560,11 +31955,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"iZr" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/electrolyzer,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"iZx" = (
/obj/machinery/portable_atmospherics/canister/anesthetic_mix,
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
@@ -31583,11 +31973,6 @@
},
/turf/open/floor/wood/large,
/area/station/commons/lounge)
-"iZO" = (
-/obj/machinery/status_display/ai/directional/west,
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"iZQ" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron/white/side{
@@ -31680,22 +32065,6 @@
dir = 8
},
/area/station/medical/chem_storage)
-"jaO" = (
-/obj/machinery/door/airlock/atmos/glass{
- name = "Turbine Access"
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/door/firedoor/heavy,
-/obj/structure/disposalpipe/segment,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"jaW" = (
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/tile/red/half/contrasted,
@@ -31811,16 +32180,6 @@
"jbU" = (
/turf/closed/wall,
/area/station/command/heads_quarters/rd)
-"jco" = (
-/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
- dir = 6
- },
-/obj/effect/turf_decal/siding/wideplating{
- dir = 1
- },
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
"jcr" = (
/obj/structure/bodycontainer/morgue,
/obj/effect/decal/cleanable/dirt,
@@ -31847,6 +32206,14 @@
},
/turf/open/floor/iron/grimy,
/area/station/service/bar/backroom)
+"jcu" = (
+/obj/effect/turf_decal/tile/green/anticorner/contrasted,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "Mix Outlet Pump"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"jcA" = (
/obj/machinery/light/small/directional/north,
/obj/structure/sign/departments/cargo/directional/north,
@@ -31969,6 +32336,18 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
+"jeA" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/structure/table,
+/obj/item/paper_bin/construction,
+/obj/item/storage/crayons{
+ pixel_x = -3;
+ pixel_y = -2
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"jeB" = (
/obj/structure/table,
/obj/item/circular_saw,
@@ -32001,13 +32380,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
-"jeR" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/airlock_controller/incinerator_atmos{
- pixel_x = 26
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"jfb" = (
/obj/machinery/mech_bay_recharge_port{
dir = 2
@@ -32042,20 +32414,10 @@
/obj/structure/table/wood,
/turf/open/floor/iron/dark,
/area/station/security/prison/rec)
-"jgl" = (
-/obj/effect/turf_decal/trimline/dark_blue/corner{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
-"jgn" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/station/engineering/atmos)
+"jgj" = (
+/obj/structure/bookcase,
+/turf/open/floor/iron/grimy,
+/area/station/maintenance/aft/lesser)
"jgs" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/glass,
@@ -32095,6 +32457,12 @@
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/iron/dark/smooth_half,
/area/station/medical/morgue)
+"jhc" = (
+/obj/machinery/atmospherics/components/unary/thermomachine/heater,
+/obj/effect/turf_decal/bot_red,
+/obj/structure/extinguisher_cabinet/directional/north,
+/turf/open/floor/iron/textured,
+/area/station/engineering/atmos)
"jhf" = (
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/turf/open/floor/iron/white,
@@ -32124,14 +32492,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"jhC" = (
-/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{
- color = "#0000ff";
- dir = 4;
- name = "Supply multi deck pipe adapter"
- },
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"jhD" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -32289,22 +32649,6 @@
},
/turf/open/floor/plating,
/area/station/engineering/storage/tech)
-"jkS" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
-/obj/machinery/duct,
-/obj/effect/turf_decal/siding/yellow/corner{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
-"jkW" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"jkX" = (
/obj/structure/fence{
dir = 2
@@ -32405,6 +32749,20 @@
/obj/machinery/light/small/directional/east,
/turf/open/floor/iron/freezer,
/area/station/commons/toilet)
+"jlU" = (
+/obj/structure/tank_dispenser{
+ pixel_x = -1
+ },
+/obj/machinery/camera/directional/north{
+ c_tag = "Atmospherics - Monitoring"
+ },
+/obj/structure/window/reinforced/spawner/directional/east,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/storage/gas)
"jlV" = (
/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
dir = 4
@@ -32451,12 +32809,6 @@
},
/turf/open/floor/iron/grimy,
/area/station/service/chapel/office)
-"jmY" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/mapping_helpers/broken_floor,
-/obj/effect/turf_decal/siding/wood,
-/turf/open/floor/wood,
-/area/station/maintenance/aft/greater)
"jnm" = (
/obj/machinery/door/airlock/engineering{
name = "Utilities Room"
@@ -32532,6 +32884,13 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plating,
/area/station/security/checkpoint/medical)
+"joc" = (
+/obj/effect/landmark/event_spawn,
+/obj/structure/cable,
+/turf/open/floor/iron/edge{
+ dir = 8
+ },
+/area/station/engineering/lobby)
"jog" = (
/obj/structure/table/optable{
name = "Robotics Operating Table"
@@ -32567,6 +32926,17 @@
/obj/machinery/power/apc/auto_name/directional/south,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
+"joH" = (
+/obj/effect/spawner/random/clothing/costume,
+/obj/structure/table,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
+"joI" = (
+/obj/structure/chair/sofa/corp/right,
+/obj/effect/landmark/start/hangover,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron/dark,
+/area/station/engineering/lobby)
"jpd" = (
/obj/machinery/vending/coffee,
/turf/open/floor/iron,
@@ -32589,6 +32959,12 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/service/bar)
+"jpm" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/project)
"jpo" = (
/obj/machinery/door/poddoor/preopen{
id = "maint2"
@@ -32639,13 +33015,6 @@
"jpS" = (
/turf/closed/wall/r_wall,
/area/station/cargo/warehouse)
-"jpT" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/random/trash/grille_or_waste,
-/obj/machinery/duct,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"jqc" = (
/obj/machinery/door/airlock/external{
glass = 1;
@@ -32667,6 +33036,17 @@
/obj/structure/sign/poster/contraband/random/directional/north,
/turf/open/floor/plating,
/area/station/maintenance/port/lesser)
+"jql" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/smooth_large,
+/area/station/engineering/atmos/hfr_room)
"jqr" = (
/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -32718,6 +33098,10 @@
"jqT" = (
/turf/closed/wall/r_wall,
/area/station/engineering/storage/tech)
+"jqZ" = (
+/obj/structure/closet/l3closet,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"jre" = (
/turf/closed/wall,
/area/station/maintenance/starboard/lesser)
@@ -32821,6 +33205,10 @@
/obj/effect/spawner/random/clothing/twentyfive_percent_cyborg_mask,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
+"jsV" = (
+/obj/item/rack_parts,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"jtm" = (
/obj/machinery/porta_turret/ai{
dir = 4;
@@ -32834,6 +33222,12 @@
/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
+"jtr" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"jtx" = (
/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/red,
@@ -32921,6 +33315,10 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
+"jtR" = (
+/obj/effect/spawner/random/engineering/tank,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"jtV" = (
/obj/structure/table,
/obj/item/multitool,
@@ -32989,12 +33387,6 @@
/obj/effect/turf_decal/stripes/box,
/turf/open/floor/iron/smooth,
/area/station/maintenance/port/aft)
-"juQ" = (
-/obj/structure/rack,
-/obj/item/stack/rods/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"juS" = (
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/directional/north,
@@ -33043,17 +33435,6 @@
},
/turf/open/floor/plating,
/area/station/security/detectives_office)
-"jvR" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
-"jvS" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"jvU" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 5
@@ -33107,6 +33488,13 @@
/obj/structure/sign/nanotrasen/directional/north,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
+"jwB" = (
+/obj/effect/turf_decal/tile/purple/anticorner/contrasted{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/green/visible,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"jwC" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -33204,6 +33592,13 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
+"jyt" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"jyy" = (
/obj/structure/railing{
dir = 9
@@ -33290,19 +33685,6 @@
},
/turf/open/floor/iron/smooth_corner,
/area/station/command/heads_quarters/rd)
-"jzI" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/railing{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 8
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"jzL" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/mining/glass{
@@ -33355,6 +33737,13 @@
},
/turf/open/floor/iron/dark/textured,
/area/station/security/warden)
+"jAl" = (
+/obj/structure/sign/warning/cold_temp/directional/north,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
+"jAo" = (
+/turf/open/openspace,
+/area/station/maintenance/department/medical/central)
"jAq" = (
/obj/effect/turf_decal/tile/brown/anticorner/contrasted{
dir = 4
@@ -33379,6 +33768,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/smooth,
/area/station/engineering/lobby)
+"jAE" = (
+/obj/machinery/status_display/ai/directional/west,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"jAF" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -33402,19 +33795,19 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron,
/area/station/science/explab)
-"jAO" = (
-/obj/effect/turf_decal/siding/yellow{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"jAQ" = (
/obj/structure/window/reinforced/fulltile/ice{
name = "frozen window"
},
/turf/open/floor/plating,
/area/station/maintenance/space_hut/cabin)
+"jAV" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"jBd" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -33453,13 +33846,15 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark/textured,
/area/station/security/brig)
-"jBR" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/heater{
+"jCa" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/railing/corner/end{
dir = 8
},
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"jCl" = (
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
@@ -33677,6 +34072,14 @@
},
/turf/open/floor/iron/dark,
/area/mine/laborcamp/security)
+"jER" = (
+/obj/effect/turf_decal/tile/purple/anticorner/contrasted,
+/obj/machinery/atmospherics/components/binary/pump/off{
+ dir = 1;
+ name = "Plasma To Pure"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"jEU" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -33754,6 +34157,20 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/station/tcommsat/computer)
+"jGm" = (
+/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,
+/obj/machinery/light/warm/directional/south,
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 4
+ },
+/obj/machinery/meter,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos)
"jGo" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
@@ -33785,15 +34202,6 @@
/obj/machinery/light/directional/north,
/turf/open/floor/iron/freezer,
/area/station/commons/toilet)
-"jHQ" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer1{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"jHS" = (
/obj/structure/fence/corner{
dir = 8
@@ -33980,6 +34388,16 @@
/obj/machinery/light/floor,
/turf/open/floor/iron,
/area/station/security/brig/upper)
+"jJC" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/box/white{
+ color = "#008000"
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/project)
"jJI" = (
/obj/structure/cable,
/turf/open/floor/iron/smooth,
@@ -34000,6 +34418,17 @@
},
/turf/open/floor/iron/white/smooth_large,
/area/station/service/kitchen)
+"jJS" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/railing/corner/end/flip,
+/obj/structure/railing/corner/end{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"jJV" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -34067,11 +34496,6 @@
},
/turf/open/floor/iron/smooth,
/area/station/commons/storage/mining)
-"jKy" = (
-/obj/machinery/holopad,
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"jKA" = (
/obj/machinery/light/floor,
/obj/effect/turf_decal/tile/dark/fourcorners,
@@ -34088,12 +34512,6 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
-"jKI" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"jKJ" = (
/obj/effect/mapping_helpers/airlock/unres/delayed{
dir = 1
@@ -34163,22 +34581,14 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
-"jLl" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/obj/effect/turf_decal/siding/yellow{
- dir = 8
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/computer/atmos_control/nocontrol/master{
+"jLm" = (
+/obj/effect/turf_decal/tile/green/anticorner/contrasted{
dir = 1
},
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/iron/dark/corner,
-/area/station/engineering/atmos/storage/gas)
+/obj/machinery/produceporter,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/smooth,
+/area/station/security/prison/garden)
"jLt" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -34207,21 +34617,6 @@
/obj/machinery/light/small/directional/west,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
-"jLQ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"jLU" = (
/obj/machinery/disposal/bin,
/obj/effect/turf_decal/bot,
@@ -34287,6 +34682,14 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
+"jMp" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/structure/closet,
+/obj/effect/spawner/random/maintenance,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"jMr" = (
/obj/effect/spawner/random/structure/crate,
/obj/effect/spawner/random/trash/botanical_waste,
@@ -34322,6 +34725,12 @@
/obj/structure/sign/calendar/directional/north,
/turf/open/floor/iron,
/area/station/commons/dorms)
+"jMz" = (
+/obj/structure/chair/plastic{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"jME" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
@@ -34339,15 +34748,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
-"jMY" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 4
- },
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"jNb" = (
/obj/machinery/status_display/ai/directional/south,
/turf/closed/wall/r_wall,
@@ -34391,10 +34791,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
-"jOp" = (
-/obj/effect/spawner/random/structure/steam_vent,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"jOt" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
@@ -34497,13 +34893,6 @@
/obj/effect/turf_decal/tile/red/full,
/turf/open/floor/iron/dark/smooth_large,
/area/station/security/checkpoint/medical)
-"jPo" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"jPq" = (
/obj/structure/cable,
/obj/structure/disposalpipe/junction{
@@ -34520,16 +34909,19 @@
},
/turf/open/floor/plating,
/area/station/maintenance/fore/lesser)
-"jPu" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/dark_blue/line,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"jPv" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/fore)
+"jPD" = (
+/obj/item/cigbutt,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/random/engineering/tracking_beacon,
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"jPL" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -34762,13 +35154,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/science/genetics)
-"jTT" = (
-/obj/structure/chair/stool/directional/east,
-/obj/machinery/light/floor,
-/turf/open/floor/iron/half{
- dir = 1
- },
-/area/station/engineering/atmos)
"jTZ" = (
/obj/machinery/door/airlock/command/glass{
name = "Server Room"
@@ -34860,10 +35245,6 @@
/obj/effect/turf_decal/tile/red,
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
-"jVa" = (
-/obj/effect/spawner/random/maintenance,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"jVp" = (
/obj/item/kirbyplants/fern,
/turf/open/floor/plating,
@@ -34884,6 +35265,10 @@
/obj/structure/window/reinforced/spawner/directional/west,
/turf/open/floor/iron,
/area/station/science/xenobiology)
+"jVz" = (
+/obj/structure/sign/warning/fire/directional/east,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/underground/explored)
"jVE" = (
/obj/effect/turf_decal/box/white,
/turf/open/floor/engine,
@@ -34922,12 +35307,6 @@
},
/turf/open/floor/iron/smooth_large,
/area/station/science/cytology)
-"jWt" = (
-/obj/structure/cable,
-/obj/structure/closet/radiation,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/disposal/incinerator)
"jWO" = (
/obj/structure/table/reinforced,
/obj/item/book/manual/wiki/security_space_law{
@@ -34967,12 +35346,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
-"jXr" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/corner,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"jXx" = (
/obj/item/radio/intercom/prison/directional/east,
/obj/structure/gulag_beacon,
@@ -34996,6 +35369,12 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/command/gateway)
+"jXR" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/station/maintenance/aft/lesser)
"jYc" = (
/obj/effect/spawner/random/trash/grille_or_waste,
/turf/open/floor/plating,
@@ -35021,13 +35400,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/cargo/sorting)
-"jYH" = (
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
- dir = 9
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/engineering/atmos)
"jYL" = (
/obj/effect/spawner/random/techstorage/rnd_secure_all,
/obj/structure/rack,
@@ -35082,6 +35454,12 @@
},
/turf/open/floor/stone,
/area/station/service/bar/atrium)
+"jZn" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 1
+ },
+/turf/open/floor/plating/snowed/icemoon,
+/area/icemoon/surface/outdoors/less_spawns)
"jZo" = (
/obj/structure/fence{
dir = 2
@@ -35091,6 +35469,18 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"jZq" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/red/arrow_cw{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"jZr" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/extinguisher_cabinet/directional/east,
@@ -35152,6 +35542,17 @@
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron/dark,
/area/station/engineering/transit_tube)
+"jZV" = (
+/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{
+ color = "#ff0000";
+ dir = 4;
+ name = "Scrubbers multi deck pipe adapter"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"jZY" = (
/obj/structure/tank_holder/extinguisher,
/obj/effect/turf_decal/stripes/line{
@@ -35201,6 +35602,15 @@
},
/turf/open/floor/plating,
/area/station/maintenance/disposal)
+"kbr" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/status_display/evac/directional/east,
+/turf/open/floor/iron/textured,
+/area/station/engineering/atmos/mix)
"kbs" = (
/obj/effect/turf_decal/loading_area{
dir = 1
@@ -35224,6 +35634,13 @@
},
/turf/open/floor/iron,
/area/station/maintenance/starboard/fore)
+"kbO" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/machinery/light/small/dim/directional/east,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"kbZ" = (
/obj/structure/cable,
/turf/open/floor/engine,
@@ -35238,14 +35655,6 @@
},
/turf/open/floor/iron/white/textured,
/area/station/security/medical)
-"kce" = (
-/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{
- color = "#ff0000";
- dir = 4;
- name = "Scrubbers multi deck pipe adapter"
- },
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"kcD" = (
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -35292,15 +35701,6 @@
/obj/effect/spawner/random/structure/steam_vent,
/turf/open/floor/iron/smooth,
/area/station/maintenance/port/fore)
-"kdc" = (
-/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{
- dir = 8
- },
-/obj/effect/turf_decal/siding/wideplating{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
"kdg" = (
/obj/structure/railing,
/turf/open/floor/iron/stairs/medium{
@@ -35328,6 +35728,9 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
/area/station/maintenance/disposal/incinerator)
+"kdE" = (
+/turf/open/floor/iron/freezer,
+/area/station/science/xenobiology)
"kdF" = (
/obj/effect/spawner/random/vending/snackvend,
/turf/open/floor/iron,
@@ -35354,12 +35757,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
-"kdY" = (
-/obj/machinery/camera/directional/north{
- c_tag = "Atmospherics Waste Tank"
- },
-/turf/open/floor/engine/vacuum,
-/area/station/engineering/atmos)
"kea" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -35484,12 +35881,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"kgg" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/mix_input{
- dir = 8
- },
-/turf/open/floor/engine/vacuum,
-/area/station/engineering/atmos)
"kgl" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/disposalpipe/segment,
@@ -35551,12 +35942,19 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron/cafeteria,
/area/station/commons/dorms/laundry)
-"khe" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{
+"kha" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
dir = 1
},
+/obj/machinery/atmospherics/pipe/smart/simple/brown/visible/layer2{
+ dir = 10
+ },
/turf/open/floor/iron,
-/area/station/engineering/atmos)
+/area/station/maintenance/disposal/incinerator)
"khr" = (
/obj/effect/spawner/structure/window/hollow/reinforced/middle{
dir = 4
@@ -35567,6 +35965,21 @@
/obj/effect/spawner/random/engineering/atmospherics_portable,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"kht" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/orange/visible,
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos)
"khu" = (
/obj/structure/closet/toolcloset,
/obj/effect/decal/cleanable/dirt,
@@ -35638,6 +36051,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/carpet,
/area/station/command/meeting_room)
+"kiM" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/portable_atmospherics/canister,
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"kiO" = (
/obj/effect/landmark/event_spawn,
/obj/structure/cable,
@@ -35753,13 +36175,19 @@
/obj/structure/cable,
/turf/open/floor/iron/smooth_half,
/area/station/medical/chemistry)
-"kjy" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
- dir = 6
+"kjE" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/obj/structure/railing/corner/end/flip{
+ dir = 4
},
-/turf/open/floor/plating,
-/area/station/engineering/atmos/pumproom)
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/effect/turf_decal/stripes/white/line,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos)
"kjK" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -35811,6 +36239,10 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/command/eva)
+"kkd" = (
+/obj/machinery/status_display/evac/directional/west,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"kke" = (
/obj/machinery/door/airlock/maintenance,
/obj/structure/cable,
@@ -35912,10 +36344,34 @@
dir = 1
},
/area/station/medical/chemistry)
+"klw" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"klW" = (
/obj/structure/window/reinforced/spawner/directional/south,
/turf/open/floor/iron,
/area/station/science/xenobiology)
+"kmf" = (
+/obj/effect/turf_decal/siding/wideplating,
+/obj/machinery/light/warm/directional/north,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Distro to Waste"
+ },
+/obj/effect/turf_decal/box/red/corners{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/red/corners{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
"kmi" = (
/obj/effect/landmark/blobstart,
/obj/structure/cable,
@@ -35938,17 +36394,6 @@
},
/turf/open/floor/iron/dark/smooth_half,
/area/station/medical/morgue)
-"kmw" = (
-/obj/machinery/duct,
-/obj/effect/turf_decal/siding/yellow{
- dir = 1
- },
-/obj/structure/cable,
-/obj/structure/disposalpipe/junction/flip{
- dir = 2
- },
-/turf/open/floor/iron,
-/area/station/engineering/lobby)
"kmE" = (
/turf/closed/wall,
/area/station/maintenance/department/security)
@@ -35961,10 +36406,6 @@
},
/turf/open/floor/iron/large,
/area/station/medical/treatment_center)
-"kmM" = (
-/obj/effect/decal/cleanable/generic,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"kmN" = (
/obj/machinery/suit_storage_unit/security,
/obj/effect/turf_decal/tile/red/half/contrasted,
@@ -35986,6 +36427,13 @@
/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
+"kmV" = (
+/obj/effect/decal/cleanable/glass,
+/obj/item/storage/test_tube_rack{
+ pixel_y = 2
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"kmX" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -36017,11 +36465,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/security/prison/workout)
-"knX" = (
-/obj/machinery/status_display/evac/directional/east,
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
+"knR" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/structure/railing/corner/end{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"koa" = (
/obj/machinery/light/cold/directional/north,
/obj/effect/turf_decal/trimline/purple/filled/line{
@@ -36052,13 +36504,6 @@
},
/turf/open/floor/iron/large,
/area/station/commons/locker)
-"koO" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/station/engineering/atmos)
"kpg" = (
/obj/machinery/door/airlock/external{
glass = 1;
@@ -36092,19 +36537,6 @@
"kpC" = (
/turf/closed/wall/r_wall,
/area/station/engineering/atmos/mix)
-"kpG" = (
-/obj/structure/table/reinforced,
-/obj/item/hfr_box/body/waste_output{
- pixel_x = 5;
- pixel_y = -1
- },
-/obj/item/hfr_box/body/moderator_input{
- pixel_x = -5;
- pixel_y = 8
- },
-/obj/item/radio/intercom/directional/west,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"kpX" = (
/obj/structure/bed/medical{
dir = 4
@@ -36162,19 +36594,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"kqq" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 1;
- name = "Air Outlet Pump"
- },
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 5
- },
-/obj/effect/turf_decal/tile/blue/opposingcorners{
- dir = 1
- },
-/turf/open/floor/iron/white/corner,
-/area/station/engineering/atmos)
"kqt" = (
/obj/effect/turf_decal/tile/brown/anticorner/contrasted{
dir = 4
@@ -36272,16 +36691,6 @@
/obj/machinery/telecomms/bus/preset_four,
/turf/open/floor/iron/dark/telecomms,
/area/station/tcommsat/server)
-"ksb" = (
-/obj/effect/turf_decal/delivery,
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/disposal/bin,
-/obj/structure/cable,
-/obj/structure/disposalpipe/trunk,
-/obj/structure/sign/warning/fire/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/disposal/incinerator)
"ksc" = (
/obj/structure/railing/corner/end/flip{
dir = 8
@@ -36352,6 +36761,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark/textured,
/area/station/hallway/secondary/entry)
+"ksW" = (
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"kta" = (
/turf/closed/wall,
/area/station/commons/storage/mining)
@@ -36397,6 +36810,14 @@
/obj/effect/spawner/random/engineering/tracking_beacon,
/turf/open/floor/iron,
/area/station/command/bridge)
+"ktm" = (
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 1
+ },
+/obj/effect/spawner/structure/window,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/pumproom)
"ktp" = (
/obj/machinery/washing_machine,
/obj/effect/turf_decal/siding/blue{
@@ -36591,14 +37012,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
-"kwm" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{
- dir = 4
- },
-/obj/item/wrench,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"kwn" = (
/obj/structure/chair/office{
dir = 4
@@ -36638,13 +37051,6 @@
/obj/structure/grille,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/central)
-"kxe" = (
-/obj/structure/rack,
-/obj/item/poster/random_official,
-/obj/effect/spawner/random/maintenance,
-/obj/item/relic,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"kxp" = (
/obj/machinery/door/airlock/security/glass{
name = "Security Desk"
@@ -36723,6 +37129,17 @@
dir = 5
},
/area/station/hallway/secondary/entry)
+"kyj" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/camera/directional/west{
+ c_tag = "Atmospherics - Incinerator Access"
+ },
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/project)
"kyp" = (
/obj/effect/turf_decal/box/corners,
/obj/effect/turf_decal/box/corners{
@@ -36823,6 +37240,20 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/cargo/storage)
+"kzi" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/disposalpipe/segment,
+/obj/effect/decal/cleanable/generic,
+/obj/effect/spawner/random/trash/cigbutt,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
+"kzo" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible,
+/obj/effect/spawner/structure/window,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/mix)
"kzv" = (
/obj/structure/bed,
/obj/effect/spawner/random/bedsheet/any,
@@ -36886,6 +37317,16 @@
dir = 10
},
/area/station/science/research)
+"kzS" = (
+/obj/effect/turf_decal/tile/red/opposingcorners{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/binary/pump/off{
+ dir = 1;
+ name = "N2O To Pure"
+ },
+/turf/open/floor/iron/white/corner,
+/area/station/engineering/atmos)
"kzZ" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
@@ -37002,20 +37443,6 @@
},
/turf/open/floor/plating,
/area/station/engineering/storage/tech)
-"kBi" = (
-/obj/effect/mapping_helpers/airlock/abandoned,
-/obj/machinery/door/airlock/atmos{
- name = "Atmospherics Maintenance"
- },
-/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/unres/delayed{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"kBy" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -37024,6 +37451,18 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
+"kBE" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 1
+ },
+/obj/machinery/meter/layer4,
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"kBL" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 1
@@ -37165,12 +37604,6 @@
/obj/machinery/newscaster/directional/north,
/turf/open/floor/iron,
/area/station/command/teleporter)
-"kDc" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input{
- dir = 8
- },
-/turf/open/floor/engine/vacuum,
-/area/station/maintenance/disposal/incinerator)
"kDj" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/iron,
@@ -37279,6 +37712,19 @@
/obj/item/stack/cable_coil/five,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
+"kFd" = (
+/obj/machinery/duct,
+/obj/effect/turf_decal/siding/yellow{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron,
+/area/station/engineering/lobby)
+"kFs" = (
+/obj/effect/spawner/structure/window/hollow/reinforced/plasma/middle,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/hfr_room)
"kFu" = (
/obj/structure/table,
/obj/item/stack/sheet/iron/fifty,
@@ -37303,12 +37749,6 @@
},
/turf/open/floor/iron/dark,
/area/mine/laborcamp/security)
-"kFH" = (
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
- dir = 10
- },
-/turf/open/floor/glass/reinforced,
-/area/station/engineering/atmos/pumproom)
"kFN" = (
/obj/structure/chair/sofa/bench/right{
dir = 4
@@ -37387,6 +37827,14 @@
dir = 1
},
/area/station/commons/storage/art)
+"kGL" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/box/red,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/project)
"kGQ" = (
/obj/structure/table,
/obj/item/stamp/head/qm,
@@ -37400,6 +37848,12 @@
/obj/machinery/wall_healer/directional/south,
/turf/open/floor/iron/white/corner,
/area/station/hallway/secondary/exit/departure_lounge)
+"kGY" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 4
+ },
+/turf/open/floor/glass/reinforced,
+/area/station/engineering/atmos)
"kHb" = (
/obj/structure/closet/secure_closet/personal{
anchored = 1
@@ -37438,6 +37892,16 @@
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
+"kHJ" = (
+/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
+ dir = 5
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/meter,
+/obj/machinery/status_display/evac/directional/west,
+/obj/structure/sign/poster/official/there_is_no_gas_giant/directional/south,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/project)
"kHN" = (
/obj/machinery/firealarm/directional/north,
/turf/open/openspace,
@@ -37499,6 +37963,11 @@
},
/turf/open/floor/vault,
/area/station/security/prison/rec)
+"kIj" = (
+/obj/structure/girder,
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"kIl" = (
/obj/structure/disposalpipe/sorting/mail/flip{
dir = 8
@@ -37528,6 +37997,11 @@
/obj/effect/landmark/generic_maintenance_landmark,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
+"kIB" = (
+/obj/machinery/meter,
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
+/turf/closed/wall/r_wall,
+/area/station/engineering/atmos)
"kII" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -37622,13 +38096,6 @@
},
/turf/open/floor/iron/dark,
/area/station/science/ordnance)
-"kJK" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"kJO" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -37651,6 +38118,25 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/tcommsat/computer)
+"kJZ" = (
+/obj/structure/table,
+/obj/item/storage/box,
+/obj/item/storage/box,
+/obj/item/clothing/head/utility/welding{
+ pixel_x = -3;
+ pixel_y = 7
+ },
+/obj/item/clothing/head/utility/welding{
+ pixel_x = -5;
+ pixel_y = 3
+ },
+/obj/item/multitool,
+/obj/machinery/airalarm/directional/south,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/storage/gas)
"kKv" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/disposalpipe/sorting/mail{
@@ -37669,6 +38155,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark/textured,
/area/station/security/office)
+"kKF" = (
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/wood,
+/area/station/maintenance/aft/lesser)
"kKG" = (
/obj/item/radio/intercom/directional/west,
/obj/machinery/modular_computer/preset/id{
@@ -37742,6 +38232,12 @@
/obj/effect/spawner/random/maintenance,
/turf/open/floor/wood,
/area/station/maintenance/space_hut/cabin)
+"kLs" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light_switch/directional/east,
+/obj/machinery/firealarm/directional/south,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/project)
"kLy" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/research{
@@ -37774,12 +38270,6 @@
},
/turf/open/floor/iron,
/area/station/cargo/storage)
-"kMv" = (
-/obj/effect/turf_decal/trimline/yellow/filled/shrink_cw{
- dir = 4
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"kMN" = (
/obj/machinery/space_heater,
/turf/open/floor/plating,
@@ -37848,15 +38338,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"kNk" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden,
-/obj/effect/turf_decal/bot,
-/obj/structure/cable,
-/turf/open/floor/iron/large,
-/area/station/engineering/atmos/storage/gas)
"kNp" = (
/obj/structure/cable,
/turf/open/floor/iron/dark/telecomms,
@@ -37942,6 +38423,15 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
+"kOw" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/light/floor,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"kOx" = (
/obj/structure/table/wood,
/obj/machinery/duct,
@@ -37951,6 +38441,14 @@
},
/turf/open/floor/iron/dark,
/area/station/service/bar)
+"kOE" = (
+/obj/structure/sign/warning/cold_temp/directional/west,
+/obj/machinery/light/small/dim/directional/west,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"kOM" = (
/obj/structure/grille,
/obj/structure/window/reinforced/spawner/directional/north,
@@ -38063,10 +38561,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
-"kQf" = (
-/obj/structure/cable,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage/gas)
"kQg" = (
/obj/machinery/atmospherics/components/tank/air,
/turf/open/floor/plating,
@@ -38092,6 +38586,12 @@
},
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
+"kQu" = (
+/obj/effect/turf_decal/siding/wideplating/corner{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"kQB" = (
/obj/effect/turf_decal/tile/red/anticorner/contrasted,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -38132,16 +38632,6 @@
},
/turf/open/floor/iron/dark,
/area/station/security/mechbay)
-"kQY" = (
-/obj/effect/turf_decal/arrows/red{
- dir = 4;
- pixel_x = -15
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/station/engineering/atmos/hfr_room)
"kRc" = (
/obj/machinery/light/directional/west,
/obj/structure/closet/wardrobe/grey,
@@ -38149,19 +38639,10 @@
/obj/machinery/status_display/ai/directional/west,
/turf/open/floor/iron,
/area/station/commons/locker)
-"kRp" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/turf/open/floor/plating,
+"kRu" = (
+/obj/effect/spawner/random/trash/mess,
+/turf/open/floor/iron/grimy,
/area/station/maintenance/aft/lesser)
-"kRw" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/computer/atmos_control/nocontrol/incinerator{
- dir = 8
- },
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/disposal/incinerator)
"kRy" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -38176,18 +38657,14 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/science/robotics/mechbay)
-"kRJ" = (
-/obj/machinery/camera/directional/north{
- c_tag = "Atmospherics Distribution Loop"
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Distro to Waste"
- },
-/obj/effect/turf_decal/siding/wideplating,
-/obj/machinery/newscaster/directional/north,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
+"kRL" = (
+/obj/structure/grille/broken,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"kRP" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/department/medical/central)
@@ -38404,6 +38881,10 @@
/obj/machinery/light/floor,
/turf/open/floor/iron,
/area/station/cargo/storage)
+"kVo" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/turf/open/floor/plating/snowed/icemoon,
+/area/icemoon/surface/outdoors/less_spawns)
"kVv" = (
/obj/structure/frame/machine,
/obj/item/stack/cable_coil/five,
@@ -38429,11 +38910,6 @@
/obj/machinery/light/small/directional/north,
/turf/open/floor/iron,
/area/station/security/courtroom)
-"kVI" = (
-/obj/structure/closet/firecloset,
-/obj/structure/sign/warning/cold_temp/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"kVN" = (
/obj/item/radio/intercom/directional/west,
/obj/effect/decal/cleanable/dirt,
@@ -38477,13 +38953,6 @@
/obj/machinery/holopad/secure,
/turf/open/floor/iron/dark/smooth_large,
/area/station/command/heads_quarters/hos)
-"kWi" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"kWk" = (
/obj/structure/railing{
dir = 1
@@ -38550,30 +39019,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"kWW" = (
-/obj/machinery/door/airlock/atmos,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/door/firedoor/heavy,
-/obj/effect/turf_decal/trimline/yellow/corner,
-/obj/effect/turf_decal/trimline/yellow/corner{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/yellow/corner{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/yellow/corner{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable,
-/turf/open/floor/iron/dark/smooth_half{
- dir = 1
- },
-/area/station/engineering/atmos/hfr_room)
"kXl" = (
/obj/effect/gibspawner/human,
/obj/structure/sign/warning/directional/east,
@@ -38691,12 +39136,6 @@
/obj/machinery/meter/layer4,
/turf/open/floor/plating,
/area/station/maintenance/aft/greater)
-"kYi" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
- dir = 5
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"kYq" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
@@ -38783,6 +39222,10 @@
},
/turf/open/floor/plating/icemoon,
/area/station/science/ordnance/bomb/planet)
+"kZO" = (
+/obj/machinery/light/warm/directional/west,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"lab" = (
/obj/machinery/door/window/brigdoor/left/directional/north{
name = "Secure Weapons Storage";
@@ -38813,6 +39256,16 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark/textured,
/area/station/hallway/secondary/exit/departure_lounge)
+"laq" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 9
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"laB" = (
/obj/effect/spawner/random/engineering/atmospherics_portable,
/turf/open/floor/plating,
@@ -38860,12 +39313,6 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/iron/dark/side,
/area/mine/laborcamp/security)
-"laV" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"laY" = (
/obj/effect/spawner/random/maintenance/three,
/obj/structure/closet/crate,
@@ -38909,10 +39356,13 @@
dir = 1
},
/area/station/hallway/secondary/exit/departure_lounge)
-"lbs" = (
-/obj/structure/sign/warning/fire/directional/north,
-/turf/open/misc/asteroid/snow/icemoon,
-/area/icemoon/underground/explored)
+"lbx" = (
+/obj/structure/closet/emcloset,
+/obj/effect/turf_decal/tile/purple/opposingcorners,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/small/dim/directional/east,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"lby" = (
/obj/effect/decal/cleanable/greenglow,
/obj/effect/decal/cleanable/plastic,
@@ -38947,6 +39397,14 @@
"lcu" = (
/turf/open/floor/iron/white,
/area/station/science/explab)
+"lcz" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/railing,
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos/storage/gas)
"lcA" = (
/turf/closed/wall/r_wall,
/area/station/medical/chem_storage)
@@ -39241,12 +39699,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/catwalk_floor/iron_smooth,
/area/station/maintenance/port/fore)
-"lgW" = (
-/obj/machinery/meter/monitored/distro_loop,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible,
-/obj/effect/turf_decal/siding/wideplating,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
"lha" = (
/obj/structure/cable,
/obj/effect/spawner/structure/window/reinforced,
@@ -39490,6 +39942,11 @@
/obj/structure/closet/firecloset,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
+"lkv" = (
+/obj/effect/spawner/structure/window,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/pumproom)
"lkz" = (
/obj/structure/rack,
/turf/open/floor/plating,
@@ -39539,6 +39996,25 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
+"llz" = (
+/obj/structure/sign/warning/directional/north,
+/obj/structure/lattice/catwalk,
+/turf/open/openspace/icemoon/keep_below,
+/area/icemoon/underground/explored)
+"llB" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/yellow{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"llD" = (
/obj/structure/table/wood,
/obj/item/paper_bin/carbon,
@@ -39561,16 +40037,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"lme" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/sign/warning/fire/directional/west,
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"lmh" = (
/obj/effect/turf_decal/tile/red/anticorner/contrasted{
dir = 1
@@ -39581,10 +40047,6 @@
/obj/machinery/light/small/directional/north,
/turf/open/floor/iron/smooth,
/area/station/engineering/lobby)
-"lms" = (
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"lmx" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -39593,22 +40055,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/starboard/upper)
-"lmy" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
- dir = 5
- },
-/obj/machinery/igniter/incinerator_atmos,
-/turf/open/floor/engine/vacuum,
-/area/station/maintenance/disposal/incinerator)
-"lmA" = (
-/obj/effect/turf_decal/trimline/dark_green/corner,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 6
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage)
"lmB" = (
/obj/structure/railing{
dir = 8
@@ -39750,24 +40196,15 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/command/heads_quarters/hop)
+"loR" = (
+/obj/effect/spawner/structure/window/reinforced/tinted,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"loT" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/engineering/storage/tech)
-"loV" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"lpj" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -39813,6 +40250,10 @@
/obj/machinery/door/firedoor,
/turf/open/floor/iron/large,
/area/station/maintenance/aft/greater)
+"lpF" = (
+/obj/machinery/atmospherics/pipe/smart/simple/supply/visible,
+/turf/open/floor/glass/reinforced,
+/area/station/engineering/atmos/pumproom)
"lpH" = (
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -39849,20 +40290,6 @@
},
/turf/open/floor/iron,
/area/station/security/prison/mess)
-"lqe" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/obj/structure/rack,
-/obj/item/storage/box/syringes{
- pixel_x = -2;
- pixel_y = 5
- },
-/obj/item/storage/box/beakers{
- pixel_x = 2;
- pixel_y = 8
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"lqi" = (
/obj/structure/table/reinforced,
/obj/machinery/cell_charger,
@@ -40057,6 +40484,13 @@
/obj/machinery/duct,
/turf/open/floor/iron/freezer,
/area/station/commons/toilet)
+"lsH" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/textured_large,
+/area/station/maintenance/department/medical/central)
"lsN" = (
/obj/effect/turf_decal/trimline/red/filled/corner{
dir = 8
@@ -40113,10 +40547,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"lub" = (
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"lux" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 4
@@ -40175,6 +40605,11 @@
},
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
+"luW" = (
+/obj/effect/spawner/structure/window,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/mix)
"lvb" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 10
@@ -40197,6 +40632,13 @@
},
/turf/open/floor/iron,
/area/station/service/hydroponics)
+"lvj" = (
+/obj/structure/rack,
+/obj/item/poster/random_official,
+/obj/effect/spawner/random/maintenance,
+/obj/item/assembly/relic,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"lvk" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -40258,10 +40700,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
-"lvG" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"lvQ" = (
/obj/machinery/light/small/directional/east,
/obj/effect/decal/cleanable/dirt,
@@ -40317,19 +40755,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/commons/dorms)
-"lwd" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
-"lwi" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Mix to Filter"
+"lwm" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
-/turf/open/floor/glass/reinforced,
-/area/station/engineering/atmos/pumproom)
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/project)
"lwF" = (
/obj/structure/lattice/catwalk,
/obj/structure/railing,
@@ -40386,6 +40818,17 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/ai/satellite/interior)
+"lxq" = (
+/obj/machinery/door/airlock/maintenance,
+/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental,
+/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
+/obj/effect/mapping_helpers/airlock/unres/delayed{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"lxu" = (
/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
dir = 4
@@ -40397,13 +40840,6 @@
/obj/effect/spawner/random/structure/crate_abandoned,
/turf/open/floor/plating,
/area/station/maintenance/starboard/upper)
-"lxU" = (
-/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{
- dir = 8
- },
-/obj/machinery/meter,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"lye" = (
/obj/effect/turf_decal/bot_white/right,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -40419,12 +40855,6 @@
"lym" = (
/turf/open/floor/iron/smooth,
/area/station/commons/storage/mining)
-"lyq" = (
-/obj/machinery/portable_atmospherics/canister/nitrogen,
-/obj/effect/turf_decal/bot,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/iron/dark/textured,
-/area/station/engineering/atmos/storage/gas)
"lyu" = (
/obj/structure/table/wood,
/obj/item/flashlight/lantern,
@@ -40443,11 +40873,6 @@
"lyG" = (
/turf/open/floor/glass/reinforced,
/area/station/security/armory/upper)
-"lyH" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible/layer2,
-/turf/closed/wall/r_wall,
-/area/station/maintenance/disposal/incinerator)
"lyX" = (
/obj/structure/chair{
dir = 4
@@ -40585,6 +41010,24 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/wood/large,
/area/station/command/heads_quarters/hos)
+"lAr" = (
+/obj/effect/turf_decal/siding/yellow{
+ dir = 8
+ },
+/obj/machinery/computer/atmos_control/nocontrol/master{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{
+ dir = 10
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos/storage/gas)
"lAu" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -40689,10 +41132,19 @@
"lBR" = (
/turf/closed/wall,
/area/station/security/prison/toilet)
-"lBS" = (
-/obj/structure/grille/broken,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
+"lBX" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 1;
+ name = "Air Outlet Pump"
+ },
+/obj/effect/turf_decal/tile/blue/opposingcorners{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/blue/line{
+ dir = 8
+ },
+/turf/open/floor/iron/white/corner,
+/area/station/engineering/atmos)
"lBZ" = (
/obj/machinery/door/window/right/directional/west{
name = "Containment Pen 7";
@@ -40736,6 +41188,15 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
+"lCk" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"lCn" = (
/obj/effect/turf_decal/siding/wood/corner{
dir = 4
@@ -40773,6 +41234,12 @@
dir = 1
},
/area/station/engineering/lobby)
+"lCR" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"lCY" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -40790,6 +41257,16 @@
/obj/item/trash/tray,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
+"lDi" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 6
+ },
+/obj/machinery/meter,
+/obj/machinery/status_display/ai/directional/west,
+/obj/structure/extinguisher_cabinet/directional/north,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/project)
"lDo" = (
/obj/structure/sign/directions/evac{
dir = 4;
@@ -40847,6 +41324,11 @@
/obj/machinery/light/directional/west,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
+"lDZ" = (
+/obj/machinery/electrolyzer,
+/obj/effect/turf_decal/bot_white,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos/hfr_room)
"lEg" = (
/obj/structure/cable,
/obj/machinery/door/window/brigdoor/right/directional/north{
@@ -40934,6 +41416,14 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron/large,
/area/station/hallway/secondary/entry)
+"lFm" = (
+/obj/effect/mapping_helpers/broken_floor,
+/obj/machinery/light/small/dim/directional/east,
+/obj/structure/railing/corner/end{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"lFp" = (
/obj/structure/railing{
dir = 10
@@ -41042,18 +41532,21 @@
/obj/item/storage/toolbox/emergency,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"lGA" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wideplating/corner{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"lGG" = (
/obj/structure/rack,
/obj/effect/spawner/random/techstorage/engineering_all,
/obj/effect/turf_decal/bot,
/turf/open/floor/iron/large,
/area/station/engineering/storage/tech)
-"lGH" = (
-/obj/structure/closet,
-/obj/effect/spawner/random/maintenance,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"lGN" = (
/obj/effect/landmark/start/botanist,
/obj/structure/chair/office/light,
@@ -41131,6 +41624,12 @@
/obj/effect/spawner/random/structure/crate,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"lIG" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/mix)
"lII" = (
/obj/machinery/door/airlock/engineering{
name = "Telecommunications"
@@ -41184,6 +41683,14 @@
/obj/effect/spawner/random/food_or_drink/cups,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"lJw" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden,
+/obj/machinery/light_switch/directional/west,
+/obj/machinery/meter/layer2,
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"lJO" = (
/turf/closed/wall,
/area/station/maintenance/port/fore)
@@ -41206,6 +41713,24 @@
},
/turf/open/floor/iron/white,
/area/station/science/robotics/lab)
+"lKm" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/light/warm/directional/east,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/machinery/camera/directional/east{
+ c_tag = "Atmospherics - North East"
+ },
+/obj/item/kirbyplants/organic/plant14,
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos)
"lKq" = (
/turf/closed/wall,
/area/station/science/xenobiology)
@@ -41219,16 +41744,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
-"lKt" = (
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 10
- },
-/obj/effect/turf_decal/siding/yellow{
- dir = 1
- },
-/obj/structure/closet/radiation,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"lKw" = (
/obj/machinery/light/directional/west,
/obj/structure/filingcabinet,
@@ -41300,19 +41815,6 @@
},
/turf/open/floor/iron/dark,
/area/station/maintenance/disposal)
-"lMa" = (
-/obj/item/trash/pistachios,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 1
- },
-/obj/structure/railing/corner/end{
- dir = 8
- },
-/obj/structure/railing/corner/end/flip{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"lMd" = (
/obj/structure/table,
/obj/effect/turf_decal/tile/brown/half/contrasted,
@@ -41386,15 +41888,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/smooth,
/area/station/engineering/lobby)
-"lNy" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/status_display/evac/directional/west,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"lNC" = (
/obj/machinery/ai_slipper{
uses = 10
@@ -41453,13 +41946,14 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/commons/locker)
-"lOa" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/structure/railing{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
+"lOm" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/disposalpipe/segment,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"lOp" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/iron/white,
@@ -41475,6 +41969,15 @@
/obj/structure/falsewall,
/turf/open/floor/plating,
/area/station/medical/morgue)
+"lOz" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 6
+ },
+/obj/machinery/atmospherics/components/binary/pump/on{
+ name = "Waste In"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
"lOA" = (
/obj/structure/minecart_rail{
dir = 1
@@ -41486,13 +41989,6 @@
/obj/machinery/status_display/evac/directional/west,
/turf/open/floor/plating/snowed/coldroom,
/area/station/service/kitchen/coldroom)
-"lOI" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer1{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"lOJ" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -41541,6 +42037,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/station/ai/satellite/service)
+"lPf" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"lPh" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -41571,10 +42076,13 @@
/obj/structure/grille,
/turf/open/floor/plating/snowed/coldroom,
/area/icemoon/underground/explored)
-"lPv" = (
-/obj/machinery/power/port_gen/pacman/pre_loaded,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
+"lPw" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/obj/effect/turf_decal/trimline/red/arrow_cw{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"lPC" = (
/obj/effect/turf_decal/trimline/green/filled/corner{
dir = 1
@@ -41591,6 +42099,20 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/external,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
+"lPI" = (
+/obj/machinery/light/small/directional/south,
+/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{
+ dir = 8
+ },
+/obj/machinery/airlock_sensor/incinerator_atmos{
+ pixel_y = 32
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/brown/visible/layer2,
+/turf/open/floor/engine,
+/area/station/maintenance/disposal/incinerator)
"lPJ" = (
/obj/structure/railing/corner,
/obj/effect/turf_decal/trimline/neutral/warning{
@@ -41628,6 +42150,11 @@
},
/turf/open/floor/iron/smooth,
/area/station/commons/storage/mining)
+"lQa" = (
+/turf/open/floor/iron/dark/corner{
+ dir = 4
+ },
+/area/station/engineering/atmos)
"lQc" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
@@ -41700,14 +42227,6 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/carpet,
/area/station/service/library)
-"lQE" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"lQG" = (
/obj/structure/table/glass,
/obj/item/flashlight/lamp,
@@ -41715,6 +42234,16 @@
/obj/machinery/light_switch/directional/west,
/turf/open/floor/iron/dark/smooth_large,
/area/station/command/heads_quarters/cmo)
+"lQH" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/maintenance/department/medical/central)
+"lQL" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"lQN" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
/obj/structure/cable,
@@ -41725,6 +42254,13 @@
/obj/structure/mineral_door/wood,
/turf/open/floor/wood,
/area/station/maintenance/space_hut/cabin)
+"lQW" = (
+/obj/effect/mapping_helpers/broken_floor,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"lRc" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
@@ -41745,6 +42281,14 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
+"lRl" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"lRn" = (
/obj/structure/sign/warning/cold_temp/directional/north,
/turf/open/floor/plating,
@@ -41839,6 +42383,10 @@
"lSu" = (
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"lSN" = (
+/obj/structure/bookcase/random,
+/turf/open/floor/iron/grimy,
+/area/station/maintenance/aft/lesser)
"lSX" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/landmark/blobstart,
@@ -41862,6 +42410,12 @@
/obj/structure/chair/stool/directional/north,
/turf/open/floor/iron,
/area/mine/laborcamp)
+"lTv" = (
+/obj/structure/stairs/west,
+/turf/open/floor/iron/stairs/medium{
+ dir = 4
+ },
+/area/station/engineering/lobby)
"lTz" = (
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
@@ -41872,13 +42426,6 @@
/obj/machinery/fax/heads/hop,
/turf/open/floor/iron,
/area/station/command/heads_quarters/hop)
-"lTC" = (
-/obj/structure/chair/comfy/brown{
- dir = 4
- },
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/wood,
-/area/station/maintenance/space_hut/cabin)
"lTU" = (
/obj/effect/turf_decal/loading_area{
dir = 4
@@ -41940,6 +42487,12 @@
"lUC" = (
/turf/closed/wall,
/area/station/maintenance/department/electrical)
+"lUF" = (
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/station/maintenance/disposal/incinerator)
"lUN" = (
/obj/structure/grille/broken,
/obj/effect/spawner/random/maintenance,
@@ -41948,16 +42501,6 @@
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
-"lUU" = (
-/obj/machinery/door/airlock/external{
- name = "Internal Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"lVc" = (
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/directional/south,
@@ -41991,17 +42534,6 @@
},
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"lVt" = (
-/obj/machinery/firealarm/directional/west,
-/obj/machinery/light/floor,
-/obj/machinery/button/door/directional/west{
- pixel_x = -22;
- id = "xenobia10";
- name = "Xenobio Pen 10 Blast DOors";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"lVu" = (
/obj/machinery/power/emitter/welded{
dir = 8
@@ -42009,17 +42541,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/engineering/supermatter/room)
-"lVw" = (
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/dark_green/line,
-/obj/effect/turf_decal/trimline/dark_green/line{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"lVF" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
@@ -42029,6 +42550,16 @@
},
/turf/open/floor/wood,
/area/station/service/library)
+"lVM" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{
+ dir = 5
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"lVS" = (
/obj/structure/sign/departments/xenobio/directional/east,
/turf/open/floor/plating,
@@ -42116,12 +42647,6 @@
},
/turf/open/floor/iron,
/area/mine/laborcamp)
-"lXi" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"lXn" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -42200,15 +42725,17 @@
/obj/machinery/power/energy_accumulator/tesla_coil/anchored,
/turf/open/floor/engine,
/area/station/engineering/supermatter/engine)
-"lZP" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/duct,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+"lZE" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 8
},
-/turf/open/floor/iron,
-/area/station/engineering/lobby)
+/obj/machinery/portable_atmospherics/scrubber,
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos)
"lZQ" = (
/obj/machinery/airalarm/directional/west,
/obj/machinery/computer/cargo{
@@ -42222,12 +42749,6 @@
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/turf/open/floor/iron/white,
/area/station/maintenance/port/fore)
-"lZX" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"mae" = (
/obj/structure/statue/snow/snowman,
/turf/open/misc/asteroid/snow/icemoon,
@@ -42246,6 +42767,15 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/iron,
/area/station/commons/dorms)
+"maF" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden,
+/turf/open/floor/iron/large,
+/area/station/engineering/atmos/storage/gas)
"maO" = (
/obj/machinery/disposal/bin,
/obj/structure/window/reinforced/spawner/directional/south,
@@ -42415,10 +42945,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"mco" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"mcp" = (
/obj/machinery/iv_drip,
/turf/open/floor/iron/white,
@@ -42501,14 +43027,6 @@
dir = 1
},
/area/station/science/explab)
-"mdI" = (
-/obj/machinery/door/airlock/atmos{
- dir = 4;
- name = "Turbine"
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/turf/open/floor/plating,
-/area/station/maintenance/disposal/incinerator)
"mdM" = (
/obj/structure/rack,
/obj/item/clothing/suit/hooded/wintercoat/eva{
@@ -42560,17 +43078,6 @@
/obj/effect/turf_decal/tile/neutral/half/contrasted,
/turf/open/floor/iron/dark,
/area/station/command/eva)
-"meH" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Ordnance Lab Maintenance"
- },
-/obj/effect/mapping_helpers/airlock/access/all/science/ordnance,
-/turf/open/floor/plating,
-/area/station/science/ordnance)
"meL" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -42580,16 +43087,6 @@
},
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
-"meT" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "CO2 to Pure"
- },
-/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"meX" = (
/obj/effect/spawner/random/structure/steam_vent,
/turf/open/floor/plating,
@@ -42612,6 +43109,20 @@
/obj/machinery/power/apc/auto_name/directional/east,
/turf/open/floor/iron/dark,
/area/mine/eva/lower)
+"mfA" = (
+/obj/machinery/door/airlock/atmos{
+ name = "Atmospherics Maintenance"
+ },
+/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/airlock/unres/delayed{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
+/obj/effect/mapping_helpers/airlock/abandoned/nowall,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"mfD" = (
/turf/closed/wall/r_wall,
/area/station/ai/satellite/atmos)
@@ -42690,19 +43201,6 @@
/obj/structure/sign/departments/court/directional/west,
/turf/open/floor/glass/reinforced,
/area/station/hallway/primary/fore)
-"mgv" = (
-/obj/effect/turf_decal/weather/snow/corner{
- dir = 6
- },
-/obj/effect/turf_decal/weather/snow/corner{
- dir = 10
- },
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
-"mgD" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
-/turf/open/floor/engine,
-/area/station/maintenance/disposal/incinerator)
"mgS" = (
/obj/effect/spawner/structure/window/hollow/reinforced/middle{
dir = 4
@@ -42763,6 +43261,11 @@
/obj/structure/flora/grass/both/style_random,
/turf/open/misc/asteroid/snow/standard_air,
/area/station/hallway/secondary/exit/departure_lounge)
+"mhW" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/blobstart,
+/turf/open/floor/iron/dark,
+/area/station/maintenance/department/medical/central)
"mim" = (
/obj/effect/turf_decal/siding/thinplating_new/dark{
dir = 5
@@ -42778,6 +43281,11 @@
},
/turf/open/floor/iron,
/area/station/engineering/lobby)
+"miy" = (
+/obj/structure/closet/cabinet,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/floor/wood,
+/area/station/maintenance/aft/lesser)
"miK" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -42851,10 +43359,24 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/fore)
-"mjg" = (
-/obj/machinery/light/small/directional/east,
-/turf/open/floor/engine/n2o,
-/area/station/engineering/atmos)
+"mjh" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/door/airlock/highsecurity{
+ name = "Atmospherics Access"
+ },
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/hfr_room)
"mjA" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -42889,6 +43411,13 @@
/obj/item/flashlight,
/turf/open/floor/iron,
/area/station/service/chapel)
+"mjT" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/effect/landmark/generic_maintenance_landmark,
+/turf/open/floor/catwalk_floor/iron_smooth,
+/area/station/maintenance/aft/lesser)
"mjY" = (
/obj/structure/marker_beacon/burgundy,
/obj/effect/turf_decal/weather/snow/corner{
@@ -42896,15 +43425,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
-"mka" = (
-/obj/machinery/computer/turbine_computer{
- dir = 1;
- mapping_id = "main_turbine"
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/disposal/incinerator)
"mkg" = (
/obj/structure/cable,
/turf/open/floor/iron/dark,
@@ -42920,13 +43440,6 @@
},
/turf/open/floor/iron,
/area/station/command/bridge)
-"mkG" = (
-/obj/machinery/atmospherics/pipe/bridge_pipe/orange/visible,
-/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{
- dir = 4
- },
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"mld" = (
/obj/effect/turf_decal/tile/yellow{
dir = 1
@@ -43000,6 +43513,12 @@
},
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
+"mlV" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output{
+ dir = 1
+ },
+/turf/open/floor/engine/airless,
+/area/station/engineering/atmos)
"mmc" = (
/obj/effect/turf_decal/tile/blue/opposingcorners{
dir = 1
@@ -43088,14 +43607,6 @@
/obj/effect/turf_decal/tile/blue/full,
/turf/open/floor/iron/white/smooth_large,
/area/station/medical/medbay/aft)
-"mmG" = (
-/obj/machinery/button/door/directional/east{
- id = "xenobio7";
- name = "Xenobio Pen 7 Blast DOors";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"mmH" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
cycle_id = "atmos-entrance"
@@ -43180,6 +43691,11 @@
},
/turf/open/floor/plating,
/area/station/maintenance/department/electrical)
+"moe" = (
+/obj/effect/landmark/event_spawn,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/project)
"moq" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -43188,11 +43704,6 @@
dir = 1
},
/area/station/security/lockers)
-"moy" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/obj/structure/sign/warning/cold_temp/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"moB" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
@@ -43270,6 +43781,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/security/prison/mess)
+"mpt" = (
+/obj/structure/table/wood,
+/obj/item/flashlight/lamp/green,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"mpx" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 8
@@ -43307,6 +43823,11 @@
},
/turf/open/floor/iron,
/area/station/science/xenobiology)
+"mql" = (
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"mqp" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -43337,15 +43858,6 @@
/obj/machinery/vending/boozeomat,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"mqL" = (
-/obj/machinery/button/door/directional/east{
- id = "xenobio9";
- name = "Xenobio Pen 9 Blast DOors";
- req_access = list("xenobiology")
- },
-/obj/machinery/light/floor,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"mqR" = (
/obj/structure/chair{
dir = 8;
@@ -43363,6 +43875,14 @@
/obj/structure/sign/warning/directional/north,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
+"mrn" = (
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/engine,
+/area/station/engineering/atmos/hfr_room)
"mro" = (
/obj/structure/curtain/cloth,
/obj/effect/turf_decal/tile/yellow/opposingcorners,
@@ -43484,20 +44004,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
-"msN" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,
-/turf/closed/wall/r_wall,
-/area/station/maintenance/disposal/incinerator)
-"msT" = (
-/obj/structure/extinguisher_cabinet/directional/south,
-/obj/machinery/atmospherics/components/binary/valve/digital/on{
- dir = 4;
- name = "Infiltrate Control"
- },
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage)
"mtn" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
@@ -43513,6 +44019,21 @@
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood,
/area/station/security/courtroom)
+"mtr" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/machinery/door/firedoor,
+/obj/effect/mapping_helpers/airlock/unres/delayed{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/airlock/access/all/science/ordnance,
+/obj/machinery/door/airlock/maintenance{
+ name = "Ordnance Lab Maintenance"
+ },
+/turf/open/floor/plating,
+/area/station/science/ordnance/testlab)
"mtx" = (
/obj/machinery/door/poddoor/massdriver_ordnance,
/obj/machinery/atmos_shield_gen/active{
@@ -43593,6 +44114,10 @@
},
/turf/open/floor/iron/dark,
/area/station/maintenance/disposal)
+"muk" = (
+/obj/structure/sign/warning/fire/directional/north,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/underground/explored)
"muu" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron/dark,
@@ -43623,15 +44148,27 @@
/obj/structure/sign/departments/rndserver/directional/south,
/turf/open/floor/iron/white,
/area/station/science/research)
-"muX" = (
-/obj/structure/sign/warning/cold_temp/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
+"muS" = (
+/obj/item/pickaxe/improvised{
+ pixel_x = 7
+ },
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"mvc" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/wood,
/area/station/command/heads_quarters/captain)
+"mvs" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/item/radio/intercom/directional/south,
+/obj/item/kirbyplants/organic/plant3,
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"mvv" = (
/turf/open/floor/wood,
/area/station/security/courtroom)
@@ -43649,12 +44186,6 @@
/obj/effect/mapping_helpers/airlock/red_alert_access,
/turf/open/floor/iron/dark/textured,
/area/station/command/eva)
-"mvG" = (
-/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"mwh" = (
/obj/structure/table,
/obj/item/storage/fancy/donut_box,
@@ -43718,18 +44249,36 @@
/obj/structure/tank_holder/extinguisher,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
+"mwS" = (
+/obj/machinery/computer/atmos_control/plasma_tank{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/purple/half/contrasted,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
+"mxb" = (
+/obj/machinery/button/door/directional/east{
+ id = "xenobio8";
+ name = "Xenobio Pen 8 Blast Door";
+ req_access = list("xenobiology")
+ },
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"mxg" = (
/obj/structure/cable,
/obj/machinery/light/small/dim/directional/south,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"mxj" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Port Mix to East Ports"
+"mxp" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 1
},
+/obj/machinery/atmospherics/pipe/smart/simple/brown/visible/layer2,
+/obj/machinery/meter/layer2,
/turf/open/floor/iron,
-/area/station/engineering/atmos)
+/area/station/maintenance/disposal/incinerator)
"mxu" = (
/obj/machinery/digital_clock/directional/north,
/turf/open/floor/iron,
@@ -43825,15 +44374,6 @@
/obj/effect/spawner/random/structure/steam_vent,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
-"myP" = (
-/obj/machinery/door/airlock/maintenance,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/mapping_helpers/airlock/unres/delayed{
- dir = 8
- },
-/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"myX" = (
/obj/machinery/light/directional/north,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -43851,6 +44391,10 @@
},
/turf/open/floor/iron,
/area/station/engineering/main)
+"myY" = (
+/obj/structure/fence,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors/less_spawns)
"myZ" = (
/obj/structure/lattice/catwalk,
/turf/open/openspace/icemoon/keep_below,
@@ -43895,18 +44439,6 @@
"mzz" = (
/turf/open/floor/plating,
/area/station/engineering/storage_shared)
-"mzE" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/turf/open/floor/iron/dark/corner{
- dir = 8
- },
-/area/station/engineering/atmos/storage/gas)
"mzH" = (
/obj/effect/landmark/firealarm_sanity,
/turf/open/openspace,
@@ -44041,6 +44573,10 @@
/obj/structure/window/reinforced/spawner/directional/east,
/turf/open/floor/iron,
/area/station/science/xenobiology)
+"mBx" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/turf/open/floor/iron/grimy,
+/area/station/maintenance/aft/lesser)
"mBB" = (
/obj/machinery/door/poddoor/preopen{
id = "ceprivacy";
@@ -44102,6 +44638,12 @@
"mBV" = (
/turf/open/misc/asteroid/snow/ice/icemoon,
/area/icemoon/surface/outdoors/labor_camp)
+"mBX" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"mBY" = (
/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
dir = 4
@@ -44114,6 +44656,9 @@
},
/turf/open/floor/iron,
/area/station/science/ordnance)
+"mBZ" = (
+/turf/open/floor/glass/reinforced,
+/area/station/engineering/atmos)
"mCd" = (
/obj/machinery/computer/operating{
dir = 2
@@ -44210,6 +44755,21 @@
"mDX" = (
/turf/open/floor/engine/n2,
/area/station/engineering/atmos)
+"mEf" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/orange/visible,
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos)
"mEg" = (
/obj/structure/cable,
/obj/machinery/holopad/secure,
@@ -44218,6 +44778,15 @@
/obj/structure/cable/layer3,
/turf/open/floor/iron/dark,
/area/station/ai/satellite/hallway)
+"mEj" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/structure/railing/corner/end/flip{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"mEv" = (
/obj/structure/rack,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -44332,20 +44901,6 @@
/obj/effect/turf_decal/tile/blue/half/contrasted,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
-"mFt" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- name = "Waste In"
- },
-/obj/effect/turf_decal/siding/wideplating{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
-"mFv" = (
-/obj/machinery/newscaster/directional/east,
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"mFy" = (
/obj/structure/rack,
/obj/effect/spawner/random/maintenance/two,
@@ -44567,12 +45122,6 @@
},
/turf/open/floor/plating,
/area/station/medical/pharmacy)
-"mIE" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/obj/machinery/power/apc/auto_name/directional/west,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"mII" = (
/obj/machinery/door/airlock/maintenance{
name = "Research Delivery Access"
@@ -44608,9 +45157,6 @@
dir = 4
},
/area/station/service/chapel)
-"mJz" = (
-/turf/open/floor/iron/dark,
-/area/icemoon/underground/explored)
"mJM" = (
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 1
@@ -44630,6 +45176,13 @@
/obj/item/pillow/random,
/turf/open/floor/carpet,
/area/station/commons/dorms)
+"mJS" = (
+/obj/machinery/atmospherics/components/binary/valve/digital{
+ name = "Filter to Release"
+ },
+/obj/effect/turf_decal/box/red,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"mJX" = (
/obj/structure/cable,
/obj/effect/spawner/structure/window/hollow/reinforced/middle,
@@ -44702,6 +45255,11 @@
"mLf" = (
/turf/open/openspace/icemoon/keep_below,
/area/icemoon/underground/unexplored/rivers/deep/shoreline)
+"mLk" = (
+/obj/machinery/door/airlock/maintenance/glass,
+/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"mLm" = (
/obj/structure/disposalpipe/segment,
/obj/structure/disposalpipe/segment{
@@ -44727,6 +45285,13 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/maintenance/starboard/upper)
+"mLK" = (
+/obj/effect/mapping_helpers/broken_floor,
+/obj/structure/chair/comfy/brown{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/station/maintenance/space_hut/cabin)
"mLO" = (
/obj/machinery/camera/directional/west{
c_tag = "Xenobiology Pens - Port Aft";
@@ -44734,6 +45299,15 @@
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
+"mLQ" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/trimline/red/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"mLT" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 8
@@ -44765,6 +45339,19 @@
/obj/machinery/telecomms/message_server/preset,
/turf/open/floor/iron/dark/telecomms,
/area/station/tcommsat/server)
+"mMn" = (
+/obj/effect/turf_decal/siding/wideplating/corner{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/turf/open/floor/iron/dark/corner{
+ dir = 8
+ },
+/area/station/engineering/atmos/pumproom)
"mMy" = (
/obj/machinery/camera/directional/south{
c_tag = "Security - Permabrig Upper Hallway South";
@@ -44796,6 +45383,12 @@
/obj/effect/mapping_helpers/airlock/access/all/supply/mining_station,
/turf/open/floor/iron/smooth,
/area/mine/eva)
+"mNe" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
+ dir = 5
+ },
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"mNi" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -44832,15 +45425,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/station/service/hydroponics)
-"mNF" = (
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 5
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"mNJ" = (
/obj/structure/cable,
/obj/machinery/holopad/secure,
@@ -44939,6 +45523,11 @@
},
/turf/open/floor/iron,
/area/station/commons/vacant_room/commissary)
+"mPk" = (
+/obj/structure/rack,
+/obj/effect/spawner/random/bureaucracy/briefcase,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"mPl" = (
/obj/machinery/door/airlock/hydroponics/glass{
name = "Hydroponics"
@@ -44982,17 +45571,6 @@
/obj/effect/turf_decal/tile/blue/full,
/turf/open/floor/iron/white/smooth_large,
/area/station/medical/storage)
-"mPH" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/firealarm/directional/south,
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"mPJ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -45004,6 +45582,18 @@
/obj/structure/flora/grass/both/style_random,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"mQc" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"mQg" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -45043,10 +45633,6 @@
},
/turf/open/floor/iron/dark,
/area/station/engineering/circuit_workshop)
-"mQG" = (
-/obj/effect/decal/cleanable/glass,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/department/medical/central)
"mQW" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -45066,22 +45652,11 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"mRr" = (
-/obj/structure/cable,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"mRy" = (
/obj/effect/landmark/start/hangover,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
-"mRG" = (
-/obj/structure/table,
-/obj/item/book/manual/wiki/atmospherics,
-/obj/item/analyzer,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos)
"mRI" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/hatch{
@@ -45108,10 +45683,12 @@
/obj/machinery/power/smes/engineering,
/turf/open/floor/plating,
/area/station/maintenance/department/electrical)
-"mSL" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/engineering/atmos/project)
+"mSj" = (
+/obj/effect/turf_decal/siding/wideplating/corner,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
"mSM" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -45184,6 +45761,10 @@
},
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
+"mUe" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"mUh" = (
/obj/effect/spawner/random/structure/closet_private,
/turf/open/floor/plating,
@@ -45299,6 +45880,12 @@
/obj/effect/mapping_helpers/airlock/access/any/service/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"mVX" = (
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 10
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"mWf" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -45312,6 +45899,12 @@
},
/turf/open/floor/iron,
/area/station/science/ordnance)
+"mWl" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input/layer4{
+ dir = 8
+ },
+/turf/open/floor/engine/vacuum,
+/area/station/maintenance/disposal/incinerator)
"mWs" = (
/obj/structure/table,
/obj/item/storage/toolbox/emergency,
@@ -45340,11 +45933,6 @@
/obj/machinery/light/small/directional/south,
/turf/open/floor/plating,
/area/station/engineering/lobby)
-"mWB" = (
-/obj/structure/rack,
-/obj/effect/spawner/random/maintenance,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"mWD" = (
/obj/structure/railing{
dir = 1
@@ -45400,6 +45988,17 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
+"mXc" = (
+/obj/effect/landmark/start/atmospheric_technician,
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/siding/yellow{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"mXe" = (
/obj/effect/turf_decal/stripes/corner{
dir = 4
@@ -45424,6 +46023,17 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
+"mXq" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/structure/sign/warning/directional/south,
+/obj/structure/sign/clock/directional/west,
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4{
+ dir = 5
+ },
+/obj/item/kirbyplants/organic/plant13,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"mXA" = (
/obj/effect/landmark/blobstart,
/obj/effect/mapping_helpers/burnt_floor,
@@ -45462,6 +46072,12 @@
},
/turf/open/floor/iron/dark,
/area/station/security/mechbay)
+"mXP" = (
+/obj/structure/cable,
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"mXT" = (
/obj/item/radio/intercom/directional/west,
/obj/structure/chair{
@@ -45619,6 +46235,11 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"nan" = (
+/obj/structure/closet/emcloset,
+/obj/machinery/light/small/dim/directional/west,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"nav" = (
/obj/machinery/firealarm/directional/north,
/obj/structure/cable,
@@ -45653,9 +46274,6 @@
/obj/machinery/status_display/evac/directional/west,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
-"naX" = (
-/turf/closed/wall/mineral/iron,
-/area/station/engineering/atmos/mix)
"nbi" = (
/obj/item/radio/intercom/directional/west,
/obj/effect/turf_decal/tile/yellow{
@@ -45719,6 +46337,13 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plating,
/area/station/medical/treatment_center)
+"nbF" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/storage/gas)
"nbG" = (
/obj/effect/turf_decal/tile/neutral/half/contrasted,
/turf/open/floor/iron/dark/side,
@@ -45827,12 +46452,6 @@
},
/turf/open/floor/iron,
/area/station/command/bridge)
-"ncl" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
- dir = 9
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"ncn" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -45867,17 +46486,6 @@
/obj/effect/mapping_helpers/airlock/access/all/security/entrance,
/turf/open/floor/iron,
/area/station/security/brig/upper)
-"ncJ" = (
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 1
- },
-/obj/machinery/camera/directional/east{
- c_tag = "Atmospherics - South East"
- },
-/obj/machinery/firealarm/directional/east,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"ncR" = (
/turf/closed/wall/r_wall,
/area/station/security/courtroom)
@@ -45964,14 +46572,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/dark,
/area/station/engineering/main)
-"ndH" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"ndJ" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -46032,11 +46632,6 @@
/obj/structure/cable,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
-"neu" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"neE" = (
/obj/machinery/duct,
/obj/effect/decal/cleanable/dirt/dust,
@@ -46087,6 +46682,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
+"nfm" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
+ dir = 5
+ },
+/obj/effect/spawner/structure/window,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/pumproom)
"nfn" = (
/obj/structure/railing{
dir = 4
@@ -46119,11 +46722,6 @@
/obj/machinery/hydroponics/soil,
/turf/open/floor/grass,
/area/station/maintenance/starboard/fore)
-"nfF" = (
-/obj/structure/reagent_dispensers/fueltank,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"nfL" = (
/obj/machinery/holopad/secure,
/turf/open/floor/wood,
@@ -46148,13 +46746,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
-"ngb" = (
-/obj/structure/table/reinforced,
-/obj/item/book/manual/wiki/atmospherics,
-/obj/item/holosign_creator/atmos,
-/obj/item/holosign_creator/atmos,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"ngj" = (
/obj/effect/turf_decal/stripes/asteroid/line{
dir = 9
@@ -46171,17 +46762,13 @@
/obj/effect/spawner/random/maintenance/no_decals/two,
/turf/open/floor/iron/smooth_large,
/area/station/cargo/warehouse)
-"ngo" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8;
- name = "Exfiltrate Port"
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/structure/railing/corner{
- dir = 8
+"ngp" = (
+/obj/structure/cable,
+/obj/structure/curtain/bounty{
+ pixel_x = 32
},
/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
+/area/station/engineering/atmos/storage/gas)
"ngM" = (
/obj/structure/lattice/catwalk,
/obj/structure/fence/door{
@@ -46225,11 +46812,6 @@
/mob/living/carbon/human/species/monkey,
/turf/open/floor/engine,
/area/station/science/genetics)
-"nhO" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/iron/grimy,
-/area/station/maintenance/aft/greater)
"nhS" = (
/obj/machinery/door/window/right/directional/north{
name = "Bridge Delivery";
@@ -46326,11 +46908,6 @@
},
/turf/open/floor/wood,
/area/station/service/lawoffice)
-"njb" = (
-/obj/structure/reagent_dispensers/fueltank/large,
-/obj/structure/cable,
-/turf/open/floor/iron/showroomfloor,
-/area/station/engineering/atmos)
"nji" = (
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
@@ -46342,11 +46919,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/engineering/transit_tube)
-"njA" = (
-/obj/structure/cable,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"njJ" = (
/turf/closed/wall,
/area/mine/laborcamp)
@@ -46378,11 +46950,26 @@
/obj/machinery/airalarm/directional/west,
/turf/open/floor/iron,
/area/station/science/ordnance/testlab)
+"nkn" = (
+/obj/machinery/door/airlock/atmos/glass{
+ name = "Supply Closet"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"nks" = (
/obj/effect/turf_decal/stripes/white/line,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/security/prison/workout)
+"nku" = (
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 8
+ },
+/obj/structure/cable,
+/obj/effect/turf_decal/trimline/blue/arrow_cw,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"nkE" = (
/obj/structure/grille/broken,
/obj/effect/decal/cleanable/dirt/dust,
@@ -46406,6 +46993,16 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/plating,
/area/station/maintenance/fore)
+"nlg" = (
+/obj/effect/decal/cleanable/cobweb,
+/obj/machinery/status_display/evac/directional/north,
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/maintenance/disposal/incinerator)
"nli" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -46568,11 +47165,6 @@
"nmK" = (
/turf/closed/wall/r_wall,
/area/station/engineering/supermatter/engine)
-"nmL" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"nmN" = (
/obj/structure/table/wood,
/obj/item/flashlight/lamp/green{
@@ -46582,6 +47174,16 @@
/obj/effect/landmark/navigate_destination/library,
/turf/open/floor/wood,
/area/station/service/library)
+"nmW" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/random/structure/steam_vent,
+/obj/structure/grille/broken,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"nmX" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 8
@@ -46601,16 +47203,15 @@
/obj/effect/spawner/structure/window/reinforced/plasma,
/turf/open/floor/plating,
/area/station/engineering/supermatter/room)
-"nnn" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Fuel Pipe to Incinerator"
+"nnm" = (
+/obj/effect/turf_decal/siding/wideplating/corner{
+ dir = 8
},
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 1
},
/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
+/area/station/engineering/atmos/pumproom)
"nnx" = (
/obj/machinery/power/apc/auto_name/directional/south,
/obj/structure/cable,
@@ -46619,6 +47220,20 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
+"nnK" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 10
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/blue/corner{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"nnR" = (
/obj/machinery/holopad,
/turf/open/floor/carpet,
@@ -46654,16 +47269,6 @@
},
/turf/open/floor/wood/large,
/area/station/command/heads_quarters/hos)
-"nom" = (
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/effect/turf_decal/tile/purple/anticorner/contrasted,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"noo" = (
/obj/structure/curtain/cloth,
/obj/effect/turf_decal/siding/dark,
@@ -46719,13 +47324,6 @@
},
/turf/open/floor/plating,
/area/station/commons/storage/mining)
-"noY" = (
-/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"npa" = (
/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
dir = 1
@@ -46790,25 +47388,9 @@
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/turf/open/floor/iron/white,
/area/station/maintenance/port/fore)
-"npB" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/iron/white/corner{
- dir = 1
- },
-/area/station/engineering/atmos/storage/gas)
"npD" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/aft/greater)
-"npJ" = (
-/obj/machinery/atmospherics/pipe/layer_manifold/violet/visible,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"npL" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -46882,6 +47464,19 @@
/obj/effect/turf_decal/tile/brown/anticorner/contrasted,
/turf/open/floor/iron/dark,
/area/station/cargo/miningdock)
+"nrt" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "Atmospherics Blast Door"
+ },
+/obj/effect/turf_decal/tile/yellow/opposingcorners{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos)
"nrz" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/cafeteria,
@@ -46963,6 +47558,12 @@
},
/turf/open/floor/iron,
/area/station/command/bridge)
+"nsm" = (
+/obj/machinery/camera/directional/west{
+ c_tag = "Atmospherics - CO2"
+ },
+/turf/open/floor/engine/co2,
+/area/station/engineering/atmos)
"nsp" = (
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
@@ -47000,6 +47601,23 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
+"nsV" = (
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
+"nsX" = (
+/obj/structure/table,
+/obj/item/paper_bin{
+ pixel_x = -11;
+ pixel_y = 7
+ },
+/obj/item/pen{
+ pixel_x = 1;
+ pixel_y = 9
+ },
+/obj/effect/mapping_helpers/broken_floor,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/wood,
+/area/station/maintenance/aft/lesser)
"nsZ" = (
/turf/closed/wall/r_wall,
/area/station/science/ordnance/office)
@@ -47027,14 +47645,6 @@
/obj/machinery/light/small/directional/north,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
-"ntE" = (
-/obj/machinery/status_display/ai/directional/north,
-/obj/item/aquarium_kit,
-/obj/structure/rack,
-/obj/effect/turf_decal/bot,
-/obj/effect/turf_decal/siding/dark,
-/turf/open/floor/iron/checker,
-/area/station/hallway/secondary/service)
"ntF" = (
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
@@ -47121,13 +47731,6 @@
/obj/structure/flora/bush/snow/style_random,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"nvh" = (
-/obj/machinery/door/airlock/atmos{
- name = "Atmospherics"
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/turf/open/floor/plating,
-/area/station/engineering/atmos/storage)
"nvr" = (
/obj/effect/turf_decal/weather/snow/corner,
/obj/machinery/light/small/directional/north,
@@ -47199,6 +47802,16 @@
},
/turf/open/floor/iron/cafeteria,
/area/station/security/prison/work)
+"nvQ" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
+/obj/effect/turf_decal/trimline/blue/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"nvU" = (
/obj/effect/mapping_helpers/airlock/access/all/command/eva,
/obj/machinery/door/airlock/external{
@@ -47206,10 +47819,6 @@
},
/turf/open/floor/iron/textured,
/area/station/hallway/secondary/entry)
-"nvW" = (
-/obj/machinery/duct,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"nvY" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -47272,6 +47881,13 @@
dir = 9
},
/area/station/science/research)
+"nxd" = (
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 4
+ },
+/turf/open/openspace/icemoon/keep_below,
+/area/icemoon/underground/explored)
"nxe" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/pink,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
@@ -47382,6 +47998,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/station/maintenance/aft/lesser)
+"nyK" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/structure/railing,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"nyQ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -47459,6 +48083,18 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
+"nzt" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/blue/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"nzu" = (
/obj/structure/table,
/obj/item/radio/off,
@@ -47469,15 +48105,6 @@
dir = 1
},
/area/station/security/office)
-"nzy" = (
-/obj/machinery/computer/atmos_control/mix_tank{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green/half/contrasted{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
"nzA" = (
/obj/machinery/portable_atmospherics/pipe_scrubber,
/obj/machinery/light/directional/east,
@@ -47504,6 +48131,13 @@
dir = 1
},
/area/station/engineering/engine_smes)
+"nzJ" = (
+/obj/structure/rack,
+/obj/item/clothing/neck/scarf/christmas,
+/obj/item/clothing/head/beanie/christmas,
+/obj/machinery/light/small/red/directional/west,
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"nzK" = (
/obj/structure/table/reinforced,
/obj/structure/cable,
@@ -47514,16 +48148,15 @@
dir = 1
},
/area/station/medical/chemistry)
-"nzN" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/effect/spawner/random/structure/tank_holder,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
+"nzR" = (
+/obj/machinery/status_display/ai/directional/north,
+/obj/item/aquarium_kit,
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/siding/dark,
+/obj/structure/table,
+/obj/item/producepad,
+/turf/open/floor/iron/checker,
+/area/station/hallway/secondary/service)
"nzU" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -47670,18 +48303,16 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
-"nBG" = (
-/obj/item/cigbutt,
-/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"nBN" = (
/obj/machinery/atmospherics/components/tank/air,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron/dark,
/area/station/maintenance/starboard/aft)
+"nBQ" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/item/trash/peanuts,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/maintenance/department/medical/central)
"nBS" = (
/obj/structure/table/wood,
/obj/item/storage/crayons,
@@ -47757,6 +48388,11 @@
/obj/machinery/power/apc/auto_name/directional/west,
/turf/open/floor/iron,
/area/station/security/prison/visit)
+"nCt" = (
+/obj/structure/cable,
+/obj/structure/sign/warning/docking/directional/north,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"nCu" = (
/obj/effect/landmark/start/assistant,
/obj/effect/turf_decal/tile/green/half/contrasted{
@@ -47764,17 +48400,6 @@
},
/turf/open/floor/iron,
/area/station/commons/fitness)
-"nCD" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/item/radio/intercom/directional/south,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"nCP" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 4
@@ -47989,13 +48614,6 @@
},
/turf/open/floor/iron/dark/textured,
/area/station/security/brig/upper)
-"nFz" = (
-/obj/structure/window/reinforced/spawner/directional/north{
- pixel_y = 2
- },
-/obj/structure/sign/warning/docking/directional/north,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"nFF" = (
/obj/structure/table,
/obj/item/assembly/signaler{
@@ -48017,14 +48635,6 @@
},
/turf/open/floor/iron/dark,
/area/station/commons/storage/primary)
-"nFG" = (
-/obj/structure/table,
-/obj/item/relic,
-/obj/effect/spawner/random/maintenance,
-/obj/item/screwdriver,
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/turf/open/floor/iron/checker,
-/area/station/maintenance/port/fore)
"nFL" = (
/obj/machinery/door/airlock/external/glass,
/obj/effect/mapping_helpers/airlock/access/all/engineering/external,
@@ -48054,21 +48664,6 @@
/obj/machinery/vending/games,
/turf/open/floor/iron/dark/textured,
/area/station/security/prison)
-"nGv" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/railing{
- dir = 1
- },
-/obj/structure/table,
-/obj/item/paper_bin/construction,
-/obj/item/storage/crayons{
- pixel_x = -3;
- pixel_y = -2
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"nGA" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
@@ -48085,12 +48680,6 @@
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/turf/open/floor/iron/white,
/area/station/maintenance/port/fore)
-"nGG" = (
-/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
- dir = 6
- },
-/turf/open/floor/glass/reinforced,
-/area/station/engineering/atmos/pumproom)
"nGK" = (
/obj/structure/table,
/obj/effect/turf_decal/tile/red/half/contrasted{
@@ -48099,6 +48688,14 @@
/obj/effect/spawner/random/armory/barrier_grenades,
/turf/open/floor/iron/dark/textured,
/area/station/security/armory/upper)
+"nGN" = (
+/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden{
+ name = "Airlock Supply Pump";
+ target_pressure = 300
+ },
+/obj/structure/grille/broken,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"nGY" = (
/obj/structure/railing/corner{
dir = 4
@@ -48116,6 +48713,16 @@
dir = 1
},
/area/mine/eva/lower)
+"nHd" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "Atmospherics Blast Door"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/storage/gas)
"nHe" = (
/obj/structure/closet/radiation,
/obj/effect/turf_decal/tile/yellow{
@@ -48140,20 +48747,6 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/department/chapel)
-"nHY" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/space_heater,
-/obj/structure/railing{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
-"nIb" = (
-/obj/structure/chair{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"nIl" = (
/obj/structure/chair/stool/directional/north,
/obj/effect/turf_decal/tile/red/half/contrasted{
@@ -48161,6 +48754,14 @@
},
/turf/open/floor/iron/white,
/area/station/science/robotics/lab)
+"nIp" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos)
"nIu" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -48191,22 +48792,13 @@
/obj/structure/grille,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
-"nJh" = (
+"nJk" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/burnt_floor,
/obj/structure/cable,
-/obj/machinery/duct,
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/siding/yellow{
- dir = 6
- },
-/obj/structure/railing/corner/end/flip{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/lobby)
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"nJo" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
@@ -48232,6 +48824,15 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment,
/turf/open/floor/iron,
/area/station/engineering/storage)
+"nJs" = (
+/obj/effect/turf_decal/siding/wideplating/corner{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
+ dir = 10
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
"nJy" = (
/obj/structure/chair/pew{
dir = 1
@@ -48252,14 +48853,6 @@
},
/turf/open/floor/wood,
/area/station/commons/dorms)
-"nJI" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible,
-/obj/effect/turf_decal/siding/wideplating/corner{
- dir = 1
- },
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
"nJK" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/plating,
@@ -48376,6 +48969,14 @@
/obj/machinery/light/floor,
/turf/open/floor/iron/white,
/area/station/medical/virology)
+"nLj" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/door/airlock/maintenance,
+/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
+/obj/effect/mapping_helpers/airlock/unres/delayed,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"nLo" = (
/obj/machinery/light/small/directional/north,
/obj/effect/landmark/firealarm_sanity,
@@ -48436,6 +49037,11 @@
},
/turf/closed/wall/r_wall,
/area/station/medical/virology)
+"nMi" = (
+/obj/structure/flora/grass/both/style_random,
+/obj/structure/sign/warning/secure_area/directional/north,
+/turf/open/misc/asteroid/snow/icemoon,
+/area/icemoon/surface/outdoors/less_spawns)
"nMj" = (
/obj/structure/sign/warning/docking/directional/north,
/turf/open/floor/plating/snowed/smoothed/icemoon,
@@ -48579,18 +49185,6 @@
/obj/structure/railing/corner,
/turf/open/floor/iron,
/area/station/cargo/storage)
-"nNA" = (
-/obj/structure/cable,
-/obj/structure/chair{
- dir = 1
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"nNB" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 9
@@ -48598,14 +49192,6 @@
/obj/structure/chair/stool/directional/east,
/turf/open/floor/iron/dark,
/area/station/medical/virology)
-"nNM" = (
-/obj/machinery/door/airlock/maintenance,
-/obj/effect/mapping_helpers/airlock/abandoned,
-/obj/effect/mapping_helpers/airlock/unres/delayed,
-/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"nNZ" = (
/obj/machinery/conveyor{
dir = 4;
@@ -48662,6 +49248,15 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/maintenance/port/fore)
+"nOy" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/red/arrow_cw{
+ dir = 2
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"nOG" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -48694,13 +49289,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"nOS" = (
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 6
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"nOY" = (
/obj/effect/spawner/random/trash/cigbutt,
/obj/effect/decal/cleanable/dirt/dust,
@@ -48759,11 +49347,6 @@
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"nPI" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"nPS" = (
/obj/structure/table,
/obj/structure/bedsheetbin,
@@ -48972,10 +49555,6 @@
dir = 10
},
/area/station/science/research)
-"nSc" = (
-/obj/effect/turf_decal/siding/yellow,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"nSk" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -49002,11 +49581,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
-"nSw" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/layer_manifold/brown/visible,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"nSC" = (
/obj/structure/table,
/obj/machinery/light/small/directional/north,
@@ -49014,16 +49588,6 @@
/obj/machinery/airalarm/directional/east,
/turf/open/floor/iron/dark,
/area/station/science/breakroom)
-"nSD" = (
-/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
- dir = 9
- },
-/obj/effect/turf_decal/siding/wideplating{
- dir = 1
- },
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
"nSF" = (
/obj/structure/rack,
/obj/machinery/status_display/evac/directional/south,
@@ -49035,11 +49599,6 @@
/obj/effect/spawner/random/structure/crate,
/turf/open/floor/plating,
/area/station/maintenance/aft/lesser)
-"nST" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer1,
-/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"nSU" = (
/obj/structure/sign/poster/random/directional/north,
/obj/effect/spawner/random/structure/crate,
@@ -49054,6 +49613,16 @@
dir = 4
},
/area/station/hallway/primary/central)
+"nTn" = (
+/obj/machinery/air_sensor/incinerator_tank,
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/brown/visible/layer2{
+ dir = 5
+ },
+/turf/open/floor/engine/vacuum,
+/area/station/maintenance/disposal/incinerator)
"nTp" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -49104,6 +49673,21 @@
"nTO" = (
/turf/closed/wall/r_wall,
/area/mine/laborcamp/security)
+"nTR" = (
+/obj/machinery/door/airlock/atmos/glass{
+ name = "Atmospherics Monitoring"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "atmos-entrance"
+ },
+/obj/machinery/door/firedoor/heavy,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/storage/gas)
"nTV" = (
/obj/structure/table/reinforced,
/obj/item/screwdriver{
@@ -49154,21 +49738,6 @@
},
/turf/open/floor/iron/dark/textured_edge,
/area/station/security/prison)
-"nVc" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/yellow/filled/corner{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
-"nVe" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
-/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/engineering/atmos)
"nVr" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -49309,6 +49878,32 @@
},
/turf/open/floor/iron/dark,
/area/station/engineering/supermatter/room)
+"nXr" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 6
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/corner,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
+"nXy" = (
+/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{
+ dir = 6
+ },
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos)
"nXB" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -49326,11 +49921,6 @@
dir = 1
},
/area/station/service/chapel/office)
-"nXO" = (
-/obj/effect/spawner/random/structure/steam_vent,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"nXQ" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk,
@@ -49345,6 +49935,14 @@
/obj/machinery/door/firedoor,
/turf/open/floor/iron/dark,
/area/station/security/prison/visit)
+"nYg" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/project)
"nYk" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/training_machine,
@@ -49375,6 +49973,15 @@
/obj/structure/closet/secure_closet/personal/cabinet,
/turf/open/floor/carpet,
/area/station/commons/dorms)
+"nYo" = (
+/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/white{
+ color = "#008000"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"nYv" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -49433,10 +50040,6 @@
},
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/entry)
-"nZH" = (
-/obj/structure/lattice/catwalk,
-/turf/open/openspace,
-/area/station/engineering/atmos/storage)
"nZN" = (
/obj/structure/rack,
/obj/item/crowbar/red,
@@ -49636,18 +50239,26 @@
},
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
-"obK" = (
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
+"obI" = (
+/obj/machinery/camera/directional/south{
+ c_tag = "Atmospherics - South East"
},
-/obj/effect/turf_decal/tile/red{
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
+"obP" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/turf/open/floor/iron/white/corner{
- dir = 1
+/obj/effect/turf_decal/siding/yellow{
+ dir = 8
},
-/area/station/engineering/atmos/storage/gas)
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4{
+ dir = 5
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"obQ" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -49672,6 +50283,10 @@
},
/turf/open/floor/iron/dark/smooth_half,
/area/station/service/hydroponics)
+"obV" = (
+/obj/machinery/firealarm/directional/west,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"obZ" = (
/obj/machinery/camera/directional/east{
c_tag = "Xenobiology Test Chamber Access";
@@ -49817,6 +50432,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/cmo)
+"oeQ" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
+/obj/machinery/firealarm/directional/east,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"oeT" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 4
@@ -49850,6 +50470,13 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron/dark,
/area/mine/eva/lower)
+"ofD" = (
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"ofE" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -49936,6 +50563,16 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/command/eva)
+"ogA" = (
+/obj/machinery/atmospherics/components/unary/passive_vent{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/light/cold/directional/north,
+/turf/open/floor/iron/freezer,
+/area/station/science/xenobiology)
"ogF" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -50110,17 +50747,6 @@
},
/turf/open/floor/wood/parquet,
/area/station/service/theater)
-"oiO" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/airalarm/directional/south,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"oiT" = (
/obj/effect/spawner/random/trash/grille_or_waste,
/turf/open/floor/plating,
@@ -50229,6 +50855,10 @@
},
/turf/open/floor/iron/dark,
/area/station/ai/satellite/atmos)
+"oka" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"okb" = (
/obj/machinery/newscaster/directional/north,
/turf/open/floor/iron,
@@ -50274,15 +50904,6 @@
dir = 8
},
/area/station/hallway/primary/central/fore)
-"okC" = (
-/obj/structure/table,
-/obj/item/tgui_book/manual/dsm{
- pixel_y = 5;
- pixel_x = 3
- },
-/obj/item/book/manual/wiki/tgc,
-/turf/open/floor/wood,
-/area/station/maintenance/aft/greater)
"okG" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 1
@@ -50319,14 +50940,17 @@
},
/turf/open/floor/iron/dark,
/area/station/command/meeting_room)
-"olM" = (
-/obj/structure/table,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/flashlight/lamp{
- start_on = 0
+"olH" = (
+/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{
+ color = "#ff0000";
+ dir = 4;
+ name = "Scrubbers multi deck pipe adapter"
},
-/turf/open/floor/wood,
-/area/station/maintenance/aft/greater)
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"olQ" = (
/obj/machinery/light/dim/directional/north,
/obj/structure/sign/nanotrasen/directional/north,
@@ -50383,6 +51007,13 @@
},
/turf/open/floor/carpet/royalblue,
/area/station/command/heads_quarters/hos)
+"omB" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible,
+/obj/machinery/atmospherics/pipe/bridge_pipe/orange/visible{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"omG" = (
/obj/structure/table,
/obj/item/flashlight/lamp,
@@ -50411,10 +51042,6 @@
/obj/item/stock_parts/power_store/cell/high/empty,
/turf/open/floor/iron/dark,
/area/station/engineering/storage)
-"one" = (
-/obj/effect/turf_decal/box,
-/turf/open/floor/iron/dark/textured_large,
-/area/station/engineering/atmos/project)
"ong" = (
/obj/structure/rack,
/obj/item/clothing/mask/breath,
@@ -50520,6 +51147,17 @@
/obj/structure/tank_holder/extinguisher,
/turf/open/floor/iron/white,
/area/station/medical/medbay/aft)
+"ooE" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 6
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"ooG" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -50566,6 +51204,11 @@
},
/turf/open/floor/iron/dark/textured,
/area/station/hallway/primary/central)
+"ooW" = (
+/obj/item/stack/rods/ten,
+/obj/structure/rack,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"opc" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 4
@@ -50673,13 +51316,6 @@
/obj/structure/cable,
/turf/open/floor/iron/dark/textured,
/area/station/security/armory)
-"oqc" = (
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage)
"oqg" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -50713,6 +51349,16 @@
},
/turf/open/floor/plating,
/area/station/service/kitchen/coldroom)
+"oqF" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{
+ dir = 4
+ },
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/pumproom)
"oqJ" = (
/obj/structure/sign/warning/docking/directional/north,
/obj/structure/flora/grass/green/style_random,
@@ -50753,6 +51399,28 @@
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood,
/area/station/maintenance/fore)
+"ori" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/iron/freezer,
+/area/station/science/xenobiology)
+"orl" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/stripes/white/corner,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos)
"orq" = (
/obj/machinery/light/small/directional/west,
/obj/machinery/button/door/directional/south{
@@ -50831,6 +51499,12 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
+"osb" = (
+/obj/machinery/camera/directional/west{
+ c_tag = "Atmospherics - Plasma"
+ },
+/turf/open/floor/engine/plasma,
+/area/station/engineering/atmos)
"osd" = (
/obj/structure/chair/comfy/black{
dir = 8
@@ -51012,21 +51686,6 @@
/obj/structure/sign/poster/random/directional/north,
/turf/open/floor/plating,
/area/station/maintenance/fore/lesser)
-"ouU" = (
-/obj/machinery/door/airlock/external{
- dir = 4;
- name = "External Access"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
-"ouW" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/random/structure/musician/piano/random_piano,
-/turf/open/floor/wood,
-/area/station/maintenance/aft/greater)
"ouX" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -51136,6 +51795,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
+"owR" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/item/kirbyplants/random/dead,
+/obj/structure/sign/poster/random/directional/south,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"oxb" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/obj/machinery/firealarm/directional/west,
@@ -51155,6 +51822,15 @@
},
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"oxy" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/storage/gas)
"oxB" = (
/obj/machinery/door/airlock/maintenance,
/obj/effect/mapping_helpers/airlock/abandoned,
@@ -51228,23 +51904,6 @@
/obj/structure/sign/warning/electric_shock/directional/north,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/fore)
-"oyj" = (
-/obj/structure/table,
-/obj/item/storage/box,
-/obj/item/storage/box,
-/obj/item/clothing/head/utility/welding{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/clothing/head/utility/welding{
- pixel_x = -5;
- pixel_y = 3
- },
-/obj/item/multitool,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/obj/machinery/airalarm/directional/south,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage/gas)
"oyo" = (
/obj/machinery/door/poddoor/shutters{
id = "secmechbaymaint";
@@ -51315,16 +51974,25 @@
/obj/structure/lattice/catwalk,
/turf/open/openspace/icemoon,
/area/icemoon/underground/explored)
-"oyW" = (
-/turf/open/floor/circuit,
-/area/station/ai/satellite/hallway)
-"oyX" = (
-/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible,
-/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{
+"oyN" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
},
/turf/open/floor/iron,
/area/station/engineering/atmos)
+"oyR" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2,
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable,
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
+"oyW" = (
+/turf/open/floor/circuit,
+/area/station/ai/satellite/hallway)
"oyY" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/door/firedoor,
@@ -51458,29 +52126,13 @@
},
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
+"oAf" = (
+/obj/machinery/light/directional/north,
+/turf/open/floor/engine/xenobio,
+/area/station/science/xenobiology)
"oAh" = (
/turf/open/floor/glass/reinforced,
/area/station/security/brig/entrance)
-"oAl" = (
-/obj/machinery/door/airlock/atmos/glass{
- name = "Atmospherics"
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"oAm" = (
/obj/structure/railing/wooden_fence{
dir = 10
@@ -51488,6 +52140,16 @@
/obj/effect/turf_decal/weather/snow/corner,
/turf/open/misc/hay/icemoon,
/area/icemoon/underground/explored)
+"oAp" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron,
+/area/station/engineering/lobby)
"oAs" = (
/obj/structure/table/reinforced,
/obj/item/storage/toolbox/mechanical,
@@ -51508,13 +52170,6 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron/dark,
/area/station/science/ordnance/office)
-"oAD" = (
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"oAM" = (
/obj/structure/fluff/tram_rail/end{
dir = 4
@@ -51596,6 +52251,24 @@
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron/dark/side,
/area/station/security/prison)
+"oCj" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
+"oCl" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/light/warm/directional/north,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos/mix)
"oCs" = (
/obj/structure/table,
/obj/item/radio/headset/headset_med{
@@ -51640,11 +52313,6 @@
},
/turf/open/floor/glass/reinforced,
/area/station/science/xenobiology)
-"oCE" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"oCF" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -51675,41 +52343,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/mine/laborcamp)
-"oDh" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
- dir = 10
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/dark_red/corner{
- dir = 1
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
-"oDn" = (
-/obj/machinery/door/airlock/atmos/glass,
-/obj/structure/cable,
-/obj/machinery/door/firedoor/heavy,
-/obj/effect/turf_decal/trimline/yellow/corner{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/yellow/corner{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/yellow/corner{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/yellow/corner,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/turf/open/floor/iron/dark/smooth_half,
-/area/station/engineering/atmos/project)
"oDt" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -51843,14 +52476,6 @@
/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"oED" = (
-/obj/machinery/camera/directional/west{
- c_tag = "Xenobiology Test Chamber";
- network = list("ss13","test","rd","xeno")
- },
-/obj/machinery/light/directional/west,
-/turf/open/floor/engine/xenobio,
-/area/station/science/xenobiology)
"oEE" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -51925,6 +52550,10 @@
},
/turf/open/floor/plating,
/area/station/maintenance/fore)
+"oFE" = (
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating,
+/area/station/engineering/atmos)
"oFG" = (
/obj/machinery/door/airlock/mining/glass{
name = "Drone Bay"
@@ -51952,14 +52581,6 @@
},
/turf/open/floor/glass/reinforced/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"oFW" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
-/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/engineering/atmos/pumproom)
"oFY" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/siding/yellow{
@@ -52109,11 +52730,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
-"oGN" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"oGO" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 5
@@ -52157,6 +52773,13 @@
/obj/item/soap/nanotrasen,
/turf/open/floor/iron/freezer,
/area/station/maintenance/starboard/fore)
+"oHk" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/disposalpipe/segment,
+/obj/effect/spawner/random/trash/caution_sign,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"oHo" = (
/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4{
dir = 1
@@ -52169,6 +52792,12 @@
},
/turf/open/floor/plating,
/area/station/engineering/storage_shared)
+"oHs" = (
+/obj/structure/table,
+/obj/item/folder,
+/obj/item/pen,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"oHH" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -52259,6 +52888,16 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
+"oIL" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/random/trash/grille_or_waste,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"oIN" = (
/obj/effect/turf_decal/box/corners{
dir = 8
@@ -52268,11 +52907,6 @@
},
/turf/open/floor/engine,
/area/station/engineering/atmos/hfr_room)
-"oIR" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/random/maintenance/four,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"oJc" = (
/obj/effect/turf_decal/stripes/red/line{
dir = 8
@@ -52336,6 +52970,14 @@
dir = 1
},
/area/station/command/gateway)
+"oKe" = (
+/obj/item/radio/intercom/directional/south,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/item/kirbyplants/organic/plant3,
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos)
"oKv" = (
/obj/item/trash/popcorn,
/turf/open/floor/plating,
@@ -52346,6 +52988,13 @@
},
/turf/open/floor/iron/white,
/area/station/science/lab)
+"oKI" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 6
+ },
+/obj/effect/turf_decal/siding/wideplating/corner,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"oKJ" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -52383,14 +53032,6 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/plating,
/area/station/construction)
-"oLa" = (
-/obj/structure/rack,
-/obj/effect/spawner/random/maintenance/two,
-/obj/item/pickaxe,
-/obj/item/mining_scanner,
-/obj/item/storage/bag/ore,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"oLg" = (
/turf/open/floor/iron/white/corner,
/area/station/science/research)
@@ -52471,15 +53112,6 @@
/obj/effect/mapping_helpers/airlock/access/any/command/ai_upload,
/turf/open/floor/iron/dark,
/area/station/ai/satellite/interior)
-"oLK" = (
-/obj/machinery/air_sensor/mix_tank,
-/turf/open/floor/engine/vacuum,
-/area/station/engineering/atmos)
-"oLL" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/lobby)
"oMa" = (
/obj/structure/marker_beacon/burgundy,
/obj/effect/turf_decal/weather/snow/corner{
@@ -52487,6 +53119,17 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"oMe" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/project)
+"oMg" = (
+/obj/effect/turf_decal/box/corners,
+/obj/effect/turf_decal/siding/wideplating/corner{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"oMj" = (
/obj/structure/flora/bush/sunny/style_random,
/obj/structure/flora/bush/fullgrass/style_random,
@@ -52498,10 +53141,6 @@
},
/turf/open/floor/iron,
/area/station/cargo/storage)
-"oMs" = (
-/obj/effect/spawner/random/trash/mess,
-/turf/open/floor/iron/grimy,
-/area/station/maintenance/aft/greater)
"oMP" = (
/obj/effect/spawner/random/entertainment/slot_machine,
/turf/open/floor/wood,
@@ -52729,6 +53368,21 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"oPZ" = (
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/item/paper{
+ pixel_y = 4
+ },
+/obj/item/pen{
+ pixel_x = -5
+ },
+/obj/item/producepad,
+/turf/open/floor/iron,
+/area/station/service/kitchen/coldroom)
"oQc" = (
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored/graveyard)
@@ -52842,6 +53496,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"oRX" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/project)
"oRY" = (
/obj/machinery/recharger,
/obj/structure/table,
@@ -52867,6 +53525,15 @@
/obj/structure/cable,
/turf/open/floor/iron/smooth,
/area/station/security/lockers)
+"oSI" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/spawner/random/trash/grille_or_waste,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
+"oSJ" = (
+/obj/structure/closet/toolcloset,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"oSK" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
@@ -52878,6 +53545,12 @@
/obj/effect/mapping_helpers/airlock/access/all/supply/general,
/turf/open/floor/plating,
/area/station/cargo/storage)
+"oSM" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input{
+ dir = 1
+ },
+/turf/open/floor/engine/n2o,
+/area/station/engineering/atmos)
"oSR" = (
/obj/machinery/door/firedoor,
/obj/structure/cable,
@@ -52900,13 +53573,6 @@
"oSU" = (
/turf/open/genturf,
/area/icemoon/underground/unexplored/rivers/deep)
-"oSX" = (
-/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible,
-/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"oTa" = (
/obj/structure/window/reinforced/spawner/directional/north,
/obj/structure/window/reinforced/spawner/directional/south,
@@ -52973,16 +53639,6 @@
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron/dark,
/area/station/service/chapel)
-"oTT" = (
-/obj/machinery/power/smes{
- charge = 2e+005
- },
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/box,
-/turf/open/floor/iron/dark/textured_large,
-/area/station/maintenance/disposal/incinerator)
"oUb" = (
/obj/machinery/light/small/directional/west,
/obj/effect/turf_decal/weather/snow/corner{
@@ -53007,6 +53663,15 @@
/obj/machinery/duct,
/turf/open/floor/iron/kitchen/diagonal,
/area/station/service/kitchen)
+"oUH" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/bot,
+/obj/machinery/airalarm/directional/south,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/project)
"oUL" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -53039,6 +53704,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/grimy,
/area/station/hallway/secondary/entry)
+"oVf" = (
+/obj/machinery/shower/directional/south,
+/obj/structure/fluff/shower_drain,
+/obj/machinery/firealarm/directional/west,
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos)
"oVt" = (
/obj/machinery/power/apc/auto_name/directional/south,
/obj/structure/cable,
@@ -53178,16 +53849,6 @@
"oXq" = (
/turf/open/floor/iron/white,
/area/station/medical/cryo)
-"oXr" = (
-/obj/machinery/door/airlock/research/glass{
- name = "Kill Chamber";
- normalspeed = 0
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/obj/effect/mapping_helpers/airlock/access/all/science/xenobio,
-/obj/structure/plasticflaps/kitchen,
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"oXx" = (
/obj/machinery/mass_driver/trash{
dir = 1
@@ -53273,11 +53934,6 @@
},
/turf/open/floor/iron/dark,
/area/station/ai/upload/chamber)
-"oYD" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/obj/structure/cable,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"oYL" = (
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 4
@@ -53355,13 +54011,6 @@
/obj/machinery/ai_law_rack/base/core,
/turf/open/floor/catwalk_floor/iron_dark,
/area/station/ai/upload/chamber)
-"oZL" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Mix to Engine"
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"pac" = (
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 8
@@ -53395,11 +54044,6 @@
/obj/structure/sign/warning/electric_shock/directional/north,
/turf/open/openspace/icemoon/keep_below,
/area/icemoon/underground/explored)
-"paF" = (
-/obj/structure/table,
-/obj/item/clothing/suit/hooded/wintercoat/science,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"paK" = (
/obj/structure/cable,
/turf/open/floor/iron,
@@ -53418,6 +54062,10 @@
"paM" = (
/turf/closed/wall,
/area/station/engineering/storage/tech)
+"paQ" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"paT" = (
/obj/machinery/door/poddoor/preopen{
id = "maint3"
@@ -53434,18 +54082,6 @@
/obj/structure/sign/poster/official/random/directional/east,
/turf/open/floor/iron,
/area/station/security/brig/upper)
-"pbk" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/red/filled/end{
- dir = 8
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"pbs" = (
/turf/closed/wall,
/area/station/ai/satellite/maintenance)
@@ -53535,12 +54171,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/ce)
-"pcr" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{
- dir = 8
- },
-/turf/open/floor/engine/n2o,
-/area/station/engineering/atmos)
"pcs" = (
/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
/obj/effect/turf_decal/bot,
@@ -53679,12 +54309,31 @@
/obj/effect/mapping_helpers/airlock/access/all/science/research,
/turf/open/floor/iron/dark,
/area/station/science/explab)
+"pek" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 1;
+ name = "N2 to Airmix"
+ },
+/obj/machinery/light/warm/directional/south,
+/obj/effect/turf_decal/box/white{
+ color = "#00FFFF"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"peq" = (
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/tile/blue,
/obj/structure/sign/departments/security/directional/east,
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
+"per" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 9
+ },
+/obj/effect/spawner/structure/window,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/pumproom)
"pez" = (
/obj/effect/turf_decal/tile/red/half/contrasted,
/turf/open/floor/iron/dark/textured_edge{
@@ -53747,9 +54396,6 @@
/obj/structure/cable,
/turf/open/floor/circuit,
/area/station/maintenance/department/electrical)
-"pgc" = (
-/turf/open/floor/wood,
-/area/station/maintenance/aft/greater)
"pgg" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/iv_drip,
@@ -53818,6 +54464,17 @@
/obj/structure/reagent_dispensers/wall/peppertank/directional/north,
/turf/open/floor/iron/smooth,
/area/station/security/execution/transfer)
+"pgJ" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/spawner/random/structure/steam_vent,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"pgL" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -53837,6 +54494,16 @@
/obj/item/radio/intercom/directional/east,
/turf/open/floor/iron/dark/textured,
/area/station/medical/cryo)
+"phc" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Pure to Engine"
+ },
+/obj/effect/turf_decal/box/white{
+ color = "#C3630C"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"phf" = (
/obj/item/assembly/timer{
pixel_x = -3;
@@ -53910,6 +54577,19 @@
},
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
+"phD" = (
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
+"phK" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"phL" = (
/obj/structure/reflector/single/anchored{
dir = 9
@@ -53923,15 +54603,6 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/security/courtroom)
-"phS" = (
-/obj/structure/table/reinforced,
-/obj/item/hfr_box/body/fuel_input,
-/obj/item/hfr_box/body/interface{
- pixel_x = 6;
- pixel_y = 9
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"pib" = (
/obj/machinery/camera/motion/directional/south{
c_tag = "Vault";
@@ -53949,6 +54620,13 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
+"pio" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/yellow,
+/turf/open/floor/iron/dark/corner{
+ dir = 4
+ },
+/area/station/engineering/atmos)
"piB" = (
/obj/structure/sign/warning/electric_shock/directional/north,
/obj/effect/turf_decal/stripes/corner{
@@ -54140,13 +54818,6 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron/dark,
/area/station/science/ordnance)
-"pkQ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/machinery/light/directional/south,
-/turf/open/floor/iron/showroomfloor,
-/area/station/engineering/atmos)
"pkW" = (
/obj/effect/turf_decal/plaque{
icon_state = "L4"
@@ -54159,13 +54830,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"pkY" = (
-/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{
- dir = 1
- },
-/obj/machinery/meter,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"plg" = (
/obj/machinery/atmospherics/components/tank/air,
/obj/effect/turf_decal/delivery,
@@ -54236,6 +54900,23 @@
/obj/machinery/disposal/bin,
/turf/open/floor/iron/dark/smooth_large,
/area/station/command/heads_quarters/hos)
+"pmK" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "Atmospherics Blast Door"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/caution/stand_clear{
+ dir = 8
+ },
+/turf/open/floor/iron/smooth_large,
+/area/station/engineering/atmos/hfr_room)
"pna" = (
/obj/machinery/door/poddoor/preopen{
id = "Engineering";
@@ -54337,17 +55018,6 @@
/obj/effect/mapping_helpers/airlock/access/all/security/brig,
/turf/open/floor/iron/dark/textured,
/area/station/security/execution/transfer)
-"pou" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
-/obj/machinery/duct,
-/obj/effect/turf_decal/siding/yellow{
- dir = 8
- },
-/obj/effect/landmark/start/atmospheric_technician,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"poy" = (
/turf/open/floor/carpet/green,
/area/station/service/library)
@@ -54385,6 +55055,11 @@
/obj/machinery/light/small/directional/north,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
+"poV" = (
+/obj/structure/barricade/wooden,
+/obj/structure/sign/warning/cold_temp/directional/north,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"ppc" = (
/obj/item/trash/syndi_cakes,
/obj/effect/turf_decal/stripes/red/line{
@@ -54403,6 +55078,13 @@
dir = 4
},
/area/station/security/brig/entrance)
+"ppo" = (
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
+/obj/effect/turf_decal/trimline/blue/arrow_cw{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"ppq" = (
/obj/structure/closet/wardrobe/grey{
anchored = 1
@@ -54465,6 +55147,14 @@
/obj/effect/turf_decal/tile/red,
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
+"ppW" = (
+/obj/machinery/atmospherics/components/binary/crystallizer,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/light/warm/directional/west,
+/obj/effect/turf_decal/bot_red,
+/obj/structure/sign/warning/secure_area/directional/west,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/project)
"ppY" = (
/obj/structure/marker_beacon/burgundy{
name = "landing marker"
@@ -54472,13 +55162,6 @@
/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
-"pqc" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
- dir = 6
- },
-/obj/machinery/meter,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"pqo" = (
/obj/structure/table/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -54637,19 +55320,11 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"ptp" = (
-/obj/structure/bookcase/random,
-/turf/open/floor/iron/grimy,
-/area/station/maintenance/aft/greater)
"ptQ" = (
/obj/structure/disposalpipe/trunk/multiz/down,
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"ptR" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"ptS" = (
/obj/structure/sign/painting/library{
pixel_y = 32;
@@ -54669,15 +55344,13 @@
/obj/effect/turf_decal/tile/red,
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
-"puf" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
-/turf/closed/wall/r_wall,
-/area/station/maintenance/disposal/incinerator)
-"puh" = (
-/obj/effect/spawner/random/clothing/bowler_or_that,
-/obj/structure/rack,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
+"pum" = (
+/obj/effect/turf_decal/box/white{
+ color = "#9FED58"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/engine,
+/area/station/engineering/atmos/hfr_room)
"pup" = (
/obj/effect/turf_decal/siding/wood/corner{
dir = 4
@@ -54787,13 +55460,6 @@
/obj/item/radio/intercom/directional/west,
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
-"pvh" = (
-/obj/item/clothing/glasses/meson,
-/obj/item/flashlight,
-/obj/item/clothing/suit/hooded/wintercoat/science,
-/obj/structure/rack,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"pvi" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 9
@@ -54811,11 +55477,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
-"pvo" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/girder,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"pvu" = (
/obj/effect/turf_decal/stripes/red/line{
dir = 8
@@ -54823,12 +55484,6 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/fore/lesser)
-"pvx" = (
-/obj/machinery/vending/wardrobe/atmos_wardrobe,
-/obj/effect/turf_decal/stripes/end,
-/obj/machinery/light/directional/north,
-/turf/open/floor/iron/showroomfloor,
-/area/station/engineering/atmos)
"pvz" = (
/obj/machinery/door/airlock/public/glass{
name = "Courtroom"
@@ -54900,10 +55555,6 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/station/maintenance/department/chapel)
-"pwF" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/maintenance/disposal/incinerator)
"pwH" = (
/obj/structure/chair/stool/directional/south,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -54976,6 +55627,15 @@
},
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/cmo)
+"pyb" = (
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 8
+ },
+/obj/machinery/light/warm/directional/north,
+/obj/effect/turf_decal/trimline/blue/line,
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"pyc" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
@@ -55077,10 +55737,6 @@
/obj/effect/spawner/random/structure/crate_abandoned,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"pyY" = (
-/obj/machinery/status_display/evac/directional/south,
-/turf/open/openspace,
-/area/station/engineering/atmos/storage)
"pza" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/circuit,
@@ -55089,16 +55745,6 @@
/obj/machinery/firealarm/directional/north,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"pzi" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
-/obj/structure/cable,
-/obj/machinery/duct,
-/obj/effect/turf_decal/siding/yellow{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"pzl" = (
/obj/structure/rack,
/obj/effect/turf_decal/tile/dark_blue/full,
@@ -55111,29 +55757,6 @@
},
/turf/open/floor/iron/dark/smooth_large,
/area/station/engineering/storage/tech)
-"pzn" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
- dir = 4
- },
-/obj/machinery/door/airlock/atmos/glass{
- name = "Atmospherics"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"pzs" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -55146,11 +55769,11 @@
/obj/item/book/manual/wiki/detective,
/turf/open/floor/carpet/blue,
/area/station/security/prison/work)
-"pzC" = (
-/obj/machinery/firealarm/directional/north,
-/obj/effect/turf_decal/siding/yellow{
+"pzO" = (
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
dir = 8
},
+/obj/effect/turf_decal/trimline/blue/arrow_cw,
/turf/open/floor/iron,
/area/station/engineering/atmos)
"pzV" = (
@@ -55171,21 +55794,6 @@
},
/turf/open/floor/iron,
/area/station/cargo/storage)
-"pAc" = (
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Ordnance Lab Maintenance"
- },
-/obj/machinery/door/firedoor/heavy,
-/obj/effect/mapping_helpers/airlock/access/all/science/ordnance,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/plating,
-/area/station/science/ordnance)
-"pAN" = (
-/obj/structure/ladder,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light/small/dim/directional/east,
-/turf/open/floor/iron/dark/textured_large,
-/area/station/maintenance/department/medical/central)
"pAT" = (
/obj/structure/cable/multilayer/multiz,
/obj/effect/turf_decal/stripes/box,
@@ -55216,6 +55824,17 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"pBn" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/blue/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/blue/corner_long,
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"pBp" = (
/obj/machinery/door/airlock/security{
name = "Permanent Cell 1"
@@ -55296,6 +55915,18 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/mine/laborcamp)
+"pCv" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 8
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/obj/effect/turf_decal/siding/yellow{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"pCG" = (
/obj/structure/fence/corner{
dir = 2
@@ -55513,6 +56144,23 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
+"pGu" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/structure/railing/corner/end/flip{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/corner,
+/obj/effect/turf_decal/trimline/blue/arrow_cw{
+ dir = 8
+ },
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"pGw" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -55529,21 +56177,11 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/entry)
-"pGG" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/sign/poster/random/directional/south,
-/obj/structure/closet/toolcloset,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"pGJ" = (
/obj/structure/sign/poster/contraband/random/directional/north,
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"pGQ" = (
-/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,
-/turf/closed/wall,
-/area/station/engineering/atmos)
"pGS" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
@@ -55652,11 +56290,6 @@
/obj/effect/spawner/random/maintenance,
/turf/open/floor/iron,
/area/station/maintenance/starboard/upper)
-"pIJ" = (
-/obj/structure/chair/sofa/corp/right,
-/obj/effect/landmark/start/hangover,
-/turf/open/floor/iron/dark,
-/area/station/engineering/lobby)
"pJc" = (
/obj/machinery/component_printer,
/obj/machinery/camera/directional/west{
@@ -55711,6 +56344,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
+"pJK" = (
+/obj/effect/mapping_helpers/broken_floor,
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/landmark/generic_maintenance_landmark,
+/turf/open/floor/wood,
+/area/station/maintenance/aft/lesser)
"pJM" = (
/obj/structure/rack,
/obj/item/poster/random_official,
@@ -55724,14 +56363,6 @@
/obj/item/clothing/head/costume/fancy,
/turf/open/floor/iron/dark/textured,
/area/station/security/prison)
-"pJQ" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
- },
-/turf/open/floor/plating,
-/area/station/engineering/atmos/storage/gas)
"pJU" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -55765,6 +56396,16 @@
},
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
+"pKi" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/firealarm/directional/north,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/item/kirbyplants/organic/plant20,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"pKl" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -55910,23 +56551,15 @@
/obj/effect/spawner/random/trash/botanical_waste,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"pMq" = (
-/obj/machinery/camera/directional/south{
- c_tag = "Atmospherics Storage Room - South"
- },
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
+"pMg" = (
+/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{
dir = 4
},
-/obj/effect/turf_decal/stripes/corner,
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
+/obj/effect/turf_decal/box/white{
+ color = "#008000"
},
/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
+/area/station/engineering/atmos)
"pMu" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
@@ -55954,13 +56587,6 @@
/obj/structure/fence/door,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"pMN" = (
-/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/effect/mapping_helpers/airlock/locked,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/turf/open/floor/engine,
-/area/station/maintenance/disposal/incinerator)
"pMX" = (
/obj/structure/table,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -56054,10 +56680,10 @@
/obj/machinery/light/small/dim/directional/north,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"pOy" = (
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
+"pOr" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"pOH" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/command{
@@ -56076,25 +56702,12 @@
"pOL" = (
/turf/open/floor/iron/white,
/area/station/science/ordnance)
-"pOV" = (
-/obj/structure/rack,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/wrench,
-/obj/effect/spawner/random/maintenance/two,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"pPg" = (
/obj/structure/stairs/west,
/turf/open/floor/iron/stairs/medium{
dir = 4
},
/area/station/service/hydroponics)
-"pPy" = (
-/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
- dir = 4
- },
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"pPB" = (
/obj/machinery/seed_extractor,
/obj/effect/turf_decal/trimline/green/filled/line{
@@ -56153,6 +56766,10 @@
},
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"pQl" = (
+/obj/structure/table,
+/turf/open/floor/wood,
+/area/station/maintenance/aft/lesser)
"pQo" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
@@ -56277,18 +56894,16 @@
},
/turf/open/floor/plating,
/area/station/commons/vacant_room/commissary)
-"pSk" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
+"pSb" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 6
},
-/obj/machinery/power/apc/auto_name/directional/north,
-/obj/structure/cable,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/camera/directional/north{
- c_tag = "Atmospherics Storage Room - North"
+/obj/structure/railing/corner/end{
+ dir = 4
},
+/obj/machinery/meter,
/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
+/area/station/engineering/atmos)
"pSq" = (
/obj/effect/turf_decal/siding/wood{
dir = 9
@@ -56354,6 +56969,10 @@
/obj/machinery/light/small/directional/south,
/turf/open/floor/plating,
/area/station/maintenance/fore)
+"pSI" = (
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"pSK" = (
/obj/effect/turf_decal/weather/snow/corner{
dir = 5
@@ -56362,6 +56981,24 @@
/obj/structure/sign/warning/cold_temp/directional/north,
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"pSO" = (
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/door/poddoor/preopen{
+ id = "xenobiomain";
+ name = "Containment Blast Door"
+ },
+/obj/structure/cable,
+/obj/machinery/button/door/directional/east{
+ id = "xenobio11";
+ name = "Xenobio Pen 11 Blast Doors";
+ req_access = list("xenobiology")
+ },
+/turf/open/floor/iron,
+/area/station/science/xenobiology)
"pTd" = (
/obj/structure/table/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -56465,6 +57102,15 @@
"pUa" = (
/turf/open/openspace/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
+"pUd" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wideplating/corner{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"pUi" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -56572,12 +57218,22 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/solars/port/fore)
+"pVO" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/start/atmospheric_technician,
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"pVQ" = (
/obj/effect/turf_decal/weather/snow/corner{
dir = 6
},
/turf/open/floor/plating/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"pVT" = (
+/turf/open/floor/iron/stairs/medium{
+ dir = 4
+ },
+/area/station/engineering/atmos/hfr_room)
"pVV" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -56628,6 +57284,21 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
+"pWt" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/orange/visible,
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos)
"pWu" = (
/obj/docking_port/stationary/syndicate/northeast{
dir = 8
@@ -56670,6 +57341,15 @@
/obj/machinery/airalarm/directional/east,
/turf/open/floor/iron,
/area/station/security/prison/workout)
+"pXg" = (
+/obj/structure/table,
+/obj/item/stack/sheet/iron/fifty{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/stack/sheet/iron/fifty,
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos)
"pXh" = (
/obj/effect/turf_decal/tile/green{
dir = 4
@@ -56690,14 +57370,15 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"pXq" = (
-/obj/machinery/button/door/directional/east{
- id = "xenobio6";
- name = "Xenobio Pen 6 Blast DOors";
- req_access = list("xenobiology")
+"pXs" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 8
},
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
+/obj/effect/turf_decal/bot,
+/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/newscaster/directional/east,
+/turf/open/floor/iron/textured,
+/area/station/engineering/atmos/mix)
"pXt" = (
/obj/structure/lattice/catwalk,
/obj/machinery/camera/directional/north{
@@ -56751,13 +57432,6 @@
dir = 1
},
/area/station/security/range)
-"pYg" = (
-/obj/effect/turf_decal/siding/yellow{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"pYk" = (
/obj/machinery/porta_turret/ai{
dir = 8
@@ -56817,14 +57491,6 @@
/obj/structure/cable,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
-"pZn" = (
-/obj/effect/turf_decal/siding/yellow/corner,
-/obj/structure/cable,
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/turf/open/floor/iron,
-/area/station/engineering/lobby)
"pZo" = (
/obj/machinery/door/airlock/command{
name = "MiniSat Access"
@@ -56859,6 +57525,11 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/mine/eva)
+"pZF" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/project)
"pZG" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -56887,22 +57558,11 @@
},
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"pZZ" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"qaa" = (
/obj/structure/cable,
/obj/effect/spawner/structure/window/hollow/reinforced/middle,
/turf/open/floor/plating,
/area/mine/laborcamp)
-"qab" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input{
- dir = 8
- },
-/turf/open/floor/engine/plasma,
-/area/station/engineering/atmos)
"qad" = (
/obj/effect/turf_decal/tile/purple/half/contrasted{
dir = 4
@@ -57127,6 +57787,11 @@
},
/turf/open/floor/iron,
/area/station/tcommsat/computer)
+"qcg" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"qch" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/disposalpipe/segment,
@@ -57277,6 +57942,12 @@
},
/turf/open/floor/iron,
/area/station/tcommsat/computer)
+"qeg" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/carbon_output{
+ dir = 1
+ },
+/turf/open/floor/engine/co2,
+/area/station/engineering/atmos)
"qeh" = (
/obj/machinery/meter,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
@@ -57292,6 +57963,9 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/textured,
/area/station/service/hydroponics)
+"qey" = (
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos/hfr_room)
"qeF" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -57351,6 +58025,12 @@
dir = 8
},
/area/station/commons/storage/mining)
+"qfe" = (
+/obj/structure/railing/corner/end/flip{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"qfh" = (
/turf/open/floor/iron/recharge_floor,
/area/station/science/robotics/mechbay)
@@ -57411,18 +58091,12 @@
/obj/structure/sign/warning/secure_area/directional/north,
/turf/open/floor/iron/white,
/area/station/science/research)
-"qfD" = (
-/obj/structure/cable,
-/obj/machinery/duct,
-/obj/structure/disposalpipe/junction/yjunction{
- dir = 8
+"qfB" = (
+/obj/structure/chair/sofa/corner/brown{
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/mapping_helpers/burnt_floor,
-/obj/effect/landmark/firealarm_sanity,
/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
+/area/station/maintenance/aft/lesser)
"qfE" = (
/obj/effect/turf_decal/trimline/yellow/filled/warning{
dir = 4
@@ -57451,14 +58125,18 @@
dir = 1
},
/area/station/security/office)
-"qgm" = (
-/obj/machinery/meter/monitored/waste_loop,
-/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{
- dir = 8
+"qgn" = (
+/obj/structure/fence{
+ dir = 4
},
-/obj/effect/turf_decal/siding/wideplating/corner,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{
+ dir = 4
+ },
+/turf/open/floor/plating/snowed/icemoon,
+/area/icemoon/surface/outdoors/less_spawns)
"qgu" = (
/obj/structure/cable,
/obj/effect/landmark/start/medical_doctor,
@@ -57528,6 +58206,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/catwalk_floor/iron_dark,
/area/station/security/prison)
+"qif" = (
+/obj/effect/spawner/structure/window,
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "Atmospherics Blast Door"
+ },
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/storage/gas)
"qig" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -57541,6 +58228,23 @@
/obj/machinery/firealarm/directional/east,
/turf/open/floor/iron/dark/side,
/area/station/service/chapel)
+"qin" = (
+/obj/effect/turf_decal/siding/wideplating,
+/obj/machinery/atmospherics/pipe/multiz/dark/visible/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/multiz/pink/visible/layer2{
+ dir = 8;
+ name = "Basement Input"
+ },
+/obj/effect/turf_decal/box/red/corners{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/red/corners{
+ dir = 1
+ },
+/turf/open/floor/iron/textured_large,
+/area/station/engineering/atmos)
"qiv" = (
/obj/structure/railing,
/obj/effect/turf_decal/siding/thinplating_new/light{
@@ -57587,17 +58291,6 @@
/obj/machinery/status_display/ai/directional/east,
/turf/open/floor/iron,
/area/station/command/heads_quarters/qm)
-"qjb" = (
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
- dir = 10
- },
-/obj/effect/turf_decal/siding/wideplating/corner{
- dir = 8
- },
-/obj/structure/cable,
-/obj/machinery/power/apc/auto_name/directional/north,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
"qjg" = (
/obj/effect/landmark/observer_start,
/obj/effect/turf_decal/plaque{
@@ -57633,6 +58326,13 @@
/obj/structure/girder,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
+"qjz" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"qjF" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 9
@@ -57724,6 +58424,17 @@
/obj/structure/sign/warning/directional/south,
/turf/open/floor/iron/dark,
/area/station/science/ordnance)
+"qlg" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
+/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/blue/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/line,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"qlk" = (
/obj/machinery/door/airlock/external{
glass = 1;
@@ -57800,6 +58511,13 @@
/obj/structure/closet/crate,
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
+"qmf" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Pure to Port";
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/mix)
"qmh" = (
/obj/effect/turf_decal/siding/wood{
dir = 8
@@ -57875,15 +58593,6 @@
"qnC" = (
/turf/closed/wall/r_wall,
/area/station/command/heads_quarters/ce)
-"qnO" = (
-/obj/machinery/atmospherics/components/trinary/mixer/airmix{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"qnU" = (
/obj/structure/rack,
/obj/item/gun/energy/ionrifle,
@@ -57920,6 +58629,11 @@
/obj/effect/spawner/random/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
+"qof" = (
+/obj/structure/sign/warning/electric_shock/directional/north,
+/obj/machinery/power/port_gen/pacman/pre_loaded,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"qoi" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -57989,11 +58703,6 @@
dir = 8
},
/area/station/medical/chemistry)
-"qpr" = (
-/obj/effect/turf_decal/trimline/dark_blue/line,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"qpt" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -58042,6 +58751,15 @@
/obj/effect/turf_decal/tile/red,
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
+"qpC" = (
+/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/white{
+ color = "#008000"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"qpD" = (
/obj/effect/spawner/random/trash/hobo_squat,
/obj/effect/decal/cleanable/generic,
@@ -58106,6 +58824,15 @@
/obj/machinery/firealarm/directional/east,
/turf/open/floor/iron,
/area/station/security/prison/visit)
+"qqn" = (
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wideplating/corner{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"qqs" = (
/obj/structure/table/wood,
/obj/item/rag,
@@ -58265,7 +58992,7 @@
/area/station/engineering/storage)
"qtu" = (
/obj/structure/table,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 5
},
@@ -58317,10 +59044,6 @@
},
/turf/open/floor/iron,
/area/mine/production)
-"quy" = (
-/obj/structure/flora/grass/both/style_random,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"quB" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/disposalpipe/segment{
@@ -58351,12 +59074,6 @@
/obj/effect/spawner/random/trash/cigbutt,
/turf/open/floor/stone,
/area/station/service/bar/atrium)
-"quW" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/sign/warning/docking/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"quY" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
@@ -58400,40 +59117,11 @@
},
/turf/open/floor/wood,
/area/station/service/library)
-"qvM" = (
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
-"qvQ" = (
-/obj/structure/closet/secure_closet/atmospherics,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos)
"qvS" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/sign/poster/official/random/directional/north,
/turf/open/floor/iron/dark,
/area/mine/eva)
-"qvW" = (
-/obj/structure/table,
-/obj/item/storage/belt/utility,
-/obj/item/t_scanner,
-/obj/item/t_scanner,
-/obj/item/t_scanner,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/obj/item/tank/internals/emergency_oxygen{
- pixel_x = -8
- },
-/obj/item/tank/internals/emergency_oxygen{
- pixel_x = -8
- },
-/obj/item/clothing/mask/breath{
- pixel_x = 4
- },
-/obj/item/clothing/mask/breath{
- pixel_x = 4
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage/gas)
"qwe" = (
/obj/structure/table,
/obj/item/phone{
@@ -58456,13 +59144,6 @@
},
/turf/open/floor/iron/dark,
/area/station/command/eva)
-"qwo" = (
-/obj/structure/table,
-/obj/item/stack/sheet/glass/fifty,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"qwB" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/wood,
@@ -58522,13 +59203,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/station/construction)
-"qxo" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/station/engineering/atmos)
"qxp" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -58546,6 +59220,9 @@
/obj/machinery/holopad,
/turf/open/floor/iron/white,
/area/station/medical/medbay/aft)
+"qxD" = (
+/turf/open/floor/iron,
+/area/station/engineering/atmos/mix)
"qxG" = (
/obj/effect/turf_decal/trimline/green/filled/warning{
dir = 1
@@ -58588,13 +59265,6 @@
/obj/effect/turf_decal/bot_white,
/turf/open/floor/iron/grimy,
/area/station/service/theater)
-"qyI" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/station/engineering/atmos/pumproom)
"qyL" = (
/obj/structure/closet/secure_closet/personal{
anchored = 1
@@ -58614,6 +59284,22 @@
},
/turf/open/floor/iron/dark,
/area/station/cargo/miningdock)
+"qzk" = (
+/obj/structure/bookcase/random,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
+"qzm" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
+"qzn" = (
+/obj/structure/flora/bush/leavy/style_random,
+/obj/structure/reagent_dispensers/watertank,
+/turf/open/floor/grass,
+/area/station/maintenance/starboard/aft)
"qzs" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -58659,11 +59345,20 @@
},
/turf/open/floor/wood,
/area/station/maintenance/port/aft)
-"qzT" = (
-/obj/structure/closet/firecloset,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
+"qzR" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/obj/machinery/firealarm/directional/west,
+/obj/machinery/camera/directional/west{
+ c_tag = "Atmospherics - Pump Room"
+ },
+/turf/open/floor/iron/dark/corner{
+ dir = 8
+ },
+/area/station/engineering/atmos/pumproom)
"qzV" = (
/obj/effect/spawner/structure/window/hollow/reinforced/middle{
dir = 4
@@ -58685,6 +59380,17 @@
},
/turf/open/misc/hay/icemoon,
/area/icemoon/underground/explored)
+"qAm" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/random/structure/steam_vent,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"qAn" = (
/turf/open/floor/carpet/blue,
/area/station/security/prison/work)
@@ -58702,20 +59408,6 @@
/obj/machinery/shower/directional/east,
/turf/open/floor/iron/smooth,
/area/mine/living_quarters)
-"qAQ" = (
-/turf/open/floor/engine/vacuum,
-/area/station/engineering/atmos)
-"qAT" = (
-/obj/machinery/light/small/directional/south,
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"qAV" = (
/obj/machinery/telecomms/server/presets/supply,
/turf/open/floor/iron/dark/telecomms,
@@ -58828,6 +59520,11 @@
},
/turf/open/floor/plating,
/area/station/cargo/storage)
+"qDr" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"qDA" = (
/obj/structure/bed{
dir = 4
@@ -59062,6 +59759,10 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/vault,
/area/station/security/prison/rec)
+"qGd" = (
+/obj/effect/spawner/structure/window/reinforced/plasma,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/hfr_room)
"qGg" = (
/obj/structure/rack,
/obj/item/pickaxe,
@@ -59071,12 +59772,15 @@
/obj/item/gps/mining,
/turf/open/floor/iron/smooth,
/area/mine/eva)
-"qGC" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/heater/on,
-/obj/machinery/airalarm/directional/east,
-/obj/machinery/firealarm/directional/north,
+"qGs" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/obj/effect/turf_decal/trimline/red/line{
+ dir = 4
+ },
/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
+/area/station/engineering/atmos)
"qGJ" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -59110,6 +59814,16 @@
/obj/effect/turf_decal/bot_white,
/turf/open/floor/iron/checker,
/area/station/commons/storage/emergency/port)
+"qHf" = (
+/obj/effect/mapping_helpers/mail_sorting/science/experimentor_lab,
+/obj/structure/disposalpipe/sorting/mail{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"qHg" = (
/obj/structure/transit_tube/curved/flipped{
dir = 1
@@ -59137,17 +59851,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
-"qHt" = (
-/obj/structure/chair{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 4
- },
-/obj/effect/mapping_helpers/broken_floor,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/wood,
-/area/station/maintenance/aft/greater)
"qHz" = (
/obj/machinery/light_switch/directional/west,
/obj/machinery/disposal/bin{
@@ -59166,6 +59869,13 @@
dir = 1
},
/area/station/medical/virology)
+"qHK" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/railing/corner/end{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"qHO" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/structure/chair/sofa/bench/right{
@@ -59206,6 +59916,10 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/solars/port/aft)
+"qIh" = (
+/obj/structure/reagent_dispensers/watertank,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"qIo" = (
/obj/structure/closet/crate/hydroponics,
/obj/item/paper/guides/jobs/hydroponics,
@@ -59263,33 +59977,9 @@
},
/turf/open/floor/iron/textured_half,
/area/station/command/eva)
-"qIC" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/engineering/atmos/pumproom)
"qIU" = (
/turf/open/floor/iron,
/area/station/commons/dorms)
-"qJh" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/machinery/duct,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
-"qJi" = (
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 1
- },
-/obj/structure/sign/warning/radiation/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"qJv" = (
/obj/effect/turf_decal/siding/wood,
/obj/item/cigbutt,
@@ -59322,6 +60012,17 @@
/obj/machinery/airalarm/directional/north,
/turf/open/floor/iron,
/area/station/service/hydroponics)
+"qJE" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/firealarm/directional/north,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos/mix)
"qJT" = (
/obj/machinery/light/small/directional/south,
/turf/open/floor/plating/snowed/icemoon,
@@ -59602,24 +60303,10 @@
/obj/machinery/telecomms/receiver/preset_right,
/turf/open/floor/iron/dark/telecomms,
/area/station/tcommsat/server)
-"qNx" = (
-/obj/structure/ladder,
-/obj/machinery/light/directional/west,
-/obj/effect/turf_decal/tile/neutral/diagonal_centre,
-/obj/effect/turf_decal/tile/dark_blue/diagonal_edge,
-/turf/open/floor/iron/dark/diagonal,
-/area/station/engineering/atmos/mix)
"qNE" = (
/obj/effect/spawner/random/trash/mess,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"qNF" = (
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
- dir = 9
- },
-/obj/machinery/light/floor,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"qNK" = (
/obj/item/radio/intercom/prison/directional/west,
/obj/structure/railing/corner{
@@ -59683,6 +60370,14 @@
},
/turf/open/floor/iron/textured_half,
/area/station/command/eva)
+"qOE" = (
+/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet/directional/south,
+/obj/machinery/meter,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos/hfr_room)
"qOG" = (
/obj/structure/table/wood,
/obj/item/plate,
@@ -59837,13 +60532,6 @@
"qQp" = (
/turf/closed/wall,
/area/station/medical/storage)
-"qQq" = (
-/obj/machinery/meter{
- name = "Mixed Air Tank Out"
- },
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
-/turf/closed/wall/r_wall,
-/area/station/engineering/atmos)
"qQt" = (
/obj/machinery/light/small/directional/west,
/turf/open/misc/asteroid/snow/icemoon,
@@ -60010,6 +60698,11 @@
},
/turf/open/lava/plasma/ice_moon,
/area/icemoon/underground/explored)
+"qSy" = (
+/obj/structure/chair/stool/directional/west,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/maintenance/department/medical/central)
"qSE" = (
/obj/machinery/door/poddoor/preopen{
id = "misclab";
@@ -60022,27 +60715,26 @@
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
-"qST" = (
-/obj/structure/table/reinforced,
-/obj/item/pipe_dispenser,
-/obj/item/multitool,
-/obj/machinery/light/directional/west,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
+"qSI" = (
+/obj/structure/closet/crate,
+/obj/effect/spawner/random/maintenance/two,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
+"qSN" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{
+ dir = 1
+ },
+/obj/structure/railing/corner/end{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/mix)
"qSY" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"qTa" = (
-/obj/machinery/portable_atmospherics/pipe_scrubber,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/turf/open/floor/iron/showroomfloor,
-/area/station/engineering/atmos)
"qTf" = (
/turf/open/misc/asteroid/snow/standard_air,
/area/station/science/cytology)
@@ -60071,6 +60763,22 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/department/security)
+"qTz" = (
+/obj/machinery/airalarm/directional/west,
+/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/red/corner,
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"qTD" = (
/obj/structure/marker_beacon/burgundy{
name = "landing marker"
@@ -60125,12 +60833,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/solars/starboard/aft)
-"qUu" = (
-/obj/structure/cable,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible/layer2,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"qUI" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -60142,11 +60844,6 @@
/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/iron/grimy,
/area/station/service/bar/backroom)
-"qUL" = (
-/obj/structure/closet/emcloset,
-/obj/effect/spawner/random/maintenance/two,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"qUQ" = (
/obj/machinery/power/smes,
/obj/structure/cable,
@@ -60305,14 +61002,6 @@
/obj/item/flashlight,
/turf/open/floor/iron/dark,
/area/station/engineering/supermatter/room)
-"qWK" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 10
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"qWM" = (
/obj/item/stack/sheet/glass/fifty,
/obj/item/stack/sheet/glass/fifty,
@@ -60355,6 +61044,17 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
+"qXo" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden,
+/obj/machinery/firealarm/directional/east,
+/turf/open/floor/iron/checker,
+/area/station/engineering/atmos)
"qXO" = (
/obj/structure/flora/bush/jungle/c/style_random,
/turf/open/floor/grass,
@@ -60550,6 +61250,14 @@
},
/turf/open/floor/iron/dark,
/area/station/medical/treatment_center)
+"qZE" = (
+/obj/structure/table,
+/obj/item/flashlight/lamp{
+ start_on = 0
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/wood,
+/area/station/maintenance/aft/lesser)
"qZG" = (
/obj/machinery/light/small/directional/west,
/obj/effect/decal/cleanable/dirt/dust,
@@ -60578,6 +61286,12 @@
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron/textured,
/area/mine/mechbay)
+"qZX" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"qZZ" = (
/obj/structure/marker_beacon/yellow,
/turf/open/misc/dirt{
@@ -60633,14 +61347,28 @@
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/iron/dark,
/area/station/engineering/storage)
-"raA" = (
+"rax" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/landmark/start/atmospheric_technician,
-/obj/machinery/atmospherics/pipe/smart/simple/brown/visible{
- dir = 10
+/obj/structure/chair/stool/bar/directional/north,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
+"raD" = (
+/obj/machinery/computer/station_alert{
+ dir = 8
},
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
+/obj/machinery/button/door/directional/south{
+ id = "atmos";
+ pixel_y = -26;
+ pixel_x = 5
+ },
+/obj/structure/curtain/bounty{
+ pixel_x = 32
+ },
+/obj/machinery/light_switch/directional/south{
+ pixel_x = -5
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/storage/gas)
"raH" = (
/obj/effect/spawner/random/structure/crate,
/obj/effect/mapping_helpers/broken_floor,
@@ -60671,10 +61399,16 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
/turf/open/floor/plating,
/area/station/maintenance/solars/port/aft)
-"rbf" = (
-/obj/structure/closet,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
+"rbk" = (
+/obj/structure/table/reinforced,
+/obj/item/hfr_box/body/fuel_input,
+/obj/item/hfr_box/body/interface{
+ pixel_x = 6;
+ pixel_y = 9
+ },
+/obj/machinery/status_display/ai/directional/west,
+/turf/open/floor/iron/dark/smooth_large,
+/area/station/engineering/atmos/hfr_room)
"rbm" = (
/obj/machinery/camera/directional/east{
c_tag = "MiniSat External NorthWest";
@@ -60683,11 +61417,6 @@
},
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"rbs" = (
-/obj/effect/turf_decal/tile/yellow,
-/obj/machinery/light/directional/east,
-/turf/open/floor/iron,
-/area/station/hallway/primary/aft)
"rbB" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
@@ -60713,12 +61442,6 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
-"rbY" = (
-/obj/structure/table/reinforced,
-/obj/item/pipe_dispenser,
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"rbZ" = (
/obj/effect/turf_decal/weather/snow/corner{
dir = 8
@@ -60749,6 +61472,13 @@
},
/turf/open/floor/iron,
/area/station/science/explab)
+"rct" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/grille/broken,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"rcA" = (
/obj/structure/rack,
/obj/effect/spawner/random/techstorage/arcade_boards,
@@ -60955,15 +61685,6 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/iron/white,
/area/station/medical/psychology)
-"rfp" = (
-/obj/effect/turf_decal/stripes/corner,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/railing/corner/end{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/lobby)
"rfu" = (
/turf/closed/wall/r_wall,
/area/station/security/prison/rec)
@@ -60982,10 +61703,6 @@
/obj/machinery/telecomms/bus/preset_two,
/turf/open/floor/circuit/telecomms/mainframe,
/area/station/tcommsat/server)
-"rfS" = (
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"rgl" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/obj/structure/disposalpipe/segment,
@@ -61035,13 +61752,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"rgB" = (
-/obj/structure/cable,
-/obj/item/radio/intercom/directional/south,
-/obj/effect/turf_decal/trimline/dark_blue/line,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"rgC" = (
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 4
@@ -61112,6 +61822,15 @@
/obj/machinery/firealarm/directional/east,
/turf/open/floor/iron/dark,
/area/station/science/ordnance)
+"rif" = (
+/obj/machinery/door/airlock/maintenance{
+ name = "Atmospherics Maintenance"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"rig" = (
/obj/structure/bed,
/obj/effect/spawner/random/maintenance,
@@ -61213,6 +61932,15 @@
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/cmo)
+"rjy" = (
+/obj/machinery/atmospherics/components/trinary/mixer/airmix{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/white{
+ color = "#00FFFF"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"rjE" = (
/obj/structure/fluff/tram_rail{
pixel_y = 17
@@ -61232,11 +61960,6 @@
/obj/structure/sign/poster/official/random/directional/north,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
-"rjV" = (
-/obj/structure/table,
-/obj/effect/spawner/random/maintenance,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"rkc" = (
/obj/effect/turf_decal/siding/yellow,
/obj/effect/turf_decal/siding/yellow{
@@ -61244,6 +61967,11 @@
},
/turf/open/floor/iron,
/area/station/engineering/storage)
+"rkf" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/wood,
+/area/station/maintenance/aft/lesser)
"rkh" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -61288,15 +62016,6 @@
},
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
-"rkt" = (
-/obj/structure/cable,
-/obj/machinery/light/directional/east,
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"rkz" = (
/obj/structure/railing,
/turf/open/floor/iron/dark,
@@ -61338,9 +62057,6 @@
"rkL" = (
/turf/open/floor/carpet/blue,
/area/station/medical/psychology)
-"rkN" = (
-/turf/closed/wall,
-/area/station/engineering/atmos/hfr_room)
"rkP" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -61368,12 +62084,6 @@
/obj/item/kirbyplants/random,
/turf/open/floor/iron/dark/textured,
/area/station/security/office)
-"rlf" = (
-/obj/effect/spawner/random/structure/steam_vent,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"rlj" = (
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating,
@@ -61386,6 +62096,13 @@
/obj/structure/railing,
/turf/open/openspace/icemoon,
/area/icemoon/underground/explored)
+"rls" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/duct,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/engineering/lobby)
"rlu" = (
/obj/effect/spawner/random/vending/snackvend,
/turf/open/floor/iron/dark,
@@ -61421,6 +62138,14 @@
/obj/structure/table/wood,
/turf/open/floor/wood,
/area/station/commons/dorms)
+"rme" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
+ dir = 4
+ },
+/obj/structure/sign/nanotrasen/directional/north,
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"rmn" = (
/obj/structure/chair/stool/directional/north,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -61456,6 +62181,13 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"rmM" = (
+/obj/structure/cable,
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch,
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"rmP" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/disposalpipe/segment{
@@ -61611,6 +62343,26 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron,
/area/station/science/xenobiology)
+"roM" = (
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/yellow{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4{
+ dir = 6
+ },
+/obj/machinery/firealarm/directional/north{
+ pixel_x = -4
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"roQ" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -61721,12 +62473,6 @@
/obj/structure/sign/poster/contraband/free_drone/directional/east,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"rqD" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"rqF" = (
/obj/machinery/door/poddoor{
id = "engstorage";
@@ -61805,6 +62551,20 @@
/obj/machinery/light/directional/east,
/turf/open/floor/iron,
/area/station/command/heads_quarters/qm)
+"rrC" = (
+/obj/machinery/door/airlock/atmos/glass{
+ name = "Project Room Access"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"rrF" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -61868,10 +62628,6 @@
/obj/effect/spawner/random/structure/steam_vent,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"rsh" = (
-/obj/structure/sign/poster/contraband/the_big_gas_giant_truth/directional/north,
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"rsw" = (
/obj/effect/turf_decal/stripes/corner{
dir = 8
@@ -61929,6 +62685,13 @@
dir = 1
},
/area/station/security/prison/safe)
+"rsQ" = (
+/obj/machinery/atmospherics/components/tank/air{
+ dir = 8;
+ starting_pressure_percent = 0.15
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"rsR" = (
/obj/structure/table/optable,
/obj/effect/turf_decal/tile/blue/full,
@@ -61986,6 +62749,20 @@
},
/turf/open/floor/wood,
/area/station/security/courtroom)
+"rtj" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden{
+ dir = 2
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{
+ dir = 9
+ },
+/obj/structure/cable,
+/obj/machinery/power/smes{
+ charge = 2e+005
+ },
+/turf/open/floor/iron/dark/textured,
+/area/station/maintenance/disposal/incinerator)
"rtm" = (
/obj/structure/sign/warning/directional/south,
/turf/open/lava/plasma/ice_moon,
@@ -62003,17 +62780,6 @@
/obj/effect/mapping_helpers/airlock/access/all/service/crematorium,
/turf/open/floor/plating,
/area/station/maintenance/department/chapel)
-"rtt" = (
-/obj/effect/turf_decal/trimline/dark_green/line,
-/obj/effect/turf_decal/trimline/dark_green/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"rtw" = (
/obj/structure/reagent_dispensers/cooking_oil,
/turf/open/misc/asteroid/snow/coldroom,
@@ -62063,23 +62829,14 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron/dark/textured,
/area/station/engineering/atmos/storage/gas)
-"ruw" = (
-/obj/machinery/atmospherics/components/trinary/mixer{
- dir = 1;
- name = "plasma mixer"
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"ruD" = (
/obj/machinery/space_heater,
/turf/open/floor/plating,
/area/station/maintenance/department/cargo)
-"ruI" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Air to Port"
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
+"ruH" = (
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos/hfr_room)
"ruK" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/blue,
@@ -62127,14 +62884,6 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
-"rwe" = (
-/obj/structure/lattice/catwalk,
-/obj/structure/railing/corner,
-/obj/structure/railing/corner{
- dir = 4
- },
-/turf/open/openspace,
-/area/station/engineering/atmos/storage)
"rwn" = (
/obj/machinery/door/airlock/command{
name = "Head of Personnel"
@@ -62153,19 +62902,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"rwB" = (
-/obj/machinery/atmospherics/pipe/bridge_pipe/orange/visible,
-/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
- dir = 4
- },
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
-"rwC" = (
-/obj/machinery/atmospherics/pipe/smart/simple/general/visible{
- dir = 9
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"rwD" = (
/obj/structure/rack,
/obj/item/clothing/head/soft/mime,
@@ -62193,30 +62929,12 @@
},
/turf/closed/wall/r_wall,
/area/station/maintenance/department/medical/central)
-"rxf" = (
-/obj/machinery/camera/directional/east{
- c_tag = "Atmospherics - East"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Plasma to Pure"
- },
-/obj/effect/turf_decal/tile/purple/anticorner/contrasted{
- dir = 4
- },
-/turf/open/floor/iron,
+"rxw" = (
+/obj/machinery/atmospherics/components/unary/thermomachine/freezer,
+/obj/effect/turf_decal/bot_red,
+/obj/structure/extinguisher_cabinet/directional/north,
+/turf/open/floor/iron/textured,
/area/station/engineering/atmos)
-"rxx" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/obj/machinery/camera/directional/east{
- c_tag = "Atmospherics - HFR Decontamination Chamber"
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"rxz" = (
/obj/structure/girder,
/turf/open/floor/plating/snowed/icemoon,
@@ -62231,6 +62949,11 @@
"rxJ" = (
/turf/open/floor/glass,
/area/station/service/hydroponics)
+"rxK" = (
+/obj/structure/closet/crate,
+/obj/effect/spawner/random/maintenance/three,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"rxY" = (
/turf/closed/wall,
/area/station/service/bar/backroom)
@@ -62321,15 +63044,6 @@
/obj/structure/sign/poster/official/nanotrasen_logo/directional/south,
/turf/open/floor/iron,
/area/mine/laborcamp)
-"rzj" = (
-/obj/structure/table,
-/obj/item/stack/sheet/iron/fifty{
- pixel_x = 2;
- pixel_y = 2
- },
-/obj/item/stack/sheet/iron/fifty,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos)
"rzz" = (
/obj/machinery/door/airlock/command{
name = "Server Room"
@@ -62396,12 +63110,13 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/cafeteria,
/area/station/hallway/secondary/exit/departure_lounge)
-"rAF" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Air to External"
+"rAE" = (
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 8
},
-/turf/open/floor/iron,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/dark/textured_large,
/area/station/engineering/atmos)
"rAO" = (
/obj/structure/closet/emcloset,
@@ -62425,17 +63140,6 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron/dark/smooth_large,
/area/station/command/eva)
-"rBo" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer1{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
-/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/engineering/atmos)
"rBv" = (
/obj/structure/chair/stool/directional/north,
/obj/item/storage/toolbox/artistic{
@@ -62454,6 +63158,20 @@
/obj/machinery/newscaster/directional/west,
/turf/open/floor/iron,
/area/station/service/kitchen/coldroom)
+"rBB" = (
+/obj/machinery/door/airlock/maintenance{
+ name = "Incinerator Maintenance"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"rBJ" = (
/obj/item/clothing/under/misc/burial,
/obj/item/clothing/under/misc/burial,
@@ -62592,14 +63310,6 @@
/obj/machinery/mining_weather_monitor/directional/south,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/entry)
-"rCW" = (
-/obj/machinery/door/airlock/external{
- name = "Atmospherics Internal Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/turf/open/floor/plating,
-/area/station/engineering/atmos)
"rCX" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -62687,6 +63397,17 @@
},
/turf/open/floor/iron/dark,
/area/station/engineering/storage)
+"rDV" = (
+/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{
+ color = "#0000ff";
+ dir = 4;
+ name = "Supply multi deck pipe adapter"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"rDZ" = (
/turf/open/floor/engine,
/area/station/science/explab)
@@ -62740,10 +63461,15 @@
},
/turf/open/floor/plating,
/area/station/cargo/storage)
-"rEx" = (
-/obj/effect/turf_decal/bot_white,
+"rEC" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable,
+/obj/machinery/light/small/directional/east,
+/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4{
+ name = "Air Supply Pump"
+ },
/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
+/area/station/engineering/atmos/hfr_room)
"rEG" = (
/obj/effect/turf_decal/trimline/blue/filled/line,
/obj/effect/turf_decal/trimline/blue/filled/corner{
@@ -62800,16 +63526,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/mine/eva/lower)
-"rFI" = (
-/obj/structure/cable,
-/obj/machinery/button/door/directional/north{
- id = "Atmospherics Project Shutters";
- name = "Atmospherics Project Shutters";
- req_access = list("atmospherics")
- },
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"rFN" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -62900,6 +63616,19 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
+"rHh" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/cyan,
+/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos)
"rHi" = (
/turf/open/openspace/xenobio,
/area/station/science/xenobiology)
@@ -62936,6 +63665,28 @@
/obj/effect/turf_decal/trimline/blue/filled/line,
/turf/open/floor/iron/white,
/area/station/medical/medbay/aft)
+"rHB" = (
+/obj/machinery/atmospherics/components/binary/pump/off{
+ dir = 1;
+ name = "N2 To Pure"
+ },
+/obj/effect/turf_decal/tile/yellow/anticorner/contrasted,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
+"rHC" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron/freezer,
+/area/station/science/xenobiology)
+"rHK" = (
+/obj/effect/turf_decal/tile/purple/opposingcorners,
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"rHQ" = (
/obj/machinery/computer/message_monitor{
dir = 4
@@ -62945,6 +63696,15 @@
},
/turf/open/floor/iron/dark,
/area/station/tcommsat/computer)
+"rHX" = (
+/obj/effect/turf_decal/tile/yellow/opposingcorners{
+ dir = 1
+ },
+/obj/structure/closet/radiation,
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"rHZ" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -62954,20 +63714,19 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/department/chapel)
+"rIt" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/small/directional/north,
+/obj/structure/table_frame,
+/obj/item/storage/bag/tray,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"rIz" = (
/obj/effect/spawner/random/structure/crate,
/obj/effect/mapping_helpers/burnt_floor,
/obj/structure/sign/warning/cold_temp/directional/north,
/turf/open/floor/iron/smooth,
/area/station/maintenance/fore/lesser)
-"rIF" = (
-/obj/effect/turf_decal/trimline/dark_blue/line,
-/obj/machinery/camera/directional/south{
- c_tag = "Atmospherics - Mixing Room South"
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"rIH" = (
/obj/structure/chair/stool/directional/south,
/obj/structure/sign/poster/official/work_for_a_future/directional/west,
@@ -63031,14 +63790,17 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/smooth,
/area/station/maintenance/fore/lesser)
-"rKv" = (
-/obj/machinery/atmospherics/pipe/smart/manifold/supply/visible{
+"rKr" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/turf/open/floor/iron/dark/corner{
dir = 1
},
-/obj/effect/turf_decal/siding/wideplating,
-/obj/machinery/light/directional/north,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
+/area/station/engineering/atmos)
"rKy" = (
/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/smooth,
@@ -63063,14 +63825,6 @@
"rLo" = (
/turf/open/floor/plating,
/area/station/cargo/miningdock)
-"rLs" = (
-/obj/machinery/portable_atmospherics/canister,
-/obj/effect/turf_decal/bot,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"rLu" = (
/obj/effect/turf_decal/bot,
/turf/open/floor/iron,
@@ -63340,11 +64094,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/mine/production)
-"rPe" = (
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/structure/closet/toolcloset,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"rPu" = (
/obj/effect/spawner/random/contraband/prison,
/obj/machinery/power/apc/auto_name/directional/east,
@@ -63419,12 +64168,6 @@
},
/turf/open/floor/iron,
/area/mine/production)
-"rQN" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/carbon_input{
- dir = 8
- },
-/turf/open/floor/engine/co2,
-/area/station/engineering/atmos)
"rQW" = (
/obj/machinery/requests_console/directional/west{
department = "Science";
@@ -63546,6 +64289,12 @@
},
/turf/open/floor/catwalk_floor/iron_smooth,
/area/station/maintenance/starboard/fore)
+"rSm" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"rSq" = (
/obj/structure/closet,
/obj/effect/spawner/random/maintenance,
@@ -63587,6 +64336,13 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/mine/mechbay)
+"rTj" = (
+/obj/machinery/atmospherics/pipe/smart/simple/green/visible,
+/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"rTz" = (
/turf/open/floor/plating/icemoon,
/area/station/science/ordnance/bomb/planet)
@@ -63694,37 +64450,12 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
/turf/open/floor/plating,
/area/station/maintenance/solars/starboard/fore)
-"rUS" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/obj/effect/landmark/generic_maintenance_landmark,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
-"rUT" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 6
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
-"rUY" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/iron,
-/area/station/hallway/primary/aft)
"rVd" = (
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
-"rVi" = (
-/obj/effect/spawner/random/structure/steam_vent,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"rVq" = (
/obj/effect/turf_decal/trimline/blue/filled/corner{
dir = 4
@@ -63794,12 +64525,6 @@
/obj/effect/turf_decal/tile/yellow,
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
-"rWp" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output{
- dir = 8
- },
-/turf/open/floor/engine/plasma,
-/area/station/engineering/atmos)
"rWH" = (
/obj/machinery/door/airlock/maintenance{
name = "Chemistry Lab Utilities"
@@ -63810,18 +64535,6 @@
/obj/effect/mapping_helpers/airlock/access/all/medical/general,
/turf/open/floor/iron/smooth,
/area/station/maintenance/department/medical/central)
-"rWO" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/shutters/radiation/preopen{
- id = "Atmospherics HFR Shutters"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/trimline/red/filled/warning{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"rWR" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 1
@@ -63864,9 +64577,9 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark/textured,
/area/station/hallway/primary/port)
-"rXe" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
- dir = 9
+"rXb" = (
+/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
+ dir = 4
},
/turf/open/floor/iron,
/area/station/engineering/atmos)
@@ -63907,6 +64620,15 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
+"rXA" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 1
+ },
+/turf/open/floor/iron/textured_large,
+/area/station/engineering/atmos)
"rXP" = (
/obj/item/pickaxe/improvised{
pixel_x = 7
@@ -63992,6 +64714,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/commons/fitness)
+"rZj" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/engine,
+/area/station/engineering/atmos/hfr_room)
"rZm" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -64001,6 +64730,14 @@
},
/turf/open/floor/iron/white,
/area/station/medical/storage)
+"rZr" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/effect/turf_decal/trimline/red/arrow_cw,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"rZD" = (
/obj/machinery/door/airlock/security/glass{
name = "Escape Pod Access"
@@ -64013,12 +64750,16 @@
/obj/structure/cable,
/turf/open/floor/iron/smooth,
/area/station/security/brig/upper)
-"rZE" = (
-/obj/machinery/atmospherics/components/binary/pump{
+"rZH" = (
+/obj/machinery/portable_atmospherics/pump,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 8
},
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos/storage/gas)
"rZR" = (
/obj/effect/turf_decal/trimline/blue/filled/line,
/obj/effect/landmark/start/chief_medical_officer,
@@ -64051,6 +64792,17 @@
},
/turf/open/floor/carpet/blue,
/area/station/security/prison/work)
+"sar" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/smooth_large,
+/area/station/engineering/atmos/hfr_room)
"sav" = (
/obj/structure/table/wood,
/obj/effect/turf_decal/tile/bar/opposingcorners,
@@ -64128,6 +64880,17 @@
/obj/machinery/photocopier/prebuilt,
/turf/open/floor/iron,
/area/station/command/heads_quarters/hop)
+"sbv" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/project)
"sby" = (
/obj/structure/sign/nanotrasen/directional/north,
/turf/open/misc/asteroid/snow/icemoon,
@@ -64258,14 +65021,6 @@
/obj/machinery/firealarm/directional/west,
/turf/open/floor/iron,
/area/station/science/ordnance)
-"sdp" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
- },
-/turf/open/floor/plating,
-/area/station/engineering/atmos)
"sdr" = (
/obj/structure/transit_tube/horizontal,
/obj/effect/turf_decal/weather/snow/corner{
@@ -64280,6 +65035,29 @@
},
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
+"sdu" = (
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
+"sdz" = (
+/obj/machinery/camera/directional/west{
+ c_tag = "Atmospherics - North West"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/machinery/light/warm/directional/west,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/item/kirbyplants/organic/plant14,
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"sdF" = (
/obj/structure/table,
/obj/item/grown/log/tree,
@@ -64359,12 +65137,12 @@
/obj/structure/sign/nanotrasen/directional/north,
/turf/open/floor/iron/dark/smooth_edge,
/area/station/command/eva)
-"seX" = (
-/obj/structure/table/reinforced,
-/obj/item/storage/toolbox/mechanical,
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
+"seM" = (
+/obj/effect/turf_decal/bot_white,
+/obj/machinery/portable_atmospherics/pump,
+/obj/structure/sign/poster/random/directional/east,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos/hfr_room)
"seY" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -64397,11 +65175,16 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron/large,
/area/station/hallway/secondary/entry)
-"sfv" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
+"sft" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/obj/machinery/portable_atmospherics/scrubber,
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos/storage/gas)
"sfy" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 9
@@ -64426,6 +65209,13 @@
/obj/structure/sign/warning/electric_shock/directional/east,
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
+"sfW" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 4
+ },
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"sfY" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -64455,6 +65245,15 @@
/obj/item/radio/intercom/directional/west,
/turf/open/floor/iron/dark,
/area/station/ai/upload/chamber)
+"sgu" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/red/line,
+/obj/structure/sign/nanotrasen/directional/north,
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"sgA" = (
/obj/effect/turf_decal/box,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -64528,12 +65327,6 @@
"shh" = (
/turf/open/floor/wood,
/area/station/hallway/secondary/service)
-"shj" = (
-/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
- dir = 9
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"sht" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -64649,12 +65442,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
-"sjk" = (
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
- dir = 6
- },
-/turf/open/floor/glass/reinforced,
-/area/station/engineering/atmos/pumproom)
"sjl" = (
/obj/effect/turf_decal/stripes/line,
/obj/structure/railing/corner,
@@ -64674,6 +65461,10 @@
},
/turf/open/floor/iron/checker,
/area/station/maintenance/port/fore)
+"sjr" = (
+/obj/effect/spawner/structure/window/hollow/reinforced/plasma/middle,
+/turf/open/floor/plating,
+/area/station/maintenance/disposal/incinerator)
"sjz" = (
/obj/structure/chair/sofa/bench/left,
/obj/effect/turf_decal/stripes/line{
@@ -64712,17 +65503,21 @@
"skl" = (
/turf/closed/wall,
/area/station/maintenance/fore)
-"skn" = (
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/iron/dark/corner,
-/area/station/engineering/atmos/storage/gas)
"skr" = (
/obj/effect/turf_decal/weather/snow/corner,
/turf/open/misc/hay/icemoon,
/area/icemoon/underground/explored)
+"sku" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/mapping_helpers/airlock/access/all/science/ordnance,
+/obj/machinery/door/airlock/maintenance{
+ name = "Ordnance Lab Maintenance"
+ },
+/turf/open/floor/plating,
+/area/station/science/ordnance)
"skx" = (
/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
dir = 4
@@ -64730,19 +65525,21 @@
/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible,
/turf/open/floor/iron,
/area/station/engineering/atmos)
-"skI" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/disposalpipe/segment,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"skJ" = (
/obj/structure/grille/broken,
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
+"skK" = (
+/obj/machinery/portable_atmospherics/scrubber,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos/storage/gas)
"skW" = (
/obj/machinery/door/airlock/maintenance,
/obj/effect/mapping_helpers/airlock/abandoned,
@@ -64830,12 +65627,25 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating,
/area/station/security/prison)
-"slD" = (
+"slQ" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
/obj/structure/cable,
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Air to Internal"
+ },
+/obj/effect/turf_decal/trimline/blue/arrow_cw,
+/obj/effect/turf_decal/box/white/corners{
+ color = "#00FFFF"
+ },
+/obj/effect/turf_decal/box/white/corners{
+ color = "#00FFFF";
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"slR" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/cable,
@@ -64889,11 +65699,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/solars/port/fore)
-"smw" = (
-/obj/structure/closet/emcloset,
-/obj/machinery/light/small/dim/directional/south,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"smx" = (
/obj/machinery/navbeacon{
codes_txt = "delivery;dir=8";
@@ -64903,17 +65708,27 @@
/obj/machinery/light/directional/east,
/turf/open/floor/iron,
/area/station/cargo/storage)
+"smz" = (
+/obj/machinery/disposal/bin,
+/obj/machinery/light/directional/south,
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/machinery/firealarm/directional/south,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/storage/gas)
"smC" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark,
/area/station/service/chapel)
-"smL" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output{
- dir = 1
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/engine/o2,
+"smV" = (
+/obj/machinery/atmospherics/pipe/layer_manifold/cyan/hidden,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
/area/station/engineering/atmos)
"sna" = (
/obj/item/kirbyplants/fern,
@@ -65018,16 +65833,29 @@
/obj/effect/turf_decal/tile/blue/half/contrasted,
/turf/open/floor/iron,
/area/station/engineering/atmos)
-"sok" = (
-/obj/machinery/door/airlock/security/glass{
- name = "Security Office"
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+"soe" = (
+/obj/structure/closet/toolcloset,
+/obj/structure/sign/warning/gas_mask/directional/west,
+/obj/machinery/power/apc/auto_name/directional/south,
+/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
-/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
+"som" = (
+/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/yellow{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4{
+ dir = 1
+ },
/turf/open/floor/iron/dark,
-/area/station/security/checkpoint/engineering)
+/area/station/engineering/atmos/hfr_room)
"sop" = (
/obj/structure/table,
/obj/structure/frame/machine,
@@ -65068,22 +65896,6 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/iron/textured,
/area/station/maintenance/starboard/fore)
-"soF" = (
-/obj/effect/turf_decal/trimline/dark_red/corner{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{
- dir = 10
- },
-/obj/effect/turf_decal/trimline/dark_blue/corner{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_red/line{
- dir = 5
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"soI" = (
/obj/machinery/door/window/left/directional/east{
name = "Fitness Ring"
@@ -65106,13 +65918,6 @@
/obj/machinery/power/apc/auto_name/directional/south,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
-"soM" = (
-/obj/effect/turf_decal/trimline/yellow/filled/line{
- dir = 1
- },
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"soN" = (
/obj/structure/railing,
/obj/item/storage/toolbox/mechanical{
@@ -65246,18 +66051,6 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
/turf/open/floor/engine,
/area/station/engineering/supermatter/engine)
-"sqW" = (
-/obj/structure/marker_beacon/burgundy{
- name = "landing marker"
- },
-/obj/effect/turf_decal/weather/snow/corner{
- dir = 10
- },
-/obj/effect/turf_decal/weather/snow/corner{
- dir = 5
- },
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/underground/explored)
"srb" = (
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 1
@@ -65355,16 +66148,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron,
/area/station/cargo/office)
-"ssh" = (
-/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"ssj" = (
/obj/structure/lattice/catwalk,
/turf/open/openspace/icemoon,
@@ -65456,6 +66239,11 @@
/obj/item/radio/intercom/directional/west,
/turf/open/floor/plating,
/area/station/ai/satellite/service)
+"stw" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible,
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"stA" = (
/obj/structure/lattice/catwalk,
/obj/structure/railing{
@@ -65463,15 +66251,6 @@
},
/turf/open/lava/plasma/ice_moon,
/area/icemoon/underground/explored)
-"stD" = (
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden,
-/turf/open/floor/plating,
-/area/station/engineering/atmos/storage/gas)
"stG" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron,
@@ -65532,6 +66311,14 @@
},
/turf/open/floor/iron/dark,
/area/station/commons/fitness)
+"sun" = (
+/obj/effect/mapping_helpers/broken_floor,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/landmark/generic_maintenance_landmark,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"suo" = (
/obj/structure/table/wood,
/obj/machinery/newscaster/directional/west,
@@ -65656,14 +66443,6 @@
/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
-"swx" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/portable_atmospherics/canister,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"swF" = (
/turf/closed/wall,
/area/station/ai/satellite/interior)
@@ -65709,6 +66488,13 @@
/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/iron/white/smooth_large,
/area/station/medical/medbay/aft)
+"sxx" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/grille/broken,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"sxF" = (
/obj/structure/chair/stool/directional/north,
/obj/structure/sign/warning/electric_shock/directional/west,
@@ -65748,14 +66534,9 @@
},
/turf/open/floor/iron/dark,
/area/station/service/chapel)
-"syn" = (
-/obj/effect/turf_decal/tile/neutral/diagonal_centre,
-/obj/machinery/atmospherics/pipe/multiz/violet/visible{
- name = "Infiltrate"
- },
-/obj/effect/turf_decal/tile/dark_green/diagonal_edge,
-/turf/open/floor/iron/dark/diagonal,
-/area/station/engineering/atmos/mix)
+"syj" = (
+/turf/open/floor/iron/grimy,
+/area/station/maintenance/aft/lesser)
"sys" = (
/obj/machinery/light/small/directional/east,
/obj/effect/turf_decal/weather/snow/corner{
@@ -65914,6 +66695,17 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"sAf" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/door/airlock/maintenance,
+/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
+/obj/effect/mapping_helpers/airlock/unres/delayed{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"sAt" = (
/obj/structure/table/wood,
/obj/effect/spawner/random/food_or_drink/snack,
@@ -66010,12 +66802,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/showroomfloor,
/area/station/maintenance/department/medical/morgue)
-"sBK" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/effect/turf_decal/bot,
-/obj/machinery/status_display/evac/directional/north,
-/turf/open/floor/iron/dark/textured,
-/area/station/engineering/atmos/storage/gas)
"sBV" = (
/obj/machinery/computer/security/telescreen/entertainment/directional/south,
/obj/effect/spawner/random/vending/snackvend,
@@ -66034,15 +66820,15 @@
},
/turf/open/floor/plating/snowed/coldroom,
/area/icemoon/underground/explored)
-"sCm" = (
-/obj/machinery/power/terminal{
- dir = 1
- },
+"sCs" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
-/obj/effect/mapping_helpers/airalarm/all_access,
-/obj/machinery/airalarm/directional/east,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4{
+ dir = 10
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"sCw" = (
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/directional/north,
@@ -66095,15 +66881,6 @@
/obj/structure/sign/warning/cold_temp/directional/north,
/turf/open/openspace/icemoon/keep_below,
/area/icemoon/surface/outdoors/nospawn)
-"sCQ" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/duct,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"sCZ" = (
/turf/open/floor/iron/dark,
/area/station/service/hydroponics)
@@ -66199,6 +66976,10 @@
dir = 1
},
/area/station/commons/storage/mining)
+"sEp" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/project)
"sEq" = (
/obj/effect/spawner/structure/window/hollow/reinforced/end{
dir = 8
@@ -66226,18 +67007,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/starboard/upper)
-"sEF" = (
-/obj/machinery/computer/atmos_control/plasma_tank{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/turf_decal/tile/purple/half/contrasted{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"sEN" = (
/obj/machinery/atmospherics/components/unary/passive_vent/layer2{
dir = 8
@@ -66287,6 +67056,15 @@
},
/turf/open/floor/iron,
/area/station/science/explab)
+"sFy" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"sFA" = (
/obj/machinery/sparker/directional/west{
id = "testigniter"
@@ -66373,22 +67151,13 @@
/obj/structure/cable,
/turf/open/floor/iron/white,
/area/mine/living_quarters)
-"sGH" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 8
- },
-/obj/structure/railing/corner{
- dir = 1
- },
-/obj/structure/railing/corner{
+"sGG" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
},
-/obj/structure/disposalpipe/segment,
/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
+/area/station/engineering/atmos/project)
"sGJ" = (
/obj/effect/turf_decal/bot,
/obj/machinery/portable_atmospherics/canister,
@@ -66406,11 +67175,6 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/engine/vacuum,
/area/station/science/ordnance/burnchamber)
-"sGZ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/random/structure/crate,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"sHa" = (
/obj/structure/table/wood/poker,
/obj/effect/spawner/random/bureaucracy/briefcase,
@@ -66460,15 +67224,19 @@
/obj/item/radio/intercom/directional/south,
/turf/open/floor/stone,
/area/mine/eva/lower)
-"sHs" = (
-/obj/machinery/light/directional/west,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"sHt" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/spawner/random/trash/caution_sign,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
+"sHx" = (
+/obj/structure/closet/secure_closet/atmospherics,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden/layer2{
+ dir = 6
+ },
+/obj/machinery/airalarm/directional/north,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"sHC" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -66523,13 +67291,14 @@
/obj/structure/flora/bush/fullgrass/style_random,
/turf/open/floor/grass,
/area/station/service/hydroponics)
+"sIo" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible,
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"sIt" = (
/turf/closed/wall,
/area/station/maintenance/central/lesser)
-"sIA" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"sIJ" = (
/obj/machinery/firealarm/directional/west,
/turf/open/floor/carpet/blue,
@@ -66564,6 +67333,12 @@
/obj/machinery/light/warm/directional/north,
/turf/open/floor/iron/cafeteria,
/area/station/security/prison/mess)
+"sJo" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/event_spawn,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"sJr" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 8
@@ -66590,6 +67365,16 @@
/obj/structure/cable,
/turf/open/floor/wood,
/area/station/hallway/secondary/service)
+"sJF" = (
+/obj/structure/sign/poster/official/random/directional/west,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/machinery/light/warm/directional/west,
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"sJH" = (
/turf/closed/wall,
/area/mine/living_quarters)
@@ -66605,6 +67390,21 @@
},
/turf/open/floor/iron/grimy,
/area/station/commons/vacant_room/office)
+"sJP" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/orange/visible,
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos)
"sKf" = (
/turf/open/floor/plating,
/area/station/maintenance/aft/greater)
@@ -66635,13 +67435,6 @@
/obj/machinery/airalarm/directional/west,
/turf/open/floor/wood,
/area/station/command/meeting_room)
-"sKI" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/obj/effect/landmark/firealarm_sanity,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"sKS" = (
/obj/item/cigbutt/roach{
pixel_x = 4;
@@ -66654,17 +67447,6 @@
/obj/structure/sign/warning/electric_shock/directional/north,
/turf/open/floor/iron,
/area/station/security/prison/workout)
-"sKW" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 4
- },
-/obj/structure/railing/corner{
- dir = 8
- },
-/obj/structure/railing/corner,
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"sKY" = (
/obj/structure/window/reinforced/spawner/directional/south,
/obj/structure/flora/bush/jungle/a/style_random,
@@ -66686,6 +67468,10 @@
/obj/machinery/rnd/production/circuit_imprinter,
/turf/open/floor/iron/dark,
/area/station/engineering/lobby)
+"sLx" = (
+/obj/structure/ladder,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/maintenance/department/medical/central)
"sLD" = (
/obj/structure/table/reinforced,
/obj/item/stack/sheet/iron/fifty,
@@ -66787,16 +67573,6 @@
/obj/machinery/light/small/directional/east,
/turf/open/floor/iron,
/area/mine/production)
-"sNu" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
-/obj/machinery/duct,
-/obj/effect/turf_decal/siding/yellow{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"sNA" = (
/obj/structure/marker_beacon/burgundy,
/obj/structure/sign/nanotrasen/directional/east,
@@ -66825,12 +67601,6 @@
/obj/effect/mapping_helpers/airlock/access/any/engineering/external,
/turf/open/floor/plating,
/area/station/maintenance/fore)
-"sOd" = (
-/obj/structure/table,
-/obj/item/stack/cable_coil,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"sOm" = (
/obj/structure/railing{
dir = 4
@@ -66843,6 +67613,9 @@
"sOn" = (
/turf/closed/wall,
/area/station/cargo/lobby)
+"sOy" = (
+/turf/open/floor/glass/reinforced/plasma,
+/area/station/engineering/atmos/hfr_room)
"sOz" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -66855,6 +67628,18 @@
"sOE" = (
/turf/open/floor/iron,
/area/station/command/heads_quarters/ce)
+"sOG" = (
+/obj/structure/table/reinforced,
+/obj/item/hfr_box/corner,
+/obj/item/hfr_box/corner,
+/obj/item/hfr_box/corner,
+/obj/item/hfr_box/corner,
+/obj/item/hfr_box/core{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/turf/open/floor/iron/dark/smooth_large,
+/area/station/engineering/atmos/hfr_room)
"sOH" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -66905,6 +67690,11 @@
},
/turf/open/floor/iron,
/area/station/security/brig)
+"sPF" = (
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
+/obj/machinery/meter,
+/turf/closed/wall/r_wall,
+/area/station/engineering/atmos)
"sPG" = (
/obj/effect/landmark/generic_maintenance_landmark,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -66937,24 +67727,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/department/electrical)
-"sPV" = (
-/obj/machinery/door/airlock/atmos/glass,
-/obj/machinery/door/firedoor/heavy,
-/obj/effect/turf_decal/trimline/yellow/corner,
-/obj/effect/turf_decal/trimline/yellow/corner{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/yellow/corner{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/yellow/corner{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/turf/open/floor/iron/dark/smooth_half{
- dir = 1
- },
-/area/station/engineering/atmos/hfr_room)
"sQc" = (
/obj/structure/table,
/obj/item/food/sandwich/grilled_cheese{
@@ -66986,6 +67758,16 @@
},
/turf/open/floor/iron/dark,
/area/station/service/hydroponics)
+"sQM" = (
+/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/effect/mapping_helpers/airlock/locked,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/obj/machinery/airlock_controller/incinerator_atmos{
+ pixel_x = 28
+ },
+/turf/open/floor/engine,
+/area/station/maintenance/disposal/incinerator)
"sQS" = (
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating,
@@ -67044,6 +67826,12 @@
/obj/structure/table/wood,
/turf/open/floor/carpet/blue,
/area/station/security/prison/work)
+"sRX" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/carbon_input{
+ dir = 1
+ },
+/turf/open/floor/engine/co2,
+/area/station/engineering/atmos)
"sSe" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -67066,10 +67854,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/security/prison/workout)
-"sSF" = (
-/obj/effect/spawner/random/structure/crate,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"sSJ" = (
/obj/structure/cable,
/turf/open/floor/iron,
@@ -67098,44 +67882,16 @@
/obj/structure/cable,
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
-"sSX" = (
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/table,
-/obj/item/paper{
- pixel_y = 4
- },
-/obj/item/pen{
- pixel_x = -5
- },
-/turf/open/floor/iron,
-/area/station/service/kitchen/coldroom)
"sTb" = (
/obj/structure/railing/wooden_fence,
/obj/effect/turf_decal/weather/snow/corner,
/turf/open/misc/hay/icemoon,
/area/icemoon/underground/explored)
-"sTe" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible,
-/turf/open/floor/plating,
-/area/station/engineering/atmos/pumproom)
"sTh" = (
/obj/structure/table,
/obj/item/storage/toolbox/emergency,
/turf/open/floor/plastic,
/area/station/commons/dorms/laundry)
-"sTi" = (
-/obj/effect/turf_decal/box/white{
- color = "#52B4E9"
- },
-/turf/open/floor/engine,
-/area/station/engineering/atmos/hfr_room)
"sTj" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -67188,6 +67944,18 @@
/obj/machinery/status_display/evac/directional/north,
/turf/open/floor/iron/sepia,
/area/station/service/library)
+"sTD" = (
+/obj/machinery/holopad,
+/obj/machinery/duct,
+/obj/effect/turf_decal/bot,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron/large,
+/area/station/engineering/lobby)
"sTG" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
/turf/closed/wall/r_wall,
@@ -67226,15 +67994,18 @@
/obj/effect/spawner/random/gizmo,
/turf/open/floor/engine,
/area/station/science/explab)
-"sUB" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/camera/directional/west{
- c_tag = "Atmospherics - South West"
+"sUk" = (
+/obj/item/flashlight/flare{
+ pixel_y = 7
},
-/obj/machinery/airalarm/directional/west,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
+"sUr" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/sign/warning/cold_temp/directional/east,
+/obj/machinery/light/small/dim/directional/east,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"sUE" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/frame/computer{
@@ -67292,25 +68063,14 @@
/obj/machinery/light_switch/directional/north,
/turf/open/floor/iron/freezer,
/area/station/commons/toilet/locker)
-"sVA" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/sign/poster/random/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
-"sVC" = (
-/obj/machinery/duct,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+"sVv" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/supply/visible{
+ dir = 1
},
+/obj/effect/turf_decal/siding/wideplating,
+/obj/machinery/airalarm/directional/north,
/turf/open/floor/iron,
-/area/station/engineering/lobby)
-"sVL" = (
-/obj/machinery/holopad,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron/large,
-/area/station/engineering/atmos)
+/area/station/engineering/atmos/pumproom)
"sVN" = (
/obj/item/screwdriver,
/obj/effect/turf_decal/weather/snow/corner{
@@ -67327,6 +68087,12 @@
/obj/effect/turf_decal/bot_red,
/turf/open/floor/iron/dark,
/area/station/commons/storage/mining)
+"sVS" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/lobby)
"sVW" = (
/obj/effect/decal/cleanable/garbage,
/obj/item/reagent_containers/spray/chemsprayer/party{
@@ -67359,6 +68125,15 @@
/obj/effect/turf_decal/tile/blue/full,
/turf/open/floor/iron/dark/smooth_large,
/area/station/command/heads_quarters/cmo)
+"sWr" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/structure/railing/corner/end/flip{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/hallway/primary/aft)
"sWs" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -67424,17 +68199,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
-"sXb" = (
-/obj/machinery/status_display/ai/directional/north,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 9
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"sXe" = (
/obj/machinery/door/airlock/external{
name = "External Access"
@@ -67466,19 +68230,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/mine/laborcamp)
-"sXQ" = (
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{
- dir = 9
- },
-/obj/effect/turf_decal/trimline/dark_green/corner{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_green/line{
- dir = 6
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"sYe" = (
/obj/structure/table/wood,
/obj/item/clothing/under/suit/red,
@@ -67523,17 +68274,6 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating,
/area/station/maintenance/fore)
-"sYU" = (
-/obj/structure/grille/broken,
-/obj/effect/spawner/random/trash/moisture_trap,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
-"sZa" = (
-/obj/effect/turf_decal/box/white{
- color = "#9FED58"
- },
-/turf/open/floor/engine,
-/area/station/engineering/atmos/hfr_room)
"sZB" = (
/obj/structure/noticeboard/directional/north,
/turf/open/openspace,
@@ -67571,6 +68311,14 @@
"sZU" = (
/turf/open/floor/iron,
/area/station/engineering/storage/tech)
+"tab" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible,
+/obj/effect/turf_decal/trimline/blue/arrow_ccw,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"taf" = (
/obj/effect/landmark/start/quartermaster,
/obj/structure/chair/office{
@@ -67619,11 +68367,16 @@
"taC" = (
/turf/open/floor/engine/vacuum,
/area/station/science/ordnance/burnchamber)
-"taN" = (
-/obj/item/radio/intercom/directional/west,
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
+"taU" = (
+/obj/item/trash/pistachios,
+/obj/structure/railing/corner/end{
+ dir = 8
+ },
+/obj/structure/railing/corner/end/flip{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"taX" = (
/obj/machinery/power/port_gen/pacman/pre_loaded,
/turf/open/floor/plating,
@@ -67635,22 +68388,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/pink,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"tbb" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{
- dir = 8
- },
-/obj/effect/turf_decal/siding/wideplating{
- dir = 8
- },
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
-"tbh" = (
-/turf/open/floor/iron/half{
- dir = 1
- },
-/area/station/engineering/atmos)
"tbi" = (
/obj/effect/spawner/random/trash/food_packaging,
/obj/effect/spawner/random/trash/crushed_can,
@@ -67706,9 +68443,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/port/lesser)
-"tbQ" = (
-/turf/open/floor/iron/grimy,
-/area/station/maintenance/aft/greater)
"tbX" = (
/obj/effect/spawner/structure/window/hollow/reinforced/middle{
dir = 4
@@ -67764,6 +68498,10 @@
},
/turf/open/floor/iron,
/area/station/maintenance/port/fore)
+"tcV" = (
+/obj/structure/table/wood,
+/turf/open/floor/iron/grimy,
+/area/station/maintenance/aft/lesser)
"tcX" = (
/obj/structure/railing,
/obj/structure/stairs/east,
@@ -67821,6 +68559,12 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/service/chapel)
+"tdT" = (
+/obj/structure/cable,
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/structure/closet/radiation,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"tdU" = (
/obj/effect/turf_decal/tile/bar/opposingcorners,
/obj/effect/turf_decal/siding/wood,
@@ -67948,6 +68692,32 @@
/obj/structure/window/reinforced/spawner/directional/west,
/turf/open/floor/iron,
/area/station/science/xenobiology)
+"tfu" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/light/small/directional/south,
+/obj/structure/rack,
+/obj/item/storage/box/beakers{
+ pixel_x = 2;
+ pixel_y = 8
+ },
+/obj/item/storage/box/syringes{
+ pixel_x = -2;
+ pixel_y = 5
+ },
+/turf/open/floor/iron,
+/area/station/science/xenobiology)
+"tfA" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "Atmospherics Blast Door"
+ },
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/lobby)
"tfM" = (
/obj/structure/chair/office/light{
dir = 1
@@ -68043,6 +68813,14 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/white/smooth_large,
/area/station/science/genetics)
+"tgC" = (
+/obj/machinery/atmospherics/components/tank/air{
+ dir = 8;
+ starting_pressure_percent = 0.15
+ },
+/obj/machinery/light/small/dim/directional/east,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"tgH" = (
/obj/machinery/light/small/directional/south,
/obj/effect/turf_decal/tile/yellow/half/contrasted,
@@ -68055,6 +68833,19 @@
/obj/structure/cable,
/turf/open/floor/iron/smooth,
/area/station/engineering/lobby)
+"tht" = (
+/obj/structure/table/reinforced,
+/obj/item/stack/sheet/glass/fifty{
+ pixel_x = 2
+ },
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/stack/cable_coil{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron/dark/smooth_large,
+/area/station/engineering/atmos/hfr_room)
"thA" = (
/turf/open/genturf/blue,
/area/icemoon/underground/unexplored/rivers/deep/shoreline)
@@ -68216,17 +69007,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
-"tiZ" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/door/airlock/atmos{
- name = "Atmospherics"
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/station/engineering/atmos/storage)
"tjf" = (
/obj/structure/fence/door,
/turf/open/floor/iron/smooth_large,
@@ -68342,6 +69122,13 @@
},
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
+"tkg" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/effect/landmark/firealarm_sanity,
+/turf/open/floor/catwalk_floor/iron_smooth,
+/area/station/maintenance/aft/lesser)
"tkp" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -68396,6 +69183,12 @@
/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
+"tlc" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"tlf" = (
/obj/structure/railing,
/obj/effect/turf_decal/stripes/line,
@@ -68510,19 +69303,6 @@
},
/turf/open/floor/iron/dark/smooth_half,
/area/station/security/prison/work)
-"tmA" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden,
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/iron/dark/corner,
-/area/station/engineering/atmos/storage/gas)
"tmE" = (
/obj/structure/chair/comfy/beige{
dir = 1;
@@ -68596,13 +69376,6 @@
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
-"tnI" = (
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 10
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"tnK" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -68613,6 +69386,13 @@
},
/turf/open/floor/iron,
/area/station/cargo/storage)
+"tnM" = (
+/obj/machinery/atmospherics/components/unary/thermomachine/heater/on,
+/obj/machinery/status_display/evac/directional/north,
+/obj/structure/sign/warning/no_smoking/directional/east,
+/obj/effect/turf_decal/bot_red,
+/turf/open/floor/iron/textured,
+/area/station/engineering/atmos/pumproom)
"tnO" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
@@ -68709,6 +69489,20 @@
/obj/machinery/light/directional/south,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
+"tpq" = (
+/obj/machinery/door/airlock/atmos/glass{
+ name = "Port Control"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/iron/textured_large,
+/area/station/engineering/atmos/mix)
+"tpw" = (
+/obj/effect/turf_decal/siding/yellow/corner{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"tpF" = (
/obj/structure/closet/bombcloset/security,
/obj/effect/turf_decal/bot,
@@ -68819,6 +69613,14 @@
/obj/structure/sign/departments/engineering/directional/east,
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
+"trt" = (
+/obj/item/toy/snowball{
+ pixel_x = 9;
+ pixel_y = 1
+ },
+/obj/item/toy/snowball,
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"tru" = (
/obj/structure/chair/pew/left{
dir = 1
@@ -68849,10 +69651,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
-"tsa" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"tsh" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -68866,10 +69664,6 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"tsl" = (
-/obj/machinery/light/small/directional/east,
-/turf/open/floor/engine/co2,
-/area/station/engineering/atmos)
"tsr" = (
/obj/structure/lattice/catwalk,
/obj/machinery/rnd/server/master,
@@ -68881,6 +69675,9 @@
/obj/effect/spawner/random/entertainment/lighter,
/turf/open/floor/wood/parquet,
/area/station/service/bar/atrium)
+"tsw" = (
+/turf/open/floor/engine/airless,
+/area/station/engineering/atmos)
"tsz" = (
/obj/effect/turf_decal/trimline/neutral/mid_joiner{
dir = 8
@@ -68953,27 +69750,27 @@
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood,
/area/station/commons/dorms)
+"ttX" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/corner,
+/obj/effect/turf_decal/trimline/red/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"tuc" = (
/turf/closed/wall,
/area/station/security/armory)
"tue" = (
/turf/closed/wall,
/area/station/security/checkpoint/supply)
-"tug" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/atmos/glass{
- name = "Distribution Loop"
- },
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/structure/cable,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
"tuk" = (
/obj/structure/closet/crate/grave,
/turf/open/misc/dirt/dark{
@@ -69030,16 +69827,6 @@
/obj/machinery/light/small/directional/south,
/turf/open/openspace,
/area/station/service/chapel)
-"tvd" = (
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
- },
-/obj/effect/turf_decal/tile/yellow/opposingcorners{
- dir = 1
- },
-/turf/open/floor/iron/dark/corner,
-/area/station/engineering/atmos)
"tvf" = (
/obj/machinery/door/airlock/mining/glass{
id_tag = "innercargo";
@@ -69098,12 +69885,10 @@
dir = 1
},
/area/station/engineering/engine_smes)
-"tvJ" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
+"tvI" = (
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood,
+/area/station/maintenance/aft/lesser)
"tvK" = (
/obj/structure/closet{
name = "evidence closet 2"
@@ -69167,11 +69952,26 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/freezer,
/area/station/commons/toilet)
+"twV" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/station/maintenance/disposal/incinerator)
"twZ" = (
/obj/structure/table,
/obj/effect/spawner/random/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
+"txa" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/arrows/white{
+ color = "#0077AA";
+ pixel_y = 15
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/engine,
+/area/station/engineering/atmos/hfr_room)
"txf" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -69208,13 +70008,6 @@
/obj/machinery/firealarm/directional/south,
/turf/open/floor/plating,
/area/station/medical/treatment_center)
-"txE" = (
-/obj/item/cigbutt,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/obj/effect/spawner/random/engineering/tracking_beacon,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"txI" = (
/obj/structure/closet/wardrobe/black,
/turf/open/floor/plating,
@@ -69237,11 +70030,17 @@
/obj/structure/water_source/puddle,
/turf/open/floor/grass,
/area/station/security/prison/garden)
-"tyb" = (
-/obj/effect/turf_decal/bot,
-/obj/machinery/holopad,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
+"txY" = (
+/obj/effect/turf_decal/arrows/red{
+ dir = 4;
+ pixel_x = -15
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/engine,
+/area/station/engineering/atmos/hfr_room)
"tyi" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -69281,6 +70080,25 @@
},
/turf/open/floor/glass/reinforced,
/area/station/engineering/atmos/pumproom)
+"tyX" = (
+/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos)
+"tzb" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{
+ dir = 8
+ },
+/obj/effect/spawner/structure/window,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/pumproom)
"tzd" = (
/turf/open/floor/iron/kitchen_coldroom/freezerfloor,
/area/station/security/prison/mess)
@@ -69291,6 +70109,15 @@
/obj/effect/turf_decal/tile/green/anticorner/contrasted,
/turf/open/floor/iron,
/area/station/security/prison/garden)
+"tzg" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/structure/closet/firecloset,
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"tzE" = (
/obj/effect/spawner/structure/window/hollow/reinforced/end{
dir = 4
@@ -69348,6 +70175,16 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark,
/area/station/medical/virology)
+"tAs" = (
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/engine,
+/area/station/engineering/atmos/hfr_room)
"tAx" = (
/obj/effect/turf_decal/trimline/blue/filled/warning,
/obj/structure/disposalpipe/segment,
@@ -69385,15 +70222,6 @@
dir = 8
},
/area/station/service/kitchen/coldroom)
-"tBq" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/door/airlock/maintenance_hatch,
-/obj/machinery/door/firedoor/heavy,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/obj/structure/sign/warning/radiation/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"tBs" = (
/turf/closed/wall,
/area/station/maintenance/department/chapel)
@@ -69405,12 +70233,14 @@
},
/turf/open/floor/iron/dark,
/area/station/commons/fitness)
-"tBL" = (
-/obj/machinery/computer/atmos_control/nitrogen_tank{
+"tBK" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/obj/effect/turf_decal/trimline/red/line{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/corner{
dir = 1
},
-/obj/effect/turf_decal/tile/red/half/contrasted,
-/turf/open/floor/iron,
/area/station/engineering/atmos)
"tBR" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -69480,17 +70310,6 @@
/obj/machinery/light/small/directional/south,
/turf/open/floor/engine/air,
/area/station/engineering/atmos)
-"tCF" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 4
- },
-/obj/machinery/camera/directional/east{
- c_tag = "Atmospherics - Mixing Room East"
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"tCL" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -69626,6 +70445,16 @@
},
/turf/open/floor/iron,
/area/station/cargo/storage)
+"tEM" = (
+/obj/effect/decal/cleanable/cobweb,
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"tEO" = (
/obj/structure/closet,
/obj/machinery/light/small/directional/north,
@@ -69637,11 +70466,6 @@
},
/turf/open/floor/carpet/donk,
/area/mine/production)
-"tEZ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
-/turf/open/floor/plating,
-/area/station/engineering/atmos/pumproom)
"tFd" = (
/obj/machinery/ai_slipper{
uses = 10
@@ -69659,27 +70483,6 @@
/obj/structure/cable,
/turf/open/floor/iron/kitchen/diagonal,
/area/station/service/kitchen)
-"tFp" = (
-/obj/structure/closet,
-/obj/item/clothing/suit/hooded/wintercoat/security{
- pixel_x = 5
- },
-/obj/item/clothing/suit/hooded/wintercoat/security{
- pixel_x = 5
- },
-/obj/item/clothing/suit/hooded/wintercoat/security{
- pixel_x = 5
- },
-/obj/item/clothing/suit/hooded/wintercoat{
- pixel_x = -5
- },
-/obj/effect/turf_decal/stripes/red/line{
- 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" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/cable,
@@ -69692,6 +70495,15 @@
/obj/machinery/firealarm/directional/north,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
+"tFE" = (
+/obj/effect/turf_decal/bot_white,
+/obj/structure/reagent_dispensers/plumbed,
+/obj/item/radio/intercom/directional/south,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/iron/large,
+/area/station/engineering/atmos)
"tFF" = (
/obj/structure/disposalpipe/sorting/mail{
dir = 8
@@ -69763,6 +70575,12 @@
},
/turf/open/floor/iron,
/area/mine/laborcamp)
+"tGg" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
+ dir = 4
+ },
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"tGi" = (
/obj/effect/turf_decal/stripes/end,
/obj/machinery/door/airlock/external,
@@ -69841,6 +70659,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/closed/wall/r_wall,
/area/station/engineering/supermatter/engine)
+"tGT" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
+/obj/structure/lattice,
+/turf/open/openspace/icemoon/keep_below,
+/area/icemoon/underground/explored)
"tHb" = (
/obj/effect/spawner/random/structure/musician/piano/random_piano,
/obj/machinery/button/curtain{
@@ -69864,10 +70687,6 @@
},
/turf/open/floor/iron/dark,
/area/station/service/chapel)
-"tHj" = (
-/obj/machinery/status_display/evac/directional/east,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"tHr" = (
/turf/closed/wall/r_wall,
/area/station/medical/treatment_center)
@@ -69961,6 +70780,13 @@
/obj/machinery/status_display/ai/directional/north,
/turf/open/openspace,
/area/station/engineering/storage/tech)
+"tIz" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/iron/freezer,
+/area/station/science/xenobiology)
"tIB" = (
/turf/closed/wall/r_wall,
/area/station/science/breakroom)
@@ -69999,13 +70825,6 @@
},
/turf/open/floor/wood/large,
/area/station/commons/lounge)
-"tJl" = (
-/obj/effect/decal/cleanable/blood/tracks,
-/obj/structure/fence/cut/large{
- dir = 1
- },
-/turf/open/misc/asteroid/snow/icemoon,
-/area/icemoon/underground/explored)
"tJu" = (
/obj/machinery/status_display/ai/directional/south,
/turf/open/floor/iron,
@@ -70085,6 +70904,10 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/engineering/lobby)
+"tKl" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"tKm" = (
/obj/structure/ore_container/food_trough/raptor_trough,
/turf/open/misc/hay/icemoon,
@@ -70161,14 +70984,6 @@
/obj/item/food/canned/peaches/maint,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"tKW" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 4;
- name = "Unfiltered & Air to Mix"
- },
-/obj/effect/turf_decal/tile/green/anticorner/contrasted,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
"tKY" = (
/obj/structure/rack,
/obj/item/soap{
@@ -70353,10 +71168,15 @@
"tMO" = (
/turf/closed/wall,
/area/station/medical/break_room)
-"tMS" = (
-/obj/structure/sign/warning/fire/directional/north,
-/turf/open/openspace,
-/area/station/engineering/atmos/storage)
+"tMR" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/structure/disposalpipe/junction{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"tMW" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 4
@@ -70382,13 +71202,6 @@
},
/turf/open/floor/iron,
/area/station/service/hydroponics/garden)
-"tNi" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"tNk" = (
/obj/machinery/duct,
/obj/effect/turf_decal/tile/blue{
@@ -70397,6 +71210,10 @@
/obj/effect/turf_decal/tile/dark/half/contrasted,
/turf/open/floor/iron/white,
/area/station/medical/virology)
+"tNp" = (
+/obj/effect/spawner/structure/window/hollow/reinforced/plasma/middle,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/project)
"tNx" = (
/obj/structure/cable,
/obj/machinery/light/floor,
@@ -70418,11 +71235,24 @@
dir = 10
},
/area/mine/living_quarters)
-"tNJ" = (
+"tNL" = (
+/obj/machinery/pipedispenser/disposal/transit_tube,
+/obj/effect/turf_decal/bot_white,
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/iron/smooth_large,
+/area/station/engineering/atmos)
+"tNU" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"tOb" = (
/obj/effect/turf_decal/trimline/yellow/filled/line,
/obj/machinery/light/directional/south,
@@ -70467,14 +71297,6 @@
"tOw" = (
/turf/closed/wall,
/area/station/commons/toilet/locker)
-"tOy" = (
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"tOF" = (
/obj/structure/chair/comfy/black{
dir = 8
@@ -70505,21 +71327,6 @@
/obj/machinery/light/directional/west,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"tPK" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/research{
- name = "Ordnance Launch Room"
- },
-/obj/effect/mapping_helpers/airlock/unres/delayed{
- dir = 1
- },
-/obj/effect/mapping_helpers/airlock/access/all/science/ordnance,
-/turf/open/floor/plating,
-/area/station/science/ordnance/testlab)
"tPL" = (
/obj/structure/railing{
dir = 1
@@ -70594,6 +71401,10 @@
/obj/machinery/power/apc/auto_name/directional/east,
/turf/open/floor/plating,
/area/station/ai/satellite/maintenance)
+"tQP" = (
+/obj/structure/sign/departments/maint/alt/directional/north,
+/turf/open/openspace/icemoon/keep_below,
+/area/icemoon/underground/explored)
"tQS" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/landmark/start/assistant,
@@ -70648,6 +71459,11 @@
"tRD" = (
/turf/open/floor/engine,
/area/station/engineering/supermatter/engine)
+"tRJ" = (
+/obj/effect/spawner/random/structure/crate,
+/obj/structure/sign/poster/random/directional/north,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"tRP" = (
/obj/machinery/door/airlock/maintenance{
name = "Hydroponics Maintenance"
@@ -70777,16 +71593,6 @@
},
/turf/open/floor/iron/dark,
/area/station/security/checkpoint/engineering)
-"tTY" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"tUh" = (
/obj/item/chair/wood,
/obj/effect/mapping_helpers/broken_floor,
@@ -70889,6 +71695,10 @@
"tVf" = (
/turf/closed/wall,
/area/station/security/prison)
+"tVg" = (
+/obj/machinery/firealarm/directional/south,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"tVk" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -70920,13 +71730,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
-"tVA" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/closet/radiation,
-/obj/item/analyzer,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"tVF" = (
/obj/machinery/airalarm/directional/north,
/obj/effect/mapping_helpers/airalarm/tlv_cold_room,
@@ -71053,6 +71856,13 @@
},
/turf/open/floor/iron/dark,
/area/station/science/server)
+"tYj" = (
+/obj/effect/turf_decal/tile/purple/opposingcorners,
+/obj/structure/railing{
+ dir = 9
+ },
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"tYk" = (
/obj/structure/chair/sofa/bench/left{
dir = 8
@@ -71110,21 +71920,6 @@
dir = 8
},
/area/station/science/research)
-"tYZ" = (
-/obj/machinery/door/airlock/external{
- name = "External Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
-"tZa" = (
-/obj/effect/turf_decal/weather/snow,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"tZb" = (
/obj/effect/spawner/random/structure/shipping_container,
/turf/open/floor/plating,
@@ -71136,6 +71931,16 @@
/obj/item/shovel/spade,
/turf/open/floor/grass,
/area/station/maintenance/starboard/aft)
+"tZf" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"tZk" = (
/obj/structure/rack,
/obj/item/storage/box/prisoner,
@@ -71193,6 +71998,16 @@
/obj/effect/spawner/random/trash/bin,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
+"tZU" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/obj/structure/railing/corner/end{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"tZZ" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/light/directional/west,
@@ -71273,6 +72088,13 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/engineering/storage)
+"uaI" = (
+/obj/structure/rack,
+/obj/item/storage/bag/ore,
+/obj/item/mining_scanner,
+/obj/item/pickaxe,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"uaO" = (
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 1
@@ -71320,10 +72142,6 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron/white,
/area/station/medical/storage)
-"ubF" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"ubG" = (
/obj/structure/railing{
dir = 8
@@ -71340,6 +72158,12 @@
/obj/machinery/newscaster/directional/east,
/turf/open/floor/iron/dark,
/area/station/security/prison/rec)
+"ucb" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 1
+ },
+/turf/closed/wall/r_wall,
+/area/station/engineering/atmos/project)
"ucl" = (
/obj/machinery/door/window/right/directional/west{
name = "Containment Pen 4";
@@ -71446,14 +72270,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
-"udL" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/door/airlock/maintenance/glass,
-/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"uei" = (
/obj/machinery/power/solar{
id = "auxsolareast";
@@ -71501,6 +72317,10 @@
/obj/effect/turf_decal/tile/red,
/turf/open/floor/iron,
/area/station/security/prison/mess)
+"ueQ" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"ueS" = (
/obj/effect/turf_decal/trimline/neutral/warning{
dir = 8
@@ -71591,6 +72411,11 @@
/obj/machinery/prisongate/labour,
/turf/open/floor/iron/textured,
/area/mine/laborcamp/security)
+"ugK" = (
+/obj/effect/landmark/generic_maintenance_landmark,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"ugO" = (
/obj/machinery/door/firedoor,
/obj/structure/cable,
@@ -71610,11 +72435,6 @@
},
/turf/open/floor/iron/dark/textured,
/area/station/security/prison)
-"ugR" = (
-/obj/structure/reagent_dispensers/watertank/high,
-/obj/structure/cable,
-/turf/open/floor/iron/showroomfloor,
-/area/station/engineering/atmos)
"ugX" = (
/obj/machinery/door/airlock{
id_tag = "Dorm3";
@@ -71641,17 +72461,6 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/maintenance/disposal)
-"uht" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Pure to Mix"
- },
-/obj/effect/turf_decal/siding/wideplating{
- dir = 1
- },
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
"uhx" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -71941,13 +72750,6 @@
/obj/effect/landmark/start/assistant,
/turf/open/floor/iron,
/area/station/commons/dorms)
-"ulm" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/structure/railing/corner{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"ult" = (
/turf/closed/wall/r_wall,
/area/station/science/robotics/lab)
@@ -72031,11 +72833,19 @@
},
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
-"umD" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table,
-/turf/open/floor/wood,
-/area/station/maintenance/aft/greater)
+"umG" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/arrow_cw{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"umM" = (
/obj/effect/landmark/start/clown,
/turf/open/floor/wood,
@@ -72051,6 +72861,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
+"unj" = (
+/obj/effect/turf_decal/tile/dark/anticorner/contrasted{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/green/visible,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"unq" = (
/obj/structure/light_construct/directional/north,
/obj/effect/spawner/random/structure/closet_private,
@@ -72140,13 +72957,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"uop" = (
-/obj/machinery/shower/directional/west,
-/obj/effect/turf_decal/stripes/red/line{
- dir = 5
- },
-/turf/open/floor/iron/textured,
-/area/station/engineering/atmos)
"uow" = (
/obj/structure/railing,
/obj/structure/table,
@@ -72175,14 +72985,6 @@
/obj/machinery/door/firedoor/heavy,
/turf/open/floor/plating,
/area/station/science/ordnance/office)
-"uoE" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"uoJ" = (
/obj/machinery/door/firedoor{
dir = 4
@@ -72248,18 +73050,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/security/prison)
-"upH" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/engineering/atmos/mix)
-"upK" = (
-/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{
- color = "#0000ff";
- dir = 4;
- name = "Supply multi deck pipe adapter"
- },
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"upL" = (
/obj/effect/turf_decal/tile/red,
/turf/open/floor/iron,
@@ -72282,10 +73072,6 @@
/obj/item/raptor_dex,
/turf/open/misc/hay/icemoon,
/area/icemoon/underground/explored)
-"upV" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"uqg" = (
/obj/machinery/conveyor_switch/oneway{
dir = 8;
@@ -72408,6 +73194,16 @@
/obj/structure/cable,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
+"usl" = (
+/obj/machinery/door/airlock/external{
+ name = "External Access"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/airlock/access/all/engineering/external,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"usm" = (
/obj/machinery/airalarm/directional/east,
/turf/open/floor/plating,
@@ -72423,6 +73219,19 @@
dir = 8
},
/area/mine/laborcamp/security)
+"usG" = (
+/obj/machinery/duct,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/blue/line,
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"usS" = (
/obj/structure/bed{
dir = 1
@@ -72488,12 +73297,6 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"uub" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Port to Fuel Pipe"
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"uum" = (
/obj/machinery/door/airlock/public/glass{
name = "Chapel"
@@ -72511,22 +73314,9 @@
"uus" = (
/obj/machinery/status_display/evac/directional/north,
/obj/structure/table,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/turf/open/floor/iron/dark,
/area/station/science/robotics/lab)
-"uuw" = (
-/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/dark_blue/line{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_red/end{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"uuy" = (
/obj/structure/rack,
/obj/item/climbing_hook/emergency,
@@ -72550,18 +73340,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/station/engineering/supermatter/engine)
-"uuI" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"uuO" = (
/obj/effect/turf_decal/siding/white{
dir = 4
@@ -72596,15 +73374,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/central)
-"uvF" = (
-/obj/machinery/camera/directional/west{
- c_tag = "Atmospherics Access"
- },
-/obj/machinery/duct,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"uvM" = (
/obj/effect/spawner/structure/window/hollow/reinforced/middle,
/turf/open/floor/plating,
@@ -72682,16 +73451,6 @@
"uwT" = (
/turf/closed/wall/r_wall,
/area/station/science/cytology)
-"uxd" = (
-/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
- dir = 4
- },
-/obj/machinery/light/directional/east,
-/obj/effect/turf_decal/tile/green/anticorner/contrasted{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
"uxj" = (
/obj/structure/sign/poster/official/random/directional/north,
/turf/open/floor/iron/white/side{
@@ -72715,6 +73474,13 @@
/obj/machinery/light/directional/west,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
+"uxn" = (
+/obj/machinery/computer/atmos_control/mix_tank{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green/half/contrasted,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"uxx" = (
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output{
dir = 1
@@ -72741,10 +73507,6 @@
},
/turf/open/floor/iron/dark,
/area/station/ai/satellite/interior)
-"uxK" = (
-/obj/machinery/light/small/directional/east,
-/turf/open/floor/engine/vacuum,
-/area/station/engineering/atmos)
"uxY" = (
/obj/structure/closet/l3closet/janitor,
/obj/machinery/airalarm/directional/north,
@@ -72850,12 +73612,6 @@
/obj/structure/cable,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
-"uzf" = (
-/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
-/obj/effect/turf_decal/bot,
-/obj/structure/sign/poster/contraband/atmosia_independence/directional/north,
-/turf/open/floor/iron/dark/textured,
-/area/station/engineering/atmos/storage/gas)
"uzi" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
@@ -72899,6 +73655,13 @@
/obj/effect/mapping_helpers/airlock/access/all/service/bar,
/turf/open/floor/iron/dark/textured_half,
/area/station/service/bar/backroom)
+"uzy" = (
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
+/obj/effect/turf_decal/trimline/blue/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"uzB" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -72921,22 +73684,11 @@
},
/turf/open/floor/iron/dark/textured,
/area/station/security/prison)
-"uAi" = (
-/obj/structure/table/reinforced,
-/obj/item/hfr_box/corner,
-/obj/item/hfr_box/corner,
-/obj/item/hfr_box/corner,
-/obj/item/hfr_box/corner,
-/obj/item/hfr_box/core{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/machinery/camera/directional/west{
- c_tag = "Atmospherics - HFR West";
- name = "atmospherics camera"
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
+"uAa" = (
+/obj/item/stack/cable_coil/five,
+/obj/item/wrench,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"uAl" = (
/obj/structure/railing/corner,
/obj/effect/turf_decal/tile/neutral,
@@ -72946,17 +73698,6 @@
/obj/machinery/space_heater,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
-"uAK" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
-/obj/effect/turf_decal/siding/yellow/corner{
- dir = 1
- },
-/obj/machinery/duct,
-/obj/machinery/power/apc/auto_name/directional/west,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"uAL" = (
/obj/structure/cable,
/obj/effect/turf_decal/weather/snow/corner{
@@ -72976,6 +73717,14 @@
},
/turf/open/floor/iron,
/area/station/security/prison/mess)
+"uBr" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/item/kirbyplants/organic/plant20,
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos)
"uBs" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -72992,18 +73741,11 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
-"uBA" = (
-/turf/closed/wall,
-/area/station/engineering/atmos/project)
"uBJ" = (
/turf/open/floor/iron/white/corner{
dir = 8
},
/area/station/hallway/secondary/entry)
-"uBP" = (
-/obj/effect/decal/cleanable/glass,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"uBT" = (
/obj/structure/cable,
/obj/effect/decal/cleanable/dirt/dust,
@@ -73067,6 +73809,12 @@
},
/turf/open/floor/iron/dark/textured,
/area/station/security/armory/upper)
+"uCy" = (
+/obj/machinery/airalarm/directional/north,
+/obj/structure/table,
+/obj/item/stack/sheet/glass/fifty,
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos)
"uCC" = (
/obj/structure/chair{
dir = 1
@@ -73211,13 +73959,16 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"uEf" = (
-/obj/machinery/atmospherics/components/unary/passive_vent{
- dir = 1
+"uEi" = (
+/obj/machinery/atmospherics/components/binary/pressure_valve/on{
+ name = "Waste Release"
},
-/obj/effect/mapping_helpers/no_atoms_ontop,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/underground/explored)
+/obj/effect/turf_decal/trimline/red/arrow_cw{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/red,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"uEm" = (
/turf/open/floor/wood,
/area/station/command/heads_quarters/captain)
@@ -73245,10 +73996,10 @@
},
/turf/open/floor/iron,
/area/station/cargo/storage)
-"uEJ" = (
-/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible,
+"uEO" = (
+/obj/structure/chair/stool/directional/south,
/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
+/area/station/engineering/atmos/mix)
"uEQ" = (
/obj/machinery/door/poddoor/preopen{
id = "bridge blast";
@@ -73317,30 +74068,11 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
-"uFM" = (
-/obj/effect/turf_decal/bot,
-/obj/machinery/holopad,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage)
"uFS" = (
/obj/structure/cable,
/obj/structure/sign/poster/contraband/random/directional/north,
/turf/open/floor/plating,
/area/station/maintenance/fore)
-"uFV" = (
-/obj/structure/tank_dispenser{
- pixel_x = -1
- },
-/obj/machinery/camera/directional/north{
- c_tag = "Atmospherics Monitoring"
- },
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/item/radio/intercom/directional/north,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage/gas)
"uGe" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -73381,12 +74113,13 @@
"uGr" = (
/turf/open/openspace,
/area/station/security/brig/upper)
-"uGy" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer1{
- dir = 8
+"uGG" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/dark/visible{
+ dir = 4
},
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
+/obj/structure/sign/warning/cold_temp/directional/east,
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"uGT" = (
/obj/machinery/light/directional/east,
/obj/item/radio/intercom/directional/east,
@@ -73401,6 +74134,15 @@
},
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
+"uHj" = (
+/obj/structure/fence/post{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{
+ dir = 9
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors/less_spawns)
"uHv" = (
/obj/structure/chair/stool/directional/north,
/obj/structure/cable,
@@ -73464,13 +74206,6 @@
/obj/effect/mapping_helpers/airalarm/unlocked,
/turf/open/floor/iron/dark/textured_edge,
/area/station/security/execution/education)
-"uID" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/engineering/atmos/pumproom)
"uII" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -73589,6 +74324,13 @@
/obj/effect/turf_decal/tile/red/half,
/turf/open/floor/iron/smooth_half,
/area/station/security/brig/upper)
+"uKa" = (
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 6
+ },
+/turf/open/openspace/icemoon/keep_below,
+/area/icemoon/underground/explored)
"uKc" = (
/turf/open/misc/dirt{
initial_gas_mix = "ICEMOON_ATMOS"
@@ -73607,6 +74349,18 @@
/obj/structure/extinguisher_cabinet/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/cryo)
+"uKo" = (
+/obj/machinery/suit_storage_unit/atmos,
+/obj/structure/fireaxecabinet/directional/east,
+/obj/effect/turf_decal/box,
+/obj/machinery/light/warm/directional/east,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos)
+"uKy" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/door/airlock/maintenance,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"uKM" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
@@ -73732,6 +74486,20 @@
"uMN" = (
/turf/open/openspace,
/area/station/commons/storage/mining)
+"uMR" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
+ dir = 8
+ },
+/turf/open/floor/iron/dark/corner{
+ dir = 8
+ },
+/area/station/engineering/atmos/storage/gas)
"uMW" = (
/obj/structure/sign/warning/directional/west,
/turf/open/openspace/icemoon,
@@ -73766,6 +74534,15 @@
/obj/effect/spawner/random/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"uNT" = (
+/obj/machinery/camera/directional/west{
+ c_tag = "Atmospherics - Access"
+ },
+/obj/machinery/duct,
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"uNW" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -73840,6 +74617,15 @@
/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
+"uOu" = (
+/obj/machinery/firealarm/directional/north,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"uOE" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 5
@@ -73910,6 +74696,11 @@
dir = 8
},
/area/station/command/eva)
+"uPK" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"uPS" = (
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
@@ -73988,6 +74779,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/wood,
/area/station/command/heads_quarters/captain)
+"uRh" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/portable_atmospherics/canister,
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron/textured,
+/area/station/engineering/atmos/mix)
"uRi" = (
/obj/structure/cable,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -74046,16 +74846,6 @@
dir = 10
},
/area/station/science/research)
-"uRV" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{
- dir = 9
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"uSd" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/obj/effect/turf_decal/siding/blue/corner{
@@ -74064,6 +74854,26 @@
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/turf/open/floor/iron/white,
/area/station/maintenance/port/fore)
+"uSl" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 8
+ },
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/structure/sign/poster/official/random/directional/north,
+/obj/machinery/camera/directional/north{
+ c_tag = "Atmospherics - Ports"
+ },
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos/mix)
+"uSm" = (
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"uSo" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -74180,6 +74990,12 @@
dir = 4
},
/area/station/service/chapel)
+"uUg" = (
+/obj/structure/table,
+/obj/item/stack/medical/ointment,
+/obj/machinery/light/small/dim/directional/west,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"uUn" = (
/obj/structure/cable,
/obj/machinery/light/small/directional/west,
@@ -74199,12 +75015,6 @@
/obj/effect/turf_decal/bot_white,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
-"uUH" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer1{
- dir = 10
- },
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"uUM" = (
/obj/machinery/light_switch/directional/south,
/obj/effect/turf_decal/tile/neutral/half/contrasted,
@@ -74251,13 +75061,6 @@
},
/turf/open/floor/iron/dark,
/area/station/science/ordnance)
-"uVj" = (
-/obj/effect/turf_decal/arrows/white,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/station/engineering/atmos/hfr_room)
"uVo" = (
/obj/structure/sign/warning/directional/west,
/turf/open/misc/asteroid/snow/icemoon,
@@ -74357,6 +75160,15 @@
/obj/machinery/computer/security/telescreen/entertainment/directional/north,
/turf/open/floor/wood/large,
/area/station/service/bar)
+"uWU" = (
+/obj/machinery/firealarm/directional/north,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"uWW" = (
/obj/structure/closet/cardboard,
/obj/effect/spawner/random/maintenance,
@@ -74421,13 +75233,6 @@
},
/turf/open/floor/iron,
/area/station/service/hydroponics)
-"uYH" = (
-/obj/machinery/atmospherics/pipe/layer_manifold/dark/visible{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"uYO" = (
/obj/structure/closet/firecloset,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -74519,12 +75324,6 @@
/obj/structure/sign/poster/contraband/random/directional/north,
/turf/open/floor/iron,
/area/station/commons/dorms/laundry)
-"vaj" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/sign/warning/docking/directional/north,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"vap" = (
/obj/structure/fence{
dir = 8
@@ -74575,6 +75374,18 @@
},
/turf/open/floor/iron/white/smooth_large,
/area/station/service/kitchen)
+"vaN" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
+"vaS" = (
+/obj/effect/turf_decal/tile/green/half/contrasted{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/station/security/prison/garden)
"vaZ" = (
/obj/item/book/manual/wiki/plumbing{
pixel_x = 4;
@@ -74597,19 +75408,15 @@
dir = 1
},
/area/station/medical/chemistry)
-"vbd" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/arrows/white{
- color = "#0000FF";
- pixel_y = 15
- },
-/turf/open/floor/engine,
-/area/station/engineering/atmos/hfr_room)
"vbn" = (
/obj/machinery/power/smes/full,
/obj/structure/cable,
/turf/open/floor/circuit/telecomms/mainframe,
/area/station/tcommsat/server)
+"vbv" = (
+/obj/effect/spawner/random/gizmo,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"vbC" = (
/obj/structure/chair{
dir = 4
@@ -74640,16 +75447,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
-"vbO" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/obj/item/kirbyplants/random,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/iron/dark/corner{
- dir = 1
- },
-/area/station/engineering/atmos)
"vbX" = (
/obj/effect/landmark/generic_maintenance_landmark,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -74810,15 +75607,6 @@
},
/turf/open/floor/iron/dark,
/area/station/security/courtroom)
-"vei" = (
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
-/obj/structure/sign/warning/secure_area/directional/north,
-/turf/open/floor/iron/showroomfloor,
-/area/station/engineering/atmos)
"ven" = (
/obj/structure/cable,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -74826,9 +75614,12 @@
},
/turf/open/floor/iron/showroomfloor,
/area/station/security/warden)
-"vep" = (
-/turf/closed/wall,
-/area/station/maintenance/disposal/incinerator)
+"veq" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"ver" = (
/obj/structure/lattice/catwalk,
/obj/structure/marker_beacon/burgundy{
@@ -74858,14 +75649,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
-"vfe" = (
-/obj/machinery/atmospherics/components/unary/passive_vent,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/light/cold/directional/north,
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"vfj" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -74966,10 +75749,6 @@
/obj/machinery/light/small/dim/directional/north,
/turf/open/floor/iron/dark/textured_large,
/area/station/medical/morgue)
-"vgf" = (
-/obj/structure/grille,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"vgw" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/small/directional/west,
@@ -74991,13 +75770,6 @@
/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,
/turf/closed/wall/r_wall,
/area/station/science/ordnance/burnchamber)
-"vgM" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"vgR" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -75021,17 +75793,16 @@
/obj/effect/turf_decal/bot_red,
/turf/open/floor/plating,
/area/station/maintenance/fore/lesser)
+"vhD" = (
+/obj/structure/rack,
+/obj/effect/spawner/random/maintenance,
+/obj/effect/spawner/random/clothing/bowler_or_that,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"vhF" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/plating,
/area/station/maintenance/fore)
-"vhT" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/simple/brown/visible{
- dir = 6
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"via" = (
/turf/open/floor/iron/white/side{
dir = 6
@@ -75086,12 +75857,6 @@
},
/turf/open/floor/iron,
/area/mine/production)
-"vjk" = (
-/obj/machinery/atmospherics/components/binary/crystallizer{
- dir = 4
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"vjq" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -75242,6 +76007,14 @@
/obj/machinery/light/small/directional/west,
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"vmq" = (
+/obj/structure/closet/radiation,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/structure/sign/warning/directional/north,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"vmr" = (
/obj/structure/musician/piano,
/turf/open/floor/wood,
@@ -75438,10 +76211,6 @@
/obj/machinery/light_switch/directional/north,
/turf/open/floor/iron/dark,
/area/station/service/chapel)
-"vnY" = (
-/obj/structure/closet/crate/critter,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"voj" = (
/obj/structure/disposalpipe/sorting/mail/flip{
dir = 8
@@ -75527,6 +76296,10 @@
},
/turf/open/floor/iron/grimy,
/area/station/ai/satellite/interior)
+"voZ" = (
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/glass/reinforced,
+/area/station/engineering/atmos/pumproom)
"vpc" = (
/obj/structure/closet,
/obj/machinery/light/small/directional/south,
@@ -75539,13 +76312,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
-"vpg" = (
-/obj/structure/cable,
-/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/station/maintenance/starboard/aft)
"vpi" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -75566,10 +76332,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
-"vpR" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/department/medical/central)
"vpW" = (
/obj/structure/displaycase/labcage,
/obj/effect/turf_decal/stripes/end{
@@ -75706,12 +76468,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
-"vrO" = (
+"vrL" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/disposalpipe/segment,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/grille/broken,
/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
+/area/station/maintenance/aft/greater)
"vrW" = (
/obj/structure/sign/warning/firing_range/directional/east,
/turf/open/misc/asteroid/snow/icemoon,
@@ -75723,6 +76488,10 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
+"vsf" = (
+/obj/effect/spawner/random/structure/tank_holder,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"vsk" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/tile/red/half/contrasted,
@@ -75786,10 +76555,6 @@
/obj/structure/cable,
/turf/open/floor/catwalk_floor/iron_smooth,
/area/station/maintenance/port/greater)
-"vsZ" = (
-/obj/structure/table,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"vtg" = (
/obj/machinery/door/poddoor/shutters/preopen{
dir = 8;
@@ -75805,11 +76570,6 @@
/obj/machinery/air_sensor/carbon_tank,
/turf/open/floor/engine/co2,
/area/station/engineering/atmos)
-"vtr" = (
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/item/kirbyplants/random,
-/turf/open/floor/wood,
-/area/station/maintenance/aft/greater)
"vtu" = (
/obj/effect/turf_decal/weather/snow/corner{
dir = 8
@@ -75824,28 +76584,16 @@
},
/turf/open/floor/plating,
/area/station/medical/morgue)
-"vtv" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Port to Infiltrate/Filter"
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"vtA" = (
/obj/item/radio/intercom/directional/north,
/turf/open/floor/iron/white/side{
dir = 10
},
/area/station/science/research)
-"vtO" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/random/structure/steam_vent,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
+"vtD" = (
+/obj/structure/reagent_dispensers/fueltank/large,
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos)
"vtR" = (
/obj/item/storage/briefcase,
/obj/structure/rack,
@@ -75864,13 +76612,19 @@
/obj/structure/cable,
/turf/open/floor/iron/white,
/area/station/medical/cryo)
-"vuf" = (
-/obj/machinery/shower/directional/west,
-/obj/effect/turf_decal/stripes/red/line{
- dir = 6
+"vtV" = (
+/obj/machinery/atmospherics/components/unary/thermomachine/heater{
+ dir = 8
+ },
+/obj/structure/railing,
+/obj/machinery/airalarm/directional/east,
+/obj/effect/turf_decal/bot_red,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
},
+/obj/effect/turf_decal/tile/dark,
/turf/open/floor/iron/textured,
-/area/station/engineering/atmos)
+/area/station/engineering/atmos/mix)
"vuh" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -75895,11 +76649,6 @@
/obj/structure/fireaxecabinet/mechremoval/directional/north,
/turf/open/floor/iron/white,
/area/station/science/robotics/lab)
-"vuu" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/layer_manifold/dark,
-/turf/open/floor/plating,
-/area/station/engineering/atmos)
"vuR" = (
/obj/structure/extinguisher_cabinet/directional/south,
/obj/effect/turf_decal/trimline/yellow/filled/warning{
@@ -76024,13 +76773,6 @@
/obj/machinery/light/small/directional/east,
/turf/open/floor/wood/large,
/area/station/commons/vacant_room/office)
-"vwj" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Port Mix to West Ports"
- },
-/obj/structure/extinguisher_cabinet/directional/west,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"vwl" = (
/obj/machinery/light_switch/directional/south,
/obj/structure/disposalpipe/segment{
@@ -76136,14 +76878,6 @@
},
/turf/open/floor/wood,
/area/station/commons/vacant_room/office)
-"vxV" = (
-/obj/structure/cable,
-/obj/machinery/duct,
-/obj/effect/turf_decal/bot,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
-/turf/open/floor/iron/large,
-/area/station/engineering/atmos)
"vxW" = (
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 4
@@ -76155,6 +76889,19 @@
/obj/machinery/status_display/ai/directional/east,
/turf/open/floor/iron,
/area/station/commons/fitness)
+"vxY" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
+/obj/effect/turf_decal/trimline/red/corner,
+/obj/effect/turf_decal/trimline/red/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/red/corner_long{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"vyd" = (
/obj/machinery/modular_computer/preset/id,
/turf/open/floor/carpet/royalblue,
@@ -76203,24 +76950,29 @@
/obj/structure/sign/warning/test_chamber/directional/north,
/turf/open/floor/glass/reinforced,
/area/station/science/ordnance/office)
-"vyI" = (
-/obj/structure/railing{
- dir = 1
+"vyK" = (
+/obj/machinery/light/warm/directional/east,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
},
-/obj/effect/mapping_helpers/broken_floor,
-/obj/machinery/light/small/dim/directional/east,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos)
"vyU" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
-"vzb" = (
-/obj/structure/rack,
-/obj/effect/spawner/random/clothing/costume,
-/obj/structure/sign/poster/contraband/random/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
+"vzj" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/tank/plasma,
+/obj/effect/turf_decal/box/corners,
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/obj/machinery/status_display/ai/directional/north,
+/obj/structure/sign/poster/official/plasma_effects/directional/east,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/maintenance/disposal/incinerator)
"vzn" = (
/obj/machinery/door/airlock/maintenance,
/obj/effect/mapping_helpers/airlock/access/all/engineering/external,
@@ -76276,13 +77028,6 @@
},
/turf/open/floor/iron/white/smooth_large,
/area/station/service/kitchen)
-"vzS" = (
-/obj/effect/mapping_helpers/mail_sorting/science/experimentor_lab,
-/obj/structure/disposalpipe/sorting/mail{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"vzT" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/turf_decal/tile/dark_green{
@@ -76294,6 +77039,14 @@
/obj/machinery/newscaster/directional/west,
/turf/open/floor/iron/recharge_floor,
/area/station/science/robotics/mechbay)
+"vAi" = (
+/obj/structure/table,
+/obj/item/assembly/relic,
+/obj/effect/spawner/random/maintenance,
+/obj/item/screwdriver,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/floor/iron/checker,
+/area/station/maintenance/port/fore)
"vAq" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark,
@@ -76408,6 +77161,12 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/engineering/supermatter/room)
+"vBs" = (
+/obj/machinery/camera/directional/west{
+ c_tag = "Atmospherics - N2O"
+ },
+/turf/open/floor/engine/n2o,
+/area/station/engineering/atmos)
"vBu" = (
/obj/machinery/space_heater,
/obj/machinery/camera/directional/south{
@@ -76417,23 +77176,6 @@
/obj/effect/turf_decal/tile/yellow/half/contrasted,
/turf/open/floor/iron,
/area/station/commons/storage/tools)
-"vBv" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
- dir = 9
- },
-/obj/effect/turf_decal/siding/wideplating/corner{
- dir = 4
- },
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/pumproom)
-"vBC" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
- dir = 6
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"vBE" = (
/obj/machinery/light/small/directional/south,
/obj/structure/closet/secure_closet/brig{
@@ -76449,6 +77191,13 @@
"vBG" = (
/turf/closed/wall,
/area/station/command/heads_quarters/cmo)
+"vBH" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"vBY" = (
/obj/structure/cable,
/turf/open/floor/plating,
@@ -76488,6 +77237,15 @@
},
/turf/open/floor/iron/edge,
/area/station/engineering/lobby)
+"vCN" = (
+/obj/machinery/door/airlock/maintenance,
+/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
+/obj/effect/mapping_helpers/airlock/unres/delayed{
+ dir = 1
+ },
+/obj/structure/plasticflaps/kitchen,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"vDb" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
@@ -76536,6 +77294,12 @@
},
/turf/open/floor/iron/dark,
/area/station/ai/upload/chamber)
+"vEi" = (
+/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
+/obj/effect/turf_decal/bot,
+/obj/machinery/status_display/ai/directional/north,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/storage/gas)
"vEy" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -76591,6 +77355,11 @@
/obj/item/radio/intercom/directional/east,
/turf/open/floor/iron/smooth,
/area/station/security/holding_cell)
+"vER" = (
+/obj/structure/sign/warning/cold_temp/directional/south,
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"vEU" = (
/obj/machinery/door/airlock/external{
glass = 1;
@@ -76762,6 +77531,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
+"vHr" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/girder,
+/obj/structure/grille/broken,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"vHA" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
@@ -76789,6 +77567,12 @@
},
/turf/open/floor/iron,
/area/station/cargo/sorting)
+"vHO" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"vHR" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 4
@@ -76825,6 +77609,15 @@
dir = 1
},
/area/station/security/prison)
+"vHV" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/effect/spawner/structure/window/hollow/reinforced/plasma/middle{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/station/engineering/atmos/hfr_room)
"vHZ" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
@@ -76883,6 +77676,13 @@
/obj/item/radio/intercom/directional/north,
/turf/open/floor/iron/dark/textured_edge,
/area/station/security/evidence)
+"vIM" = (
+/obj/effect/turf_decal/tile/purple/opposingcorners,
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"vIQ" = (
/obj/item/toy/plush/beeplushie{
name = "multi-bee plushie";
@@ -76912,11 +77712,6 @@
},
/turf/open/floor/plating,
/area/mine/laborcamp)
-"vIZ" = (
-/obj/machinery/duct,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"vJk" = (
/obj/machinery/atmospherics/components/binary/valve{
dir = 4
@@ -76946,6 +77741,10 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
+"vJy" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
+/turf/open/floor/glass/reinforced,
+/area/station/engineering/atmos/pumproom)
"vJB" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
@@ -76994,6 +77793,15 @@
},
/turf/open/floor/iron,
/area/station/command/heads_quarters/rd)
+"vKi" = (
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden/layer4{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"vKq" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -77016,6 +77824,11 @@
},
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
+"vKz" = (
+/obj/structure/reagent_dispensers/watertank,
+/obj/machinery/light/small/dim/directional/east,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"vKD" = (
/obj/effect/turf_decal/tile/blue{
dir = 8
@@ -77095,6 +77908,14 @@
/obj/machinery/door/firedoor,
/turf/open/floor/iron/textured,
/area/station/commons/storage/mining)
+"vLt" = (
+/obj/machinery/door/airlock/maintenance,
+/obj/effect/mapping_helpers/airlock/unres/delayed,
+/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/airlock/abandoned/nowall,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"vLB" = (
/obj/machinery/conveyor{
dir = 6;
@@ -77184,10 +78005,12 @@
/obj/structure/cable,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
-"vNI" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
-/turf/closed/wall/r_wall,
-/area/station/engineering/atmos/mix)
+"vNL" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/obj/effect/turf_decal/bot,
+/obj/machinery/status_display/evac/directional/north,
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/storage/gas)
"vNP" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -77203,6 +78026,12 @@
/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron,
/area/station/service/bar)
+"vOd" = (
+/obj/machinery/atmospherics/components/unary/passive_vent/layer2{
+ dir = 1
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/underground/explored)
"vOw" = (
/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/red{
@@ -77262,6 +78091,12 @@
/obj/item/radio/intercom/directional/south,
/turf/open/floor/iron,
/area/station/service/janitor)
+"vPt" = (
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 10
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"vPx" = (
/turf/open/floor/iron/dark/textured,
/area/station/security/prison/workout)
@@ -77366,12 +78201,6 @@
/obj/effect/spawner/structure/window/hollow/reinforced/middle,
/turf/open/floor/plating,
/area/station/maintenance/department/chapel)
-"vRC" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"vRK" = (
/obj/structure/fence/corner{
dir = 2
@@ -77389,15 +78218,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/turf/closed/wall/r_wall,
/area/station/engineering/atmos/storage/gas)
-"vRW" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"vRY" = (
/obj/structure/railing/corner{
dir = 4
@@ -77531,6 +78351,17 @@
},
/turf/open/floor/iron/dark/smooth_half,
/area/station/security/prison/work)
+"vTz" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Security Office"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/obj/machinery/door/firedoor,
+/turf/open/floor/iron/dark,
+/area/station/security/checkpoint/engineering)
"vTJ" = (
/obj/structure/table,
/obj/item/toy/plush/slimeplushie{
@@ -77558,12 +78389,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/port)
-"vUr" = (
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
- dir = 4
- },
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"vUy" = (
/obj/structure/chair/pew/right{
dir = 1
@@ -77632,6 +78457,11 @@
},
/turf/open/floor/iron,
/area/station/science/ordnance)
+"vVb" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"vVf" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -77651,6 +78481,12 @@
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/iron/grimy,
/area/station/commons/lounge)
+"vVo" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"vVt" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -77670,6 +78506,15 @@
/obj/structure/cable/multilayer/multiz,
/turf/open/floor/plating,
/area/station/maintenance/department/security)
+"vVO" = (
+/obj/machinery/computer/atmos_control/nitrous_tank{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/iron/white/corner,
+/area/station/engineering/atmos)
"vVP" = (
/obj/structure/lattice/catwalk,
/obj/structure/railing{
@@ -77707,6 +78552,16 @@
/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/central)
+"vWk" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
+ dir = 8
+ },
+/turf/open/floor/iron/large,
+/area/station/engineering/atmos/storage/gas)
"vWm" = (
/obj/structure/disposalpipe/sorting/mail/flip{
dir = 1
@@ -77798,20 +78653,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/cafeteria,
/area/station/security/prison/mess)
-"vXv" = (
-/obj/structure/lattice/catwalk,
-/obj/structure/railing/corner,
-/obj/structure/railing/corner{
- dir = 4
- },
-/obj/structure/railing/corner{
- dir = 1
- },
-/obj/structure/railing/corner{
- dir = 8
- },
-/turf/open/openspace,
-/area/station/engineering/atmos/storage)
"vXy" = (
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
@@ -77834,6 +78675,16 @@
/obj/structure/cable,
/turf/open/floor/iron/white,
/area/mine/living_quarters)
+"vXS" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 1
+ },
+/obj/item/kirbyplants/organic/plant13,
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"vXU" = (
/obj/item/toy/snowball,
/turf/open/misc/asteroid/snow/icemoon,
@@ -77923,12 +78774,25 @@
"vYH" = (
/turf/open/floor/iron/white,
/area/station/medical/pharmacy)
+"vYM" = (
+/obj/effect/mapping_helpers/broken_floor,
+/obj/effect/spawner/random/trash/grille_or_waste,
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"vYU" = (
/obj/structure/fence{
dir = 4
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/unexplored/rivers/deep/shoreline)
+"vYW" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/dark/visible{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/broken_floor,
+/obj/machinery/light/small/red/directional/west,
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"vZa" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
@@ -77940,19 +78804,6 @@
/obj/effect/spawner/random/entertainment/dice,
/turf/open/floor/iron,
/area/station/commons/locker)
-"vZo" = (
-/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/structure/railing,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
-"vZt" = (
-/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"vZz" = (
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/effect/landmark/start/hangover,
@@ -77971,15 +78822,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"vZD" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/railing,
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"vZM" = (
/obj/structure/sign/warning/cold_temp/directional/north,
/turf/open/floor/plating,
@@ -77997,6 +78839,18 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron/smooth_large,
/area/station/science/cytology)
+"waB" = (
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/line{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"waE" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -78007,13 +78861,6 @@
/obj/machinery/power/apc/auto_name/directional/north,
/turf/open/floor/iron,
/area/station/security/prison/mess)
-"waF" = (
-/obj/effect/landmark/generic_maintenance_landmark,
-/obj/effect/mapping_helpers/broken_floor,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"waH" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -78081,15 +78928,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/virology)
-"wbf" = (
-/obj/effect/spawner/random/structure/closet_maintenance,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
-"wbk" = (
-/obj/machinery/firealarm/directional/west,
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"wbl" = (
/obj/structure/fence/door/opened{
dir = 8
@@ -78141,6 +78979,15 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron/large,
/area/station/command/heads_quarters/ce)
+"wcB" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 8
+ },
+/obj/structure/disposalpipe/junction/flip{
+ dir = 4
+ },
+/turf/open/floor/iron/large,
+/area/station/engineering/lobby)
"wcD" = (
/obj/structure/chair/plastic{
dir = 4
@@ -78278,16 +79125,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/catwalk_floor/iron_dark,
/area/station/ai/upload/chamber)
-"wfm" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer1{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/bridge_pipe/orange/visible,
-/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
- dir = 4
- },
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"wfn" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -78340,15 +79177,17 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/science/xenobiology)
-"wgG" = (
-/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
+"wgy" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 8
},
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/iron,
+/area/station/hallway/primary/aft)
+"wgF" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
+/obj/item/radio/intercom/directional/east,
/turf/open/floor/iron,
/area/station/engineering/atmos)
"wgI" = (
@@ -78403,10 +79242,6 @@
/obj/item/stack/sheet/iron,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"whf" = (
-/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible,
-/turf/open/floor/glass/reinforced,
-/area/station/engineering/atmos/pumproom)
"whg" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -78440,6 +79275,10 @@
/obj/item/cultivator,
/turf/open/floor/grass,
/area/station/security/prison/garden)
+"whv" = (
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/engine/n2o,
+/area/station/engineering/atmos)
"whC" = (
/obj/structure/destructible/cult/item_dispenser/archives/library,
/obj/item/book/codex_gigas,
@@ -78520,6 +79359,25 @@
},
/turf/open/floor/iron/white,
/area/station/medical/virology)
+"wiG" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/line{
+ dir = 4
+ },
+/obj/machinery/camera/directional/west{
+ c_tag = "Atmospherics - Equipment"
+ },
+/obj/machinery/meter,
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"wiX" = (
/obj/machinery/light/small/directional/east,
/obj/structure/flora/grass/brown/style_random,
@@ -78562,6 +79420,27 @@
/obj/machinery/light/cold/directional/north,
/turf/open/floor/iron/dark,
/area/station/medical/storage)
+"wjJ" = (
+/obj/structure/closet,
+/obj/item/clothing/suit/hooded/wintercoat/security{
+ pixel_x = 5
+ },
+/obj/item/clothing/suit/hooded/wintercoat/security{
+ pixel_x = 5
+ },
+/obj/item/clothing/suit/hooded/wintercoat/security{
+ pixel_x = 5
+ },
+/obj/item/clothing/suit/hooded/wintercoat{
+ pixel_x = -5
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ 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)
"wjL" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 4
@@ -78628,6 +79507,11 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/cargo/storage)
+"wkM" = (
+/obj/effect/spawner/structure/window/reinforced/plasma,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/plating,
+/area/station/engineering/atmos/project)
"wkO" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -78638,22 +79522,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/department/chapel)
-"wkW" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 1
- },
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
- dir = 5
- },
-/obj/effect/turf_decal/trimline/dark_red/corner{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"wle" = (
/obj/effect/landmark/generic_maintenance_landmark,
/obj/effect/decal/cleanable/dirt,
@@ -78779,6 +79647,17 @@
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
+"wnH" = (
+/obj/item/kirbyplants/random,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/engineering/atmos)
"wnK" = (
/obj/effect/turf_decal/stripes/corner{
dir = 8
@@ -78826,13 +79705,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
-"woH" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/obj/effect/landmark/generic_maintenance_landmark,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"woP" = (
/obj/structure/fluff/tram_rail/end{
dir = 4;
@@ -78873,11 +79745,6 @@
/obj/machinery/power/port_gen/pacman/pre_loaded,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
-"wpp" = (
-/obj/machinery/airalarm/directional/north,
-/obj/machinery/pipedispenser/disposal,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos)
"wpx" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/newscaster/directional/west,
@@ -79004,18 +79871,6 @@
},
/turf/open/floor/iron,
/area/mine/production)
-"wrE" = (
-/obj/structure/table/reinforced,
-/obj/item/stack/sheet/glass/fifty{
- pixel_x = 2
- },
-/obj/item/stack/sheet/iron/fifty,
-/obj/item/stack/cable_coil{
- pixel_x = -3;
- pixel_y = 3
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"wrP" = (
/obj/machinery/computer/cargo,
/obj/effect/turf_decal/tile/brown/half/contrasted{
@@ -79109,6 +79964,11 @@
/obj/effect/turf_decal/siding/thinplating_new,
/turf/open/floor/iron,
/area/station/commons/locker)
+"wsW" = (
+/obj/effect/turf_decal/bot,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/engine,
+/area/station/engineering/atmos/hfr_room)
"wta" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -79126,16 +79986,14 @@
/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
-"wtM" = (
-/obj/machinery/door/airlock/external{
- dir = 4;
- name = "External Access"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
+"wtz" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/atmospherics/components/binary/valve{
+ dir = 8
},
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
+/obj/effect/turf_decal/box/red,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/project)
"wtP" = (
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
@@ -79160,6 +80018,21 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/science/ordnance)
+"wup" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "atmos-entrance"
+ },
+/obj/machinery/duct,
+/obj/machinery/door/airlock/atmos/glass{
+ name = "Atmospherics"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
+ dir = 8
+ },
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos)
"wuv" = (
/obj/machinery/iv_drip,
/obj/effect/turf_decal/tile/blue/half/contrasted,
@@ -79182,6 +80055,11 @@
/obj/structure/grille,
/turf/open/floor/plating,
/area/station/maintenance/starboard/upper)
+"wuG" = (
+/obj/effect/decal/cleanable/glass,
+/obj/effect/landmark/generic_maintenance_landmark,
+/turf/open/floor/iron/dark,
+/area/station/maintenance/department/medical/central)
"wuH" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -79192,6 +80070,15 @@
},
/turf/open/floor/iron/dark/textured,
/area/station/security/prison)
+"wva" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/door/airlock/maintenance,
+/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
+/obj/effect/mapping_helpers/airlock/unres/delayed,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"wvk" = (
/obj/structure/chair/stool/directional/south,
/obj/effect/decal/cleanable/blood/oil/slippery,
@@ -79201,6 +80088,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/carpet,
/area/station/service/chapel)
+"wvr" = (
+/obj/structure/closet/toolcloset,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/aft)
"wvw" = (
/obj/structure/fence/cut/medium{
dir = 2
@@ -79233,13 +80124,6 @@
/obj/item/assembly/timer,
/turf/open/floor/iron/dark,
/area/station/science/ordnance/office)
-"wvF" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/components/unary/passive_vent{
- dir = 8
- },
-/turf/open/openspace/icemoon/keep_below,
-/area/icemoon/underground/explored)
"wvI" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/disposal/incinerator)
@@ -79258,6 +80142,16 @@
},
/turf/open/floor/iron,
/area/station/commons/storage/tools)
+"wvP" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{
+ dir = 1
+ },
+/obj/structure/railing/corner/end/flip{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/mix)
"wvV" = (
/turf/closed/wall/r_wall,
/area/station/engineering/atmos/pumproom)
@@ -79314,12 +80208,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark/textured,
/area/station/security/prison)
-"wwu" = (
-/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"wwE" = (
/obj/structure/floodlight_frame,
/turf/open/floor/plating,
@@ -79346,14 +80234,6 @@
},
/turf/open/floor/iron,
/area/station/command/gateway)
-"wxl" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/trimline/neutral/line,
-/obj/effect/turf_decal/trimline/neutral/line{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"wxw" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -79458,11 +80338,6 @@
/obj/machinery/computer/records/medical,
/turf/open/floor/iron/grimy,
/area/station/security/detectives_office)
-"wzg" = (
-/obj/structure/rack,
-/obj/effect/spawner/random/clothing/bowler_or_that,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"wzi" = (
/obj/effect/spawner/random/structure/crate,
/obj/effect/mapping_helpers/no_atoms_ontop,
@@ -79475,13 +80350,6 @@
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood/large,
/area/mine/eva/lower)
-"wzv" = (
-/obj/machinery/atmospherics/components/tank/air{
- dir = 3;
- initialize_directions = 3
- },
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"wzC" = (
/obj/machinery/holopad/secure,
/obj/effect/turf_decal/bot,
@@ -79541,6 +80409,15 @@
/obj/item/folder/yellow,
/turf/open/floor/iron,
/area/station/cargo/storage)
+"wAs" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Port to Filter"
+ },
+/obj/structure/railing,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/mix)
"wAv" = (
/obj/structure/chair/comfy/brown{
dir = 1
@@ -79559,13 +80436,6 @@
dir = 4
},
/area/station/commons/storage/mining)
-"wAB" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"wAJ" = (
/obj/effect/turf_decal/siding/white{
dir = 1
@@ -79577,6 +80447,14 @@
/obj/structure/sign/warning/directional/east,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"wAV" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/blue/line,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"wAW" = (
/obj/structure/table,
/obj/item/knife/kitchen,
@@ -79712,23 +80590,6 @@
/obj/structure/sign/warning/no_smoking/circle/directional/north,
/turf/open/openspace,
/area/station/medical/treatment_center)
-"wCK" = (
-/obj/effect/turf_decal/trimline/dark_blue/corner{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
-"wCN" = (
-/obj/machinery/portable_atmospherics/canister,
-/obj/structure/extinguisher_cabinet/directional/east,
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/effect/turf_decal/bot,
-/obj/structure/sign/poster/official/wtf_is_co2/directional/north,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"wCP" = (
/obj/effect/turf_decal/stripes/red/line{
dir = 5
@@ -79769,13 +80630,15 @@
/obj/effect/landmark/start/medical_doctor,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
-"wDg" = (
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"wDr" = (
/obj/machinery/space_heater,
/turf/open/floor/plating,
/area/station/maintenance/starboard/upper)
+"wDB" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"wDH" = (
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/tile/red/half/contrasted{
@@ -79783,16 +80646,6 @@
},
/turf/open/floor/iron,
/area/station/security/brig/upper)
-"wDK" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/spawner/random/structure/steam_vent,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"wDS" = (
/obj/structure/fence/door{
dir = 8
@@ -79990,19 +80843,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"wGO" = (
-/obj/machinery/light/directional/south,
-/obj/machinery/atmospherics/pipe/multiz/violet/visible{
- dir = 8;
- name = "Infiltrate"
- },
-/obj/effect/turf_decal/tile/neutral/diagonal_centre,
-/obj/effect/turf_decal/tile/dark_green/diagonal_edge,
-/obj/structure/railing{
- dir = 4
- },
-/turf/open/floor/iron/dark/diagonal,
-/area/station/engineering/atmos/storage)
"wGX" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
@@ -80020,13 +80860,6 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating,
/area/station/maintenance/port/lesser)
-"wHb" = (
-/obj/machinery/atmospherics/components/unary/passive_vent{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"wHc" = (
/turf/closed/wall/r_wall,
/area/station/command/heads_quarters/rd)
@@ -80034,19 +80867,6 @@
/obj/structure/cable,
/turf/open/floor/iron/dark/textured,
/area/station/security/armory/upper)
-"wHg" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/trimline/yellow/warning{
- dir = 1
- },
-/obj/machinery/door/poddoor/shutters/window/preopen{
- dir = 1;
- id = "Atmospherics Project Shutters";
- name = "Atmospherics Project Shutters"
- },
-/obj/machinery/door/firedoor/heavy,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"wHT" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -80070,6 +80890,16 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/science/robotics/mechbay)
+"wIj" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{
+ dir = 2
+ },
+/obj/effect/turf_decal/trimline/blue/arrow_cw{
+ dir = 10
+ },
+/obj/effect/turf_decal/trimline/blue/line,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"wIm" = (
/obj/machinery/light/directional/south,
/obj/effect/turf_decal/tile/blue/half/contrasted,
@@ -80094,15 +80924,18 @@
},
/turf/open/floor/iron/large,
/area/station/commons/storage/primary)
-"wIS" = (
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/structure/table,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"wIZ" = (
/obj/effect/decal/remains/plasma,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
+"wJf" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible,
+/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/line,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"wJi" = (
/obj/structure/railing{
dir = 4
@@ -80226,6 +81059,20 @@
},
/turf/open/floor/iron,
/area/station/command/bridge)
+"wKP" = (
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/mix)
+"wKX" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/door/airlock/maintenance/glass,
+/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance,
+/obj/effect/mapping_helpers/airlock/unres/delayed,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"wLc" = (
/obj/structure/table,
/obj/machinery/button/flasher{
@@ -80446,10 +81293,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth,
/area/station/security/holding_cell)
-"wOn" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/engineering/atmos/storage)
"wOq" = (
/obj/structure/fence/door/opened,
/turf/open/floor/plating/snowed/smoothed/icemoon,
@@ -80553,10 +81396,6 @@
/obj/structure/cable,
/turf/open/floor/iron/dark/textured_large,
/area/station/security/evidence)
-"wPE" = (
-/obj/machinery/status_display/ai/directional/north,
-/turf/open/openspace,
-/area/station/engineering/atmos/storage)
"wPG" = (
/obj/structure/fence{
dir = 1
@@ -80597,6 +81436,15 @@
/obj/structure/window/reinforced/spawner/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/storage)
+"wPY" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/aft/greater)
"wQd" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/blue/opposingcorners{
@@ -80638,13 +81486,6 @@
/obj/machinery/airalarm/directional/south,
/turf/open/floor/iron/dark,
/area/station/service/chapel)
-"wQF" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 1;
- name = "N2 to Airmix"
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"wQK" = (
/obj/machinery/door/airlock/freezer,
/obj/structure/plasticflaps/kitchen,
@@ -80754,11 +81595,6 @@
/obj/effect/spawner/random/structure/steam_vent,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
-"wSo" = (
-/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"wSp" = (
/obj/structure/fence/corner{
dir = 10
@@ -80842,14 +81678,6 @@
/obj/machinery/telecomms/bus/preset_one,
/turf/open/floor/iron/dark/telecomms,
/area/station/tcommsat/server)
-"wTB" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/bot,
-/obj/structure/cable,
-/obj/structure/closet/radiation,
-/obj/structure/sign/warning/no_smoking/circle/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/disposal/incinerator)
"wTC" = (
/obj/structure/closet/secure_closet/security/engine,
/obj/machinery/requests_console/directional/north{
@@ -80863,6 +81691,14 @@
/obj/effect/turf_decal/tile/red/opposingcorners,
/turf/open/floor/iron/dark,
/area/station/security/checkpoint/engineering)
+"wTD" = (
+/obj/machinery/button/door/directional/east{
+ id = "xenobio6";
+ name = "Xenobio Pen 6 Blast Door";
+ req_access = list("xenobiology")
+ },
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"wTL" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -80957,12 +81793,6 @@
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
-"wUA" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"wUB" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -81008,10 +81838,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
-"wUR" = (
-/obj/effect/turf_decal/bot,
-/turf/open/floor/engine,
-/area/station/engineering/atmos/hfr_room)
"wUT" = (
/obj/structure/closet/secure_closet/security/sec,
/obj/structure/cable,
@@ -81435,17 +82261,6 @@
/obj/item/kirbyplants/random,
/turf/open/floor/iron/white,
/area/mine/living_quarters)
-"xbg" = (
-/obj/effect/landmark/start/station_engineer,
-/obj/machinery/light/floor,
-/obj/effect/turf_decal/siding/yellow{
- dir = 1
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/lobby)
"xbn" = (
/obj/effect/turf_decal/tile/neutral/diagonal_edge,
/obj/effect/landmark/event_spawn,
@@ -81468,6 +82283,15 @@
dir = 8
},
/area/station/security/prison/workout)
+"xbx" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{
+ dir = 1
+ },
+/obj/machinery/portable_atmospherics/canister,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/large,
+/area/station/maintenance/disposal/incinerator)
"xby" = (
/obj/structure/cable,
/obj/effect/spawner/structure/window/hollow/reinforced/middle,
@@ -81495,15 +82319,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/pharmacy)
-"xbC" = (
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw,
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/layer_manifold/violet/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage)
"xbV" = (
/obj/structure/ladder,
/turf/open/floor/plating/snowed/icemoon,
@@ -81536,6 +82351,17 @@
/obj/structure/table/wood,
/turf/open/floor/wood,
/area/station/service/lawoffice)
+"xcj" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer4{
+ dir = 6
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/hfr_room)
"xcp" = (
/obj/item/trash/pistachios,
/turf/open/floor/plating,
@@ -81570,6 +82396,10 @@
},
/turf/open/floor/iron/dark,
/area/station/ai/upload/chamber)
+"xcJ" = (
+/obj/structure/stairs/west,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/morgue)
"xcS" = (
/obj/machinery/portable_atmospherics/canister/water_vapor,
/obj/effect/turf_decal/tile/purple{
@@ -81641,6 +82471,10 @@
},
/turf/open/floor/iron/white/corner,
/area/station/hallway/secondary/entry)
+"xdL" = (
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/iron/grimy,
+/area/station/maintenance/aft/lesser)
"xdU" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 1
@@ -81697,6 +82531,10 @@
/obj/machinery/teleport/hub,
/turf/open/floor/plating,
/area/station/command/teleporter)
+"xeB" = (
+/obj/machinery/air_sensor/nitrous_tank,
+/turf/open/floor/engine/airless,
+/area/station/engineering/atmos)
"xeF" = (
/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
dir = 4
@@ -81720,12 +82558,6 @@
},
/turf/open/floor/iron/dark,
/area/station/service/chapel)
-"xeM" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/carbon_output{
- dir = 8
- },
-/turf/open/floor/engine/co2,
-/area/station/engineering/atmos)
"xeV" = (
/obj/structure/toilet{
dir = 8
@@ -81734,6 +82566,15 @@
/obj/machinery/light/small/dim/directional/south,
/turf/open/floor/iron/smooth,
/area/station/security/holding_cell)
+"xeW" = (
+/obj/machinery/atmospherics/components/binary/valve/digital/on{
+ name = "Filter to Mix"
+ },
+/obj/effect/turf_decal/tile/green/anticorner/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"xfb" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 1
@@ -81761,6 +82602,23 @@
/obj/effect/mapping_helpers/airlock/unres/delayed,
/turf/open/floor/iron/white,
/area/station/science/research)
+"xfe" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/blue/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/blue/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"xfg" = (
/obj/structure/showcase/cyborg/old{
dir = 4;
@@ -81820,10 +82678,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
-"xfB" = (
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"xfK" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/door/airlock/maintenance{
@@ -81835,17 +82689,13 @@
/obj/effect/mapping_helpers/airlock/access/all/science/research,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
-"xfM" = (
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/obj/item/radio/intercom/directional/north,
-/obj/machinery/atmospherics/components/binary/pump/layer2{
- dir = 8;
- name = "Exfiltrate to Waste"
+"xfS" = (
+/obj/structure/reagent_dispensers/watertank/high,
+/obj/structure/curtain/bounty{
+ pixel_x = 32
},
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage)
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos)
"xfZ" = (
/obj/structure/flora/bush/snow/style_random,
/turf/open/misc/asteroid/snow/icemoon,
@@ -81980,6 +82830,13 @@
"xhk" = (
/turf/open/floor/iron/dark,
/area/station/commons/storage/primary)
+"xhp" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos/hfr_room)
"xht" = (
/obj/machinery/door/window/right/directional/west{
name = "Shop Counter"
@@ -82085,6 +82942,19 @@
/obj/item/radio/intercom/prison/directional/north,
/turf/open/floor/iron,
/area/mine/laborcamp)
+"xiz" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible,
+/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/trimline/blue/line,
+/obj/effect/turf_decal/trimline/red/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"xiC" = (
/obj/structure/table/wood,
/obj/effect/spawner/random/food_or_drink/snack,
@@ -82176,16 +83046,20 @@
},
/turf/open/floor/plating,
/area/station/cargo/sorting)
+"xjS" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/structure/railing/corner/end/flip{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"xjZ" = (
/obj/structure/tank_dispenser/oxygen,
/turf/open/floor/iron/dark,
/area/mine/eva)
-"xke" = (
-/obj/effect/turf_decal/trimline/dark_red/filled/warning{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"xkn" = (
/obj/structure/railing{
dir = 1
@@ -82197,13 +83071,6 @@
dir = 9
},
/area/station/security/prison/workout)
-"xkr" = (
-/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{
- dir = 4
- },
-/obj/structure/sign/poster/official/wtf_is_co2/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"xkv" = (
/obj/structure/sign/warning/cold_temp/directional/north,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -82216,6 +83083,12 @@
},
/turf/open/floor/iron/smooth,
/area/station/commons/storage/mining)
+"xkw" = (
+/obj/structure/table,
+/obj/effect/spawner/random/maintenance,
+/obj/item/flashlight/flare,
+/turf/open/floor/plating,
+/area/station/maintenance/aft/lesser)
"xkA" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
@@ -82336,6 +83209,31 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"xlP" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{
+ dir = 8
+ },
+/turf/open/floor/iron/textured_large,
+/area/station/engineering/atmos)
+"xlT" = (
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/machinery/door/firedoor/heavy,
+/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden/layer4{
+ dir = 1
+ },
+/obj/machinery/door/airlock/atmos/glass{
+ name = "Project Room Access"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos/project)
"xlY" = (
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 4
@@ -82454,13 +83352,6 @@
dir = 1
},
/area/station/hallway/primary/central)
-"xnE" = (
-/obj/machinery/duct,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/iron/dark/corner,
-/area/station/engineering/atmos)
"xnG" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth,
@@ -82506,6 +83397,14 @@
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/plating,
/area/station/ai/satellite/atmos)
+"xoC" = (
+/obj/effect/turf_decal/tile/yellow,
+/obj/machinery/light/directional/east,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/hallway/primary/aft)
"xpm" = (
/obj/structure/chair/comfy/beige{
dir = 8
@@ -82564,6 +83463,20 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/station/ai/satellite/atmos)
+"xpQ" = (
+/obj/structure/table,
+/obj/structure/sign/warning/no_smoking/directional/east,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/gloves/color/black,
+/obj/item/clothing/gloves/color/black,
+/obj/item/clothing/gloves/color/black,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/mask/gas,
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos)
"xpT" = (
/obj/effect/spawner/random/trash/mess,
/turf/open/floor/plating,
@@ -82627,21 +83540,18 @@
/obj/structure/cable,
/turf/open/floor/engine,
/area/station/science/xenobiology)
-"xqw" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Exfiltrate to Port"
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/structure/railing,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"xqy" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron,
/area/station/cargo/office)
+"xqB" = (
+/obj/structure/bed/dogbed,
+/obj/effect/decal/cleanable/insectguts,
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"xqH" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -82684,6 +83594,16 @@
},
/turf/open/floor/iron/white,
/area/station/medical/medbay/aft)
+"xrd" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Basement Output";
+ dir = 4
+ },
+/obj/machinery/light/small/directional/south,
+/obj/effect/turf_decal/box,
+/obj/structure/sign/warning/no_smoking/circle/directional/south,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos/hfr_room)
"xrf" = (
/obj/structure/railing,
/obj/structure/cable,
@@ -82739,6 +83659,18 @@
/obj/machinery/light/blacklight/directional/east,
/turf/open/floor/wood,
/area/station/service/library)
+"xsk" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 8
+ },
+/obj/machinery/portable_atmospherics/scrubber/huge/movable,
+/turf/open/floor/iron/showroomfloor,
+/area/station/engineering/atmos)
+"xsH" = (
+/obj/structure/bookcase/random/reference,
+/turf/open/floor/iron/grimy,
+/area/station/maintenance/aft/lesser)
"xtc" = (
/obj/effect/turf_decal/trimline/blue/filled/warning{
dir = 1
@@ -82869,15 +83801,6 @@
dir = 1
},
/area/mine/living_quarters)
-"xuJ" = (
-/obj/effect/turf_decal/box/corners{
- dir = 4
- },
-/obj/effect/turf_decal/box/corners{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/station/engineering/atmos/hfr_room)
"xuL" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -82886,6 +83809,12 @@
/obj/effect/spawner/random/structure/steam_vent,
/turf/open/floor/plating,
/area/station/maintenance/fore)
+"xuN" = (
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/siding/yellow/corner,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"xuR" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{
dir = 4
@@ -82909,19 +83838,6 @@
/obj/structure/sign/warning/cold_temp/directional/north,
/turf/open/openspace/icemoon/keep_below,
/area/station/maintenance/port/lesser)
-"xvj" = (
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
- dir = 5
- },
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"xvk" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -83003,12 +83919,6 @@
/obj/structure/sign/departments/botany/directional/north,
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
-"xvU" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/sign/warning/electric_shock/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"xvX" = (
/obj/effect/spawner/random/maintenance,
/turf/open/floor/iron/smooth_large,
@@ -83017,11 +83927,6 @@
/obj/machinery/space_heater,
/turf/open/floor/plating,
/area/station/maintenance/central/greater)
-"xwc" = (
-/obj/effect/landmark/blobstart,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"xwf" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -83117,6 +84022,15 @@
/obj/structure/cable,
/turf/open/floor/iron/dark/textured_edge,
/area/station/security/prison)
+"xwW" = (
+/obj/machinery/door/airlock/atmos/glass{
+ name = "Distribution Loop"
+ },
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
+/obj/machinery/door/firedoor/heavy,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/pumproom)
"xxd" = (
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 1
@@ -83146,13 +84060,6 @@
dir = 8
},
/area/station/medical/chem_storage)
-"xxs" = (
-/obj/effect/turf_decal/bot_white,
-/obj/structure/reagent_dispensers/plumbed,
-/obj/effect/turf_decal/siding/yellow/corner,
-/obj/item/radio/intercom/directional/south,
-/turf/open/floor/iron/large,
-/area/station/engineering/atmos)
"xxv" = (
/obj/effect/turf_decal/arrows,
/obj/effect/turf_decal/stripes/line{
@@ -83168,13 +84075,6 @@
/obj/structure/cable,
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"xxC" = (
-/obj/effect/turf_decal/trimline/yellow/filled/shrink_ccw,
-/obj/machinery/camera/directional/south{
- c_tag = "Atmospherics - HFR South"
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"xxI" = (
/obj/machinery/airalarm/directional/north,
/obj/item/kirbyplants/random,
@@ -83204,25 +84104,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/security/detectives_office)
-"xyn" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobiomain";
- name = "Containment Blast Door"
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/obj/structure/cable,
-/obj/machinery/button/door/directional/east{
- id = "xenobio11";
- name = "Xenobio Pen 11 Blast DOors";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"xyr" = (
/obj/effect/turf_decal/weather/snow/corner{
dir = 10
@@ -83287,16 +84168,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"xyT" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
- dir = 10
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"xza" = (
/obj/vehicle/ridden/wheelchair{
dir = 4
@@ -83336,6 +84207,14 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/entry)
+"xzr" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "Atmospherics Blast Door"
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/department/medical/central)
"xzs" = (
/obj/structure/table/reinforced,
/obj/item/storage/medkit/regular,
@@ -83346,12 +84225,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"xzO" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/random/maintenance/three,
-/obj/structure/closet/crate,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/morgue)
"xAa" = (
/obj/structure/cable,
/turf/open/floor/iron/dark,
@@ -83368,6 +84241,21 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/mine/laborcamp)
+"xAu" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/bot,
+/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
+ dir = 8
+ },
+/turf/open/floor/iron/dark/textured,
+/area/station/engineering/atmos/project)
+"xAx" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/station/maintenance/disposal/incinerator)
"xAy" = (
/obj/effect/turf_decal/tile/neutral/opposingcorners,
/obj/effect/turf_decal/tile/brown/opposingcorners{
@@ -83444,6 +84332,12 @@
},
/turf/open/floor/iron/dark,
/area/station/service/chapel)
+"xBv" = (
+/obj/machinery/camera/directional/west{
+ c_tag = "Atmospherics - O2"
+ },
+/turf/open/floor/engine/o2,
+/area/station/engineering/atmos)
"xBL" = (
/obj/machinery/camera/directional/north{
c_tag = "Solar Maintenance - North East Access"
@@ -83640,13 +84534,6 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
-"xDG" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/station/engineering/atmos)
"xDK" = (
/obj/effect/turf_decal/stripes/white/line,
/obj/effect/decal/cleanable/dirt,
@@ -83754,12 +84641,6 @@
/obj/structure/closet/wardrobe/miner,
/turf/open/floor/iron,
/area/station/cargo/miningdock)
-"xFf" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/obj/machinery/light/directional/east,
-/turf/open/floor/iron,
-/area/station/maintenance/disposal/incinerator)
"xFj" = (
/obj/machinery/door/firedoor{
dir = 8
@@ -83865,13 +84746,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/science/server)
-"xGI" = (
-/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"xGK" = (
/obj/machinery/computer/mecha{
dir = 1
@@ -83890,15 +84764,6 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
-"xGM" = (
-/obj/machinery/computer/atmos_control/carbon_tank{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow/half/contrasted{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"xGX" = (
/obj/machinery/door/airlock/public/glass{
name = "Trial Transfer"
@@ -84045,6 +84910,13 @@
},
/turf/open/floor/iron/white,
/area/station/medical/medbay/aft)
+"xIX" = (
+/obj/structure/cable,
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/project)
"xJj" = (
/turf/open/floor/iron,
/area/station/science/xenobiology)
@@ -84057,19 +84929,16 @@
},
/turf/open/floor/engine/xenobio,
/area/station/science/xenobiology)
+"xJq" = (
+/obj/effect/turf_decal/siding/wideplating,
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"xJv" = (
/obj/structure/rack,
/obj/item/screwdriver,
/obj/effect/spawner/random/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/aft/greater)
-"xJw" = (
-/obj/machinery/camera/directional/south{
- c_tag = "Atmospherics Project Room"
- },
-/obj/effect/turf_decal/tile/yellow/opposingcorners,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/project)
"xJD" = (
/obj/effect/decal/cleanable/generic,
/obj/effect/turf_decal/tile/yellow/opposingcorners,
@@ -84079,18 +84948,6 @@
/obj/machinery/light/directional/east,
/turf/open/openspace,
/area/station/science/xenobiology)
-"xJH" = (
-/obj/machinery/button/door/directional/east{
- id = "Atmospherics HFR Shutters";
- name = "Atmospherics HFR Shutters";
- req_access = list("atmospherics")
- },
-/obj/effect/turf_decal/trimline/yellow/filled/shrink_ccw{
- dir = 4
- },
-/obj/machinery/light/directional/east,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/hfr_room)
"xJJ" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -84169,42 +85026,9 @@
dir = 5
},
/area/station/security/prison/safe)
-"xKx" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/railing/corner/end/flip,
-/obj/structure/railing/corner/end{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/station/maintenance/aft/greater)
"xKJ" = (
/turf/closed/wall,
/area/station/command/meeting_room)
-"xKU" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden,
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/machinery/firealarm/directional/east{
- pixel_y = 16
- },
-/turf/open/floor/iron/dark/corner,
-/area/station/engineering/atmos)
-"xKX" = (
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 9
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"xKY" = (
/obj/effect/turf_decal/bot,
/obj/effect/landmark/secequipment,
@@ -84222,6 +85046,10 @@
},
/turf/open/floor/iron,
/area/station/cargo/miningdock)
+"xLf" = (
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/engine/co2,
+/area/station/engineering/atmos)
"xLq" = (
/turf/open/floor/glass/reinforced,
/area/station/science/ordnance/office)
@@ -84291,14 +85119,6 @@
/obj/item/gun/syringe,
/turf/open/floor/iron/dark/smooth_large,
/area/station/medical/storage)
-"xMh" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
-/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/engineering/atmos)
"xMn" = (
/obj/structure/window/reinforced/spawner/directional/south,
/obj/machinery/holopad,
@@ -84422,6 +85242,25 @@
/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
+"xOr" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 9
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/blue/corner_long{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
+"xOu" = (
+/obj/structure/closet/firecloset,
+/obj/effect/turf_decal/tile/purple/opposingcorners,
+/turf/open/floor/iron/smooth,
+/area/station/maintenance/aft/lesser)
"xOQ" = (
/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -84432,6 +85271,12 @@
},
/turf/open/floor/iron/textured,
/area/station/service/hydroponics)
+"xPn" = (
+/obj/machinery/pipedispenser,
+/obj/effect/turf_decal/bot_white,
+/obj/structure/sign/poster/official/moth_piping/directional/east,
+/turf/open/floor/iron/smooth_large,
+/area/station/engineering/atmos)
"xPs" = (
/obj/effect/mapping_helpers/airlock/access/all/science/general,
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
@@ -84676,6 +85521,12 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/starboard/upper)
+"xTF" = (
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/iron/stairs/medium{
+ dir = 4
+ },
+/area/station/engineering/atmos/hfr_room)
"xTL" = (
/obj/effect/turf_decal/tile/blue,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -84823,24 +85674,6 @@
},
/turf/open/floor/iron,
/area/station/cargo/miningdock)
-"xUV" = (
-/obj/machinery/portable_atmospherics/canister,
-/obj/effect/turf_decal/bot,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/obj/machinery/light/directional/west,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
-"xUW" = (
-/obj/effect/spawner/random/trash/mess,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/mapping_helpers/broken_floor,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/station/maintenance/aft/greater)
"xUX" = (
/obj/structure/chair,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -84875,6 +85708,10 @@
},
/turf/open/floor/engine,
/area/station/science/ordnance/burnchamber)
+"xVD" = (
+/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
+/turf/open/floor/plating/snowed/icemoon,
+/area/icemoon/surface/outdoors/less_spawns)
"xVE" = (
/obj/machinery/light_switch/directional/south{
pixel_y = -24;
@@ -85009,18 +85846,6 @@
},
/turf/open/floor/iron/cafeteria,
/area/station/commons/dorms/laundry)
-"xXf" = (
-/obj/machinery/portable_atmospherics/pump,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/iron/white/corner{
- dir = 1
- },
-/area/station/engineering/atmos/storage/gas)
"xXk" = (
/obj/effect/turf_decal/weather/snow/corner{
dir = 4
@@ -85039,13 +85864,6 @@
},
/turf/open/floor/iron,
/area/mine/laborcamp/security)
-"xXz" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 4;
- name = "External to Filter"
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"xXH" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/brown,
@@ -85053,12 +85871,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/commons/storage/mining)
-"xXK" = (
-/obj/machinery/atmospherics/components/binary/pressure_valve/on{
- name = "Waste Release"
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"xXR" = (
/obj/structure/cable,
/obj/machinery/door/airlock/security/glass{
@@ -85087,10 +85899,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/less_spawns)
-"xYw" = (
-/obj/structure/flora/bush/leavy/style_random,
-/turf/open/floor/grass,
-/area/station/maintenance/starboard/aft)
"xYy" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/chair/stool/directional/south,
@@ -85118,6 +85926,14 @@
/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
+"xYR" = (
+/obj/machinery/atmospherics/components/unary/passive_vent{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable,
+/turf/open/floor/iron/freezer,
+/area/station/science/xenobiology)
"xYS" = (
/obj/machinery/door/firedoor/border_only{
dir = 8
@@ -85153,14 +85969,6 @@
},
/turf/open/floor/iron/dark/smooth_large,
/area/station/engineering/main)
-"xZy" = (
-/obj/structure/stairs/east,
-/obj/effect/turf_decal/trimline/neutral/line,
-/obj/effect/turf_decal/trimline/neutral/line{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/mix)
"xZA" = (
/turf/open/floor/iron/checker,
/area/station/science/lab)
@@ -85280,6 +86088,12 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/disposal)
+"yaW" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
+ dir = 10
+ },
+/turf/open/floor/plating/snowed/coldroom,
+/area/station/maintenance/aft/lesser)
"yba" = (
/obj/structure/fence/corner{
dir = 2
@@ -85318,11 +86132,6 @@
"ybv" = (
/turf/closed/wall/r_wall,
/area/station/ai/upload/chamber)
-"yby" = (
-/obj/structure/bed/dogbed,
-/obj/effect/decal/cleanable/insectguts,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"ybC" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 9
@@ -85460,13 +86269,6 @@
},
/turf/open/floor/iron,
/area/station/engineering/lobby)
-"ydh" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table_frame,
-/obj/item/melee/baton/security/cattleprod,
-/obj/effect/spawner/random/maintenance,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/aft)
"ydk" = (
/obj/machinery/computer/security/mining,
/obj/effect/turf_decal/tile/brown/anticorner/contrasted,
@@ -85495,13 +86297,6 @@
"ydI" = (
/turf/closed/wall/r_wall,
/area/station/hallway/secondary/entry)
-"ydN" = (
-/obj/machinery/atmospherics/pipe/smart/simple/green/visible,
-/obj/effect/turf_decal/tile/red/anticorner/contrasted{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
"yef" = (
/obj/effect/spawner/random/trash/moisture_trap,
/obj/structure/sign/poster/contraband/random/directional/east,
@@ -85593,12 +86388,6 @@
/obj/structure/sign/nanotrasen/directional/north,
/turf/open/lava/plasma/ice_moon,
/area/icemoon/underground/explored)
-"yfz" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"yfF" = (
/obj/structure/flora/grass/green/style_random,
/obj/structure/flora/bush/sparsegrass/style_random,
@@ -85610,12 +86399,6 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"ygd" = (
-/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
- dir = 4
- },
-/turf/open/floor/plating/snowed/icemoon,
-/area/icemoon/surface/outdoors/less_spawns)
"ygf" = (
/obj/structure/bookcase{
name = "Forbidden Knowledge"
@@ -85626,6 +86409,19 @@
},
/turf/open/floor/engine/cult,
/area/station/service/library)
+"ygg" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Air to External"
+ },
+/obj/effect/turf_decal/trimline/blue/arrow_cw{
+ dir = 2
+ },
+/obj/effect/turf_decal/box/white{
+ color = "#00FFFF"
+ },
+/turf/open/floor/iron,
+/area/station/engineering/atmos)
"ygk" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -85633,9 +86429,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"ygl" = (
-/turf/open/floor/plating,
-/area/station/engineering/atmos)
"ygm" = (
/obj/structure/closet/emcloset,
/obj/structure/sign/warning/electric_shock/directional/south,
@@ -85663,6 +86456,16 @@
},
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
+"ygI" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 1
+ },
+/obj/machinery/firealarm/directional/east,
+/turf/open/floor/iron/dark/corner,
+/area/station/engineering/atmos/pumproom)
"ygL" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/spawner/random/structure/crate,
@@ -85701,13 +86504,6 @@
/obj/machinery/firealarm/directional/west,
/turf/open/openspace,
/area/station/security/brig)
-"yhn" = (
-/obj/structure/rack,
-/obj/item/crowbar,
-/obj/item/picket_sign,
-/obj/structure/sign/poster/random/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/aft/lesser)
"yhw" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -85742,10 +86538,27 @@
/obj/machinery/power/apc/auto_name/directional/east,
/turf/open/floor/iron/showroomfloor,
/area/station/security/prison/toilet)
-"yiv" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/iron,
-/area/station/engineering/atmos)
+"yik" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/atmospherics/components/binary/valve{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/white{
+ color = "#008000"
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/project)
+"yis" = (
+/obj/machinery/atmospherics/pipe/multiz/dark/visible/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/multiz/pink/visible/layer2{
+ dir = 8;
+ name = "Basement Input"
+ },
+/obj/effect/turf_decal/box/red,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/engineering/atmos/hfr_room)
"yiD" = (
/obj/effect/turf_decal/stripes/line,
/obj/effect/decal/cleanable/dirt,
@@ -85888,20 +86701,6 @@
/obj/structure/window/reinforced/spawner/directional/west,
/turf/open/floor/iron/dark/textured,
/area/station/security/prison/workout)
-"ylM" = (
-/obj/machinery/light/directional/south,
-/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/dark_green/arrow_ccw,
-/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"ylS" = (
/obj/machinery/light/cold/dim/directional/west,
/turf/open/floor/iron/kitchen_coldroom/freezerfloor,
@@ -122604,8 +123403,8 @@ oSU
oSU
oSU
oSU
-oSU
-oSU
+szG
+szG
oSU
oSU
oSU
@@ -122859,12 +123658,12 @@ oSU
oSU
oSU
oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
+szG
+szG
+szG
+szG
+szG
+szG
oSU
oSU
oSU
@@ -123115,13 +123914,13 @@ oSU
oSU
oSU
oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
+szG
+szG
+ghx
+ghx
+ghx
+ghx
+ghx
oSU
oSU
oSU
@@ -123372,15 +124171,15 @@ oSU
oSU
oSU
oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
+szG
+ghx
+ghx
+ghx
+ghx
+ghx
+ghx
+ghx
+ghx
oSU
oSU
oSU
@@ -123628,16 +124427,16 @@ oSU
oSU
oSU
oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
+szG
+szG
+ghx
+ghx
+ghx
+ghx
+ghx
+ghx
+ghx
+ghx
oSU
oSU
oSU
@@ -123885,17 +124684,17 @@ oSU
oSU
oSU
oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
+szG
+szG
+ghx
+ghx
+ghx
+ghx
+ghx
+ghx
+ghx
+ghx
+ghx
oSU
oSU
oSU
@@ -124142,17 +124941,17 @@ oSU
oSU
oSU
oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
+szG
+szG
+iDt
+ghx
+ghx
+ghx
+ghx
+ghx
+ghx
+ghx
+ghx
oSU
oSU
oSU
@@ -124400,15 +125199,15 @@ oSU
oSU
oSU
oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
+szG
+iDt
+iDt
+ghx
+ghx
+ghx
+ghx
+ghx
+ghx
oSU
oSU
oSU
@@ -124657,14 +125456,14 @@ oSU
oSU
oSU
oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
-oSU
+szG
+iDt
+iDt
+iDt
+iDt
+iDt
+iDt
+iDt
oSU
oSU
oSU
@@ -124916,10 +125715,10 @@ oSU
oSU
szG
szG
-oSU
-oSU
-oSU
-oSU
+iDt
+iDt
+iDt
+iDt
oSU
oSU
oSU
@@ -125174,7 +125973,7 @@ szG
szG
szG
szG
-oSU
+iDt
oSU
oSU
oSU
@@ -171335,15 +172134,15 @@ thA
thA
thA
thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
+fIt
+cek
+cek
+uCN
+cek
+cek
+cek
+fIt
+sGw
thA
thA
thA
@@ -171592,15 +172391,15 @@ xMq
xMq
xMq
xMq
-fIt
-cek
-cek
-uCN
-cek
-cek
-cek
-fIt
-sGw
+iDt
+iDt
+iDt
+iDt
+iDt
+iDt
+iDt
+iDt
+thA
thA
thA
thA
@@ -171851,10 +172650,10 @@ iDt
iDt
iDt
iDt
-iDt
-iDt
-iDt
-iDt
+nDE
+nDE
+nDE
+nDE
iDt
iDt
gjq
@@ -172109,8 +172908,8 @@ gBX
hPs
hPs
nDE
-nDE
-nDE
+jLm
+gUE
nDE
nDE
nDE
@@ -172366,8 +173165,8 @@ jHF
xPV
jlF
jNf
-dpC
-cGQ
+vaS
+bHT
txX
nmr
hVY
@@ -172623,7 +173422,7 @@ jWn
wSz
nFU
jNf
-cWq
+cRW
tau
cPE
cPE
@@ -180346,7 +181145,7 @@ pNm
pNm
bBx
pNm
-tFp
+wjJ
uIC
pNm
tpH
@@ -182209,7 +183008,7 @@ thA
thA
thA
mep
-kVI
+jAl
qck
lkz
mep
@@ -182997,9 +183796,9 @@ xrL
jJI
tiJ
uSA
-ayC
-ayC
-ayC
+lTv
+lTv
+lTv
pAT
oWy
xTa
@@ -183237,7 +184036,7 @@ mLf
gjq
mep
nFN
-sSF
+qck
nBj
qck
nxM
@@ -183497,7 +184296,7 @@ imi
nJd
lUN
qck
-eJI
+gOn
nxM
xMq
xMq
@@ -183754,7 +184553,7 @@ qck
owG
owG
qoM
-qvM
+upa
nxM
xMq
xMq
@@ -184011,7 +184810,7 @@ oji
bvS
bbv
qck
-kxe
+lvj
nxM
nxM
nxM
@@ -184527,9 +185326,9 @@ hjM
tai
hjM
hjM
+jtR
+nFN
dpq
-ekq
-njO
nxM
pBW
mep
@@ -185559,7 +186358,7 @@ oex
oex
oex
nxM
-aRn
+pgJ
nxM
iDt
xMq
@@ -185574,8 +186373,8 @@ thA
thA
thA
thA
-tjo
-tjo
+thA
+thA
tjo
tjo
tjo
@@ -185830,10 +186629,10 @@ thA
thA
thA
thA
-tjo
-tjo
-tjo
-tjo
+thA
+thA
+thA
+thA
tjo
tjo
tjo
@@ -186078,7 +186877,12 @@ nxM
nxM
nxM
nxM
-xMq
+nxM
+thA
+thA
+thA
+thA
+thA
thA
thA
thA
@@ -186165,13 +186969,8 @@ tjo
tjo
tjo
tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-"}
-(136,1,2) = {"
+"}
+(136,1,2) = {"
tjo
tjo
tjo
@@ -186298,7 +187097,7 @@ rds
xQi
exw
xMq
-mJz
+psb
xMq
scw
iDt
@@ -186334,9 +187133,8 @@ xnK
pNZ
rQG
jJV
+njO
nxM
-xMq
-xMq
thA
thA
thA
@@ -186344,12 +187142,13 @@ thA
thA
thA
thA
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
+thA
+thA
+thA
+thA
+thA
+thA
+thA
tjo
tjo
tjo
@@ -186591,9 +187390,8 @@ feD
nxM
nxM
pBW
+bHF
nxM
-xMq
-xMq
thA
thA
thA
@@ -186609,8 +187407,9 @@ thA
thA
thA
thA
-tjo
-tjo
+thA
+thA
+thA
tjo
tjo
tjo
@@ -186845,12 +187644,15 @@ bFm
rNz
lKs
dqL
-bHF
+jqZ
eos
jol
nxM
-xMq
-xMq
+nxM
+thA
+thA
+thA
+thA
thA
thA
thA
@@ -186867,9 +187669,6 @@ thA
thA
thA
thA
-tjo
-tjo
-tjo
tjo
tjo
tjo
@@ -187098,18 +187897,22 @@ pHD
qMz
hjM
gHP
-uBP
+kmV
rig
nxM
nxM
nxM
nxM
aRn
-hjM
-rgE
-rgE
-rgE
-rgE
+iio
+nxM
+thA
+thA
+thA
+thA
+thA
+thA
+thA
thA
thA
thA
@@ -187125,10 +187928,6 @@ thA
thA
thA
thA
-tjo
-tjo
-tjo
-tjo
tjo
tjo
tjo
@@ -187355,17 +188154,18 @@ pHD
qMz
hjM
gmO
-sBJ
+cPn
kzv
nxM
-bYY
-cDh
-iyQ
-qfD
-fwI
-sCQ
-lNy
-mPH
+tEM
+kRL
+rQG
+tZf
+xUe
+hjM
+rgE
+rgE
+rgE
rgE
thA
thA
@@ -187383,10 +188183,9 @@ thA
thA
thA
thA
-tjo
-tjo
-tjo
-tjo
+thA
+thA
+thA
tjo
tjo
tjo
@@ -187615,14 +188414,15 @@ nxM
nxM
nxM
nxM
-biU
+pBW
nxM
nxM
nJd
hjM
-iYd
-tVA
-oiO
+hjM
+bVI
+bVI
+bVI
rgE
thA
thA
@@ -187641,10 +188441,9 @@ thA
thA
thA
thA
-tjo
-tjo
-tjo
-tjo
+thA
+thA
+thA
tjo
tjo
tjo
@@ -187872,15 +188671,15 @@ ycY
rQG
rQG
rQG
-qJh
+tMR
nxM
-mco
-upa
+rxK
+owG
+qqv
hjM
-fjg
-rxx
-nCD
-rgE
+dIr
+pVT
+xTF
rgE
rgE
rgE
@@ -188129,32 +188928,32 @@ qmK
nxM
lAA
nxM
-jpT
+oIL
nxM
-qqv
-xzO
-hjM
-hjM
+eiA
+qck
+imR
hjM
-kWW
-rkN
-ijp
-phS
-kpG
-uAi
-qST
-ngb
-wrE
-lKt
+fnw
+pmK
+fds
+eKi
+rbk
+eHf
+sOG
+ely
+gHB
+tht
+iXB
rgE
thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
+kHr
+kHr
+kHr
+kHr
+kHr
+kHr
+kHr
thA
thA
thA
@@ -188386,32 +189185,32 @@ lAA
nxM
scw
ilN
-vIZ
+lRl
nxM
-iXK
-kmM
-sYU
-iio
+nxM
+oiT
+hjM
hjM
-pbk
-ioO
-cfl
-bGa
-bGa
-bGa
-bGa
-bGa
-bGa
-bRE
rgE
-thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
+rrC
+rgE
+rgE
+roM
+som
+som
+dne
+llB
+llB
+obP
+rgE
+rgE
+kHr
+lDi
+cUV
+ppW
+kyj
+kHJ
+kHr
thA
thA
thA
@@ -188643,33 +189442,33 @@ scw
deN
iDt
nxM
-vIZ
-vIZ
-vIZ
-rVi
-oiT
-xUe
-hjM
-bIV
-rWO
-irG
+dsL
+oHk
+csX
+kzi
+eUe
+dNu
+mjh
+rEC
+vKi
+cfA
+dey
cEs
-xgi
+rZj
bOo
xgi
pzs
-ljL
-hPO
-rgE
-thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
+sCs
+dqM
+mXq
+kHr
+wtz
+kGL
+oRX
+jJC
+yik
+tNp
+iDt
thA
thA
thA
@@ -188900,34 +189699,34 @@ iDt
iDt
scw
nxM
-myP
nxM
nxM
-uTK
-nxM
nxM
+uTK
+hjM
+hjM
hjM
hjM
-rkN
-hoT
+fLN
+sar
+sOy
mYJ
kyp
-sTi
-xuJ
+boR
+tAs
foW
-ljL
-iQF
-rgE
-thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
+sOy
+wDB
+fJE
+wkM
+xAu
+bph
+moe
+bph
+oUH
+kHr
+scw
+iDt
thA
thA
thA
@@ -189157,34 +189956,34 @@ iDt
iDt
xMq
nxM
-wEU
+xcJ
jtD
rBv
qHl
-hRX
+gUT
oiT
-smw
+nan
hjM
-gZT
-nVc
-uVj
-sZa
-wUR
+tdT
+fJN
+sOy
+hEn
+pum
+wsW
jVE
-vbd
-eoP
-xxC
-kHr
-kHr
-kHr
-kHr
+txa
+sOy
+hSR
+adM
+xlT
+sbv
+lwm
+nYg
+lwm
+gBD
kHr
-kHr
-kHr
-kHr
-kHr
-thA
-thA
+scw
+jAv
thA
thA
thA
@@ -189414,35 +190213,35 @@ xMq
xMq
xMq
nxM
-bvS
-vyI
+qck
+lFm
owG
sPG
cmQ
skJ
owG
hjM
-soM
-ljL
+sHx
+jql
+sOy
mYJ
oIN
mEO
-gax
+mrn
foW
-ljL
-ljL
-agY
-lub
-lub
-wbk
-ccg
-iZO
-taN
-seX
-kHr
-thA
-thA
-thA
+sOy
+wDB
+eDW
+acS
+sGG
+oMe
+xIX
+oMe
+sEp
+fEE
+aqF
+vOd
+iDt
thA
thA
thA
@@ -189679,28 +190478,28 @@ imH
nxM
aXP
hjM
-qJi
-ljL
+vmq
+qzm
+dbt
fFn
vmu
-kQY
+txY
vmu
ueV
-ljL
-ljL
-wHg
-lub
-dIl
-azB
-bbs
-bWK
-bWK
-xJw
+xcj
+cvl
+vXS
+ucb
+jpm
+fIv
+pZF
+fIv
+kLs
kHr
-thA
-thA
-thA
-thA
+gPi
+scw
+iDt
+iDt
thA
thA
thA
@@ -189922,7 +190721,7 @@ ffQ
xDb
clI
iDt
-tJl
+clh
iDt
xMq
xMq
@@ -189936,29 +190735,29 @@ lAA
nxM
chC
hjM
-eJx
-dXP
-ljL
-ljL
-ljL
-xJH
-kMv
-ljL
-ljL
-wHg
-lub
-pkY
-fiA
-ncl
-bWK
-bWK
-lub
-mSL
+vHV
+rgE
+ooE
+cwf
+cwf
+kOw
+dvr
+cwf
+laq
+wvI
+aPP
+wvI
+hNf
+hqJ
+fmK
+hqJ
+wvI
+wvI
+fcC
+wvI
+scw
+iDt
iDt
-thA
-thA
-thA
-thA
thA
thA
thA
@@ -190179,7 +190978,7 @@ hoM
xDb
xMq
iDt
-aKb
+rcY
gnX
iDt
iDt
@@ -190188,30 +190987,33 @@ xMq
xMq
xMq
gjq
-eJf
+gjq
gjq
ilN
qck
-hjM
+ilN
+dzI
rgE
+bAL
+eDW
+eDW
+xhp
rgE
-amg
-amg
-amg
-rkN
-sPV
-amg
-amg
-uBA
-fKr
-vjk
-one
-upV
-bWK
-bWK
-jKy
-mSL
-iDt
+nkn
+qGd
+wvI
+nlg
+fti
+fxX
+ldr
+drJ
+fhC
+lJw
+oyR
+rtj
+sjr
+cPc
+jVz
iDt
thA
thA
@@ -190220,9 +191022,6 @@ thA
thA
thA
thA
-thA
-thA
-thA
tjo
tjo
tjo
@@ -190445,34 +191244,34 @@ xMq
gjq
gjq
gjq
-sqW
+gjq
gjq
nxM
ueD
nxM
-qOx
-upH
-fTG
-hkp
-tnI
-qNx
-fmA
-ndH
-qWK
-oDn
-aiJ
-jPo
-byH
-bos
-bWK
-bWK
-neu
-hjR
-uEf
-iDt
-iDt
-iDt
-iDt
+tQP
+kFs
+fNR
+eDW
+ljL
+qOE
+rgE
+qey
+lDZ
+wvI
+cbx
+xAx
+tlc
+nDq
+rmM
+aim
+nDq
+kdC
+iUj
+wvI
+rnp
+wvI
+jAv
thA
thA
thA
@@ -190700,36 +191499,36 @@ scw
iDt
psb
pFv
-eJf
-eJf
-eJf
+gjq
+gjq
+gjq
eJf
eJf
myZ
eJf
-ccZ
-vNI
-tOy
-uRV
-wCK
-iOZ
-jgl
-nmL
-rIF
-uBA
-rFI
-rZE
-bWK
-rZE
-bWK
-bWK
-lub
-kHr
-lbs
-iDt
-iDt
-iDt
-iDt
+eJf
+rgE
+bga
+qfe
+qHK
+xrd
+rgE
+ruH
+seM
+wvI
+aij
+beS
+ivE
+ldr
+drJ
+eEG
+ldr
+rSW
+fJB
+wvI
+fVE
+wvI
+scw
iDt
thA
thA
@@ -190963,31 +191762,31 @@ eJf
myZ
myZ
myZ
-myZ
-wvF
-kpC
-cmY
-vgM
-syn
-fDe
-fHQ
-nmL
-qpr
-wHg
-aiJ
-eDj
-rEx
-eDj
-bWK
-bWK
-lub
-kHr
-iDt
-hpx
+eJf
+gjq
+kFs
+yis
+kiM
+dpr
+fAK
+ffe
+ffe
+ffe
+ffe
+vzj
+beS
+imm
+pVO
+sJo
+aim
+ldr
+kdC
+bOP
+kiE
+fTB
+sjr
+scw
scw
-iDt
-iDt
-iDt
thA
thA
thA
@@ -191213,38 +192012,38 @@ thA
iDt
iDt
iDt
-eJf
myZ
+eJf
myZ
myZ
myZ
myZ
myZ
eJf
-eJf
-upH
-uuw
-boc
-eOB
-bpw
-lVw
-dDy
-nOS
-wHg
-aiJ
-slD
-tNi
-asM
-knX
-mFv
-rbY
+gjq
ffe
-alM
-alM
-wtM
-alM
-iDt
-thA
+ffe
+ffe
+ffe
+ffe
+ffe
+jgj
+xsH
+ffe
+ffe
+ffe
+jPD
+nDq
+drJ
+ixF
+xbx
+wvI
+twV
+wvI
+msn
+wvI
+wvI
+scw
thA
thA
thA
@@ -191468,38 +192267,40 @@ thA
thA
thA
thA
-thA
+scw
psb
-pFv
-eJf
-eJf
-eJf
+llz
+gjq
+gjq
+gjq
eJf
myZ
eJf
eJf
eJf
-kpC
-gWn
-vZo
-wxl
-lOa
-lVw
-jPu
-ffe
-ffe
-ffe
-ffe
-bnL
-ffe
-ffe
-ffe
-ffe
-ffe
-oxO
-alM
-vZM
alM
+pQl
+gQV
+kKF
+mBx
+syj
+syj
+syj
+fDq
+qfB
+ffe
+cRn
+kBE
+fKk
+kha
+mxp
+iDf
+lPI
+iDf
+nTn
+gIO
+wvI
+muk
iDt
thA
thA
@@ -191508,8 +192309,6 @@ thA
thA
thA
thA
-thA
-thA
tjo
tjo
tjo
@@ -191725,42 +192524,42 @@ thA
thA
thA
thA
-thA
-thA
-thA
-ppY
+eJf
+gjq
+eJf
+gjq
gjq
gjq
alM
gbL
alM
qOx
-eJf
-kpC
-awL
-xqw
-xZy
-lOa
-rtt
-dgZ
-ffe
-bPn
-pOV
-alM
-tRd
-oxO
-alM
-fWO
+gjq
alM
-aUT
+cSk
+jXR
+kKF
+lSN
+qzk
+syj
oxO
-alM
-ouU
-alM
-alM
-alM
-thA
-thA
+syj
+eHm
+ffe
+ieE
+irO
+djB
+klw
+ldr
+sQM
+lUF
+oKL
+elT
+mWl
+pKY
+wme
+scw
+iDt
thA
thA
thA
@@ -191982,39 +192781,39 @@ thA
thA
thA
thA
-thA
-thA
-thA
-thA
-thA
-thA
+uKa
+tGT
+aoF
+gjq
+gjq
+iDt
wCo
oxO
wCo
eJf
ppY
-upH
-cYi
-ngo
-naX
-ulm
-rtt
-rgB
-ffe
-nsp
-fWO
-tRd
-tRd
-nXO
-tRd
-tRd
-alM
alM
+qZE
+dhL
oxO
+syj
oxO
-oxO
-oxO
-fWO
+syj
+syj
+tcV
+mpt
+ffe
+ffe
+ffe
+ffe
+rBB
+ffe
+ffe
+hKW
+ffe
+ffe
+ffe
+ffe
alM
alM
pVH
@@ -192238,39 +193037,39 @@ xMq
thA
thA
thA
-thA
-thA
-thA
-thA
-thA
-thA
+iDt
+nxd
+eJf
+nxd
+gjq
+iDt
xMq
alM
jqc
alM
iDt
-ffe
-kpC
-awL
-sIA
-sIA
-sIA
-lVw
-jPu
-ffe
-oxO
alM
-tRd
alM
+nsX
+bWE
+kKF
+syj
+xdL
+syj
alM
-iry
-tRd
-lms
alM
-oxO
-iry
-dSX
-oxO
+alM
+alM
+tRJ
+alM
+tKl
+qDr
+aDm
+alM
+gSi
+ijO
+tKl
+alM
oxO
nsp
oyC
@@ -192489,46 +193288,46 @@ vjJ
bPE
ffe
ffe
-ffe
-ffe
+alM
+alM
xMq
xMq
thA
thA
-thA
-thA
-thA
-thA
+iDt
+nxd
+ppY
+nxd
xMq
xMq
xMq
alM
-ciU
+poV
alM
apB
-ffe
-sXb
-soF
-aSS
-isb
-dcE
-sXQ
-ckN
-ffe
-dcd
alM
-tRd
+tvI
+rkf
+lQW
+pJK
+lSN
+qzk
+syj
alM
-alM
-fuD
-fmf
-eEY
+dcd
+nsp
+tRd
+tRd
+oSI
+tRd
+vVb
+fVG
+nGN
+ueQ
+chL
oxO
-fWO
-jQi
-alM
-alM
-alM
+iry
+tKl
alM
pVH
pVH
@@ -192745,52 +193544,52 @@ ffe
ffe
ffe
ffe
-dOC
-nIb
-alM
-alM
+ooW
+wsh
alM
alM
alM
+bCJ
+bCJ
+bCJ
+avU
+bCJ
+avU
+bCJ
+bCJ
alM
-thA
-thA
-xMq
-xMq
-xMq
alM
+nsV
+uUg
+hgH
alM
+miy
+gIi
oxO
-dSX
-paF
-ffe
-ioz
-iMf
-hSZ
-rkt
-tCF
-jMY
-rUT
-ffe
+kKF
+syj
+kRu
+syj
alM
alM
+ugK
tRd
alM
alM
alM
-dSX
-bXf
+jXl
+vKz
alM
-nsp
-wsh
+tgC
+rsQ
alM
-thA
-thA
-thA
-thA
-thA
-thA
-thA
+alM
+oxO
+oxO
+cEJ
+sUr
+usl
+scw
thA
thA
thA
@@ -192998,42 +193797,41 @@ hjV
ezu
xDb
sEN
-ffe
-oxO
+euk
+alM
dcd
oxO
oxO
oxO
-jXl
-ipw
-dSX
-oxO
-wbf
alM
+oSJ
+vER
+bCJ
+nzJ
+trt
+yaW
+vYW
+eZH
+muS
+fUX
alM
+cqd
+ewc
+nsV
+dwx
alM
alM
+lxq
alM
alM
alM
-yhn
-eEY
-oxO
-dcd
-ffe
-tBq
-ffe
-ffe
-ffe
-ffe
-ffe
-ffe
-ffe
-oxO
+loR
+alM
+alM
+vbv
oxO
tRd
alM
-thA
alM
alM
alM
@@ -193041,13 +193839,14 @@ alM
alM
alM
alM
-thA
-thA
-thA
-thA
-thA
-thA
-thA
+alM
+alM
+alM
+alM
+alM
+alM
+alM
+ppY
thA
thA
thA
@@ -193255,36 +194054,36 @@ nKl
cgR
sWO
vRY
-ffe
-oxO
-oxO
-oxO
-oxO
-oxO
-nsp
-oxO
-oxO
-oxO
-oxO
-oxO
-iry
-jQi
-jVa
-oxO
+euk
+alM
oxO
oxO
oxO
oxO
-rUS
-tRd
-tRd
-hzo
-nPI
-nPI
-nPI
-nPI
-nPI
+sGL
+nsV
+oka
+vCN
+uSm
+gWD
+gWD
+tGg
+gWD
+uSm
+gWD
+vCN
+coQ
+hef
+cBs
+dqr
+nLj
+eWn
+nyJ
+nyJ
alM
+mPk
+ecr
+wOH
alM
alM
alM
@@ -193512,40 +194311,40 @@ ghx
ghx
ghx
wFe
+bCJ
+alM
+alM
+oxO
+oxO
ffe
ffe
ffe
-oxO
-oxO
-oxO
-oxO
-oxO
-oxO
-bPn
-oxO
-nsp
-oxO
-oxO
-oxO
-oxO
-oxO
-oxO
-oxO
-iry
-bPn
-oxO
-oxO
-oxO
-oxO
-fLh
-iry
-jXl
-bgs
-rlf
-nPI
-nPI
-nPI
-tRd
+ffe
+ffe
+ffe
+gWD
+gqi
+uGG
+mNe
+aBn
+vYM
+alM
+nsV
+nsV
+nsV
+nsV
+alM
+jQi
+sUk
+nyJ
+sxx
+nyJ
+eJv
+nyJ
+iFn
+wva
+nyJ
+lCR
alM
thA
thA
@@ -193562,10 +194361,10 @@ thA
thA
thA
thA
-tjo
-tjo
-tjo
-tjo
+thA
+thA
+thA
+thA
tjo
tjo
tjo
@@ -193775,9 +194574,15 @@ alM
oxO
ffe
ffe
+qCu
+bCI
+qCu
+qCu
ffe
ffe
+hkb
ffe
+hkb
ffe
ffe
ffe
@@ -193795,14 +194600,8 @@ ffe
ffe
ffe
ffe
-ffe
-ffe
-ffe
-ffe
-ffe
-ffe
-nPI
-dSX
+oWo
+lCR
alM
thA
thA
@@ -193816,12 +194615,12 @@ thA
thA
thA
thA
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
+thA
+thA
+thA
+thA
+thA
+thA
tjo
tjo
tjo
@@ -194034,13 +194833,13 @@ ffe
qCu
qCu
qCu
-oED
+qCu
qCu
qCu
qLY
-eGN
-lZX
-dPy
+ori
+tIz
+aGt
qLY
hOU
abe
@@ -194058,8 +194857,8 @@ cKA
mLO
abe
rnQ
-nPI
-wzg
+oxO
+lCR
alM
thA
thA
@@ -194288,35 +195087,35 @@ xMq
alM
oxO
ffe
-qCu
-qCu
+oAf
+sbP
qCu
pUX
qCu
qCu
qLY
-vfe
-tsa
-wHb
+ogA
+kdE
+xYR
qLY
eea
wFN
abe
-nFz
+cKA
wFN
abe
-nFz
+cKA
abe
abe
-nFz
+cKA
abe
abe
-nFz
+cKA
abe
abe
rnQ
-quW
-alM
+nCt
+lCR
alM
thA
thA
@@ -194545,7 +195344,7 @@ xMq
alM
oxO
ffe
-sbP
+qCu
qCu
qCu
eZA
@@ -194553,8 +195352,8 @@ qCu
qCu
qLY
tkP
-fPv
-jKI
+rHC
+aFq
qLY
giP
abe
@@ -194572,7 +195371,8 @@ gCo
abe
abe
rnQ
-nPI
+qZX
+knR
alM
thA
thA
@@ -194581,7 +195381,6 @@ thA
thA
thA
thA
-thA
tjo
tjo
tjo
@@ -194810,7 +195609,7 @@ qCu
qLY
qLY
qLY
-oXr
+exF
fma
qLY
dRX
@@ -194829,8 +195628,8 @@ obF
vPD
lqU
ffe
-xvU
-alM
+qof
+lCR
alM
thA
thA
@@ -195067,7 +195866,7 @@ cZT
cZT
pXj
qLY
-hRQ
+aAA
xti
qLY
hEW
@@ -195086,8 +195885,8 @@ maO
rJe
mGg
ffe
-nPI
-ipw
+uAa
+lCR
alM
thA
thA
@@ -195322,29 +196121,29 @@ mqe
hRC
euM
pMF
-sfv
-xyn
-oYD
wPd
-lVt
+pSO
+wPd
+wPd
+hSy
yfa
pMF
fZA
-mqL
+eup
pMF
bWU
-gvf
+mxb
mBP
vrw
-mmG
+bnX
pMF
hoa
-pXq
+wTD
pMF
mEW
rkl
-nPI
-lPv
+iWM
+lCR
alM
thA
thA
@@ -195579,7 +196378,7 @@ tUN
dtU
niy
gtF
-lqe
+wPd
qLY
cyh
cXX
@@ -195600,8 +196399,8 @@ mGg
odd
iER
ffe
-nPI
-aaq
+eIX
+nJk
alM
thA
thA
@@ -195836,7 +196635,7 @@ wPd
nWK
qWS
wPd
-fiq
+tfu
qLY
prH
bjn
@@ -195858,7 +196657,7 @@ hJi
oOh
ffe
gzJ
-tRd
+lCR
alM
thA
thA
@@ -196093,7 +196892,7 @@ cLP
iwQ
pMF
cBv
-iQM
+fEW
qLY
abe
abe
@@ -196114,8 +196913,8 @@ abe
abe
lfs
pjr
-nPI
-tRd
+jMp
+mEj
alM
thA
thA
@@ -196342,7 +197141,7 @@ iDt
iDt
iDt
alM
-jOp
+oxO
wVS
kte
vHq
@@ -196355,24 +197154,24 @@ qLY
eea
abe
gLj
-eea
+abe
wFN
gLj
-eea
+abe
abe
gLj
-eea
+abe
abe
gLj
-eea
+abe
abe
gLj
-eea
+abe
abe
abe
pjr
-vaj
-oxO
+cTn
+lCR
alM
thA
thA
@@ -196607,7 +197406,7 @@ ffe
ffe
pVj
qLY
-vgf
+gwe
qLY
abe
abe
@@ -196628,8 +197427,8 @@ abe
abe
wnB
pjr
-kRp
-oxO
+oHs
+lCR
alM
thA
thA
@@ -196855,7 +197654,7 @@ iDt
iDt
iDt
alM
-wOH
+gzO
oxO
oxO
oxO
@@ -196864,7 +197663,7 @@ nSK
ffe
ffe
ffe
-rbf
+iry
ffe
ffe
ffe
@@ -196885,8 +197684,8 @@ ffe
ffe
ffe
ffe
-kRp
-oxO
+xkw
+lCR
alM
thA
thA
@@ -197112,38 +197911,38 @@ iDt
iDt
iDt
alM
-dSX
+uaI
oxO
oxO
oxO
nyJ
-iWM
-wEL
-oxO
-oxO
oxO
+wEL
oxO
+aPs
oxO
oxO
oxO
+vHO
oxO
-lms
-iry
-cGu
oxO
+alM
jQi
+qSI
+dSX
iry
-rpa
-oxO
-nsp
-kce
-upK
+jsV
oxO
oxO
+bNh
+jZV
+rDV
+rSm
+iry
dcd
-oxO
-kRp
-rjV
+alM
+aPs
+lCR
alM
thA
thA
@@ -197370,11 +198169,11 @@ iDt
ppY
alM
alM
+iGC
alM
-alM
-moy
-tNJ
-tNJ
+vZM
+jtr
+jtr
nyJ
nyJ
nyJ
@@ -197384,23 +198183,23 @@ nyJ
nyJ
nyJ
nyJ
+sAf
nyJ
nyJ
nyJ
nyJ
nyJ
+fMi
nyJ
+gjB
nyJ
nyJ
+jCa
+rct
nyJ
+wva
nyJ
-nPI
-nPI
-nPI
-nPI
-nPI
-nPI
-gfu
+lCR
alM
thA
thA
@@ -197632,27 +198431,27 @@ uwR
vAx
oxO
oxO
-pvh
-oLa
-yfz
-oxO
-woH
-oxO
-oWo
-oxO
+tYj
+rHK
+vIM
+iLv
+mjT
+iLv
+vIM
+rHK
+vIM
+alM
oxO
+nsp
oxO
+sGL
oxO
oxO
+nsp
oxO
-ipw
oxO
oxO
-nsp
oxO
-iCq
-iry
-dSX
alM
alM
alM
@@ -197883,24 +198682,24 @@ qpH
iDt
ppY
alM
-dQl
+clB
ffe
ffe
ffe
ffe
gIl
ffe
-iry
-jXl
-oxO
-sKI
-iry
-qUL
-cma
-sGL
+iWw
+bfI
+iLv
+tkg
+azS
+lbx
+xOu
alM
alM
alM
+aYI
alM
alM
alM
@@ -198150,12 +198949,17 @@ ffe
ffe
ffe
ffe
-meH
+sku
ffe
ffe
ffe
ffe
ffe
+dOC
+tKl
+jMz
+alM
+thA
thA
thA
thA
@@ -198171,132 +198975,127 @@ thA
thA
thA
thA
-thA
-thA
-thA
-thA
-thA
-thA
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-"}
-(183,1,2) = {"
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-thA
-thA
-thA
-thA
-thA
-thA
-gjq
-gjq
-gjq
+thA
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+"}
+(183,1,2) = {"
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+thA
+thA
+thA
+thA
+thA
+thA
+gjq
+gjq
+gjq
thA
thA
thA
@@ -198413,10 +199212,10 @@ cAB
wQi
qlf
uIf
-thA
-thA
-thA
-thA
+rpa
+nsp
+fTa
+alM
thA
thA
thA
@@ -198670,10 +199469,10 @@ vqv
wQi
tEs
uIf
-thA
-thA
-thA
-thA
+qcg
+oxO
+alM
+alM
thA
thA
thA
@@ -198927,141 +199726,141 @@ vqv
qiN
pkP
uIf
-thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
-thA
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-"}
-(186,1,2) = {"
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-tjo
-thA
-thA
-thA
+alM
+alM
+alM
+thA
+thA
+thA
+thA
+thA
+thA
+thA
+thA
+thA
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+"}
+(186,1,2) = {"
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+tjo
+thA
+thA
+thA
thA
thA
thA
@@ -201489,7 +202288,7 @@ bgx
qWI
bgx
bgx
-pAc
+ePN
bgx
uIf
uIf
@@ -202513,7 +203312,7 @@ jCl
fXQ
vzD
vzD
-fXX
+uKy
vzD
vzD
rRN
@@ -242037,7 +242836,7 @@ sDl
sDl
sDl
hEI
-nFG
+vAi
sjp
rqk
ure
@@ -246205,15 +247004,15 @@ mJa
rWn
mHa
vmk
-rUY
-rWn
-rWn
-cLN
+wgy
+bkf
+bkf
+sWr
mFU
-cLN
-rWn
-rWn
-rbs
+fAn
+bkf
+bkf
+xoC
rWn
rWn
rWn
@@ -246463,13 +247262,13 @@ xVK
cvS
vWh
cvS
-xXf
-xXf
-skn
+rZH
+rZH
+eut
lHE
-frE
-obK
-npB
+lcz
+skK
+sft
gwK
jyR
jyR
@@ -246722,9 +247521,9 @@ gDp
kRP
oWl
vRS
-stD
+cdN
xGp
-eFd
+nHd
qeh
eBV
gwK
@@ -246977,11 +247776,11 @@ bmu
cvS
gDp
kRP
+vNL
ruo
-ruo
-mzE
+uMR
aZV
-qvW
+azd
gwK
wTC
hvS
@@ -247234,11 +248033,11 @@ arg
cvS
gDp
kRP
-sBK
+iaR
qKx
-aRR
+vWk
tRZ
-oyj
+kJZ
gwK
nEV
bry
@@ -247491,16 +248290,16 @@ vPk
cvS
gDp
kRP
-lyq
+hUm
xBN
-bfU
+oxy
aSu
-dBK
+smz
gwK
-jyR
-sok
+fXg
+vTz
gwK
-jyR
+fXg
bID
bID
fvA
@@ -247748,19 +248547,19 @@ lIQ
cvS
gDp
kRP
-uzf
+vEi
pcs
-bfU
+oxy
ecs
-jLl
-dfQ
-vbO
-fKI
-uvF
+lAr
+nbF
+wnH
+lVM
+uNT
gXf
mmH
uJC
-kmw
+kFd
yjG
psx
rSC
@@ -248006,23 +248805,23 @@ efQ
rSx
kRP
kRP
-uFV
-cAR
-kNk
-tmA
-bNE
-hht
-xKU
-xnE
-tvd
-egV
-pIJ
-xbg
-gnB
-cNx
-hKi
-oLL
-pZn
+jlU
+cWs
+maF
+gJv
+nTR
+qXo
+rHh
+gof
+nrt
+sVS
+joI
+eMZ
+wcB
+rls
+joc
+ihv
+duq
bBd
oJi
gyR
@@ -248268,18 +249067,18 @@ tjY
aMr
cwj
keP
-cRO
-guU
-ayq
-sdp
+cEw
+cFs
+wup
+cZi
bID
brQ
-bsg
-rfp
-lZP
-fEL
-sVC
-nJh
+cCa
+iOe
+oAp
+sTD
+cTe
+fTr
lCD
pNO
nFc
@@ -248518,17 +249317,17 @@ cvS
cvS
cvS
gDp
-qEm
+cGA
kRP
fiT
-kQf
-hDh
-gTQ
+ngp
+eBJ
+raD
keP
-qTa
-ctr
-avk
-gxP
+oVf
+bej
+usG
+bXn
bID
gcd
iaH
@@ -248775,17 +249574,17 @@ cvS
svV
kwX
gDp
-egp
+cGA
kRP
keP
-pJQ
-pJQ
-pJQ
+qif
+qif
+qif
keP
-vei
-bTx
-nvW
-xxs
+hNg
+bog
+gLk
+tFE
bID
bID
bID
@@ -249030,38 +249829,38 @@ cvS
cGA
cGA
pNq
-lBS
-aTp
+hRy
+gDp
lvB
kRP
-wpp
-rzj
-mRG
-bIU
-hOX
-xXz
-rAF
-nvW
-nSc
-qvQ
-fpJ
-qvQ
+uCy
+pXg
+hvj
+hvj
+sdz
+rKr
+ekY
+ygg
+dCp
+crg
+cot
+iFN
bID
-ejQ
+tfA
bID
-ejQ
+tfA
bID
-pqc
-djU
-ggK
-xXK
-pus
-qCB
-qwF
-qwF
-qwF
-qwF
-qwF
+rHX
+tzg
+sJF
+mvs
+kfs
+kDs
+kDs
+kDs
+kDs
+kDs
+kDs
aPD
cht
eiI
@@ -249287,37 +250086,37 @@ bOj
cHl
ipA
fsF
-mQG
+wuG
caZ
-tvJ
+abN
kRP
-pzC
-jAO
-pYg
-pYg
-eoD
-lQE
-aPk
-vxV
-jkS
-pzi
-pou
-sNu
-uAK
-wSo
-wSo
-vZt
-sUB
-rXe
-hHN
-bJD
-ydN
-rsW
-tQb
-xKd
-fJL
-mDX
-mDX
+uOu
+nXr
+ttX
+mQc
+fbV
+qGs
+vxY
+xiz
+jZq
+mLQ
+dQU
+tNU
+wiG
+umG
+waB
+waB
+qTz
+tBK
+lPw
+aDp
+uEi
+pus
+qCB
+qwF
+qwF
+qwF
+qwF
qwF
aPD
eiJ
@@ -249542,39 +250341,39 @@ jtE
ggr
cvS
cvS
-bRH
+sDU
caZ
-hgK
+sLx
caZ
rqN
btg
pGo
-uoE
-uoE
-vRW
-cvN
-sVL
-jlV
-hHN
+iHd
+iHd
+xjS
+jyt
+esm
+rZr
+nku
+ofD
+xuN
+dZP
+fYD
+mXc
+pCv
+fUx
+tpw
+aRc
hHN
-iRw
-vuf
-anI
-uop
-tHj
hHN
-wAB
-jkW
-laV
-hHN
-cDz
-tBL
-hpI
-kDs
-bea
-afp
-eWQ
-bEX
+awW
+rTj
+rsW
+tQb
+xKd
+fJL
+mDX
+hdS
qwF
aPD
daM
@@ -249801,37 +250600,37 @@ hcO
cvS
iGa
caZ
-vpR
+mhW
caZ
-sqN
+aTp
kRP
-fwO
-fwO
-njb
-ugR
-tTY
+xsk
+lZE
+lZE
+aAK
+pio
+lQa
+aRc
+bKn
hHN
-jlV
-hHN
-pkQ
-cEw
-cEw
cEw
+gHO
+eCK
+uKo
+rAE
+ijF
cEw
-cEw
-pvx
-fwq
+aRc
hHN
-lRR
-bpR
-skx
-gkY
-mIk
-wMe
-gqB
-hHV
-mDX
-mDX
+hHN
+rXb
+dRW
+hpI
+kDs
+bea
+afp
+eWQ
+bEX
qwF
aPD
noM
@@ -250056,39 +250855,39 @@ flx
dnq
aab
cvS
-sDU
-fgs
-hnd
-pNq
+qjz
+cGA
+bQJ
+euC
gDp
kRP
-bBW
-bBW
-bBW
-bBW
-tug
-bBW
-jlV
-aap
-dUv
+wvV
+lkv
+lkv
+wvV
+xwW
+wvV
+sgu
+gXa
+hHN
cEw
-rLs
-xUV
-rLs
cEw
-cmJ
-rwC
-tyb
-nrA
-flH
-lxu
-wQF
-qxo
-eVC
-qwF
-qwF
-qwF
-qwF
+oFE
+cEw
+oFE
+cEw
+cEw
+aRc
+hHN
+lRR
+skx
+rHB
+mIk
+wMe
+gqB
+hHV
+mDX
+mDX
qwF
aPD
aPD
@@ -250314,38 +251113,38 @@ dnq
tmr
cvS
sxu
-kwX
-pNq
-dvq
+qEm
+aXu
+gAY
gDp
-rxa
-qgm
-kdc
-mFt
-kdc
-vBv
-kjy
-grI
-ruI
-ubF
-vwj
-wwu
-kwm
-wwu
-ekh
-eVI
-gmJ
-npJ
-xGI
-mNF
-baQ
-cYC
-rsW
-tQb
-xKd
-jeh
-kcG
-kcG
+kRP
+gIW
+mSj
+htL
+qzR
+mMn
+tzb
+per
+bKn
+hHN
+obV
+jAE
+hHN
+kZO
+hHN
+kkd
+iTD
+nOy
+flH
+hCu
+lxu
+pek
+eWa
+eVC
+qwF
+qwF
+qwF
+qwF
qwF
wYJ
xfc
@@ -250572,37 +251371,37 @@ cvS
cvS
abU
cvS
-uiI
-qzF
+cvS
+cvS
gDp
-kRP
-kRJ
-gcV
+rxa
+fCS
+lOz
+cQX
jug
-lwi
-jco
-sTe
-jvS
-iSl
-gdv
-yiv
-tbh
-jTT
-tbh
-yiv
-vtv
-hHN
+aay
+euL
+lkv
+pzO
hHN
+bNx
+gwy
+gwy
+gwy
+gwy
+gwy
+ikD
+aRc
+jlV
nrA
-hQu
-cDz
-snW
-hpI
-kDs
-bea
-frD
-tln
-lMh
+pMg
+cYC
+rsW
+tQb
+xKd
+jeh
+kcG
+xBv
qwF
wYJ
wYJ
@@ -250828,38 +251627,38 @@ mOo
jPh
ljD
azf
-cGA
-cGA
-cvS
+fNs
+caZ
+avf
gDp
-boQ
-lgW
-drh
-nGG
-fER
-nSD
-uID
-vBC
-goE
-ubF
-mxj
-fcN
-lxU
-fcN
-fcN
-nBG
-uub
-kYi
-rBQ
-ssh
-skx
-kqS
-mIk
-wMe
-gqB
-smL
-kcG
-kcG
+kRP
+iNe
+jug
+jug
+jug
+jug
+epU
+lkv
+bKn
+hHN
+xJq
+mBZ
+mBZ
+mBZ
+mBZ
+mBZ
+veq
+aRc
+jlV
+nrA
+rXb
+snW
+hpI
+kDs
+bea
+frD
+tln
+lMh
qwF
wYJ
kDs
@@ -251085,38 +251884,38 @@ vTc
vTc
vTc
vTc
-yby
-vnY
+cvS
+cvS
cvS
sqN
kRP
-rKv
-tyS
-whf
-sjk
-uht
-ehR
-gnw
-hHN
-pGf
-igx
-dFC
-dFC
-jBR
-fnA
+kmf
+jug
+voZ
+jug
+jug
+gnW
+wvV
+pyb
hHN
-lRR
-uYH
-shj
-qnO
-lxu
-ijK
-qxo
-eVC
-qwF
-qwF
-qwF
-qwF
+xJq
+mBZ
+mBZ
+mBZ
+mBZ
+mBZ
+veq
+aRc
+jlV
+rBQ
+skx
+kqS
+mIk
+wMe
+gqB
+dCX
+kcG
+kcG
qwF
wYJ
kDs
@@ -251342,38 +252141,38 @@ jaF
nCb
kWL
vTc
-hnd
-cQr
+ggF
+pNq
cvS
-udL
+gDp
kRP
-bIa
-jug
-aSe
-kFH
-aen
-hIA
-rBQ
-fQc
-fQc
-noY
-ruw
-fQc
-fQc
-fQc
-mvG
-shj
-uGy
+sVv
+lpF
+bba
+tyS
+vJy
+aMj
+lkv
+bKn
hHN
-cqO
-cfC
-fsQ
-cnq
-nqb
-aUS
-mTm
-sMg
-sMg
+xJq
+mBZ
+mBZ
+mBZ
+mBZ
+mBZ
+veq
+aRc
+rjy
+hCu
+lxu
+faB
+eWa
+eVC
+qwF
+qwF
+qwF
+qwF
qwF
aPD
nQr
@@ -251599,38 +252398,38 @@ oev
pQp
ohp
vTc
-pNq
+xqB
dXU
-pNq
+gdo
gDp
-kRP
-qjb
-tbb
-fqA
-dFp
-nJI
-hoV
-oyX
-bWy
-khe
-oSX
-oyX
-bWy
-cHm
-xfB
-oyX
-bWy
-jHQ
-xfB
-gBx
-qNF
-sEX
-hpI
-kDs
-bea
-kfa
-qCn
-tCB
+boQ
+dMs
+bPk
+hfP
+jug
+fpU
+nJs
+nfm
+pzO
+hHN
+qqn
+dKa
+dKa
+dKa
+dKa
+dKa
+oMg
+aRc
+mVX
+hCu
+cfC
+fsQ
+cnq
+nqb
+sPF
+mTm
+sMg
+alj
qwF
kDs
kDs
@@ -251820,7 +252619,7 @@ lgx
xay
lko
rxY
-ntE
+nzR
rhG
mdZ
mdZ
@@ -251858,36 +252657,36 @@ yiK
vTc
ghz
ktB
-nHY
+cvS
gDp
kRP
-qGC
-uEJ
-uxd
-nzy
-tKW
-hIA
-iXq
-hLS
-ifY
-oZL
-rxf
-sEF
-nom
+tnM
+nnm
+oqF
+ygI
+cWS
+ktm
+isN
+wIj
hHN
-meT
-xGM
-gHl
-flH
-afR
-ncJ
-kqq
-cnq
-nqb
-qQq
-uxx
-sMg
-sMg
+hHN
+hHN
+hHN
+hHN
+hHN
+hHN
+hHN
+nOy
+hHN
+nrA
+rXb
+sEX
+hpI
+kDs
+bea
+kfa
+qCn
+tCB
qwF
kDs
kDs
@@ -252116,35 +252915,35 @@ lcA
kRP
kRP
kRP
-gDp
+sqN
kRP
wvV
-qyI
-buo
-tEZ
-oFW
-qIC
-eMr
-cnq
-nVe
-xMh
-eMr
-cnq
-nVe
-cnq
-eMr
-cnq
-rBo
-jYH
-kfs
-kfs
-oAl
-kfs
-kDs
-qwF
-qwF
-qwF
-qwF
+lkv
+lkv
+wvV
+iNh
+wvV
+rme
+pBn
+uzy
+ppo
+uzy
+uzy
+gBo
+uzy
+uzy
+ppo
+qlg
+uzy
+nvQ
+gQY
+lBX
+smV
+nqb
+sPF
+uxx
+sMg
+sMg
qwF
kDs
kDs
@@ -252374,40 +253173,40 @@ qyR
qyR
kRP
gDp
-cvS
-kDs
+kRP
+hdU
+dru
+dru
+gfN
+crg
+mql
+pGf
+tab
+paQ
+paQ
+oeQ
+paQ
+mBX
+paQ
+wgF
+paQ
+wJf
+igx
+nrA
+rXb
+tVg
+kfs
kDs
-pPy
+qwF
+qwF
+qwF
+qwF
+qwF
kDs
-vUr
kDs
-ygd
kDs
-vUr
-fLP
-mkG
-swu
-rwB
-swu
-mkG
-swu
-wfm
-nST
-lOI
-pGQ
-wgG
-uQy
-swu
-swu
-swu
-dvZ
-dvZ
-dvZ
-dvZ
-dvZ
-dvZ
-dvZ
-heE
+vbG
+qgn
utC
tkU
utC
@@ -252631,40 +253430,40 @@ wCI
qyR
kRP
gDp
-cvS
-kDs
-qwF
-koO
-bea
-xDG
-qwF
-jgn
-bea
-xDG
-qwF
-jgn
-bea
-xDG
-qwF
-jgn
-bea
-xDG
-qwF
-gtg
-cEw
-bCT
-kfs
+btg
+hSh
+slQ
+slQ
+tZU
+oyN
+mXP
+ksW
+wAV
+jAV
+gMr
kfs
+tyX
+tyX
+tyX
kfs
-bzq
-utC
-utC
-tkU
-utC
-tkU
-utC
-utC
-reh
+nXy
+mEf
+sJP
+pWt
+kht
+jGm
+uQy
+swu
+swu
+swu
+swu
+swu
+swu
+swu
+swu
+hbv
+aZZ
+uHj
xEn
tkU
utC
@@ -252888,38 +253687,38 @@ xfb
dpB
kRP
gDp
-cvS
+kRP
+uWU
+nnK
+xfe
+bif
+pGu
+nzt
+nzt
+xOr
+orl
+gAF
+pSb
+djU
+djU
+djU
+kjE
+omB
+stw
+aDN
+nrA
+rXb
+tVg
+kfs
kDs
qwF
-cOi
-oLK
-kgg
qwF
-pcr
-bXl
-fcQ
qwF
-rWp
-kXq
-qab
qwF
-xeM
-vtj
-rQN
qwF
-gtg
-hpI
-qAT
-kfs
-dtc
-kfs
+kDs
+kDs
bzq
-tkU
-utC
-utC
-utC
-utC
-tkU
utC
fuZ
utC
@@ -253144,39 +253943,39 @@ pBA
drH
tNz
kRP
-gDp
-cvS
-kDs
-qwF
-kdY
-qAQ
-qAQ
-qwF
-uIg
-eZc
-uIg
-qwF
-bzW
-eWj
-bzW
-qwF
-aOX
-aRj
+oaX
+kRP
+vtD
+xfS
+gZW
+xpQ
+lKm
+tNL
+xPn
+cnZ
+dni
+cII
+nyK
+dIO
+dIO
+dIO
+cyd
+phc
+bqC
+aDN
+nrA
+nYo
+unj
+rsW
+tQb
+xKd
+sRX
aOX
+nsm
qwF
-uUH
-vuu
-xvj
-rCW
-ygl
-fJe
kDs
-xXk
-xXk
-xXk
-xXk
-xXk
-xXk
+kDs
+kDs
xXk
sjh
xXk
@@ -253402,39 +254201,39 @@ qfE
vuR
kRP
gDp
-cvS
+kRP
+kRP
+xzr
+xzr
+kRP
+kRP
+kRP
+kRP
+kRP
+kRP
+pKi
+nyK
+dIO
+fmS
+dIO
+cyd
+vPt
+sIo
+aDN
+nrA
+rXb
+gXv
+hpI
kDs
-qwF
-qAQ
-uxK
-qAQ
-qwF
-uIg
-mjg
-uIg
-qwF
-bzW
-iTY
-bzW
-qwF
-aOX
-tsl
-aOX
+bea
+vtj
+aRj
+xLf
qwF
kDs
-hpI
-loV
-kfs
-kfs
-kfs
+kDs
bzq
utC
-utC
-tkU
-tkU
-utC
-utC
-utC
fuZ
utC
tkU
@@ -253659,39 +254458,39 @@ jbC
jbC
kRP
gDp
-cvS
-rsh
-qwF
-qwF
-qwF
-qwF
-qwF
-qwF
-qwF
-qwF
-qwF
-qwF
-qwF
-qwF
-qwF
-qwF
-qwF
-qwF
+caZ
+lQH
+dot
+qSy
+nBQ
+caZ
+cGA
+cGA
+fqi
+kRP
+hCL
+eXW
+luW
+kpC
+luW
+kpC
+rxw
+gnw
+aDN
+rBQ
+skx
+dIY
+mIk
+jZn
+gqB
+qeg
+aOX
+aOX
qwF
kDs
-hpI
-loV
-kfs
-kDs
kDs
bzq
utC
-tkU
-tkU
-utC
-utC
-tkU
-utC
reh
xEn
utC
@@ -253917,46 +254716,46 @@ hpp
kRP
gDp
cvS
+dKx
+lsH
+bDm
+dKx
+cvS
+cvS
+mLk
+cvS
+kRP
+qJE
+wAs
+gCM
+uRh
+gCM
+luW
+luW
+lPf
+bTu
+pUd
+rXb
+hHN
+kfs
kDs
+qwF
+qwF
+qwF
+qwF
+qwF
kDs
kDs
-kDs
-kDs
-kDs
-kDs
-kDs
-kDs
-kDs
-kDs
-kDs
-kDs
-kDs
-kDs
-kDs
-kDs
-kDs
-kDs
-hpI
-loV
-wvI
-wvI
-wvI
-wvI
-wvI
-pwF
-wvI
-wvI
-wvI
-pwF
-wvI
-vRK
-iOh
-iOh
-iOh
-iOh
-jpx
-jpx
-mgv
+bzq
+utC
+fuZ
+utC
+utC
+utC
+utC
+utC
+utC
+utC
utC
utC
tkU
@@ -254172,45 +254971,45 @@ wGE
rpM
vRo
cvS
-oaX
-cvS
-cvS
-cvS
-lvG
-lvG
-lvG
-cvS
-cvS
-lvG
-cvS
-tYZ
+gDp
+wKX
+gDp
+gDp
+gDp
+gDp
+wKX
+gDp
+gDp
+gDp
kRP
-wOn
-wOn
-wOn
-wOn
-wOn
-wOn
-wOn
-wOn
-wOn
-pzn
-wvI
-bBM
-mIE
-ldr
-hBE
-kJK
-iZr
-sHs
-jXr
-aLJ
-puf
-dyg
-haC
-haC
-haC
-fOU
+azU
+wvP
+eyX
+fbX
+eyX
+qmf
+kzo
+bFo
+aIJ
+rXA
+due
+jwB
+rsW
+tQb
+xKd
+aSE
+bzW
+osb
+qwF
+kDs
+kDs
+bzq
+utC
+fuZ
+utC
+utC
+utC
+utC
utC
utC
utC
@@ -254429,42 +255228,42 @@ mcp
rpM
uyO
cvS
-gDp
-gDp
-gDp
-gDp
-gDp
-gDp
-gDp
-gDp
-gDp
-gDp
+vsf
+cvS
+fuo
+uiI
+qzF
+cGA
cvS
-muX
+cGA
+fIK
+gDp
kRP
-fYY
-qwo
-sOd
-eUK
-ign
-ebr
-iJK
-ebr
-bzE
-dYI
-wvI
-wTB
-xke
-ldr
-vhT
-iLf
-icF
-gRI
-lwd
-mka
-wvI
-rnp
-wvI
+oCl
+cYn
+uEO
+wKP
+qxD
+qxD
+tpq
+kGY
+aIJ
+rXA
+rXb
+mwS
+hpI
+kDs
+bea
+kXq
+eWj
+gfs
+qwF
+kDs
+kDs
+bzq
+utC
+fuZ
+utC
utC
utC
utC
@@ -254693,35 +255492,35 @@ kRP
kRP
kRP
kRP
-vpR
-fIK
+jAo
+vVo
uep
-cvS
-lUU
kRP
-pSk
-pOy
-pOy
-njA
-sKW
-hGs
-vXv
-hGs
-gOY
-ylM
-wvI
-jWt
-cXV
-nDq
-etB
-swx
-ldr
-ldr
-rSW
-aHt
-wvI
-fVE
-wvI
+uSl
+qSN
+lIG
+eIH
+lIG
+qmf
+kzo
+bFo
+aIJ
+fTo
+skx
+jER
+mIk
+jZn
+gqB
+bjm
+bzW
+bzW
+qwF
+kDs
+kDs
+bzq
+utC
+fuZ
+utC
tkU
utC
fri
@@ -254950,35 +255749,35 @@ atb
gvX
uOg
kRP
-pAN
-iLE
+jAo
+kbO
uep
-vsZ
-hnd
kRP
-wCN
-don
-gJs
-gJs
-vZD
-ebr
-iJK
-ebr
-bzE
-pMq
-wvI
-bHu
-cAu
-xwc
-raA
-vRC
-nSw
-qUu
-imJ
-fvR
-kiE
-fTB
-pwF
+ifm
+vtV
+kbr
+pXs
+aVY
+luW
+luW
+cDe
+fCY
+lGA
+rXb
+hnE
+kfs
+kDs
+qwF
+qwF
+qwF
+qwF
+qwF
+kDs
+kDs
+bzq
+utC
+fuZ
+utC
tkU
tkU
utC
@@ -255210,33 +256009,33 @@ kRP
kRP
kRP
ybO
-hlp
-cGA
kRP
npD
npD
npD
npD
-hYH
-jzI
-sGH
-bPt
-fij
-oDh
-jaO
-jLQ
-wkW
-txE
-rfS
-drJ
-drJ
-mRr
-wvI
-fiu
-wvI
-msn
-wvI
-wvI
+npD
+npD
+jhc
+gnw
+aDN
+nrA
+qpC
+bEx
+rsW
+tQb
+xKd
+oSM
+uIg
+vBs
+qwF
+kDs
+kDs
+bzq
+utC
+fuZ
+utC
+utC
utC
utC
utC
@@ -255418,7 +256217,7 @@ gUa
uNN
kKL
rBz
-sSX
+oPZ
pns
cpY
vzH
@@ -255468,34 +256267,34 @@ xlh
hKY
uep
uep
-uep
-eRx
+gNT
+gNT
gNT
vng
-lme
-tiZ
-uuI
-wDg
-wDg
-rqD
-wDg
-edw
-wvI
-ksb
-xyT
-jvR
-fFC
-nnn
-iIs
-iDQ
-msN
-drK
-lyH
-isu
-lmy
-wvI
+phK
+npD
+hHN
+sfW
+aDN
+nrA
+rXb
+vVO
+hpI
+kDs
+bea
+bXl
+eZc
+whv
+qwF
+kDs
+kDs
+bzq
+utC
+fuZ
utC
utC
+fri
+utC
utC
utC
utC
@@ -255725,33 +256524,33 @@ wPX
cvS
cvS
cvS
-cvS
-cvS
sZF
-wIS
+sZF
+sZF
+hEy
wRr
-npD
-xfM
-uFM
-lmA
-oqc
-oAD
-xKX
-wvI
-oTT
-sCm
-xFf
-kdC
-kRw
-fUW
-jeR
-pMN
-mgD
-oKL
-elT
-kDc
-pKY
-tZa
+isV
+oKI
+sFy
+fCV
+adX
+skx
+kzS
+mIk
+jZn
+gqB
+hQp
+uIg
+uIg
+qwF
+kDs
+kDs
+bzq
+utC
+reh
+xEn
+utC
+utC
utC
utC
utC
@@ -255986,30 +256785,30 @@ llD
fDI
sZF
sZF
-wDK
-npD
-cbC
-nZH
-xbC
-dPj
-npD
-npD
-npD
-npD
-npD
-npD
-mdI
-npD
-npD
+wRr
npD
-wvI
-fTH
-wvI
-wvI
-wvI
-wvI
-vep
-wvI
+hmv
+mBZ
+aIJ
+xlP
+rXb
+obI
+kfs
+kDs
+qwF
+qwF
+qwF
+qwF
+qwF
+kDs
+kDs
+bzq
+utC
+fuZ
+utC
+utC
+utC
+utC
tkU
utC
utC
@@ -256245,26 +257044,26 @@ sZF
tKH
wRr
npD
-cmw
-nZH
-msT
-npD
-npD
-ouW
-aQj
-alq
-dFA
-sZF
-gTi
-emT
-wzv
-oCE
-gcT
-gcT
-fwx
-utC
+iOD
+mBZ
+aIJ
+aXB
+byC
+mJS
+pus
+kVo
+kVo
+kVo
+kVo
+kVo
+kVo
+kVo
+qCB
+bzq
utC
+fuZ
utC
+fri
utC
tkU
tkU
@@ -256500,26 +257299,26 @@ uFz
tFV
sZF
ecW
-fed
+qAm
npD
-bPY
-rwe
-wGO
-npD
-umD
-pgc
-dws
-dhR
-iye
-sZF
-xkr
-gTi
-cip
-oCE
-fwx
-tkU
+qin
+mBZ
+aIJ
+fhA
+rXb
+hHN
+kfs
+kDs
+qwF
+qwF
+qwF
+qwF
+qwF
+kDs
+kDs
+bzq
tkU
-fwx
+fuZ
utC
utC
utC
@@ -256756,29 +257555,32 @@ lGs
rfo
vzs
sZF
-sKf
+qIh
naF
npD
-ebr
-iJK
-ebr
-npD
-olM
-xUW
-sKf
-tbQ
-sKf
-sZF
-ddA
-sZF
-sZF
-sZF
-utC
-quy
-fri
+imv
+dKa
+fCY
+kQu
+iTC
+xeW
+rsW
+tQb
+xKd
+arC
+tsw
+iDZ
+qwF
+kDs
+kDs
+bzq
utC
+reh
+nMi
tkU
-tkU
+utC
+utC
+utC
utC
utC
utC
@@ -256787,13 +257589,10 @@ utC
jHS
gMp
gMp
+gMp
wDS
rbV
gMp
-gMp
-gMp
-eGT
-gMp
swF
swF
swF
@@ -257016,39 +257815,39 @@ sZF
akd
mlo
npD
-tMS
-iJK
-cpl
-npD
-fWL
-qHt
-iiB
-dFA
-nhO
-sZF
-awO
-vjZ
-tkU
-utC
-utC
-utC
-utC
+bFI
+hHN
+aDN
+hHN
+hHN
+uxn
+hpI
+kDs
+bea
+xeB
+tsw
+dkc
+qwF
+kDs
+kDs
+bzq
utC
+fuZ
utC
tkU
tkU
tkU
utC
utC
+fri
+utC
utC
+fri
reh
nTX
utC
-fwx
-utC
utC
utC
-fri
tkU
utC
utC
@@ -257270,46 +258069,46 @@ tMO
tMO
tMO
sZF
-nfF
+jgL
mlo
npD
-wPE
-iJK
-pyY
-npD
-okC
-waF
-jmY
-ptp
-iye
-sZF
-eZu
-vjZ
-tkU
-utC
-tkU
+dLp
+hHN
+pGf
+oCj
+hCT
+jcu
+cnN
+xVD
+kIB
+mlV
+tsw
+tsw
+qwF
+kDs
+kDs
+bzq
utC
+fuZ
utC
+fri
utC
utC
-iAf
-iAf
-iAf
-iAf
-iAf
utC
-bSz
utC
utC
utC
utC
utC
+bSz
utC
utC
+fri
utC
utC
utC
utC
+tkU
utC
utC
utC
@@ -257433,165 +258232,165 @@ txl
txl
txl
txl
-chb
-bln
-uei
-tmR
-uei
-bln
-uei
-tmR
-uei
-mQb
-uei
-tmR
-uei
-bln
-lBD
-bln
-kKL
-kKL
-kKL
-mMb
-kKL
-kKL
-kKL
-fsJ
-ekj
-nLY
-lli
-gAt
-kKL
-lIC
-lRZ
-pQa
-rOv
-fuf
-lli
-kDO
-wsk
-hVR
-lli
-obt
-xWM
-dku
-kKL
-nqn
-lHA
-ddi
-kKL
-tvZ
-kKL
-pdB
-oBD
-lqM
-aYk
-kKL
-vpx
-qEM
-bbM
-vBG
-vBG
-vBG
-eNH
-vBG
-oiX
-myn
-cgs
-bCf
-aWc
-nbW
-oyy
-amE
-wyj
-klc
-tLe
-ufN
-vCz
-ufN
-iZx
-dDw
-qHz
-ekE
-fzo
-fGY
-qaU
-jtH
-qpb
-mFE
-iZR
-nuN
-tMO
-hpB
-jDc
-tMO
-nMb
-sZF
-oGN
-wRr
-npD
-ebr
-hcG
-nZH
-npD
-vtr
-giv
-aQj
-dFA
-oMs
-sZF
-eZu
-vjZ
-utC
-utC
-tkU
-tkU
-utC
-utC
-utC
-iAf
-lTC
-qpR
-kLr
-iAf
-iAf
-iAf
-utC
-utC
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
+chb
+bln
+uei
+tmR
+uei
+bln
+uei
+tmR
+uei
+mQb
+uei
+tmR
+uei
+bln
+lBD
+bln
+kKL
+kKL
+kKL
+mMb
+kKL
+kKL
+kKL
+fsJ
+ekj
+nLY
+lli
+gAt
+kKL
+lIC
+lRZ
+pQa
+rOv
+fuf
+lli
+kDO
+wsk
+hVR
+lli
+obt
+xWM
+dku
+kKL
+nqn
+lHA
+ddi
+kKL
+tvZ
+kKL
+pdB
+oBD
+lqM
+aYk
+kKL
+vpx
+qEM
+bbM
+vBG
+vBG
+vBG
+eNH
+vBG
+oiX
+myn
+cgs
+bCf
+aWc
+nbW
+oyy
+amE
+wyj
+klc
+tLe
+ufN
+vCz
+ufN
+iZx
+dDw
+qHz
+ekE
+fzo
+fGY
+qaU
+jtH
+qpb
+mFE
+iZR
+nuN
+tMO
+hpB
+jDc
+tMO
+nMb
+sZF
+jgL
+wRr
+npD
+uBr
+nIp
+fxo
+fxo
+vyK
+oKe
+kfs
+kDs
+qwF
+qwF
+qwF
+qwF
+qwF
+kDs
+vbG
+gZd
+utC
+fuZ
+utC
+utC
+utC
+utC
+utC
+iAf
+iAf
+iAf
+iAf
+iAf
+iAf
+iAf
+utC
+utC
+utC
+tkU
+utC
+utC
+utC
+tkU
+utC
+utC
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
+txl
txl
txl
txl
@@ -257788,44 +258587,44 @@ uTV
fed
npD
npD
-nvh
+rif
+npD
+npD
+npD
npD
npD
sZF
-fzO
sZF
sZF
sZF
sZF
-eZu
-vjZ
-utC
-utC
-utC
+sZF
+sZF
+myY
+myY
+iQV
+vRK
utC
utC
utC
+fri
utC
iAf
-dTq
-qRk
-weR
-lQO
hJD
+lQO
+qpR
+mLK
+kLr
iAf
+utC
+utC
tkU
utC
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
+utC
+tkU
+utC
+utC
+utC
txl
txl
txl
@@ -258043,45 +258842,45 @@ jYy
sZF
jPi
fed
-nGv
-hQK
-eZu
-pGG
+jeA
+gAS
+vaN
+soe
sZF
-dlS
-pZZ
+mFj
+jgL
xpT
hEZ
sZF
-lGH
-eZu
-sZF
-sZF
+gCu
+hcU
+vjZ
+kOE
vjZ
-sZF
fwx
+fwx
+tkU
+utC
+utC
+utC
+utC
+tkU
utC
-xOk
-vYq
iAf
-tUh
-iNQ
-cmX
iAf
iAf
+dTq
+qRk
+weR
iAf
utC
+tkU
+utC
+tkU
+utC
+utC
+utC
utC
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
txl
txl
txl
@@ -258300,33 +259099,42 @@ vIe
sZF
gWh
wRr
-lMa
-frz
-dhv
-pZZ
-hLX
-pZZ
-pZZ
+taU
+ezW
+sun
+lQL
+kIj
+jgL
sKf
+jgL
eGK
sZF
-cXR
-aTc
-xpT
+sdu
+jgL
bdx
-sKf
+mUe
cmq
fwx
-utC
fwx
+fwx
+utC
+utC
+tkU
+utC
+utC
+utC
+xOk
vYq
-fWS
-weR
-jdJ
-xVO
-jAQ
+iAf
+tUh
+iNQ
+cmX
+iAf
+utC
+utC
tkU
utC
+tkU
utC
utC
txl
@@ -258371,15 +259179,6 @@ txl
txl
txl
txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
bln
bln
bln
@@ -258559,41 +259358,41 @@ hEZ
mlo
lCc
lRK
-xKx
-bHc
+jJS
+owR
sZF
sZF
+pSI
+pSI
sZF
sZF
+sKf
+sKf
sZF
sZF
-sVA
-sZF
-sZF
-sZF
-vjZ
sZF
fwx
+fwx
utC
-xOk
+utC
+tkU
+utC
+utC
+utC
+utC
+fwx
vYq
-iAf
-qPY
-tUh
+fWS
+weR
+jdJ
xVO
jAQ
-tkU
utC
utC
+tkU
+utC
+tkU
utC
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
txl
txl
txl
@@ -258795,13 +259594,13 @@ hkt
hkt
hkt
hkt
-pvo
-ptR
-hkt
+vHr
sWs
+hkt
sWs
sWs
sWs
+dHp
sWs
sWs
sWs
@@ -258818,39 +259617,39 @@ vwN
rzV
rzV
rzV
-vtO
+nmW
sWs
sWs
sWs
sWs
-skI
+vrL
osn
-nzN
-ktf
+wPY
+sKf
sZF
utC
tkU
tkU
utC
+fri
utC
utC
+fri
+utC
+utC
+xOk
+vYq
iAf
-iAf
+qPY
+tUh
+xVO
jAQ
-iAf
-iAf
utC
tkU
utC
utC
-txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
+utC
+utC
txl
txl
txl
@@ -259051,10 +259850,10 @@ kAC
hil
sKf
sKf
-wUA
-wUA
-wUA
-wUA
+sKf
+sKf
+sKf
+sKf
sKf
sKf
sKf
@@ -259076,11 +259875,11 @@ jgL
xpT
sKf
ktf
-mFj
sKf
-jgL
sKf
+jgL
sKf
+ktf
jgL
sYm
sKf
@@ -259094,9 +259893,16 @@ utC
utC
utC
utC
-bSz
+jHS
+iQV
+iQV
+iAf
+iAf
+jAQ
+iAf
+iAf
+tkU
tkU
-utC
tkU
utC
utC
@@ -259144,13 +259950,6 @@ txl
txl
txl
txl
-txl
-txl
-txl
-txl
-txl
-txl
-txl
bln
bln
bln
@@ -259340,7 +260139,7 @@ npD
sZF
sZF
oLn
-sKf
+jgL
vjZ
utC
utC
@@ -259355,13 +260154,13 @@ reh
tkU
fri
utC
+tkU
+tkU
+utC
+utC
+utC
utC
utC
-txl
-txl
-txl
-txl
-txl
txl
txl
txl
@@ -259613,10 +260412,10 @@ utC
utC
utC
utC
+tkU
+utC
+tkU
utC
-txl
-txl
-txl
txl
txl
txl
@@ -259871,7 +260670,7 @@ tkU
utC
utC
utC
-txl
+utC
txl
txl
txl
@@ -260111,7 +260910,7 @@ qLY
xSE
sZF
jCW
-fWF
+cRh
sZF
tkU
utC
@@ -260126,7 +260925,7 @@ wyi
utC
utC
utC
-utC
+tkU
utC
txl
txl
@@ -260881,7 +261680,7 @@ bcE
qLY
sEB
vjZ
-nNA
+cBb
sKf
vjZ
utC
@@ -261653,19 +262452,19 @@ qLY
xSE
sZF
cbf
-sKf
+jgL
sZF
tkU
tkU
utC
fri
utC
-vzD
-vzD
-vzD
-gQw
-gQw
-qpc
+utC
+utC
+utC
+utC
+bSz
+tkU
utC
fri
utC
@@ -261917,12 +262716,12 @@ fri
tkU
utC
utC
-vzD
-oIR
-vzD
-jCl
-kir
-bzq
+utC
+utC
+utC
+utC
+bSz
+fwx
fwx
utC
utC
@@ -262167,7 +262966,7 @@ jBh
bln
vjZ
wRr
-sKf
+jgL
vjZ
utC
tkU
@@ -262177,9 +262976,9 @@ utC
vzD
vzD
vzD
-kir
+gQw
vzD
-gZd
+qpc
tkU
utC
utC
@@ -262432,11 +263231,11 @@ utC
utC
utC
vzD
-ydh
-dFG
-uZc
-gQw
-tkU
+fJT
+jCl
+pOr
+kir
+bzq
utC
fwx
utC
@@ -262672,13 +263471,13 @@ iBO
xfp
agd
bgx
-buv
-jhC
-mWB
-tKz
+olH
+alo
+vhD
+uAJ
dmt
-jCl
-jCl
+ibj
+tKz
vzD
mVD
vzD
@@ -262689,11 +263488,11 @@ vzD
vzD
vzD
vzD
-uZc
-cDk
-sGZ
-gQw
-tkU
+vzD
+kir
+vzD
+vzD
+gZd
tkU
fwx
utC
@@ -262934,7 +263733,7 @@ jOj
jOj
iCE
eBz
-eBz
+lOm
eBz
eBz
fxV
@@ -262945,10 +263744,10 @@ egS
rEU
egS
rEU
-nNM
+vLt
gTq
-gTq
-fNa
+vBH
+rax
gQw
utC
tkU
@@ -263189,12 +263988,11 @@ xfK
qig
lpW
lpW
-vzS
+qHf
vzD
-bFq
jCl
-dGK
-vzD
+nuj
+rEU
vzD
vzD
vzD
@@ -263204,9 +264002,10 @@ vzD
vzD
vzD
vzD
+rIt
+gxE
+uZc
gQw
-gQw
-vzD
utC
fwx
utC
@@ -263443,27 +264242,27 @@ rqa
bgx
bgx
bgx
-kBi
+mfA
vzD
vzD
-lXi
+lCk
vzD
vzD
fxT
-jOj
+uPK
wsN
trT
ejL
kig
cAK
szD
-xYw
+qzn
sNs
-vzD
-bln
-bln
-bln
-bln
+iQT
+cYZ
+uZc
+fuA
+gQw
utC
fwx
utC
@@ -263702,12 +264501,12 @@ hWI
xxv
dOK
vzD
-puh
-lXi
+vHm
+lCk
tgq
vzD
-dFZ
-jOj
+jCl
+jCl
axu
vzD
pPB
@@ -263717,10 +264516,10 @@ too
mHw
bRz
vzD
-bln
-bln
-mQb
-bln
+vzD
+gQw
+gQw
+vzD
utC
tkU
fri
@@ -263959,13 +264758,13 @@ nBN
clY
fdH
vzD
-tKz
-lXi
+bFq
+lCk
jPY
vzD
-tgq
-jOj
-jOj
+nuj
+jCl
+jCl
vzD
cef
iTP
@@ -263974,10 +264773,10 @@ lEz
kPw
dAx
gQw
-mQb
-mQb
-uer
-mQb
+tkU
+tkU
+utC
+tkU
utC
utC
utC
@@ -264217,12 +265016,12 @@ xPI
jZY
vzD
vzD
-lXi
+lCk
vzD
vzD
vzD
vzD
-jOj
+nuj
vzD
daT
ftS
@@ -264231,10 +265030,10 @@ lbf
esF
bRz
gQw
-mQb
-bln
-bln
-bln
+tkU
+utC
+utC
+utC
utC
fwx
tkU
@@ -264473,13 +265272,13 @@ bgx
bgx
bgx
bgx
-uAJ
-lXi
+jCl
+lCk
vzD
utC
vzD
-vHm
-jOj
+jCl
+jCl
vzD
vzD
kqm
@@ -264488,10 +265287,10 @@ bRz
bRz
bVL
vzD
-bln
-fsm
-bln
-bln
+utC
+wNO
+fri
+utC
fri
utC
utC
@@ -264730,14 +265529,14 @@ ePu
rDZ
rDZ
bgx
-tgq
-lXi
+jCl
+lCk
gQw
utC
gQw
-jOj
-kWi
-qzT
+jCl
+bir
+dyo
vzD
vzD
gQw
@@ -264745,10 +265544,10 @@ gQw
gQw
vzD
vzD
-lSu
-bln
-bln
-bln
+fwx
+utC
+utC
+utC
fwx
utC
utC
@@ -264987,12 +265786,12 @@ rDZ
rDZ
jkH
bgx
-bFq
-lXi
+jCl
+lCk
gQw
utC
gQw
-vrO
+jCl
vzD
vzD
vzD
@@ -265006,7 +265805,7 @@ eRE
ujK
ujK
eRE
-wOq
+dop
eRE
ujK
ujK
@@ -265244,12 +266043,12 @@ mBk
rDZ
rDZ
bgx
-rPe
-lXi
+phD
+lCk
vzD
utC
vzD
-vrO
+jCl
vzD
bln
bln
@@ -265502,11 +266301,11 @@ bgx
bgx
bgx
vzD
-lXi
+lCk
vzD
vzD
vzD
-vrO
+jCl
vzD
bln
mQb
@@ -265759,11 +266558,11 @@ cJC
gqv
dty
vzD
-lXi
+lCk
iQT
+wvr
jCl
-jCl
-vpg
+nuj
gQw
bln
uer
@@ -266014,13 +266813,13 @@ rDZ
bgx
qUY
mUE
-juQ
+joH
vzD
geJ
-vrO
-vrO
-vrO
-vrO
+jCl
+jCl
+jCl
+jCl
gQw
mQb
ntK
@@ -266276,7 +267075,7 @@ vzD
geJ
iQT
bIt
-jPY
+rZa
pxQ
vzD
bln
@@ -266526,7 +267325,7 @@ rDZ
rDZ
rDZ
bgx
-vzb
+dtx
rEU
egS
mII
@@ -267029,7 +267828,7 @@ bgx
bgx
bgx
bgx
-ixK
+aXj
bgx
bgx
bgx
@@ -267275,13 +268074,13 @@ rpV
fTW
bwM
voW
-iJD
+cRI
clV
wmG
jLW
nkh
tLT
-tPK
+mtr
vqL
lEP
oEj
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 04e8f9adf255..ee2832357a34 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -243,6 +243,12 @@
/obj/structure/cable/layer3,
/turf/open/floor/engine,
/area/station/ai/satellite/interior)
+"acB" = (
+/obj/machinery/firealarm/directional/east,
+/obj/machinery/portable_atmospherics/canister/nitrogen,
+/obj/effect/turf_decal/box,
+/turf/open/floor/iron/dark,
+/area/station/science/ordnance/storage)
"acD" = (
/obj/effect/turf_decal/bot,
/obj/machinery/airalarm/directional/west,
@@ -420,6 +426,17 @@
},
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/rd)
+"aeQ" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/landmark/start/lawyer,
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/machinery/holopad,
+/turf/open/floor/wood,
+/area/station/service/lawoffice)
"aeS" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -792,7 +809,6 @@
/area/station/cargo/drone_bay)
"akH" = (
/obj/structure/cable,
-/obj/effect/turf_decal/tile/green/half/contrasted,
/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
dir = 5
},
@@ -890,6 +906,13 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"alP" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/space_heater,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard)
"alQ" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -1309,6 +1332,21 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
+"asz" = (
+/obj/effect/landmark/event_spawn,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/yellow/half/contrasted,
+/obj/effect/turf_decal/tile/blue,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/storage)
"asU" = (
/obj/structure/plaque/static_plaque/golden/commission/kilo,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -1421,6 +1459,13 @@
/obj/machinery/light/small/directional/north,
/turf/open/floor/plating,
/area/station/maintenance/department/crew_quarters/bar)
+"avg" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/red/half/contrasted,
+/obj/machinery/holopad/secure,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/station/security/office)
"avo" = (
/obj/structure/sign/warning/biohazard,
/turf/closed/wall/rust,
@@ -1927,7 +1972,7 @@
/area/space/nearstation)
"aDV" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/effect/turf_decal/stripes/corner{
+/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/plating/airless,
@@ -3122,6 +3167,21 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/security/processing)
+"aWF" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 8
+ },
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/showroomfloor,
+/area/station/command/heads_quarters/cmo)
"aWI" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -3150,24 +3210,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/security/checkpoint/customs)
-"aXJ" = (
-/obj/structure/table/reinforced,
-/obj/structure/desk_bell{
- pixel_x = -7;
- pixel_y = 8
- },
-/obj/item/food/grown/melonlike/watermelon,
-/obj/item/food/grown/wheat,
-/obj/item/food/grown/whitebeet,
-/obj/item/food/grown/apple,
-/obj/item/food/grown/tomato,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/window/right/directional/west{
- name = "Hydroponics Desk";
- req_access = list("hydroponics")
- },
-/turf/open/floor/iron,
-/area/station/service/hydroponics)
"aXS" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -3502,6 +3544,12 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/security/checkpoint/customs)
+"beB" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/closed/wall/r_wall/rust,
+/area/station/maintenance/disposal/incinerator)
"beK" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -4212,18 +4260,9 @@
/turf/open/floor/iron/dark,
/area/station/tcommsat/computer)
"bso" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- dir = 1;
- id = "ordnancestorage";
- name = "Ordnance Storage Shutters"
- },
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/door/firedoor/heavy,
-/obj/effect/turf_decal/tile/purple/half/contrasted{
- dir = 8
- },
-/turf/open/floor/iron/showroomfloor,
+/turf/closed/wall/r_wall,
/area/station/science/ordnance/storage)
"bsy" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -4361,12 +4400,6 @@
},
/turf/open/floor/iron/dark,
/area/station/security/processing)
-"buq" = (
-/obj/effect/turf_decal/tile/blue/half/contrasted,
-/obj/machinery/holopad,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/treatment_center)
"buJ" = (
/obj/structure/bed/dogbed/runtime,
/mob/living/basic/pet/cat/runtime,
@@ -4821,6 +4854,16 @@
},
/turf/open/floor/iron/showroomfloor,
/area/station/commons/toilet/restrooms)
+"bDW" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/obj/machinery/holopad,
+/turf/open/floor/carpet/red,
+/area/station/service/chapel)
"bEd" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 4;
@@ -5910,6 +5953,14 @@
},
/turf/open/floor/engine,
/area/station/ai/upload/chamber)
+"bYr" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/effect/spawner/random/maintenance/two,
+/obj/structure/rack,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard)
"bZg" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -6356,10 +6407,14 @@
/turf/closed/wall/r_wall/rust,
/area/station/ai/satellite/atmos)
"ceT" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
- },
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple/half/contrasted{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance/storage)
"ceW" = (
@@ -6595,13 +6650,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/security/checkpoint/engineering)
-"chT" = (
-/obj/effect/turf_decal/box/corners{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/dark,
-/area/station/cargo/warehouse)
"chV" = (
/obj/structure/cable/layer3,
/turf/closed/wall/rust,
@@ -6672,9 +6720,12 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/effect/turf_decal/tile/purple{
- dir = 8
+/obj/machinery/button/door/directional/south{
+ id = "ordnancestorage";
+ name = "Ordnance Storage Access";
+ req_access = list("ordnance")
},
+/obj/effect/turf_decal/tile/purple/half/contrasted,
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance)
"ciM" = (
@@ -6870,12 +6921,10 @@
/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
dir = 9
},
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
/obj/effect/turf_decal/tile/purple{
dir = 1
},
+/obj/machinery/meter,
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance)
"clz" = (
@@ -6915,7 +6964,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable,
/turf/open/floor/iron,
/area/station/cargo/warehouse)
"clX" = (
@@ -7213,20 +7261,6 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron,
/area/station/engineering/atmos/pumproom)
-"cqT" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/brown/anticorner/contrasted{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/structure/sign/poster/contraband/the_griffin/directional/north,
-/obj/structure/rack,
-/obj/machinery/camera/autoname/directional/west,
-/turf/open/floor/iron,
-/area/station/cargo/warehouse)
"crh" = (
/obj/structure/cable,
/obj/machinery/holopad/secure,
@@ -7792,16 +7826,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/command/bridge)
-"cCS" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/holopad,
-/turf/open/floor/carpet/red,
-/area/station/service/chapel)
"cDf" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -7831,6 +7855,10 @@
/obj/machinery/smartfridge/organ,
/turf/open/floor/iron/dark,
/area/station/medical/surgery/theatre)
+"cDS" = (
+/obj/effect/spawner/random/structure/crate,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard)
"cDZ" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/preopen{
@@ -8041,14 +8069,6 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/iron/showroomfloor,
/area/station/security/armory)
-"cHN" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/grille/broken,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"cHO" = (
/obj/structure/sign/poster/official/random/directional/south,
/obj/effect/spawner/structure/window,
@@ -8351,6 +8371,8 @@
req_access = list("ordnance")
},
/obj/effect/turf_decal/tile/purple/anticorner/contrasted,
+/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
+/obj/effect/turf_decal/box,
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance)
"cME" = (
@@ -8863,6 +8885,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/structure/cable,
/turf/open/floor/iron,
/area/station/cargo/storage)
"cXg" = (
@@ -9535,13 +9558,17 @@
"dif" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/tile/purple{
- dir = 1
+/obj/machinery/portable_atmospherics/canister/plasma,
+/obj/machinery/button/door/directional/north{
+ id = "ordnancestorage";
+ name = "Ordnance Storage Access";
+ req_access = list("ordnance")
},
-/obj/machinery/atmospherics/components/trinary/mixer{
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/turf/open/floor/iron/showroomfloor,
+/obj/effect/turf_decal/box,
+/turf/open/floor/engine,
/area/station/science/ordnance/storage)
"dij" = (
/obj/effect/decal/cleanable/dirt,
@@ -10060,6 +10087,11 @@
},
/turf/open/floor/iron/dark,
/area/station/maintenance/fore)
+"dpl" = (
+/obj/effect/turf_decal/bot,
+/obj/machinery/holopad,
+/turf/open/floor/iron,
+/area/station/engineering/main)
"dpw" = (
/obj/structure/chair,
/obj/effect/landmark/start/security_officer,
@@ -10152,8 +10184,10 @@
/turf/open/floor/iron,
/area/station/cargo/storage)
"dry" = (
-/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
-/obj/machinery/firealarm/directional/east,
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/structure/cable,
+/obj/machinery/portable_atmospherics/canister/nitrogen,
+/obj/effect/turf_decal/box,
/turf/open/floor/iron/dark,
/area/station/science/ordnance/storage)
"drC" = (
@@ -10345,6 +10379,11 @@
},
/turf/open/floor/iron,
/area/station/engineering/atmos)
+"duc" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/turf/open/floor/iron,
+/area/station/engineering/atmos/storage)
"dus" = (
/obj/effect/turf_decal/stripes/corner,
/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
@@ -11036,7 +11075,7 @@
/area/station/engineering/storage/tech)
"dHE" = (
/obj/structure/table/reinforced/plastitaniumglass,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/turf/open/floor/iron/dark,
/area/station/service/chapel/storage)
"dHG" = (
@@ -11107,6 +11146,13 @@
},
/turf/open/floor/iron,
/area/station/service/chapel/storage)
+"dJb" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/reagent_dispensers/watertank,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard)
"dJd" = (
/obj/effect/turf_decal/loading_area{
dir = 4
@@ -11911,8 +11957,8 @@
/obj/item/compact_remote,
/obj/item/controller,
/obj/item/integrated_circuit/loaded/speech_relay,
-/obj/item/mmi,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
+/obj/item/brain_processor/organic,
/obj/item/integrated_circuit/loaded/hello_world,
/turf/open/floor/iron/showroomfloor,
/area/station/engineering/circuit_workshop)
@@ -12279,17 +12325,6 @@
/obj/effect/mapping_helpers/airlock/access/any/engineering/general,
/turf/open/floor/iron/dark,
/area/station/engineering/circuit_workshop)
-"ear" = (
-/obj/effect/turf_decal/tile/blue/half/contrasted{
- dir = 4
- },
-/obj/machinery/computer/crew{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/paramedic)
"eba" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -12646,6 +12681,16 @@
},
/turf/open/floor/iron/showroomfloor,
/area/station/commons/storage/art)
+"egz" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/tile/brown/half/contrasted,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/cargo/miningoffice)
"egE" = (
/obj/item/radio/intercom/directional/north,
/turf/open/floor/engine/xenobio,
@@ -13034,6 +13079,9 @@
/area/station/service/chapel)
"emU" = (
/obj/machinery/door/poddoor/incinerator_atmos_aux,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/engine,
/area/station/maintenance/disposal/incinerator)
"emV" = (
@@ -13519,13 +13567,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/security/courtroom)
-"evD" = (
-/obj/effect/landmark/start/paramedic,
-/obj/machinery/duct,
-/obj/machinery/holopad,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/paramedic)
"evW" = (
/obj/structure/cable,
/obj/effect/landmark/start/hangover,
@@ -14938,11 +14979,6 @@
"eWP" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/port/fore)
-"eWS" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/showroomfloor,
-/area/station/science/ordnance)
"eWT" = (
/obj/machinery/camera/directional/west{
c_tag = "Xenobiology Cell 2";
@@ -15098,19 +15134,6 @@
},
/turf/open/floor/iron/showroomfloor,
/area/station/medical/medbay/lobby)
-"eYS" = (
-/obj/effect/turf_decal/tile/brown/half/contrasted{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/structure/rack,
-/obj/effect/spawner/random/food_or_drink/booze,
-/obj/effect/turf_decal/arrows,
-/obj/structure/extinguisher_cabinet/directional/west,
-/turf/open/floor/iron,
-/area/station/cargo/warehouse)
"eZa" = (
/obj/effect/turf_decal/stripes/corner{
dir = 8
@@ -15153,6 +15176,13 @@
/obj/structure/flora/grass/jungle/b/style_5,
/turf/open/misc/asteroid,
/area/space/nearstation)
+"eZV" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot_white,
+/turf/open/floor/iron/dark,
+/area/station/service/chapel/funeral)
"fac" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -15522,11 +15552,6 @@
},
/turf/open/floor/iron,
/area/station/engineering/atmos)
-"fhE" = (
-/obj/machinery/portable_atmospherics/canister/nitrogen,
-/obj/machinery/light/cold/directional/south,
-/turf/open/floor/iron/dark,
-/area/station/science/ordnance/storage)
"fhH" = (
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
@@ -15841,6 +15866,15 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
+"fmS" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/yellow/half/contrasted{
+ dir = 8
+ },
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/chemistry)
"fmV" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -16054,15 +16088,6 @@
/obj/effect/decal/cleanable/cobweb,
/turf/open/floor/plating,
/area/station/maintenance/department/bridge)
-"fpN" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/yellow/half/contrasted{
- dir = 8
- },
-/obj/machinery/holopad,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/chemistry)
"fpQ" = (
/obj/effect/turf_decal/loading_area{
dir = 8
@@ -16556,6 +16581,9 @@
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 5
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
/turf/open/floor/plating/airless,
/area/space/nearstation)
"fwJ" = (
@@ -16708,21 +16736,13 @@
/turf/open/floor/plating,
/area/station/maintenance/starboard)
"fyq" = (
-/obj/machinery/button/door/directional/north{
- id = "ordnancestorage";
- name = "Ordnance Storage Access";
- req_access = list("ordnance")
- },
/obj/machinery/firealarm/directional/north{
pixel_x = -32
},
-/obj/effect/turf_decal/tile/purple/half/contrasted{
- dir = 1
- },
-/obj/machinery/atmospherics/components/tank{
- dir = 4
- },
-/turf/open/floor/iron/showroomfloor,
+/obj/machinery/portable_atmospherics/canister/plasma,
+/obj/structure/sign/warning/no_smoking/circle/directional/north,
+/obj/effect/turf_decal/box,
+/turf/open/floor/engine,
/area/station/science/ordnance/storage)
"fyw" = (
/obj/effect/turf_decal/stripes/corner{
@@ -16940,6 +16960,10 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/command/heads_quarters/hop)
+"fBQ" = (
+/obj/machinery/atmospherics/components/tank/oxygen,
+/turf/open/floor/iron/dark,
+/area/station/science/ordnance/storage)
"fBV" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 4
@@ -17371,6 +17395,14 @@
/obj/effect/turf_decal/tile/purple/half/contrasted{
dir = 4
},
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = -1;
+ pixel_y = -11
+ },
+/obj/item/holosign_creator/atmos{
+ pixel_y = -7;
+ pixel_x = -8
+ },
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance)
"fIn" = (
@@ -17380,16 +17412,13 @@
/turf/open/misc/asteroid/airless,
/area/station/hallway/secondary/entry)
"fIu" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/obj/machinery/airalarm/directional/north,
-/obj/effect/turf_decal/tile/purple/half/contrasted{
- dir = 1
- },
/obj/machinery/atmospherics/components/binary/valve/digital{
dir = 4
},
+/obj/effect/turf_decal/tile/purple/anticorner/contrasted{
+ dir = 4
+ },
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance/storage)
"fIw" = (
@@ -17634,13 +17663,6 @@
/obj/machinery/power/port_gen/pacman/pre_loaded,
/turf/open/floor/plating,
/area/station/ai/satellite/maintenance/storage)
-"fLf" = (
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/red/half/contrasted,
-/obj/machinery/holopad/secure,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
-/area/station/security/office)
"fLh" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -17887,6 +17909,12 @@
dir = 4
},
/area/station/hallway/primary/fore)
+"fPo" = (
+/obj/effect/turf_decal/tile/blue/half/contrasted,
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/treatment_center)
"fPp" = (
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/stripes/line{
@@ -18039,16 +18067,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/aft)
-"fRf" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/brown/half/contrasted{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/station/cargo/warehouse)
"fRl" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -18267,13 +18285,6 @@
/obj/effect/turf_decal/tile/red/anticorner/contrasted,
/turf/open/floor/iron/showroomfloor,
/area/station/security/brig)
-"fUi" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"fUp" = (
/obj/machinery/chem_heater/withbuffer,
/obj/effect/decal/cleanable/dirt,
@@ -18559,10 +18570,10 @@
/turf/open/floor/iron/dark,
/area/station/service/chapel/funeral)
"gao" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/door/airlock/research{
name = "Testing Lab"
},
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
@@ -19134,13 +19145,6 @@
/obj/item/stock_parts/subspace/treatment,
/turf/open/floor/iron/dark,
/area/station/engineering/storage/tcomms)
-"giT" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard)
"gjv" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
@@ -20151,6 +20155,19 @@
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating,
/area/station/maintenance/port/lesser)
+"gzF" = (
+/obj/effect/turf_decal/tile/blue/anticorner/contrasted{
+ dir = 4
+ },
+/obj/structure/table/glass,
+/obj/structure/cable,
+/obj/structure/fireaxecabinet/jawsofrecovery/directional/east,
+/obj/item/surgicaldrill,
+/obj/item/toy/figure/paramedic,
+/obj/machinery/light/small/directional/north,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/paramedic)
"gAF" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -20467,6 +20484,7 @@
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 1
},
+/obj,
/turf/open/floor/iron/dark,
/area/station/science/lobby)
"gFn" = (
@@ -21933,13 +21951,6 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/station/hallway/primary/central/fore)
-"hdq" = (
-/obj/effect/turf_decal/box/corners{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/dark,
-/area/station/cargo/warehouse)
"hdy" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -23461,6 +23472,14 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/department/cargo)
+"hDc" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard)
"hDy" = (
/obj/structure/grille/broken,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -24431,6 +24450,21 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark,
/area/station/construction/mining/aux_base)
+"hRn" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/machinery/holopad/secure,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/showroomfloor,
+/area/station/security/lockers)
"hRo" = (
/obj/machinery/door/poddoor/preopen{
id = "transittube_ai";
@@ -24443,9 +24477,10 @@
/turf/open/floor/iron/dark,
/area/station/hallway/primary/central/fore)
"hRG" = (
-/obj/machinery/atmospherics/components/trinary/mixer{
- dir = 4
+/obj/effect/turf_decal/tile/purple/half/contrasted{
+ dir = 8
},
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance/storage)
"hRU" = (
@@ -25093,6 +25128,7 @@
/area/station/service/theater)
"iaX" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance)
"iaY" = (
@@ -25105,26 +25141,6 @@
},
/turf/open/floor/iron/dark,
/area/station/maintenance/port/aft)
-"ibd" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/left/directional/west{
- name = "Kitchen Service Desk";
- req_access = list("kitchen")
- },
-/obj/item/paper_bin{
- pixel_x = -4;
- pixel_y = 4
- },
-/obj/item/pen,
-/obj/item/storage/bag/plants,
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/trimline/green/corner,
-/obj/machinery/door/window/right/directional/east{
- name = "Kitchen Service Desk";
- req_access = list("hydroponics")
- },
-/turf/open/floor/iron,
-/area/station/service/kitchen)
"ibi" = (
/obj/machinery/biogenerator,
/obj/structure/railing{
@@ -25422,6 +25438,12 @@
},
/turf/open/floor/iron/showroomfloor,
/area/station/science/research)
+"ifs" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron,
+/area/station/security/office)
"ifw" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -26729,6 +26751,13 @@
/obj/machinery/duct,
/turf/open/floor/iron,
/area/station/engineering/atmos)
+"ixr" = (
+/obj/effect/landmark/start/paramedic,
+/obj/machinery/duct,
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/paramedic)
"ixx" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/landmark/event_spawn,
@@ -26754,6 +26783,7 @@
/area/station/command/heads_quarters/hop)
"iyd" = (
/obj/machinery/door/poddoor/incinerator_atmos_main,
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/engine,
/area/station/maintenance/disposal/incinerator)
"iyi" = (
@@ -30105,6 +30135,11 @@
},
/turf/open/floor/plating,
/area/station/maintenance/solars/starboard/fore)
+"jvN" = (
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/station/cargo/miningdock)
"jvR" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/turf_decal/stripes/line{
@@ -30170,7 +30205,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/caution/stand_clear,
/obj/effect/turf_decal/stripes/corner,
-/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/cargo/warehouse)
"jwB" = (
@@ -30308,21 +30342,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
-"jzB" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue/half/contrasted{
- dir = 8
- },
-/obj/machinery/holopad,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron/showroomfloor,
-/area/station/command/heads_quarters/cmo)
"jzF" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/sign/poster/contraband/random/directional/south,
@@ -30992,6 +31011,17 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron/dark,
/area/station/maintenance/port/aft)
+"jJI" = (
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/machinery/duct,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/paramedic)
"jJJ" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -31670,6 +31700,18 @@
/obj/structure/closet/firecloset,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
+"jUc" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/obj/machinery/duct,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/storage)
"jUi" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/power/apc/auto_name/directional/north,
@@ -31697,6 +31739,11 @@
},
/turf/open/floor/iron/showroomfloor,
/area/station/security/office)
+"jUS" = (
+/obj/machinery/light/cold/directional/south,
+/obj/machinery/atmospherics/components/tank/oxygen,
+/turf/open/floor/iron/dark,
+/area/station/science/ordnance/storage)
"jUU" = (
/turf/closed/wall/rust,
/area/station/medical/morgue)
@@ -31753,13 +31800,11 @@
/turf/open/floor/iron/showroomfloor,
/area/station/medical/psychology)
"jWs" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Cargo Maintenance"
- },
-/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/mapping_helpers/airlock/access/all/supply/general,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/starboard)
"jWu" = (
@@ -31874,17 +31919,10 @@
/turf/open/floor/plating,
/area/station/security/prison/garden)
"jYp" = (
-/obj/structure/table,
-/obj/item/storage/toolbox/mechanical{
- pixel_x = 3;
- pixel_y = -2
- },
-/obj/item/storage/toolbox/mechanical{
- pixel_x = -2;
- pixel_y = 8
- },
/obj/machinery/light_switch/directional/east,
-/obj/effect/turf_decal/tile/purple/half/contrasted,
+/obj/effect/turf_decal/tile/purple/half/contrasted{
+ dir = 4
+ },
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance/storage)
"jYq" = (
@@ -32023,17 +32061,6 @@
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating,
/area/station/maintenance/starboard)
-"kaX" = (
-/obj/machinery/door/airlock/mining/glass{
- name = "Mining Office"
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/tile/brown/half/contrasted,
-/obj/effect/mapping_helpers/airlock/access/all/supply/general,
-/turf/open/floor/iron/dark,
-/area/station/cargo/miningoffice)
"kbc" = (
/obj/structure/sign/poster/random/directional/north,
/obj/effect/spawner/random/structure/steam_vent,
@@ -32803,11 +32830,13 @@
/turf/open/floor/iron/smooth_large,
/area/station/engineering/atmos)
"kpH" = (
-/obj/effect/turf_decal/tile/red/half/contrasted,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 1
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 8
},
-/turf/open/floor/iron/showroomfloor,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/engine,
/area/station/science/ordnance/storage)
"kpI" = (
/obj/machinery/computer/operating{
@@ -32960,18 +32989,13 @@
/turf/open/floor/plating,
/area/station/maintenance/solars/port/aft)
"ksg" = (
-/obj/structure/table,
-/obj/item/pipe_dispenser{
- pixel_x = 3;
- pixel_y = 7
- },
-/obj/item/pipe_dispenser,
/obj/structure/cable,
/obj/machinery/air_sensor{
chamber_id = "ordnancegas2"
},
-/obj/effect/turf_decal/tile/purple/half/contrasted,
-/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible,
+/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{
+ dir = 4
+ },
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance/storage)
"ksp" = (
@@ -34117,16 +34141,11 @@
/turf/open/floor/iron/dark/corner,
/area/station/hallway/primary/central/fore)
"kMu" = (
+/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
dir = 4
},
-/obj/machinery/door/airlock/research{
- name = "Ordnance Lab"
- },
-/obj/machinery/door/firedoor/heavy,
-/obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage,
-/obj/machinery/meter,
-/turf/open/floor/iron/dark,
+/turf/open/floor/plating,
/area/station/science/ordnance/storage)
"kMw" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -34318,10 +34337,16 @@
"kOt" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 4
},
-/turf/open/floor/iron/showroomfloor,
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/machinery/portable_atmospherics/canister/plasma,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/box,
+/turf/open/floor/engine,
/area/station/science/ordnance/storage)
"kOw" = (
/obj/structure/sign/warning/biohazard,
@@ -35169,10 +35194,6 @@
},
/turf/open/floor/iron/dark,
/area/station/security/lockers)
-"lbG" = (
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"lbJ" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -36077,12 +36098,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/wood,
/area/station/command/heads_quarters/captain)
-"lrm" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 6
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"lrp" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -36393,17 +36408,6 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"lwW" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/effect/landmark/start/lawyer,
-/obj/effect/turf_decal/siding/wood,
-/obj/effect/turf_decal/siding/wood{
- dir = 1
- },
-/obj/machinery/holopad,
-/turf/open/floor/wood,
-/area/station/service/lawoffice)
"lwX" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/cable,
@@ -36757,8 +36761,8 @@
/obj/effect/turf_decal/tile/purple{
dir = 4
},
-/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{
- dir = 1
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 6
},
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance/storage)
@@ -37670,6 +37674,14 @@
},
/turf/open/floor/iron/dark,
/area/station/commons/fitness/recreation)
+"lQy" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/holopad,
+/turf/open/floor/wood,
+/area/station/command/heads_quarters/qm)
"lQB" = (
/obj/effect/turf_decal/stripes/corner,
/obj/effect/decal/cleanable/dirt,
@@ -37983,11 +37995,6 @@
},
/turf/open/floor/iron/showroomfloor,
/area/station/science/server)
-"lVT" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/neutral/half/contrasted,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"lWg" = (
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
@@ -38214,6 +38221,21 @@
},
/turf/open/floor/iron/dark,
/area/station/security/evidence)
+"lYO" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/brown/anticorner/contrasted{
+ dir = 4
+ },
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow,
+/turf/open/floor/iron,
+/area/station/cargo/warehouse)
"lYT" = (
/obj/machinery/door/firedoor,
/obj/structure/disposalpipe/segment{
@@ -38547,18 +38569,6 @@
},
/turf/open/floor/iron,
/area/station/security/brig)
-"mdJ" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/machinery/light/cold/directional/north,
-/obj/machinery/holopad/secure,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/engine,
-/area/station/tcommsat/computer)
"mdL" = (
/obj/structure/table,
/obj/machinery/recharger,
@@ -41605,13 +41615,6 @@
/obj/item/pickaxe,
/turf/open/misc/asteroid/airless,
/area/space/nearstation)
-"ncQ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/cargo/warehouse)
"ncS" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -41756,6 +41759,7 @@
/obj/effect/turf_decal/tile/purple/half/contrasted{
dir = 1
},
+/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance)
"nfR" = (
@@ -42010,6 +42014,20 @@
},
/turf/open/floor/iron/showroomfloor,
/area/station/science/genetics)
+"nlw" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/landmark/event_spawn,
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/structure/cable,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/station/command/heads_quarters/qm)
"nlz" = (
/obj/machinery/airalarm/directional/west,
/obj/effect/decal/cleanable/dirt,
@@ -42377,6 +42395,22 @@
/obj/structure/cable,
/turf/open/space/basic,
/area/space/nearstation)
+"nqY" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/obj/machinery/button/door/directional/south{
+ id = "morgueprivacy";
+ name = "Morgue Privacy Shutter";
+ pixel_x = -8
+ },
+/obj/machinery/light/small/directional/south,
+/obj/machinery/holopad,
+/obj/effect/turf_decal/box/white{
+ color = "#52B4E9"
+ },
+/turf/open/floor/iron/dark,
+/area/station/medical/morgue)
"nrb" = (
/obj/item/kirbyplants/organic/plant5,
/obj/structure/noticeboard/directional/east,
@@ -42420,6 +42454,9 @@
dir = 4
},
/obj/structure/sign/warning/hot_temp/directional/west,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
/turf/open/floor/plating/airless,
/area/space/nearstation)
"nrv" = (
@@ -42686,19 +42723,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
-"nvq" = (
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/holopad,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron/showroomfloor,
-/area/station/science/genetics)
"nvA" = (
/obj/machinery/suit_storage_unit/hos,
/obj/effect/turf_decal/delivery,
@@ -42838,6 +42862,8 @@
"nwP" = (
/obj/structure/window/reinforced/spawner/directional/east,
/obj/effect/turf_decal/tile/purple/anticorner/contrasted,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance)
"nwY" = (
@@ -43104,11 +43130,6 @@
/obj/structure/sign/warning/vacuum/external/directional/north,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit/departure_lounge)
-"nCo" = (
-/obj/machinery/holopad,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
-/area/station/cargo/miningdock)
"nCq" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -43222,7 +43243,7 @@
/obj/item/clothing/gloves/color/fyellow,
/obj/item/flashlight,
/obj/item/flashlight/flare,
-/obj/item/relic,
+/obj/item/assembly/relic,
/obj/structure/sign/poster/contraband/random/directional/west,
/obj/machinery/light/small/directional/south,
/turf/open/floor/plating,
@@ -43367,10 +43388,9 @@
/turf/open/floor/iron,
/area/station/cargo/storage)
"nGa" = (
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/structure/cable,
-/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
-/turf/open/floor/iron/dark,
+/obj/effect/turf_decal/tile/yellow/anticorner/contrasted,
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance/storage)
"nGt" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -43472,14 +43492,6 @@
/obj/effect/turf_decal/tile/neutral/opposingcorners,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
-"nIg" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard)
"nIh" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/grille/broken,
@@ -43707,6 +43719,15 @@
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating,
/area/station/maintenance/fore)
+"nLB" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/machinery/duct,
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/break_room)
"nLT" = (
/obj/docking_port/stationary/escape_pod{
dir = 2
@@ -44824,11 +44845,6 @@
/obj/structure/closet/firecloset,
/turf/open/floor/plating,
/area/station/maintenance/fore)
-"oiK" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/iron,
-/area/station/cargo/warehouse)
"oiL" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -45806,11 +45822,10 @@
/area/station/cargo/miningoffice)
"oCC" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/box/corners,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/dark,
+/turf/open/floor/iron,
/area/station/cargo/warehouse)
"oCE" = (
/obj/machinery/door/airlock{
@@ -46581,8 +46596,8 @@
/turf/open/floor/plating,
/area/station/maintenance/department/crew_quarters/bar)
"oRK" = (
-/obj/structure/chair/office/light,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/chair/office/light,
/obj/machinery/power/apc/auto_name/directional/east,
/obj/structure/cable,
/turf/open/floor/iron/dark,
@@ -47093,20 +47108,14 @@
/turf/open/floor/iron/dark,
/area/station/maintenance/starboard/fore)
"oXK" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/tile/brown/anticorner/contrasted{
- dir = 4
- },
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/iron,
-/area/station/cargo/warehouse)
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/structure/grille/broken,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard)
"oYc" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/grunge{
@@ -47663,11 +47672,6 @@
/obj/structure/sign/poster/contraband/red_rum,
/turf/closed/wall/rust,
/area/station/maintenance/port/greater)
-"pht" = (
-/obj/effect/turf_decal/bot,
-/obj/machinery/holopad,
-/turf/open/floor/iron,
-/area/station/engineering/main)
"phH" = (
/obj/structure/bodycontainer/morgue,
/obj/effect/turf_decal/bot_white,
@@ -47978,13 +47982,6 @@
},
/turf/open/floor/iron,
/area/station/command/bridge)
-"pkM" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/mapping_helpers/burnt_floor,
-/obj/structure/reagent_dispensers/watertank,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard)
"pkY" = (
/obj/effect/landmark/start/assistant,
/obj/effect/turf_decal/tile/purple{
@@ -48809,6 +48806,17 @@
/obj/machinery/duct,
/turf/open/floor/iron/showroomfloor,
/area/station/medical/surgery/theatre)
+"pwL" = (
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 4
+ },
+/obj/machinery/computer/crew{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/paramedic)
"pwT" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -48820,6 +48828,18 @@
"pxe" = (
/turf/closed/wall/mineral/plastitanium,
/area/station/maintenance/port/aft)
+"pxs" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/machinery/light/cold/directional/north,
+/obj/machinery/holopad/secure,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/engine,
+/area/station/tcommsat/computer)
"pxE" = (
/obj/structure/sign/warning/electric_shock,
/turf/closed/wall/r_wall,
@@ -50647,13 +50667,6 @@
/obj/effect/mapping_helpers/airlock/access/all/security/entrance,
/turf/open/floor/iron/dark,
/area/station/security/brig)
-"qby" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/holopad,
-/obj/effect/turf_decal/bot_white,
-/turf/open/floor/iron/dark,
-/area/station/service/chapel/funeral)
"qbA" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 1
@@ -50835,7 +50848,6 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/effect/turf_decal/tile/dark/half/contrasted,
/obj/machinery/atmospherics/components/binary/valve/digital{
dir = 4
},
@@ -51117,18 +51129,6 @@
},
/turf/open/floor/iron/dark/corner,
/area/station/hallway/primary/starboard)
-"qiH" = (
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 8
- },
-/obj/machinery/duct,
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage)
"qiM" = (
/obj/machinery/door/airlock/maintenance,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -53861,12 +53861,9 @@
/turf/open/floor/iron/dark,
/area/station/science)
"reo" = (
-/obj/machinery/camera/directional/south{
- c_tag = "Ordnance Storage";
- name = "science camera";
- network = list("ss13","rd")
- },
+/obj/structure/cable,
/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
+/obj/effect/turf_decal/box,
/turf/open/floor/iron/dark,
/area/station/science/ordnance/storage)
"res" = (
@@ -54589,11 +54586,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/button/door/directional/south{
- id = "ordnancestorage";
- name = "Ordnance Storage Access";
- req_access = list("ordnance")
- },
/obj/structure/cable,
/obj/effect/turf_decal/tile/purple/half/contrasted,
/turf/open/floor/iron/showroomfloor,
@@ -54641,14 +54633,6 @@
/obj/structure/cable,
/turf/open/floor/iron/showroomfloor,
/area/station/science/robotics/lab)
-"rqL" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/cargo/warehouse)
"rqW" = (
/obj/machinery/firealarm/directional/south,
/obj/effect/turf_decal/tile/neutral/half/contrasted,
@@ -54833,6 +54817,9 @@
name = "Ordnance Storage Shutters"
},
/obj/machinery/door/firedoor/heavy,
+/obj/effect/turf_decal/tile/purple/half/contrasted{
+ dir = 8
+ },
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance/storage)
"rtx" = (
@@ -56017,6 +56004,14 @@
/obj/structure/table_frame,
/turf/open/floor/plating,
/area/ruin/space/has_grav/abandoned_warehouse)
+"rLY" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/random/maintenance/two,
+/obj/structure/rack,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard)
"rMc" = (
/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
dir = 1
@@ -56296,6 +56291,16 @@
},
/turf/open/floor/iron/dark,
/area/station/science/lobby)
+"rPz" = (
+/obj/machinery/camera/directional/south{
+ c_tag = "Ordnance Storage";
+ name = "science camera";
+ network = list("ss13","rd")
+ },
+/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
+/obj/effect/turf_decal/box,
+/turf/open/floor/iron/dark,
+/area/station/science/ordnance/storage)
"rPG" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden/layer4,
@@ -56860,6 +56865,19 @@
/obj/effect/turf_decal/tile/neutral/opposingcorners,
/turf/open/floor/iron/dark,
/area/station/service/library)
+"rYM" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/showroomfloor,
+/area/station/science/genetics)
"rYQ" = (
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/corner{
@@ -57000,6 +57018,25 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/solars/starboard/fore)
+"sbq" = (
+/obj/structure/table/reinforced,
+/obj/structure/desk_bell{
+ pixel_x = -7;
+ pixel_y = 8
+ },
+/obj/item/food/grown/melonlike/watermelon,
+/obj/item/food/grown/wheat,
+/obj/item/food/grown/whitebeet,
+/obj/item/food/grown/apple,
+/obj/item/food/grown/tomato,
+/obj/machinery/door/firedoor,
+/obj/machinery/door/window/right/directional/west{
+ name = "Hydroponics Desk";
+ req_access = list("hydroponics")
+ },
+/obj/item/producepad,
+/turf/open/floor/iron,
+/area/station/service/hydroponics)
"sby" = (
/obj/effect/turf_decal/siding/white{
dir = 4
@@ -57366,8 +57403,10 @@
/turf/open/floor/iron,
/area/station/service/hydroponics)
"sgn" = (
-/obj/effect/turf_decal/tile/yellow/half/contrasted,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+/obj/effect/turf_decal/tile/purple/half/contrasted{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
},
/turf/open/floor/iron/showroomfloor,
@@ -57494,6 +57533,13 @@
},
/turf/open/floor/iron,
/area/station/command/gateway)
+"siG" = (
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/treatment_center)
"siH" = (
/obj/effect/spawner/structure/window/reinforced/tinted,
/turf/open/floor/plating,
@@ -58189,6 +58235,11 @@
/obj/machinery/light/cold/directional/east,
/turf/open/floor/iron/showroomfloor,
/area/station/medical/medbay/central)
+"ssh" = (
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/showroomfloor,
+/area/station/command/heads_quarters/rd)
"ssi" = (
/obj/effect/turf_decal/bot,
/obj/machinery/computer/security{
@@ -58273,9 +58324,9 @@
/turf/open/floor/iron/chapel,
/area/station/service/chapel)
"ssM" = (
-/obj/effect/turf_decal/stripes/line,
/obj/structure/sign/warning/hot_temp/directional/north,
-/turf/open/floor/plating/airless,
+/obj/structure/lattice,
+/turf/open/space/basic,
/area/space/nearstation)
"ssQ" = (
/obj/structure/sign/warning/electric_shock/directional/north,
@@ -58997,18 +59048,16 @@
/turf/open/floor/iron/showroomfloor,
/area/station/security/brig)
"sGB" = (
-/obj/machinery/portable_atmospherics/canister/plasma,
+/obj/machinery/firealarm/directional/west,
+/obj/machinery/atmospherics/components/trinary/mixer{
+ dir = 1
+ },
/obj/item/radio/intercom/directional/west,
-/turf/open/floor/iron/dark,
-/area/station/science/ordnance/storage)
-"sGF" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 6
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
},
-/obj/effect/turf_decal/bot,
-/obj/machinery/holopad,
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/qm)
+/turf/open/floor/engine,
+/area/station/science/ordnance/storage)
"sHf" = (
/obj/structure/bed/dogbed/renault,
/obj/machinery/button/door/directional/south{
@@ -60178,6 +60227,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance)
"sXJ" = (
@@ -61290,6 +61342,7 @@
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
+/obj/machinery/light_switch/directional/south,
/turf/open/floor/iron,
/area/station/cargo/warehouse)
"toS" = (
@@ -61978,22 +62031,6 @@
/obj/effect/turf_decal/tile/red/half/contrasted,
/turf/open/floor/iron,
/area/station/security/office)
-"tAp" = (
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 1
- },
-/obj/machinery/button/door/directional/south{
- id = "morgueprivacy";
- name = "Morgue Privacy Shutter";
- pixel_x = -8
- },
-/obj/machinery/light/small/directional/south,
-/obj/machinery/holopad,
-/obj/effect/turf_decal/box/white{
- color = "#52B4E9"
- },
-/turf/open/floor/iron/dark,
-/area/station/medical/morgue)
"tAs" = (
/obj/machinery/atmospherics/pipe/smart/simple/brown/visible,
/turf/closed/wall/r_wall,
@@ -62789,19 +62826,6 @@
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/plating,
/area/ruin/space/has_grav/abandoned_warehouse)
-"tNZ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/corner,
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/structure/cable,
-/obj/machinery/holopad/secure,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/engine/telecomms,
-/area/station/tcommsat/server)
"tOa" = (
/obj/structure/table,
/obj/item/tank/internals/oxygen/red,
@@ -62860,15 +62884,6 @@
},
/turf/open/floor/iron/dark,
/area/station/service/chapel/dock)
-"tOJ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/obj/structure/grille/broken,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard)
"tOR" = (
/obj/item/storage/medkit/regular{
pixel_x = 3;
@@ -63414,8 +63429,13 @@
/turf/open/floor/iron/showroomfloor,
/area/station/command/heads_quarters/cmo)
"tXS" = (
-/obj/machinery/atmospherics/components/tank/oxygen,
-/turf/open/floor/iron/showroomfloor,
+/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
+ dir = 6
+ },
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/machinery/portable_atmospherics/canister/plasma,
+/obj/effect/turf_decal/box,
+/turf/open/floor/engine,
/area/station/science/ordnance/storage)
"tXX" = (
/obj/structure/cable,
@@ -64171,13 +64191,6 @@
dir = 8
},
/area/station/hallway/primary/central/fore)
-"uko" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue/half/contrasted{
- dir = 4
- },
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/treatment_center)
"ukM" = (
/obj/structure/sign/warning/vacuum/external/directional/south,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -64285,6 +64298,18 @@
},
/turf/open/floor/iron/dark,
/area/ruin/space/has_grav/abandoned_warehouse)
+"ulR" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/brown/half/contrasted{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/camera/autoname/directional/west,
+/turf/open/floor/iron,
+/area/station/cargo/miningoffice)
"ulS" = (
/turf/closed/wall,
/area/station/security/courtroom)
@@ -64465,9 +64490,9 @@
/obj/item/clothing/gloves/latex,
/obj/item/clothing/suit/apron/surgical,
/obj/item/clothing/mask/surgical,
-/obj/item/mmi,
-/obj/item/mmi,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
+/obj/item/brain_processor/organic,
+/obj/item/brain_processor/organic,
/obj/structure/window/reinforced/spawner/directional/east,
/turf/open/floor/iron/dark,
/area/station/science/robotics/lab)
@@ -64868,8 +64893,10 @@
/turf/open/floor/engine/vacuum,
/area/station/engineering/atmos)
"uuW" = (
-/obj/machinery/portable_atmospherics/canister/nitrogen,
-/turf/open/floor/iron/dark,
+/obj/effect/turf_decal/tile/blue/anticorner/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance/storage)
"uve" = (
/obj/effect/turf_decal/stripes/line{
@@ -66227,6 +66254,8 @@
dir = 1
},
/obj/effect/mapping_helpers/airlock/access/all/supply/general,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/station/cargo/miningoffice)
"uRG" = (
@@ -66627,6 +66656,19 @@
/obj/effect/mapping_helpers/airlock/access/all/science/general,
/turf/open/floor/iron/dark,
/area/station/science/research)
+"uYT" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/corner,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/structure/cable,
+/obj/machinery/holopad/secure,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/engine/telecomms,
+/area/station/tcommsat/server)
"uYW" = (
/obj/machinery/newscaster/directional/north,
/obj/effect/turf_decal/tile/yellow/half/contrasted{
@@ -67338,9 +67380,14 @@
/turf/open/floor/plating,
/area/station/maintenance/aft)
"vls" = (
-/obj/effect/turf_decal/tile/red/half/contrasted,
-/obj/machinery/firealarm/directional/west,
-/turf/open/floor/iron/showroomfloor,
+/obj/machinery/atmospherics/components/trinary/mixer{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/light_switch/directional/west,
+/turf/open/floor/engine,
/area/station/science/ordnance/storage)
"vlv" = (
/obj/effect/decal/cleanable/dirt,
@@ -68331,8 +68378,8 @@
/area/station/security/detectives_office)
"vCh" = (
/obj/structure/cable,
-/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
-/turf/open/floor/iron/dark,
+/obj/effect/turf_decal/tile/green/half/contrasted,
+/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance/storage)
"vCn" = (
/obj/structure/cable,
@@ -68638,6 +68685,27 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
+"vGQ" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/window/left/directional/west{
+ name = "Kitchen Service Desk";
+ req_access = list("kitchen")
+ },
+/obj/item/paper_bin{
+ pixel_x = -4;
+ pixel_y = 4
+ },
+/obj/item/pen,
+/obj/item/storage/bag/plants,
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/trimline/green/corner,
+/obj/machinery/door/window/right/directional/east{
+ name = "Kitchen Service Desk";
+ req_access = list("hydroponics")
+ },
+/obj/item/producepad,
+/turf/open/floor/iron,
+/area/station/service/kitchen)
"vHd" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/showroomfloor,
@@ -68653,10 +68721,6 @@
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"vHl" = (
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"vHr" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/yellow/half/contrasted,
@@ -68784,12 +68848,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark,
/area/station/science/server)
-"vIY" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"vJc" = (
/turf/closed/wall/r_wall,
/area/station/science/xenobiology)
@@ -68967,21 +69025,6 @@
/obj/item/tank/internals/emergency_oxygen,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
-"vLm" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/machinery/holopad/secure,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/tile/red/half/contrasted{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron/showroomfloor,
-/area/station/security/lockers)
"vLE" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/green/anticorner/contrasted{
@@ -69603,11 +69646,6 @@
"vTV" = (
/turf/closed/wall/r_wall/rust,
/area/station/service/chapel/dock)
-"vTX" = (
-/obj/machinery/holopad,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron/showroomfloor,
-/area/station/command/heads_quarters/rd)
"vUi" = (
/obj/machinery/door/firedoor/border_only{
dir = 8
@@ -69627,12 +69665,6 @@
/obj/effect/mapping_helpers/airlock/access/all/supply/general,
/turf/open/floor/plating,
/area/station/maintenance/department/cargo)
-"vUt" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/station/security/office)
"vUD" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -70151,16 +70183,14 @@
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance/office)
"wdx" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/light_switch/directional/east,
-/obj/effect/turf_decal/tile/brown/half/contrasted{
- dir = 4
+/obj/machinery/door/airlock/maintenance{
+ name = "Cargo Maintenance"
},
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/iron,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/access/all/supply/general,
+/turf/open/floor/plating,
/area/station/cargo/warehouse)
"wdL" = (
/obj/effect/turf_decal/delivery,
@@ -71127,14 +71157,6 @@
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"wrY" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/cargo/warehouse)
"wsg" = (
/obj/effect/turf_decal/bot,
/obj/machinery/newscaster/directional/north,
@@ -71199,7 +71221,7 @@
/area/station/command/bridge)
"wtB" = (
/obj/structure/table,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/obj/item/bodypart/chest/robot{
pixel_y = 4
},
@@ -71233,21 +71255,6 @@
/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden,
/turf/open/floor/iron/showroomfloor,
/area/station/medical/cryo)
-"wtS" = (
-/obj/effect/landmark/event_spawn,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/yellow/half/contrasted,
-/obj/effect/turf_decal/tile/blue,
-/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/holopad,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
-/area/station/engineering/atmos/storage)
"wua" = (
/obj/machinery/modular_computer/preset/civilian{
dir = 1
@@ -71391,20 +71398,6 @@
},
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
-"wwC" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/landmark/event_spawn,
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/siding/wood{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/station/command/heads_quarters/qm)
"wwG" = (
/turf/closed/wall/r_wall/rust,
/area/station/science/ordnance/office)
@@ -72122,20 +72115,12 @@
},
/turf/open/floor/iron/dark,
/area/station/maintenance/starboard/aft)
-"wGE" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/obj/machinery/duct,
-/obj/machinery/holopad,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/break_room)
"wGS" = (
/obj/structure/tank_dispenser,
/obj/effect/turf_decal/tile/purple/half/contrasted{
dir = 1
},
+/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance)
"wHb" = (
@@ -72295,22 +72280,33 @@
/area/station/command/bridge)
"wIY" = (
/obj/structure/table,
-/obj/item/assembly/timer,
/obj/item/assembly/timer{
- pixel_x = -4;
- pixel_y = 2
+ pixel_x = -14;
+ pixel_y = -5
},
/obj/item/assembly/timer{
- pixel_x = 6;
- pixel_y = -4
+ pixel_x = -17;
+ pixel_y = 4
},
/obj/item/assembly/timer{
- pixel_x = 5;
- pixel_y = 4
+ pixel_x = -6;
+ pixel_y = 2
+ },
+/obj/item/assembly/timer{
+ pixel_x = -15;
+ pixel_y = 11
},
/obj/effect/turf_decal/tile/purple/half/contrasted{
dir = 1
},
+/obj/item/pipe_dispenser{
+ pixel_x = 3;
+ pixel_y = 7
+ },
+/obj/item/pipe_dispenser{
+ pixel_x = 3;
+ pixel_y = -1
+ },
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance)
"wJe" = (
@@ -72386,6 +72382,21 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/service/hydroponics)
+"wLN" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/brown/anticorner/contrasted{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/obj/structure/sign/poster/contraband/the_griffin/directional/north,
+/obj/structure/rack,
+/obj/machinery/camera/autoname/directional/west,
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/iron,
+/area/station/cargo/warehouse)
"wMe" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 8
@@ -72606,11 +72617,9 @@
/area/station/engineering/supermatter/room)
"wPX" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/box/corners{
- dir = 8
- },
/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch,
/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/box,
/turf/open/floor/iron/dark,
/area/station/cargo/warehouse)
"wQc" = (
@@ -72673,6 +72682,25 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5,
/turf/open/floor/iron/dark,
/area/station/service/chapel/storage)
+"wQV" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/turf_decal/siding/yellow{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/yellow/half/contrasted{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/holopad,
+/turf/open/floor/iron,
+/area/station/command/heads_quarters/ce)
"wRn" = (
/obj/effect/turf_decal/box/corners,
/turf/open/floor/engine,
@@ -72950,25 +72978,6 @@
/obj/item/weldingtool/mini,
/turf/open/floor/iron/grimy,
/area/station/security/prison/safe)
-"wVN" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/effect/turf_decal/siding/yellow{
- dir = 1
- },
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/effect/turf_decal/tile/yellow/half/contrasted{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/bot,
-/obj/machinery/holopad,
-/turf/open/floor/iron,
-/area/station/command/heads_quarters/ce)
"wVP" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -73879,6 +73888,13 @@
/obj/effect/turf_decal/tile/neutral/half/contrasted,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
+"xjK" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard)
"xjO" = (
/obj/machinery/camera/directional/north{
c_tag = "Fore Hallway Monastary Hall";
@@ -74262,17 +74278,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
-"xoK" = (
-/obj/effect/turf_decal/tile/blue/half/contrasted{
- dir = 1
- },
-/obj/structure/cable,
-/obj/machinery/duct,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
- },
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/paramedic)
"xoO" = (
/obj/structure/cable,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -74332,19 +74337,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/cargo/storage)
-"xqc" = (
-/obj/effect/turf_decal/tile/blue/anticorner/contrasted{
- dir = 4
- },
-/obj/structure/table/glass,
-/obj/structure/cable,
-/obj/structure/fireaxecabinet/jawsofrecovery/directional/east,
-/obj/item/surgicaldrill,
-/obj/item/toy/figure/paramedic,
-/obj/machinery/light/small/directional/north,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/paramedic)
"xqf" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron/showroomfloor,
@@ -74806,8 +74798,13 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/abandoned_warehouse)
"xxN" = (
-/obj/machinery/portable_atmospherics/canister/plasma,
-/turf/open/floor/iron/dark,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/engine,
/area/station/science/ordnance/storage)
"xxP" = (
/obj/structure/disposalpipe/segment{
@@ -74836,10 +74833,9 @@
/turf/open/floor/iron/dark,
/area/station/service/bar/atrium)
"xye" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 8
- },
/obj/effect/turf_decal/tile/purple,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/showroomfloor,
/area/station/science/ordnance)
"xym" = (
@@ -75905,12 +75901,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/port)
-"xNN" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/cargo/warehouse)
"xNP" = (
/obj/structure/closet/radiation,
/obj/item/clothing/glasses/meson,
@@ -87471,7 +87461,7 @@ mpF
kQT
oTd
qRT
-qby
+eZV
biq
crI
vLI
@@ -88490,7 +88480,7 @@ vmZ
bnn
kcI
toS
-cCS
+bDW
ukQ
oWc
xCp
@@ -90347,7 +90337,7 @@ hBJ
fvh
lXK
gfi
-fpN
+fmS
wHF
maA
mtV
@@ -94963,7 +94953,7 @@ eWP
jfK
sBO
bjN
-jzB
+aWF
pDY
qGK
tzN
@@ -95527,12 +95517,12 @@ gVi
sWV
kcW
kBF
-fLf
+avg
vYs
dYB
dUE
wsD
-vUt
+ifs
rmT
sgC
umJ
@@ -96515,7 +96505,7 @@ wue
vFv
gbf
wVD
-wGE
+nLB
qHI
rSi
rzB
@@ -97276,7 +97266,7 @@ wOy
vtF
tSc
gPS
-buq
+fPo
gZu
mEt
pkf
@@ -98045,7 +98035,7 @@ jUU
dkh
ccY
mJM
-uko
+siG
gsr
nbV
qbk
@@ -98556,7 +98546,7 @@ xjI
yhI
eby
rhs
-tAp
+nqY
eer
bKU
uUm
@@ -99605,8 +99595,8 @@ gaE
uNK
qCj
iHU
-xoK
-evD
+jJI
+ixr
gZI
ofB
sij
@@ -99862,8 +99852,8 @@ fKf
fyZ
qNL
xvW
-xqc
-ear
+gzF
+pwL
qip
cIS
xvW
@@ -100159,7 +100149,7 @@ rFK
qVs
anz
xRL
-vLm
+hRn
xRL
fjz
kir
@@ -102186,7 +102176,7 @@ ngF
dgW
jCm
qpx
-lwW
+aeQ
qwe
snW
hEw
@@ -107300,7 +107290,7 @@ rWg
rsT
orT
aIq
-mdJ
+pxs
tGZ
wLu
mlw
@@ -107551,7 +107541,7 @@ qUo
uWU
nYp
mLJ
-tNZ
+uYT
vvH
dRF
mIq
@@ -108901,7 +108891,7 @@ pQS
djh
uWd
eAK
-lVT
+duc
aUI
sfN
uBx
@@ -108916,7 +108906,7 @@ bda
grj
yma
bda
-vHl
+aeZ
kau
wRU
dGS
@@ -109157,7 +109147,7 @@ rih
hXP
pof
oTO
-wtS
+asz
bCE
lqU
mKp
@@ -109173,7 +109163,7 @@ goi
lfE
ain
iyd
-vIY
+acm
aeU
ach
jGQ
@@ -109671,7 +109661,7 @@ ybd
hXP
gUc
fwR
-qiH
+jUc
iAh
sEU
siZ
@@ -109681,13 +109671,13 @@ iZq
iSa
tFh
yma
-bda
+beB
emU
bda
-lbG
-lbG
-alO
-aoe
+acK
+acm
+acK
+acm
aeU
aeU
aeU
@@ -109938,13 +109928,13 @@ gOZ
oMP
ebI
foa
-aeZ
-aeZ
+acK
+acK
nrp
-lrm
+clX
fwm
-lrm
-fUi
+clX
+clz
clz
clz
clz
@@ -110709,8 +110699,8 @@ cvI
twN
thJ
byi
-clX
-cHN
+aEk
+aEr
aDV
aEa
rbw
@@ -110905,7 +110895,7 @@ tlW
jds
jds
kZx
-ibd
+vGQ
mwe
ios
bXz
@@ -112963,7 +112953,7 @@ xuA
hsC
wxq
mqF
-aXJ
+sbq
gql
sVz
wxq
@@ -113517,7 +113507,7 @@ jjs
xcy
cLx
jNM
-wVN
+wQV
tav
snU
oDh
@@ -114292,7 +114282,7 @@ xin
rja
fvC
xCr
-pht
+dpl
gMC
uSH
uSH
@@ -116292,7 +116282,7 @@ pMT
gtW
hTb
iWQ
-vTX
+ssh
mtq
tCh
imS
@@ -116312,7 +116302,7 @@ xZL
rZV
gEB
tDf
-wwC
+nlw
kZw
gHI
cTX
@@ -116560,7 +116550,7 @@ iHL
cYA
iwB
wAC
-nvq
+rYM
nMB
fEI
uhx
@@ -116827,7 +116817,7 @@ rZV
rsS
wTU
cRO
-sGF
+lQy
atu
lea
qLi
@@ -117078,12 +117068,12 @@ xai
nkV
xio
frO
-wtt
-wtt
+cDS
+mtc
rZV
nfY
nfY
-quX
+nfY
quX
nfY
lmO
@@ -117335,13 +117325,13 @@ frO
frO
wPB
frO
-nIg
+lDu
+mtc
+dJb
dME
dME
-cqT
-eYS
+wLN
iYI
-fRf
mVP
hjL
cXd
@@ -117590,15 +117580,15 @@ fyq
tXS
vls
sGB
-xxN
+fBQ
+fBQ
lDu
-nIg
+xjK
+alP
dME
jHw
boO
-oiK
mvm
-ncQ
clV
jwu
xaK
@@ -117847,15 +117837,15 @@ dif
kOt
kpH
xxN
-xxN
+fBQ
+fBQ
lDu
-tOJ
+hDc
+rLY
cTN
mwf
boO
-hdq
wPX
-xNN
toN
dME
tiK
@@ -118104,15 +118094,15 @@ hRG
ceT
sgn
uuW
-fhE
+fBQ
+jUS
oLH
-wCY
+xjK
+bYr
cTN
dME
qTJ
-chT
oCC
-wrY
opy
dME
hxP
@@ -118362,14 +118352,14 @@ ksg
akH
vCh
reo
+rPz
lDu
-wCY
-giT
+jWs
jWs
oXK
wdx
+lYO
vuu
-rqL
qRm
itR
gyl
@@ -118619,14 +118609,14 @@ jYp
qew
nGa
dry
+acB
lDu
-pkM
xZL
-vOX
+rZV
qAR
+gKI
qAR
uRi
-kaX
qAR
qAR
mUT
@@ -118876,14 +118866,14 @@ dty
mvz
dty
dty
-lDu
+dty
lDu
xZL
rZV
nTv
iRq
-aLI
-dVB
+ulR
+egz
aBH
qAR
kZs
@@ -120930,9 +120920,9 @@ oLH
dWQ
lkB
iaX
-eWS
-eWS
-sRz
+hMW
+rdl
+oLH
xZL
mxo
aVG
@@ -121186,10 +121176,10 @@ mtc
lDu
fBV
fJo
-lkB
+iaX
xye
nwP
-lDu
+sRz
wCY
hbC
rZV
@@ -121966,7 +121956,7 @@ sjd
fej
tul
xCP
-nCo
+jvN
rEu
kPI
xPT
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 6ac29f31bbcd..736356ee635b 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -33465,6 +33465,7 @@
id = "hydro_service";
name = "Service Shutter"
},
+/obj/item/producepad,
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"lug" = (
@@ -46769,7 +46770,7 @@
/area/station/command/heads_quarters/cmo)
"pXV" = (
/obj/structure/table,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4,
/obj/effect/turf_decal/trimline/purple/filled/line,
/obj/machinery/camera/autoname/directional/south,
@@ -52197,7 +52198,7 @@
/turf/open/floor/iron,
/area/station/engineering/atmos)
"rPG" = (
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/obj/structure/rack,
/obj/effect/spawner/random/maintenance,
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5,
@@ -63441,6 +63442,7 @@
},
/obj/item/pen,
/obj/structure/window/reinforced/spawner/directional/west,
+/obj/item/producepad,
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"vEl" = (
@@ -67345,9 +67347,9 @@
/area/station/service/hydroponics/garden)
"wRD" = (
/obj/effect/decal/cleanable/dirt,
-/obj/item/mmi,
-/obj/item/mmi,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
+/obj/item/brain_processor/organic,
+/obj/item/brain_processor/organic,
/obj/structure/table,
/turf/open/floor/iron/white,
/area/station/science/robotics/lab)
diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm
index 8ee6a032ea92..c245266602a1 100644
--- a/_maps/map_files/Mining/Lavaland.dmm
+++ b/_maps/map_files/Mining/Lavaland.dmm
@@ -660,6 +660,15 @@
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"dY" = (
+/obj/machinery/hydroponics/constructable,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/seeds/potato,
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/mine/laborcamp)
"ee" = (
/obj/machinery/shower/directional/south,
/obj/machinery/door/window/right/directional/south,
@@ -704,6 +713,12 @@
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
+"ev" = (
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/mine/laborcamp)
"ey" = (
/obj/structure/lattice/catwalk/mining,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -4111,15 +4126,6 @@
},
/turf/open/floor/iron/dark,
/area/mine/laborcamp/security)
-"vO" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/trimline/green/filled/corner{
- dir = 4
- },
-/obj/machinery/hydroponics/constructable,
-/obj/item/seeds/tomato,
-/turf/open/floor/iron/dark,
-/area/mine/laborcamp)
"vQ" = (
/obj/machinery/door/airlock{
id_tag = "miningdorm2";
@@ -4890,6 +4896,12 @@
/obj/effect/mapping_helpers/airlock/access/any/supply/mining_station,
/turf/open/floor/iron/dark/textured_large,
/area/mine/production)
+"As" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/hydroponics/constructable,
+/obj/item/seeds/tomato,
+/turf/open/floor/iron/dark,
+/area/mine/laborcamp)
"Av" = (
/obj/structure/railing/corner{
dir = 8
@@ -4924,10 +4936,6 @@
},
/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,
@@ -5024,13 +5032,6 @@
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
-"BH" = (
-/obj/structure/window/spawner/directional/south,
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 6
- },
-/turf/open/floor/iron/dark,
-/area/mine/laborcamp)
"BK" = (
/turf/open/floor/circuit,
/area/mine/maintenance/service/comms)
@@ -5249,13 +5250,6 @@
/obj/effect/turf_decal/trimline/green/filled/line,
/turf/open/floor/iron/dark,
/area/mine/laborcamp)
-"Dj" = (
-/obj/machinery/biogenerator,
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/mine/laborcamp)
"Dk" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
@@ -7022,6 +7016,14 @@
},
/turf/open/floor/iron/checker,
/area/mine/cafeteria)
+"Nx" = (
+/obj/structure/window/spawner/directional/south,
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 6
+ },
+/obj/item/kirbyplants/random,
+/turf/open/floor/iron/dark,
+/area/mine/laborcamp)
"Nz" = (
/obj/effect/turf_decal/bot,
/obj/structure/ore_box,
@@ -7110,6 +7112,10 @@
},
/turf/open/floor/plating/lavaland_atmos,
/area/lavaland/surface/outdoors)
+"NZ" = (
+/obj/structure/candela_beacon,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Og" = (
/obj/machinery/power/apc/auto_name/directional/west,
/obj/structure/cable,
@@ -7230,6 +7236,13 @@
/obj/structure/cable,
/turf/open/floor/iron/white/textured_large,
/area/mine/cafeteria)
+"OV" = (
+/obj/machinery/biogenerator,
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 5
+ },
+/turf/open/floor/iron/dark,
+/area/mine/laborcamp)
"OZ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -8404,15 +8417,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/mine/maintenance/labor)
-"VS" = (
-/obj/machinery/hydroponics/constructable,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 4
- },
-/obj/item/seeds/potato,
-/turf/open/floor/iron/dark,
-/area/mine/laborcamp)
"VU" = (
/obj/structure/railing,
/turf/open/misc/hay/lavaland,
@@ -8507,6 +8511,10 @@
/obj/effect/turf_decal/tile/brown/fourcorners,
/turf/open/floor/iron/dark,
/area/mine/production)
+"WE" = (
+/obj/machinery/produceporter,
+/turf/open/floor/iron/smooth,
+/area/mine/laborcamp)
"WF" = (
/obj/effect/spawner/random/trash/graffiti,
/obj/effect/decal/cleanable/dirt,
@@ -8768,10 +8776,6 @@
},
/turf/open/floor/iron/textured_large,
/area/mine/living_quarters)
-"XW" = (
-/obj/item/kirbyplants/random,
-/turf/open/floor/iron/smooth,
-/area/mine/laborcamp)
"XX" = (
/obj/machinery/computer/mechpad,
/obj/effect/turf_decal/trimline/purple/filled/line{
@@ -28630,8 +28634,8 @@ aj
aj
rX
wu
-VS
-vO
+dY
+As
Gr
tE
ro
@@ -28887,8 +28891,8 @@ aj
aj
rX
rX
-rX
-Dj
+OV
+ev
oN
Jf
Jf
@@ -29143,11 +29147,11 @@ aj
pU
aj
aj
-aj
+rX
rX
OO
-BH
-XW
+Nx
+WE
Sr
Rf
nq
@@ -29404,7 +29408,7 @@ aj
rX
rX
rX
-kg
+rX
kg
yG
kg
@@ -46599,7 +46603,7 @@ pU
pU
pU
pU
-AH
+NZ
pU
aj
aj
diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm
index af0422102f70..f6b6b682b11d 100644
--- a/_maps/map_files/NebulaStation/NebulaStation.dmm
+++ b/_maps/map_files/NebulaStation/NebulaStation.dmm
@@ -63325,15 +63325,15 @@
dir = 9
},
/obj/structure/table/glass,
-/obj/item/mmi{
+/obj/item/brain_processor/organic{
pixel_y = 8;
pixel_x = 4
},
-/obj/item/mmi{
+/obj/item/brain_processor/organic{
pixel_y = 4;
pixel_x = 2
},
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/obj/structure/window/reinforced/spawner/directional/north,
/turf/open/floor/iron/dark/small,
/area/station/science/robotics/augments)
@@ -74788,7 +74788,7 @@
/area/station/hallway/secondary/exit/departure_lounge)
"kYF" = (
/obj/structure/table,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 6
},
@@ -120996,6 +120996,7 @@
"rQo" = (
/obj/structure/table/reinforced/rglass,
/obj/item/aquarium_kit,
+/obj/item/producepad,
/turf/open/floor/iron/dark/herringbone,
/area/station/hallway/secondary/service)
"rQr" = (
@@ -162638,6 +162639,7 @@
pixel_x = 4;
pixel_y = 0
},
+/obj/item/producepad,
/turf/open/floor/stone,
/area/station/service/hydroponics)
"ycp" = (
diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm
index 9196bf5d94cf..71d7c5e70640 100644
--- a/_maps/map_files/debug/runtimestation.dmm
+++ b/_maps/map_files/debug/runtimestation.dmm
@@ -1088,6 +1088,7 @@
/obj/structure/table,
/obj/item/storage/box/prisoner,
/obj/item/paper/guides/jobs/security/labor_camp,
+/obj/item/producepad,
/turf/open/floor/iron,
/area/station/security/brig)
"hm" = (
diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_1.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_1.dmm
index eab9280b8fa7..3265912e0b63 100644
--- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_1.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_1.dmm
@@ -191,7 +191,7 @@
/obj/structure/closet/crate,
/obj/effect/spawner/random/engineering/material_cheap,
/obj/effect/spawner/random/engineering/tool,
-/obj/item/relic,
+/obj/item/assembly/relic,
/turf/open/floor/plating,
/area/station/maintenance/department/cargo)
"yB" = (
diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm
index b19a77c30230..8a04740dc4a7 100644
--- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm
@@ -280,7 +280,7 @@
/obj/structure/closet,
/obj/effect/spawner/random/engineering/material_cheap,
/obj/effect/spawner/random/maintenance/three,
-/obj/item/relic,
+/obj/item/assembly/relic,
/turf/open/floor/iron/smooth,
/area/station/maintenance/department/cargo)
"yM" = (
diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_attachment_b_3.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_attachment_b_3.dmm
index ed88b7cffa3e..ae838ebb57c4 100644
--- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_attachment_b_3.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_attachment_b_3.dmm
@@ -25,7 +25,7 @@
"r" = (
/obj/structure/table,
/obj/effect/decal/cleanable/dirt,
-/obj/item/relic,
+/obj/item/assembly/relic,
/obj/item/pen{
pixel_x = -4
},
diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_1.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_1.dmm
index ae78ae6731f9..63967e85e6d7 100644
--- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_1.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_1.dmm
@@ -154,7 +154,7 @@
/turf/open/misc/asteroid,
/area/station/asteroid)
"M" = (
-/obj/item/relic,
+/obj/item/assembly/relic,
/turf/open/misc/asteroid/dug,
/area/station/asteroid)
"O" = (
diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_3.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_3.dmm
index 544d9a870759..f0d34f70519d 100644
--- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_3.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_3.dmm
@@ -130,7 +130,7 @@
/turf/open/misc/asteroid,
/area/station/asteroid)
"D" = (
-/obj/item/relic,
+/obj/item/assembly/relic,
/turf/open/misc/asteroid/dug,
/area/station/asteroid)
"F" = (
diff --git a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_attachment_a_2.dmm b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_attachment_a_2.dmm
index aa82b69f2e72..aece27181d38 100644
--- a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_attachment_a_2.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_attachment_a_2.dmm
@@ -1,6 +1,6 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
-/obj/item/relic,
+/obj/item/assembly/relic,
/turf/open/misc/asteroid/dug,
/area/station/asteroid)
"b" = (
diff --git a/_maps/map_files/tramstation/maintenance_modules/dormmedupper_3.dmm b/_maps/map_files/tramstation/maintenance_modules/dormmedupper_3.dmm
index 4e29c62a599e..7849b0f17a8f 100644
--- a/_maps/map_files/tramstation/maintenance_modules/dormmedupper_3.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/dormmedupper_3.dmm
@@ -439,7 +439,7 @@
/area/station/maintenance/department/crew_quarters/dorms)
"XV" = (
/obj/item/stack/ore/glass,
-/obj/item/relic,
+/obj/item/assembly/relic,
/turf/open/misc/asteroid/dug,
/area/station/maintenance/department/crew_quarters/dorms)
"ZJ" = (
diff --git a/_maps/map_files/tramstation/maintenance_modules/secbarupper_attachment_b_2.dmm b/_maps/map_files/tramstation/maintenance_modules/secbarupper_attachment_b_2.dmm
index 0f272ce3a03e..22a178e9cc80 100644
--- a/_maps/map_files/tramstation/maintenance_modules/secbarupper_attachment_b_2.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/secbarupper_attachment_b_2.dmm
@@ -32,7 +32,7 @@
"p" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/crate,
-/obj/item/relic,
+/obj/item/assembly/relic,
/turf/open/floor/plating,
/area/station/maintenance/department/security)
"r" = (
diff --git a/_maps/map_files/tramstation/maintenance_modules/secbarupper_cave_1.dmm b/_maps/map_files/tramstation/maintenance_modules/secbarupper_cave_1.dmm
index 3b99c265a1f4..4e3982a1102f 100644
--- a/_maps/map_files/tramstation/maintenance_modules/secbarupper_cave_1.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/secbarupper_cave_1.dmm
@@ -23,7 +23,7 @@
/turf/open/misc/asteroid/dug,
/area/station/asteroid)
"v" = (
-/obj/item/relic,
+/obj/item/assembly/relic,
/turf/open/misc/asteroid/dug,
/area/station/asteroid)
"w" = (
diff --git a/_maps/map_files/tramstation/maintenance_modules/secservicelower_attachment_c_2.dmm b/_maps/map_files/tramstation/maintenance_modules/secservicelower_attachment_c_2.dmm
index cb12e658a1ab..17efc54aae8f 100644
--- a/_maps/map_files/tramstation/maintenance_modules/secservicelower_attachment_c_2.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/secservicelower_attachment_c_2.dmm
@@ -99,7 +99,7 @@
"J" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/crate,
-/obj/item/relic,
+/obj/item/assembly/relic,
/obj/effect/spawner/random/maintenance/two,
/turf/open/floor/plating,
/area/station/maintenance/port/central)
diff --git a/_maps/map_files/tramstation/maintenance_modules/servicecargolower_2.dmm b/_maps/map_files/tramstation/maintenance_modules/servicecargolower_2.dmm
index df7d703de155..ed55682789ea 100644
--- a/_maps/map_files/tramstation/maintenance_modules/servicecargolower_2.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/servicecargolower_2.dmm
@@ -348,7 +348,7 @@
/area/station/maintenance/starboard/greater)
"ST" = (
/obj/item/stack/ore/glass,
-/obj/item/relic,
+/obj/item/assembly/relic,
/turf/open/misc/asteroid/dug,
/area/station/asteroid)
"Ui" = (
diff --git a/_maps/map_files/tramstation/maintenance_modules/servicecargolower_attachment_b_3.dmm b/_maps/map_files/tramstation/maintenance_modules/servicecargolower_attachment_b_3.dmm
index 06409ce21b48..756169707c3f 100644
--- a/_maps/map_files/tramstation/maintenance_modules/servicecargolower_attachment_b_3.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/servicecargolower_attachment_b_3.dmm
@@ -6,7 +6,7 @@
/turf/closed/wall/rust,
/area/station/maintenance/starboard/greater)
"d" = (
-/obj/item/relic,
+/obj/item/assembly/relic,
/obj/item/stack/ore/glass,
/turf/open/misc/asteroid/dug,
/area/station/maintenance/starboard/greater)
diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm
index d5a0c31a3cde..532b1522d8ad 100644
--- a/_maps/map_files/tramstation/tramstation.dmm
+++ b/_maps/map_files/tramstation/tramstation.dmm
@@ -24677,7 +24677,7 @@
pixel_x = 8;
pixel_y = 9
},
-/obj/item/mmi{
+/obj/item/brain_processor/organic{
pixel_x = -1;
pixel_y = 5
},
@@ -31132,9 +31132,9 @@
"jXr" = (
/obj/structure/table/reinforced,
/obj/effect/turf_decal/stripes/line,
-/obj/item/mmi,
-/obj/item/mmi,
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
+/obj/item/brain_processor/organic,
+/obj/item/brain_processor/organic,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/science/robotics/lab)
@@ -40403,6 +40403,7 @@
/turf/open/floor/wood/large,
/area/station/service/library)
"naB" = (
+/obj/item/producepad,
/turf/open/openspace,
/area/station/service/kitchen)
"naC" = (
@@ -66841,6 +66842,7 @@
pixel_x = 6;
pixel_y = 5
},
+/obj/item/producepad,
/turf/open/floor/iron/white/side{
dir = 4
},
diff --git a/_maps/shuttles/ruin/ruin_cyborg_mothership.dmm b/_maps/shuttles/ruin/ruin_cyborg_mothership.dmm
index dc22dbee7347..85bbbe55b572 100644
--- a/_maps/shuttles/ruin/ruin_cyborg_mothership.dmm
+++ b/_maps/shuttles/ruin/ruin_cyborg_mothership.dmm
@@ -685,7 +685,7 @@
/turf/open/floor/plating/airless,
/area/shuttle/ruin/cyborg_mothership)
"Ng" = (
-/obj/item/mmi,
+/obj/item/brain_processor/organic,
/turf/open/floor/circuit/green/airless,
/area/shuttle/ruin/cyborg_mothership)
"Nv" = (
diff --git a/_maps/shuttles/whiteship/whiteship_delta.dmm b/_maps/shuttles/whiteship/whiteship_delta.dmm
index 7c99b731c7ac..ce5b3f0084c7 100644
--- a/_maps/shuttles/whiteship/whiteship_delta.dmm
+++ b/_maps/shuttles/whiteship/whiteship_delta.dmm
@@ -1771,7 +1771,7 @@
},
/obj/structure/closet/crate,
/obj/item/grenade/chem_grenade/metalfoam,
-/obj/item/relic,
+/obj/item/assembly/relic,
/obj/item/t_scanner,
/obj/effect/spawner/random/maintenance/three,
/obj/effect/turf_decal/tile/neutral/fourcorners,
diff --git a/_maps/virtual_domains/abductor_ship.dmm b/_maps/virtual_domains/abductor_ship.dmm
index 092f8d314003..27c0fc01b99c 100644
--- a/_maps/virtual_domains/abductor_ship.dmm
+++ b/_maps/virtual_domains/abductor_ship.dmm
@@ -275,7 +275,7 @@
pixel_x = 6;
pixel_y = -5
},
-/obj/item/gun/energy/shrink_ray{
+/obj/item/gun/energy/recharge/shrink_ray{
pixel_x = -5;
pixel_y = 7
},
diff --git a/biome.json b/biome.json
index e00e95dc4c01..cfa72e007060 100644
--- a/biome.json
+++ b/biome.json
@@ -69,5 +69,14 @@
"clientKind": "git",
"enabled": false,
"useIgnoreFile": false
- }
+ },
+ "overrides": [
+ {
+ "includes": ["**/build_flags.jsonc"],
+ "json": {
+ "parser": { "allowTrailingCommas": true },
+ "formatter": { "trailingCommas": "all" }
+ }
+ }
+ ]
}
diff --git a/build/behavior_trees/code/datums/ai/monkey/monkey_combat.bt.compiled.json b/build/behavior_trees/code/datums/ai/monkey/monkey_combat.bt.compiled.json
index 1e5b39173484..588845adc30e 100644
--- a/build/behavior_trees/code/datums/ai/monkey/monkey_combat.bt.compiled.json
+++ b/build/behavior_trees/code/datums/ai/monkey/monkey_combat.bt.compiled.json
@@ -1 +1 @@
-{"type":"/datum/bt_node/decorator/bb_key_set","children":[{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/is_at_distance","children":[{"type":"/datum/bt_node/ai_behavior/set_bb_key","target_key":"Current Target"}],"observer_abort":2,"invert":true,"target_key":"Current Target","maximum_distance":10,"require_reach":false},{"type":"/datum/bt_node/decorator/pawn_health_below","children":[{"type":"/datum/bt_node/subtree/run_away_from_target"}],"observer_abort":3,"health_threshold":40},{"type":"/datum/bt_node/subtree/monkey_find_weapon"},{"type":"/datum/bt_node/decorator/mob_stat_at_least","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/composite/sequence","children":[{"type":"/datum/bt_node/ai_behavior/acquire_target/update_interaction_target","target_key":"BB_monkey_target_disposal","target_source":"/datum/target_source/oview_single_type/disposal_unit","targeting_strategy":"/datum/targeting_strategy/anything","vision_range":9},{"type":"/datum/bt_node/ai_behavior/move_to_target","target_key":"Current Target","required_dist":1,"finish_on_arrival":true,"movement_type":"/datum/ai_movement/jps"},{"type":"/datum/bt_node/ai_behavior/grab_target","target_key":"Current Target"},{"type":"/datum/bt_node/ai_behavior/move_to_target","target_key":"BB_monkey_target_disposal","required_dist":1,"finish_on_arrival":true,"movement_type":"/datum/ai_movement/jps"},{"type":"/datum/bt_node/ai_behavior/stuff_in_disposal","attack_target_key":"Current Target","disposal_target_key":"BB_monkey_target_disposal"},{"type":"/datum/bt_node/ai_behavior/set_bb_key","target_key":"Current Target"}]},{"type":"/datum/bt_node/ai_behavior/set_bb_key","target_key":"Current Target"}]}],"observer_abort":2,"invert":false,"key":"Current Target","min_stat":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/target_can_be_shove_stunned","children":[{"type":"/datum/bt_node/ai_behavior/shove_target","target_key":"Current Target"}],"target_key":"Current Target"},{"type":"/datum/bt_node/ai_behavior/monkey_attack_mob","target_key":"Current Target"}]}],"success_policy":1,"failure_policy":1},{"type":"/datum/bt_node/ai_behavior/agile_melee_movement","target_key":"Current Target","standoff_max":4}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"finish_on_primary":true}]},{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/decorator/cooldown","children":[{"type":"/datum/bt_node/ai_behavior/recruit_monkeys","target_key":"Current Target"}],"cooldown_key":"BB_monkey_recruit_cooldown","cooldown_duration":10}],"success_policy":1,"failure_policy":1,"loop_delay":50},{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/decorator/cooldown","children":[{"type":"/datum/bt_node/decorator/random_chance","children":[{"type":"/datum/bt_node/ai_behavior/battle_screech/monkey"}],"chance":0.25}],"cooldown_key":"Battle Screech Cooldown","cooldown_duration":5}],"success_policy":1,"failure_policy":1,"loop_delay":10},{"type":"/datum/bt_node/ai_behavior/acquire_target/update_interaction_target/monkey_find_weapon","time_between_perform":0,"target_key":"BB_monkey_pickuptarget","targeting_strategy":"/datum/targeting_strategy/monkey_weapon_upgrade","target_source":"/datum/target_source/monkey_weapon_upgrade","vision_range":5}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"repeat_secondary_delay":2.0,"finish_on_primary":true}],"key":"Current Target","observer_abort":2}
+{"type":"/datum/bt_node/decorator/bb_key_set","children":[{"type":"/datum/bt_node/composite/parallel","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/decorator/is_at_distance","children":[{"type":"/datum/bt_node/ai_behavior/set_bb_key","target_key":"Current Target"}],"observer_abort":2,"invert":true,"target_key":"Current Target","maximum_distance":10,"require_reach":false},{"type":"/datum/bt_node/decorator/pawn_health_below","children":[{"type":"/datum/bt_node/subtree/run_away_from_target"}],"observer_abort":3,"health_threshold":40},{"type":"/datum/bt_node/subtree/monkey_find_weapon"},{"type":"/datum/bt_node/decorator/mob_stat_at_least","children":[{"type":"/datum/bt_node/composite/selector","children":[{"type":"/datum/bt_node/composite/sequence","children":[{"type":"/datum/bt_node/ai_behavior/acquire_target/update_interaction_target","target_key":"BB_monkey_target_disposal","target_source":"/datum/target_source/oview_single_type/disposal_unit","targeting_strategy":"/datum/targeting_strategy/anything","vision_range":9},{"type":"/datum/bt_node/ai_behavior/move_to_target","target_key":"Current Target","required_dist":1,"finish_on_arrival":true,"movement_type":"/datum/ai_movement/jps"},{"type":"/datum/bt_node/ai_behavior/grab_target","target_key":"Current Target"},{"type":"/datum/bt_node/ai_behavior/move_to_target","target_key":"BB_monkey_target_disposal","required_dist":1,"finish_on_arrival":true,"movement_type":"/datum/ai_movement/jps"},{"type":"/datum/bt_node/ai_behavior/stuff_in_disposal","attack_target_key":"Current Target","disposal_target_key":"BB_monkey_target_disposal"},{"type":"/datum/bt_node/ai_behavior/set_bb_key","target_key":"Current Target"}]},{"type":"/datum/bt_node/ai_behavior/set_bb_key","target_key":"Current Target"}]}],"observer_abort":2,"invert":false,"key":"Current Target","min_stat":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/target_can_be_shove_stunned","children":[{"type":"/datum/bt_node/ai_behavior/shove_target","target_key":"Current Target"}],"target_key":"Current Target"},{"type":"/datum/bt_node/ai_behavior/monkey_attack_mob","target_key":"Current Target"}]}],"success_policy":1,"failure_policy":1},{"type":"/datum/bt_node/ai_behavior/agile_melee_movement","target_key":"Current Target","standoff_max":4}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"finish_on_primary":true}]},{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/decorator/cooldown","children":[{"type":"/datum/bt_node/ai_behavior/recruit_monkeys","target_key":"Current Target"}],"cooldown_key":"BB_monkey_recruit_cooldown","cooldown_duration":10}],"success_policy":1,"failure_policy":1,"loop_delay":50},{"type":"/datum/bt_node/composite/subplan","children":[{"type":"/datum/bt_node/decorator/cooldown","children":[{"type":"/datum/bt_node/decorator/random_chance","children":[{"type":"/datum/bt_node/ai_behavior/battle_screech/monkey"}],"chance":0.25}],"cooldown_key":"Battle Screech Cooldown","cooldown_duration":5}],"success_policy":1,"failure_policy":1,"loop_delay":10},{"type":"/datum/bt_node/ai_behavior/acquire_target/update_interaction_target/monkey_find_weapon","time_between_perform":0,"target_key":"BB_monkey_pickuptarget","targeting_strategy":"/datum/targeting_strategy/monkey_weapon_upgrade","target_source":"/datum/target_source/monkey_weapon_upgrade","vision_range":5}],"failure_policy":0,"success_policy":0,"repeat_secondary":true,"repeat_secondary_delay":2.0,"finish_on_primary":true}],"key":"Current Target","observer_abort":3}
diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index 818f9b07c711..0b4834c44c47 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -100,6 +100,7 @@
#define ORGAN_SLOT_BREATHING_TUBE "breathing_tube"
#define ORGAN_SLOT_EARS "ears"
#define ORGAN_SLOT_EYES "eye_sight"
+#define ORGAN_SLOT_FANGS "fangs"
#define ORGAN_SLOT_HEART "heart"
#define ORGAN_SLOT_HEART_AID "heartdrive"
#define ORGAN_SLOT_HUD "eye_hud"
@@ -191,6 +192,7 @@ GLOBAL_LIST_INIT(organ_process_order, list(
ORGAN_SLOT_XENO_ACIDGLAND,
ORGAN_SLOT_XENO_NEUROTOXINGLAND,
ORGAN_SLOT_XENO_EGGSAC,
+ ORGAN_SLOT_FANGS,
))
// Defines for used in creating "perks" for the species preference pages.
diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm
index c3b175bfdef8..04b63519ce15 100644
--- a/code/__DEFINES/_flags.dm
+++ b/code/__DEFINES/_flags.dm
@@ -324,12 +324,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
/// Cancel the action if the user does another action (mainly via clicking)
#define DO_AFTER_CHECK_NEXT_MOVE (1<<5)
-// Spacevine-related flags
-/// Is the spacevine / flower bud heat resistant
-#define SPACEVINE_HEAT_RESISTANT (1 << 0)
-/// Is the spacevine / flower bud cold resistant
-#define SPACEVINE_COLD_RESISTANT (1 << 1)
-
// Flags for flora structures
#define FLORA_HERBAL (1 << 0)
#define FLORA_WOODEN (1 << 1)
@@ -376,3 +370,19 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define EMPATH_SEE_COLD (1<<7)
/// Can the empath see if living mob has the fundamentally evil trait
#define EMPATH_SEE_EVIL (1<<8)
+
+// Container flags for get_loose_container
+/// Count mob inventory as a valid container
+#define LOOSE_CONTAINER_INCLUDE_INVENTORY (1<<0)
+/// Count modsuits with at least one sealed part as valid containers, even if mob inventory is not a valid container
+#define LOOSE_CONTAINER_INCLUDE_SEALED_MODSUIT (1<<1)
+/// Count atom storage as a valid container
+#define LOOSE_CONTAINER_INCLUDE_STORAGE (1<<2)
+/// Count closets as a valid container
+#define LOOSE_CONTAINER_INCLUDE_CLOSET (1<<3)
+/// Count vehicles as a valid container
+#define LOOSE_CONTAINER_INCLUDE_VEHICLE (1<<4)
+/// Count mech equipment (particularly cargo holds and sleepers) as a valid container
+#define LOOSE_CONTAINER_INCLUDE_MECH_EQUIPMENT (1<<5)
+/// Count stomachs as a valid container (ew)
+#define LOOSE_CONTAINER_INCLUDE_STOMACH (1<<6)
diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm
index 7f5487651f92..656763181126 100644
--- a/code/__DEFINES/access.dm
+++ b/code/__DEFINES/access.dm
@@ -553,46 +553,6 @@
/// Used to seed the accesses_by_region list in SSid_access. A list of all CENTCOM_ACCESS regional accesses.
#define REGION_ACCESS_CENTCOM CENTCOM_ACCESS
-/**
- * A list of PDA paths that can be painted as well as the regional heads which should be able to paint them.
- * If a PDA is not in this list, it cannot be painted using the PDA & ID Painter.
- * If a PDA is in this list, it can always be painted with ACCESS_CHANGE_IDS.
- * Used to see pda_region in [/datum/controller/subsystem/id_access/proc/setup_tgui_lists]
- */
-#define PDA_PAINTING_REGIONS list( \
- /obj/item/modular_computer/pda = list(REGION_GENERAL), \
- /obj/item/modular_computer/pda/clown = list(REGION_GENERAL), \
- /obj/item/modular_computer/pda/mime = list(REGION_GENERAL), \
- /obj/item/modular_computer/pda/medical = list(REGION_MEDBAY), \
- /obj/item/modular_computer/pda/coroner = list(REGION_MEDBAY), \
- /obj/item/modular_computer/pda/engineering = list(REGION_ENGINEERING), \
- /obj/item/modular_computer/pda/security = list(REGION_SECURITY), \
- /obj/item/modular_computer/pda/detective = list(REGION_SECURITY), \
- /obj/item/modular_computer/pda/warden = list(REGION_SECURITY), \
- /obj/item/modular_computer/pda/janitor = list(REGION_GENERAL), \
- /obj/item/modular_computer/pda/science = list(REGION_RESEARCH), \
- /obj/item/modular_computer/pda/heads/quartermaster = list(REGION_COMMAND), \
- /obj/item/modular_computer/pda/heads/hop = list(REGION_COMMAND), \
- /obj/item/modular_computer/pda/heads/hos = list(REGION_COMMAND), \
- /obj/item/modular_computer/pda/heads/cmo = list(REGION_COMMAND), \
- /obj/item/modular_computer/pda/heads/ce = list(REGION_COMMAND), \
- /obj/item/modular_computer/pda/heads/rd = list(REGION_COMMAND), \
- /obj/item/modular_computer/pda/heads/captain = list(REGION_COMMAND), \
- /obj/item/modular_computer/pda/cargo = list(REGION_SUPPLY), \
- /obj/item/modular_computer/pda/bitrunner = list(REGION_SUPPLY), \
- /obj/item/modular_computer/pda/shaftminer = list(REGION_SUPPLY), \
- /obj/item/modular_computer/pda/chaplain = list(REGION_GENERAL), \
- /obj/item/modular_computer/pda/lawyer = list(REGION_GENERAL), \
- /obj/item/modular_computer/pda/botanist = list(REGION_GENERAL), \
- /obj/item/modular_computer/pda/roboticist = list(REGION_RESEARCH), \
- /obj/item/modular_computer/pda/curator = list(REGION_GENERAL), \
- /obj/item/modular_computer/pda/cook = list(REGION_GENERAL), \
- /obj/item/modular_computer/pda/bar = list(REGION_GENERAL), \
- /obj/item/modular_computer/pda/atmos = list(REGION_ENGINEERING), \
- /obj/item/modular_computer/pda/chemist = list(REGION_MEDBAY), \
- /obj/item/modular_computer/pda/geneticist = list(REGION_RESEARCH), \
-)
-
/// All regions that make up the station area. Helper define to quickly designate a region as part of the station or not. Access via SSid_access.station_regions.
#define REGION_AREA_STATION list( \
REGION_COMMAND, \
diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm
index 69741ef4bff0..1e3e9cd38612 100644
--- a/code/__DEFINES/achievements.dm
+++ b/code/__DEFINES/achievements.dm
@@ -63,6 +63,15 @@
#define MEDAL_SHARKDRAGON "Sharkdragon"
#define MEDAL_THEORETICAL_LIMITS "All Within Theoretical Limits"
#define MEDAL_DESENSITIZED "In Flanders Fields"
+#define MEDAL_SPICY_HANDSHAKE "Spicy Handshake"
+#define MEDAL_DOWN_LOW_TOO_SLOW "Down Low Too Slow"
+#define MEDAL_SOUVENIR "Syndicate T-Shirt Achievement"
+#define MEDAL_SAMARITAN "Good Samaritan"
+#define MEDAL_RED_PILL "Red Pill"
+#define MEDAL_KONG "Rise of Kong"
+#define MEDAL_NO_PARKING "You Can't Park here"
+#define MEDAL_CLEVER_GIRL "Clever Girl"
+#define MEDAL_BAG_OF_HOLDING "The Ultimate Storage Solution"
//Skill medal hub IDs
#define MEDAL_LEGENDARY_MINER "Legendary Miner"
diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
index 7d4d6d753395..d14fc6f08895 100644
--- a/code/__DEFINES/antagonists.dm
+++ b/code/__DEFINES/antagonists.dm
@@ -359,7 +359,7 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list(
/// Only appears for spy bounties
#define OBJECTIVE_ITEM_TYPE_SPY "spy"
-// Progression traitor defines
+// Traitor objective defines
/// Chance that the traitor could roll hijack if the pop limit is met.
#define HIJACK_PROB 10
diff --git a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm
index 41498c929c43..4d4556a0098f 100644
--- a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm
+++ b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm
@@ -91,8 +91,6 @@
#define BODYTEMP_HEAT_WOUND_LIMIT (BODYTEMP_NORMAL + 90) // 400.5 k
/// The modifier on cold damage limit hulks get ontop of their regular limit
#define BODYTEMP_HULK_COLD_DAMAGE_LIMIT_MODIFIER 25
-/// The modifier on cold damage hulks get.
-#define HULK_COLD_DAMAGE_MOD 2
// Body temperature warning icons
/// The temperature the red icon is displayed.
diff --git a/code/__DEFINES/atmospherics/atmos_piping.dm b/code/__DEFINES/atmospherics/atmos_piping.dm
index 54d29ffa59d0..aeb5b33b1865 100644
--- a/code/__DEFINES/atmospherics/atmos_piping.dm
+++ b/code/__DEFINES/atmospherics/atmos_piping.dm
@@ -99,6 +99,26 @@
#define PIPING_BRIDGE (1<<5)
/// intended to connect with layers 2 and 4 only
#define PIPING_DISTRO_AND_WASTE_LAYERS (1<<6)
+/// Applied to devices to indicate to connected pipes that they should not take this device's color
+#define PIPING_DONT_SHARE_COLOR (1<<7)
+
+DEFINE_BITFIELD(pipe_flags, list(
+ "All Colors" = PIPING_ALL_COLORS,
+ "All Layers" = PIPING_ALL_LAYER,
+ "Bridge" = PIPING_BRIDGE,
+ "Cardinal Auto-Normalize" = PIPING_CARDINAL_AUTONORMALIZE,
+ "Default Layer Only" = PIPING_DEFAULT_LAYER_ONLY,
+ "Distro and Waste Layers Only" = PIPING_DISTRO_AND_WASTE_LAYERS,
+ "Don't Share Color" = PIPING_DONT_SHARE_COLOR,
+ "One Per Turf" = PIPING_ONE_PER_TURF,
+))
+
+/// When given two atmos nodes, determines which's color should be used for the pipe between them
+#define SELECT_ATMOS_NODE_COLOR(our_node, other_node) ( \
+ (isnull(other_node) || (other_node.pipe_flags & PIPING_DONT_SHARE_COLOR) || other_node.pipe_color == ATMOS_COLOR_OMNI) \
+ ? our_node.pipe_color \
+ : other_node.pipe_color \
+)
// Ventcrawling bitflags, handled in var/vent_movement
///Allows for ventcrawling to occur. All atmospheric machines have this flag on by default. Cryo is the exception
diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm
index 49ef949499c9..00ad31604f9e 100644
--- a/code/__DEFINES/colors.dm
+++ b/code/__DEFINES/colors.dm
@@ -547,6 +547,7 @@ GLOBAL_LIST_INIT(heretic_path_to_color, list(
#define EYE_COLOR_HUD_PRIORITY 30
#define EYE_COLOR_LUMINESCENT_PRIORITY 40
#define EYE_COLOR_DISC 45 // DARKPACK EDIT ADD
+#define EYE_COLOR_CULTLIKE_PRIORITY 49
#define EYE_COLOR_CULT_PRIORITY 50
// Client color priorities
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 9f57ff4ed909..a7d4f2e8f491 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -227,8 +227,6 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
//Sawn off nerfs
///accuracy penalty of sawn off guns
#define SAWN_OFF_ACC_PENALTY 25
-///added recoil of sawn off guns
-#define SAWN_OFF_RECOIL 1
//ammo box sprite defines
///ammo box will always use provided icon state
@@ -412,6 +410,8 @@ GLOBAL_LIST_INIT(all_precise_body_zones, list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_
#define SILENCE_DEFAULT_MESSAGES "silence_default_messages"
/// If set in modifiers, default hitsound is silenced
#define SILENCE_HITSOUND "silence_hitsound"
+/// Set towards the end of an attack with how much actual damage was dealt
+#define DAMAGE_DONE "damage_done"
/// Used in attack chain to set the force of the attack without changing the base force of the item.
#define SET_ATTACK_FORCE(atk_mods, value) \
diff --git a/code/__DEFINES/dcs/signals/signals_area.dm b/code/__DEFINES/dcs/signals/signals_area.dm
index 5636a4c35a0f..d7dca923fab8 100644
--- a/code/__DEFINES/dcs/signals/signals_area.dm
+++ b/code/__DEFINES/dcs/signals/signals_area.dm
@@ -27,6 +27,9 @@
/// Called when the air alarm mode is updated
#define COMSIG_AIRALARM_UPDATE_MODE "airalarm_update_mode"
+/// Sent from base of area/set_parallax_movedir: (new_movedir)
+#define COMSIG_AREA_PARALLAX_DIR_CHANGED "area_parallax_dir_changed"
+
// Area fire signals
/// Sent when an area's fire var changes: (fire_value)
#define COMSIG_AREA_FIRE_CHANGED "area_fire_set"
diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm
index 39e4ee1e0ba8..5b6bbcc1782c 100644
--- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm
+++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm
@@ -9,6 +9,8 @@
#define COMPONENT_MOVABLE_BLOCK_PRE_MOVE (1<<0)
///from base of atom/movable/Moved(): (atom/old_loc, dir, forced, list/old_locs)
#define COMSIG_MOVABLE_MOVED "movable_moved"
+/// Sent to an existing occupant during base turf Initialize(), before subtype effects: (turf/initializing_turf)
+#define COMSIG_MOVABLE_TURF_INITIALIZING "movable_turf_initializing"
///from base of atom/movable/Cross(): (/atom/movable)
#define COMSIG_MOVABLE_CROSS "movable_cross"
#define COMPONENT_BLOCK_CROSS (1<<0)
@@ -84,8 +86,10 @@
#define COMSIG_MOVABLE_PIPE_EJECTING "movable_pipe_ejecting"
///called when the movable successfully has its anchored var changed, from base atom/movable/set_anchored(): (value)
#define COMSIG_MOVABLE_SET_ANCHORED "movable_set_anchored"
-///from base of atom/movable/setGrabState(): (newstate)
+///from base of atom/movable/setGrabState(). Called on the person grabbing: (newstate)
#define COMSIG_MOVABLE_SET_GRAB_STATE "living_set_grab_state"
+///from base of atom/movable/setGrabState(). Called on the thing that got grabbed: (newstate)
+#define COMSIG_MOVABLE_CHANGED_GRABBED_STATE "movable_changed_grabbed_state"
/// from base of mob/living/resist_grab(), to the grabber: (mob/living/grabbed, list/grab_stats)
#define COMSIG_MOVABLE_GRABBED_RESISTING "movable_grabbed_resisting"
#define GRAB_STAT_EFFECTIVE_STATE 1
diff --git a/code/__DEFINES/dcs/signals/signals_hud.dm b/code/__DEFINES/dcs/signals/signals_hud.dm
index b141f7d8f576..608e2de3c03b 100644
--- a/code/__DEFINES/dcs/signals/signals_hud.dm
+++ b/code/__DEFINES/dcs/signals/signals_hud.dm
@@ -2,8 +2,6 @@
#define COMSIG_HUD_EYE_CHANGED "hud_eye_changed"
/// Sent from /datum/hud/proc/eye_z_changed() : (new_z)
#define COMSIG_HUD_Z_CHANGED "hud_z_changed"
-/// Sent from /datum/hud/proc/eye_z_changed() : (old_offset, new_offset)
-#define COMSIG_HUD_OFFSET_CHANGED "hud_offset_changed"
/// Sent from /atom/movable/screen/lobby/button/collapse/proc/collapse_buttons() : ()
#define COMSIG_HUD_LOBBY_COLLAPSED "hud_lobby_collapsed"
/// Sent from /atom/movable/screen/lobby/button/collapse/proc/expand_buttons() : ()
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
index fe99bfa253b1..ff1515d55d10 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
@@ -150,6 +150,9 @@
///from /mob/living/carbon/human/get_id_name; only returns if the mob has TRAIT_UNKNOWN and it's being overridden: (identity)
#define COMSIG_HUMAN_GET_FORCED_NAME "human_get_forced_name"
+///from /mob/living/carbon/human/spec_stun(): (list/amount)
+#define COMSIG_HUMAN_SPEC_STUN "human_spec_stun"
+
// Mob transformation signals
///Called when a human turns into a monkey, from /mob/living/carbon/proc/finish_monkeyize()
#define COMSIG_HUMAN_MONKEYIZE "human_monkeyize"
@@ -184,9 +187,9 @@
///Called from on_losing(mob/living/carbon/human/owner)
#define COMSIG_MUTATION_LOST "mutation_lost"
-/// Called from /datum/species/proc/harm(): (mob/living/carbon/human/attacker, damage, attack_type, obj/item/bodypart/affecting, final_armor_block, kicking)
+/// Called from /datum/species/proc/harm(): (mob/living/carbon/human/attacker, damage, attack_type, atk_effect, obj/item/bodypart/affecting, final_armor_block, limb_sharpness)
#define COMSIG_HUMAN_GOT_PUNCHED "human_got_punched"
-/// Called from /datum/species/proc/harm(): (mob/living/carbon/human/attacked, damage, attack_type, obj/item/bodypart/affecting, final_armor_block, kicking)
+/// Called from /datum/species/proc/harm(): (mob/living/carbon/human/attacked, damage, attack_type, atk_effect, obj/item/bodypart/affecting, final_armor_block, limb_sharpness)
#define COMSIG_HUMAN_PUNCHED "human_punched"
/// Called at the very end of human character setup
diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm
index c49e85eeb20e..fdcf50acd2bb 100644
--- a/code/__DEFINES/dcs/signals/signals_object.dm
+++ b/code/__DEFINES/dcs/signals/signals_object.dm
@@ -106,10 +106,15 @@
// /obj access signals
#define COMSIG_AIRLOCK_SHELL_ALLOWED "airlock_shell_try_allowed"
+//from /obj/machinery/door/open(): (forced)
+#define COMSIG_MOB_OPENED_DOOR "mob_opened_door"
+
// /obj/machinery/door/airlock signals
//from /obj/machinery/door/airlock/open(): (forced)
#define COMSIG_AIRLOCK_OPEN "airlock_open"
+//from /obj/machinery/door/airlock/open(): (forced)
+#define COMSIG_MOB_OPENED_AIRLOCK "mob_opened_airlock"
//from /obj/machinery/door/airlock/close(): (forced)
#define COMSIG_AIRLOCK_CLOSE "airlock_close"
///from /obj/machinery/door/airlock/set_bolt():
@@ -390,7 +395,7 @@
#define COMSIG_GUN_CHAMBER_PROCESSED "gun_chamber_processed"
///called in /obj/item/gun/ballistic/process_chamber (casing)
#define COMSIG_CASING_EJECTED "casing_ejected"
-///called in /obj/item/gun/ballistic/sawoff(mob/user, obj/item/saw, handle_modifications) : (mob/user)
+///called in /obj/item/gun/ballistic/try_sawoff(mob/user, obj/item/saw, handle_modifications) : (mob/user)
#define COMSIG_GUN_BEING_SAWNOFF "gun_being_sawnoff"
#define COMPONENT_CANCEL_SAWING_OFF (1<<0)
#define COMSIG_GUN_SAWN_OFF "gun_sawn_off"
@@ -548,7 +553,7 @@
///from /datum/computer_file/program/nt_pay/_pay(), sent to every physical card of a bank account: (computer, money_received)
#define COMSIG_ID_CARD_NTPAY_MONEY_RECEIVED "id_card_ntpay_money_received"
-///from base of /obj/item/mmi/set_brainmob(): (mob/living/brain/new_brainmob)
+///from base of /obj/item/brain_processor/set_brainmob(): (mob/living/brain/new_brainmob)
#define COMSIG_MMI_SET_BRAINMOB "mmi_set_brainmob"
/// from base of /obj/item/slimepotion/speed/interact_with_atom(): (obj/target, /obj/src, mob/user)
diff --git a/code/__DEFINES/dcs/signals/signals_parallax.dm b/code/__DEFINES/dcs/signals/signals_parallax.dm
new file mode 100644
index 000000000000..75d10c5fed0d
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_parallax.dm
@@ -0,0 +1,2 @@
+/// Sent from /atom/movable/screen/parallax_home/proc/set_perspective() : (atom/old_perspective, atom/new_perspective)
+#define COMSIG_PARALLAX_PERSPECTIVE_CHANGED "parallax_perspective_changed"
diff --git a/code/__DEFINES/dcs/signals/signals_plane_master_group.dm b/code/__DEFINES/dcs/signals/signals_plane_master_group.dm
index 61bd33c3e229..859275b04153 100644
--- a/code/__DEFINES/dcs/signals/signals_plane_master_group.dm
+++ b/code/__DEFINES/dcs/signals/signals_plane_master_group.dm
@@ -1,2 +1,6 @@
/// from /datum/plane_master_group/proc/set_hud(): (datum/hud/old_hud, datum/hud/new_hud)
-#define COMSIG_GROUP_HUD_CHANGED "group_hud_changed"
+#define COMSIG_PLANE_GROUP_HUD_CHANGED "group_hud_changed"
+/// Sent from /datum/plane_master_group/proc/build_planes_offset() : (old_offset, new_offset)
+#define COMSIG_PLANE_GROUP_OFFSET_CHANGED "group_offset_changed"
+/// Sent from /datum/plane_master_group/proc/set_perspective() : (atom/old_perspective, atom/new_perspective)
+#define COMSIG_PLANE_GROUP_PERSPECTIVE_CHANGED "group_perspective_changed"
diff --git a/code/__DEFINES/dcs/signals/signals_spell.dm b/code/__DEFINES/dcs/signals/signals_spell.dm
index 50f1ee20fae3..345f4a0efa7a 100644
--- a/code/__DEFINES/dcs/signals/signals_spell.dm
+++ b/code/__DEFINES/dcs/signals/signals_spell.dm
@@ -131,3 +131,7 @@
#define COMPONENT_ITEM_CHARGED (1 << 0)
/// Return if the item had a negative side effect occur while recharging
#define COMPONENT_ITEM_BURNT_OUT (1 << 1)
+
+// Time Stop
+/// Sent from /datum/action/cooldown/spell/timestop/cast(), to the atom casting the spell: (datum/action/cooldown/spell/timestop/spell, list/immune_atoms)
+#define COMSIG_ATOM_STOPPING_TIME "atom_stopping_time"
diff --git a/code/__DEFINES/explosions.dm b/code/__DEFINES/explosions.dm
index dd9a74bbae34..8d1bae1e55e8 100644
--- a/code/__DEFINES/explosions.dm
+++ b/code/__DEFINES/explosions.dm
@@ -23,7 +23,7 @@
if(!(target.flags_1 & PREVENT_CONTENTS_EXPLOSION_1)) { \
target.contents_explosion(##args);\
};\
- if(!(SEND_SIGNAL(target, COMSIG_ATOM_PRE_EX_ACT, ##args) & COMPONENT_CANCEL_EX_ACT)) { \
+ if(!(HAS_TRAIT(target, TRAIT_BOMBIMMUNE)) && !(SEND_SIGNAL(target, COMSIG_ATOM_PRE_EX_ACT, ##args) & COMPONENT_CANCEL_EX_ACT)) { \
SEND_SIGNAL(target, COMSIG_ATOM_EX_ACT, ##args);\
target.ex_act(##args);\
}
diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm
index 76e352bacc58..f6470377792f 100644
--- a/code/__DEFINES/food.dm
+++ b/code/__DEFINES/food.dm
@@ -20,6 +20,7 @@
#define GORE (1<<19)
#define STONE (1<<20)
#define EGG (1<<21)
+#define CHOCOLATE (1<<22) //DARKPACK EDIT ADDITION - Chocolate for lupus poisoning
DEFINE_BITFIELD(foodtypes, list(
"MEAT" = MEAT,
@@ -44,6 +45,7 @@ DEFINE_BITFIELD(foodtypes, list(
"GORE" = GORE,
"STONE" = STONE,
"EGG" = EGG,
+ "CHOCOLATE" = CHOCOLATE, //DARKPACK EDIT ADDITION - Chocolate for lupus poisoning
))
/// A list of food type names, in order of their flags
@@ -70,6 +72,7 @@ DEFINE_BITFIELD(foodtypes, list(
"GORE", \
"STONE", \
"EGG", \
+ "CHOCOLATE", \
)
/// IC meaning (more or less) for food flags
@@ -96,6 +99,7 @@ DEFINE_BITFIELD(foodtypes, list(
"Gore", \
"Rocks", \
"Eggs", \
+ "Chocolate", \
)
/// Food types assigned to all podperson organs
diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm
index c648e8636b65..cab3f06531c6 100644
--- a/code/__DEFINES/footsteps.dm
+++ b/code/__DEFINES/footsteps.dm
@@ -36,6 +36,7 @@
#define FOOTSTEP_MOB_RUST "footstep_rust"
#define FOOTSTEP_OBJ_MACHINE "footstep_machine"
#define FOOTSTEP_OBJ_ROBOT "footstep_robot"
+#define FOOTSTEP_MOB_SYNTHETIC "footstep_synthetic"
//priority defines for the footstep_override element
#define STEP_SOUND_NO_PRIORITY 0
@@ -264,4 +265,18 @@ GLOBAL_LIST_INIT(heavyfootstep, list(
'sound/effects/meatslap.ogg'), 100, 0),
))
-#define SHOULD_DISABLE_FOOTSTEPS(source) ((SSlag_switch.measures[DISABLE_FOOTSTEPS] && !(HAS_TRAIT(source, TRAIT_BYPASS_MEASURES))) || HAS_TRAIT(source, TRAIT_SILENT_FOOTSTEPS))
+/// Check if the atom should not be playing foodsteps for whatever reason
+#define SHOULD_ATOM_DISABLE_FOOTSTEPS(source) ( FALSE \
+ || (SSlag_switch.measures[DISABLE_FOOTSTEPS] && !HAS_TRAIT(source, TRAIT_BYPASS_MEASURES)) \
+ || CHECK_MOVE_LOOP_FLAGS(source, MOVEMENT_LOOP_OUTSIDE_CONTROL) \
+ || source.moving_diagonally == SECOND_DIAG_STEP \
+ || (source.movement_type & (VENTCRAWLING | FLYING)) \
+ || source.throwing \
+)
+
+/// Check if the mob should not be playing footsteps for whatever reason
+#define SHOULD_MOB_DISABLE_FOOTSTEPS(source) ( FALSE \
+ || (iscarbon(source) && source.move_intent == MOVE_INTENT_WALK) \
+ || !(source.mobility_flags & MOBILITY_MOVE) \
+ || source.buckled \
+)
diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm
index 408acff568b0..2c3ea2ddc546 100644
--- a/code/__DEFINES/icon_smoothing.dm
+++ b/code/__DEFINES/icon_smoothing.dm
@@ -164,33 +164,26 @@ 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(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_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_AIRLOCK S_OBJ(41) ///obj/machinery/door/airlock
diff --git a/code/__DEFINES/living.dm b/code/__DEFINES/living.dm
index 0aa8bee10646..9b6277eb401d 100644
--- a/code/__DEFINES/living.dm
+++ b/code/__DEFINES/living.dm
@@ -30,3 +30,50 @@
#define PIXEL_X_OFFSET "x"
#define PIXEL_Y_OFFSET "y"
#define PIXEL_Z_OFFSET "z"
+
+//Physiology macros and keys
+
+///Default value for physiology coefficients. It should be an identity for multiplication, so basically 1
+#define DEFAULT_PHYSIOLOGY_VAL 1
+
+///get the physiology coefficient for a specific key
+#define GET_PHYSIOLOGY(living, key) (LAZYACCESS(living.physiology, key) || DEFAULT_PHYSIOLOGY_VAL)
+
+#define _INIT_PHYSIOLOGY_VAL(living, key) \
+ LAZYINITLIST(living.physiology); \
+ if(isnull(living.physiology[key])) { \
+ living.physiology[key] = DEFAULT_PHYSIOLOGY_VAL; \
+ }
+
+#define _CLEAR_PHYSIOLOGY_VAL(living, key) \
+ if(round(living.physiology[key], 0.001) == DEFAULT_PHYSIOLOGY_VAL) { \
+ LAZYREMOVE(living.physiology, key); \
+ }
+
+#define MODIFY_PHYSIOLOGY(living, key, mult) \
+ _INIT_PHYSIOLOGY_VAL(living, key); \
+ living.physiology[key] *= mult;\
+ _CLEAR_PHYSIOLOGY_VAL(living, key);
+
+//Physiology coefficient multipliers (FOR BRUTE/BURN/TOX/OXY/STAMINA damage, we just use the same text macros since they're already there)
+
+/// Multiplier to damage taken from high / low pressure exposure, stacking with the brute modifier
+#define PHYS_COEFF_PRESSURE "pressure"
+/// Multiplier to damage taken from high temperature exposure, stacking with the burn modifier
+#define PHYS_COEFF_HEAT "heat"
+/// Multiplier to damage taken from low temperature exposure, stacking with the burn modifier
+#define PHYS_COEFF_COLD "cold"
+/// Multiplier to the damage electrical shocks can cause
+#define PHYS_COEFF_ELEC_CONDUCTIVITY "elec_conductivity"
+/// Multiplier applied to all incapacitating stuns (knockdown, stun, paralyze, immobilize)
+#define PHYS_COEFF_STUN "stun"
+/// Multiplied aplpied to just knockdowns, stacks with above multiplicatively
+#define PHYS_COEFF_KNOCKDOWN "knockdown"
+/// Modifier to amount of blood lost when bleeding (both on life ticks and from flat bleed calls)
+#define PHYS_COEFF_BLEED "bleed"
+/// Modifier to amount blood regenerated per life tick
+#define PHYS_COEFF_BLOOD_REGEN "blood_regen"
+/// Modifier of the hunger rate taken per tick
+#define PHYS_COEFF_HUNGER_MOD "hunger"
+/// Multiplier for flat damage in general (tox, burn, oxy, brute)
+#define PHYS_COEFF_DAMAGE "damage"
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 09fbe8a9fcbd..058cb255916d 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -128,10 +128,6 @@
"skeletal", \
)
-//Lung respiration type flags
-#define RESPIRATION_OXYGEN (1 << 0)
-#define RESPIRATION_N2 (1 << 1)
-#define RESPIRATION_PLASMA (1 << 2)
#define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human/bodyparts_greyscale.dmi'
//Bodytype defines for surgery, and other misc things.
@@ -429,6 +425,8 @@
#define SLIPPERY_WHEN_LYING_DOWN (1<<6)
///Like sliding, but it's short, it doesn't knockdown, it doesn't stun, it just staggers a bit.
#define WEAK_SLIDE (1<<7)
+/// You can even slip if you're experiencing nograv or flying
+#define SLIP_IN_NOGRAV (1<<8)
#define MAX_CHICKENS 50
diff --git a/code/__DEFINES/movement.dm b/code/__DEFINES/movement.dm
index 8004bf2b6925..6a4f822d25cb 100644
--- a/code/__DEFINES/movement.dm
+++ b/code/__DEFINES/movement.dm
@@ -131,22 +131,6 @@ GLOBAL_VAR_INIT(glide_size_multiplier, 1.0)
/// Anything else
#define TELEPORT_CHANNEL_FREE "free"
-// Container flags for get_teleportable_container
-/// Count mob inventory as a valid container
-#define TELEPORT_CONTAINER_INCLUDE_INVENTORY (1<<0)
-/// Count modsuits with at least one sealed part as valid containers, even if mob inventory is not a valid container
-#define TELEPORT_CONTAINER_INCLUDE_SEALED_MODSUIT (1<<1)
-/// Count atom storage as a valid container
-#define TELEPORT_CONTAINER_INCLUDE_STORAGE (1<<2)
-/// Count closets as a valid container
-#define TELEPORT_CONTAINER_INCLUDE_CLOSET (1<<3)
-/// Count vehicles as a valid container
-#define TELEPORT_CONTAINER_INCLUDE_VEHICLE (1<<4)
-/// Count mech equipment (particularly cargo holds and sleepers) as a valid container
-#define TELEPORT_CONTAINER_INCLUDE_MECH_EQUIPMENT (1<<5)
-/// Count stomachs as a valid container (ew)
-#define TELEPORT_CONTAINER_INCLUDE_STOMACH (1<<6)
-
///Return values for moveloop Move()
#define MOVELOOP_FAILURE 0
#define MOVELOOP_SUCCESS 1
diff --git a/code/__DEFINES/prison.dm b/code/__DEFINES/prison.dm
new file mode 100644
index 000000000000..76d27700b28a
--- /dev/null
+++ b/code/__DEFINES/prison.dm
@@ -0,0 +1,5 @@
+/// Points to be offered for different completed activities within the gulag or prison.
+/// Prison labor points for pressing license plates.
+#define PRISON_LABOR_PLATE 10
+/// Prison labor points for each piece of grown produce
+#define PRISON_LABOR_CROPS 2
diff --git a/code/__DEFINES/quirks.dm b/code/__DEFINES/quirks.dm
index 41b2882e37e8..0c8d5bb67ebb 100644
--- a/code/__DEFINES/quirks.dm
+++ b/code/__DEFINES/quirks.dm
@@ -10,12 +10,10 @@
#define QUIRK_PROCESSES (1<<1)
/// This quirk is has a visual aspect in that it changes how the player looks. Used in generating dummies.
#define QUIRK_CHANGES_APPEARANCE (1<<2)
-/// The only thing this quirk effects is mood so it should be disabled if mood is
-#define QUIRK_MOODLET_BASED (1<<3)
/// This quirk shouldn't be shown by health analyzers and hud, perhaps as considering it medical condition is a far stretch.
-#define QUIRK_HIDE_FROM_SCAN (1<<4)
+#define QUIRK_HIDE_FROM_SCAN (1<<3)
/// Quirk is similar to brain trauma and should be shown in medical guides as one.
/// You don't need to set this on quirks that apply a trauma, that's redundant.
-#define QUIRK_TRAUMALIKE (1<<5)
+#define QUIRK_TRAUMALIKE (1<<4)
/// Do not transfer this quirk via transfer_quirk_datums
-#define QUIRK_NO_TRANSFER (1<<6)
+#define QUIRK_NO_TRANSFER (1<<5)
diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm
index 7634fa8b37f0..b6e8e76cd126 100644
--- a/code/__DEFINES/radio.dm
+++ b/code/__DEFINES/radio.dm
@@ -215,3 +215,13 @@
/// Past this amount of compression, the resulting gibberish will actually
/// replace characters, making it even harder to understand.
#define COMPRESSION_REPLACE_CHARACTER_THRESHOLD 30
+
+// Voice description defines (mainly used to indicate gender at the moment).
+/// Description for a plural voice.
+#define VOICE_DESCRIPTION_PLURAL "Their voice sounds gender neutral."
+/// Description for a gender neutral voice.
+#define VOICE_DESCRIPTION_NEUTER "Its voice sounds gender neutral."
+/// Description for a feminine voice.
+#define VOICE_DESCRIPTION_FEMININE "Her voice sounds feminine."
+/// Description for a masculine voice.
+#define VOICE_DESCRIPTION_MASCULINE "His voice sounds masculine."
diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm
index 1c0d3424fa31..767f834a87a4 100644
--- a/code/__DEFINES/say.dm
+++ b/code/__DEFINES/say.dm
@@ -80,6 +80,8 @@
#define MODE_TTS_IDENTIFIER "tts_identifier"
/// Override the mob's name
#define MODE_SPEAKER_NAME_OVERRIDE "speaker_name_override"
+/// Override the mob's gender
+#define MODE_SPEAKER_GENDER_OVERRIDE "speaker_gender_override"
//Spans. Robot speech, italics, etc. Applied in compose_message().
#define SPAN_ROBOT "robot"
diff --git a/code/__DEFINES/song.dm b/code/__DEFINES/song.dm
index 9df8ebf2ba9b..8ea5e25bb349 100644
--- a/code/__DEFINES/song.dm
+++ b/code/__DEFINES/song.dm
@@ -1,7 +1,3 @@
-#define MUSICIAN_HEARCHECK_MINDELAY 4
-#define MUSIC_MAXLINES 1000
-#define MUSIC_MAXLINECHARS 300
-
#define BPM_TO_TEMPO_SETTING(value) (600 / round(value, 1))
//Return values of song/should_stop_playing()
diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm
index 29f0bb1246c2..3d8d1529a8da 100644
--- a/code/__DEFINES/span.dm
+++ b/code/__DEFINES/span.dm
@@ -168,3 +168,5 @@
// Spans that use embedded tgui components:
// Sorted alphabetically
#define span_tooltip(tip, main_text) ("" + main_text + "")
+/// Creates a tooltip without italicization or a dotted underline under the "say" class.
+#define span_tooltip_subtle(tip, main_text) ("" + main_text + "")
diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm
index fe8f565872f4..436cc7f86b58 100644
--- a/code/__DEFINES/surgery.dm
+++ b/code/__DEFINES/surgery.dm
@@ -2,6 +2,8 @@
#define IS_ORGANIC_ORGAN(organ) (organ.organ_flags & ORGAN_ORGANIC)
/// Helper to figure out if an organ is robotic
#define IS_ROBOTIC_ORGAN(organ) (organ.organ_flags & ORGAN_ROBOTIC)
+/// Helper to figure out if an organ is mineral
+#define IS_MINERAL_ORGAN(organ) (organ.organ_flags & ORGAN_MINERAL)
/// List of organ flags that can not be bioscrambled
#define ORGAN_BIOSCRAMBLE_INCOMPATIBLE (ORGAN_ROBOTIC | ORGAN_MINERAL)
diff --git a/code/__DEFINES/survival_box.dm b/code/__DEFINES/survival_box.dm
new file mode 100644
index 000000000000..c1b7a6a48ae3
--- /dev/null
+++ b/code/__DEFINES/survival_box.dm
@@ -0,0 +1,8 @@
+/// key used in survival_box_overrides on species to overwrite what mask gets put in their survival box
+#define SURVIVAL_MASK_TYPE "mask"
+/// key used in survival_box_overrides on species to overwrite what internals tank gets put in their survival box
+#define SURVIVAL_INTERNALS_TYPE "internals"
+/// key used in survival_box_overrides on species to overwrite what medipen gets put in their survival box
+#define SURVIVAL_MEDIPEN_TYPE "medipen"
+/// key used in survival_box_overrides on species to add an extra item in their survival box
+#define SURVIVAL_EXTRA_TYPE "extra"
diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index 5bf80376e741..32ae9bd2feba 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -39,10 +39,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define STATION_TRAIT_PDA_GLITCHED "station_trait_pda_glitched"
#define STATION_TRAIT_PREMIUM_INTERNALS "station_trait_premium_internals"
#define STATION_TRAIT_PUN_PUN_GYM_DAY "station_trait_pun_pun_gym_day"
+#define STATION_TRAIT_QUICK_SHUTTLE "station_trait_quick_shuttle"
#define STATION_TRAIT_RADIOACTIVE_NEBULA "station_trait_radioactive_nebula"
#define STATION_TRAIT_RANDOM_ARRIVALS "station_trait_random_arrivals"
#define STATION_TRAIT_REVOLUTIONARY_TRASHING "station_trait_revolutionary_trashing"
#define STATION_TRAIT_SHUTTLE_SALE "station_trait_shuttle_sale"
+#define STATION_TRAIT_SLOW_SHUTTLE "station_trait_slow_shuttle"
#define STATION_TRAIT_SMALLER_PODS "station_trait_smaller_pods"
#define STATION_TRAIT_SPIDER_INFESTATION "station_trait_spider_infestation"
#define STATION_TRAIT_UNIQUE_AI "station_trait_unique_ai"
@@ -51,11 +53,13 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define STATION_TRAIT_SPAWN_WEAKPOINTS "station_trait_spawn_weakpoints"
#define STATION_TRAIT_VENDING_SHORTAGE "station_trait_vending_shortage"
+// Client traits
+/// This client has parallax displayed on it on the specified map
+#define TRAIT_PARALLAX_DISPLAYED(submap) "parallax_displayed_[submap]_map"
+
// Hud traits
/// This hud is owned by a client with an open escape menu
#define TRAIT_ESCAPE_MENU_OPEN "escape_menu_open"
-/// This hud has parallax displayed on it
-#define TRAIT_PARALLAX_DISPLAYED "parallax_displayed"
// Mob traits
/// Forces the user to stay unconscious.
@@ -732,6 +736,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Trait that makes you bite when attacking with an unarmed strike.
#define TRAIT_FERAL_BITER "feral biter"
+/// Trait that makes you only SOMETIMES bite when attacking with an unarmed strike.
+#define TRAIT_REFINED_BITER "refined biter"
+
// METABOLISMS
// Various jobs on the station have historically had better reactions
// to various drinks and foodstuffs. Security liking donuts is a classic
@@ -1737,4 +1744,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// 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"
+/// Mobs with this trait will appear as human to medical scanners even if they are not human
+#define TRAIT_HUMAN_DISGUISE "human_disguise"
+
// END TRAIT DEFINES
diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm
index 2bc29bdf2da2..e37748808921 100644
--- a/code/__DEFINES/traits/sources.dm
+++ b/code/__DEFINES/traits/sources.dm
@@ -191,8 +191,8 @@
#define TIPPED_OVER "tipped-over"
/// Trait applied to PAIs by being folded
#define PAI_FOLDED "pai-folded"
-/// Trait applied to brain mobs when they lack external aid for locomotion, such as being inside a mech.
-#define BRAIN_UNAIDED "brain-unaided"
+/// Trait applied by brain processors
+#define MMI_ASSISTED "mmi-assisted"
/// Trait applied to a mob when it gets a required "operational datum" (components/elements). Sends out the source as the type of the element.
#define TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM "element-required"
/// Trait applied by MODsuits.
diff --git a/code/__DEFINES/uplink.dm b/code/__DEFINES/uplink.dm
index 3e75278132a5..260b1904cc9c 100644
--- a/code/__DEFINES/uplink.dm
+++ b/code/__DEFINES/uplink.dm
@@ -23,9 +23,6 @@
/// A define that excludes clown ops from the regular nukeop gear lineup
#define UPLINK_SERIOUS_OPS (UPLINK_NUKE_OPS | UPLINK_LONE_OP)
-/// Progression gets turned into a user-friendly form. This is just an abstract equation that makes progression not too large.
-#define DISPLAY_PROGRESSION(time) round(time/60, 0.01)
-
/// Traitor discount size categories
#define TRAITOR_DISCOUNT_BIG "big_discount"
#define TRAITOR_DISCOUNT_AVERAGE "average_discount"
diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm
index c598c36582e7..0cda3c10d2f9 100644
--- a/code/__DEFINES/wounds.dm
+++ b/code/__DEFINES/wounds.dm
@@ -109,6 +109,8 @@ GLOBAL_LIST_INIT(bio_state_anatomy, list(
#define WOUND_SERIES_LOSS_BASIC "wound_series_loss_basic"
/// Cranial fissure wound.
#define WOUND_SERIES_CRANIAL_FISSURE "wound_series_cranial_fissure"
+/// Bruise wound.
+#define WOUND_SERIES_BRUISING "wound_series_bruising"
/// A assoc list of (wound typepath -> wound_pregen_data instance). Every wound should have a pregen data.
GLOBAL_LIST_INIT_TYPED(all_wound_pregen_data, /datum/wound_pregen_data, generate_wound_static_data())
diff --git a/code/__DEFINES/~darkpack/combat.dm b/code/__DEFINES/~darkpack/combat.dm
index 909326cab2b6..f5991b3284b4 100644
--- a/code/__DEFINES/~darkpack/combat.dm
+++ b/code/__DEFINES/~darkpack/combat.dm
@@ -6,6 +6,8 @@
///Duration of one "scene", which is 3 minutes according to us
#define SCENES * 3 MINUTES
#define TURNS_PER_SCENE ((1 SCENES) / (1 TURNS))
+/// For rolls that you would assumidly need to wait a scene to try and again or have conditions change but 1 scene is way too punishing
+#define DEFAULT_REROLL_COOLDOWN 1 MINUTES
// To eyeball damage as its calcuated in the ttrpg
#define TTRPG_DAMAGE * 10
diff --git a/code/__DEFINES/~darkpack/configuration.dm b/code/__DEFINES/~darkpack/configuration.dm
new file mode 100644
index 000000000000..f5f6e2731958
--- /dev/null
+++ b/code/__DEFINES/~darkpack/configuration.dm
@@ -0,0 +1,9 @@
+// Flags for discipline teaching darkpack_config.txt
+/// Full, unrestricted discipline teaching
+#define DISCIPLINE_TEACHING_FULL 0
+/// Discipline teaching allowed, but you can't teach rare disciplines like Thaumaturgy or Temporis
+#define DISCIPLINE_TEACHING_RARES_DISABLED 1
+/// Discipline teaching allowed, but you can only teach disciplines inherent to your clan (A Gangrel can teach Protean, but not Thaumaturgy)
+#define DISCIPLINE_TEACHING_IN_CLANS_ONLY 2
+// Discipline teaching completely disabled
+#define DISCIPLINE_TEACHING_DISABLED 3
diff --git a/code/__DEFINES/~darkpack/dcs/signals_atom/signals_magic.dm b/code/__DEFINES/~darkpack/dcs/signals_atom/signals_magic.dm
new file mode 100644
index 000000000000..cd3247e3689f
--- /dev/null
+++ b/code/__DEFINES/~darkpack/dcs/signals_atom/signals_magic.dm
@@ -0,0 +1 @@
+#define COMSIG_ATOM_GET_MAGIC_SOURCES "atom_get_magic_sources"
diff --git a/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm b/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm
index 91a537305e11..b4f3afba847e 100644
--- a/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm
+++ b/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm
@@ -10,7 +10,7 @@
//from base of living/CanAllowThrough(): (atom/movable/mover, border_dir)
#define COMSIG_LIVING_CAN_ALLOW_THROUGH "living_can_allow_through"
#define COMPONENT_LIVING_PASSABLE (1<<0)
-//from base of /datum/storyteller_roll/proc/st_roll(): (mob/living/roller, datum/storyteller_roll/roll_datum, atom/target)
+///from base of /datum/storyteller_roll/proc/st_roll(): (mob/living/roller, datum/storyteller_roll/roll_datum, atom/target, atom/using_item, bonus, difficulty)
#define COMSIG_LIVING_PRE_DICE_ROLLED "living_pre_dice_rolled"
-//from base of /datum/storyteller_roll/proc/st_roll(): (mob/living/roller, datum/storyteller_roll/roll_datum, atom/target, output)
+///from base of /datum/storyteller_roll/proc/st_roll(): (mob/living/roller, datum/storyteller_roll/roll_datum, atom/target, atom/using_item, output)
#define COMSIG_LIVING_DICE_ROLLED "living_dice_rolled"
diff --git a/code/__DEFINES/~darkpack/discipline.dm b/code/__DEFINES/~darkpack/discipline.dm
index 77fa833703d6..7016907ab5f9 100644
--- a/code/__DEFINES/~darkpack/discipline.dm
+++ b/code/__DEFINES/~darkpack/discipline.dm
@@ -62,3 +62,13 @@
#define ABYSS_TENTACLE_MODE_AGGRESSIVE "Aggressive"
#define ABYSS_TENTACLE_MODE_CONTROL "Control"
#define ABYSS_TENTACLE_MODE_PASSIVE "Passive"
+
+// Defines for Discipline budgets
+// Fledgling - immortal age 0-10
+// Neonate - immortal age 11-100
+// Ancillae - immortal age 101-200
+// Elder - immortal age 201+
+#define DISCIPLINE_BUDGET_FLEDGLING 5
+#define DISCIPLINE_BUDGET_NEONATE 10
+#define DISCIPLINE_BUDGET_ANCILLAE 15
+#define DISCIPLINE_BUDGET_ELDER 18
diff --git a/code/__DEFINES/~darkpack/guestbook.dm b/code/__DEFINES/~darkpack/guestbook.dm
index 6671f15ce3af..4c29ca027ff0 100644
--- a/code/__DEFINES/~darkpack/guestbook.dm
+++ b/code/__DEFINES/~darkpack/guestbook.dm
@@ -8,7 +8,9 @@
/// We will not be known by others, even if they pass checks in any way otherwise
#define GUESTBOOK_FORGETMENOT (1 << 3)
+/// Whether a guestbook entry of mob for guest exists
+#define GET_GUESTBOOK_ENTRY(mob, guest) mob?.mind?.guestbook?.get_known_name(mob, guest)
/// Differs from GET_GUESTBOOK_NAME_TRUE as it returns the known name OR the whole mob for situations where we directly embed into a string for text macros.
-#define GET_GUESTBOOK_NAME(mob, guest) (mob?.mind?.guestbook?.get_known_name(mob, guest) || guest)
+#define GET_GUESTBOOK_NAME(mob, guest) (GET_GUESTBOOK_ENTRY(mob, guest) || guest)
/// Macro to get a STRING (never a mob) of the name we refer to them as.
-#define GET_GUESTBOOK_NAME_TRUE(mob, guest) (mob?.mind?.guestbook?.get_known_name(mob, guest) || guest.name)
+#define GET_GUESTBOOK_NAME_TRUE(mob, guest) (GET_GUESTBOOK_ENTRY(mob, guest) || guest.name)
diff --git a/code/__DEFINES/~darkpack/jobs.dm b/code/__DEFINES/~darkpack/jobs.dm
index 4812cd7cbd9f..ce7224bd2feb 100644
--- a/code/__DEFINES/~darkpack/jobs.dm
+++ b/code/__DEFINES/~darkpack/jobs.dm
@@ -131,8 +131,8 @@
#define JOB_DISPLAY_ORDER_TAXI 3
#define JOB_DISPLAY_ORDER_PRIEST 4
-#define JOB_DISPLAY_ORDER_SUPPLY 1
-#define JOB_DISPLAY_ORDER_DEALER 2
+#define JOB_DISPLAY_ORDER_DEALER 1
+#define JOB_DISPLAY_ORDER_SUPPLY 2
#define JOB_DISPLAY_ORDER_BARON 1
#define JOB_DISPLAY_ORDER_EMISSARY 2
diff --git a/code/__DEFINES/~darkpack/language.dm b/code/__DEFINES/~darkpack/language.dm
index 9d59bed771e0..475103c6f8e4 100644
--- a/code/__DEFINES/~darkpack/language.dm
+++ b/code/__DEFINES/~darkpack/language.dm
@@ -1,3 +1,5 @@
//Defines for Language define since can't be in the upstream files
#define LANGUAGE_SPLAT "splat" //Specifically for splat related languages that aren't tied to a language pack. like Kinfolk garou tongues
+
+#define LANGUAGE_ACADEMICS "academics"
diff --git a/code/__DEFINES/~darkpack/magic.dm b/code/__DEFINES/~darkpack/magic.dm
new file mode 100644
index 000000000000..7c7ec842ce9e
--- /dev/null
+++ b/code/__DEFINES/~darkpack/magic.dm
@@ -0,0 +1,7 @@
+/// Broadly all VTM magic
+#define MAGIC_TYPE_BLOOD "blood"
+#define MAGIC_SUBTYPE_BLOOD_TIME "temporal distorion"
+
+/// Broadly all WTA magic
+#define MAGIC_TYPE_SPIRIT "spirit"
+
diff --git a/code/__DEFINES/~darkpack/sound.dm b/code/__DEFINES/~darkpack/sound.dm
index b8281d0223bb..932fc393a644 100644
--- a/code/__DEFINES/~darkpack/sound.dm
+++ b/code/__DEFINES/~darkpack/sound.dm
@@ -15,3 +15,5 @@
#define MUSIC_HOLLYWOOD "hollywood"
#define MUSIC_SANTAMONICA "santamonica"
#define MUSIC_SAFE "saftey"
+#define MUSIC_ENDRON "endron"
+#define MUSIC_CAERN "caern"
diff --git a/code/__DEFINES/~darkpack/storyteller_dice.dm b/code/__DEFINES/~darkpack/storyteller_dice.dm
index 2a40f4e415e1..1fcf05e7b461 100644
--- a/code/__DEFINES/~darkpack/storyteller_dice.dm
+++ b/code/__DEFINES/~darkpack/storyteller_dice.dm
@@ -3,20 +3,38 @@
#define ROLL_FAILURE 0
#define ROLL_SUCCESS 1
-/// Output is shown to everyone near you
-#define ROLL_PUBLIC "public"
-/// Output is only shown to the roller
-#define ROLL_PRIVATE "private"
-/// Output is shown to both the roller and the target
-#define ROLL_PRIVATE_AND_TARGET "roller+target"
-/// Output of the roll to admins + you
-#define ROLL_PRIVATE_ADMIN "private+admin"
-/// Output of the roll to admins only
-#define ROLL_ADMIN "admin"
-/// Output is show to no one and is not logged
-#define ROLL_NONE "none"
/// Time at which the roll was recorded
#define OLD_ROLL_TIME 1
/// Dice output of the old roll (roll define or just raw number depending on numerical)
#define OLD_ROLL_OUTPUT 2
+
+
+/// Output is shown to view/nearby mobs
+#define ROLL_FLAG_NEARBY (1 << 0)
+/// Output is shown to roller
+#define ROLL_FLAG_ROLLER (1 << 1)
+/// Output is shown to target
+#define ROLL_FLAG_TARGET (1 << 2)
+/// Output is shown to admins
+#define ROLL_FLAG_ADMIN (1 << 3)
+
+/// Output is shown to everyone near you
+#define ROLL_PUBLIC ROLL_FLAG_ROLLER|ROLL_FLAG_TARGET|ROLL_FLAG_NEARBY
+
+#define ROLL_OUTPUT_IC list( \
+ "Nearby", \
+ "Roller", \
+ "Target", \
+ "Admin", \
+)
+
+DEFINE_BITFIELD(roll_output_type, list(
+ "NEARBY" = ROLL_FLAG_NEARBY,
+ "ROLLER" = ROLL_FLAG_ROLLER,
+ "TARGET" = ROLL_FLAG_TARGET,
+ "ADMIN" = ROLL_FLAG_ADMIN,
+))
+
+#define ROLL_DIFFICULTY_MIN 2
+#define ROLL_DIFFICULTY_MAX 10
diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm
index 6ec023d1f417..db3b344088f8 100644
--- a/code/__DEFINES/~darkpack/traits/declarations.dm
+++ b/code/__DEFINES/~darkpack/traits/declarations.dm
@@ -20,6 +20,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_ELEVATED_FLAME "elevated_flame" // TURF_FIRE
// Mob traits
+/// Prevent any data being written to pref for this mob
+#define TRAIT_NO_CANON "no_canon"
// If the user is unbondable via blood bonds.
#define TRAIT_UNBONDABLE "unbondable"
@@ -112,6 +114,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_IN_FRENZY "in_frenzy"
+// Can't examine people
+#define TRAIT_CANNOT_FOCUS "cannot_focus"
+
// Is the mob silenced (by Quietus 1 for example)
#define TRAIT_SILENCED "silenced"
// is the vampire weak to Dominate?
@@ -176,16 +181,19 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
// BELOW ARE ALL MERITS/FLAWS
#define TRAIT_ABYSSAL_EYES "abyssal_eyes"
#define TRAIT_ACUTE_HEARING "acute_hearing"
+#define TRAIT_AMBIDEXTROUS "ambidextrous"
#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"
#define TRAIT_CALM_HEART "calm_heart"
+#define TRAIT_COLDLY_LOGICAL "coldly_logical"
#define TRAIT_DISFIGURED_APPEARANCE "disfigured_appearance"
#define TRAIT_DULLFANGS "dullfangs"
#define TRAIT_EAT_FOOD "eat_food"
#define TRAIT_EFFICIENT_DIGESTION "efficient_digestion"
+#define TRAIT_ENCHANTING_VOICE "enchanting_voice"
#define TRAIT_FAIR_GLABRO "fair_glabro"
#define TRAIT_GLOWING_EYES "glowing_eyes"
#define TRAIT_GRAVE_SMELL "grave_smell"
@@ -193,6 +201,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_HORRIFIC_APPEARANCE "horrific_appearance"
#define TRAIT_HUGE_SIZE "huge_size"
#define TRAIT_ILLEGAL_IDENTITY "illegal_identity" // GOVERNMENT
+#define TRAIT_IRON_WILL "iron_will"
#define TRAIT_MERIT_UNTAMABLE "merit_untamable"
#define TRAIT_METAMORPH "metamorph"
#define TRAIT_MONSTROUS "monstrous"
diff --git a/code/__HELPERS/_planes.dm b/code/__HELPERS/_planes.dm
index 1bebefa2fa84..584d1e9a224c 100644
--- a/code/__HELPERS/_planes.dm
+++ b/code/__HELPERS/_planes.dm
@@ -103,3 +103,23 @@ GLOBAL_LIST_INIT(topdown_planes, list(
stack_trace("[thing_to_check] ([thing_to_check.type]) was expected to have a TOPDOWN_LAYER layer due to its plane, but it DID NOT! layer: ([thing_to_check.layer]) plane: ([thing_to_check.plane])")
else if(thing_to_check.layer - TOPDOWN_LAYER >= 0 && thing_to_check.layer < BACKGROUND_LAYER)
stack_trace("[thing_to_check] ([thing_to_check.type] is NOT ALLOWED to have a TOPDOWN_LAYER layer due to its plane, but it did! layer: ([thing_to_check.layer]) plane: ([thing_to_check.plane])")
+
+/**
+ * A more complicated form of layer_a > layer_b, taking into account topdown layers
+ *
+ * - If both layers are topdown, checks if layer_a is greater than layer_b
+ * - If neither layer is topdown, checks if layer_a is greater than layer_b
+ * - If layer_a is topdown and layer_b is not, returns FALSE
+ * - If layer_b is topdown and layer_a is not, returns TRUE
+ */
+#define COMPARE_LAYERS(layer_a, layer_b) \
+ ((layer_a) >= TOPDOWN_LAYER \
+ ? ((layer_b) >= TOPDOWN_LAYER \
+ ? ((layer_a) > (layer_b)) \
+ : FALSE \
+ ) \
+ : ((layer_b) >= TOPDOWN_LAYER \
+ ? TRUE \
+ : ((layer_a) > (layer_b)) \
+ ) \
+ )
diff --git a/code/__HELPERS/atoms.dm b/code/__HELPERS/atoms.dm
index bf304813b24d..ea9d5c30dc33 100644
--- a/code/__HELPERS/atoms.dm
+++ b/code/__HELPERS/atoms.dm
@@ -316,6 +316,53 @@ rough example of the "cone" made by the 3 dirs checked
loc = loc.loc
return null
+//Gets the topmost loose container given the passed in LOOSE_CONTAINER flags
+/proc/get_loose_container(atom/movable/loose, container_flags = ALL)
+ while(ismovable(loose.loc))
+ if(!(container_flags & LOOSE_CONTAINER_INCLUDE_STORAGE) && isitem(loose))
+ var/obj/item/item = loose
+ if(item.item_flags & IN_STORAGE)
+ break
+ var/atom/movable/movable = loose.loc
+ if(movable.anchored)
+ break
+ if(isliving(movable))
+ var/mob/living/living = movable
+ if(!(container_flags & LOOSE_CONTAINER_INCLUDE_INVENTORY))
+ var/list/equipped = living.get_equipped_items(INCLUDE_HELD|INCLUDE_POCKETS)
+ if((loose in equipped) && !HAS_TRAIT(loose, TRAIT_NODROP))
+ if(istype(loose, /obj/item/mod/control) && (container_flags & LOOSE_CONTAINER_INCLUDE_SEALED_MODSUIT))
+ var/obj/item/mod/control/modsuit = loose
+ var/sealed = TRUE
+ for(var/datum/mod_part/part as anything in modsuit.get_part_datums(TRUE))
+ if((part.part_item == modsuit || part.part_item.loc != modsuit) && !part.sealed)
+ sealed = FALSE
+ break
+ if(!sealed)
+ break
+ else
+ break
+ if(living.buckled)
+ if(living.buckled.anchored)
+ break
+ else
+ var/obj/buckled_obj = living.buckled
+ buckled_obj.unbuckle_mob(living)
+ if(!(container_flags & LOOSE_CONTAINER_INCLUDE_CLOSET) && iscloset(movable))
+ break
+ if(!(container_flags & LOOSE_CONTAINER_INCLUDE_MECH_EQUIPMENT) && istype(movable, /obj/item/mecha_parts/mecha_equipment))
+ break
+ if(!(container_flags & LOOSE_CONTAINER_INCLUDE_VEHICLE) && isvehicle(movable))
+ var/obj/vehicle/vehicle = movable
+ if(vehicle.is_occupant(loose))
+ break
+ if(!(container_flags & LOOSE_CONTAINER_INCLUDE_STOMACH) && istype(movable, /obj/item/organ/stomach))
+ var/obj/item/organ/stomach/stomach = movable
+ if(loose in stomach.stomach_contents)
+ break
+ loose = movable
+ return loose
+
/**
* Line of sight check!
* Spawns a dummy object and then iterates through each turf to see if it's blocked by something not handled by pass_args.
diff --git a/code/__HELPERS/duplicating.dm b/code/__HELPERS/duplicating.dm
index 9e88c5b7914b..fbb96523c761 100644
--- a/code/__HELPERS/duplicating.dm
+++ b/code/__HELPERS/duplicating.dm
@@ -9,7 +9,6 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars, list(
"atmos_adjacent_turfs",
"bodyparts",
"ckey",
- "client_mobs_in_contents",
"_listen_lookup",
"computer_id",
"contents",
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index c7d671156aa2..be67feb5298e 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -330,7 +330,7 @@ GLOBAL_LIST_INIT(achievements_unlocked, list())
//Station Goals
parts += goal_report()
//Economy & Money
- parts += market_report()
+// parts += market_report() //DARKPACK EDIT - ROUNDEND REPORT
//Player Achievements
parts += cheevo_report()
@@ -340,15 +340,16 @@ GLOBAL_LIST_INIT(achievements_unlocked, list())
/datum/controller/subsystem/ticker/proc/survivor_report(popcount)
var/list/parts = list()
- var/station_evacuated = EMERGENCY_ESCAPED_OR_ENDGAMED
+ var/station_evacuated = FALSE //DARKPACK EDIT - ROUNDEND REPORT - ORIGINAL: EMERGENCY_ESCAPED_OR_ENDGAMED
if(GLOB.round_id)
var/statspage = CONFIG_GET(string/roundstatsurl)
var/info = statspage ? "[GLOB.round_id]" : GLOB.round_id
parts += "[FOURSPACES]Round ID: [info]"
- parts += "[FOURSPACES]Map: [SSmapping.current_map?.return_map_name()]"
- parts += "[FOURSPACES]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]"
- parts += "[FOURSPACES]Station Integrity: [GLOB.station_was_nuked ? span_redtext("Destroyed") : "[popcount["station_integrity"]]%"]"
+ parts += "[FOURSPACES]World Map: [SSmapping.current_map?.return_map_name()]" //DARKPACK EDIT - ROUNDEND REPORT
+ parts += "[FOURSPACES]Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]" //DARKPACK EDIT - ROUNDEND REPORT
+// parts += "[FOURSPACES]Station Integrity: [GLOB.station_was_nuked ? span_redtext("Destroyed") : "[popcount["station_integrity"]]%"]" //DARKPACK EDIT - ROUNDEND REPORT
+
var/total_players = GLOB.joined_player_list.len
if(total_players)
parts+= "[FOURSPACES]Total Population: [total_players]"
@@ -561,6 +562,8 @@ GLOBAL_LIST_INIT(achievements_unlocked, list())
parts += "The most affluent crew member at shift end was [mr_moneybags.account_holder] with [mr_moneybags.account_balance] [MONEY_SYMBOL]!"
else
parts += "Somehow, nobody made any money this shift! This'll result in some budget cuts..."
+ SSblackbox.record_feedback("amount", "mail_opened", SSeconomy.mail_opened)
+ parts += "The crew delivered and opened [SSeconomy.mail_opened] pieces of mail[(SSeconomy.mail_opened > 1) ? "!" : "..."]
"
return parts.Join()
/**
diff --git a/code/_compile_options.dm b/code/_compile_options.dm
index 6fb97ee6cf40..9ee47953798f 100644
--- a/code/_compile_options.dm
+++ b/code/_compile_options.dm
@@ -110,6 +110,9 @@
// If defined, we will NOT defer asset generation till later in the game, and will instead do it all at once, during initiialize
//#define DO_NOT_DEFER_ASSETS
+// Forces init assets to generate regardless of config setting
+//#define FORCE_GENERATE_INIT_ASSETS
+
/// If this is uncommented, Autowiki will generate edits and shut down the server.
/// Prefer the autowiki build target instead.
// #define AUTOWIKI
@@ -172,13 +175,14 @@
#define GC_FAILURE_HARD_LOOKUP
//Ensures all early assets can actually load early
#define DO_NOT_DEFER_ASSETS
+//Always gen assets, unit tests will check if the contributor needs to update them
+#define FORCE_GENERATE_INIT_ASSETS
//Test at full capacity, the extra cost doesn't matter
#define TIMER_DEBUG
-
-// Checks if unit tests are being run locally or well, not
-#if !defined(CIBUILDING) && !defined(SPACEMAN_DMM) && !defined(OPENDREAM)
-#define RUNNING_LOCAL_TESTS
-#endif
+ // Checks if unit tests are being run locally or well, not
+ #if !defined(CIBUILDING) && !defined(SPACEMAN_DMM) && !defined(OPENDREAM)
+ #define RUNNING_LOCAL_TESTS
+ #endif
#endif
#ifdef TGS
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index b6ab3456a107..e5a33538979b 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -641,6 +641,7 @@ DEFINE_BITFIELD(liked_foodtypes, list(
"BUGS" = BUGS,
"GORE" = GORE,
"STONE" = STONE,
+ "CHOCOLATE" = CHOCOLATE, //DARKPACK EDIT ADDITION - Chocolate
))
DEFINE_BITFIELD(disliked_foodtypes, list(
@@ -665,6 +666,7 @@ DEFINE_BITFIELD(disliked_foodtypes, list(
"BUGS" = BUGS,
"GORE" = GORE,
"STONE" = STONE,
+ "CHOCOLATE" = CHOCOLATE, //DARKPACK EDIT ADDITION - Chocolate
))
DEFINE_BITFIELD(toxic_foodtypes, list(
@@ -689,6 +691,7 @@ DEFINE_BITFIELD(toxic_foodtypes, list(
"BUGS" = BUGS,
"GORE" = GORE,
"STONE" = STONE,
+ "CHOCOLATE" = CHOCOLATE, //DARKPACK EDIT ADDITION - Chocolate
))
DEFINE_BITFIELD(sharpness, list(
diff --git a/code/_globalvars/darkpack/lists/ambience.dm b/code/_globalvars/darkpack/lists/ambience.dm
index dd72e8c5c6eb..0a1655cdb3da 100644
--- a/code/_globalvars/darkpack/lists/ambience.dm
+++ b/code/_globalvars/darkpack/lists/ambience.dm
@@ -115,5 +115,6 @@ GLOBAL_LIST_INIT(music_assoc,list(
MUSIC_BAR = list('modular_darkpack/modules/ambience/sounds/music/naive.ogg'),
MUSIC_HOLLYWOOD = list('modular_darkpack/modules/ambience/sounds/music/hollywood.ogg', 'modular_darkpack/modules/ambience/sounds/music/open_season.ogg', 'modular_darkpack/modules/ambience/sounds/music/is_it_all_worth_it.ogg'),
MUSIC_SANTAMONICA = list('modular_darkpack/modules/ambience/sounds/music/santamonica.ogg'),
- MUSIC_SAFE = list('modular_darkpack/modules/ambience/sounds/music/volition.ogg', 'modular_darkpack/modules/ambience/sounds/music/safe_room.ogg')
- ))
+ MUSIC_SAFE = list('modular_darkpack/modules/ambience/sounds/music/volition.ogg', 'modular_darkpack/modules/ambience/sounds/music/safe_room.ogg'),
+ MUSIC_ENDRON = list ('modular_darkpack/modules/ambience/sounds/music/endron_for_the_planet.ogg'),
+ MUSIC_CAERN = list ('modular_darkpack/modules/ambience/sounds/music/lux_umbrae.ogg')))
diff --git a/code/_globalvars/lists/girder_wall_recipes.dm b/code/_globalvars/lists/girder_wall_recipes.dm
index 5e7b11bc1f7a..75c9120d07fa 100644
--- a/code/_globalvars/lists/girder_wall_recipes.dm
+++ b/code/_globalvars/lists/girder_wall_recipes.dm
@@ -14,9 +14,6 @@ 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,
@@ -25,12 +22,6 @@ 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,
@@ -49,9 +40,6 @@ 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,
@@ -60,16 +48,11 @@ 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/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index 64e8d38f9b64..c42d835efd03 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -103,6 +103,11 @@ GLOBAL_LIST_INIT(common_loot, list( //common: basic items
/obj/item/clothing/suit/hazardvest = 1,
/obj/item/clothing/suit/toggle/labcoat = 1,
/obj/item/clothing/under/color/grey = 1,
+ /obj/item/clothing/suit/pillow_suit = 1,
+ /obj/item/clothing/head/pillow_hood = 1,
+ /obj/item/shield/mattress = 1,
+ /obj/item/spear/pillow = 1,
+ /obj/item/pillow/random = 1,
/obj/item/radio/headset = 1,
/obj/item/storage/backpack = 1,
/obj/item/storage/belt/fannypack = 1,
@@ -202,7 +207,7 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items
) = 8,
list(//strange objects
- /obj/item/relic = 5,
+ /obj/item/assembly/relic = 5,
) = 8,
list(//construction and crafting
diff --git a/code/_globalvars/lists/pipe_recipes.dm b/code/_globalvars/lists/pipe_recipes.dm
index 384248623bc1..446cc8e5c79e 100644
--- a/code/_globalvars/lists/pipe_recipes.dm
+++ b/code/_globalvars/lists/pipe_recipes.dm
@@ -3,18 +3,18 @@ GLOBAL_LIST_INIT(atmos_pipe_recipes, list(
new /datum/pipe_info/pipe("Pipe", /obj/machinery/atmospherics/pipe/smart, TRUE),
new /datum/pipe_info/pipe("Layer Adapter", /obj/machinery/atmospherics/pipe/layer_manifold, TRUE),
new /datum/pipe_info/pipe("Color Adapter", /obj/machinery/atmospherics/pipe/color_adapter, TRUE),
- new /datum/pipe_info/pipe("Bridge Pipe", /obj/machinery/atmospherics/pipe/bridge_pipe, TRUE),
- new /datum/pipe_info/pipe("Multi-Deck Adapter", /obj/machinery/atmospherics/pipe/multiz, FALSE),
+ new /datum/pipe_info/pipe/bridge_pipe,
+ new /datum/pipe_info/pipe/multiz_connector,
),
"Binary" = list(
- new /datum/pipe_info/pipe("Manual Valve", /obj/machinery/atmospherics/components/binary/valve, TRUE),
- new /datum/pipe_info/pipe("Digital Valve", /obj/machinery/atmospherics/components/binary/valve/digital, TRUE),
- new /datum/pipe_info/pipe("Gas Pump", /obj/machinery/atmospherics/components/binary/pump, TRUE),
- new /datum/pipe_info/pipe("Volume Pump", /obj/machinery/atmospherics/components/binary/volume_pump, TRUE),
- new /datum/pipe_info/pipe("Passive Gate", /obj/machinery/atmospherics/components/binary/passive_gate, TRUE),
- new /datum/pipe_info/pipe("Pressure Valve", /obj/machinery/atmospherics/components/binary/pressure_valve, TRUE),
- new /datum/pipe_info/pipe("Temperature Gate", /obj/machinery/atmospherics/components/binary/temperature_gate, TRUE),
- new /datum/pipe_info/pipe("Temperature Pump", /obj/machinery/atmospherics/components/binary/temperature_pump, TRUE),
+ new /datum/pipe_info/pipe/manual_valve,
+ new /datum/pipe_info/pipe/digital_valve,
+ new /datum/pipe_info/pipe/gas_pump,
+ new /datum/pipe_info/pipe/volume_pump,
+ new /datum/pipe_info/pipe/passive_gate,
+ new /datum/pipe_info/pipe/pressure_valve,
+ new /datum/pipe_info/pipe/temperature_gate,
+ new /datum/pipe_info/pipe/temperature_pump,
),
"Devices" = list(
new /datum/pipe_info/pipe("Gas Filter", /obj/machinery/atmospherics/components/trinary/filter, TRUE),
@@ -22,16 +22,16 @@ GLOBAL_LIST_INIT(atmos_pipe_recipes, list(
new /datum/pipe_info/pipe("Connector", /obj/machinery/atmospherics/components/unary/portables_connector, TRUE),
new /datum/pipe_info/pipe("Injector", /obj/machinery/atmospherics/components/unary/outlet_injector, TRUE),
new /datum/pipe_info/pipe("Scrubber", /obj/machinery/atmospherics/components/unary/vent_scrubber, TRUE),
- new /datum/pipe_info/pipe("Unary Vent", /obj/machinery/atmospherics/components/unary/vent_pump, TRUE),
- new /datum/pipe_info/pipe("Passive Vent", /obj/machinery/atmospherics/components/unary/passive_vent, TRUE),
- new /datum/pipe_info/meter("Meter"),
+ new /datum/pipe_info/pipe/vent,
+ new /datum/pipe_info/pipe/passive_vent,
+ new /datum/pipe_info/meter,
),
"Heat Exchange" = list(
new /datum/pipe_info/pipe("Pipe", /obj/machinery/atmospherics/pipe/heat_exchanging/simple, FALSE),
new /datum/pipe_info/pipe("Manifold", /obj/machinery/atmospherics/pipe/heat_exchanging/manifold, FALSE),
new /datum/pipe_info/pipe("4-Way Manifold", /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w, FALSE),
new /datum/pipe_info/pipe("Junction", /obj/machinery/atmospherics/pipe/heat_exchanging/junction, FALSE),
- new /datum/pipe_info/pipe("Heat Exchanger", /obj/machinery/atmospherics/components/unary/heat_exchanger, FALSE),
+ new /datum/pipe_info/pipe/heat_exchanger,
)
))
diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm
index 02ba3efaf2c0..7f672029ddc1 100644
--- a/code/_globalvars/phobias.dm
+++ b/code/_globalvars/phobias.dm
@@ -289,7 +289,7 @@ GLOBAL_LIST_INIT(phobia_objs, list(
/obj/item/gun/magic/staff/honk,
/obj/item/instrument/bikehorn,
/obj/item/megaphone/clown,
- /obj/item/modular_computer/pda/clown,
+ /obj/item/modular_computer/pda/crew/clown,
/obj/item/pneumatic_cannon/pie,
/obj/item/stack/ore/bananium,
/obj/item/stack/tile/mineral/bananium,
@@ -408,6 +408,7 @@ GLOBAL_LIST_INIT(phobia_objs, list(
/obj/item/organ/stomach/fish,
/obj/item/organ/tail/fish,
/obj/item/organ/tongue/carp,
+ /obj/item/organ/fangs/carp,
/obj/item/storage/fancy/cigarettes/cigpack_carp,
/obj/item/storage/toolbox/fishing,
/obj/item/stack/sheet/animalhide/carp,
@@ -461,7 +462,7 @@ GLOBAL_LIST_INIT(phobia_objs, list(
"robots" = typecacheof(list(
/obj/item/ai_module,
/obj/item/aicard,
- /obj/item/mmi/posibrain,
+ /obj/item/brain_processor/positronic,
/obj/item/toy/figure/borg,
/obj/item/toy/talking/ai,
/obj/machinery/ai_law_rack,
diff --git a/code/_globalvars/pipe_info.dm b/code/_globalvars/pipe_info.dm
index 56ec30cc8a05..5d85a03b90e2 100644
--- a/code/_globalvars/pipe_info.dm
+++ b/code/_globalvars/pipe_info.dm
@@ -4,21 +4,15 @@
var/name
///Icon state of this pipe
var/icon_state
+ ///Description of how the pipe is used
+ var/desc
///Type path of this recipe
- var/id = -1
+ var/obj/machinery/id
/// see code/__DEFINES/pipe_construction.dm
var/dirtype = PIPE_BENDABLE
/// Is this pipe layer indenpendent
var/all_layers
-/datum/pipe_info/pipe/New(label, obj/machinery/atmospherics/path, use_five_layers)
- name = label
- id = path
- all_layers = use_five_layers
- icon_state = initial(path.pipe_state)
- var/obj/item/pipe/c = initial(path.construction_type)
- dirtype = initial(c.RPD_type)
-
/**
* Get preview image of an pipe
* Arguments
@@ -77,12 +71,116 @@
dirtype = PIPE_ONEDIR
all_layers = TRUE
-/datum/pipe_info/meter/New(label)
- name = label
+/datum/pipe_info/pipe
+ dirtype = null
+
+/datum/pipe_info/pipe/New(label, obj/machinery/atmospherics/path, use_five_layers)
+ if(isnull(name)) // name ??= label
+ name = label
+ if(isnull(id)) // id ??= path
+ id = path
+ if(isnull(all_layers)) // all_layers ??= use_five_layers
+ all_layers = use_five_layers
+
+ if(!ispath(id, /obj/machinery/atmospherics))
+ return
+
+ var/obj/machinery/atmospherics/id_atmos = id
+ if(isnull(icon_state)) // icon_state ??= initial(path.pipe_state)
+ icon_state = id_atmos::pipe_state
+ if(isnull(dirtype)) // dirtype ??= id_atmos::construction_type::RPD_type
+ dirtype = id_atmos::construction_type::RPD_type
+
+/datum/pipe_info/pipe/bridge_pipe
+ name = "Bridge Pipe"
+ desc = "Can be used to cross pipelines of the same layer and color without accidentally joining them together.
\
+ Redundant for pipelines on different layers or of different colors."
+ id = /obj/machinery/atmospherics/pipe/bridge_pipe
+ all_layers = TRUE
+
+/datum/pipe_info/pipe/multiz_connector
+ name = "Multi-Deck Adapter"
+ desc = "Directly connects pipelines vertically across station levels."
+ id = /obj/machinery/atmospherics/pipe/multiz
+ all_layers = FALSE
+
+/datum/pipe_info/pipe/manual_valve
+ name = "Manual Valve"
+ desc = "Blocks the flow of gas through the pipeline.
Cannot be operated by silicons. Does not require power."
+ id = /obj/machinery/atmospherics/components/binary/valve
+ all_layers = TRUE
+
+/datum/pipe_info/pipe/digital_valve
+ name = "Digital Valve"
+ desc = "Blocks the flow of gas through the pipeline.
Can be operated by silicons. Does not require power, despite being digital."
+ id = /obj/machinery/atmospherics/components/binary/valve/digital
+ all_layers = TRUE
+
+/datum/pipe_info/pipe/gas_pump
+ name = "Pressure Pump"
+ desc = "Moves gas from one pipeline to another.
Transfers a variable amount of gas until the output network reaches the configured pressure."
+ id = /obj/machinery/atmospherics/components/binary/pump
+ all_layers = TRUE
+
+/datum/pipe_info/pipe/volume_pump
+ name = "Volume Pump"
+ desc = "Moves gas from one pipeline to another.
Transfers a fixed volume of gas based on the configured volume.
\
+ Can be overclocked to increase volume moved, though potentially causing leaks."
+ id = /obj/machinery/atmospherics/components/binary/volume_pump
+ all_layers = TRUE
+
+/datum/pipe_info/pipe/passive_gate
+ name = "Passive Gate"
+ desc = "Blocks the flow of gas through the pipeline while the output pipeline has higher pressure \
+ than either the configured pressure or the input pipeline's pressure.
Does not allow backwards flow, and does not require power."
+ id = /obj/machinery/atmospherics/components/binary/passive_gate
+ all_layers = TRUE
+
+/datum/pipe_info/pipe/pressure_valve
+ name = "Pressure Gate"
+ desc = "Blocks the flow of gas through the pipeline while the input pipeline's pressure \
+ is below the configured pressure.
Does not allow backwards flow, and does not require power."
+ id = /obj/machinery/atmospherics/components/binary/pressure_valve
+ all_layers = TRUE
+
+/datum/pipe_info/pipe/temperature_gate
+ name = "Temperature Gate"
+ desc = "Blocks the flow of gas through the pipeline while the input pipeline's temperature is below the configured temperature.
\
+ Does not allow backwards flow, and can be multitooled to instead check for exceeding the configured temperature."
+ id = /obj/machinery/atmospherics/components/binary/temperature_gate
+ all_layers = TRUE
+
+/datum/pipe_info/pipe/temperature_pump
+ name = "Temperature Pump"
+ desc = "Moves heat from one pipeline to another, cooling the input pipeline and heating the output pipeline. No gas is transferred."
+ id = /obj/machinery/atmospherics/components/binary/temperature_pump
+ all_layers = TRUE
+
+/datum/pipe_info/pipe/vent
+ name = "Pump Vent"
+ desc = "A vent with an inbuilt pressure pump.
Forces gas from the connected pipeline into the exterior atmosphere, \
+ or pulls gas from the exterior atmosphere into the connected pipeline, depending on air alarm configuration.
\
+ Can be overclocked."
+ id = /obj/machinery/atmospherics/components/unary/vent_pump
+ all_layers = TRUE
+
+/datum/pipe_info/pipe/passive_vent
+ name = "Passive Vent"
+ desc = "Combines exterior atmosphere with the connected pipeline.
Does not require power."
+ id = /obj/machinery/atmospherics/components/unary/passive_vent
+ all_layers = TRUE
+
+/datum/pipe_info/pipe/heat_exchanger
+ name = "Heat Exchanger"
+ desc = "When directly facing another heat exchanger, balances the temperature of the gases within each connected pipeline."
+ id = /obj/machinery/atmospherics/components/unary/heat_exchanger
+ all_layers = FALSE
//==============================================================================================
///Disposal pipe info
+/datum/pipe_info/disposal
+
/datum/pipe_info/disposal/New(label, obj/path, dt=PIPE_UNARY)
name = label
id = path
@@ -97,6 +195,8 @@
//==============================================================================================
///Transient tube pipe info
+/datum/pipe_info/transit
+
/datum/pipe_info/transit/New(label, obj/path, dt=PIPE_UNARY)
name = label
id = path
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index 3c77e063b79d..8ed958287453 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -104,6 +104,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_AREA_BLOCK_POWER_FAIL" = TRAIT_AREA_BLOCK_POWER_FAIL,
"TRAIT_HAS_SHUTTLE_CONSTRUCTION_TURF" = TRAIT_HAS_SHUTTLE_CONSTRUCTION_TURF,
),
+ /client = list(
+ "TRAIT_PARALLAX_DISPLAYED" = TRAIT_PARALLAX_DISPLAYED(""),
+ ),
/datum/controller/global_vars = list(
"TRAIT_DISTORTION_IN_USE" = TRAIT_DISTORTION_IN_USE(0),
),
@@ -133,10 +136,12 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"STATION_TRAIT_PDA_GLITCHED" = STATION_TRAIT_PDA_GLITCHED,
"STATION_TRAIT_PREMIUM_INTERNALS" = STATION_TRAIT_PREMIUM_INTERNALS,
"STATION_TRAIT_PUN_PUN_GYM_DAY" = STATION_TRAIT_PUN_PUN_GYM_DAY,
+ "STATION_TRAIT_QUICK_SHUTTLE" = STATION_TRAIT_QUICK_SHUTTLE,
"STATION_TRAIT_RADIOACTIVE_NEBULA" = STATION_TRAIT_RADIOACTIVE_NEBULA,
"STATION_TRAIT_RANDOM_ARRIVALS" = STATION_TRAIT_RANDOM_ARRIVALS,
"STATION_TRAIT_REVOLUTIONARY_TRASHING" = STATION_TRAIT_REVOLUTIONARY_TRASHING,
"STATION_TRAIT_SHUTTLE_SALE" = STATION_TRAIT_SHUTTLE_SALE,
+ "STATION_TRAIT_SLOW_SHUTTLE" = STATION_TRAIT_SLOW_SHUTTLE,
"STATION_TRAIT_SMALLER_PODS" = STATION_TRAIT_SMALLER_PODS,
"STATION_TRAIT_SPIDER_INFESTATION" = STATION_TRAIT_SPIDER_INFESTATION,
"STATION_TRAIT_UNIQUE_AI" = STATION_TRAIT_UNIQUE_AI,
@@ -157,7 +162,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
),
/datum/hud = list(
"TRAIT_ESCAPE_MENU_OPEN" = TRAIT_ESCAPE_MENU_OPEN,
- "TRAIT_PARALLAX_DISPLAYED" = TRAIT_PARALLAX_DISPLAYED,
),
/datum/wound = list(
"TRAIT_WOUND_SCANNED" = TRAIT_WOUND_SCANNED,
@@ -369,6 +373,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_HOPELESSLY_ADDICTED" = TRAIT_HOPELESSLY_ADDICTED,
"TRAIT_HOT_SPRING_CURSED" = TRAIT_HOT_SPRING_CURSED,
"TRAIT_HULK" = TRAIT_HULK,
+ "TRAIT_HUMAN_DISGUISE" = TRAIT_HUMAN_DISGUISE,
"TRAIT_HUSK" = TRAIT_HUSK,
"TRAIT_HYPOTHERMIC" = TRAIT_HYPOTHERMIC,
"TRAIT_ID_APPRAISER" = TRAIT_ID_APPRAISER,
@@ -536,6 +541,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_REAGENT_SCANNER" = TRAIT_REAGENT_SCANNER,
"TRAIT_RECENTLY_BLOCKED_MAGIC" = TRAIT_RECENTLY_BLOCKED_MAGIC,
"TRAIT_RECENTLY_TREATED" = TRAIT_RECENTLY_TREATED,
+ "TRAIT_REFINED_BITER" = TRAIT_REFINED_BITER,
"TRAIT_REFLECTIVE_EYES" = TRAIT_REFLECTIVE_EYES,
"TRAIT_REGEN_SHIELD" = TRAIT_REGEN_SHIELD,
"TRAIT_RELAYING_ATTACKER" = TRAIT_RELAYING_ATTACKER,
@@ -697,6 +703,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_NECROPOLIS_WORSHIP" = TRAIT_NECROPOLIS_WORSHIP,
"TRAIT_ABYSSAL_EYES" = TRAIT_ABYSSAL_EYES, // DARKPACK EDIT ADD - ABYSS MYSTICISM - PIERCE THE VEIL
"TRAIT_ACUTE_HEARING" = TRAIT_ACUTE_HEARING, // DARKPACK EDIT ADD - MERITS_FLAWS - ACUTE SENSE
+ "TRAIT_AMBIDEXTROUS" = TRAIT_AMBIDEXTROUS, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_ANIMAL_MUSK" = TRAIT_ANIMAL_MUSK, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_AURA_OF_CONFIDENCE" = TRAIT_AURA_OF_CONFIDENCE, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_BANNED_TRANSFORMATION" = TRAIT_BANNED_TRANSFORMATION, // DARKPACK EDIT ADD - MERITS_FLAWS
@@ -708,10 +715,12 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"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_FOCUS" = TRAIT_CANNOT_FOCUS, // DARKPACK EDIT ADD - Frenzy
"TRAIT_CANNOT_RESIST_MIND_CONTROL" = TRAIT_CANNOT_RESIST_MIND_CONTROL, // DARKPACK EDIT ADD
"TRAIT_CAN_ENTER_TORPOR" = TRAIT_CAN_ENTER_TORPOR, // DARKPACK EDIT ADD
"TRAIT_CHARMER" = TRAIT_CHARMER, // DARKPACK EDIT ADD
"TRAIT_COFFIN_THERAPY" = TRAIT_COFFIN_THERAPY, // DARKPACK EDIT ADD
+ "TRAIT_COLDLY_LOGICAL" = TRAIT_COLDLY_LOGICAL, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_CONSENSUAL_FEEDING_ONLY" = TRAIT_CONSENSUAL_FEEDING_ONLY, // DARKPACK EDIT ADD
"TRAIT_DECEPTIVE_AURA" = TRAIT_DECEPTIVE_AURA, // DARKPACK EDIT ADD
"TRAIT_DEFICIENT_VITAE" = TRAIT_DEFICIENT_VITAE, // DARKPACK EDIT ADD
@@ -723,6 +732,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_DULLFANGS" = TRAIT_DULLFANGS, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_EAT_FOOD" = TRAIT_EAT_FOOD, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_EFFICIENT_DIGESTION" = TRAIT_EFFICIENT_DIGESTION, //DARKPACK EDIT ADD
+ "TRAIT_ENCHANTING_VOICE" = TRAIT_ENCHANTING_VOICE, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_ENHANCED_MELEE_DODGE" = TRAIT_ENHANCED_MELEE_DODGE, // DARKPACK EDIT ADD
"TRAIT_FAIR_GLABRO" = TRAIT_FAIR_GLABRO, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_FEEDING_RESTRICTION" = TRAIT_FEEDING_RESTRICTION, // DARKPACK EDIT ADD
@@ -750,6 +760,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_ILLEGAL_IDENTITY" = TRAIT_ILLEGAL_IDENTITY, // DARKPACK EDIT ADD - GOVERMENT
"TRAIT_INVISIBLE_TO_CAMERA" = TRAIT_INVISIBLE_TO_CAMERA, // DARKPACK EDIT ADD
"TRAIT_IN_FRENZY" = TRAIT_IN_FRENZY, // DARKPACK EDIT ADD
+ "TRAIT_IRON_WILL" = TRAIT_IRON_WILL, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_IRRESISTIBLE_VITAE" = TRAIT_IRRESISTIBLE_VITAE, // DARKPACK EDIT ADD
"TRAIT_JAMMING_WEAPONS" = TRAIT_JAMMING_WEAPONS, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_LAZY" = TRAIT_LAZY, // DARKPACK EDIT ADD
@@ -763,6 +774,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_MONSTROUS" = TRAIT_MONSTROUS, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_NEEDS_BLOOD" = TRAIT_NEEDS_BLOOD, // DARKPACK EDIT ADD - Hunger and Frenzy
"TRAIT_NON_INT" = TRAIT_NON_INT, // DARKPACK EDIT ADD
+ "TRAIT_NO_CANON" = TRAIT_NO_CANON, // DARKPACK EDIT ADD
"TRAIT_NO_CUFF" = TRAIT_NO_CUFF, // DARKPACK EDIT ADD
"TRAIT_NO_EYE_CONTACT" = TRAIT_NO_EYE_CONTACT, // DARKPACK EDIT ADD
"TRAIT_NO_LYING_ANGLE" = TRAIT_NO_LYING_ANGLE, // DARKPACK EDIT ADD - WEREWOLF
diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm
index 7f54c1da8265..56e4bbb07694 100644
--- a/code/_globalvars/traits/admin_tooling.dm
+++ b/code/_globalvars/traits/admin_tooling.dm
@@ -154,6 +154,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_HIDE_EXTERNAL_ORGANS" = TRAIT_HIDE_EXTERNAL_ORGANS,
"TRAIT_HIGH_VALUE_RANSOM" = TRAIT_HIGH_VALUE_RANSOM,
"TRAIT_HOLY" = TRAIT_HOLY,
+ "TRAIT_HUMAN_DISGUISE" = TRAIT_HUMAN_DISGUISE,
"TRAIT_HUSK" = TRAIT_HUSK,
"TRAIT_ID_APPRAISER" = TRAIT_ID_APPRAISER,
"TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION,
@@ -369,6 +370,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_CARPOTOXIN_IMMUNE" = TRAIT_CARPOTOXIN_IMMUNE,
"TRAIT_ABYSSAL_EYES" = TRAIT_ABYSSAL_EYES, // DARKPACK EDIT ADD - ABYSS MYSTICISM - PIERCE THE VEIL
"TRAIT_ACUTE_HEARING" = TRAIT_ACUTE_HEARING, // DARKPACK EDIT ADD - MERITS_FLAWS - ACUTE SENSE
+ "TRAIT_AMBIDEXTROUS" = TRAIT_AMBIDEXTROUS, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_ANIMAL_MUSK" = TRAIT_ANIMAL_MUSK, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_AURA_OF_CONFIDENCE" = TRAIT_AURA_OF_CONFIDENCE, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_BANNED_TRANSFORMATION" = TRAIT_BANNED_TRANSFORMATION, // DARKPACK EDIT ADD - MERITS_FLAWS
@@ -381,6 +383,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_CAN_ENTER_TORPOR" = TRAIT_CAN_ENTER_TORPOR, // DARKPACK EDIT ADD
"TRAIT_CHARMER" = TRAIT_CHARMER, // DARKPACK EDIT ADD
"TRAIT_COFFIN_THERAPY" = TRAIT_COFFIN_THERAPY, // DARKPACK EDIT ADD
+ "TRAIT_COLDLY_LOGICAL" = TRAIT_COLDLY_LOGICAL, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_CONSENSUAL_FEEDING_ONLY" = TRAIT_CONSENSUAL_FEEDING_ONLY, // DARKPACK EDIT ADD
"TRAIT_DECEPTIVE_AURA" = TRAIT_DECEPTIVE_AURA, // DARKPACK EDIT ADD
"TRAIT_DEFICIENT_VITAE" = TRAIT_DEFICIENT_VITAE, // DARKPACK EDIT ADD
@@ -391,6 +394,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_DISFIGURED_APPEARANCE" = TRAIT_DISFIGURED_APPEARANCE, // DARKPACK EDIT ADD - MERITS_FLAWS - PHYSICAL FLAWS
"TRAIT_DULLFANGS" = TRAIT_DULLFANGS, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_EFFICIENT_DIGESTION" = TRAIT_EFFICIENT_DIGESTION, // DARKPACK EDIT ADD
+ "TRAIT_ENCHANTING_VOICE" = TRAIT_ENCHANTING_VOICE, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_ENHANCED_MELEE_DODGE" = TRAIT_ENHANCED_MELEE_DODGE, // DARKPACK EDIT ADD
"TRAIT_FAIR_GLABRO" = TRAIT_FAIR_GLABRO, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_FEEDING_RESTRICTION" = TRAIT_FEEDING_RESTRICTION, // DARKPACK EDIT ADD
@@ -413,6 +417,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_ILLEGAL_IDENTITY" = TRAIT_ILLEGAL_IDENTITY, // DARKPACK EDIT ADD - GOVERMENT
"TRAIT_INVISIBLE_TO_CAMERA" = TRAIT_INVISIBLE_TO_CAMERA, // DARKPACK EDIT ADD
"TRAIT_IN_FRENZY" = TRAIT_IN_FRENZY, // DARKPACK EDIT ADD
+ "TRAIT_IRON_WILL" = TRAIT_IRON_WILL, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_IRRESISTIBLE_VITAE" = TRAIT_IRRESISTIBLE_VITAE, // DARKPACK EDIT ADD
"TRAIT_JAMMING_WEAPONS" = TRAIT_JAMMING_WEAPONS, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_LAZY" = TRAIT_LAZY, // DARKPACK EDIT ADD
@@ -425,6 +430,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_METAMORPH" = TRAIT_METAMORPH, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_NEEDS_BLOOD" = TRAIT_NEEDS_BLOOD, // DARKPACK EDIT ADD - Hunger and Frenzy
"TRAIT_NON_INT" = TRAIT_NON_INT, // DARKPACK EDIT ADD
+ "TRAIT_NO_CANON" = TRAIT_NO_CANON, // DARKPACK EDIT ADD
"TRAIT_NO_CUFF" = TRAIT_NO_CUFF, // DARKPACK EDIT ADD
"TRAIT_NO_EYE_CONTACT" = TRAIT_NO_EYE_CONTACT, // DARKPACK EDIT ADD
"TRAIT_NO_LYING_ANGLE" = TRAIT_NO_LYING_ANGLE, // DARKPACK EDIT ADD - WEREWOLF
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index d7e595e1a36b..b8791725337c 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -29,6 +29,10 @@
next_move = world.time + ((num + adj)*mod)
SEND_SIGNAL(src, COMSIG_LIVING_CHANGENEXT_MOVE, next_move, num)
+/mob/living/proc/change_next_special_move(num)
+ changeNext_move(num)
+ last_special = world.time + num
+
/**
* Before anything else, defer these calls to a per-mobtype handler. This allows us to
* remove istype() spaghetti code, but requires the addition of other handler procs to simplify it.
@@ -190,18 +194,19 @@
SHOULD_BE_PURE(TRUE)
if(!isturf(loc)) //This only makes sense for things directly on turfs for now
return FALSE
- var/turf/T = get_turf_pixel(src)
- if(!T)
+ var/turf/click_loc = get_turf_pixel(src)
+ if(isnull(click_loc))
return FALSE
- for(var/atom/movable/AM in T)
- if(AM.flags_1 & PREVENT_CLICK_UNDER_1 && AM.density && AM.layer > layer)
+ for(var/atom/movable/blocker as anything in click_loc)
+ if(!blocker.density || !(blocker.flags_1 & PREVENT_CLICK_UNDER_1))
+ continue
+ if(COMPARE_LAYERS(blocker.layer, src.layer))
return TRUE
return FALSE
/turf/IsObscured()
- for(var/item in src)
- var/atom/movable/AM = item
- if(AM.flags_1 & PREVENT_CLICK_UNDER_1)
+ for(var/atom/movable/blocker as anything in src)
+ if(blocker.flags_1 & PREVENT_CLICK_UNDER_1)
return TRUE
return FALSE
@@ -282,6 +287,9 @@
/atom/movable/IsContainedAtomAccessible(atom/contained, atom/movable/user)
return !!atom_storage
+/mob/living/IsContainedAtomAccessible(atom/contained, atom/movable/user)
+ return !!contained.atom_storage
+
/atom/proc/DirectAccess()
return list(src, loc)
diff --git a/code/_onclick/click_alt.dm b/code/_onclick/click_alt.dm
index 9de205d116eb..0c84deee9bff 100644
--- a/code/_onclick/click_alt.dm
+++ b/code/_onclick/click_alt.dm
@@ -119,7 +119,7 @@
///alt and alt-shift click.
///Returns FALSE if the mob is unable to open the loot panel at the target and TRUE if the loot panel was opened.
/mob/living/proc/try_open_loot_panel_on(atom/target)
- if(!CAN_I_SEE(target) || (is_blind() && !IN_GIVEN_RANGE(src, target, 1)))
+ if(!(src in viewers(target)) || (is_blind() && !IN_GIVEN_RANGE(src, target, 1)))
return FALSE
// No alt clicking to view turf from beneath
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index b39ba3352c90..2b874c79eaf2 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -42,12 +42,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
///Assoc list of controller groups, associated with key string group name with value of the plane master controller ref
var/list/atom/movable/plane_master_controller/plane_master_controllers = list()
- /// Think of multiz as a stack of z levels. Each index in that stack has its own group of plane masters
- /// This variable is the plane offset our mob/client is currently "on"
- /// We use it to track what we should show/not show
- /// Goes from 0 to the max (z level stack size - 1)
- var/current_plane_offset = 0
-
/// UI for screentips that appear when you mouse over things
/// Stored directly as it is used in very hot MouseEntered code
var/atom/movable/screen/screentip/screentip_text = null
@@ -233,7 +227,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
for(var/group_key in master_groups)
var/datum/plane_master_group/group = master_groups[group_key]
- group.build_planes_offset(src, current_plane_offset)
+ group.refresh_planes_offset()
/datum/hud/proc/should_use_scale()
return should_sight_scale(mymob.sight)
@@ -243,21 +237,10 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
/datum/hud/proc/eye_z_changed(atom/eye)
SIGNAL_HANDLER
- update_parallax_pref() // If your eye changes z level, so should your parallax prefs
var/turf/eye_turf = get_turf(eye)
if(!eye_turf)
return
SEND_SIGNAL(src, COMSIG_HUD_Z_CHANGED, eye_turf.z)
- var/new_offset = GET_TURF_PLANE_OFFSET(eye_turf)
- if(current_plane_offset == new_offset)
- return
- var/old_offset = current_plane_offset
- current_plane_offset = new_offset
-
- SEND_SIGNAL(src, COMSIG_HUD_OFFSET_CHANGED, old_offset, new_offset)
- for(var/group_key in master_groups)
- var/datum/plane_master_group/group = master_groups[group_key]
- group.build_planes_offset(src, new_offset)
/datum/hud/proc/on_plane_increase(datum/source, old_max_offset, new_max_offset)
SIGNAL_HANDLER
@@ -327,6 +310,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
// I'm sorry
screenmob.client.clear_screen()
screenmob.client.apply_clickcatcher()
+ screenmob.client.apply_parallax()
var/display_hud_version = version
if (!display_hud_version) // If 0 or blank, display the next hud version
@@ -398,11 +382,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
reorganize_alerts(screenmob)
screenmob.reload_fullscreen()
- if(screenmob == mymob)
- update_parallax_pref()
- else
- viewmob.hud_used.update_parallax_pref()
-
update_reuse(screenmob)
// ensure observers get an accurate and up-to-date view
diff --git a/code/_onclick/hud/pai.dm b/code/_onclick/hud/pai.dm
index 4129eafcf78c..ca2309c69b90 100644
--- a/code/_onclick/hud/pai.dm
+++ b/code/_onclick/hud/pai.dm
@@ -5,8 +5,8 @@
/datum/hud/pai/initialize_screen_objects()
. = ..()
add_screen_object(/atom/movable/screen/healthdoll/living, HUD_MOB_HEALTHDOLL, HUD_GROUP_INFO)
- add_screen_object(/atom/movable/screen/language_menu, HUD_MOB_LANGUAGE_MENU, ui_style, ui_pai_language_menu)
- add_screen_object(/atom/movable/screen/navigate, HUD_MOB_NAVIGATE_MENU, ui_style, ui_pai_navigate_menu)
+ add_screen_object(/atom/movable/screen/language_menu, HUD_MOB_LANGUAGE_MENU, HUD_GROUP_STATIC, ui_style, ui_pai_language_menu)
+ add_screen_object(/atom/movable/screen/navigate, HUD_MOB_NAVIGATE_MENU, HUD_GROUP_STATIC, ui_style, ui_pai_navigate_menu)
add_screen_object(/atom/movable/screen/memories, HUD_MOB_MEMORIES, HUD_GROUP_STATIC, ui_style, ui_pai_memories_menu)
add_screen_object(/atom/movable/screen/pai/software, HUD_PAI_SOFTWARE)
diff --git a/code/_onclick/hud/parallax/parallax.dm b/code/_onclick/hud/parallax/parallax.dm
index e04d529234f7..8274695b692e 100644
--- a/code/_onclick/hud/parallax/parallax.dm
+++ b/code/_onclick/hud/parallax/parallax.dm
@@ -1,76 +1,66 @@
/// Decides if parallax should be rendered or not, and sets things up accordingly
-/datum/hud/proc/check_parallax()
- var/client/displaying_client = mymob.client
- if(isnull(displaying_client.parallax_rock))
- displaying_client.parallax_rock = new(null, null, displaying_client)
-
+/atom/movable/screen/parallax_home/proc/check_parallax()
/// Applies our preferences to our existing display
apply_parallax_pref()
- var/atom/movable/screen/parallax_home/rock = displaying_client?.parallax_rock
// Because other parts of the code can just REMOVE US FROM THE SCREEN for no reason as a joke
- if (rock.displaying_layers)
- ADD_TRAIT(src, TRAIT_PARALLAX_DISPLAYED, TRAIT_GENERIC)
- displaying_client.screen |= rock
+ if (displaying_layers)
+ ADD_TRAIT(owner, TRAIT_PARALLAX_DISPLAYED(submap), TRAIT_GENERIC)
+ owner.screen |= src
else
- REMOVE_TRAIT(src, TRAIT_PARALLAX_DISPLAYED, TRAIT_GENERIC)
- displaying_client.screen -= rock
+ REMOVE_TRAIT(owner, TRAIT_PARALLAX_DISPLAYED(submap), TRAIT_GENERIC)
+ owner.screen -= src
-/datum/hud/proc/apply_parallax_pref()
- var/turf/screen_location = get_turf(mymob)
- var/client/displaying_client = mymob.client
- var/atom/movable/screen/parallax_home/rock = displaying_client.parallax_rock
+/atom/movable/screen/parallax_home/proc/apply_parallax_pref()
+ var/turf/screen_location = get_turf(perspective)
if(SSmapping.level_trait(screen_location?.z, ZTRAIT_NOPARALLAX))
- rock.set_layer_settings(layers_to_draw = 0, draw_old_space = FALSE, animate_parallax = FALSE)
+ set_layer_settings(layers_to_draw = 0, draw_old_space = FALSE, animate_parallax = FALSE)
return
- if (SSlag_switch.measures[DISABLE_PARALLAX] && !HAS_TRAIT(mymob, TRAIT_BYPASS_MEASURES))
- rock.set_layer_settings(layers_to_draw = 0, draw_old_space = FALSE, animate_parallax = FALSE)
+ if (SSlag_switch.measures[DISABLE_PARALLAX] && (!owner?.mob || !HAS_TRAIT(owner.mob, TRAIT_BYPASS_MEASURES)))
+ set_layer_settings(layers_to_draw = 0, draw_old_space = FALSE, animate_parallax = FALSE)
return
// Default to HIGH
- var/parallax_selection = displaying_client?.prefs.read_preference(/datum/preference/choiced/parallax) || PARALLAX_HIGH
+ var/parallax_selection = owner?.prefs.read_preference(/datum/preference/choiced/parallax) || PARALLAX_HIGH
switch(parallax_selection)
if (PARALLAX_INSANE)
- rock.set_layer_settings(layers_to_draw = 5, draw_old_space = FALSE, animate_parallax = TRUE)
+ set_layer_settings(layers_to_draw = 5, draw_old_space = FALSE, animate_parallax = TRUE)
return
if(PARALLAX_HIGH)
- rock.set_layer_settings(layers_to_draw = 4, draw_old_space = FALSE, animate_parallax = TRUE)
+ set_layer_settings(layers_to_draw = 4, draw_old_space = FALSE, animate_parallax = TRUE)
return
if (PARALLAX_MED)
- rock.set_layer_settings(layers_to_draw = 3, draw_old_space = FALSE, animate_parallax = TRUE)
+ set_layer_settings(layers_to_draw = 3, draw_old_space = FALSE, animate_parallax = TRUE)
return
if (PARALLAX_LOW)
- rock.set_layer_settings(layers_to_draw = 1, draw_old_space = FALSE, animate_parallax = FALSE)
+ set_layer_settings(layers_to_draw = 1, draw_old_space = FALSE, animate_parallax = FALSE)
return
if (PARALLAX_BOOMER)
- rock.set_layer_settings(layers_to_draw = 0, draw_old_space = TRUE, animate_parallax = TRUE)
+ set_layer_settings(layers_to_draw = 0, draw_old_space = TRUE, animate_parallax = TRUE)
return
if (PARALLAX_DISABLE)
- rock.set_layer_settings(layers_to_draw = 0, draw_old_space = FALSE, animate_parallax = FALSE)
+ set_layer_settings(layers_to_draw = 0, draw_old_space = FALSE, animate_parallax = FALSE)
return
-/datum/hud/proc/update_parallax_pref()
- if(!mymob.client)
- return
- check_parallax()
- update_parallax()
+/client/proc/update_parallax_prefs()
+ for(var/atom/movable/screen/parallax_home/instance as anything in parallax_instances)
+ instance.check_parallax()
+ instance.update_parallax()
// This sets which way the current shuttle is moving (returns true if the shuttle has stopped moving so the caller can append their animation)
-/datum/hud/proc/set_parallax_movedir(new_parallax_movedir = NONE, skip_windups)
- . = FALSE
- var/client/displaying_client = mymob.client
- if(new_parallax_movedir == displaying_client.parallax_movedir)
- return
+/atom/movable/screen/parallax_home/proc/set_parallax_movedir(new_parallax_movedir = NONE, skip_windups)
+ if(new_parallax_movedir == parallax_movedir)
+ return FALSE
- var/animation_dir = new_parallax_movedir || displaying_client.parallax_movedir
+ var/animation_dir = new_parallax_movedir || parallax_movedir
var/matrix/new_transform
switch(animation_dir)
if(NORTH)
@@ -83,17 +73,17 @@
new_transform = matrix(1, 0,-480, 0, 1, 0)
var/longest_timer = 0
- for(var/key in displaying_client.parallax_animate_timers)
- deltimer(displaying_client.parallax_animate_timers[key])
- displaying_client.parallax_animate_timers = list()
- for(var/atom/movable/screen/parallax_layer/layer as anything in displaying_client.parallax_rock.parallax_layers)
+ for(var/key in parallax_animate_timers)
+ deltimer(parallax_animate_timers[key])
+ parallax_animate_timers = list()
+ for(var/atom/movable/screen/parallax_layer/layer as anything in parallax_layers)
var/scaled_time = PARALLAX_LOOP_TIME / layer.speed
if(new_parallax_movedir == NONE) // If we're stopping, we need to stop on the same dime, yeah?
scaled_time = PARALLAX_LOOP_TIME
longest_timer = max(longest_timer, scaled_time)
if(skip_windups)
- update_parallax_motionblur(displaying_client, layer, new_parallax_movedir, new_transform)
+ update_parallax_motionblur(layer, new_parallax_movedir, new_transform)
continue
layer.transform = new_transform
@@ -103,16 +93,14 @@
//queue up another animate so lag doesn't create a shutter
animate(transform = new_transform, time = 0)
animate(transform = matrix(), time = scaled_time / 2)
- displaying_client.parallax_animate_timers[layer] = addtimer(CALLBACK(src, PROC_REF(update_parallax_motionblur), displaying_client, layer, new_parallax_movedir, new_transform), scaled_time, TIMER_CLIENT_TIME|TIMER_STOPPABLE)
+ parallax_animate_timers[layer] = addtimer(CALLBACK(src, PROC_REF(update_parallax_motionblur), layer, new_parallax_movedir, new_transform), scaled_time, TIMER_CLIENT_TIME|TIMER_STOPPABLE)
- displaying_client.dont_animate_parallax = world.time + min(longest_timer, PARALLAX_LOOP_TIME)
- displaying_client.parallax_movedir = new_parallax_movedir
-
-/datum/hud/proc/update_parallax_motionblur(client/displaying_client, atom/movable/screen/parallax_layer/layer, new_parallax_movedir, matrix/new_transform)
- if(!displaying_client)
- return
- displaying_client.parallax_animate_timers -= layer
+ dont_animate_parallax = world.time + min(longest_timer, PARALLAX_LOOP_TIME)
+ parallax_movedir = new_parallax_movedir
+ return TRUE
+/atom/movable/screen/parallax_home/proc/update_parallax_motionblur(atom/movable/screen/parallax_layer/layer, new_parallax_movedir, matrix/new_transform)
+ parallax_animate_timers -= layer
// If we are moving in a direction, we used the QUAD_EASING function with EASE_IN
// This means our position function is x^2. This is always LESS then the linear we're using here
// But if we just used the same time delay, our rate of change would mismatch. f'(1) = 2x for quad easing, rather then the 1 we get for linear
@@ -123,34 +111,36 @@
animate(layer, transform = new_transform, time = 0, loop = -1, flags = ANIMATION_END_NOW)
animate(transform = matrix(), time = scaled_time)
-/datum/hud/proc/update_parallax()
- var/client/displaying_client = mymob.client
- var/turf/posobj = get_turf(displaying_client.eye)
- if(!posobj)
+/atom/movable/screen/parallax_home/proc/update_parallax()
+ var/turf/viewing_from = get_turf(perspective)
+ if(!viewing_from)
return
- var/area/areaobj = posobj.loc
- // Update the movement direction of the parallax if necessary (for shuttles)
- set_parallax_movedir(areaobj.parallax_movedir, FALSE, mymob)
+ var/area/areaobj = viewing_from.loc
+ set_perspective_area(areaobj)
+
+ // Update the movement direction of the parallax if necessary (for shuttles and such)
+ var/quickstart_parallax = FALSE
+ if(!current_turf || (current_turf.z != viewing_from.z))
+ current_turf = viewing_from
+ quickstart_parallax = TRUE
- if(!displaying_client.previous_turf || (displaying_client.previous_turf.z != posobj.z))
- displaying_client.previous_turf = posobj
+ set_parallax_movedir(areaobj.parallax_movedir, quickstart_parallax)
//Doing it this way prevents parallax layers from "jumping" when you change Z-Levels.
- var/offset_x = posobj.x - displaying_client.previous_turf.x
- var/offset_y = posobj.y - displaying_client.previous_turf.y
+ var/offset_x = viewing_from.x - current_turf.x
+ var/offset_y = viewing_from.y - current_turf.y
- var/glide_rate = round(ICON_SIZE_ALL / mymob.glide_size * world.tick_lag, world.tick_lag)
- displaying_client.previous_turf = posobj
+ var/glide_rate = round(ICON_SIZE_ALL / perspective.glide_size * world.tick_lag, world.tick_lag)
+ current_turf = viewing_from
var/largest_change = max(abs(offset_x), abs(offset_y))
var/max_allowed_dist = (glide_rate / world.tick_lag) + 1
- var/atom/movable/screen/parallax_home/rock = displaying_client.parallax_rock
// If we aren't already moving/don't allow parallax, have made some movement, and that movement was smaller then our "glide" size, animate
- var/run_parralax = (rock.animate_parallax && glide_rate && !areaobj.parallax_movedir && displaying_client.dont_animate_parallax <= world.time && largest_change <= max_allowed_dist)
+ var/run_parralax = (animate_parallax && glide_rate && !areaobj.parallax_movedir && dont_animate_parallax <= world.time && largest_change <= max_allowed_dist)
- for(var/atom/movable/screen/parallax_layer/parallax_layer as anything in rock.parallax_layers)
+ for(var/atom/movable/screen/parallax_layer/parallax_layer as anything in parallax_layers)
var/our_speed = parallax_layer.speed
var/change_x
var/change_y
@@ -158,8 +148,8 @@
var/old_y = parallax_layer.offset_y
if(parallax_layer.absolute)
// We use change here so the typically large absolute objects (just lavaland for now) don't jitter so much
- change_x = (posobj.x - SSparallax.planet_x_offset) * our_speed + old_x
- change_y = (posobj.y - SSparallax.planet_y_offset) * our_speed + old_y
+ change_x = (viewing_from.x - SSparallax.planet_x_offset) * our_speed + old_x
+ change_y = (viewing_from.y - SSparallax.planet_y_offset) * our_speed + old_y
else
change_x = offset_x * our_speed
change_y = offset_y * our_speed
@@ -190,16 +180,6 @@
parallax_layer.pixel_w = round(parallax_layer.offset_x, 1)
parallax_layer.pixel_z = round(parallax_layer.offset_y, 1)
-/atom/movable/proc/update_parallax_contents()
- for(var/mob/client_mob as anything in client_mobs_in_contents)
- if(client_mob?.client?.parallax_rock?.displaying_layers && client_mob.hud_used)
- client_mob.hud_used.update_parallax()
-
-/mob/proc/update_parallax_teleport() //used for arrivals shuttle
- if(client?.eye && hud_used && client?.parallax_rock?.displaying_layers)
- var/area/areaobj = get_area(client.eye)
- hud_used.set_parallax_movedir(areaobj.parallax_movedir, TRUE)
-
// Root object for parallax, all parallax layers are drawn onto this and it manages them
/atom/movable/screen/parallax_home
icon = null
@@ -207,6 +187,10 @@
plane = PLANE_SPACE_PARALLAX
screen_loc = "CENTER-7,CENTER-7"
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ /// The submap we are displaying on
+ var/submap = null
+ /// The submap string to draw with, if any
+ var/submap_text = null
/// Layers we are currently displaying
var/list/atom/movable/screen/parallax_layer/parallax_layers = list()
/// Pallet of layers we CAN display if we choose to, depending on our client's prefs
@@ -220,18 +204,95 @@
var/displaying_layers = FALSE
/// Are we animating parallax?
var/animate_parallax = FALSE
+ /// The movable we are being drawn from the perspective of
+ var/atom/movable/perspective
+ /// The turf we are currently displaying "from"
+ var/turf/current_turf
/// The client that owns us
var/client/owner
-
-/atom/movable/screen/parallax_home/Initialize(mapload, datum/hud/hud_owner, client/owner)
+ /// Timers for the area directional animation, one for each layer
+ var/list/parallax_animate_timers
+ /// world.time of when we can state animate()ing parallax again
+ var/dont_animate_parallax
+ /// Direction our current area wants to move parallax
+ var/parallax_movedir = NONE
+ /// The area our perspective is currently in
+ var/area/perspective_area
+
+/atom/movable/screen/parallax_home/Initialize(mapload, datum/hud/hud_owner, client/owner, submap = null)
. = ..()
src.owner = owner
+ owner.parallax_instances += src
+ src.submap = submap
+ if(submap)
+ src.submap_text = "[submap]:"
+ if(!isnull(submap_text))
+ screen_loc = "[submap_text][screen_loc]"
/atom/movable/screen/parallax_home/Destroy()
+ REMOVE_TRAIT(owner, TRAIT_PARALLAX_DISPLAYED(submap), TRAIT_GENERIC)
clear_layers()
+ set_perspective(null)
+ current_turf = null
+ owner.screen -= src
+ owner.parallax_instances -= src
+ if(owner.eye_parallax == src)
+ owner.eye_parallax = null
owner = null
return ..()
+/atom/movable/screen/parallax_home/proc/set_perspective(atom/movable/new_perspective)
+ if(perspective == new_perspective)
+ return
+ var/old_perspective = perspective
+ if(old_perspective)
+ UnregisterSignal(old_perspective, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_Z_CHANGED))
+ perspective = new_perspective
+
+ if(!perspective)
+ SEND_SIGNAL(src, COMSIG_PARALLAX_PERSPECTIVE_CHANGED, old_perspective, new_perspective)
+ return
+ var/static/list/container_connections = list(
+ COMSIG_MOVABLE_MOVED = PROC_REF(perspective_loc_moved),
+ )
+ AddComponent(/datum/component/connect_containers, perspective, container_connections)
+ RegisterSignal(perspective, COMSIG_MOVABLE_MOVED, PROC_REF(perspective_moved))
+ RegisterSignal(perspective, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(perspective_z_changed))
+ SEND_SIGNAL(src, COMSIG_PARALLAX_PERSPECTIVE_CHANGED, old_perspective, new_perspective)
+ check_parallax()
+ update_parallax()
+
+/atom/movable/screen/parallax_home/proc/perspective_loc_moved(atom/movable/source)
+ if(source.moving_diagonally == FIRST_DIAG_STEP)
+ return
+ update_parallax()
+
+/atom/movable/screen/parallax_home/proc/perspective_moved(datum/source)
+ SIGNAL_HANDLER
+ // We don't do this all the time because diag movements should trigger one call to this, not two
+ // Waste of cpu time, and it fucks the animate
+ if(perspective.moving_diagonally == FIRST_DIAG_STEP)
+ return
+ update_parallax()
+
+/atom/movable/screen/parallax_home/proc/perspective_z_changed(datum/source)
+ SIGNAL_HANDLER
+ check_parallax()
+ update_parallax()
+
+/atom/movable/screen/parallax_home/proc/set_perspective_area(area/new_area)
+ if(perspective_area == new_area)
+ return
+ if(perspective_area)
+ UnregisterSignal(perspective_area, COMSIG_AREA_PARALLAX_DIR_CHANGED)
+
+ perspective_area = new_area
+ RegisterSignal(perspective_area, COMSIG_AREA_PARALLAX_DIR_CHANGED, PROC_REF(area_parallax_dir_changed))
+
+/atom/movable/screen/parallax_home/proc/area_parallax_dir_changed(datum/source)
+ SIGNAL_HANDLER
+ update_parallax()
+
/atom/movable/screen/parallax_home/proc/display_layers()
if(displaying_layers || length(parallax_layers_cached) == 0)
return
@@ -257,20 +318,20 @@
/atom/movable/screen/parallax_home/proc/generate_space_layer(index)
switch(index)
if(1)
- return new /atom/movable/screen/parallax_layer/layer_1(null, null, owner)
+ return new /atom/movable/screen/parallax_layer/layer_1(null, null, src)
if(2)
- return new /atom/movable/screen/parallax_layer/layer_2(null, null, owner)
+ return new /atom/movable/screen/parallax_layer/layer_2(null, null, src)
/* // DARKPACK EDIT REMOVAL START
if(3)
- return new /atom/movable/screen/parallax_layer/planet(null, null, owner)
+ return new /atom/movable/screen/parallax_layer/planet(null, null, src)
if(4)
if(SSparallax.random_layer)
- return new SSparallax.random_layer.type(null, null, owner, FALSE, SSparallax.random_layer)
+ return new SSparallax.random_layer.type(null, null, src, FALSE, SSparallax.random_layer)
else
- return new /atom/movable/screen/parallax_layer/layer_3(null, null, owner)
+ return new /atom/movable/screen/parallax_layer/layer_3(null, null, src)
if(5)
if(SSparallax.random_layer)
- return new /atom/movable/screen/parallax_layer/layer_3(null, null, owner)
+ return new /atom/movable/screen/parallax_layer/layer_3(null, null, src)
*/ // DARKPACK EDIT REMOVAL END
/atom/movable/screen/parallax_home/proc/regenerate_layers()
@@ -287,9 +348,9 @@
parallax_layers_cached += parallax
if(draw_old_space)
- parallax_layers_cached += new /atom/movable/screen/parallax_layer/old(null, null, owner)
+ parallax_layers_cached += new /atom/movable/screen/parallax_layer/old(null, null, src)
- parallax_layers_cached += new /atom/movable/screen/parallax_layer/umbra(null, null, owner) // DARKPACK EDIT ADD - UMBRA
+ parallax_layers_cached += new /atom/movable/screen/parallax_layer/umbra(null, null, src) // DARKPACK EDIT ADD - UMBRA
display_layers()
@@ -310,8 +371,10 @@
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/// View size we're being rendered with
var/working_view = ""
+ /// The parallax home that owns us
+ var/atom/movable/screen/parallax_home/home
-/atom/movable/screen/parallax_layer/Initialize(mapload, datum/hud/hud_owner, client/owner, template = FALSE)
+/atom/movable/screen/parallax_layer/Initialize(mapload, datum/hud/hud_owner, atom/movable/screen/parallax_home/home, template = FALSE)
. = ..()
// Parallax layers are independent of hud, they care about client
// Not doing this will just create a bunch of hard deletes
@@ -320,14 +383,26 @@
if(template)
return
- if(!owner) // If this typepath all starts to harddel your culprit is likely this
+ src.home = home
+ var/client/owner = home.owner
+ if(QDELETED(owner)) // If this typepath all starts to harddel your culprit is likely this
return INITIALIZE_HINT_QDEL
+ if(!isnull(home.submap_text))
+ screen_loc = "[home.submap_text][screen_loc]"
+
// I do not want to know bestie
var/view = owner.view || world.view
update_o(view)
RegisterSignal(owner, COMSIG_VIEW_SET, PROC_REF(on_view_change))
+/atom/movable/screen/parallax_layer/Destroy()
+ if(home)
+ home.parallax_layers_cached -= src
+ home.parallax_layers -= src
+ home = null
+ return ..()
+
/atom/movable/screen/parallax_layer/proc/on_view_change(datum/source, new_size)
SIGNAL_HANDLER
update_o(new_size)
@@ -413,29 +488,27 @@
speed = 3
layer = 30
-/atom/movable/screen/parallax_layer/planet/Initialize(mapload, datum/hud/hud_owner, client/owner)
+/atom/movable/screen/parallax_layer/planet/Initialize(mapload, datum/hud/hud_owner, atom/movable/screen/parallax_home/home)
. = ..()
- if(!owner)
- return
- var/static/list/connections = list(
- COMSIG_MOVABLE_Z_CHANGED = PROC_REF(on_z_change),
- COMSIG_MOB_LOGOUT = PROC_REF(on_mob_logout),
- )
- AddComponent(/datum/component/connect_mob_behalf, owner, connections)
- on_z_change(owner.mob)
+ RegisterSignal(home, COMSIG_PARALLAX_PERSPECTIVE_CHANGED, PROC_REF(perspective_changed))
+ perspective_changed(home, null, home.perspective)
-/atom/movable/screen/parallax_layer/planet/proc/on_mob_logout(mob/source)
+/atom/movable/screen/parallax_layer/planet/proc/perspective_changed(datum/source, atom/old_perspective, atom/new_perspective)
SIGNAL_HANDLER
- var/client/boss = source.canon_client
- on_z_change(boss.mob)
+ if(old_perspective == new_perspective)
+ return
+ if(old_perspective)
+ UnregisterSignal(old_perspective, COMSIG_MOVABLE_Z_CHANGED)
+ if(new_perspective)
+ RegisterSignal(new_perspective, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_z_change))
+ on_z_change(new_perspective)
-/atom/movable/screen/parallax_layer/planet/proc/on_z_change(mob/source)
+/atom/movable/screen/parallax_layer/planet/proc/on_z_change(atom/source)
SIGNAL_HANDLER
- var/client/boss = source.client
- var/turf/posobj = get_turf(boss?.eye)
- if(!posobj)
+ var/turf/viewing_from = get_turf(home?.perspective)
+ if(isnull(viewing_from))
return
- SetInvisibility(is_station_level(posobj.z) ? INVISIBILITY_NONE : INVISIBILITY_ABSTRACT, id=type)
+ SetInvisibility(is_station_level(viewing_from.z) ? INVISIBILITY_NONE : INVISIBILITY_ABSTRACT, id=type)
/atom/movable/screen/parallax_layer/planet/update_o()
return //Shit won't move
diff --git a/code/_onclick/hud/parallax/random_layer.dm b/code/_onclick/hud/parallax/random_layer.dm
index 51cf69a92c00..64b36ff8385f 100644
--- a/code/_onclick/hud/parallax/random_layer.dm
+++ b/code/_onclick/hud/parallax/random_layer.dm
@@ -4,7 +4,7 @@
speed = 2
layer = 3
-/atom/movable/screen/parallax_layer/random/Initialize(mapload, datum/hud/hud_owner, client/owner, template, atom/movable/screen/parallax_layer/random/twin)
+/atom/movable/screen/parallax_layer/random/Initialize(mapload, datum/hud/hud_owner, atom/movable/screen/parallax_home/home, template, atom/movable/screen/parallax_layer/random/twin)
. = ..()
if(twin)
diff --git a/code/_onclick/hud/rendering/plane_master_group.dm b/code/_onclick/hud/rendering/plane_master_group.dm
index 5b84a5c05a2e..cddb389b3f87 100644
--- a/code/_onclick/hud/rendering/plane_master_group.dm
+++ b/code/_onclick/hud/rendering/plane_master_group.dm
@@ -9,7 +9,13 @@
var/datum/hud/our_hud
/// List in the form "[plane]" = object, the plane masters we own
var/list/atom/movable/screen/plane_master/plane_masters = list()
- /// The visual offset we are currently using
+
+ /// The atom whose "perspective" we are viewing the world from
+ var/atom/perspective
+ /// Think of multiz as a stack of z levels. Each index in that stack has its own group of plane masters
+ /// This variable is the plane offset our perpsective is currently "on"
+ /// We use it to track what we should show/not show
+ /// Goes from 0 to the max (z level stack size - 1)
var/active_offset = 0
/// What, if any, submap we render onto
var/map = ""
@@ -26,11 +32,14 @@
/datum/plane_master_group/Destroy()
set_hud(null)
QDEL_LIST_ASSOC_VAL(plane_masters)
+ set_perspective(null)
return ..()
+/// Hooks outselves into the passed in hud
+/// Returns TRUE if meaningful, FALSE otherwise
/datum/plane_master_group/proc/set_hud(datum/hud/new_hud)
if(new_hud == our_hud)
- return
+ return FALSE
if(our_hud)
our_hud.master_groups -= key
hide_hud()
@@ -39,8 +48,9 @@
if(new_hud)
our_hud.master_groups[key] = src
show_hud()
- build_planes_offset(our_hud, active_offset)
- SEND_SIGNAL(src, COMSIG_GROUP_HUD_CHANGED, old_hud, our_hud)
+ refresh_planes_offset()
+ SEND_SIGNAL(src, COMSIG_PLANE_GROUP_HUD_CHANGED, old_hud, our_hud)
+ return TRUE
/// Display a plane master group to some viewer, so show all our planes to it
/datum/plane_master_group/proc/attach_to(datum/hud/viewing_hud)
@@ -51,7 +61,7 @@
set_hud(viewing_hud)
our_hud.master_groups[key] = src
show_hud()
- build_planes_offset(our_hud, active_offset)
+ refresh_planes_offset()
/// Well, refresh our group, mostly useful for plane specific updates
/datum/plane_master_group/proc/refresh_hud()
@@ -63,8 +73,7 @@
hide_hud()
rebuild_plane_masters()
show_hud()
- our_hud.update_parallax_pref()
- build_planes_offset(our_hud, active_offset)
+ refresh_planes_offset()
/// Regenerate our plane masters, this is useful if we don't have a mob but still want to rebuild. Such in the case of changing the screen_loc of relays
/datum/plane_master_group/proc/rebuild_plane_masters()
@@ -81,6 +90,38 @@
var/atom/movable/screen/plane_master/plane = plane_masters[thing]
show_plane(plane)
+/datum/plane_master_group/proc/set_perspective(atom/new_perspective)
+ var/atom/old_perspective = perspective
+ if(old_perspective)
+ UnregisterSignal(old_perspective, list(COMSIG_QDELETING, COMSIG_MOVABLE_Z_CHANGED))
+ perspective = new_perspective
+ if(new_perspective)
+ RegisterSignal(new_perspective, COMSIG_QDELETING, PROC_REF(perspective_deleted))
+ RegisterSignal(new_perspective, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(perspective_z_changed))
+ position_changed()
+ SEND_SIGNAL(src, COMSIG_PLANE_GROUP_PERSPECTIVE_CHANGED, old_perspective, new_perspective)
+
+/datum/plane_master_group/proc/perspective_deleted(datum/source)
+ SIGNAL_HANDLER
+ set_perspective(null)
+
+/// Returns the perspective we are viewing with this plane master group, null if there is none
+/datum/plane_master_group/proc/get_perspective()
+ return perspective
+
+/datum/plane_master_group/proc/perspective_z_changed(datum/source, turf/old_turf, turf/new_turf, same_z_layer)
+ SIGNAL_HANDLER
+ position_changed()
+
+/datum/plane_master_group/proc/position_changed()
+ if(isnull(perspective))
+ return
+ var/turf/perspective_turf = get_turf(perspective)
+ var/new_offset = GET_TURF_PLANE_OFFSET(perspective_turf)
+ if(active_offset == new_offset)
+ return
+ build_planes_offset(new_offset)
+
/// This is mostly a proc so it can be overriden by popups, since they have unique behavior they want to do
/datum/plane_master_group/proc/show_plane(atom/movable/screen/plane_master/plane)
plane.show_to(our_hud.mymob)
@@ -107,14 +148,23 @@
/datum/plane_master_group/proc/prep_plane_instance(atom/movable/screen/plane_master/instance)
return
+/// Returns TRUE if we should scale our planes with depth, FALSE otherwise
+/datum/plane_master_group/proc/should_scale()
+ return TRUE
+
+/// Regenerates plane offsets, done if we suspect something may have changed
+/datum/plane_master_group/proc/refresh_planes_offset()
+ build_planes_offset(active_offset)
+
// It would be nice to setup parallaxing for stairs and things when doing this
-// So they look nicer. if you can't it's all good, if you think you can sanely look at monster's work
+// So they look nicer. if you can't it's all good, if you think you can sanely look at monster/ella's work
// It's hard, and potentially expensive. be careful
-/datum/plane_master_group/proc/build_planes_offset(datum/hud/source, new_offset, use_scale = FALSE) // DARKPACK EDIT CHANGE
+/datum/plane_master_group/proc/build_planes_offset(new_offset)
// Check if this feature is disabled for the client, in which case don't use scale.
var/mob/our_mob = our_hud?.mymob
+ var/use_scale = should_scale()
/* // DARKPACK EDIT REMOVAL - Offsets Z levels to give the appearance of building 'stacking' - this will always be toggled off
- if(!our_mob?.client?.prefs?.read_preference(/datum/preference/toggle/multiz_parallax))
+ if(use_scale && !our_mob?.client?.prefs?.read_preference(/datum/preference/toggle/multiz_parallax))
use_scale = FALSE
*/ // DARKPACK EDIT REMOVAL END
use_scale = FALSE // DARKPACK EDIT -- we want multi-z parallax offsets to always be false
@@ -122,8 +172,12 @@
if(!SSmapping.max_plane_offset)
return
+ var/old_offset = active_offset
active_offset = new_offset
+ if(old_offset != new_offset)
+ SEND_SIGNAL(src, COMSIG_PLANE_GROUP_OFFSET_CHANGED, old_offset, new_offset)
+
// Each time we go "down" a visual z level, we'll reduce the scale by this amount
// Chosen because mothblocks liked it, didn't cause motion sickness while also giving a sense of height
var/scale_by = 0.965
@@ -191,16 +245,26 @@
/// If you wanna try someday feel free, but I can't manage it
/datum/plane_master_group/popup
-/datum/plane_master_group/popup/build_planes_offset(datum/hud/source, new_offset, use_scale = TRUE)
- return ..(source, new_offset, FALSE)
-
/// Holds the main plane master
/datum/plane_master_group/main
-/datum/plane_master_group/main/build_planes_offset(datum/hud/source, new_offset, use_scale = TRUE)
- if(use_scale)
- return ..(source, new_offset, source.should_use_scale())
- return ..()
+/datum/plane_master_group/main/set_hud(datum/hud/new_hud)
+ var/datum/hud/old_hud = our_hud
+ . = ..()
+ if(!.)
+ return
+ if(old_hud)
+ UnregisterSignal(old_hud, COMSIG_HUD_EYE_CHANGED)
+ if(new_hud)
+ RegisterSignal(new_hud, COMSIG_HUD_EYE_CHANGED, PROC_REF(hud_eye_changed))
+ set_perspective(new_hud?.mymob?.client?.eye)
+
+/datum/plane_master_group/main/proc/hud_eye_changed(datum/source, atom/old_eye, atom/new_eye)
+ SIGNAL_HANDLER
+ set_perspective(new_eye)
+
+/datum/plane_master_group/main/should_scale()
+ return our_hud?.should_use_scale() || FALSE
/// Hudless group. Exists for testing
/datum/plane_master_group/hudless
@@ -210,11 +274,13 @@
. = ..()
our_mob = null
+/datum/plane_master_group/hudless/get_perspective()
+ return our_mob
+
/datum/plane_master_group/hudless/hide_hud()
for(var/thing in plane_masters)
var/atom/movable/screen/plane_master/plane = plane_masters[thing]
plane.hide_from(our_mob)
-/// This is mostly a proc so it can be overriden by popups, since they have unique behavior they want to do
/datum/plane_master_group/hudless/show_plane(atom/movable/screen/plane_master/plane)
plane.show_to(our_mob)
diff --git a/code/_onclick/hud/rendering/plane_masters/_plane_master.dm b/code/_onclick/hud/rendering/plane_masters/_plane_master.dm
index c1efa44f8a37..bd98749dc20e 100644
--- a/code/_onclick/hud/rendering/plane_masters/_plane_master.dm
+++ b/code/_onclick/hud/rendering/plane_masters/_plane_master.dm
@@ -94,9 +94,9 @@
if(!istype(home, /datum/plane_master_group))
return FALSE
src.home = home
+ assigned_map = home.map
if(home.map)
screen_loc = "[home.map]:[screen_loc]"
- assigned_map = home.map
return TRUE
/// Updates our "offset", basically what layer of multiz we're meant to render
diff --git a/code/_onclick/hud/rendering/plane_masters/plane_master_subtypes.dm b/code/_onclick/hud/rendering/plane_masters/plane_master_subtypes.dm
index c6635c723f23..3e077ac3fdef 100644
--- a/code/_onclick/hud/rendering/plane_masters/plane_master_subtypes.dm
+++ b/code/_onclick/hud/rendering/plane_masters/plane_master_subtypes.dm
@@ -67,25 +67,28 @@
. = ..()
add_relay_to(GET_NEW_PLANE(RENDER_PLANE_EMISSIVE, offset), relay_layer = EMISSIVE_SPACE_LAYER)
-/atom/movable/screen/plane_master/parallax_white/set_home(datum/plane_master_group/home)
+/atom/movable/screen/plane_master/parallax_white/show_to(mob/mymob)
. = ..()
- if(home)
- RegisterSignal(home, COMSIG_GROUP_HUD_CHANGED, PROC_REF(hud_changed))
- hud_changed(null, null, home.our_hud)
+ if(!.)
+ return
-/atom/movable/screen/plane_master/parallax_white/proc/hud_changed(datum/source, datum/hud/old_hud, datum/hud/new_hud)
- SIGNAL_HANDLER
- if(old_hud)
- UnregisterSignal(old_hud, list(SIGNAL_ADDTRAIT(TRAIT_PARALLAX_DISPLAYED), SIGNAL_REMOVETRAIT(TRAIT_PARALLAX_DISPLAYED)), PROC_REF(parallax_updated))
- if(new_hud)
- RegisterSignals(new_hud, list(SIGNAL_ADDTRAIT(TRAIT_PARALLAX_DISPLAYED), SIGNAL_REMOVETRAIT(TRAIT_PARALLAX_DISPLAYED)), PROC_REF(parallax_updated))
- parallax_updated(new_hud)
+ if(isnull(mymob.client))
+ return
+
+ RegisterSignals(mymob.client, list(SIGNAL_ADDTRAIT(TRAIT_PARALLAX_DISPLAYED(assigned_map)), SIGNAL_REMOVETRAIT(TRAIT_PARALLAX_DISPLAYED(assigned_map))), PROC_REF(parallax_updated), override = TRUE)
+ parallax_updated(mymob.client)
+
+/atom/movable/screen/plane_master/parallax_white/hide_from(mob/oldmob)
+ . = ..()
+ if(isnull(oldmob.client))
+ return
+ UnregisterSignal(oldmob.client, list(SIGNAL_ADDTRAIT(TRAIT_PARALLAX_DISPLAYED(assigned_map)), SIGNAL_REMOVETRAIT(TRAIT_PARALLAX_DISPLAYED(assigned_map))))
-/atom/movable/screen/plane_master/parallax_white/proc/parallax_updated(datum/source)
+/atom/movable/screen/plane_master/parallax_white/proc/parallax_updated(client/source)
SIGNAL_HANDLER
- if(isnull(home.our_hud?.mymob))
+ if(isnull(source))
return
- if(HAS_TRAIT(home.our_hud, TRAIT_PARALLAX_DISPLAYED))
+ if(HAS_TRAIT(source, TRAIT_PARALLAX_DISPLAYED(assigned_map)))
// Gives parallax a fullwhite backdrop to multiply against
color = list(
0, 0, 0, 0,
@@ -122,28 +125,34 @@
narsie_start_midway(GLOB.narsie_effect_last_modified) // We assume we're on the start, so we can use this number
offset_increase(0, SSmapping.max_plane_offset)
-/atom/movable/screen/plane_master/parallax/set_home(datum/plane_master_group/home)
+/atom/movable/screen/plane_master/parallax/show_to(mob/mymob)
. = ..()
- if(home)
- RegisterSignal(home, COMSIG_GROUP_HUD_CHANGED, PROC_REF(hud_changed))
- hud_changed(null, null, home.our_hud)
+ if(!.)
+ return
-/atom/movable/screen/plane_master/parallax/proc/hud_changed(datum/source, datum/hud/old_hud, datum/hud/new_hud)
+ // Huds have a 1 to 1 for mobs so we're just gonna hook to this mob's potential clients forever!
+ // We have to do it this way instead of just using show_to/hide from because otherwise we immediately remove the signals as soon as we hide ourselves
+ // Perhaps we need separate "hook to mob" and "display" procs?
+ var/list/parallax_signals = list(
+ SIGNAL_ADDTRAIT(TRAIT_PARALLAX_DISPLAYED(assigned_map)) = PROC_REF(parallax_updated),
+ SIGNAL_REMOVETRAIT(TRAIT_PARALLAX_DISPLAYED(assigned_map)) = PROC_REF(parallax_updated)
+ )
+ AddComponent(/datum/component/connect_client_behalf, mymob, parallax_signals)
+ if(!isnull(mymob.client))
+ update_connections(mymob.client, TRUE)
+
+/atom/movable/screen/plane_master/parallax/proc/parallax_updated(client/source)
SIGNAL_HANDLER
- if(old_hud)
- UnregisterSignal(old_hud, list(SIGNAL_ADDTRAIT(TRAIT_PARALLAX_DISPLAYED), SIGNAL_REMOVETRAIT(TRAIT_PARALLAX_DISPLAYED)), PROC_REF(parallax_updated))
- if(new_hud)
- RegisterSignals(new_hud, list(SIGNAL_ADDTRAIT(TRAIT_PARALLAX_DISPLAYED), SIGNAL_REMOVETRAIT(TRAIT_PARALLAX_DISPLAYED)), PROC_REF(parallax_updated))
- parallax_updated(new_hud)
+ update_connections(source)
-/atom/movable/screen/plane_master/parallax/proc/parallax_updated(datum/source)
- SIGNAL_HANDLER
- if(isnull(home.our_hud?.mymob))
+/atom/movable/screen/plane_master/parallax/proc/update_connections(client/updating, displayed_already = FALSE)
+ if(isnull(updating?.mob))
return
- if(HAS_TRAIT(home.our_hud, TRAIT_PARALLAX_DISPLAYED))
- show_to(home.our_hud.mymob)
+ if(HAS_TRAIT(updating, TRAIT_PARALLAX_DISPLAYED(assigned_map)))
+ if(!displayed_already)
+ show_to(updating.mob)
else
- hide_from(home.our_hud.mymob)
+ hide_from(updating.mob)
/atom/movable/screen/plane_master/parallax/proc/on_offset_increase(datum/source, old_offset, new_offset)
SIGNAL_HANDLER
@@ -329,14 +338,15 @@
if(!.)
return
home.AddComponent(/datum/component/hide_weather_planes, src)
- RegisterSignal(home, COMSIG_GROUP_HUD_CHANGED, PROC_REF(hud_changed))
- update_state(home.our_hud?.mymob)
+ RegisterSignal(home, COMSIG_PLANE_GROUP_HUD_CHANGED, PROC_REF(hud_changed))
+ update_state()
/atom/movable/screen/plane_master/weather/proc/hud_changed(datum/source, datum/hud/old_hud, datum/hud/new_hud)
SIGNAL_HANDLER
- update_state(new_hud?.mymob)
+ update_state()
-/atom/movable/screen/plane_master/weather/proc/update_state(mob/mymob)
+/atom/movable/screen/plane_master/weather/proc/update_state()
+ var/mob/mymob = home.our_hud?.mymob
if(!istype(mymob))
return
@@ -477,32 +487,28 @@
/atom/movable/screen/plane_master/camera_static/set_home(datum/plane_master_group/home)
. = ..()
if(home)
- RegisterSignal(home, COMSIG_GROUP_HUD_CHANGED, PROC_REF(hud_changed))
- hud_changed(null, null, home.our_hud)
+ RegisterSignal(home, COMSIG_PLANE_GROUP_PERSPECTIVE_CHANGED, PROC_REF(perspective_changed))
+ update_perspective()
-/atom/movable/screen/plane_master/camera_static/proc/hud_changed(datum/source, datum/hud/old_hud, datum/hud/new_hud)
+/atom/movable/screen/plane_master/camera_static/proc/perspective_changed(datum/source, atom/old_perspective, atom/new_perspective)
SIGNAL_HANDLER
- if(old_hud)
- UnregisterSignal(old_hud, COMSIG_HUD_EYE_CHANGED, PROC_REF(eye_changed))
- if(new_hud)
- RegisterSignal(new_hud, COMSIG_HUD_EYE_CHANGED, PROC_REF(eye_changed))
- eye_changed(new_hud, null, new_hud.mymob?.canon_client?.eye)
+ update_perspective()
-/atom/movable/screen/plane_master/camera_static/proc/eye_changed(datum/hud/source, atom/old_eye, atom/new_eye)
- SIGNAL_HANDLER
+/atom/movable/screen/plane_master/camera_static/proc/update_perspective()
+ var/atom/perspective = home.get_perspective()
- if(istype(new_eye, /obj/effect/landmark/ai_multicam_room))
+ if(istype(perspective, /obj/effect/landmark/ai_multicam_room))
if(force_hidden)
- unhide_plane(source.mymob)
+ unhide_plane(home.our_hud?.mymob)
return
- if(!iscameramob(new_eye))
+ if(!iscameramob(perspective))
if(!force_hidden)
- hide_plane(source.mymob)
+ hide_plane(home.our_hud?.mymob)
return
if(force_hidden)
- unhide_plane(source.mymob)
+ unhide_plane(home.our_hud?.mymob)
/atom/movable/screen/plane_master/high_game
name = "High Game"
diff --git a/code/_onclick/hud/rendering/render_plate.dm b/code/_onclick/hud/rendering/render_plate.dm
index 49b3a2cf551b..abaa4937b340 100644
--- a/code/_onclick/hud/rendering/render_plate.dm
+++ b/code/_onclick/hud/rendering/render_plate.dm
@@ -86,74 +86,46 @@
// We can actually do this just fine as we do not render anything onto ourselves but our particles
add_filter("weather_mask", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(WEATHER_MASK_RENDER_TARGET, offset)))
-/atom/movable/screen/plane_master/rendering_plate/particle_weather/Destroy()
- SSweather.particle_planemasters -= src
- return ..()
-
/atom/movable/screen/plane_master/rendering_plate/particle_weather/set_home(datum/plane_master_group/home)
. = ..()
if(!.)
return
home.AddComponent(/datum/component/hide_weather_planes, src)
- RegisterSignal(home, COMSIG_GROUP_HUD_CHANGED, PROC_REF(hud_changed))
- if (home.our_hud)
- attach_hud(home.our_hud)
- update_state(home.our_hud?.mymob)
+ AddComponent(/datum/component/connect_perspective, home, list(COMSIG_MOVABLE_Z_CHANGED = PROC_REF(z_changed)))
+ RegisterSignal(home, COMSIG_PLANE_GROUP_HUD_CHANGED, PROC_REF(hud_changed))
+ RegisterSignal(home, COMSIG_PLANE_GROUP_PERSPECTIVE_CHANGED, PROC_REF(perspective_changed))
+ update_state()
-/atom/movable/screen/plane_master/rendering_plate/particle_weather/proc/hud_changed(datum/source, datum/hud/old_hud, datum/hud/new_hud)
+/atom/movable/screen/plane_master/rendering_plate/particle_weather/proc/z_changed(datum/source)
SIGNAL_HANDLER
- if (old_hud)
- UnregisterSignal(old_hud, COMSIG_HUD_Z_CHANGED)
- attach_hud(new_hud)
- update_state(new_hud?.mymob)
+ update_state()
-/atom/movable/screen/plane_master/rendering_plate/particle_weather/proc/attach_hud(datum/hud/new_hud)
- RegisterSignal(new_hud, COMSIG_HUD_Z_CHANGED, PROC_REF(z_changed))
- var/mob/eye = new_hud?.mymob?.client?.eye
- var/turf/eye_location = get_turf(eye)
- z_changed(new_hud, eye_location?.z)
+/atom/movable/screen/plane_master/rendering_plate/particle_weather/proc/hud_changed(datum/source)
+ SIGNAL_HANDLER
+ update_state()
+
+/atom/movable/screen/plane_master/rendering_plate/particle_weather/proc/perspective_changed(datum/source)
+ SIGNAL_HANDLER
+ update_state()
/// Updates ourselves based on our mob's preferences state
-/atom/movable/screen/plane_master/rendering_plate/particle_weather/proc/update_state(mob/mymob)
- SSweather.particle_planemasters -= src
+/atom/movable/screen/plane_master/rendering_plate/particle_weather/proc/update_state()
vis_contents.Cut()
+ var/mob/mymob = home?.our_hud?.mymob
if(!istype(mymob) || !mymob.canon_client?.prefs?.read_preference(/datum/preference/toggle/particle_weather))
return
-
- SSweather.particle_planemasters[src] = TRUE
-
// Lobby HUDs, we don't care about weather during init anyways
if(!SSmapping.initialized)
return
- var/list/stack_levels = SSmapping.get_connected_levels(get_turf(mymob.client?.eye || mymob))
- // And add all ongoing weather to ourselves
- for (var/holder_offset, holder_list in SSweather.particle_holders)
- for (var/obj/effect/abstract/weather_holder/holder as anything in holder_list)
- // Only display particles from the same Z-stack as our mob's
- if (holder.plane == plane && length(holder_list[holder] & stack_levels))
- vis_contents += holder
-
-/atom/movable/screen/plane_master/rendering_plate/particle_weather/proc/z_changed(datum/source, new_z)
- SIGNAL_HANDLER
-
- if(!SSweather.particle_planemasters[src])
+ var/list/stack_levels = SSmapping.get_connected_levels(get_turf(home.get_perspective()))
+ var/max_z = max(stack_levels)
+ var/our_z = max_z - offset
+ if(!(our_z in stack_levels))
return
- if(!SSmapping.initialized)
- return
-
- var/list/stack_levels = SSmapping.get_connected_levels(new_z)
- for (var/holder_offset, holder_list in SSweather.particle_holders)
- for (var/obj/effect/abstract/weather_holder/holder as anything in holder_list)
- if (holder.plane != plane)
- continue
-
- if (length(holder_list[holder] & stack_levels))
- vis_contents |= holder
- else
- vis_contents -= holder
+ vis_contents += SSweather.z_particles[our_z][plane]
/atom/movable/screen/plane_master/rendering_plate/particle_weather/emissive
name = "Emissive Particle Weather Holder Plate"
@@ -327,8 +299,8 @@
/atom/movable/screen/plane_master/rendering_plate/lighting/set_home(datum/plane_master_group/home)
. = ..()
if(home)
- RegisterSignal(home, COMSIG_GROUP_HUD_CHANGED, PROC_REF(hud_changed))
- hud_changed(null, null, home.our_hud)
+ RegisterSignal(home, COMSIG_PLANE_GROUP_OFFSET_CHANGED, PROC_REF(on_offset_change))
+ offset_change(home.active_offset || 0)
/atom/movable/screen/plane_master/rendering_plate/lighting/show_to(mob/mymob)
. = ..()
@@ -352,14 +324,6 @@
oldmob.clear_fullscreen("lighting_backdrop_lit_[home.key]#[offset]")
oldmob.clear_fullscreen("lighting_backdrop_unlit_[home.key]#[offset]")
-/atom/movable/screen/plane_master/rendering_plate/lighting/proc/hud_changed(datum/source, datum/hud/old_hud, datum/hud/new_hud)
- SIGNAL_HANDLER
- if(old_hud)
- UnregisterSignal(old_hud, COMSIG_HUD_OFFSET_CHANGED, PROC_REF(on_offset_change))
- if(new_hud)
- RegisterSignal(new_hud, COMSIG_HUD_OFFSET_CHANGED, PROC_REF(on_offset_change))
- offset_change(new_hud?.current_plane_offset || 0)
-
/atom/movable/screen/plane_master/rendering_plate/lighting/proc/on_offset_change(datum/source, old_offset, new_offset)
SIGNAL_HANDLER
offset_change(new_offset)
@@ -573,16 +537,8 @@
if(offset == 0)
return
if(home)
- RegisterSignal(home, COMSIG_GROUP_HUD_CHANGED, PROC_REF(hud_changed))
- hud_changed(null, null, home.our_hud)
-
-/atom/movable/screen/plane_master/rendering_plate/master/proc/hud_changed(datum/source, datum/hud/old_hud, datum/hud/new_hud)
- SIGNAL_HANDLER
- if(old_hud)
- UnregisterSignal(old_hud, COMSIG_HUD_OFFSET_CHANGED, PROC_REF(on_offset_change))
- if(new_hud)
- RegisterSignal(new_hud, COMSIG_HUD_OFFSET_CHANGED, PROC_REF(on_offset_change))
- offset_change(new_hud?.current_plane_offset || 0)
+ RegisterSignal(home, COMSIG_PLANE_GROUP_OFFSET_CHANGED, PROC_REF(on_offset_change))
+ offset_change(home.active_offset || 0)
/atom/movable/screen/plane_master/rendering_plate/master/proc/on_offset_change(datum/source, old_offset, new_offset)
SIGNAL_HANDLER
@@ -670,7 +626,7 @@
if(show_to)
show_to.screen += relay
if(offsetting_flags & OFFSET_RELAYS_MATCH_HIGHEST && home.our_hud)
- offset_relay(relay, home.our_hud.current_plane_offset)
+ offset_relay(relay, home.active_offset)
return relay
/// Breaks a connection between this plane master, and the passed in place
diff --git a/code/_onclick/hud/screen_objects/ai.dm b/code/_onclick/hud/screen_objects/ai.dm
index ffa18a01e68d..2586fec13446 100644
--- a/code/_onclick/hud/screen_objects/ai.dm
+++ b/code/_onclick/hud/screen_objects/ai.dm
@@ -195,7 +195,7 @@
/atom/movable/screen/ai/floor_indicator/Initialize(mapload, datum/hud/hud_owner)
. = ..()
if(istype(hud_owner))
- RegisterSignal(hud_owner, COMSIG_HUD_OFFSET_CHANGED, PROC_REF(update_z))
+ RegisterSignal(hud_owner, COMSIG_HUD_Z_CHANGED, PROC_REF(update_z))
update_z()
/atom/movable/screen/ai/floor_indicator/proc/update_z(datum/hud/source)
diff --git a/code/_onclick/hud/screen_objects/alert.dm b/code/_onclick/hud/screen_objects/alert.dm
index 23d7cb88d5e6..675483efcd96 100644
--- a/code/_onclick/hud/screen_objects/alert.dm
+++ b/code/_onclick/hud/screen_objects/alert.dm
@@ -549,6 +549,7 @@
offerer.add_mood_event("high_five", /datum/mood_event/down_low)
rube.add_mood_event("high_five", /datum/mood_event/too_slow)
offerer.remove_status_effect(/datum/status_effect/offering/no_item_received/high_five)
+ offerer.client?.give_award(/datum/award/achievement/misc/down_low_too_slow, offerer)
qdel(src)
@@ -1208,11 +1209,14 @@
/// Gets the placement for the alert based on its index
/datum/hud/proc/get_ui_alert_placement(index)
- // Only has support for 5 slots currently
- if(index > 5)
+ if(index > 12) // DARKPACK EDIT CHANGE - ORIGINAL: if(index > 5)
return ""
- return "EAST-1:28,CENTER+[6 - index]:[29 - (index * 2)]"
+ // DARKPACK EDIT ADD START
+ var/column = ROUND_UP(index / 4)
+ var/row = ((index - 1) % 4) + 1
+ // DARKPACK EDIT ADD END
+ return "EAST-[column]:28,CENTER:[255 - (row * 33)]" // DARKPACK EDIT CHANGE - ORIGINAL: return "EAST-1:28,CENTER+[6 - index]:[29 - (index * 2)]"
// Re-render all alerts - also called in /datum/hud/show_hud() because it's needed there
/datum/hud/proc/reorganize_alerts(mob/viewmob)
diff --git a/code/_onclick/hud/screen_objects/map_view.dm b/code/_onclick/hud/screen_objects/map_view.dm
index e1179e76e0fd..daf4f352afce 100644
--- a/code/_onclick/hud/screen_objects/map_view.dm
+++ b/code/_onclick/hud/screen_objects/map_view.dm
@@ -13,10 +13,13 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/map_view)
// Weakrefs of all our hud viewers -> a weakref to the hud datum they last used
var/list/datum/weakref/viewers_to_huds = list()
+ // Weakref to the location we are displaying "from", if any
+ var/datum/weakref/display_ref
/atom/movable/screen/map_view/Destroy()
for(var/datum/weakref/client_ref in viewers_to_huds)
hide_from_client(client_ref.resolve())
+ display_ref = null
return ..()
@@ -28,7 +31,38 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/map_view)
assigned_map = map_key
set_position(1, 1)
-/**
+/atom/movable/screen/map_view/proc/set_display(atom/display_atom = null)
+ if(isnull(display_atom))
+ display_ref = null
+ for(var/datum/weakref/client_ref in viewers_to_huds)
+ var/client/viewer = client_ref.resolve()
+ if(!viewer)
+ continue
+ viewer.delete_parallax(assigned_map)
+ return
+
+ var/datum/weakref/new_display_ref = WEAKREF(display_atom)
+ if(new_display_ref == display_ref)
+ return
+ display_ref = new_display_ref
+ for(var/datum/weakref/client_ref in viewers_to_huds)
+ var/client/viewer = client_ref.resolve()
+ if(isnull(viewer))
+ continue
+
+ var/atom/movable/screen/parallax_home/working_parallax = viewer.create_parallax(assigned_map)
+ working_parallax.set_perspective(display_atom)
+
+ var/datum/weakref/hud_ref = viewers_to_huds[client_ref]
+ var/datum/hud/real_hud = hud_ref.resolve()
+ if(isnull(real_hud))
+ continue
+
+ var/datum/plane_master_group/popup/pop_planes = real_hud.get_plane_group(PLANE_GROUP_POPUP_WINDOW(src))
+ pop_planes.set_perspective(display_atom)
+
+
+ /**
* Generates and displays the map view to a client
* Make sure you at least try to pass tgui_window if map view needed on UI,
* so it will wait a signal from TGUI, which tells windows is fully visible.
@@ -68,9 +102,15 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/map_view)
// Generate a new plane group for this case
var/datum/plane_master_group/popup/pop_planes = new(PLANE_GROUP_POPUP_WINDOW(src), assigned_map)
+ var/atom/displaying_from = display_ref?.resolve()
+
+ if(displaying_from)
+ var/atom/movable/screen/parallax_home/working_parallax = show_to.create_parallax(assigned_map)
+ working_parallax.set_perspective(displaying_from)
+ pop_planes.set_perspective(displaying_from)
+
viewers_to_huds[client_ref] = WEAKREF(show_to.mob.hud_used)
pop_planes.attach_to(show_to.mob.hud_used)
-
return pop_planes
/atom/movable/screen/map_view/proc/hide_from(mob/hide_from)
@@ -85,6 +125,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/map_view)
// Make sure we clear the *right* hud
var/datum/weakref/hud_ref = viewers_to_huds[client_ref]
viewers_to_huds -= client_ref
+ hide_from.delete_parallax(assigned_map)
var/datum/hud/clear_from = hud_ref?.resolve()
if(!clear_from)
diff --git a/code/_onclick/hud/screen_objects/screen_objects.dm b/code/_onclick/hud/screen_objects/screen_objects.dm
index 7158691f419b..ac5e2d7f855f 100644
--- a/code/_onclick/hud/screen_objects/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects/screen_objects.dm
@@ -328,6 +328,28 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen) // I hate this place
storage.hide_contents(usr)
return TRUE
+/atom/movable/screen/storage_up
+ name = "go up a storage level"
+ plane = ABOVE_HUD_PLANE
+ icon = 'icons/hud/screen_midnight.dmi'
+ icon_state = "storage_up"
+ mouse_over_pointer = MOUSE_HAND_POINTER
+ hud_group_key = HUD_GROUP_STORAGE
+
+/atom/movable/screen/storage_up/Initialize(mapload, datum/hud/hud_owner, new_master)
+ . = ..()
+ master_ref = WEAKREF(new_master)
+
+/atom/movable/screen/storage_up/Click()
+ var/datum/storage/storage = master_ref?.resolve()
+ if(!storage)
+ return
+ var/datum/storage/up_storage = storage.parent.loc?.atom_storage
+ if(!up_storage)
+ return
+ up_storage.open_storage(usr)
+ return TRUE
+
/atom/movable/screen/drop
name = "drop"
icon = 'icons/hud/screen_midnight.dmi'
@@ -1151,8 +1173,8 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen) // I hate this place
if(!istype(hungry))
return
- if(!ishuman(hungry) || CONFIG_GET(flag/disable_human_mood))
- screen_loc = ui_mood // Slot in where mood normally is if mood is disabled
+ if(isnull(hungry.mob_mood))
+ screen_loc = ui_mood // Slot in where mood normally is if mood is not here (we arent a human)
// Burger next to the bar
food_image = image(icon = food_icon, icon_state = food_icon_state, pixel_x = -5)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 1876419855c8..ad4035fa7f38 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -321,7 +321,7 @@
bonus_dice++
var/datum/storyteller_roll/damage/damage_roll = new()
damage_roll.applicable_stats = list(attacking_item.st_damage_stat)
- var/damage_roll_result = damage_roll.st_roll(user, src, bonus_dice)
+ var/damage_roll_result = damage_roll.st_roll(user, src, bonus_dice, using_item = attacking_item)
final_force = damage_roll_result TTRPG_DAMAGE
// DARKPACK EDIT ADD END
if(final_force <= 0)
@@ -369,7 +369,7 @@
var/datum/storyteller_roll/attack/attack_roll = new()
attack_roll.applicable_stats = list(attacking_item.st_attack_ability, attacking_item.st_attack_attribute)
attack_roll.difficulty = attacking_item.attack_difficulty
- var/attack_roll_result = attack_roll.st_roll(user, src)
+ var/attack_roll_result = attack_roll.st_roll(user, src, using_item = attacking_item)
// What i want to do is acctually have it return if not success. But that creates bad visual feedback as all the FX still play. just give them them SOME damage..
if(attack_roll_result == ROLL_SUCCESS)
@@ -380,7 +380,7 @@
bonus_dice++
var/datum/storyteller_roll/damage/damage_roll = new()
damage_roll.applicable_stats = list(attacking_item.st_damage_stat)
- var/damage_roll_result = damage_roll.st_roll(user, src, bonus_dice)
+ var/damage_roll_result = damage_roll.st_roll(user, src, bonus_dice, using_item = attacking_item)
final_force = max(damage_roll_result TTRPG_DAMAGE, 1 TTRPG_DAMAGE)
else
@@ -394,11 +394,13 @@
if(user != src)
// This doesn't factor in armor, or most damage modifiers (physiology). Your mileage may vary
if(check_block(attacking_item, final_force, "\the [attacking_item]", MELEE_ATTACK, attacking_item.armour_penetration, attacking_item.damtype))
+ LAZYSET(attack_modifiers, DAMAGE_DONE, 0)
return ATTACK_FAILED
SEND_SIGNAL(attacking_item, COMSIG_ITEM_ATTACK_ZONE, src, user, targeting)
if(final_force <= 0)
+ LAZYSET(attack_modifiers, DAMAGE_DONE, 0)
return 0
if(ishuman(src) || client) // istype(src) is kinda bad, but it's to avoid spamming the blackbox
@@ -417,6 +419,7 @@
attacking_item = attacking_item,
)
+ LAZYSET(attack_modifiers, DAMAGE_DONE, damage_done)
attack_effects(damage_done, targeting, armor_block, attacking_item, user)
return damage_done
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index a72df30e5f14..494c6dc28095 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -44,8 +44,6 @@
/datum/config_entry/flag/allow_ai_multicam // allow ai multicamera mode
-/datum/config_entry/flag/disable_human_mood
-
/datum/config_entry/flag/disable_secborg // disallow secborg model to be chosen.
/datum/config_entry/flag/disable_peaceborg
@@ -62,12 +60,6 @@
integer = FALSE
min_val = 0
-/// Determines how fast traitors scale in general.
-/datum/config_entry/number/traitor_scaling_multiplier
- default = 1
- integer = FALSE
- min_val = 0.01
-
/datum/config_entry/number/changeling_scaling_coeff //how much does the amount of players get divided by to determine changelings
default = 6
integer = FALSE
@@ -404,6 +396,10 @@
default = 64
min_val = 0
+/datum/config_entry/number/relicmobcap
+ default = 64
+ min_val = 0
+
/datum/config_entry/number/maxfine
default = 1000
min_val = 0
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 730c7386ea9e..ae793b79e081 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -422,11 +422,14 @@ SUBSYSTEM_DEF(air)
var/datum/pipeline/linepipe = pack[SSAIR_REBUILD_PIPELINE]
var/list/border = pack[SSAIR_REBUILD_QUEUE]
expand_pipeline(linepipe, border)
- if(state != SS_RUNNING) //expand_pipeline can fail a tick check, we shouldn't let things get too fucky here
+ if(length(border)) //expand_pipeline failed a tick check before finishing, resume it next fire
return
linepipe.building = FALSE
queue.len--
+ // machinery was claimed by another pipeline before we could expand somehow, check if it has no pipes or machines left we can just delete it
+ if(!length(linepipe.members) && !length(linepipe.other_atmos_machines))
+ qdel(linepipe)
if (MC_TICK_CHECK)
return
@@ -714,9 +717,10 @@ SUBSYSTEM_DEF(air)
// pipenet can be built.
/datum/controller/subsystem/air/proc/setup_pipenets()
for (var/obj/machinery/atmospherics/AM in atmos_machinery)
- var/list/targets = AM.get_rebuild_targets()
- for(var/datum/pipeline/build_off as anything in targets)
- build_off.build_pipeline_blocking(AM)
+ var/datum/pipeline/build_target = AM.get_rebuild_target()
+ while(build_target)
+ build_target.build_pipeline_blocking(AM)
+ build_target = AM.get_rebuild_target()
CHECK_TICK
GLOBAL_LIST_EMPTY(colored_turfs)
@@ -743,9 +747,10 @@ GLOBAL_LIST_EMPTY(colored_images)
for(var/A in 1 to atmos_machines.len)
AM = atmos_machines[A]
- var/list/targets = AM.get_rebuild_targets()
- for(var/datum/pipeline/build_off as anything in targets)
- build_off.build_pipeline_blocking(AM)
+ var/datum/pipeline/build_target = AM.get_rebuild_target()
+ while(build_target)
+ build_target.build_pipeline_blocking(AM)
+ build_target = AM.get_rebuild_target()
CHECK_TICK
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index fd374b5704ac..dfa3eb705acf 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -342,7 +342,7 @@ Versioning
first_death["role"] = null
first_death["role"] = L.mind.assigned_role.title
first_death["area"] = "[AREACOORD(L)]"
- first_death["damage"] = "[L.get_brute_loss()]/[L.get_fire_loss()]/[L.get_tox_loss()]/[L.get_oxy_loss()][L.get_agg_loss()]" // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE
+ first_death["damage"] = "[L.get_brute_loss()]/[L.get_fire_loss()]/[L.get_tox_loss()]/[L.get_oxy_loss()]/[L.get_agg_loss()]" // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE
first_death["last_words"] = L.last_words
if(!SSdbcore.Connect())
diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm
index 2809c92e3dff..a8069efa262b 100644
--- a/code/controllers/subsystem/economy.dm
+++ b/code/controllers/subsystem/economy.dm
@@ -50,6 +50,8 @@ SUBSYSTEM_DEF(economy)
/// Number of mail items generated.
var/mail_waiting = 0
+ /// Total quantity of mail that's been opened this shift. Displayed at round-end and blackbox'd.
+ var/mail_opened = 0
/// Mail Holiday: AKA does mail arrive today? Always blocked on Sundays.
var/mail_blocked = FALSE
/// List used to track partially completed processing steps
diff --git a/code/controllers/subsystem/greyscale_previews.dm b/code/controllers/subsystem/greyscale_previews.dm
index 8c554f3fd25d..c2be52d3f27c 100644
--- a/code/controllers/subsystem/greyscale_previews.dm
+++ b/code/controllers/subsystem/greyscale_previews.dm
@@ -7,7 +7,7 @@ SUBSYSTEM_DEF(greyscale_previews)
)
/datum/controller/subsystem/greyscale_previews/Initialize()
-#ifndef UNIT_TESTS // We want this to run during unit tests regardless of the config
+#ifndef FORCE_GENERATE_INIT_ASSETS
if(!CONFIG_GET(flag/generate_assets_in_init))
return SS_INIT_SUCCESS
#endif
@@ -97,7 +97,7 @@ SUBSYSTEM_DEF(greyscale_previews)
"clothing/under/_under" = /obj/item/clothing/under,
"clothing/_clothing" = /obj/item/clothing,
"items/encryptionkey" = /obj/item/encryptionkey,
- "items/pda" = /obj/item/modular_computer/pda,
+ "items/pda" = /obj/item/modular_computer/pda/crew,
"items/_item" = /obj/item,
"objects" = /obj,
)
diff --git a/code/controllers/subsystem/lag_switch.dm b/code/controllers/subsystem/lag_switch.dm
index 22207c6e2b1d..79d54e1369e9 100644
--- a/code/controllers/subsystem/lag_switch.dm
+++ b/code/controllers/subsystem/lag_switch.dm
@@ -120,7 +120,7 @@ SUBSYSTEM_DEF(lag_switch)
to_chat(world, span_boldannounce("Parallax has been re-enabled."))
for (var/mob/mob as anything in GLOB.mob_list)
- mob.hud_used?.update_parallax_pref()
+ mob.client?.update_parallax_prefs()
if (DISABLE_FOOTSTEPS)
if (state)
to_chat(world, span_boldannounce("Footstep sounds have been disabled for performance concerns."))
diff --git a/code/controllers/subsystem/map_preview.dm b/code/controllers/subsystem/map_preview.dm
index ea63e2a66938..37ec833cca18 100644
--- a/code/controllers/subsystem/map_preview.dm
+++ b/code/controllers/subsystem/map_preview.dm
@@ -7,7 +7,7 @@ SUBSYSTEM_DEF(map_previews)
)
/datum/controller/subsystem/map_previews/Initialize()
-#ifndef UNIT_TESTS
+#ifndef FORCE_GENERATE_INIT_ASSETS
if(!CONFIG_GET(flag/generate_assets_in_init))
return SS_INIT_SUCCESS
#endif
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index e8e5a26c34d8..484102c5cf43 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -786,6 +786,9 @@ ADMIN_VERB(load_away_mission, R_FUN, "Load Away Mission", "Load a specific away
if(contain_turfs)
build_area_turfs(z_value, filled_with_space)
+ if(SSweather.initialized)
+ SSweather.generate_holders(z_value, z_value)
+
/datum/controller/subsystem/mapping/proc/build_area_turfs(z_level, space_guaranteed)
// If we know this is filled with default tiles, we can use the default area
// Faster
diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm
index d0078891c224..4ef14b5eb297 100644
--- a/code/controllers/subsystem/mobs.dm
+++ b/code/controllers/subsystem/mobs.dm
@@ -11,6 +11,7 @@ SUBSYSTEM_DEF(mobs)
var/static/list/dead_players_by_zlevel[][] = list(list()) // Needs to support zlevel 1 here, MaxZChanged only happens when z2 is created and new_players can login before that.
var/static/list/cubemonkeys = list()
var/static/list/cheeserats = list()
+ var/static/list/relicmobs = list()
/datum/controller/subsystem/mobs/stat_entry(msg)
msg = "P:[length(GLOB.mob_living_list)]"
@@ -42,3 +43,11 @@ SUBSYSTEM_DEF(mobs)
GLOB.mob_living_list.Remove(processing_mob)
if (MC_TICK_CHECK)
return
+
+/datum/controller/subsystem/mobs/proc/register_relic_mob(mob/living/spawned)
+ relicmobs |= spawned
+ RegisterSignal(spawned, COMSIG_QDELETING, PROC_REF(relic_mob_deleted))
+
+/datum/controller/subsystem/mobs/proc/relic_mob_deleted(mob/living/source)
+ SIGNAL_HANDLER
+ relicmobs -= source
diff --git a/code/controllers/subsystem/movement/movement_types.dm b/code/controllers/subsystem/movement/movement_types.dm
index dcf01e4bfd4c..b0ff13545350 100644
--- a/code/controllers/subsystem/movement/movement_types.dm
+++ b/code/controllers/subsystem/movement/movement_types.dm
@@ -421,6 +421,8 @@
/datum/move_loop/has_target/jps/Destroy()
avoid = null
+ // Pending pathfinds share this list so we need to clear it to release their callbacks to us
+ on_finish_callbacks.Cut()
on_finish_callbacks = null
return ..()
@@ -453,6 +455,10 @@
var/turf/next_step = movement_path[1]
var/atom/old_loc = moving.loc
moving.Move(next_step, get_dir(moving, next_step), FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE))
+ // Movement callbacks can stop this loop or delete its mover or target.
+ if(QDELETED(src))
+ return MOVELOOP_FAILURE
+
. = (old_loc != moving?.loc) ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE
// this check if we're on exactly the next tile may be overly brittle for dense objects who may get bumped slightly
@@ -757,6 +763,9 @@
/datum/move_loop/has_target/move_towards/proc/handle_move(source, atom/OldLoc, Dir, Forced = FALSE)
SIGNAL_HANDLER
+ if(QDELETED(src))
+ return
+
if(moving.loc != moving_towards && home) //If we didn't go where we should have, update slope to account for the deviation
update_slope()
@@ -777,6 +786,8 @@
**/
/datum/move_loop/has_target/move_towards/proc/update_slope()
SIGNAL_HANDLER
+ if(QDELETED(src))
+ return
//You'll notice this is rise over run, except we flip the formula upside down depending on the larger number
//This is so we never move more then one tile at once
diff --git a/code/controllers/subsystem/networks/id_access.dm b/code/controllers/subsystem/networks/id_access.dm
index 482bd5e119f8..0f7287f90dfe 100644
--- a/code/controllers/subsystem/networks/id_access.dm
+++ b/code/controllers/subsystem/networks/id_access.dm
@@ -216,21 +216,18 @@ SUBSYSTEM_DEF(id_access)
var/datum/id_trim/trim = trim_singletons_by_path[trim_path]
centcom_job_templates[trim_path] = trim.assignment
- var/list/all_pda_paths = typesof(/obj/item/modular_computer/pda)
- var/list/pda_regions = PDA_PAINTING_REGIONS
- for(var/pda_path in all_pda_paths)
- if(!(pda_path in pda_regions))
+ for(var/obj/item/modular_computer/pda/crew/pda_path as anything in subtypesof(/obj/item/modular_computer/pda/crew))
+ if(isnull(pda_path::painting_region))
continue
- var/list/region_whitelist = pda_regions[pda_path]
for(var/access_txt in sub_department_managers_tgui)
var/list/manager_info = sub_department_managers_tgui[access_txt]
var/list/manager_regions = manager_info["regions"]
- for(var/whitelisted_region in region_whitelist)
- if(!(whitelisted_region in manager_regions))
+ for(var/whitelisted_region in manager_regions)
+ if(pda_path::painting_region != whitelisted_region)
continue
var/list/manager_pdas = manager_info["pdas"]
- var/obj/item/modular_computer/pda/fake_pda = pda_path
+ var/obj/item/modular_computer/pda/crew/fake_pda = pda_path
manager_pdas[pda_path] = initial(fake_pda.name)
station_pda_templates[pda_path] = initial(fake_pda.name)
diff --git a/code/controllers/subsystem/networks/research.dm b/code/controllers/subsystem/networks/research.dm
index 41785e1f031d..14bf3a2a06ba 100644
--- a/code/controllers/subsystem/networks/research.dm
+++ b/code/controllers/subsystem/networks/research.dm
@@ -130,7 +130,7 @@ SUBSYSTEM_DEF(research)
// Tell our unlocked designs that we unlock them
for(var/design_path in new_node.unlocked_designs)
var/datum/design/unlocked_design = techweb_designs[design_path]
- unlocked_design.unlocked_by += node_path
+ LAZYADD(unlocked_design.unlocked_by, node_path)
// Register that our required items unlock us
for(var/required_item_path in new_node.required_items_to_unlock)
diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm
index 1b509f8d7578..ddb0ce503ed4 100644
--- a/code/controllers/subsystem/parallax.dm
+++ b/code/controllers/subsystem/parallax.dm
@@ -3,11 +3,7 @@
SUBSYSTEM_DEF(parallax)
name = "Parallax"
- wait = 2
- ss_flags = SS_POST_FIRE_TIMING | SS_BACKGROUND | SS_NO_INIT
- priority = FIRE_PRIORITY_PARALLAX
- runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
- var/list/currentrun
+ ss_flags = SS_NO_FIRE | SS_NO_INIT
var/planet_x_offset = 128
var/planet_y_offset = 128
/// A random parallax layer that we sent to every player
@@ -28,44 +24,6 @@ SUBSYSTEM_DEF(parallax)
planet_y_offset = rand(100, 160)
planet_x_offset = rand(100, 160)
-/datum/controller/subsystem/parallax/fire(resumed = FALSE)
- if (!resumed)
- src.currentrun = GLOB.clients.Copy()
-
- //cache for sanic speed (lists are references anyways)
- var/list/currentrun = src.currentrun
-
- while(length(currentrun))
- var/client/processing_client = currentrun[currentrun.len]
- currentrun.len--
- if (QDELETED(processing_client) || !processing_client.eye)
- if (MC_TICK_CHECK)
- return
- continue
-
- var/atom/movable/movable_eye = processing_client.eye
- if(!istype(movable_eye))
- continue
-
- while(isloc(movable_eye.loc) && !isturf(movable_eye.loc))
- movable_eye = movable_eye.loc
- //get the last movable holding the mobs eye
-
- if(movable_eye == processing_client.movingmob)
- if (MC_TICK_CHECK)
- return
- continue
-
- //eye and the last recorded eye are different, and the last recorded eye isnt just the clients mob
- if(!isnull(processing_client.movingmob))
- LAZYREMOVE(processing_client.movingmob.client_mobs_in_contents, processing_client.mob)
- LAZYADD(movable_eye.client_mobs_in_contents, processing_client.mob)
-
- processing_client.movingmob = movable_eye
- if (MC_TICK_CHECK)
- return
- currentrun = null
-
/// Generate a random layer for parallax
/datum/controller/subsystem/parallax/proc/set_random_parallax_layer(picked_parallax)
if(picked_parallax == PARALLAX_NONE)
@@ -74,7 +32,6 @@ SUBSYSTEM_DEF(parallax)
random_layer = new picked_parallax(null, /* hud_owner = */ null, /* owner = */ null, /* template = */ TRUE)
RegisterSignal(random_layer, COMSIG_QDELETING, PROC_REF(clear_references))
random_layer.get_random_look()
-
/// Change the random parallax layer after it's already been set. update_player_huds = TRUE will also replace them in the players client images, if it was set
/datum/controller/subsystem/parallax/proc/swap_out_random_parallax_layer(atom/movable/screen/parallax_layer/new_type, update_player_huds = TRUE)
set_random_parallax_layer(new_type)
@@ -86,8 +43,9 @@ SUBSYSTEM_DEF(parallax)
//That's why we need to swap the layers out for fast joining clients :/
for(var/client/client as anything in GLOB.clients)
// gotta clear things out
- client?.parallax_rock?.set_layer_settings(0, FALSE, FALSE)
- client.mob?.hud_used?.update_parallax_pref()
+ for(var/atom/movable/screen/parallax_home/instance as anything in client?.parallax_instances)
+ instance.regenerate_layers()
+ instance.update_parallax()
/datum/controller/subsystem/parallax/proc/clear_references()
SIGNAL_HANDLER
diff --git a/code/controllers/subsystem/pathfinder.dm b/code/controllers/subsystem/pathfinder.dm
index bcb9861fbb68..25476a8d2c3a 100644
--- a/code/controllers/subsystem/pathfinder.dm
+++ b/code/controllers/subsystem/pathfinder.dm
@@ -34,13 +34,10 @@ SUBSYSTEM_DEF(pathfinder)
var/datum/pathfind/path = currentrun[length(currentrun)]
if(!path.search_step()) // Something's wrong
path.early_exit()
- currentrun.len--
continue
if(MC_TICK_CHECK)
return
path.finished()
- // Next please
- currentrun.len--
// Go over our existing pathmaps, clear out the ones we aren't using
var/list/currentmaps = src.currentmaps
diff --git a/code/controllers/subsystem/processing/instruments.dm b/code/controllers/subsystem/processing/instruments.dm
index a68a8ff77a61..e892be0691d3 100644
--- a/code/controllers/subsystem/processing/instruments.dm
+++ b/code/controllers/subsystem/processing/instruments.dm
@@ -8,11 +8,11 @@ PROCESSING_SUBSYSTEM_DEF(instruments)
/// List of all song datums.
var/static/list/datum/song/songs = list()
/// Max lines in songs
- var/static/musician_maxlines = 600
+ var/static/musician_maxlines = 1000
/// Max characters per line in songs
var/static/musician_maxlinechars = 300
/// Deciseconds between hearchecks. Too high and instruments seem to lag when people are moving around in terms of who can hear it. Too low and the server lags from this.
- var/static/musician_hearcheck_mindelay = 5
+ var/static/musician_hearcheck_mindelay = 4
/// Maximum instrument channels total instruments are allowed to use. This is so you don't have instruments deadlocking all sound channels.
var/static/max_instrument_channels = MAX_INSTRUMENT_CHANNELS
/// Current number of channels allocated for instruments
diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm
index 89e9aced8030..85bd137c356d 100644
--- a/code/controllers/subsystem/processing/quirks.dm
+++ b/code/controllers/subsystem/processing/quirks.dm
@@ -28,6 +28,7 @@ GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list(
list(/datum/quirk/empath, /datum/quirk/evil),
list(/datum/quirk/keen_nose, /datum/quirk/item_quirk/anosmia),
list(/datum/quirk/darkpack/weak_willed, /datum/quirk/darkpack/untamable), // DARKPACK EDIT ADD - MERITS_FLAWS
+ list(/datum/quirk/darkpack/weak_willed, /datum/quirk/darkpack/iron_will), // DARKPACK EDIT ADD - MERITS_FLAWS
list(/datum/quirk/darkpack/permafangs, /datum/quirk/darkpack/dulled_bite), // DARKPACK EDIT ADD - MERITS_FLAWS
list(/datum/quirk/darkpack/grip_of_the_damned, /datum/quirk/darkpack/dulled_bite), // DARKPACK EDIT ADD - MERITS_FLAWS
list(/datum/quirk/darkpack/thaumaturgically_inept, /datum/quirk/darkpack/mage_blood), // DARKPACK EDIT ADD - MERITS_FLAWS
@@ -213,9 +214,6 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
if (isnull(quirk))
continue
- if ((initial(quirk.quirk_flags) & QUIRK_MOODLET_BASED) && CONFIG_GET(flag/disable_human_mood))
- continue
-
var/blacklisted = FALSE
for (var/list/blacklist as anything in GLOB.quirk_blacklist)
diff --git a/code/controllers/subsystem/security_level.dm b/code/controllers/subsystem/security_level.dm
index c88237ec7eaa..10686ad1adec 100644
--- a/code/controllers/subsystem/security_level.dm
+++ b/code/controllers/subsystem/security_level.dm
@@ -53,9 +53,6 @@ SUBSYSTEM_DEF(security_level)
else
can_fire = FALSE
- if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) // By god this is absolutely shit
- SSshuttle.emergency.alert_coeff_change(selected_level.shuttle_call_time_mod)
-
SEND_SIGNAL(src, COMSIG_SECURITY_LEVEL_CHANGED, selected_level.number_level)
SSblackbox.record_feedback("tally", "security_level_changes", 1, selected_level.name)
diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm
index 828069ba0033..ab6472e217c3 100644
--- a/code/controllers/subsystem/shuttle.dm
+++ b/code/controllers/subsystem/shuttle.dm
@@ -747,7 +747,7 @@ SUBSYSTEM_DEF(shuttle)
old_area.turfs_to_uncontain_by_zlevel[bottomleft.z] += proposal.reserved_turfs
var/area/shuttle/transit/new_area = new()
- new_area.parallax_movedir = travel_dir
+ new_area.set_parallax_movedir(travel_dir)
new_area.contents = proposal.reserved_turfs
LISTASSERTLEN(new_area.turfs_by_zlevel, bottomleft.z, list())
new_area.turfs_by_zlevel[bottomleft.z] = proposal.reserved_turfs
diff --git a/code/controllers/subsystem/sounds.dm b/code/controllers/subsystem/sounds.dm
index 6b81cdcfeee4..2f39272c6cf4 100644
--- a/code/controllers/subsystem/sounds.dm
+++ b/code/controllers/subsystem/sounds.dm
@@ -129,14 +129,14 @@ SUBSYSTEM_DEF(sounds)
free_channel(channel)
/// Frees all the channels a datum is using.
-/datum/controller/subsystem/sounds/proc/free_datum_channels(datum/D)
- var/list/L = using_channels_by_datum[D]
+/datum/controller/subsystem/sounds/proc/free_datum_channels(datum/channel_owner)
+ var/list/L = using_channels_by_datum[channel_owner]
if(!L)
return
for(var/channel in L)
using_channels -= num2text(channel)
free_channel(channel)
- stop_tracking_datum(D)
+ stop_tracking_datum(channel_owner)
/// Frees all datumless channels
/datum/controller/subsystem/sounds/proc/free_datumless_channels()
@@ -153,18 +153,19 @@ SUBSYSTEM_DEF(sounds)
using_channels_by_datum[DATUMLESS] += .
/// Reserves a channel for a datum. Automatic cleanup only when the datum is deleted. Returns an integer for channel.
-/datum/controller/subsystem/sounds/proc/reserve_sound_channel_for_datum(datum/D)
- if(!D) //i don't like typechecks but someone will fuck it up
+/datum/controller/subsystem/sounds/proc/reserve_sound_channel_for_datum(datum/channel_owner)
+ if(!channel_owner) //i don't like typechecks but someone will fuck it up
CRASH("Attempted to reserve sound channel without datum using the managed proc.")
.= reserve_channel()
if(!.)
CRASH("No more sound channels can be reserved")
var/text_channel = num2text(.)
- using_channels[text_channel] = D
- LAZYINITLIST(using_channels_by_datum[D])
- using_channels_by_datum[D] += .
+ using_channels[text_channel] = channel_owner
+ LAZYINITLIST(using_channels_by_datum[channel_owner])
+ using_channels_by_datum[channel_owner] += .
- RegisterSignal(D, COMSIG_QDELETING, PROC_REF(tracked_datum_deleted))
+ if(length(using_channels_by_datum[channel_owner]) == 1)
+ RegisterSignal(channel_owner, COMSIG_QDELETING, PROC_REF(tracked_datum_deleted))
/**
* Reserves a channel and updates the datastructure. Private proc.
@@ -272,11 +273,11 @@ SUBSYSTEM_DEF(sounds)
///Call to free all channels reserved by a datum.
-/datum/controller/subsystem/sounds/proc/stop_tracking_datum(datum/D)
+/datum/controller/subsystem/sounds/proc/stop_tracking_datum(datum/channel_owner)
PRIVATE_PROC(TRUE)
- using_channels_by_datum -= D
- UnregisterSignal(D, COMSIG_QDELETING)
+ using_channels_by_datum -= channel_owner
+ UnregisterSignal(channel_owner, COMSIG_QDELETING)
/// Handles a tracked datum being deleted, automatically freeing the channels.
/datum/controller/subsystem/sounds/proc/tracked_datum_deleted(datum/source)
diff --git a/code/controllers/subsystem/traitor.dm b/code/controllers/subsystem/traitor.dm
index cd13366bdb9b..52e5cd53cf5b 100644
--- a/code/controllers/subsystem/traitor.dm
+++ b/code/controllers/subsystem/traitor.dm
@@ -4,23 +4,13 @@ SUBSYSTEM_DEF(traitor)
/datum/controller/subsystem/mapping,
/datum/controller/subsystem/atoms,
)
- ss_flags = SS_KEEP_TIMING
- wait = 10 SECONDS
- runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ ss_flags = SS_NO_FIRE
/// A list of all uplink items mapped by type
var/list/uplink_items_by_type = list()
/// A list of all uplink items
var/list/uplink_items = list()
- /// The coefficient multiplied by the current_global_progression for new joining traitors to calculate their progression
- var/newjoin_progression_coeff = 1
- /// The current progression that all traitors should be at in the round, you can't have less than this
- var/current_global_progression = 0
- /// The current uplink handlers being managed
- var/list/datum/uplink_handler/uplink_handlers = list()
- /// The current scaling per minute of progression.
- var/current_progression_scaling = 1 MINUTES
/// List of code words for traitors
var/syndicate_code_phrase
/// List of code responses for traitors
@@ -31,7 +21,6 @@ SUBSYSTEM_DEF(traitor)
var/regex/syndicate_code_response_regex
/datum/controller/subsystem/traitor/Initialize()
- current_progression_scaling = 1 MINUTES * CONFIG_GET(number/traitor_scaling_multiplier)
for(var/theft_item in subtypesof(/datum/objective_item/steal))
new theft_item
@@ -40,31 +29,3 @@ SUBSYSTEM_DEF(traitor)
syndicate_code_response = generate_code_phrase(return_list = TRUE)
syndicate_code_response_regex = new("([jointext(syndicate_code_response, "|")])", "ig")
return SS_INIT_SUCCESS
-
-/datum/controller/subsystem/traitor/fire(resumed)
- var/previous_progression = current_global_progression
- current_global_progression = (STATION_TIME_PASSED()) * CONFIG_GET(number/traitor_scaling_multiplier)
- var/progression_increment = current_global_progression - previous_progression
-
- for(var/datum/uplink_handler/handler in uplink_handlers)
- if(!handler.has_progression || QDELETED(handler))
- uplink_handlers -= handler
- if(handler.progression_points < current_global_progression)
- // If we got unsynced somehow, just set them to the current global progression
- // Prevents problems with precision errors.
- handler.progression_points = current_global_progression
- else
- handler.progression_points += progression_increment // Should only really happen if an admin is messing with an individual's progression value
- handler.on_update()
-
-/datum/controller/subsystem/traitor/proc/register_uplink_handler(datum/uplink_handler/uplink_handler)
- if(!uplink_handler.has_progression)
- return
- uplink_handlers |= uplink_handler
- // An uplink handler can be registered multiple times if they get assigned to new uplinks, so
- // override is set to TRUE here because it is intentional that they could get added multiple times.
- RegisterSignal(uplink_handler, COMSIG_QDELETING, PROC_REF(uplink_handler_deleted), override = TRUE)
-
-/datum/controller/subsystem/traitor/proc/uplink_handler_deleted(datum/uplink_handler/uplink_handler)
- SIGNAL_HANDLER
- uplink_handlers -= uplink_handler
diff --git a/code/controllers/subsystem/tts.dm b/code/controllers/subsystem/tts.dm
index b86dbb2b6877..ba6f471ddfc1 100644
--- a/code/controllers/subsystem/tts.dm
+++ b/code/controllers/subsystem/tts.dm
@@ -147,7 +147,6 @@ SUBSYSTEM_DEF(tts)
else
hearer_atom = hearer
if(!hearer_atom || QDELING(hearer_atom))
- stack_trace("TTS tried to play a sound to a deleted mob.")
continue
if(!ismob(hearer_atom))
continue
diff --git a/code/controllers/subsystem/wardrobe.dm b/code/controllers/subsystem/wardrobe.dm
index 7202227190d9..ba1bd2562aee 100644
--- a/code/controllers/subsystem/wardrobe.dm
+++ b/code/controllers/subsystem/wardrobe.dm
@@ -445,7 +445,7 @@ SUBSYSTEM_DEF(wardrobe)
initial_callbacks[/obj/item/organ] = play_with
play_with = new /list(WARDROBE_CALLBACK_REMOVE)
- play_with[WARDROBE_CALLBACK_REMOVE] = CALLBACK(null, TYPE_PROC_REF(/obj/item/storage/box/survival, wardrobe_removal))
+ play_with[WARDROBE_CALLBACK_REMOVE] = CALLBACK(null, TYPE_PROC_REF(/obj/item/storage/box/survival, apply_overrides))
initial_callbacks[/obj/item/storage/box/survival] = play_with
/datum/controller/subsystem/wardrobe/proc/load_outfits()
diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm
index 496fc6f71fbb..5ee1c3fae427 100644
--- a/code/controllers/subsystem/weather.dm
+++ b/code/controllers/subsystem/weather.dm
@@ -12,10 +12,8 @@ SUBSYSTEM_DEF(weather)
var/list/eligible_zlevels = list()
/// Used by barometers to know when the next storm is coming
var/list/next_hit_by_zlevel = list()
- /// Alist of all particle holders per Z-stack offset for particle weather, each particle holder associated with z-levels it should be displayed on, to be shown to clients
- var/alist/particle_holders = alist()
- /// List of all RENDER_PLANE_PARTICLE_WEATHER and RENDER_PLANE_EMISSIVE_PARTICLE_WEATHER planes
- var/list/particle_planemasters = list()
+ /// Alist of particle holder to display in the form z_level -> alist(plane -> holder)
+ var/alist/z_particles = alist()
/datum/controller/subsystem/weather/fire(resumed = FALSE)
// process active weather
@@ -82,6 +80,7 @@ SUBSYSTEM_DEF(weather)
next_hit_by_zlevel["[z]"] = addtimer(CALLBACK(src, PROC_REF(make_eligible), z, possible_weather), randTime + initial(weather_event.weather_duration_upper), TIMER_UNIQUE|TIMER_STOPPABLE)
/datum/controller/subsystem/weather/Initialize()
+ generate_holders(1, world.maxz)
for(var/datum/weather/weather as anything in valid_subtypesof(/datum/weather))
var/probability = initial(weather.probability)
var/target_trait = initial(weather.target_trait)
@@ -93,37 +92,33 @@ SUBSYSTEM_DEF(weather)
eligible_zlevels["[z]"][weather] = probability
return SS_INIT_SUCCESS
-/datum/controller/subsystem/weather/proc/add_weather_objects(list/new_holders, z_level)
- for (var/offset in 1 to length(new_holders))
- var/list/holder_list = new_holders[offset]
- if (isnull(particle_holders[offset]))
- particle_holders[offset] = list()
- particle_holders[offset] += holder_list
-
- // We add it to vis_contents of planemasters rather than client screen as planemasters already
- // manage their own visibility based on owner's z level
- for (var/atom/movable/screen/plane_master/plane_master as anything in particle_planemasters)
- var/mob/owner = plane_master.home.our_hud?.mymob
- if (!owner) // Vibecheck
- continue
- // Could be caching these per-mob but its basically just a list lookup wrapper
- var/list/stack_levels = SSmapping.get_connected_levels(get_turf(owner.client?.eye || owner))
- for (var/obj/effect/abstract/weather_holder/holder as anything in holder_list)
- if (holder.plane != plane_master.plane)
- continue
-
- if (!length(holder_list[holder] & stack_levels))
- continue
-
- plane_master.vis_contents |= holder
-
-/datum/controller/subsystem/weather/proc/remove_weather_objects(list/old_holders)
- for (var/offset in 1 to length(old_holders))
- var/list/holder_list = old_holders[offset]
- particle_holders[offset] -= holder_list
-
- for (var/atom/movable/screen/plane_master/plane_master as anything in particle_planemasters)
- plane_master.vis_contents -= holder_list
+/datum/controller/subsystem/weather/proc/generate_holders(z_min, z_max)
+ for(var/i in z_min to z_max)
+ z_particles[i] = alist()
+
+/datum/controller/subsystem/weather/proc/add_weather_objects(list/obj/effect/abstract/weather_holder/new_objects, z_level)
+ var/alist/holders_by_plane = z_particles[z_level]
+ if(isnull(holders_by_plane))
+ stack_trace("No particle holder slot found for z level [z_level]")
+ return
+
+ for(var/obj/effect/abstract/weather_holder/new_object as anything in new_objects)
+ var/obj/effect/abstract/weather_holder/z_level/holder = holders_by_plane[new_object.plane]
+ if(isnull(holder))
+ holder = new()
+ holder.plane = new_object.plane
+ holders_by_plane[new_object.plane] = new_object
+
+ holder.vis_contents += new_object
+
+/datum/controller/subsystem/weather/proc/remove_weather_objects(list/old_objects, z_level)
+ var/alist/holders_by_plane = z_particles[z_level]
+ if(isnull(holders_by_plane))
+ CRASH("No particle holder slot found for z level [z_level]")
+
+ for(var/plane in holders_by_plane)
+ var/obj/effect/abstract/weather_holder/z_level/holder = holders_by_plane[plane]
+ holder.vis_contents -= old_objects
/datum/controller/subsystem/weather/proc/update_z_level(datum/space_level/level)
var/z = level.z_value
diff --git a/code/datums/3d_sounds/_3d_sound.dm b/code/datums/3d_sounds/_3d_sound.dm
index 47424e0367dc..2db3c5a53180 100644
--- a/code/datums/3d_sounds/_3d_sound.dm
+++ b/code/datums/3d_sounds/_3d_sound.dm
@@ -119,14 +119,16 @@
PROTECTED_PROC(TRUE)
if(!(new_listener in listeners))
- RegisterSignal(new_listener, COMSIG_QDELETING, PROC_REF(listener_deleted))
+ // If the listener is the sound's parent, COMSIG_QDELETING/COMSIG_MOVABLE_MOVED are already registered in New()
+ if(new_listener != parent)
+ RegisterSignal(new_listener, COMSIG_QDELETING, PROC_REF(listener_deleted))
if(isnull(new_listener.client))
RegisterSignal(new_listener, COMSIG_MOB_LOGIN, PROC_REF(listener_login))
return
if(preference_signal)
- RegisterSignals(new_listener, list(COMSIG_MOVABLE_MOVED, preference_signal), PROC_REF(listener_moved))
- else
+ RegisterSignal(new_listener, preference_signal, PROC_REF(listener_moved))
+ if(new_listener != parent)
RegisterSignal(new_listener, COMSIG_MOVABLE_MOVED, PROC_REF(listener_moved))
RegisterSignals(new_listener, list(SIGNAL_ADDTRAIT(TRAIT_DEAF), SIGNAL_REMOVETRAIT(TRAIT_DEAF)), PROC_REF(listener_deaf))
@@ -195,23 +197,16 @@
listeners -= no_longer_listening
no_longer_listening.stop_sound_channel(our_channel)
+ var/list/unregister_signals = list(
+ COMSIG_MOB_LOGIN,
+ SIGNAL_ADDTRAIT(TRAIT_DEAF),
+ SIGNAL_REMOVETRAIT(TRAIT_DEAF),
+ )
+ if(no_longer_listening != parent) // COMSIG_QDELETING/COMSIG_MOVABLE_MOVED are registered in New(), leave them registered
+ unregister_signals += list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED)
if(preference_signal)
- UnregisterSignal(no_longer_listening, list(
- COMSIG_MOB_LOGIN,
- COMSIG_QDELETING,
- COMSIG_MOVABLE_MOVED,
- preference_signal,
- SIGNAL_ADDTRAIT(TRAIT_DEAF),
- SIGNAL_REMOVETRAIT(TRAIT_DEAF),
- ))
- else
- UnregisterSignal(no_longer_listening, list(
- COMSIG_MOB_LOGIN,
- COMSIG_QDELETING,
- COMSIG_MOVABLE_MOVED,
- SIGNAL_ADDTRAIT(TRAIT_DEAF),
- SIGNAL_REMOVETRAIT(TRAIT_DEAF),
- ))
+ unregister_signals += preference_signal
+ UnregisterSignal(no_longer_listening, unregister_signals)
/datum/threed_sound/proc/update_listener(mob/listener)
PROTECTED_PROC(TRUE)
diff --git a/code/datums/achievements/job_achievements.dm b/code/datums/achievements/job_achievements.dm
index bd37de7c0e11..fcbae644a473 100644
--- a/code/datums/achievements/job_achievements.dm
+++ b/code/datums/achievements/job_achievements.dm
@@ -46,6 +46,12 @@
database_id = MEDAL_SNAIL
icon_state = "snail"
+/datum/award/achievement/jobs/bag_of_holding
+ name = "Prepare for Unforeseen Consequences"
+ desc = "Cause significant amounts of property damage with your experimental technology."
+ database_id = MEDAL_BAG_OF_HOLDING
+ icon_state = "bag_of_holding"
+
//all of service! hip hip!
/datum/award/achievement/jobs/service_bad
diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm
index a15977e7e53f..cc27d4d7658f 100644
--- a/code/datums/achievements/misc_achievements.dm
+++ b/code/datums/achievements/misc_achievements.dm
@@ -1,6 +1,5 @@
/datum/award/achievement/misc
category = "Misc"
- icon_state = "basemisc" //for those achievements that still need an actual icon, later.
/datum/award/achievement/misc/meteor_examine
name = "Your Life Before Your Eyes"
@@ -60,16 +59,19 @@
name = "I Was a Teenage Anarchist"
desc = "You were doing a great job sticking it to the system until that vending machine decided to fight back."
database_id = MEDAL_VENDORSQUISH
+ icon_state = "vendor_squish"
/datum/award/achievement/misc/swirlie
name = "A Bowl-d New World"
desc = "There's a lot of grisly ways to kick it on the Spinward Periphery, but drowning to death in a toilet probably wasn't what you had in mind. Probably."
database_id = MEDAL_SWIRLIE
+ icon_state = "swirlie"
/datum/award/achievement/misc/selfouch
name = "How Do I Switch Hands???"
desc = "If you saw someone casually club themselves upside the head with a toolbox anywhere in the galaxy but here, you'd probably be pretty concerned for them."
database_id = MEDAL_SELFOUCH
+ icon_state = "self_touch"
/datum/award/achievement/misc/cleanboss
name = "One Lean, Mean, Cleaning Machine"
@@ -257,3 +259,51 @@
Perhaps one day you'll find peace. But not today."
database_id = MEDAL_DESENSITIZED
icon_state = "desensitized"
+
+/datum/award/achievement/misc/spicy_handshake
+ name = "Spicy Handshake"
+ desc = "Betray someone's trust in a way they'll never forget."
+ database_id = MEDAL_SPICY_HANDSHAKE
+ icon_state = "spicy_handshake"
+
+/datum/award/achievement/misc/down_low_too_slow
+ name = "Low Blow"
+ desc = "Outwit your fellow man in a display that any schoolchild could be proud of."
+ database_id = MEDAL_DOWN_LOW_TOO_SLOW
+ icon_state = "down_low_too_slow"
+
+/datum/award/achievement/misc/souvenir
+ name = "And All I Got Was This Lousy Achievement"
+ desc = "Take home a souvenir."
+ database_id = MEDAL_SOUVENIR
+ icon_state = "souvenir"
+
+/datum/award/achievement/misc/samaritan
+ name = "Good Samaritan"
+ desc = "Save a life with a timely intervention."
+ database_id = MEDAL_SAMARITAN
+ icon_state = "samaritan"
+
+/datum/award/achievement/misc/red_pill
+ name = "Red Pill"
+ desc = "Let's see how deep this rabbit hole goes."
+ database_id = MEDAL_RED_PILL
+ icon_state = "red_pill"
+
+/datum/award/achievement/misc/kong
+ name = "Rise of Kong"
+ desc = "I'm king of the jungle baby!!"
+ database_id = MEDAL_KONG
+ icon_state = "kong"
+
+/datum/award/achievement/misc/no_parking
+ name = "You Can't Park Here"
+ desc = "Attempted to park in someone else's reserved space."
+ database_id = MEDAL_NO_PARKING
+ icon_state = "no_parking"
+
+/datum/award/achievement/misc/clever_girl
+ name = "Clever Girl"
+ desc = "Life finds a way."
+ database_id = MEDAL_CLEVER_GIRL
+ icon_state = "clever_girl"
diff --git a/code/datums/actions/items/flight.dm b/code/datums/actions/items/flight.dm
index 90cd7c1488a9..b7ca10ab9072 100644
--- a/code/datums/actions/items/flight.dm
+++ b/code/datums/actions/items/flight.dm
@@ -55,7 +55,7 @@
if(!HAS_TRAIT_FROM(human_owner, TRAIT_MOVE_FLOATING, SHOES_TRAIT))
//functional
- human_owner.physiology.stun_mod *= 2
+ MODIFY_PHYSIOLOGY(human_owner, PHYS_COEFF_STUN, 2)
human_owner.add_traits(list(TRAIT_MOVE_FLOATING, TRAIT_IGNORING_GRAVITY, TRAIT_NOGRAV_ALWAYS_DRIFT), SHOES_TRAIT)
human_owner.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/shoes)
human_owner.AddElement(/datum/element/forced_gravity, 0)
@@ -74,7 +74,7 @@
return
//functional
- human_owner.physiology.stun_mod *= 0.5
+ MODIFY_PHYSIOLOGY(human_owner, PHYS_COEFF_STUN, 0.5)
human_owner.remove_traits(list(TRAIT_MOVE_FLOATING, TRAIT_IGNORING_GRAVITY, TRAIT_NOGRAV_ALWAYS_DRIFT), SHOES_TRAIT)
human_owner.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/shoes)
human_owner.RemoveElement(/datum/element/forced_gravity, 0)
diff --git a/code/datums/actions/items/organ_action.dm b/code/datums/actions/items/organ_action.dm
index 235207d197f5..a912d866ee37 100644
--- a/code/datums/actions/items/organ_action.dm
+++ b/code/datums/actions/items/organ_action.dm
@@ -35,15 +35,15 @@
name = pick(ability_name)
/datum/action/item_action/organ_action/go_feral/do_effect(trigger_flags)
- var/obj/item/organ/tongue/cat/cat_tongue = target
- cat_tongue.toggle_feral()
- if(!cat_tongue.feral_mode)
+ var/obj/item/organ/fangs/cat/cat_fangs = target
+ cat_fangs.toggle_feral()
+ if(!cat_fangs.feral_mode)
background_icon_state = "bg_default"
button_icon_state = "feral_mode_off"
- to_chat(cat_tongue.owner, span_notice("You will make unarmed attacks normally."))
+ to_chat(cat_fangs.owner, span_notice("You will make unarmed attacks normally."))
else
background_icon_state = "bg_default_on"
button_icon_state = "feral_mode_on"
- to_chat(cat_tongue.owner, span_notice("You will bite when making an unarmed attack."))
+ to_chat(cat_fangs.owner, span_notice("You will bite when making an unarmed attack."))
build_all_button_icons()
return TRUE
diff --git a/code/datums/actions/items/pillow_weapons.dm b/code/datums/actions/items/pillow_weapons.dm
new file mode 100644
index 000000000000..fea12b6e3f14
--- /dev/null
+++ b/code/datums/actions/items/pillow_weapons.dm
@@ -0,0 +1,7 @@
+//pillow ability
+/datum/action/item_action/fortify
+ name = "Juggernaut mode"
+ desc = "Enter a defensive stance, decreasing your speed, but countering any incoming shoves."
+ button_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = "pillow_fortify"
+
diff --git a/code/datums/actions/mobs/create_legion_skull.dm b/code/datums/actions/mobs/create_legion_skull.dm
index ae07efb2e0cf..928dc316a3b5 100644
--- a/code/datums/actions/mobs/create_legion_skull.dm
+++ b/code/datums/actions/mobs/create_legion_skull.dm
@@ -16,4 +16,4 @@
/datum/action/cooldown/mob_cooldown/create_legion_skull/proc/create(atom/target)
var/mob/living/basic/mining/legion_brood/gray_masses/minion = new(owner.loc) // APOC EDIT CHANGE
minion.assign_creator(owner)
- minion.ai_controller.blackboard[BB_CURRENT_TARGET] = target
+ minion.ai_controller.set_blackboard_key(BB_CURRENT_TARGET, target)
diff --git a/code/datums/actions/mobs/defensive_mode.dm b/code/datums/actions/mobs/defensive_mode.dm
index e19be70e8459..2daad33d244a 100644
--- a/code/datums/actions/mobs/defensive_mode.dm
+++ b/code/datums/actions/mobs/defensive_mode.dm
@@ -34,7 +34,8 @@
defence(owner_mob)
/datum/action/cooldown/mob_cooldown/defensive_mode/proc/offence(mob/living/basic/owner_mob)
- owner_mob.damage_coeff = string_assoc_list(list(BRUTE = 1, BURN = 1.25, TOX = 1, STAMINA = 1, OXY = 1))
+ MODIFY_PHYSIOLOGY(owner_mob, BRUTE, 2.5)
+ MODIFY_PHYSIOLOGY(owner_mob, BURN, 2.5)
owner_mob.icon_state = initial(owner_mob.icon_state)
owner_mob.icon_living = initial(owner_mob.icon_living)
owner_mob.icon_dead = initial(owner_mob.icon_dead)
@@ -42,7 +43,8 @@
defense_active = FALSE
/datum/action/cooldown/mob_cooldown/defensive_mode/proc/defence(mob/living/basic/owner_mob)
- owner_mob.damage_coeff = string_assoc_list(list(BRUTE = 0.4, BURN = 0.5, TOX = 1, STAMINA = 1, OXY = 1))
+ MODIFY_PHYSIOLOGY(owner_mob, BRUTE, 0.4)
+ MODIFY_PHYSIOLOGY(owner_mob, BURN, 0.4)
owner_mob.icon_dead = "[owner_mob.icon_state]_d_dead"
owner_mob.icon_state = "[owner_mob.icon_state]_d"
owner_mob.icon_living = "[owner_mob.icon_living]_d"
diff --git a/code/datums/ai/_ai_behavior.dm b/code/datums/ai/_ai_behavior.dm
index dd26ab204a8b..4132e19e889d 100644
--- a/code/datums/ai/_ai_behavior.dm
+++ b/code/datums/ai/_ai_behavior.dm
@@ -104,7 +104,7 @@
/datum/bt_node/ai_behavior/proc/start_async()
async_running = TRUE
INVOKE_ASYNC(src, PROC_REF(perform_async), owning_controller)
- return AI_BEHAVIOR_DELAY
+ return handle_async() || AI_BEHAVIOR_DELAY
///Override this if you have sleeping behavior, be sure to implement the other async procs in perform()
/datum/bt_node/ai_behavior/proc/perform_async(datum/ai_controller/controller)
diff --git a/code/datums/ai/generic_behaviors/acquire_target.dm b/code/datums/ai/generic_behaviors/acquire_target.dm
index 7f0e82199426..c32b0949658b 100644
--- a/code/datums/ai/generic_behaviors/acquire_target.dm
+++ b/code/datums/ai/generic_behaviors/acquire_target.dm
@@ -229,19 +229,28 @@
if(!length(candidates))
candidates = on_no_candidates(controller, current_target, strategy, range)
candidates = include_current_target(controller, candidates, strategy, priority_strategy, current_target, range)
- var/list/filtered = filter_candidates(controller, candidates, strategy, priority_strategy, current_target, range)
+ // Target sources can return shared lists so we Copy here
+ candidates = candidates?.Copy()
var/atom/target
- while(length(filtered))
+ while(length(candidates))
+ // A previous path search may have yielded, invalidating candidates or changing their priority.
+ var/list/filtered = filter_candidates(controller, candidates, strategy, priority_strategy, current_target, range)
+ if(!length(filtered))
+ break
var/atom/candidate = pick_final_target(controller, filtered, priority_strategy, current_target)
if(isnull(candidate))
break
- filtered -= candidate
+ candidates -= candidate
// get_path_to may sleep here check abort flag after it returns.
- if(controller.can_reach_target(candidate, reach_distance, minimum_distance))
- target = candidate
- break
+ var/can_reach = controller.can_reach_target(candidate, reach_distance, minimum_distance)
if(!async_still_valid())
return
+ // Reachability can yield too. only select or blacklist a target that still matches
+ if(!length(filter_candidates(controller, list(candidate), strategy, priority_strategy, current_target, range)))
+ continue
+ if(can_reach)
+ target = candidate
+ break
controller.note_unreachable_target(candidate)
// If finish_action fired while we were sleeping, bail without touching anything.
if(!async_still_valid())
diff --git a/code/datums/ai/generic_decorators/pawn_buckled_to_obj.dm b/code/datums/ai/generic_decorators/pawn_buckled_to_obj.dm
index 045145882498..7d87da166459 100644
--- a/code/datums/ai/generic_decorators/pawn_buckled_to_obj.dm
+++ b/code/datums/ai/generic_decorators/pawn_buckled_to_obj.dm
@@ -14,5 +14,5 @@
var/mob/living/pawn = controller.pawn
if(!isobj(pawn.buckled))
return FALSE
- controller.blackboard[target_key] = pawn.buckled
+ controller.set_blackboard_key(target_key, pawn.buckled)
return TRUE
diff --git a/code/datums/ai/generic_decorators/pawn_contained_in_obj.dm b/code/datums/ai/generic_decorators/pawn_contained_in_obj.dm
index a49659df49da..c680a243d702 100644
--- a/code/datums/ai/generic_decorators/pawn_contained_in_obj.dm
+++ b/code/datums/ai/generic_decorators/pawn_contained_in_obj.dm
@@ -14,5 +14,5 @@
var/mob/living/pawn = controller.pawn
if(isturf(pawn.loc) || ismob(pawn.loc) || istype(pawn.loc, /obj/item/mob_holder) || HAS_TRAIT(controller.pawn, TRAIT_MOVE_VENTCRAWLING))
return FALSE
- controller.blackboard[target_key] = pawn.loc
+ controller.set_blackboard_key(target_key, pawn.loc)
return TRUE
diff --git a/code/datums/ai/generic_decorators/pawn_grabbed_by_enemy.dm b/code/datums/ai/generic_decorators/pawn_grabbed_by_enemy.dm
index 64e7a0df473f..ff87d558369f 100644
--- a/code/datums/ai/generic_decorators/pawn_grabbed_by_enemy.dm
+++ b/code/datums/ai/generic_decorators/pawn_grabbed_by_enemy.dm
@@ -4,11 +4,11 @@
child_typepath = /datum/bt_node/ai_behavior/resist
/datum/bt_node/decorator/pawn_grabbed_by_enemy/register_observe_signals(atom/pawn)
- RegisterSignals(pawn, list(COMSIG_LIVING_GET_PULLED, COMSIG_ATOM_NO_LONGER_PULLED, COMSIG_MOVABLE_SET_GRAB_STATE), PROC_REF(on_signal_changed))
+ RegisterSignals(pawn, list(COMSIG_LIVING_GET_PULLED, COMSIG_ATOM_NO_LONGER_PULLED, COMSIG_MOVABLE_CHANGED_GRABBED_STATE), PROC_REF(on_signal_changed))
return TRUE
/datum/bt_node/decorator/pawn_grabbed_by_enemy/unregister_observe_signals(atom/pawn)
- UnregisterSignal(pawn, list(COMSIG_LIVING_GET_PULLED, COMSIG_ATOM_NO_LONGER_PULLED, COMSIG_MOVABLE_SET_GRAB_STATE))
+ UnregisterSignal(pawn, list(COMSIG_LIVING_GET_PULLED, COMSIG_ATOM_NO_LONGER_PULLED, COMSIG_MOVABLE_CHANGED_GRABBED_STATE))
/datum/bt_node/decorator/pawn_grabbed_by_enemy/check_condition(datum/ai_controller/controller)
var/mob/living/pawn = controller.pawn
diff --git a/code/datums/ai/monkey/monkey_bt_nodes.dm b/code/datums/ai/monkey/monkey_bt_nodes.dm
index 49cd364b4d76..1c6094462985 100644
--- a/code/datums/ai/monkey/monkey_bt_nodes.dm
+++ b/code/datums/ai/monkey/monkey_bt_nodes.dm
@@ -256,10 +256,18 @@
var/succeeded = FALSE
if(attack_results && !controller.blackboard[BB_MONKEY_AGGRESSIVE])
succeeded = TRUE
+ var/hatred_value = controller.blackboard[BB_MONKEY_ENEMIES][target]
+ // A forced target may not have a grudge yet; give it one that can be satisfied.
+ if(isnull(hatred_value))
+ hatred_value = 1
+ controller.set_blackboard_key_assoc(BB_MONKEY_ENEMIES, target, hatred_value)
if(prob(MONKEY_HATRED_REDUCTION_PROB))
- var/hatred_value = controller.blackboard[BB_MONKEY_ENEMIES][target] - 1
+ hatred_value--
if(hatred_value <= 0)
controller.remove_thing_from_blackboard_key(BB_MONKEY_ENEMIES, target)
+ // The combat tree loops until its target is cleared, even after a successful attack.
+ if(controller.blackboard[target_key] == target)
+ controller.clear_blackboard_key(target_key)
else
controller.set_blackboard_key_assoc(BB_MONKEY_ENEMIES, target, hatred_value)
finish_async(succeeded ? AI_BEHAVIOR_SUCCEEDED : AI_BEHAVIOR_FAILED)
diff --git a/code/datums/ai/monkey/monkey_combat.bt.json b/code/datums/ai/monkey/monkey_combat.bt.json
index eea3dda2c4c4..35b82513527f 100644
--- a/code/datums/ai/monkey/monkey_combat.bt.json
+++ b/code/datums/ai/monkey/monkey_combat.bt.json
@@ -4,7 +4,7 @@
"decorator": "/datum/bt_node/decorator/bb_key_set",
"vars": {
"key": "BB_CURRENT_TARGET",
- "observer_abort": "BT_ABORT_LOWER_PRIORITY"
+ "observer_abort": "BT_ABORT_BOTH"
},
"child": {
"type": "parallel",
diff --git a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
index 611069943079..1c88ebc512c2 100644
--- a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
+++ b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
@@ -42,7 +42,16 @@
/datum/bodypart_overlay/mutant/get_overlay(obj/item/bodypart/limb, layer_index, layer_real)
inherit_color(limb) // If draw_color is not set yet, go ahead and do that
- return ..()
+ var/list/created_overlays = ..()
+ if(sprite_datum && sprite_datum.icon_state != SPRITE_ACCESSORY_NONE)
+ if(layer_index in sprite_datum.emissive_layers)
+ created_overlays += emissive_appearance(
+ icon = sprite_datum.icon,
+ icon_state = build_icon_state(layer_index, limb),
+ offset_spokesman = limb,
+ layer = layer_real,
+ )
+ return created_overlays
///Completely random image and color generation (obeys what a player can choose from)
/datum/bodypart_overlay/mutant/proc/randomize_appearance()
diff --git a/code/datums/components/aura_healing.dm b/code/datums/components/aura_healing.dm
index 3575c1cd1f53..bea4e950d0af 100644
--- a/code/datums/components/aura_healing.dm
+++ b/code/datums/components/aura_healing.dm
@@ -143,12 +143,8 @@
for(var/datum/wound/iter_wound as anything in carbidate.all_wounds)
iter_wound.adjust_blood_flow(-wound_clotting * seconds_per_tick)
- else if (isanimal(candidate))
- var/mob/living/simple_animal/animal_candidate = candidate
- animal_candidate.adjustHealth(-simple_heal * seconds_per_tick, updating_health = FALSE)
- else if (isbasicmob(candidate))
- var/mob/living/basic/basic_candidate = candidate
- basic_candidate.adjust_health(-simple_heal * seconds_per_tick, updating_health = FALSE)
+ else if(isanimal_or_basicmob(candidate))
+ candidate.adjust_brute_loss(-simple_heal * seconds_per_tick, updating_health = FALSE)
candidate.adjust_blood_volume(blood_heal * seconds_per_tick, maximum = BLOOD_VOLUME_NORMAL)
diff --git a/code/datums/components/candela_node.dm b/code/datums/components/candela_node.dm
index 6d70b3455250..61e323307da7 100644
--- a/code/datums/components/candela_node.dm
+++ b/code/datums/components/candela_node.dm
@@ -156,9 +156,8 @@
// 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 (can_see(parent, other_node.parent, MINING_BEACON_MAX_REACH) || can_see(other_node.parent, parent, MINING_BEACON_MAX_REACH))
+ located_nodes |= other_node
if (length(located_nodes))
// No nodes were cut, don't do anything
@@ -178,7 +177,7 @@
if (node_dist >= min_dist)
continue
- if (!can_see(parent, thing, MINING_BEACON_MAX_REACH) || !can_see(thing, parent, MINING_BEACON_MAX_REACH))
+ if (!can_see(parent, thing, MINING_BEACON_MAX_REACH) && !can_see(thing, parent, MINING_BEACON_MAX_REACH))
continue
min_dist = node_dist
@@ -246,8 +245,11 @@ GLOBAL_LIST_EMPTY(mining_beacon_networks)
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]
+ if (!actual_node || actual_node == new_node)
+ continue
+
// 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))
+ if (!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])
@@ -427,7 +429,7 @@ GLOBAL_LIST_EMPTY(mining_beacon_networks)
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))
+ 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)
@@ -438,7 +440,7 @@ GLOBAL_LIST_EMPTY(mining_beacon_networks)
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))
+ 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)
diff --git a/code/datums/components/connect_client_behalf.dm b/code/datums/components/connect_client_behalf.dm
new file mode 100644
index 000000000000..9d498ef842a6
--- /dev/null
+++ b/code/datums/components/connect_client_behalf.dm
@@ -0,0 +1,78 @@
+/// It's just connect_mob_behalf but the other way baby
+/// Does not REALLY need to be COMPONENT_DUPE_UNIQUE_PASSARGS but if it's not it breaks real bad in plane master code (as of now)
+/// And in theory this is more "correct"
+/datum/component/connect_client_behalf
+ dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
+
+ /// list in the form mob -> list(signal -> procpath to register to the client our mob "owns")
+ var/list/mob_to_connections = list()
+ /// list of tracked mob -> client (if any)
+ var/list/mob_to_client = list()
+
+/datum/component/connect_client_behalf/Initialize(mob/tracked, list/connections)
+ . = ..()
+ if (!istype(tracked))
+ return COMPONENT_INCOMPATIBLE
+ src.mob_to_connections[tracked] = connections
+ src.mob_to_client[tracked] = tracked.client
+
+/datum/component/connect_client_behalf/RegisterWithParent()
+ for(var/mob/tracked as anything in mob_to_connections)
+ RegisterSignal(tracked, COMSIG_QDELETING, PROC_REF(handle_tracked_qdel))
+ RegisterSignal(tracked, COMSIG_MOB_LOGIN, PROC_REF(on_login))
+ RegisterSignal(tracked, COMSIG_MOB_LOGOUT, PROC_REF(on_logout))
+ update_signals(tracked)
+
+/datum/component/connect_client_behalf/UnregisterFromParent()
+ for(var/mob/tracked as anything in mob_to_connections)
+ unregister_signals(tracked)
+ UnregisterSignal(tracked, COMSIG_QDELETING)
+ mob_to_connections = null
+ mob_to_client = null
+
+/datum/component/connect_client_behalf/InheritComponent(datum/component/C, i_am_original, mob/tracked, list/connections)
+ for(var/connection in connections)
+ src.mob_to_connections[tracked][connection] = connections[connection]
+ if(tracked in src.mob_to_client)
+ update_signals(tracked)
+ return
+ src.mob_to_client[tracked] = tracked.client
+ RegisterSignal(tracked, COMSIG_QDELETING, PROC_REF(handle_tracked_qdel))
+ RegisterSignal(tracked, COMSIG_MOB_LOGIN, PROC_REF(on_login))
+ RegisterSignal(tracked, COMSIG_MOB_LOGOUT, PROC_REF(on_logout))
+ update_signals(tracked)
+
+/datum/component/connect_client_behalf/proc/handle_tracked_qdel(mob/source)
+ SIGNAL_HANDLER
+ unregister_signals(source)
+ UnregisterSignal(source, COMSIG_QDELETING)
+ mob_to_connections -= source
+ mob_to_client -= source
+ if(!length(mob_to_connections))
+ qdel(src)
+
+/datum/component/connect_client_behalf/proc/update_signals(mob/tracked)
+ unregister_signals(tracked)
+ // Yes this is a runtime silencer
+ // It's rare, and the same check in connect_loc_behalf is more fruitful, but it's still worth doing
+ if(QDELETED(tracked?.client))
+ return
+ mob_to_client[tracked] = tracked.client
+ var/list/connections = mob_to_connections[tracked]
+ for (var/signal in connections)
+ parent.RegisterSignal(tracked.client, signal, connections[signal])
+
+/datum/component/connect_client_behalf/proc/unregister_signals(mob/tracked)
+ if(isnull(mob_to_client[tracked]))
+ return
+
+ parent.UnregisterSignal(mob_to_client[tracked], mob_to_connections[tracked])
+ mob_to_client[tracked] = null
+
+/datum/component/connect_client_behalf/proc/on_login(mob/source)
+ SIGNAL_HANDLER
+ update_signals(source)
+
+/datum/component/connect_client_behalf/proc/on_logout(mob/source)
+ SIGNAL_HANDLER
+ update_signals(source)
diff --git a/code/datums/components/connect_containers.dm b/code/datums/components/connect_containers.dm
index e04656a0cc2d..d9ec522b63eb 100644
--- a/code/datums/components/connect_containers.dm
+++ b/code/datums/components/connect_containers.dm
@@ -23,8 +23,8 @@
return ..()
/datum/component/connect_containers/CheckDupeComponent(datum/component/connect_containers/new_component, atom/movable/tracked, list/connections)
- // Not equivalent. Checks if they are not the same list via shallow comparison.
- if(!compare_list(src.connections, connections))
+ // Both the signal names and their handlers must match.
+ if(!deep_compare_list(src.connections, connections))
return FALSE // Different set of connections.
if(src.tracked != tracked)
set_tracked(tracked) // Different target for the same set of connections, track the new target.
diff --git a/code/datums/components/connect_inventory.dm b/code/datums/components/connect_inventory.dm
index 2322c3ed9d71..c2b225351b59 100644
--- a/code/datums/components/connect_inventory.dm
+++ b/code/datums/components/connect_inventory.dm
@@ -23,7 +23,7 @@
/datum/component/connect_inventory/UnregisterFromParent()
unregister_signals()
- UnregisterSignal(tracked, list(COMSIG_MOB_EQUIPPED_ITEM, COMSIG_MOB_UNEQUIPPED_ITEM))
+ UnregisterSignal(tracked, list(COMSIG_MOB_EQUIPPED_ITEM, COMSIG_QDELETING))
/datum/component/connect_inventory/proc/handle_tracked_qdel()
SIGNAL_HANDLER
diff --git a/code/datums/components/connect_perspective.dm b/code/datums/components/connect_perspective.dm
new file mode 100644
index 000000000000..91dd5aa242a6
--- /dev/null
+++ b/code/datums/components/connect_perspective.dm
@@ -0,0 +1,36 @@
+/// Behaves similar to connect_loc_behalf, but hooks into signals on the perspective of the plane master group
+/datum/component/connect_perspective
+ dupe_mode = COMPONENT_DUPE_UNIQUE
+ var/list/connections
+ var/datum/plane_master_group/tracked
+
+/datum/component/connect_perspective/Initialize(datum/plane_master_group/tracked, connections)
+ . = ..()
+ if(!istype(tracked))
+ return COMPONENT_INCOMPATIBLE
+ src.connections = connections
+ src.tracked = tracked
+
+/datum/component/connect_perspective/RegisterWithParent()
+ RegisterSignal(tracked, COMSIG_PLANE_GROUP_PERSPECTIVE_CHANGED, PROC_REF(on_perspective_change))
+ RegisterSignal(tracked, COMSIG_QDELETING, PROC_REF(handle_tracked_qdel))
+ update_signals(null, tracked.get_perspective())
+
+/datum/component/connect_perspective/UnregisterFromParent()
+ update_signals(tracked.get_perspective(), null)
+ UnregisterSignal(tracked, list(COMSIG_PLANE_GROUP_PERSPECTIVE_CHANGED, COMSIG_QDELETING))
+
+/datum/component/connect_perspective/proc/handle_tracked_qdel()
+ SIGNAL_HANDLER
+ qdel(src)
+
+/datum/component/connect_perspective/proc/on_perspective_change(datum/source, atom/old_perspective, atom/new_perspective)
+ SIGNAL_HANDLER
+ update_signals(old_perspective, new_perspective)
+
+/datum/component/connect_perspective/proc/update_signals(atom/old_perspective, atom/new_perspective)
+ if(!isnull(old_perspective))
+ parent.UnregisterSignal(old_perspective, connections)
+ if(!isnull(new_perspective))
+ for(var/signal in connections)
+ parent.RegisterSignal(new_perspective, signal, connections[signal])
diff --git a/code/datums/components/connect_range.dm b/code/datums/components/connect_range.dm
index cb19a98552ad..f95de570581c 100644
--- a/code/datums/components/connect_range.dm
+++ b/code/datums/components/connect_range.dm
@@ -34,8 +34,8 @@
return ..()
/datum/component/connect_range/InheritComponent(datum/component/component, original, atom/tracked, list/connections, range, works_in_containers)
- // Not equivalent. Checks if they are not the same list via shallow comparison.
- if(!compare_list(src.connections, connections))
+ // Both the signal names and their handlers must match.
+ if(!deep_compare_list(src.connections, connections))
stack_trace("connect_range component attached to [parent] tried to inherit another connect_range component with different connections")
return
if(src.tracked != tracked)
@@ -44,6 +44,7 @@
return
//Unregister the signals with the old settings.
unregister_signals(isturf(tracked) ? tracked : tracked.loc, turfs)
+ turfs = list()
src.range = range
src.works_in_containers = works_in_containers
//Re-register the signals with the new settings.
@@ -52,6 +53,7 @@
/datum/component/connect_range/proc/set_tracked(atom/new_tracked)
if(tracked) //Unregister the signals from the old tracked and its surroundings
unregister_signals(isturf(tracked) ? tracked : tracked.loc, turfs)
+ turfs = list()
UnregisterSignal(tracked, list(
COMSIG_MOVABLE_MOVED,
COMSIG_QDELETING,
@@ -83,10 +85,7 @@
turfs = list()
return
- //Only register/unregister turf signals if it's moved to a new turf.
- if(current_turf == get_turf(old_loc))
- unregister_signals(old_loc, null)
- return
+ // Reconcile subscriptions even on the same turf: the container may have changed.
var/list/old_turfs = turfs
turfs = RANGE_TURFS(range, current_turf)
unregister_signals(old_loc, old_turfs - turfs)
diff --git a/code/datums/components/crafting/tiles.dm b/code/datums/components/crafting/tiles.dm
index 16ef031ebf9b..a6ea302139c1 100644
--- a/code/datums/components/crafting/tiles.dm
+++ b/code/datums/components/crafting/tiles.dm
@@ -29,39 +29,6 @@
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
diff --git a/code/datums/components/damage_aura.dm b/code/datums/components/damage_aura.dm
index 424a87960544..f49531842f10 100644
--- a/code/datums/components/damage_aura.dm
+++ b/code/datums/components/damage_aura.dm
@@ -145,12 +145,9 @@
for (var/organ in organ_damage)
candidate.adjust_organ_loss(organ, organ_damage[organ] * seconds_per_tick)
- else if (isanimal(candidate))
- var/mob/living/simple_animal/animal_candidate = candidate
- animal_candidate.adjustHealth(simple_damage * seconds_per_tick, updating_health = FALSE)
- else if (isbasicmob(candidate))
- var/mob/living/basic/basic_candidate = candidate
- basic_candidate.adjust_health(simple_damage * seconds_per_tick, updating_health = FALSE)
+
+ if (isanimal_or_basicmob(candidate))
+ candidate.adjust_brute_loss(simple_damage * seconds_per_tick, updating_health = FALSE)
candidate.adjust_blood_volume(blood_damage * seconds_per_tick, minimum = BLOOD_VOLUME_SURVIVE)
diff --git a/code/datums/components/fullauto.dm b/code/datums/components/fullauto.dm
index d7f68e55bae0..576c7512dd4f 100644
--- a/code/datums/components/fullauto.dm
+++ b/code/datums/components/fullauto.dm
@@ -322,7 +322,8 @@
if(!akimbo_gun.can_shoot())
addtimer(CALLBACK(akimbo_gun, TYPE_PROC_REF(/obj/item/gun, shoot_with_empty_chamber), shooter), 0.1 SECONDS)
else
- bonus_spread = dual_wield_spread
+ if(!HAS_TRAIT(shooter, TRAIT_AMBIDEXTROUS)) // DARKPACK EDIT ADD - MERITS_FLAWS
+ bonus_spread = dual_wield_spread
addtimer(CALLBACK(akimbo_gun, TYPE_PROC_REF(/obj/item/gun, process_fire), target, shooter, TRUE, params, null, bonus_spread), 0.1 SECONDS)
process_fire(target, shooter, TRUE, params, null, bonus_spread)
diff --git a/code/datums/components/ground_sinking.dm b/code/datums/components/ground_sinking.dm
index 971cb15529d0..1a5d858f3931 100644
--- a/code/datums/components/ground_sinking.dm
+++ b/code/datums/components/ground_sinking.dm
@@ -19,8 +19,6 @@
var/health_per_second
/// Outline colour of the regeneration
var/outline_colour
- /// Our damage_coeffs when we are sinked
- var/damage_res_sinked
/// If we sinked into the ground right now
var/sinked = FALSE
/// If we sinking into the ground right now
@@ -29,6 +27,7 @@
var/sink_count = 0
/// When this timer completes we start sinking
var/ground_sinking_start_timer
+ var/datum/callback/sink_callback
/datum/component/ground_sinking/Initialize(target_icon_state,
ground_sinking_delay = 8 SECONDS,
@@ -36,7 +35,8 @@
heal_when_sinked = TRUE,
health_per_second = 1,
outline_colour = COLOR_PALE_GREEN,
- damage_res_sinked = string_assoc_list(list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)))
+ datum/callback/sink_callback,
+)
if (!isbasicmob(parent))
return COMPONENT_INCOMPATIBLE
@@ -47,7 +47,7 @@
src.heal_when_sinked = heal_when_sinked
src.health_per_second = health_per_second
src.outline_colour = outline_colour
- src.damage_res_sinked = damage_res_sinked
+ src.sink_callback = sink_callback
/datum/component/ground_sinking/RegisterWithParent()
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved))
@@ -100,9 +100,9 @@
sinked = TRUE
is_sinking = FALSE
living_target.set_density(FALSE)
- living_target.damage_coeff = damage_res_sinked
if(heal_when_sinked)
start_regenerating()
+ sink_callback?.Invoke(sinked)
/// The mob pops out of the ground
/datum/component/ground_sinking/proc/unsink()
@@ -112,9 +112,9 @@
if(sinked && heal_when_sinked)
stop_regenerating()
living_target.icon_state = target_icon_state
- living_target.damage_coeff = string_assoc_list(list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1))
living_target.set_density(TRUE)
sinked = FALSE
+ sink_callback?.Invoke(sinked)
/// The mop starts regaining health
/datum/component/ground_sinking/proc/start_regenerating()
diff --git a/code/datums/components/hide_weather_planes.dm b/code/datums/components/hide_weather_planes.dm
index 9c3270f5ac77..97bdb4fac974 100644
--- a/code/datums/components/hide_weather_planes.dm
+++ b/code/datums/components/hide_weather_planes.dm
@@ -12,7 +12,6 @@
/datum/component/hide_weather_planes/Initialize(atom/movable/screen/plane_master/care_about)
if(!istype(parent, /datum/plane_master_group))
return COMPONENT_INCOMPATIBLE
- var/datum/plane_master_group/home = parent
plane_masters += care_about
RegisterSignal(care_about, COMSIG_QDELETING, PROC_REF(plane_master_deleted))
@@ -24,11 +23,8 @@
RegisterSignals(SSdcs, starting_signals, PROC_REF(weather_started))
RegisterSignals(SSdcs, ending_signals, PROC_REF(weather_finished))
-
- if(home.our_hud)
- attach_hud(home.our_hud)
- else
- RegisterSignal(home, COMSIG_GROUP_HUD_CHANGED, PROC_REF(new_hud_attached))
+ AddComponent(/datum/component/connect_perspective, parent, list(COMSIG_MOVABLE_Z_CHANGED = PROC_REF(z_changed)))
+ RegisterSignal(parent, COMSIG_PLANE_GROUP_PERSPECTIVE_CHANGED, PROC_REF(perspective_changed))
/datum/component/hide_weather_planes/Destroy(force)
hide_planes()
@@ -40,30 +36,21 @@
if(!i_am_original)
return
var/datum/plane_master_group/home = parent
- var/mob/our_lad = home.our_hud?.mymob
- var/our_offset = GET_TURF_PLANE_OFFSET(our_lad)
+ var/mob/perspective = home.get_perspective()
+ var/mob/viewer = home.our_hud?.mymob
+ var/our_offset = GET_TURF_PLANE_OFFSET(perspective)
plane_masters += care_about
RegisterSignal(care_about, COMSIG_QDELETING, PROC_REF(plane_master_deleted))
if(length(active_weather))
//If there's weather to care about we unhide our new plane and adjust its alpha
- care_about.unhide_plane(our_lad)
+ care_about.unhide_plane(viewer)
if(care_about.offset >= our_offset)
care_about.enable_alpha()
else
care_about.disable_alpha()
else
- care_about.hide_plane(our_lad)
-
-/datum/component/hide_weather_planes/proc/new_hud_attached(datum/source, datum/hud/old_hud, datum/hud/new_hud)
- SIGNAL_HANDLER
- attach_hud(new_hud)
-
-/datum/component/hide_weather_planes/proc/attach_hud(datum/hud/new_hud)
- RegisterSignal(new_hud, COMSIG_HUD_Z_CHANGED, PROC_REF(z_changed))
- var/mob/eye = new_hud?.mymob?.client?.eye
- var/turf/eye_location = get_turf(eye)
- z_changed(new_hud, eye_location?.z)
+ care_about.hide_plane(viewer)
/datum/component/hide_weather_planes/proc/plane_master_deleted(atom/movable/screen/plane_master/source)
SIGNAL_HANDLER
@@ -75,12 +62,13 @@
*/
/datum/component/hide_weather_planes/proc/display_planes()
var/datum/plane_master_group/home = parent
- var/mob/our_lad = home.our_hud?.mymob
- var/our_offset = GET_TURF_PLANE_OFFSET(our_lad)
+ var/mob/perspective = home.get_perspective()
+ var/mob/viewer = home.our_hud?.mymob
+ var/our_offset = GET_TURF_PLANE_OFFSET(perspective)
for(var/atom/movable/screen/plane_master/weather_conscious as anything in plane_masters)
//If the plane is hidden, unhide it
if(weather_conscious.force_hidden)
- weather_conscious.unhide_plane(our_lad)
+ weather_conscious.unhide_plane(viewer)
//Now we update the alpha of the plane based on our offset. Weather above us (lower offset) are transparent, weather at or below us (higher offset) are opaque.
if(weather_conscious.offset >= our_offset)
@@ -95,13 +83,21 @@
for(var/atom/movable/screen/plane_master/weather_conscious as anything in plane_masters)
weather_conscious.hide_plane(our_lad)
-/datum/component/hide_weather_planes/proc/z_changed(datum/source, new_z)
+/datum/component/hide_weather_planes/proc/z_changed(datum/source, turf/old_turf, turf/new_turf, same_z_layer)
SIGNAL_HANDLER
+ update_by_z(new_turf)
+
+/datum/component/hide_weather_planes/proc/perspective_changed(datum/source)
+ SIGNAL_HANDLER
+ var/datum/plane_master_group/group = parent
+ update_by_z(get_turf(group.perspective))
+
+/datum/component/hide_weather_planes/proc/update_by_z(turf/new_turf)
active_weather = list()
if(!SSmapping.initialized)
return
- var/list/connected_levels = SSmapping.get_connected_levels(new_z)
+ var/list/connected_levels = SSmapping.get_connected_levels(new_turf)
for(var/datum/weather/active as anything in SSweather.processing)
if(length(connected_levels & active.impacted_z_levels))
active_weather += WEAKREF(active)
@@ -114,7 +110,7 @@
/datum/component/hide_weather_planes/proc/weather_started(datum/source, datum/weather/starting)
SIGNAL_HANDLER
var/datum/plane_master_group/home = parent
- var/mob/eye = home.our_hud?.mymob?.client?.eye
+ var/mob/eye = home.get_perspective()
var/turf/viewing_from = get_turf(eye)
if(!viewing_from)
return
diff --git a/code/datums/components/life_link.dm b/code/datums/components/life_link.dm
index a9a55f3ab6c6..1e6948407a8f 100644
--- a/code/datums/components/life_link.dm
+++ b/code/datums/components/life_link.dm
@@ -22,8 +22,11 @@
src.on_linked_death = on_linked_death
/datum/component/life_link/RegisterWithParent()
- RegisterSignal(parent, COMSIG_CARBON_LIMB_DAMAGED, PROC_REF(on_limb_damage))
- RegisterSignals(parent, COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES, PROC_REF(on_damage_adjusted))
+ if(!iscarbon(parent))
+ RegisterSignals(parent, COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES, PROC_REF(on_damage_adjusted))
+ else
+ RegisterSignal(parent, COMSIG_CARBON_LIMB_DAMAGED, PROC_REF(on_limb_damage)) //carbon mobs handle brute and burn damage differently
+ RegisterSignals(parent, list(COMSIG_LIVING_ADJUST_OXY_DAMAGE, COMSIG_LIVING_ADJUST_TOX_DAMAGE), PROC_REF(on_damage_adjusted))
RegisterSignal(parent, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(on_health_updated))
if (!isnull(host))
var/mob/living/living_parent = parent
@@ -61,29 +64,19 @@
SIGNAL_HANDLER
if (forced)
return
- amount *= our_mob.get_damage_mod(type)
- switch (type)
- if(BRUTE)
- host.adjust_brute_loss(amount, forced = TRUE)
- if(BURN)
- host.adjust_fire_loss(amount, forced = TRUE)
- if(TOX)
- host.adjust_tox_loss(amount, forced = TRUE)
- if(OXY)
- host.adjust_oxy_loss(amount, forced = TRUE)
+ amount *= our_mob.get_incoming_damage_modifier(amount, type)
+ host.apply_damage(amount, type, spread_damage = TRUE)
on_passed_damage?.Invoke(our_mob, host, amount)
return COMPONENT_IGNORE_CHANGE
/// Called when someone hurts one of our limbs, bypassing normal damage adjustment
-/datum/component/life_link/proc/on_limb_damage(mob/living/our_mob, limb, brute, burn)
+/datum/component/life_link/proc/on_limb_damage(mob/living/our_mob, obj/item/bodypart/part, brute, burn)
SIGNAL_HANDLER
if (brute != 0)
- host.adjust_brute_loss(brute, updating_health = FALSE)
+ host.apply_damage(brute, BRUTE, part.body_zone)
if (burn != 0)
- host.adjust_fire_loss(burn, updating_health = FALSE)
- if (brute != 0 || burn != 0)
- host.updatehealth()
+ host.apply_damage(burn, BURN, part.body_zone)
on_passed_damage?.Invoke(our_mob, host, brute + burn)
return COMPONENT_PREVENT_LIMB_DAMAGE
diff --git a/code/datums/components/ling_decoy_brain.dm b/code/datums/components/ling_decoy_brain.dm
index d6368aeee0e7..2aa3f7430d1f 100644
--- a/code/datums/components/ling_decoy_brain.dm
+++ b/code/datums/components/ling_decoy_brain.dm
@@ -45,7 +45,7 @@
if(!istype(the_real_ling))
return
- if(istype(source.loc, /obj/item/mmi) && talk_action?.owner != the_real_ling)
+ if(istype(source.loc, /obj/item/brain_processor/organic) && talk_action?.owner != the_real_ling)
if(isnull(talk_action))
talk_action = new() // Not linked to anything, we manage the reference (and don't want it disappearing on us)
talk_action.brain_ref = source
diff --git a/code/datums/components/material_turf_tracking.dm b/code/datums/components/material_turf_tracking.dm
index 492b4d0f4955..c36e4f064b61 100644
--- a/code/datums/components/material_turf_tracking.dm
+++ b/code/datums/components/material_turf_tracking.dm
@@ -61,21 +61,26 @@
var/atom/movable/as_movable = parent
RegisterSignal(as_movable, COMSIG_ATOM_ENTERING, PROC_REF(on_source_entering))
RegisterSignal(as_movable, COMSIG_ATOM_EXITING, PROC_REF(on_source_exiting))
+ RegisterSignal(as_movable, COMSIG_MOVABLE_TURF_INITIALIZING, PROC_REF(on_turf_initializing))
target_turf = as_movable.loc
- if (!isopenturf(target_turf))
+ register_turf(target_turf)
+
+/// Start listening to this turf without triggering effects on anything already on it.
+/datum/component/material_turf_tracking/proc/register_turf(atom/location)
+ if (!isopenturf(location))
return
if (!requires_elevation)
- RegisterSignal(target_turf, SIGNAL_ADDTRAIT(TRAIT_ELEVATED_TURF), PROC_REF(on_turf_lost))
- RegisterSignal(target_turf, SIGNAL_REMOVETRAIT(TRAIT_ELEVATED_TURF), PROC_REF(on_turf_gained))
- if (HAS_TRAIT(target_turf, TRAIT_ELEVATED_TURF))
+ RegisterSignal(location, SIGNAL_ADDTRAIT(TRAIT_ELEVATED_TURF), PROC_REF(on_turf_lost))
+ RegisterSignal(location, SIGNAL_REMOVETRAIT(TRAIT_ELEVATED_TURF), PROC_REF(on_turf_gained))
+ if (HAS_TRAIT(location, TRAIT_ELEVATED_TURF))
return
// Not tracking initializations or existing objects as this would allow you to TP someone from plating by placing a tile underneath
- RegisterSignal(target_turf, COMSIG_ATOM_ENTERED, PROC_REF(on_entered))
- RegisterSignal(target_turf, COMSIG_TURF_MOVABLE_THROW_LANDED, PROC_REF(on_entered)) // Need this as shoves are 1 tile throws, and COMSIG_ATOM_ENTERED runs before the throw ends
- RegisterSignal(target_turf, COMSIG_ATOM_EXITED, PROC_REF(on_exited))
+ RegisterSignal(location, COMSIG_ATOM_ENTERED, PROC_REF(on_entered))
+ RegisterSignal(location, COMSIG_TURF_MOVABLE_THROW_LANDED, PROC_REF(on_entered)) // Need this as shoves are 1 tile throws, and COMSIG_ATOM_ENTERED runs before the throw ends
+ RegisterSignal(location, COMSIG_ATOM_EXITED, PROC_REF(on_exited))
/datum/component/material_turf_tracking/UnregisterFromParent()
. = ..()
@@ -84,9 +89,24 @@
return
var/atom/movable/as_movable = parent
- UnregisterSignal(as_movable, list(COMSIG_ATOM_ENTERING, COMSIG_ATOM_EXITING))
+ UnregisterSignal(as_movable, list(COMSIG_ATOM_ENTERING, COMSIG_ATOM_EXITING, COMSIG_MOVABLE_TURF_INITIALIZING))
on_source_exiting(as_movable.loc)
+/datum/component/material_turf_tracking/proc/on_turf_initializing(atom/movable/source, turf/initializing_turf)
+ SIGNAL_HANDLER
+ UnregisterSignal(initializing_turf, list(
+ SIGNAL_ADDTRAIT(TRAIT_ELEVATED_TURF),
+ SIGNAL_REMOVETRAIT(TRAIT_ELEVATED_TURF),
+ COMSIG_ATOM_ENTERED,
+ COMSIG_TURF_MOVABLE_THROW_LANDED,
+ COMSIG_ATOM_EXITED,
+ ))
+ // Things already here might still land or become elevated, so keep listening for that.
+ // Only clear those callbacks if the new turf means they can no longer touch the material turf.
+ if (!isopenturf(initializing_turf) || (!requires_elevation && HAS_TRAIT(initializing_turf, TRAIT_ELEVATED_TURF)))
+ on_turf_lost(initializing_turf)
+ register_turf(initializing_turf)
+
/datum/component/material_turf_tracking/proc/on_source_entering(atom/movable/source, atom/entering, atom/old_loc)
SIGNAL_HANDLER
diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm
index 91e3fa62e3cd..8857fad24d87 100644
--- a/code/datums/components/overlay_lighting.dm
+++ b/code/datums/components/overlay_lighting.dm
@@ -193,6 +193,8 @@
return
if(directional)
cast_directional_light()
+ else
+ show_to_holder()
register_new_cells()
/// Adds the luminosity and source for the affected movable atoms to keep track of their visibility.
diff --git a/code/datums/components/seethrough_mob.dm b/code/datums/components/seethrough_mob.dm
index 1cc4edca75eb..11ffbe753e87 100644
--- a/code/datums/components/seethrough_mob.dm
+++ b/code/datums/components/seethrough_mob.dm
@@ -43,6 +43,9 @@
action.Grant(parent)
/datum/component/seethrough_mob/Destroy(force)
+ if(trickery_image)
+ var/mob/fool = parent
+ clear_image(trickery_image, fool.client)
QDEL_NULL(render_source_atom)
return ..()
@@ -51,6 +54,10 @@
SIGNAL_HANDLER
var/mob/fool = parent
+ // Finish the previous fade
+ if(trickery_image)
+ clear_image(trickery_image, fool.client)
+ is_active = TRUE
var/datum/hud/our_hud = fool.hud_used
for(var/atom/movable/screen/plane_master/seethrough as anything in our_hud.get_true_plane_masters(SEETHROUGH_PLANE))
seethrough.unhide_plane(fool)
@@ -89,10 +96,16 @@
///Remove the image and the trick atom
/datum/component/seethrough_mob/proc/clear_image(image/removee, client/remove_from)
+ remove_from?.images -= removee
+ // A previous fade may finish after a new appearance has taken its place.
+ if(removee != trickery_image)
+ return
var/atom/movable/atom_parent = parent
atom_parent.vis_contents -= render_source_atom
atom_parent.render_target = initial_render_target_value
- remove_from?.images -= removee
+ initial_render_target_value = null
+ trickery_image = null
+ is_active = FALSE
///Effect is disabled when they log out because client gets deleted
/datum/component/seethrough_mob/proc/on_client_disconnect()
diff --git a/code/datums/components/shoe_footstep.dm b/code/datums/components/shoe_footstep.dm
new file mode 100644
index 000000000000..8fd0e5ea592e
--- /dev/null
+++ b/code/datums/components/shoe_footstep.dm
@@ -0,0 +1,99 @@
+/// Basically the squeak component but stripped down for only shoes
+/// In other words it replaces the mob's default footstep sounds with the ones provided on all surfaces
+/datum/component/shoe_footstep
+ /// Tracks how many steps have been taken since the last sound was played
+ VAR_PRIVATE/steps = 0
+
+ /// The sounds that can be played
+ var/list/sounds
+ /// Whether the shoes can be taped, self-deleting the component / making the shoes silent
+ var/can_tape
+ /// The volume of the sound
+ var/volume
+ /// The chance that a sound will be played
+ var/chance_per_play
+ /// The number of steps that must be taken before a sound can be played
+ var/steps_per_play
+ /// Extrarange modifier on the played footstep sound
+ var/extrarange
+ /// Falloff exponent for the played footstep sound
+ var/falloff_exponent
+ /// Falloff distance for the played footstep sound
+ var/falloff_distance
+
+/datum/component/shoe_footstep/Initialize(
+ list/sounds,
+ volume = 50,
+ chance_per_play = 100,
+ steps_per_play = 1,
+ extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE,
+ falloff_exponent = SOUND_FALLOFF_EXPONENT,
+ falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE,
+)
+ if(!istype(parent, /obj/item/clothing/shoes))
+ return COMPONENT_INCOMPATIBLE
+ if(!length(sounds) || volume <= 0 || chance_per_play <= 0 || steps_per_play < 0)
+ return COMPONENT_INCOMPATIBLE
+ src.sounds = sounds
+ src.can_tape = can_tape
+ src.volume = volume
+ src.chance_per_play = chance_per_play
+ src.steps_per_play = steps_per_play
+ src.extrarange = extrarange
+ src.falloff_exponent = falloff_exponent
+ src.falloff_distance = falloff_distance
+
+/datum/component/shoe_footstep/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_SHOES_STEP_ACTION, PROC_REF(stepped))
+ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(equipped))
+ RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(dropped))
+
+ var/obj/item/parent_object = parent
+ var/mob/living/wearer = parent_object.loc
+ if(istype(wearer) && (wearer.get_slot_by_item(parent_object) & parent_object.slot_flags))
+ ADD_TRAIT(wearer, TRAIT_SILENT_FOOTSTEPS, REF(src))
+
+/datum/component/shoe_footstep/UnregisterFromParent()
+ UnregisterSignal(parent, list(
+ COMSIG_SHOES_STEP_ACTION,
+ COMSIG_ITEM_EQUIPPED,
+ COMSIG_ITEM_DROPPED,
+ COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM,
+ ))
+ var/obj/item/parent_object = parent
+ if(ismob(parent_object.loc))
+ REMOVE_TRAIT(parent_object.loc, TRAIT_SILENT_FOOTSTEPS, REF(src))
+
+/datum/component/shoe_footstep/proc/stepped(obj/item/clothing/shoes/source)
+ SIGNAL_HANDLER
+
+ var/mob/living/carbon/human/owner = source.loc
+ if(SHOULD_ATOM_DISABLE_FOOTSTEPS(owner) || SHOULD_MOB_DISABLE_FOOTSTEPS(owner))
+ return
+ if(HAS_TRAIT_NOT_FROM(owner, TRAIT_SILENT_FOOTSTEPS, REF(src)) )
+ return // a second source of silent footsteps silences us! the plot thickens
+
+ if(steps < steps_per_play)
+ steps++
+ return
+
+ steps = 0
+ if(prob(chance_per_play))
+ playsound(
+ source = source,
+ soundin = pick(sounds),
+ vol = volume,
+ vary = TRUE,
+ extrarange = extrarange,
+ falloff_exponent = falloff_exponent,
+ falloff_distance = falloff_distance,
+ )
+
+/datum/component/shoe_footstep/proc/equipped(obj/item/source, mob/user, slot)
+ SIGNAL_HANDLER
+ if(slot & source.slot_flags)
+ ADD_TRAIT(user, TRAIT_SILENT_FOOTSTEPS, REF(src))
+
+/datum/component/shoe_footstep/proc/dropped(obj/item/source, mob/user, silent)
+ SIGNAL_HANDLER
+ REMOVE_TRAIT(user, TRAIT_SILENT_FOOTSTEPS, REF(src))
diff --git a/code/datums/components/shrink.dm b/code/datums/components/shrink.dm
index 0b32526e2b23..03ab2ed64e2a 100644
--- a/code/datums/components/shrink.dm
+++ b/code/datums/components/shrink.dm
@@ -15,20 +15,18 @@
parent_atom.set_opacity(FALSE)
if(isliving(parent_atom))
- var/mob/living/L = parent_atom
- ADD_TRAIT(L, TRAIT_UNDENSE, SHRUNKEN_TRAIT)
- RegisterSignal(L, COMSIG_MOB_SAY, PROC_REF(handle_shrunk_speech))
- L.add_movespeed_modifier(/datum/movespeed_modifier/shrink_ray)
- if(iscarbon(L))
- var/mob/living/carbon/C = L
- C.unequip_everything()
- C.visible_message(span_warning("[C]'s belongings fall off of [C.p_them()] as they shrink down!"),
+ var/mob/living/living = parent_atom
+ ADD_TRAIT(living, TRAIT_UNDENSE, SHRUNKEN_TRAIT)
+ RegisterSignal(living, COMSIG_MOB_SAY, PROC_REF(handle_shrunk_speech))
+ living.add_movespeed_modifier(/datum/movespeed_modifier/shrink_ray)
+ living.damage_resistance -= 100
+ if(iscarbon(living))
+ var/mob/living/carbon/carbon = living
+ carbon.unequip_everything()
+ carbon.visible_message(span_warning("[carbon]'s belongings fall off of [carbon.p_them()] as [carbon.p_they()] shrink down!"),
span_userdanger("Your belongings fall away as everything grows bigger!"))
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- H.physiology.damage_resistance -= 100//carbons take double damage while shrunk
- if(!L.GetComponent(/datum/component/squashable))
- newsquash = L.AddComponent( \
+ if(!living.GetComponent(/datum/component/squashable))
+ newsquash = living.AddComponent( \
/datum/component/squashable, \
squash_chance = 75, \
squash_damage = 10, \
@@ -52,13 +50,11 @@
parent_atom.transform = parent_atom.transform.Scale(2,2)
parent_atom.set_opacity(oldopac)
if(isliving(parent_atom))
- var/mob/living/L = parent_atom
- L.remove_movespeed_modifier(/datum/movespeed_modifier/shrink_ray)
- REMOVE_TRAIT(L, TRAIT_UNDENSE, SHRUNKEN_TRAIT)
- UnregisterSignal(L, COMSIG_MOB_SAY)
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- H.physiology.damage_resistance += 100
+ var/mob/living/living = parent_atom
+ living.remove_movespeed_modifier(/datum/movespeed_modifier/shrink_ray)
+ REMOVE_TRAIT(living, TRAIT_UNDENSE, SHRUNKEN_TRAIT)
+ UnregisterSignal(living, COMSIG_MOB_SAY)
+ living.damage_resistance += 100
else
parent_atom.set_density(olddens) // this is handled by the UNDENSE trait on mobs
return ..()
diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm
index edc48a512d22..43cbd05c412a 100644
--- a/code/datums/components/slippery.dm
+++ b/code/datums/components/slippery.dm
@@ -27,6 +27,8 @@
var/daze_time = 3 SECONDS
/// Flags for how slippery the parent is. See [__DEFINES/mobs.dm]
var/lube_flags
+ /// If we slip when we are attacked with
+ var/slip_on_damage = FALSE
/// Optional callback allowing you to define custom conditions for slipping
var/datum/callback/can_slip_callback
/// Optional call back that is called when a mob slips on this component
@@ -59,6 +61,7 @@
* * force_drop - should the crossing mob drop items in its hands or not
* * slot_whitelist - flags controlling where on a mob this item can be equipped to make the parent mob slippery full list [here][ITEM_SLOT_OCLOTHING]
* * datum/callback/on_slip_callback - Callback to add custom behaviours as the crossing mob is slipped
+ * * slip_on_damage - whether the component should cause slipping when the parent attacks the target
*/
/datum/component/slippery/Initialize(
knockdown,
@@ -69,6 +72,7 @@
force_drop = FALSE,
slot_whitelist,
datum/callback/can_slip_callback,
+ slip_on_damage = FALSE,
)
src.knockdown_time = max(knockdown, 0)
src.paralyze_time = max(paralyze, 0)
@@ -77,6 +81,7 @@
src.lube_flags = lube_flags
src.can_slip_callback = can_slip_callback
src.on_slip_callback = on_slip_callback
+ src.slip_on_damage = slip_on_damage
if(slot_whitelist)
src.slot_whitelist = slot_whitelist
@@ -89,6 +94,8 @@
RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop))
RegisterSignal(parent, COMSIG_ITEM_APPLY_FANTASY_BONUSES, PROC_REF(apply_fantasy_bonuses))
RegisterSignal(parent, COMSIG_ITEM_REMOVE_FANTASY_BONUSES, PROC_REF(remove_fantasy_bonuses))
+ RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(slip_on_afterattack))
+ RegisterSignal(parent, COMSIG_MOVABLE_IMPACT, PROC_REF(slip_on_throw_impact))
/datum/component/slippery/Destroy(force)
can_slip_callback = null
@@ -135,12 +142,13 @@
force_drop = FALSE,
slot_whitelist,
datum/callback/can_slip_callback,
+ slip_on_damage = FALSE,
)
if(component)
knockdown = component.knockdown_time
lube_flags = component.lube_flags
on_slip_callback = component.on_slip_callback
- can_slip_callback = component.on_slip_callback
+ can_slip_callback = component.can_slip_callback
paralyze = component.paralyze_time
daze = component.daze_time
force_drop = component.force_drop_items
@@ -153,6 +161,7 @@
src.lube_flags = lube_flags
src.on_slip_callback = on_slip_callback
src.can_slip_callback = can_slip_callback
+ src.slip_on_damage = slip_on_damage
if(slot_whitelist)
src.slot_whitelist = slot_whitelist
/**
@@ -171,7 +180,7 @@
if(HAS_TRAIT(turf, TRAIT_TURF_IGNORE_SLIPPERY))
return
var/mob/living/victim = arrived
- if(victim.movement_type & MOVETYPES_NOT_TOUCHING_GROUND)
+ if((victim.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) && !(lube_flags & SLIP_IN_NOGRAV))
return
if(can_slip_callback && !can_slip_callback.Invoke(holder, victim))
return
@@ -247,3 +256,19 @@
/datum/component/slippery/UnregisterFromParent()
. = ..()
qdel(GetComponent(/datum/component/connect_loc_behalf))
+
+/datum/component/slippery/proc/slip_on_afterattack(datum/source, atom/target, mob/user, ...)
+ SIGNAL_HANDLER
+
+ if(!slip_on_damage || !isliving(target))
+ return
+
+ Slip(source, target)
+
+/datum/component/slippery/proc/slip_on_throw_impact(datum/source, atom/hit_atom, datum/thrownthing/throwing_datum, caught)
+ SIGNAL_HANDLER
+
+ if(!slip_on_damage || !isliving(hit_atom) || caught)
+ return
+
+ Slip(source, hit_atom)
diff --git a/code/datums/components/space_camo.dm b/code/datums/components/space_camo.dm
index 267bcb894022..61c062bb8986 100644
--- a/code/datums/components/space_camo.dm
+++ b/code/datums/components/space_camo.dm
@@ -30,7 +30,7 @@
src.alpha_to_self = alpha_to_self
/datum/component/space_camo/RegisterWithParent()
- RegisterSignal(parent, COMSIG_ATOM_ENTERING, PROC_REF(on_atom_entering))
+ RegisterSignals(parent, list(COMSIG_ATOM_ENTERING, COMSIG_MOVABLE_TURF_INITIALIZING), PROC_REF(on_atom_entering))
if(!isliving(parent))
return
@@ -54,6 +54,7 @@
/datum/component/space_camo/UnregisterFromParent()
UnregisterSignal(parent, list(
COMSIG_ATOM_ENTERING,
+ COMSIG_MOVABLE_TURF_INITIALIZING,
COMSIG_ATOM_WAS_ATTACKED,
COMSIG_MOB_ITEM_ATTACK,
COMSIG_LIVING_UNARMED_ATTACK,
diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm
index e47b5235fb9c..1a1998dc6d69 100644
--- a/code/datums/components/uplink.dm
+++ b/code/datums/components/uplink.dm
@@ -45,7 +45,6 @@
enabled = FALSE,
uplink_flag = UPLINK_TRAITORS,
starting_tc = TELECRYSTALS_DEFAULT,
- has_progression = FALSE,
datum/uplink_handler/uplink_handler_override,
)
@@ -81,7 +80,6 @@
uplink_handler = new()
uplink_handler.uplink_flag = uplink_flag
uplink_handler.telecrystals = starting_tc
- uplink_handler.has_progression = has_progression
uplink_handler.purchase_log = purchase_log
else
uplink_handler = uplink_handler_override
@@ -167,9 +165,7 @@
return
var/list/data = list()
data["telecrystals"] = uplink_handler.telecrystals
- data["progression_points"] = uplink_handler.progression_points
data["joined_population"] = length(GLOB.joined_player_list)
- data["current_progression_scaling"] = SStraitor.current_progression_scaling
if(uplink_handler.primary_objectives)
var/list/primary_objectives = list()
@@ -204,7 +200,6 @@
"limited_stock" = item.limited_stock,
"restricted_roles" = item.restricted_roles,
"restricted_species" = item.restricted_species,
- "progression_minimum" = item.progression_minimum,
"population_minimum" = item.population_minimum,
"ref" = REF(item),
))
@@ -223,7 +218,6 @@
/datum/component/uplink/ui_static_data(mob/user)
var/list/data = list()
data["uplink_flag"] = uplink_handler.uplink_flag
- data["has_progression"] = uplink_handler.has_progression
data["lockable"] = lockable
data["assigned_role"] = uplink_handler.assigned_role
data["assigned_species"] = uplink_handler.assigned_species
diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm
index cc1120b31655..276ccbf53db2 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -409,9 +409,11 @@
if(!istype(target_organ))
return FALSE
- // robotic organs are immune to disease unless 'inorganic biology' symptom is present
+ // snowflake organ checks: grants immunity to disease unless 'inorganic biology' symptom is present
if(IS_ROBOTIC_ORGAN(target_organ) && !(infectable_biotypes & MOB_ROBOTIC))
return FALSE
+ if(IS_MINERAL_ORGAN(target_organ) && !(infectable_biotypes & MOB_MINERAL))
+ return FALSE
return TRUE
diff --git a/code/datums/elements/atmos_sensitive.dm b/code/datums/elements/atmos_sensitive.dm
index 4bc66246659b..7e5e5fde2eee 100644
--- a/code/datums/elements/atmos_sensitive.dm
+++ b/code/datums/elements/atmos_sensitive.dm
@@ -20,7 +20,7 @@
/datum/element/atmos_sensitive/Detach(atom/source)
if(source.loc)
- UnregisterSignal(source.loc, COMSIG_TURF_EXPOSE)
+ source.UnregisterSignal(source.loc, COMSIG_TURF_EXPOSE) // Attach registers this on the atom, not the element
UnregisterSignal(source, COMSIG_MOVABLE_MOVED)
if(source.flags_1 & ATMOS_IS_PROCESSING_1)
source.atmos_end()
diff --git a/code/datums/elements/clever_girl.dm b/code/datums/elements/clever_girl.dm
new file mode 100644
index 000000000000..e2f8e4a6fddf
--- /dev/null
+++ b/code/datums/elements/clever_girl.dm
@@ -0,0 +1,17 @@
+/datum/element/clever_girl
+
+/datum/element/clever_girl/Attach(datum/target)
+ . = ..()
+ if(!isliving(target))
+ return ELEMENT_INCOMPATIBLE
+ RegisterSignals(target, list(COMSIG_MOB_OPENED_AIRLOCK, COMSIG_MOB_OPENED_DOOR), PROC_REF(on_open_door))
+
+/datum/element/cleaning/Detach(datum/target)
+ . = ..()
+ UnregisterSignal(target, list(COMSIG_MOB_OPENED_AIRLOCK, COMSIG_MOB_OPENED_DOOR))
+
+/datum/element/clever_girl/proc/on_open_door(mob/living/source, forced)
+ SIGNAL_HANDLER
+ if (forced != DEFAULT_DOOR_CHECKS)
+ return
+ source.client?.give_award(/datum/award/achievement/misc/clever_girl, src)
diff --git a/code/datums/elements/cuffsnapping.dm b/code/datums/elements/cuffsnapping.dm
index 8dcaa7206071..725ba97d1a71 100644
--- a/code/datums/elements/cuffsnapping.dm
+++ b/code/datums/elements/cuffsnapping.dm
@@ -100,7 +100,7 @@
if(!istype(cuffs))
return NONE
- if(check_cuffs_strength(carbon_target, target, cutter_user, cuffs, span_notice("[cutter_user] tries to cut through [target]'s restraints with [cutter], but fails!")))
+ if(check_cuffs_strength(cutter, target, cutter_user, cuffs, span_notice("[cutter_user] tries to cut through [target]'s restraints with [cutter], but fails!")))
INVOKE_ASYNC(src, PROC_REF(do_cuffsnap_target), cutter, target, cutter_user, cuffs)
return COMPONENT_SKIP_ATTACK
@@ -124,12 +124,12 @@
///Called when a player tries to remove the cuffs binding an item to their owner
/datum/element/cuffsnapping/proc/try_cuffsnap_item(obj/item/cutter, mob/living/target, mob/living/cutter_user, obj/item/cuffed, obj/item/restraints/handcuffs/cuffs)
- if(check_cuffs_strength(cutter, target, cutter_user, cuffs, span_notice("[cutter_user] tries to cut through the restraints binding [cuffed] to [target], but fails!")))
+ if(!check_cuffs_strength(cutter, target, cutter_user, cuffs, span_notice("[cutter_user] tries to cut through the restraints binding [cuffed] to [target], but fails!")))
return
log_combat(cutter_user, target, "cut or tried to cut restraints binding [cuffed] to")
- do_snip_snap(cutter, target, cutter_user, cuffs, span_notice("[cutter_user] cuts the restraints binding [src] to [target] with [cutter]!"))
+ do_snip_snap(cutter, target, cutter_user, cuffs, span_notice("[cutter_user] cuts the restraints binding [cuffed] to [target] with [cutter]!"))
///The proc responsible for the very timed action that deletes the cuffs
/datum/element/cuffsnapping/proc/do_snip_snap(obj/item/cutter, mob/living/target, mob/cutter_user, obj/item/restraints/handcuffs/cuffs, message)
diff --git a/code/datums/elements/door_pryer.dm b/code/datums/elements/door_pryer.dm
index 76f5548f13db..4b25877b74ad 100644
--- a/code/datums/elements/door_pryer.dm
+++ b/code/datums/elements/door_pryer.dm
@@ -51,11 +51,11 @@
if (!airlock_target.hasPower())
attacker.visible_message(span_warning("[attacker] forces the [airlock_target] to open."))
attacker.log_message("Pried open [src], located at [loc_name(src)].", LOG_GAME)
- airlock_target.open(FORCING_DOOR_CHECKS)
+ airlock_target.open(FORCING_DOOR_CHECKS, attacker)
return
if (airlock_target.allowed(attacker))
- airlock_target.open(DEFAULT_DOOR_CHECKS)
+ airlock_target.open(DEFAULT_DOOR_CHECKS, attacker)
return
attacker.visible_message(\
@@ -75,5 +75,5 @@
return
attacker.visible_message(span_warning("[attacker] forces the [airlock_target] to open."))
attacker.log_message("Successfully pried open [src], located at [loc_name(src)].", LOG_GAME)
- airlock_target.open(BYPASS_DOOR_CHECKS)
+ airlock_target.open(BYPASS_DOOR_CHECKS, attacker)
airlock_target.take_damage(AIRLOCK_PRY_DAMAGE, BRUTE, sound_effect = FALSE)
diff --git a/code/datums/elements/elevation.dm b/code/datums/elements/elevation.dm
index fcf6f524ff0b..090d80b9dcdd 100644
--- a/code/datums/elements/elevation.dm
+++ b/code/datums/elements/elevation.dm
@@ -17,14 +17,14 @@
src.pixel_shift = pixel_shift
- RegisterSignal(target, COMSIG_ATOM_ENTERING, PROC_REF(on_source_entering))
+ RegisterSignals(target, list(COMSIG_ATOM_ENTERING, COMSIG_MOVABLE_TURF_INITIALIZING), PROC_REF(on_source_entering))
RegisterSignal(target, COMSIG_ATOM_EXITING, PROC_REF(on_source_exiting))
var/atom/atom_target = target
register_turf(atom_target, atom_target.loc)
/datum/element/elevation/Detach(atom/movable/source)
- UnregisterSignal(source, list(COMSIG_ATOM_ENTERING, COMSIG_ATOM_EXITING))
+ UnregisterSignal(source, list(COMSIG_ATOM_ENTERING, COMSIG_MOVABLE_TURF_INITIALIZING, COMSIG_ATOM_EXITING))
unregister_turf(source, source.loc)
REMOVE_TRAIT(source, TRAIT_ELEVATING_OBJECT, ref(src))
return ..()
diff --git a/code/datums/elements/falling_hazard.dm b/code/datums/elements/falling_hazard.dm
index 65ac6b4569f0..ef47855dc57f 100644
--- a/code/datums/elements/falling_hazard.dm
+++ b/code/datums/elements/falling_hazard.dm
@@ -59,9 +59,9 @@
// This does more damage the more levels the falling object has fallen
if(!crushes_people && target_head)
- poor_target.apply_damage(fall_damage * levels, def_zone = BODY_ZONE_HEAD, forced = TRUE, wound_bonus = fall_wound_bonus)
+ poor_target.apply_damage(fall_damage * levels, def_zone = BODY_ZONE_HEAD, wound_bonus = fall_wound_bonus)
else
- poor_target.apply_damage(fall_damage * levels, forced = TRUE, spread_damage = TRUE, wound_bonus = fall_wound_bonus)
+ poor_target.apply_damage(fall_damage * levels, spread_damage = TRUE, wound_bonus = fall_wound_bonus)
poor_target.visible_message(
span_userdanger("[source] falls on [poor_target], [crushes_people ? "crushing [poor_target.p_them()]" : "hitting [poor_target.p_them()]"] [target_head ? "on the head!" : "!"]"),
diff --git a/code/datums/elements/footstep.dm b/code/datums/elements/footstep.dm
index d837e58155b1..a674dea8c0cb 100644
--- a/code/datums/elements/footstep.dm
+++ b/code/datums/elements/footstep.dm
@@ -62,26 +62,22 @@
steps_for_living -= source
return ..()
-///Prepares a footstep for living mobs. Determines if it should get played. Returns the turf it should get played on. Note that it is always a /turf/open
-/datum/element/footstep/proc/prepare_step(mob/living/source)
+/datum/element/footstep/proc/play_craw_step(mob/living/source)
var/turf/open/turf = get_turf(source)
- if(!istype(turf))
+ if(!istype(turf) || !turf.footstep)
return
- if(source.buckled || source.throwing || source.movement_type & (VENTCRAWLING | FLYING) || HAS_TRAIT(source, TRAIT_IMMOBILIZED) || CHECK_MOVE_LOOP_FLAGS(source, MOVEMENT_LOOP_OUTSIDE_CONTROL))
- return
+ var/sound = 'sound/effects/footstep/crawl1.ogg'
+ if(HAS_TRAIT(source, TRAIT_FLOPPING))
+ sound = pick(SFX_FISH_PICKUP, 'sound/mobs/non-humanoids/fish/fish_drop1.ogg')
+ playsound(turf, sound, 15 * volume, falloff_distance = 1, vary = sound_vary)
- if(source.body_position == LYING_DOWN) //play crawling sound if we're lying
- if(turf.footstep)
- var/sound = 'sound/effects/footstep/crawl1.ogg'
- if(HAS_TRAIT(source, TRAIT_FLOPPING))
- sound = pick(SFX_FISH_PICKUP, 'sound/mobs/non-humanoids/fish/fish_drop1.ogg')
- playsound(turf, sound, 15 * volume, falloff_distance = 1, vary = sound_vary)
+///Prepares a footstep for living mobs. Determines if it should get played. Returns the turf it should get played on. Note that it is always a /turf/open
+/datum/element/footstep/proc/prepare_step(mob/living/source)
+ var/turf/open/turf = get_turf(source)
+ if(!istype(turf))
return
- if(iscarbon(source) && source.move_intent == MOVE_INTENT_WALK)
- return // stealth
-
steps_for_living[source] += 1
var/steps = steps_for_living[source]
@@ -119,10 +115,14 @@
/datum/element/footstep/proc/play_simplestep(mob/living/source, atom/oldloc, direction, forced, list/old_locs, momentum_change)
SIGNAL_HANDLER
- if(source.moving_diagonally == SECOND_DIAG_STEP)
- return // to prevent a diagonal step from counting as 2
+ if(forced || SHOULD_ATOM_DISABLE_FOOTSTEPS(source))
+ return
- if (forced || SHOULD_DISABLE_FOOTSTEPS(source))
+ if(source.body_position == LYING_DOWN)
+ play_craw_step(source)
+ return
+
+ if(HAS_TRAIT(source, TRAIT_SILENT_FOOTSTEPS) || SHOULD_MOB_DISABLE_FOOTSTEPS(source))
return
var/list/prepared_steps = prepare_step(source)
@@ -142,10 +142,14 @@
/datum/element/footstep/proc/play_humanstep(mob/living/carbon/human/source, atom/oldloc, direction, forced, list/old_locs, momentum_change)
SIGNAL_HANDLER
- if(source.moving_diagonally == SECOND_DIAG_STEP)
- return // to prevent a diagonal step from counting as 2
+ if(forced || SHOULD_ATOM_DISABLE_FOOTSTEPS(source) || !momentum_change)
+ return
+
+ if(source.body_position == LYING_DOWN)
+ play_craw_step(source)
+ return
- if (forced || SHOULD_DISABLE_FOOTSTEPS(source) || !momentum_change)
+ if(HAS_TRAIT(source, TRAIT_SILENT_FOOTSTEPS) || SHOULD_MOB_DISABLE_FOOTSTEPS(source))
return
var/list/prepared_steps = prepare_step(source)
@@ -180,6 +184,28 @@
footstep_sounds = GLOB.heavyfootstep[prepared_steps[footstep_type]]
if(FOOTSTEP_MOB_SHOE)
footstep_sounds = GLOB.footstep[prepared_steps[footstep_type]]
+ if(FOOTSTEP_MOB_SYNTHETIC)
+ var/barefoot_type = prepared_steps[FOOTSTEP_MOB_BAREFOOT]
+ // these categories will use the synthetic step over the normal barefoot steps
+ var/static/list/synthetic_footstep_types = list(
+ FOOTSTEP_CARPET_BAREFOOT = 1,
+ FOOTSTEP_HARD_BAREFOOT = 1,
+ FOOTSTEP_WOOD_BAREFOOT = 1,
+ )
+ // the actual synthetic footstep sound
+ var/static/list/synthetic_footsteps = list(
+ /*sounds = */list(
+ 'sound/items/modsuit/rigstep.ogg' = 1,
+ 'sound/items/modsuit/rigstep.ogg' = 1,
+ ),
+ /*volume = */50,
+ /*extrarange= */2,
+ )
+
+ if(synthetic_footstep_types[barefoot_type])
+ footstep_sounds = synthetic_footsteps
+ else
+ footstep_sounds = GLOB.barefootstep[barefoot_type]
if(null)
return
else
@@ -197,6 +223,9 @@
volume_multiplier = 0.6
range_adjustment = -2
+ if(HAS_TRAIT(source, TRAIT_OBFUSCATED)) // DARKPACK EDIT ADD START - POWERS - Cancels footstep noise
+ return // DARKPACK EDIT ADD END - POWERS
+
// list returned by playsound() filled by client mobs who heard the footstep. given to play_fov_effect()
var/list/heard_clients
var/picked_sound = pick(footstep_sounds[1])
@@ -220,17 +249,14 @@
/datum/element/footstep/proc/play_simplestep_machine(atom/movable/source, atom/oldloc, direction, forced, list/old_locs, momentum_change)
SIGNAL_HANDLER
- if(source.moving_diagonally == SECOND_DIAG_STEP)
- return // to prevent a diagonal step from counting as 2
+ if(forced || SHOULD_ATOM_DISABLE_FOOTSTEPS(source))
+ return
- if (forced || SHOULD_DISABLE_FOOTSTEPS(source))
+ if(HAS_TRAIT(source, TRAIT_SILENT_FOOTSTEPS))
return
var/turf/open/source_loc = get_turf(source)
if(!istype(source_loc))
return
- if(CHECK_MOVE_LOOP_FLAGS(source, MOVEMENT_LOOP_OUTSIDE_CONTROL))
- return
-
playsound(source_loc, footstep_sounds, 50, falloff_distance = 1, vary = sound_vary)
diff --git a/code/datums/elements/on_hit_effect.dm b/code/datums/elements/on_hit_effect.dm
index 9abcd6aaedd2..f56cd90f7d00 100644
--- a/code/datums/elements/on_hit_effect.dm
+++ b/code/datums/elements/on_hit_effect.dm
@@ -49,7 +49,7 @@
on_hit(attacker, attacker, target, attacker.zone_selected)
-/datum/element/on_hit_effect/proc/human_punched(mob/living/carbon/human/attacker, mob/living/carbon/human/target, damage, damage_type, obj/item/bodypart/hit, ...)
+/datum/element/on_hit_effect/proc/human_punched(mob/living/carbon/human/attacker, mob/living/carbon/human/target, damage, damage_type, atk_effect, obj/item/bodypart/hit, ...)
SIGNAL_HANDLER
on_hit(attacker, attacker, target, hit.body_zone)
diff --git a/code/datums/elements/squish_sound.dm b/code/datums/elements/squish_sound.dm
index a245bb48a73c..8ea5cbcd13e5 100644
--- a/code/datums/elements/squish_sound.dm
+++ b/code/datums/elements/squish_sound.dm
@@ -22,6 +22,6 @@
playsound(
source = source,
soundin = sound_to_play,
- vol = HAS_TRAIT(crossed, TRAIT_LIGHT_STEP) ? 20 : 50,
+ vol = (HAS_TRAIT(crossed, TRAIT_LIGHT_STEP) || HAS_TRAIT(crossed, TRAIT_OBFUSCATED)) ? 20 : 50, // DARKPACK EDIT CHANGE - POWERS
vary = TRUE,
)
diff --git a/code/datums/elements/strip_accessible_storage.dm b/code/datums/elements/strip_accessible_storage.dm
new file mode 100644
index 000000000000..3012289ae18f
--- /dev/null
+++ b/code/datums/elements/strip_accessible_storage.dm
@@ -0,0 +1,60 @@
+/// Apply to an atom to allow it people to access its storage through the strip menu directly
+/datum/element/strip_accessible_storage
+
+/datum/element/strip_accessible_storage/Attach(obj/item/target)
+ . = ..()
+ if(!isitem(target) || isnull(target.atom_storage))
+ return ELEMENT_INCOMPATIBLE
+
+ RegisterSignal(target, COMSIG_ITEM_GET_STRIPPABLE_ALT_ACTIONS, PROC_REF(get_strippable_alternate_actions))
+ RegisterSignal(target, COMSIG_ITEM_STRIPPABLE_ALT_ACTION, PROC_REF(do_strippable_action))
+ ADD_TRAIT(target, TRAIT_SKIP_BASIC_REACH_CHECK, ELEMENT_TRAIT(type))
+
+/datum/element/strip_accessible_storage/Detach(obj/item/source, ...)
+ . = ..()
+ UnregisterSignal(source, COMSIG_ITEM_GET_STRIPPABLE_ALT_ACTIONS)
+ UnregisterSignal(source, COMSIG_ITEM_STRIPPABLE_ALT_ACTION)
+ REMOVE_TRAIT(source, TRAIT_SKIP_BASIC_REACH_CHECK, ELEMENT_TRAIT(type))
+ source.atom_storage?.close_all_non_wearers()
+
+/datum/element/strip_accessible_storage/proc/get_strippable_alternate_actions(obj/item/source, atom/owner, mob/user, list/alt_actions)
+ SIGNAL_HANDLER
+ if(!can_access_storage(source, owner, user))
+ return
+ alt_actions += "access_storage"
+
+/datum/element/strip_accessible_storage/proc/do_strippable_action(obj/item/source, atom/owner, mob/living/user, action_key)
+ SIGNAL_HANDLER
+ if(action_key != "access_storage")
+ return NONE
+ if(!isliving(user))
+ return NONE
+
+ INVOKE_ASYNC(src, PROC_REF(attempt_access), source, owner, user)
+ return COMPONENT_ALT_ACTION_DONE
+
+/datum/element/strip_accessible_storage/proc/can_access_storage(obj/item/source, atom/owner, mob/living/user)
+ if(QDELETED(source) || QDELETED(owner) || QDELETED(user))
+ return FALSE
+ if(source.atom_storage.locked)
+ return FALSE
+ if(!(user.mobility_flags & MOBILITY_STORAGE))
+ return FALSE
+ if(source.atom_storage.quickdraw)
+ return FALSE
+ return TRUE
+
+/datum/element/strip_accessible_storage/proc/attempt_access(obj/item/source, atom/owner, mob/living/user)
+ owner.visible_message(
+ span_warning("[user] tries to open [owner]'s [source]..."),
+ span_userdanger("[user] is trying to open your [source]!"),
+ blind_message = span_hear("You hear rustling."),
+ ignored_mobs = user,
+ )
+ to_chat(user, span_notice("You try to open [owner]'s [source]..."))
+ if(astype(owner, /mob)?.is_blind())
+ to_chat(owner, span_userdanger("Someone is trying to open your [source]!"))
+
+ if(!do_after(user, source.strip_delay + 1 SECONDS, owner, extra_checks = CALLBACK(src, PROC_REF(can_access_storage), source, owner, user) ))
+ return
+ source.atom_storage.open_storage(user)
diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm
index f440cd9fe95e..75d61f2fa907 100644
--- a/code/datums/emotes.dm
+++ b/code/datums/emotes.dm
@@ -184,6 +184,11 @@
viewer.show_message(span_emote("[GET_GUESTBOOK_NAME(viewer, user)][space][msg]"), MSG_AUDIBLE) // DARKPACK EDIT CHANGE - ORIGINAL: viewer.show_message(span_emote("[user] [msg]"), MSG_AUDIBLE)
else if(is_visual)
viewer.show_message(span_emote("[GET_GUESTBOOK_NAME(viewer, user)][space][msg]"), MSG_VISUAL) // DARKPACK EDIT CHANGE - ORIGINAL: viewer.show_message(span_emote("[user] [msg]"), MSG_VISUAL)
+
+ // AI-eye emotes
+ if(is_visual)
+ relay_visual_emote_to_ai_runechat(user, msg)
+
return // Early exit so no dchat message
// The emote has some important information, and should always be shown to the user
@@ -222,6 +227,9 @@
else
CRASH("Emote [type] has no valid emote type set!")
+ if(is_visual)
+ relay_visual_emote_to_ai_runechat(user, msg)
+
if(!isnull(user.client))
// var/dchatmsg = "[user][space][msg]" // DARKPACK EDIT REMOVAL
for(var/mob/ghost as anything in GLOB.dead_mob_list - viewers(get_turf(user)))
@@ -458,6 +466,7 @@
if (log_emote)
log_message(text, LOG_EMOTE)
visible_message(text, visible_message_flags = EMOTE_MESSAGE)
+
return TRUE
/mob/manual_emote(text, log_emote = null)
@@ -468,6 +477,9 @@
. = ..(text, log_emote)
if (!.)
return FALSE
+
+ relay_visual_emote_to_ai_runechat(src, text)
+
if (!client)
return TRUE
var/ghost_text = "[src] [text]"
@@ -478,3 +490,50 @@
if(get_chat_toggles(ghost.client) & CHAT_GHOSTSIGHT && !(ghost in viewers(origin_turf, null)))
ghost.show_message("[FOLLOW_LINK(ghost, src)] [ghost_text]")
return TRUE
+
+/// AI can also see emotes!
+/proc/ai_eye_turf_in_view(mob/eye/camera/ai/eye, turf/target_turf)
+ if(!eye || !target_turf)
+ return FALSE
+
+ var/turf/eye_turf = get_turf(eye)
+ if(!eye_turf || eye_turf.z != target_turf.z)
+ return FALSE
+
+ if(!SScameras || !SScameras.is_visible_by_cameras(eye_turf) || !SScameras.is_visible_by_cameras(target_turf))
+ return FALSE
+
+ return (target_turf in eye.get_visible_turfs())
+
+/proc/relay_visual_emote_to_ai_runechat(mob/user, msg)
+ var/turf/user_turf = get_turf(user)
+ if(!user_turf)
+ return
+
+ for(var/mob/living/silicon/ai/AI as anything in GLOB.ai_list)
+ if(!AI?.client)
+ continue
+
+ if(AI in viewers(user))// Avoid duplicates if the AI is nearby
+ continue
+
+ var/relayed = FALSE
+
+ var/atom/active_eye = AI.client.eye
+ if(istype(active_eye, /mob/eye/camera/ai))
+ var/mob/eye/camera/ai/ai_eye = active_eye
+ if(ai_eye.ai == AI && ai_eye_turf_in_view(ai_eye, user_turf))
+ to_chat(AI, span_emote("You see how [user] [msg]"))
+
+ if(user.runechat_prefs_check(AI, EMOTE_MESSAGE))
+ AI.create_chat_message(speaker = user, raw_message = msg, runechat_flags = EMOTE_MESSAGE)
+ relayed = TRUE
+
+ if(!relayed && AI.multicam_on) // Multicam
+ for(var/mob/eye/camera/ai/ai_eye as anything in AI.all_eyes)
+ if(ai_eye_turf_in_view(ai_eye, user_turf))
+ to_chat(AI, span_emote("You see how [user] [msg]"))
+
+ if(user.runechat_prefs_check(AI, EMOTE_MESSAGE))
+ AI.create_chat_message(speaker = user, raw_message = msg, runechat_flags = EMOTE_MESSAGE)
+ break
diff --git a/code/datums/greyscale/json_configs/pet_carrier.json b/code/datums/greyscale/json_configs/pet_carrier.json
index a1a97da75e7f..17682e30a39b 100644
--- a/code/datums/greyscale/json_configs/pet_carrier.json
+++ b/code/datums/greyscale/json_configs/pet_carrier.json
@@ -10,32 +10,14 @@
"icon_state": "pet_carrier_gags",
"blend_mode": "overlay",
"color_ids": [1]
- }
- ],
- "pet_carrier_closed_unlocked": [
- {
- "type": "icon_state",
- "icon_state": "pet_carrier_unlocked",
- "blend_mode": "overlay"
},
{
"type": "icon_state",
- "icon_state": "pet_carrier_closed",
+ "icon_state": "pet_carrier_door",
"blend_mode": "overlay"
- },
- {
- "type": "icon_state",
- "icon_state": "pet_carrier_gags",
- "blend_mode": "overlay",
- "color_ids": [1]
}
],
- "pet_carrier_closed_locked": [
- {
- "type": "icon_state",
- "icon_state": "pet_carrier_locked",
- "blend_mode": "overlay"
- },
+ "pet_carrier_closed": [
{
"type": "icon_state",
"icon_state": "pet_carrier_closed",
@@ -48,12 +30,7 @@
"color_ids": [1]
}
],
- "pet_carrier_occupied_unlocked": [
- {
- "type": "icon_state",
- "icon_state": "pet_carrier_unlocked",
- "blend_mode": "overlay"
- },
+ "pet_carrier_occupied": [
{
"type": "icon_state",
"icon_state": "pet_carrier_occupied",
@@ -66,22 +43,18 @@
"color_ids": [1]
}
],
- "pet_carrier_occupied_locked": [
+ "pet_carrier_unlocked": [
{
"type": "icon_state",
- "icon_state": "pet_carrier_locked",
+ "icon_state": "pet_carrier_unlocked",
"blend_mode": "overlay"
- },
+ }
+ ],
+ "pet_carrier_locked": [
{
"type": "icon_state",
- "icon_state": "pet_carrier_occupied",
+ "icon_state": "pet_carrier_locked",
"blend_mode": "overlay"
- },
- {
- "type": "icon_state",
- "icon_state": "pet_carrier_gags",
- "blend_mode": "overlay",
- "color_ids": [1]
}
]
}
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index 86c7b443b523..cd6017efca1b 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -273,50 +273,3 @@
return FALSE
return TRUE
-
-//Gets the topmost teleportable container
-/proc/get_teleportable_container(atom/movable/teleportable, container_flags = ALL)
- while(ismovable(teleportable.loc))
- if(!(container_flags & TELEPORT_CONTAINER_INCLUDE_STORAGE) && isitem(teleportable))
- var/obj/item/item = teleportable
- if(item.item_flags & IN_STORAGE)
- break
- var/atom/movable/movable = teleportable.loc
- if(movable.anchored)
- break
- if(isliving(movable))
- var/mob/living/living = movable
- if(!(container_flags & TELEPORT_CONTAINER_INCLUDE_INVENTORY))
- var/list/equipped = living.get_equipped_items(INCLUDE_HELD|INCLUDE_POCKETS)
- if((teleportable in equipped) && !HAS_TRAIT(teleportable, TRAIT_NODROP))
- if(istype(teleportable, /obj/item/mod/control) && (container_flags & TELEPORT_CONTAINER_INCLUDE_SEALED_MODSUIT))
- var/obj/item/mod/control/modsuit = teleportable
- var/sealed = TRUE
- for(var/datum/mod_part/part as anything in modsuit.get_part_datums(TRUE))
- if((part.part_item == modsuit || part.part_item.loc != modsuit) && !part.sealed)
- sealed = FALSE
- break
- if(!sealed)
- break
- else
- break
- if(living.buckled)
- if(living.buckled.anchored)
- break
- else
- var/obj/buckled_obj = living.buckled
- buckled_obj.unbuckle_mob(living)
- if(!(container_flags & TELEPORT_CONTAINER_INCLUDE_CLOSET) && iscloset(movable))
- break
- if(!(container_flags & TELEPORT_CONTAINER_INCLUDE_MECH_EQUIPMENT) && istype(movable, /obj/item/mecha_parts/mecha_equipment))
- break
- if(!(container_flags & TELEPORT_CONTAINER_INCLUDE_VEHICLE) && isvehicle(movable))
- var/obj/vehicle/vehicle = movable
- if(vehicle.is_occupant(teleportable))
- break
- if(!(container_flags & TELEPORT_CONTAINER_INCLUDE_STOMACH) && istype(movable, /obj/item/organ/stomach))
- var/obj/item/organ/stomach/stomach = movable
- if(teleportable in stomach.stomach_contents)
- break
- teleportable = movable
- return teleportable
diff --git a/code/datums/instability_meltdown.dm b/code/datums/instability_meltdown.dm
index 508f74885c7b..ee67c5736aa7 100644
--- a/code/datums/instability_meltdown.dm
+++ b/code/datums/instability_meltdown.dm
@@ -44,7 +44,7 @@
/datum/instability_meltdown/not_alright/meltdown(mob/living/carbon/human/victim)
to_chat(victim, span_notice("Oh, I actually feel quite alright!"))
- victim.physiology.damage_resistance -= 20000 //you thought
+ victim.damage_resistance -= 20000
victim.log_message("has received x200 damage multiplier from [type] genetic meltdown")
/// Turns you into a slime
diff --git a/code/datums/looping_sounds/music.dm b/code/datums/looping_sounds/music.dm
index cc35ab8a8ee3..688152428915 100644
--- a/code/datums/looping_sounds/music.dm
+++ b/code/datums/looping_sounds/music.dm
@@ -1,3 +1,53 @@
+/** Boombox music */
+/datum/looping_sound/boombox
+ mid_sounds = list(
+ 'sound/music/boombox/industrial-crush.ogg' = 1,
+ )
+ mid_length = 30.0 SECONDS
+ volume = 50
+ vary = FALSE
+ use_reverb = FALSE
+ sound_channel = CHANNEL_JUKEBOX
+ extra_range = MEDIUM_RANGE_SOUND_EXTRARANGE
+ falloff_exponent = 1
+ use_sound_tokens = TRUE
+
+/datum/looping_sound/boombox/rock
+ mid_sounds = list(
+ 'sound/music/boombox/bainmack-rock.ogg' = 1,
+ )
+ mid_length = 40.3 SECONDS
+ volume = 50
+
+/datum/looping_sound/boombox/hiphop
+ mid_sounds = list(
+ 'sound/music/boombox/groovepad-hiphop.ogg' = 1,
+ )
+ mid_length = 73.0 SECONDS
+ volume = 50
+
+/datum/looping_sound/boombox/jazz
+ mid_sounds = list(
+ 'sound/music/boombox/frankyboomer-jazz.ogg' = 1,
+ )
+ mid_length = 58.3 SECONDS
+ volume = 60
+
+/datum/looping_sound/boombox/pop
+ mid_sounds = list(
+ 'sound/music/boombox/bubblegum-pop.ogg' = 1,
+ )
+ mid_length = 117.0 SECONDS
+ volume = 50
+
+/datum/looping_sound/boombox/robocop
+ mid_sounds = list(
+ 'sound/music/elevator/robocop-short.ogg' = 1,
+ )
+ mid_length = 61 SECONDS
+ volume = 20
+
+/** Elevator music */
/datum/looping_sound/local_forecast
mid_sounds = list(
'sound/music/elevator/robocop-short.ogg' = 1,
@@ -8,4 +58,3 @@
use_reverb = FALSE
direct = TRUE
sound_channel = CHANNEL_ELEVATOR
-
diff --git a/code/datums/mapgen/Cavegens/IcemoonCaves.dm b/code/datums/mapgen/Cavegens/IcemoonCaves.dm
index 0025d1a65829..cf683f35423d 100644
--- a/code/datums/mapgen/Cavegens/IcemoonCaves.dm
+++ b/code/datums/mapgen/Cavegens/IcemoonCaves.dm
@@ -17,11 +17,14 @@
)
weighted_flora_spawn_list = list(
- /obj/structure/flora/ash/chilly = 2,
- /obj/structure/flora/grass/both/style_random = 6,
- /obj/structure/flora/rock/icy/style_random = 2,
- /obj/structure/flora/rock/pile/icy/style_random = 2,
- /obj/structure/flora/tree/pine/style_random = 2,
+ /obj/structure/flora/ash/chilly = 3,
+ /obj/structure/flora/grass/both/style_random = 8,
+ /obj/structure/flora/rock/icy/style_random = 3,
+ /obj/structure/flora/rock/pile/icy/style_random = 3,
+ /obj/structure/flora/tree/pine/style_random = 3,
+ /obj/structure/flora/ash/fonarstolbe = 1,
+ /obj/structure/flora/ash/vahrezjia = 1,
+ /obj/structure/flora/ash/drake_beet = 1,
)
///Note that this spawn list is also in the lavaland generator
@@ -99,4 +102,10 @@
/obj/structure/flora/rock/icy/style_random = 6,
/obj/structure/flora/rock/pile/icy/style_random = 6,
/obj/structure/flora/ash/chilly = 1,
+ /obj/structure/flora/ash/fonarstolbe = 1,
+ /obj/structure/flora/ash/vahrezjia = 1,
+ /obj/structure/flora/ash/podsneyzka = 1,
+ /obj/structure/flora/ash/inozhakust = 1,
+ /obj/structure/flora/ash/plasma_flower = 1,
+ /obj/structure/flora/ash/drake_beet = 1,
)
diff --git a/code/datums/martial/kaza_ruk.dm b/code/datums/martial/kaza_ruk.dm
index b264022dfe13..d935a6538425 100644
--- a/code/datums/martial/kaza_ruk.dm
+++ b/code/datums/martial/kaza_ruk.dm
@@ -220,17 +220,17 @@
/// First, determine if we're going to execute our followup attack
-/datum/martial_art/kaza_ruk/proc/blow_followup(mob/living/source, mob/living/target, damage, attack_type, obj/item/bodypart/affecting, final_armor_block, kicking, limb_sharpness)
+/datum/martial_art/kaza_ruk/proc/blow_followup(mob/living/source, mob/living/target, damage, attack_type, atk_effect, obj/item/bodypart/affecting, final_armor_block, limb_sharpness)
SIGNAL_HANDLER
if(!prob(50))
return
- addtimer(CALLBACK(src, PROC_REF(execute_followup), source, target, damage, attack_type, affecting, final_armor_block, kicking, limb_sharpness), 0.25 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(execute_followup), source, target, damage, attack_type, atk_effect, affecting, final_armor_block, limb_sharpness), 0.25 SECONDS)
/// After our delay, do the followup.
-/datum/martial_art/kaza_ruk/proc/execute_followup(mob/living/source, mob/living/target, damage, attack_type, obj/item/bodypart/affecting, final_armor_block, kicking, limb_sharpness)
+/datum/martial_art/kaza_ruk/proc/execute_followup(mob/living/source, mob/living/target, damage, attack_type, atk_effect, obj/item/bodypart/affecting, final_armor_block, limb_sharpness)
if(QDELETED(source) || QDELETED(target))
return
@@ -238,6 +238,7 @@
return
var/tail_usage = FALSE
+ var/kicking = (atk_effect == ATTACK_EFFECT_KICK)
var/kick_language = "an axe kick"
var/strike_language = "an elbow strike"
if(ishuman(source))
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 321005730528..ff7b491f4c09 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -458,7 +458,7 @@
H.Paralyze(8 SECONDS)
if(H.staminaloss && !H.IsSleeping())
var/total_health = (H.health - H.staminaloss)
- if(total_health <= HEALTH_THRESHOLD_CRIT && !IS_UNCONSCIOUS_OR_CRIT(H))
+ if(total_health <= H.crit_threshold && !IS_UNCONSCIOUS_OR_CRIT(H))
H.visible_message(span_warning("[user] delivers a heavy hit to [H]'s head, knocking [H.p_them()] out cold!"), \
span_userdanger("You're knocked unconscious by [user]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, user)
to_chat(user, span_danger("You deliver a heavy hit to [H]'s head, knocking [H.p_them()] out cold!"))
diff --git a/code/datums/martial/spiders_bite.dm b/code/datums/martial/spiders_bite.dm
index a5d6ddaa369c..902fa6729165 100644
--- a/code/datums/martial/spiders_bite.dm
+++ b/code/datums/martial/spiders_bite.dm
@@ -29,10 +29,10 @@
UnregisterSignal(old_holder, COMSIG_HUMAN_PUNCHED)
QDEL_NULL(tackle_comp)
-/datum/martial_art/spiders_bite/proc/kick_disarm(mob/living/source, mob/living/target, damage, attack_type, obj/item/bodypart/affecting, final_armor_block, kicking, limb_sharpness)
+/datum/martial_art/spiders_bite/proc/kick_disarm(mob/living/source, mob/living/target, damage, attack_type, atk_effect, obj/item/bodypart/affecting, final_armor_block, limb_sharpness)
SIGNAL_HANDLER
- if(!kicking)
+ if(atk_effect != ATTACK_EFFECT_KICK)
last_hit_ref = null
return
var/new_hit_ref = REF(target)
diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm
index 4846a60dd8e0..c079098b8016 100644
--- a/code/datums/mind/_mind.dm
+++ b/code/datums/mind/_mind.dm
@@ -440,18 +440,6 @@
U.uplink_handler.set_telecrystals(crystals)
message_admins("[key_name_admin(usr)] changed [current]'s telecrystal count to [crystals].")
log_admin("[key_name(usr)] changed [current]'s telecrystal count to [crystals].")
- if("progression")
- if(!check_rights(R_FUN))
- return
- var/datum/component/uplink/uplink = find_syndicate_uplink()
- if(!uplink)
- return
- var/progression = input("Set new progression points for [key]","Syndicate uplink", uplink.uplink_handler.progression_points) as null | num
- if(isnull(progression))
- return
- uplink.uplink_handler.progression_points = progression
- message_admins("[key_name_admin(usr)] changed [current]'s progression point count to [progression].")
- log_admin("[key_name(usr)] changed [current]'s progression point count to [progression].")
if("uplink")
var/datum/antagonist/traitor/traitor_datum = has_antag_datum(/datum/antagonist/traitor)
if(!give_uplink(antag_datum = traitor_datum || null))
diff --git a/code/datums/mind/antag.dm b/code/datums/mind/antag.dm
index d277c3cffada..3a90b2ddecb7 100644
--- a/code/datums/mind/antag.dm
+++ b/code/datums/mind/antag.dm
@@ -182,7 +182,7 @@
add_antag_datum(/datum/antagonist/cult)
else if(IS_REVOLUTIONARY(creator))
- var/datum/antagonist/rev/converter = creator.mind.has_antag_datum(/datum/antagonist/rev,TRUE)
+ var/datum/antagonist/rev/converter = creator.mind.has_antag_datum(/datum/antagonist/rev, TRUE)
converter.add_revolutionary(src, stun = FALSE, mute = FALSE)
else if(IS_NUKE_OP(creator))
diff --git a/code/datums/mocking/client.dm b/code/datums/mocking/client.dm
index 79611ef0e9d0..b434ca9a2481 100644
--- a/code/datums/mocking/client.dm
+++ b/code/datums/mocking/client.dm
@@ -88,3 +88,6 @@
/datum/client_interface/proc/check_drag_proximity(atom/dragging, atom/over, src_location, over_location, src_control, over_control, params)
return FALSE
+
+/datum/client_interface/proc/update_parallax_prefs()
+ return
diff --git a/code/datums/mood.dm b/code/datums/mood.dm
index aac4e5f92769..0c1d9e45efce 100644
--- a/code/datums/mood.dm
+++ b/code/datums/mood.dm
@@ -597,36 +597,22 @@
SEND_SIGNAL(mob_parent, COMSIG_CARBON_SANITY_UPDATE, amount)
switch(sanity)
if(SANITY_INSANE to SANITY_CRAZY)
- set_insanity_effect(MAJOR_INSANITY_PEN)
- mob_parent.add_movespeed_modifier(/datum/movespeed_modifier/sanity/insane)
- mob_parent.add_actionspeed_modifier(/datum/actionspeed_modifier/low_sanity)
sanity_level = SANITY_LEVEL_INSANE
if(SANITY_CRAZY to SANITY_UNSTABLE)
- set_insanity_effect(MINOR_INSANITY_PEN)
- mob_parent.add_movespeed_modifier(/datum/movespeed_modifier/sanity/crazy)
- mob_parent.add_actionspeed_modifier(/datum/actionspeed_modifier/low_sanity)
sanity_level = SANITY_LEVEL_CRAZY
if(SANITY_UNSTABLE to SANITY_DISTURBED)
- set_insanity_effect(0)
- mob_parent.add_movespeed_modifier(/datum/movespeed_modifier/sanity/disturbed)
- mob_parent.add_actionspeed_modifier(/datum/actionspeed_modifier/low_sanity)
sanity_level = SANITY_LEVEL_UNSTABLE
if(SANITY_DISTURBED to SANITY_NEUTRAL)
- set_insanity_effect(0)
- mob_parent.remove_movespeed_modifier(MOVESPEED_ID_SANITY)
- mob_parent.remove_actionspeed_modifier(ACTIONSPEED_ID_SANITY)
sanity_level = SANITY_LEVEL_DISTURBED
if(SANITY_NEUTRAL+1 to SANITY_GREAT+1) //shitty hack but +1 to prevent it from responding to super small differences
- set_insanity_effect(0)
- mob_parent.remove_movespeed_modifier(MOVESPEED_ID_SANITY)
- mob_parent.add_actionspeed_modifier(/datum/actionspeed_modifier/high_sanity)
sanity_level = SANITY_LEVEL_NEUTRAL
if(SANITY_GREAT+1 to INFINITY)
- set_insanity_effect(0)
- mob_parent.remove_movespeed_modifier(MOVESPEED_ID_SANITY)
- mob_parent.add_actionspeed_modifier(/datum/actionspeed_modifier/high_sanity)
sanity_level = SANITY_LEVEL_GREAT
+ set_crit_threshold()
+ set_movespeed_effect()
+ set_actionspeed_effect()
+
// Crazy or insane = add some uncommon hallucinations
if(sanity_level >= SANITY_LEVEL_CRAZY)
mob_parent.apply_status_effect(/datum/status_effect/hallucination/sanity)
@@ -643,13 +629,39 @@
/datum/mood/proc/adjust_sanity(amount, minimum = SANITY_INSANE, maximum = SANITY_GREAT, override = FALSE)
set_sanity(sanity + amount, minimum, maximum, override)
-/// Sets the insanity effect on the mob
-/datum/mood/proc/set_insanity_effect(newval)
+/// Sets the crit threshold of the mob
+/datum/mood/proc/set_crit_threshold()
+ var/newval = 0
+ switch(sanity_level)
+ if(SANITY_LEVEL_INSANE)
+ newval = MAJOR_INSANITY_PEN
+ if(SANITY_LEVEL_CRAZY)
+ newval = MINOR_INSANITY_PEN
if (newval == insanity_effect)
return
mob_parent.crit_threshold = (mob_parent.crit_threshold - insanity_effect) + newval
insanity_effect = newval
+/datum/mood/proc/set_movespeed_effect()
+ switch(sanity_level)
+ if(SANITY_LEVEL_INSANE)
+ mob_parent.add_movespeed_modifier(/datum/movespeed_modifier/sanity/insane)
+ if(SANITY_LEVEL_CRAZY)
+ mob_parent.add_movespeed_modifier(/datum/movespeed_modifier/sanity/crazy)
+ if(SANITY_LEVEL_UNSTABLE)
+ mob_parent.add_movespeed_modifier(/datum/movespeed_modifier/sanity/disturbed)
+ else
+ mob_parent.remove_movespeed_modifier(MOVESPEED_ID_SANITY)
+
+/datum/mood/proc/set_actionspeed_effect()
+ switch(sanity_level)
+ if(SANITY_LEVEL_INSANE, SANITY_LEVEL_CRAZY, SANITY_LEVEL_UNSTABLE)
+ mob_parent.add_actionspeed_modifier(/datum/actionspeed_modifier/low_sanity)
+ if(SANITY_LEVEL_NEUTRAL, SANITY_LEVEL_GREAT)
+ mob_parent.add_actionspeed_modifier(/datum/actionspeed_modifier/high_sanity)
+ else
+ mob_parent.remove_actionspeed_modifier(ACTIONSPEED_ID_SANITY)
+
/// Removes all temporary moods
/datum/mood/proc/remove_temp_moods()
for (var/category in mood_events)
@@ -677,6 +689,12 @@
return TRUE
return FALSE
+
+/datum/mood/dummy
+
+/datum/mood/dummy/set_sanity(amount, minimum, maximum, override)
+ return
+
#undef MINOR_INSANITY_PEN
#undef MAJOR_INSANITY_PEN
#undef MOOD_CATEGORY_NUTRITION
diff --git a/code/datums/mutations/_mutations.dm b/code/datums/mutations/_mutations.dm
index d55098fdfa12..d0f4f05547c7 100644
--- a/code/datums/mutations/_mutations.dm
+++ b/code/datums/mutations/_mutations.dm
@@ -25,7 +25,7 @@
/// Description of the mutation
var/desc = "A mutation."
/// Is this mutation currently locked?
- var/locked
+ var/locked = FALSE
/// Quality of the mutation
var/quality
/// Message given to the user upon gaining this mutation
diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm
index b87e749d2dba..1488db30d3e4 100644
--- a/code/datums/mutations/body.dm
+++ b/code/datums/mutations/body.dm
@@ -369,12 +369,12 @@
. = ..()
if(!.)
return
- owner.physiology.burn_mod *= 0.5
+ MODIFY_PHYSIOLOGY(owner, BURN, 0.5)
/datum/mutation/fire/on_losing(mob/living/carbon/human/owner)
if(..())
return
- owner.physiology.burn_mod *= 2
+ MODIFY_PHYSIOLOGY(owner, BURN, 2)
/datum/mutation/badblink
name = "Spatial Instability"
@@ -610,8 +610,8 @@
if(!.)
return
if(!physiology_modified)
- owner.physiology.bleed_mod *= bleed_rate
- owner.physiology.blood_regen_mod *= blood_regen_rate
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_BLEED, bleed_rate)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_BLOOD_REGEN, blood_regen_rate)
physiology_modified = TRUE
/datum/mutation/bloodier/on_losing(mob/living/carbon/human/owner)
@@ -619,22 +619,22 @@
if(.)
return
if(physiology_modified)
- owner.physiology.bleed_mod /= bleed_rate
- owner.physiology.blood_regen_mod /= blood_regen_rate
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_BLEED, 1/bleed_rate)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_BLOOD_REGEN, 1/blood_regen_rate)
physiology_modified = FALSE // just in case
/datum/mutation/bloodier/setup()
if(owner && physiology_modified)
- owner.physiology.bleed_mod /= bleed_rate
- owner.physiology.blood_regen_mod /= blood_regen_rate
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_BLEED, 1/bleed_rate)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_BLOOD_REGEN, 1/blood_regen_rate)
physiology_modified = FALSE
bleed_rate = clamp(initial(bleed_rate) * GET_MUTATION_SYNCHRONIZER(src) * GET_MUTATION_POWER(src), 1, 2)
blood_regen_rate = clamp(initial(blood_regen_rate) * GET_MUTATION_POWER(src), 4, 12)
if(owner && !physiology_modified) // redundant but just in case
- owner.physiology.bleed_mod *= bleed_rate
- owner.physiology.blood_regen_mod *= blood_regen_rate
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_BLEED, bleed_rate)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_BLOOD_REGEN, blood_regen_rate)
physiology_modified = TRUE
return TRUE
@@ -702,12 +702,12 @@
return
// Gives you 30 seconds of being in fake soft crit... give or take
if(HAS_TRAIT(owner, TRAIT_TOXIMMUNE) || HAS_TRAIT(owner, TRAIT_TOXINLOVER))
- owner.adjust_brute_loss(1 * seconds_per_tick * GET_MUTATION_SYNCHRONIZER(src), forced = TRUE)
+ owner.adjust_brute_loss(1 * seconds_per_tick * GET_MUTATION_SYNCHRONIZER(src))
else
- owner.adjust_tox_loss(0.5 * seconds_per_tick * GET_MUTATION_SYNCHRONIZER(src), forced = TRUE)
- owner.adjust_brute_loss(0.5 * seconds_per_tick * GET_MUTATION_SYNCHRONIZER(src), forced = TRUE)
+ owner.adjust_tox_loss(0.5 * seconds_per_tick * GET_MUTATION_SYNCHRONIZER(src))
+ owner.adjust_brute_loss(0.5 * seconds_per_tick * GET_MUTATION_SYNCHRONIZER(src))
// Offsets suffocation but not entirely
- owner.adjust_oxy_loss(-0.5 * seconds_per_tick, forced = TRUE)
+ owner.adjust_oxy_loss(-0.5 * seconds_per_tick)
/datum/mutation/limb_regeneration
name = "Regeneration"
diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm
index 94d854697fdb..0ac198b41629 100644
--- a/code/datums/mutations/hulk.dm
+++ b/code/datums/mutations/hulk.dm
@@ -44,6 +44,7 @@
RegisterSignal(owner, COMSIG_CARBON_ATTACH_LIMB, PROC_REF(texture_limb))
RegisterSignal(owner, COMSIG_CARBON_REMOVE_LIMB, PROC_REF(untexture_limb))
owner.add_movespeed_mod_immunities("hulk", /datum/movespeed_modifier/damage_slowdown)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_COLD, 2) //hulks are vulnerable to cold temperatures for some reason, idk low body fat?
/datum/mutation/hulk/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers)
SIGNAL_HANDLER
@@ -82,6 +83,7 @@
UnregisterSignal(owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK)
UnregisterSignal(owner, COMSIG_MOB_CLICKON)
owner.remove_movespeed_mod_immunities("hulk", /datum/movespeed_modifier/damage_slowdown)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_COLD, 0.5)
/datum/mutation/hulk/proc/texture_limb(atom/source, obj/item/bodypart/limb)
SIGNAL_HANDLER
diff --git a/code/datums/personality/personality_preference.dm b/code/datums/personality/personality_preference.dm
index d4e437b76b1b..5f8b8a49fd19 100644
--- a/code/datums/personality/personality_preference.dm
+++ b/code/datums/personality/personality_preference.dm
@@ -8,7 +8,7 @@
/datum/preference/personality/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
if(isdummy(target) || !ishuman(target) || isnull(target.mob_mood))
return
- if(CONFIG_GET(flag/disable_human_mood) || !CONFIG_GET(flag/roundstart_traits))
+ if(!CONFIG_GET(flag/roundstart_traits))
return
for(var/personality_key in value)
var/datum/personality/personality = SSpersonalities.personalities_by_key[personality_key]
diff --git a/code/datums/proximity_monitor/fields/timestop.dm b/code/datums/proximity_monitor/fields/timestop.dm
index 92fbf12356ef..f8ac4658c5e2 100644
--- a/code/datums/proximity_monitor/fields/timestop.dm
+++ b/code/datums/proximity_monitor/fields/timestop.dm
@@ -31,14 +31,8 @@
if(silent)
hidden = TRUE
alpha = 0
- for(var/A in immune_atoms)
- immune[A] = TRUE
- for(var/mob/living/to_check in GLOB.player_list)
- if(HAS_TRAIT(to_check, TRAIT_TIME_STOP_IMMUNE))
- immune[to_check] = TRUE
- for(var/mob/living/basic/guardian/stand in GLOB.parasites)
- if(stand.summoner && HAS_TRAIT(stand.summoner, TRAIT_TIME_STOP_IMMUNE)) //It would only make sense that a person's stand would also be immune.
- immune[stand] = TRUE
+ for(var/innately_immune in immune_atoms)
+ immune[innately_immune] = TRUE
if(start)
INVOKE_ASYNC(src, PROC_REF(timestop))
@@ -68,7 +62,7 @@
edge_is_a_field = TRUE
var/list/immune = list()
var/list/frozen_things = list()
- var/list/frozen_mobs = list() //cached separately for processing
+ var/list/frozen_mobs = list()
var/list/frozen_structures = list() //Also machinery, and only frozen aestethically
var/list/frozen_turfs = list() //Only aesthetically
var/antimagic_flags = NONE
@@ -83,14 +77,12 @@
src.antimagic_flags = antimagic_flags
src.channelled = channelled
recalculate_field(full_recalc = TRUE)
- START_PROCESSING(SSfastprocess, src)
/datum/proximity_monitor/advanced/timestop/Destroy()
unfreeze_all()
if(channelled)
for(var/atom in immune)
UnregisterSignal(atom, COMSIG_MOVABLE_MOVED)
- STOP_PROCESSING(SSfastprocess, src)
return ..()
/datum/proximity_monitor/advanced/timestop/field_turf_crossed(atom/movable/movable, turf/old_location, turf/new_location)
@@ -99,15 +91,15 @@
/datum/proximity_monitor/advanced/timestop/proc/freeze_atom(atom/movable/A)
if(global_frozen_atoms[A] || !istype(A))
return FALSE
- if(immune[A]) //a little special logic but yes immune things don't freeze
+
+ if(HAS_TRAIT(A, TRAIT_TIME_STOP_IMMUNE) || astype(A, /mob)?.can_block_magic(antimagic_flags))
+ immune[A] = TRUE
+
+ if(immune[A])
if(channelled)
RegisterSignal(A, COMSIG_MOVABLE_MOVED, PROC_REF(atom_broke_channel), override = TRUE)
return FALSE
- if(ismob(A))
- var/mob/M = A
- if(M.can_block_magic(antimagic_flags))
- immune[A] = TRUE
- return
+
var/frozen = TRUE
if(isliving(A))
freeze_mob(A)
@@ -193,11 +185,6 @@
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_structure(obj/O)
escape_the_negative_zone(O)
-/datum/proximity_monitor/advanced/timestop/process()
- for(var/i in frozen_mobs)
- var/mob/living/m = i
- m.Stun(20, ignore_canstun = TRUE)
-
/datum/proximity_monitor/advanced/timestop/setup_field_turf(turf/target)
. = ..()
for(var/i in target.contents)
@@ -212,8 +199,7 @@
/datum/proximity_monitor/advanced/timestop/proc/freeze_mob(mob/living/victim)
frozen_mobs += victim
- victim.Stun(20, ignore_canstun = TRUE)
- victim.add_traits(list(TRAIT_MUTE, TRAIT_EMOTEMUTE), TIMESTOP_TRAIT)
+ victim.add_traits(list(TRAIT_MUTE, TRAIT_EMOTEMUTE, TRAIT_INCAPACITATED, TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS), TIMESTOP_TRAIT)
GLOB.move_manager.stop_looping(victim) //stops them mid pathing even if they're stunimmune //This is really dumb
if(isanimal(victim))
var/mob/living/simple_animal/animal_victim = victim
@@ -226,8 +212,7 @@
basic_victim.ai_controller?.force_ai_off()
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_mob(mob/living/victim)
- victim.AdjustStun(-20, ignore_canstun = TRUE)
- victim.remove_traits(list(TRAIT_MUTE, TRAIT_EMOTEMUTE), TIMESTOP_TRAIT)
+ victim.remove_traits(list(TRAIT_MUTE, TRAIT_EMOTEMUTE, TRAIT_INCAPACITATED, TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS), TIMESTOP_TRAIT)
frozen_mobs -= victim
if(isanimal(victim))
var/mob/living/simple_animal/animal_victim = victim
diff --git a/code/datums/quirks/negative_quirks/all_nighter.dm b/code/datums/quirks/negative_quirks/all_nighter.dm
index 91d8d9d58c32..766e37c5dcf6 100644
--- a/code/datums/quirks/negative_quirks/all_nighter.dm
+++ b/code/datums/quirks/negative_quirks/all_nighter.dm
@@ -10,7 +10,7 @@
lose_text = span_notice("You feel well rested.")
medical_record_text = "Patient appears to be suffering from sleep deprivation."
hardcore_value = 2
- quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE|QUIRK_MOODLET_BASED|QUIRK_PROCESSES
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE|QUIRK_PROCESSES
mail_goodies = list(
/obj/item/clothing/glasses/blindfold,
diff --git a/code/datums/quirks/negative_quirks/asthma.dm b/code/datums/quirks/negative_quirks/asthma.dm
index 31532b2a3fe1..013a00c21383 100644
--- a/code/datums/quirks/negative_quirks/asthma.dm
+++ b/code/datums/quirks/negative_quirks/asthma.dm
@@ -7,7 +7,6 @@
lose_text = span_notice("You suddenly feel like your lungs just got a lot better at breathing!")
medical_record_text = "Patient suffers from asthma."
hardcore_value = 2
- quirk_flags = QUIRK_HUMAN_ONLY
mail_goodies = list(/obj/item/reagent_containers/inhaler_canister/albuterol)
/// At this percentage of inflammation, our lung pressure mult reaches 0. From 0-1.
diff --git a/code/datums/quirks/negative_quirks/bad_back.dm b/code/datums/quirks/negative_quirks/bad_back.dm
index b7c406361596..500d6a19990c 100644
--- a/code/datums/quirks/negative_quirks/bad_back.dm
+++ b/code/datums/quirks/negative_quirks/bad_back.dm
@@ -3,7 +3,7 @@
desc = "Thanks to your poor posture, backpacks and other bags never sit right on your back. More evenly weighted objects are fine, though."
icon = FA_ICON_HIKING
value = -8
- quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED
+
gain_text = span_danger("Your back REALLY hurts!")
lose_text = span_notice("Your back feels better.")
medical_record_text = "Patient scans indicate severe and chronic back pain."
diff --git a/code/datums/quirks/negative_quirks/body_purist.dm b/code/datums/quirks/negative_quirks/body_purist.dm
index 063887b87464..54f358014d50 100644
--- a/code/datums/quirks/negative_quirks/body_purist.dm
+++ b/code/datums/quirks/negative_quirks/body_purist.dm
@@ -3,7 +3,6 @@
desc = "You believe your body is a temple and its natural form is an embodiment of perfection. Accordingly, you despise the idea of ever augmenting it with unnatural parts, cybernetic, prosthetic, or anything like it."
icon = FA_ICON_PERSON_RAYS
value = -2
- quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED
gain_text = span_danger("You now begin to hate the idea of having cybernetic implants.")
lose_text = span_notice("Maybe cybernetics aren't so bad. You now feel okay with augmentations and prosthetics.")
medical_record_text = "This patient has disclosed an extreme hatred for unnatural bodyparts and augmentations."
diff --git a/code/datums/quirks/negative_quirks/depression.dm b/code/datums/quirks/negative_quirks/depression.dm
index cbf7864d3448..529c195b0a2e 100644
--- a/code/datums/quirks/negative_quirks/depression.dm
+++ b/code/datums/quirks/negative_quirks/depression.dm
@@ -7,7 +7,7 @@
lose_text = span_notice("You no longer feel depressed.") //if only it were that easy!
medical_record_text = "Patient has a mild mood disorder causing them to experience acute episodes of depression."
medical_symptom_text = "Experiences persistent feelings of sadness, hopelessness, and a lack of motivation."
- quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED|QUIRK_PROCESSES|QUIRK_TRAUMALIKE
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES|QUIRK_TRAUMALIKE
hardcore_value = 2
mail_goodies = list(/obj/item/storage/pill_bottle/happinesspsych)
diff --git a/code/datums/quirks/negative_quirks/erratic.dm b/code/datums/quirks/negative_quirks/erratic.dm
index f819aa1bc195..7b345c75743c 100644
--- a/code/datums/quirks/negative_quirks/erratic.dm
+++ b/code/datums/quirks/negative_quirks/erratic.dm
@@ -7,7 +7,7 @@
lose_text = span_notice("You feel more stable.")
medical_record_text = "Patient has a bipolar personality disorder."
medical_symptom_text = "Exhibits sudden and unpredictable changes in personality, mood, and behavior, often swinging between extremes of emotion and demeanor."
- quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED|QUIRK_PROCESSES|QUIRK_TRAUMALIKE
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES|QUIRK_TRAUMALIKE
hardcore_value = 3
mail_goodies = list(/obj/item/storage/pill_bottle/psicodine)
/// Cooldown between personality randomizations
diff --git a/code/datums/quirks/negative_quirks/family_heirloom.dm b/code/datums/quirks/negative_quirks/family_heirloom.dm
index 98951368cab6..7841d48dee9e 100644
--- a/code/datums/quirks/negative_quirks/family_heirloom.dm
+++ b/code/datums/quirks/negative_quirks/family_heirloom.dm
@@ -5,7 +5,7 @@
value = -2
medical_record_text = "Patient demonstrates an unnatural attachment to a family heirloom."
hardcore_value = 1
- quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES|QUIRK_MOODLET_BASED
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES
/// A weak reference to our heirloom.
var/datum/weakref/heirloom
mail_goodies = list(/obj/item/storage/briefcase/secure)
diff --git a/code/datums/quirks/negative_quirks/fluoride_stare.dm b/code/datums/quirks/negative_quirks/fluoride_stare.dm
index c14efee30143..25cd257ff8ea 100644
--- a/code/datums/quirks/negative_quirks/fluoride_stare.dm
+++ b/code/datums/quirks/negative_quirks/fluoride_stare.dm
@@ -7,7 +7,6 @@
lose_text = span_notice("You realize that sudden darkness that has just enveloped you was just your eyelids growing back.")
medical_record_text = "Patient has lost their eyelids in a grueling accident."
hardcore_value = 6
- quirk_flags = QUIRK_HUMAN_ONLY
mail_goodies = list(/obj/item/reagent_containers/cup/bottle/salglu_solution, /obj/item/light/bulb)
/datum/quirk/item_quirk/fluoride_stare/is_species_appropriate(datum/species/mob_species)
diff --git a/code/datums/quirks/negative_quirks/food_allergy.dm b/code/datums/quirks/negative_quirks/food_allergy.dm
index 1f8a6e9e829c..30a56c2744cd 100644
--- a/code/datums/quirks/negative_quirks/food_allergy.dm
+++ b/code/datums/quirks/negative_quirks/food_allergy.dm
@@ -20,7 +20,6 @@ GLOBAL_LIST_INIT(possible_food_allergies, list(
lose_text = span_notice("You feel your immune system phase back into perfect shape.")
medical_record_text = "Patient's immune system responds violently to certain food."
hardcore_value = 1
- quirk_flags = QUIRK_HUMAN_ONLY
mail_goodies = list(/obj/item/reagent_containers/hypospray/medipen)
/// Footype flags that will trigger the allergy
var/target_foodtypes = NONE
diff --git a/code/datums/quirks/negative_quirks/limper.dm b/code/datums/quirks/negative_quirks/limper.dm
index e272bd2c7129..010b1800f917 100644
--- a/code/datums/quirks/negative_quirks/limper.dm
+++ b/code/datums/quirks/negative_quirks/limper.dm
@@ -7,7 +7,6 @@
medical_record_text = "Patient appears to suffer from a weakness in the leg."
value = -6
hardcore_value = 3
- quirk_flags = QUIRK_HUMAN_ONLY
mail_goodies = list(
/obj/item/cane,
diff --git a/code/datums/quirks/negative_quirks/poor_aim.dm b/code/datums/quirks/negative_quirks/poor_aim.dm
index d86feb809b00..f60036211aa5 100644
--- a/code/datums/quirks/negative_quirks/poor_aim.dm
+++ b/code/datums/quirks/negative_quirks/poor_aim.dm
@@ -6,6 +6,7 @@
medical_record_text = "Patient possesses a strong tremor in both hands."
hardcore_value = 3
mail_goodies = list(/obj/item/cardboard_cutout) // for target practice
+ darkpack_allowed = TRUE // DARKPACK EDIT ADD - MERITS_FLAWS
/datum/quirk/poor_aim/add(client/client_source)
RegisterSignal(quirk_holder, COMSIG_MOB_FIRED_GUN, PROC_REF(on_mob_fired_gun))
diff --git a/code/datums/quirks/neutral_quirks/transhumanist.dm b/code/datums/quirks/neutral_quirks/transhumanist.dm
index 6dfa2d16f6c2..6ef584812305 100644
--- a/code/datums/quirks/neutral_quirks/transhumanist.dm
+++ b/code/datums/quirks/neutral_quirks/transhumanist.dm
@@ -17,7 +17,7 @@
name = "Transhumanist"
desc = "You see silicon life as the perfect lifeform and despise organic flesh. You are happier around silicons, but get frustrated when around organics. You seek to replace your failing flesh with perfect silicon. You start with a robotic augmentation."
icon = FA_ICON_ROBOT
- quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES|QUIRK_MOODLET_BASED
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES
value = 0
gain_text = span_notice("You have a desire to ditch your feeble organic flesh and surround yourself with robots.")
lose_text = span_danger("Robots don't seem all that great anymore.")
diff --git a/code/datums/quirks/positive_quirks/friendly.dm b/code/datums/quirks/positive_quirks/friendly.dm
index 6f23d6579508..e2c051c62050 100644
--- a/code/datums/quirks/positive_quirks/friendly.dm
+++ b/code/datums/quirks/positive_quirks/friendly.dm
@@ -6,7 +6,6 @@
mob_trait = TRAIT_FRIENDLY
gain_text = span_notice("You want to hug someone.")
lose_text = span_danger("You no longer feel compelled to hug others.")
- quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED
medical_record_text = "Patient demonstrates low-inhibitions for physical contact and well-developed arms. Requesting another doctor take over this case."
mail_goodies = list(/obj/item/storage/box/hug)
diff --git a/code/datums/quirks/positive_quirks/jolly.dm b/code/datums/quirks/positive_quirks/jolly.dm
index 30b71b6a1afa..367f3d0e376f 100644
--- a/code/datums/quirks/positive_quirks/jolly.dm
+++ b/code/datums/quirks/positive_quirks/jolly.dm
@@ -3,7 +3,7 @@
desc = "You sometimes just feel happy, for no reason at all."
icon = FA_ICON_GRIN
value = 4
- quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED|QUIRK_PROCESSES|QUIRK_TRAUMALIKE
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES|QUIRK_TRAUMALIKE
medical_record_text = "Patient demonstrates constant euthymia irregular for environment. It's a bit much, to be honest."
medical_symptom_text = "Exhibits persistent feelings of happiness and elevated mood, which may lead to unrealistic optimism and risk-taking behaviors."
mail_goodies = list(/obj/item/clothing/mask/joy)
diff --git a/code/datums/quirks/positive_quirks/pyromania.dm b/code/datums/quirks/positive_quirks/pyromania.dm
index 44f8973cccd0..8ce61165e13a 100644
--- a/code/datums/quirks/positive_quirks/pyromania.dm
+++ b/code/datums/quirks/positive_quirks/pyromania.dm
@@ -21,8 +21,7 @@
/datum/quirk/pyromania/add(client/client_source)
. = ..()
- var/mob/living/carbon/human/human_holder = quirk_holder
- human_holder.physiology.heat_mod *= damage_mod
+ MODIFY_PHYSIOLOGY(quirk_holder, PHYS_COEFF_HEAT, damage_mod)
RegisterSignal(quirk_holder, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(damage_taken))
/datum/quirk/pyromania/remove()
@@ -31,9 +30,8 @@
if(QDELING(quirk_holder))
return
- var/mob/living/carbon/human/human_holder = quirk_holder
- human_holder.physiology.heat_mod /= damage_mod
- human_holder.clear_mood_event("pyromania_fire")
+ MODIFY_PHYSIOLOGY(quirk_holder, PHYS_COEFF_HEAT, 1 / damage_mod)
+ quirk_holder.clear_mood_event("pyromania_fire")
/datum/quirk/pyromania/process(seconds_per_tick)
var/fire_size = quirk_holder.count_nearby_fire_sources()
diff --git a/code/datums/quirks/positive_quirks/spacer.dm b/code/datums/quirks/positive_quirks/spacer.dm
index 470dd321c411..2a5e9e6aaf26 100644
--- a/code/datums/quirks/positive_quirks/spacer.dm
+++ b/code/datums/quirks/positive_quirks/spacer.dm
@@ -56,10 +56,13 @@
// drift slightly faster through zero G
quirk_holder.inertia_move_multiplier_passive *= drift_mod
+ //more impervious to the empty space
+ MODIFY_PHYSIOLOGY(quirk_holder, PHYS_COEFF_PRESSURE, damage_mod)
+ MODIFY_PHYSIOLOGY(quirk_holder, PHYS_COEFF_COLD, damage_mod)
+
+ //taller from lack of gravity
var/mob/living/carbon/human/human_quirker = quirk_holder
human_quirker.set_mob_height(modded_height)
- human_quirker.physiology.pressure_mod *= damage_mod
- human_quirker.physiology.cold_mod *= damage_mod
/datum/quirk/spacer_born/post_add()
var/on_a_planet = SSmapping.is_planetary()
@@ -89,11 +92,11 @@
quirk_holder.clear_mood_event("spacer")
quirk_holder.remove_movespeed_modifier(/datum/movespeed_modifier/spacer)
quirk_holder.remove_status_effect(/datum/status_effect/spacer)
+ MODIFY_PHYSIOLOGY(quirk_holder, PHYS_COEFF_PRESSURE, 1 / damage_mod)
+ MODIFY_PHYSIOLOGY(quirk_holder, PHYS_COEFF_COLD, 1 / damage_mod)
var/mob/living/carbon/human/human_quirker = quirk_holder
human_quirker.set_mob_height(HUMAN_HEIGHT_MEDIUM)
- human_quirker.physiology.pressure_mod /= damage_mod
- human_quirker.physiology.cold_mod /= damage_mod
/// Check on Z change whether we should start or stop timers
/datum/quirk/spacer_born/proc/spacer_moved(mob/living/source, turf/old_turf, turf/new_turf, same_z_layer)
diff --git a/code/datums/records/record.dm b/code/datums/records/record.dm
index 3874e483bdc4..3c306cdd4244 100644
--- a/code/datums/records/record.dm
+++ b/code/datums/records/record.dm
@@ -53,6 +53,18 @@
src.species = species
src.trim = trim
+/// Parses gender field into byond gender defines
+/datum/record/proc/get_byond_gender()
+ var/record_gender = LOWER_TEXT(gender)
+ // already slots nicely into a define
+ if(record_gender == MALE || record_gender == FEMALE || record_gender == NEUTER || record_gender == PLURAL)
+ return record_gender
+ // they/them if "unknown"
+ if(record_gender == "unknown")
+ return PLURAL
+ // it/its if "other"
+ return NEUTER
+
/**
* Crew record datum
*/
diff --git a/code/datums/sprite_accessories/_sprite_accessory.dm b/code/datums/sprite_accessories/_sprite_accessory.dm
index 4cdd8ab6e589..35f45a7198b8 100644
--- a/code/datums/sprite_accessories/_sprite_accessory.dm
+++ b/code/datums/sprite_accessories/_sprite_accessory.dm
@@ -34,6 +34,8 @@
* This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none.
*/
var/color_src = MUTANT_COLOR
+ /// a list of layers which render an extra emissive overlay
+ var/list/emissive_layers = list()
/// Is this part locked from roundstart selection? Used for parts that apply effects.
var/locked = FALSE
/// Should we center the sprite?
diff --git a/code/datums/sprite_accessories/horns.dm b/code/datums/sprite_accessories/horns.dm
index dc9331281777..4bfbce3d19cf 100644
--- a/code/datums/sprite_accessories/horns.dm
+++ b/code/datums/sprite_accessories/horns.dm
@@ -21,3 +21,4 @@
/datum/sprite_accessory/horns/angler
name = "Angeler"
icon_state = "angler"
+ emissive_layers = list(EXTERNAL_FRONT)
diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm
index e12b37e8be80..183c0d97de9e 100644
--- a/code/datums/station_traits/negative_traits.dm
+++ b/code/datums/station_traits/negative_traits.dm
@@ -150,15 +150,7 @@
show_in_report = TRUE
report_message = "Due to distance to our supply station, the cargo shuttle will have a slower flight time to your cargo department."
blacklist = list(/datum/station_trait/quick_shuttle)
-
-/datum/station_trait/slow_shuttle/New()
- . = ..()
- RegisterSignal(SSshuttle, COMSIG_SUBSYSTEM_POST_INITIALIZE, PROC_REF(slow_the_shuttle))
-
-/datum/station_trait/slow_shuttle/proc/slow_the_shuttle(datum/source)
- SIGNAL_HANDLER
- SSshuttle.supply.callTime *= 1.5
- UnregisterSignal(SSshuttle, COMSIG_SUBSYSTEM_POST_INITIALIZE)
+ trait_to_give = STATION_TRAIT_SLOW_SHUTTLE
/datum/station_trait/bot_languages
name = "Bot Language Matrix Malfunction"
diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm
index de6f7ebbcdfd..29d598bd193f 100644
--- a/code/datums/station_traits/positive_traits.dm
+++ b/code/datums/station_traits/positive_traits.dm
@@ -20,6 +20,12 @@
COOLDOWN_START(src, party_cooldown, rand(PARTY_COOLDOWN_LENGTH_MIN, PARTY_COOLDOWN_LENGTH_MAX))
+ var/list/landing_turfs = list()
+ for(var/turf/open/floor/bar_turf in get_area_turfs(/area/station/service/bar, subtypes = TRUE))
+ landing_turfs += bar_turf
+ if(!length(landing_turfs))
+ return
+
var/pizza_type_to_spawn = pick(list(
/obj/item/pizzabox/margherita,
/obj/item/pizzabox/mushroom,
@@ -28,9 +34,8 @@
/obj/item/pizzabox/pineapple
))
- var/area/bar_area = pick(GLOB.bar_areas)
podspawn(list(
- "target" = pick(bar_area.contents),
+ "target" = pick(landing_turfs),
"path" = /obj/structure/closet/supplypod/centcompod,
"spawn" = list(
pizza_type_to_spawn,
@@ -150,10 +155,7 @@
show_in_report = TRUE
report_message = "Due to proximity to our supply station, the cargo shuttle will have a quicker flight time to your cargo department."
blacklist = list(/datum/station_trait/slow_shuttle)
-
-/datum/station_trait/quick_shuttle/on_round_start()
- . = ..()
- SSshuttle.supply.callTime *= 0.5
+ trait_to_give = STATION_TRAIT_QUICK_SHUTTLE
/datum/station_trait/deathrattle_department
name = "deathrattled department"
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 893fd4d76735..ac71f88a9ac7 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -66,10 +66,10 @@
return
var/grace_heal = bloodlust * 0.02
var/need_mob_update = FALSE
- need_mob_update += owner.adjust_brute_loss(-grace_heal * seconds_between_ticks, updating_health = FALSE, forced = TRUE)
- need_mob_update += owner.adjust_fire_loss(-grace_heal * seconds_between_ticks, updating_health = FALSE, forced = TRUE)
- need_mob_update += owner.adjust_tox_loss(-grace_heal * seconds_between_ticks, forced = TRUE)
- need_mob_update += owner.adjust_oxy_loss(-(grace_heal * 2) * seconds_between_ticks, updating_health = FALSE, forced = TRUE)
+ need_mob_update += owner.adjust_brute_loss(-grace_heal * seconds_between_ticks, updating_health = FALSE)
+ need_mob_update += owner.adjust_fire_loss(-grace_heal * seconds_between_ticks, updating_health = FALSE)
+ need_mob_update += owner.adjust_tox_loss(-grace_heal * seconds_between_ticks)
+ need_mob_update += owner.adjust_oxy_loss(-(grace_heal * 2) * seconds_between_ticks, updating_health = FALSE)
if(need_mob_update)
owner.updatehealth()
@@ -94,7 +94,7 @@
/datum/status_effect/blooddrunk
id = "blooddrunk"
- duration = 10
+ duration = 1 SECONDS
tick_interval = STATUS_EFFECT_NO_TICK
alert_type = /atom/movable/screen/alert/status_effect/blooddrunk
@@ -105,25 +105,21 @@
/datum/status_effect/blooddrunk/on_apply()
owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown)
- if(ishuman(owner))
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.brute_mod *= 0.1
- human_owner.physiology.burn_mod *= 0.1
- human_owner.physiology.tox_mod *= 0.1
- human_owner.physiology.oxy_mod *= 0.1
- human_owner.physiology.stamina_mod *= 0.1
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 0.1)
+ MODIFY_PHYSIOLOGY(owner, BURN, 0.1)
+ MODIFY_PHYSIOLOGY(owner, TOX, 0.1)
+ MODIFY_PHYSIOLOGY(owner, OXY, 0.1)
+ MODIFY_PHYSIOLOGY(owner, STAMINA, 0.1)
owner.add_stun_absorption(source = id, priority = 4)
owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, 1, use_reverb = FALSE)
return TRUE
/datum/status_effect/blooddrunk/on_remove()
- if(ishuman(owner))
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.brute_mod *= 10
- human_owner.physiology.burn_mod *= 10
- human_owner.physiology.tox_mod *= 10
- human_owner.physiology.oxy_mod *= 10
- human_owner.physiology.stamina_mod *= 10
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 10)
+ MODIFY_PHYSIOLOGY(owner, BURN, 10)
+ MODIFY_PHYSIOLOGY(owner, TOX, 10)
+ MODIFY_PHYSIOLOGY(owner, OXY, 10)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_PRESSURE, 10)
owner.remove_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown)
owner.remove_stun_absorption(id)
@@ -340,11 +336,11 @@
if(itemUser.health < itemUser.maxHealth)
new /obj/effect/temp_visual/heal(get_turf(itemUser), "#375637")
var/need_mob_update = FALSE
- need_mob_update += itemUser.adjust_brute_loss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE)
- need_mob_update += itemUser.adjust_fire_loss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE)
+ need_mob_update += itemUser.adjust_brute_loss(-0.6 * seconds_between_ticks, updating_health = FALSE)
+ need_mob_update += itemUser.adjust_fire_loss(-0.6 * seconds_between_ticks, updating_health = FALSE)
need_mob_update += itemUser.adjust_tox_loss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) //Because Slime People are people too
- need_mob_update += itemUser.adjust_oxy_loss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE)
- need_mob_update += itemUser.adjust_stamina_loss(-3 * seconds_between_ticks, updating_stamina = FALSE, forced = TRUE)
+ need_mob_update += itemUser.adjust_oxy_loss(-0.6 * seconds_between_ticks, updating_health = FALSE)
+ need_mob_update += itemUser.adjust_stamina_loss(-3 * seconds_between_ticks, updating_stamina = FALSE)
need_mob_update += itemUser.adjust_organ_loss(ORGAN_SLOT_BRAIN, -0.6 * seconds_between_ticks)
if(need_mob_update)
itemUser.updatehealth()
@@ -525,11 +521,7 @@
owner.balloon_alert_to_viewers("health buffed")
to_chat(owner, span_nicegreen("You feel healthy, like if your body is little stronger than it was a moment ago."))
- if(isanimal(owner)) //dumb animals have their own proc for healing.
- var/mob/living/simple_animal/healthy_animal = owner
- healthy_animal.adjustHealth(-(health_increase * healing_modifier))
- else
- owner.adjust_brute_loss(-(health_increase * healing_modifier))
+ owner.adjust_brute_loss(-(health_increase * healing_modifier))
/datum/status_effect/limited_buff/health_buff/maxed_out()
. = ..()
@@ -575,14 +567,11 @@
alert_type = null
/datum/status_effect/blessing_of_insanity/on_apply()
- if(ishuman(owner))
- var/mob/living/carbon/human/human_owner = owner
- var/datum/physiology/owner_physiology = human_owner.physiology
- owner_physiology.brute_mod *= 0.5
- owner_physiology.burn_mod *= 0.5
- owner_physiology.tox_mod *= 0.5
- owner_physiology.oxy_mod *= 0.5
- owner_physiology.stamina_mod *= 0.5
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 0.5)
+ MODIFY_PHYSIOLOGY(owner, BURN, 0.5)
+ MODIFY_PHYSIOLOGY(owner, TOX, 0.5)
+ MODIFY_PHYSIOLOGY(owner, OXY, 0.5)
+ MODIFY_PHYSIOLOGY(owner, STAMINA, 0.5)
owner.add_filter("mad_glow", 2, list("type" = "outline", "color" = "#eed811c9", "size" = 2))
owner.AddElement(/datum/element/forced_gravity, 0)
owner.AddElement(/datum/element/simple_flying)
@@ -593,14 +582,11 @@
return TRUE
/datum/status_effect/blessing_of_insanity/on_remove()
- if(ishuman(owner))
- var/mob/living/carbon/human/human_owner = owner
- var/datum/physiology/owner_physiology = human_owner.physiology
- owner_physiology.brute_mod *= 2
- owner_physiology.burn_mod *= 2
- owner_physiology.tox_mod *= 2
- owner_physiology.oxy_mod *= 2
- owner_physiology.stamina_mod *= 2
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 2)
+ MODIFY_PHYSIOLOGY(owner, BURN, 2)
+ MODIFY_PHYSIOLOGY(owner, TOX, 2)
+ MODIFY_PHYSIOLOGY(owner, OXY, 2)
+ MODIFY_PHYSIOLOGY(owner, STAMINA, 2)
owner.remove_filter("mad_glow")
owner.RemoveElement(/datum/element/forced_gravity, 0)
owner.RemoveElement(/datum/element/simple_flying)
diff --git a/code/datums/status_effects/buffs/bioware/circulation.dm b/code/datums/status_effects/buffs/bioware/circulation.dm
index c20efd3aa93e..70752da98038 100644
--- a/code/datums/status_effects/buffs/bioware/circulation.dm
+++ b/code/datums/status_effects/buffs/bioware/circulation.dm
@@ -15,9 +15,7 @@
/datum/status_effect/bioware/heart/threaded_veins
/datum/status_effect/bioware/heart/threaded_veins/bioware_gained()
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.bleed_mod *= 0.25
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_BLEED, 0.25)
/datum/status_effect/bioware/heart/threaded_veins/bioware_lost()
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.bleed_mod *= 4
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_BLEED, 4)
diff --git a/code/datums/status_effects/buffs/bioware/nerves.dm b/code/datums/status_effects/buffs/bioware/nerves.dm
index 36392ca63644..850efa672a29 100644
--- a/code/datums/status_effects/buffs/bioware/nerves.dm
+++ b/code/datums/status_effects/buffs/bioware/nerves.dm
@@ -15,11 +15,9 @@
/datum/status_effect/bioware/nerves/spliced
/datum/status_effect/bioware/nerves/spliced/bioware_gained()
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.stun_mod *= 0.5
- human_owner.physiology.stamina_mod *= 0.8
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_STUN, 0.5)
+ MODIFY_PHYSIOLOGY(owner, STAMINA, 0.8)
/datum/status_effect/bioware/nerves/spliced/bioware_lost()
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.stun_mod *= 2
- human_owner.physiology.stamina_mod *= 1.25
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_STUN, 2)
+ MODIFY_PHYSIOLOGY(owner, STAMINA, 1.25)
diff --git a/code/datums/status_effects/debuffs/choke.dm b/code/datums/status_effects/debuffs/choke.dm
index 7619a018817d..80e1313c471a 100644
--- a/code/datums/status_effects/debuffs/choke.dm
+++ b/code/datums/status_effects/debuffs/choke.dm
@@ -210,13 +210,15 @@
aggressor.stop_pulling()
var/atom/movable/choking_on = choking_on_ref?.resolve()
- owner.visible_message(span_green("[victim] vomits up \the[choking_on]. [victim.p_theyre()] gonna make it!"), \
+ owner.visible_message(span_green("[victim] vomits up \the [choking_on]. [victim.p_Theyre()] gonna make it!"), \
span_green("You vomit up that accursed blockage. YOU CAN BREATHE! The broken chest is a hell of a price to pay."))
if(iscarbon(victim))
var/mob/living/carbon/carbon_victim = victim
var/obj/item/bodypart/chest = carbon_victim.get_bodypart(BODY_ZONE_CHEST)
carbon_victim.cause_wound_of_type_and_severity(WOUND_BLUNT, chest, WOUND_SEVERITY_SEVERE, wound_source = "human force to the chest")
+ aggressor.client?.give_award(/datum/award/achievement/misc/samaritan, aggressor)
+
playsound(owner, 'sound/mobs/humanoids/human/gag_vomit/crack_vomit.ogg', 120, extrarange = 5, falloff_exponent = 4)
vomit_up()
diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm
index 10ed600ac342..031923aa21c8 100644
--- a/code/datums/status_effects/debuffs/debuffs.dm
+++ b/code/datums/status_effects/debuffs/debuffs.dm
@@ -153,12 +153,15 @@
/datum/status_effect/knocked_out/on_apply()
owner.become_blind(TRAIT_STATUS_EFFECT(id))
owner.apply_status_effect(/datum/status_effect/grouped/see_no_names, TRAIT_STATUS_EFFECT(id))
+ owner.apply_status_effect(/datum/status_effect/grouped/static_look, TRAIT_STATUS_EFFECT(id)) //DARKPACK EDIT ADD - Static look on unconscious
owner.add_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_IMMOBILIZED, TRAIT_BLOCK_SECHUD, TRAIT_BLOCK_MEDHUD, TRAIT_INCAPACITATED, TRAIT_FLOORED), TRAIT_STATUS_EFFECT(id))
owner.update_eyes() // updates eyelids
RegisterSignal(owner, COMSIG_MOB_STATCHANGE, PROC_REF(on_mob_statchange))
+ /* DARKPACK EDIT REMOVE - Frenzy Additions
RegisterSignal(owner, COMSIG_MOB_CLIENT_LOGIN, PROC_REF(show_unconscious_hud))
if(GET_CLIENT(owner)) // let's not waste time giving the hud to non-player characters
show_unconscious_hud(owner)
+ */
return TRUE
/datum/status_effect/knocked_out/on_creation(mob/living/new_owner, ...)
@@ -171,15 +174,18 @@
/datum/status_effect/knocked_out/on_remove()
owner.cure_blind(TRAIT_STATUS_EFFECT(id))
owner.remove_status_effect(/datum/status_effect/grouped/see_no_names, TRAIT_STATUS_EFFECT(id))
+ owner.remove_status_effect(/datum/status_effect/grouped/static_look, TRAIT_STATUS_EFFECT(id)) //DARKPACK EDIT ADD - Static look on unconscious
owner.remove_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_IMMOBILIZED, TRAIT_BLOCK_SECHUD, TRAIT_BLOCK_MEDHUD, TRAIT_INCAPACITATED, TRAIT_FLOORED), TRAIT_STATUS_EFFECT(id))
owner.update_eyes() // updates eyelids
- UnregisterSignal(owner, list(COMSIG_MOB_CLIENT_LOGIN, COMSIG_MOB_STATCHANGE))
- if(GET_CLIENT(owner))
- hide_unconscious_hud(owner)
+ UnregisterSignal(owner, list(COMSIG_MOB_STATCHANGE)) //DARKPACK EDIT CHANGE - static_look effect - original: UnregisterSignal(owner, list(COMSIG_MOB_CLIENT_LOGIN, COMSIG_MOB_STATCHANGE))
+ //if(GET_CLIENT(owner)) DARKPACK EDIT REMOVAL - Frenzy Additions
+ // hide_unconscious_hud(owner) DARKPACK EDIT REMOVAL - Frenzy Additions
+
/datum/status_effect/knocked_out/tick(seconds_between_ticks)
owner.adjust_stamina_loss(-3 * seconds_between_ticks)
+/* // DARKPACK EDIT REMOVAL - Frenzy Additions
/// Global list of images that correspond to a mob's unconscious appearance
GLOBAL_LIST_EMPTY(unconscious_appearances)
@@ -192,6 +198,7 @@ GLOBAL_LIST_EMPTY(unconscious_appearances)
SIGNAL_HANDLER
source.client?.images -= GLOB.unconscious_appearances
+*/ // DARKPACK EDIT REMOVAL - Frenzy Additions
/datum/status_effect/knocked_out/proc/on_mob_statchange(mob/living/source, ...)
SIGNAL_HANDLER
@@ -363,25 +370,19 @@ GLOBAL_LIST_EMPTY(unconscious_appearances)
. = ..()
if(!.)
return
- owner.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS, TRAIT_TUMOR_SUPPRESSED), TRAIT_STATUS_EFFECT(id))
+ owner.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS), TRAIT_STATUS_EFFECT(id))
owner.add_filter("stasis_status_ripple", 2, list("type" = "ripple", "flags" = WAVE_BOUNDED, "radius" = 0, "size" = 2))
var/filter = owner.get_filter("stasis_status_ripple")
animate(filter, radius = 0, time = 0.2 SECONDS, size = 2, easing = JUMP_EASING, loop = -1, flags = ANIMATION_PARALLEL)
animate(radius = 32, time = 1.5 SECONDS, size = 0)
- if(iscarbon(owner))
- var/mob/living/carbon/carbon_owner = owner
- carbon_owner.update_bodypart_bleed_overlays()
/datum/status_effect/grouped/stasis/tick(seconds_between_ticks)
update_time_of_death()
/datum/status_effect/grouped/stasis/on_remove()
- owner.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS, TRAIT_TUMOR_SUPPRESSED), TRAIT_STATUS_EFFECT(id))
+ owner.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS), TRAIT_STATUS_EFFECT(id))
owner.remove_filter("stasis_status_ripple")
update_time_of_death()
- if(iscarbon(owner))
- var/mob/living/carbon/carbon_owner = owner
- carbon_owner.update_bodypart_bleed_overlays()
return ..()
/atom/movable/screen/alert/status_effect/stasis
diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm
index 9f2f94622677..8663f5e0094d 100644
--- a/code/datums/status_effects/debuffs/fire_stacks.dm
+++ b/code/datums/status_effects/debuffs/fire_stacks.dm
@@ -298,6 +298,11 @@
overlays |= created_overlay
overlays |= source.make_fire_emissive(created_overlay)
+#define WET_STACKS_DAMP 3
+#define WET_STACKS_DRIPPING 7.5
+#define WET_STACKS_SOAKED 15
+#define WET_STACKS_MINIMUM_VFX WET_STACKS_DAMP
+
/datum/status_effect/fire_handler/wet_stacks
id = "wet_stacks"
@@ -315,14 +320,12 @@
if(HAS_TRAIT(owner, TRAIT_SLIPPERY_WHEN_WET))
become_slippery()
ADD_TRAIT(owner, TRAIT_IS_WET, TRAIT_STATUS_EFFECT(id))
- owner.add_shared_particles(/particles/droplets)
/datum/status_effect/fire_handler/wet_stacks/on_remove()
. = ..()
REMOVE_TRAIT(owner, TRAIT_IS_WET, TRAIT_STATUS_EFFECT(id))
if(HAS_TRAIT(owner, TRAIT_SLIPPERY_WHEN_WET))
no_longer_slippery()
- owner.remove_shared_particles(/particles/droplets)
/datum/status_effect/fire_handler/wet_stacks/proc/update_wet_stack_modifier()
SIGNAL_HANDLER
@@ -339,7 +342,19 @@
REMOVE_TRAIT(owner, TRAIT_NO_SLIP_WATER, TRAIT_STATUS_EFFECT(id))
/datum/status_effect/fire_handler/wet_stacks/get_examine_text(mob/examiner)
- return "[owner.p_They()] look[owner.p_s()] a little soaked."
+ if(stacks <= WET_STACKS_DAMP)
+ return "[owner.p_They()] seem[owner.p_s()] damp."
+ else if(stacks >= WET_STACKS_SOAKED)
+ return "[owner.p_They()] look[owner.p_s()] completely soaked."
+ else
+ return "[owner.p_They()] appear[owner.p_s()] to be dripping wet."
+
+/datum/status_effect/fire_handler/wet_stacks/cache_stacks()
+ . = ..()
+ if(stacks > WET_STACKS_MINIMUM_VFX)
+ owner.add_shared_particles(/particles/droplets)
+ if(stacks <= WET_STACKS_MINIMUM_VFX)
+ owner.remove_shared_particles(/particles/droplets)
/datum/status_effect/fire_handler/wet_stacks/tick(seconds_between_ticks)
var/decay = HAS_TRAIT(owner, TRAIT_WET_FOR_LONGER) ? -0.035 : -0.5
@@ -357,3 +372,8 @@
/datum/status_effect/fire_handler/wet_stacks/check_basic_mob_immunity(mob/living/basic/basic_owner)
return !(basic_owner.basic_mob_flags & IMMUNE_TO_GETTING_WET)
+
+#undef WET_STACKS_MINIMUM_VFX
+#undef WET_STACKS_DAMP
+#undef WET_STACKS_DRIPPING
+#undef WET_STACKS_SOAKED
diff --git a/code/datums/status_effects/debuffs/spacer.dm b/code/datums/status_effects/debuffs/spacer.dm
index 7fa342370e2c..5c5415a501c0 100644
--- a/code/datums/status_effects/debuffs/spacer.dm
+++ b/code/datums/status_effects/debuffs/spacer.dm
@@ -58,17 +58,15 @@
remove_knockdown_mod()
/datum/status_effect/spacer/gravity_wellness/proc/apply_knockdown_mod()
- if(knockdown_mod_applied || !ishuman(owner))
+ if(knockdown_mod_applied)
return
- var/mob/living/carbon/human/the_spacer = owner
- the_spacer.physiology.knockdown_mod *= knockdown_multiplier
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_KNOCKDOWN, knockdown_multiplier)
knockdown_mod_applied = TRUE
/datum/status_effect/spacer/gravity_wellness/proc/remove_knockdown_mod()
- if(!knockdown_mod_applied || !ishuman(owner))
+ if(!knockdown_mod_applied)
return
- var/mob/living/carbon/human/the_spacer = owner
- the_spacer.physiology.knockdown_mod /= knockdown_multiplier
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_KNOCKDOWN, 1/knockdown_multiplier)
knockdown_mod_applied = FALSE
// The bad side (being on a planet)
diff --git a/code/datums/status_effects/drug_effects.dm b/code/datums/status_effects/drug_effects.dm
index 8f42e5ad9ac4..a4793cfb1535 100644
--- a/code/datums/status_effects/drug_effects.dm
+++ b/code/datums/status_effects/drug_effects.dm
@@ -20,19 +20,11 @@
alert_type = /atom/movable/screen/alert/status_effect/high_blood_pressure
/datum/status_effect/high_blood_pressure/on_apply()
- if(!ishuman(owner))
- return FALSE
-
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.bleed_mod *= 1.25
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_BLEED, 1.25)
return TRUE
/datum/status_effect/high_blood_pressure/on_remove()
- if(!ishuman(owner))
- return
-
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.bleed_mod /= 1.25
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_BLEED, 0.8)
/atom/movable/screen/alert/status_effect/high_blood_pressure
name = "High blood pressure"
diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm
index 6b10d609778b..39ee13efe19c 100644
--- a/code/datums/status_effects/wound_effects.dm
+++ b/code/datums/status_effects/wound_effects.dm
@@ -15,17 +15,43 @@
. = ..()
owner.visible_message(span_danger("[owner]'s body tenses up noticeably, gritting against [owner.p_their()] pain!"), span_notice("Your senses sharpen as your body tenses up from the wounds you've sustained!"), \
vision_distance=COMBAT_MESSAGE_RANGE)
- if(ishuman(owner))
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.bleed_mod *= WOUND_DETERMINATION_BLEED_MOD
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_BLEED, WOUND_DETERMINATION_BLEED_MOD)
+ RegisterSignal(owner, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(unarmed_strike))
/datum/status_effect/determined/on_remove()
owner.visible_message(span_danger("[owner]'s body slackens noticeably!"), span_warning("Your adrenaline rush dies off, and the pain from your wounds come aching back in..."), vision_distance=COMBAT_MESSAGE_RANGE)
- if(ishuman(owner))
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.bleed_mod /= WOUND_DETERMINATION_BLEED_MOD
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_BLEED, 1/WOUND_DETERMINATION_BLEED_MOD)
+ UnregisterSignal(owner, COMSIG_LIVING_UNARMED_ATTACK)
return ..()
+/datum/status_effect/determined/proc/unarmed_strike(mob/living/source, atom/attack_target, proximity, modifiers)
+ SIGNAL_HANDLER
+
+ if(!proximity || !isliving(attack_target))
+ return NONE
+
+ var/obj/item/bodypart/arm = source.get_active_hand()
+ var/datum/wound/bruised/arm_bruises = arm.get_wound_type(/datum/wound/bruised)
+ if(!isnull(arm_bruises))
+ arm_bruises.bruise_ticks = initial(arm_bruises.bruise_ticks)
+ return
+ arm_bruises = new /datum/wound/bruised()
+
+ var/wound_source
+
+ if(LAZYACCESS(modifiers, RIGHT_CLICK))
+ wound_source = "defensive injuries from attempting to ward off"
+ else
+ wound_source = "offensive injuries from attempting to fight"
+
+ if(ishuman(attack_target))
+ wound_source += " a humanoid"
+ else if(issilicon(attack_target))
+ wound_source += " something mechanical"
+ else
+ wound_source += " an animal"
+ arm_bruises.apply_wound(arm, TRUE, wound_source = wound_source)
+
/datum/status_effect/limp
id = "limp"
status_type = STATUS_EFFECT_REPLACE
@@ -153,14 +179,14 @@
/datum/status_effect/limp/quirk/update_limp(datum/source)
var/mob/living/carbon/carbon_mob = owner
left = carbon_mob.get_bodypart(BODY_ZONE_L_LEG)
- right = carbon_mob.get_bodypart(BODY_ZONE_R_LEG)
+ right = carbon_mob.get_bodypart(BODY_ZONE_R_LEG)
slowdown_left = 0
slowdown_right = 0
limp_chance_left = 0
limp_chance_right = 0
-
+
if(left)
slowdown_left = 7 //Same as compound fracture
limp_chance_left = 70
@@ -168,7 +194,7 @@
else if(right)
slowdown_right = 7
limp_chance_right = 70
-
+
/////////////////////////
//////// WOUNDS /////////
diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm
index 8e4dccb4ddd8..844f4106d0f8 100644
--- a/code/datums/storage/storage.dm
+++ b/code/datums/storage/storage.dm
@@ -1032,6 +1032,12 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches)
for(var/mob/user as anything in is_using)
hide_contents(user)
+/// Close the storage UI for everyone viewing us except if a viewer is holding us directly (and obsevers)
+/datum/storage/proc/close_all_non_wearers()
+ for(var/mob/user as anything in is_using)
+ if(parent.loc != user && !isobserver(user))
+ hide_contents(user)
+
/// Closes the storage UIs of this and everything inside the parent for everyone viewing them.
/datum/storage/proc/close_all_recursive()
close_all()
diff --git a/code/datums/storage/storage_interface.dm b/code/datums/storage/storage_interface.dm
index 2fb7929b0ab4..f4356983d7c9 100644
--- a/code/datums/storage/storage_interface.dm
+++ b/code/datums/storage/storage_interface.dm
@@ -2,6 +2,7 @@
/datum/storage_interface
/// UI elements for this theme
var/atom/movable/screen/close/closer
+ var/atom/movable/screen/storage_up/upper
var/atom/movable/screen/storage/cell/cells
var/atom/movable/screen/storage/corner/corner_top_left
var/atom/movable/screen/storage/corner/top_right/corner_top_right
@@ -18,6 +19,7 @@
src.parent_storage = parent_storage
var/datum/hud/owner_hud = user.hud_used
closer = new(null, owner_hud, parent_storage)
+ upper = new(null, owner_hud, parent_storage)
cells = new(null, owner_hud, parent_storage)
corner_top_left = new(null, owner_hud, parent_storage)
corner_top_right = new(null, owner_hud, parent_storage)
@@ -30,7 +32,7 @@
/// Returns all UI elements under this theme
/datum/storage_interface/proc/list_ui_elements(initializing = FALSE)
- return list(cells, corner_top_left, corner_top_right, corner_bottom_left, corner_bottom_right, rowjoin_left, rowjoin_right, closer)
+ return list(cells, corner_top_left, corner_top_right, corner_bottom_left, corner_bottom_right, rowjoin_left, rowjoin_right, upper, closer)
/datum/storage_interface/Destroy(force)
QDEL_NULL(closer)
@@ -81,6 +83,9 @@
rowjoin_right.screen_loc = row_right_loc
rowjoin_right.alpha = (rows > 1) * 255
+ upper.screen_loc = "[screen_start_x + columns]:[screen_pixel_x + 8],[screen_start_y]:[screen_pixel_y]"
+ upper.invisibility = parent_storage.parent.loc?.atom_storage ? 0 : INVISIBILITY_MAXIMUM
+
closer.screen_loc = "[screen_start_x + columns]:[screen_pixel_x - 5],[screen_start_y]:[screen_pixel_y]"
add_items(arglist(args))
diff --git a/code/datums/storage/subtypes/others/bag_of_holding.dm b/code/datums/storage/subtypes/others/bag_of_holding.dm
index 8a4ae79c2936..eefe954bf3ef 100644
--- a/code/datums/storage/subtypes/others/bag_of_holding.dm
+++ b/code/datums/storage/subtypes/others/bag_of_holding.dm
@@ -46,6 +46,7 @@
message_admins("[ADMIN_LOOKUPFLW(user)] detonated a bag of holding at [ADMIN_VERBOSEJMP(rift_loc)].")
user.log_message("detonated a bag of holding at [loc_name(rift_loc)].", LOG_ATTACK, color = "red")
+ user.client?.give_award(/datum/award/achievement/jobs/bag_of_holding, user)
user.investigate_log("has been gibbed by a bag of holding recursive insertion.", INVESTIGATE_DEATHS)
user.gib()
var/obj/reality_tear/tear = new(rift_loc)
diff --git a/code/datums/storage/subtypes/others/rped.dm b/code/datums/storage/subtypes/others/rped.dm
index 7cc6c3188a49..c9862951ef68 100644
--- a/code/datums/storage/subtypes/others/rped.dm
+++ b/code/datums/storage/subtypes/others/rped.dm
@@ -7,8 +7,8 @@
/datum/storage/rped
allow_quick_gather = TRUE
- max_slots = 50
- max_total_storage = 100
+ max_slots = 400
+ max_total_storage = 800
max_specific_storage = WEIGHT_CLASS_NORMAL
numerical_stacking = TRUE
@@ -114,8 +114,12 @@
///bluespace variant
/datum/storage/rped/bluespace
- max_slots = 400
- max_total_storage = 800
max_specific_storage = WEIGHT_CLASS_GIGANTIC
+///Smaller cyborg variant
+
+/datum/storage/rped/compact
+ max_slots = 50
+ max_total_storage = 100
+
#undef MAX_STACK_PICKUP
diff --git a/code/datums/timed_actions.dm b/code/datums/timed_actions.dm
index 45de6081a597..f9c2ab6779c6 100644
--- a/code/datums/timed_actions.dm
+++ b/code/datums/timed_actions.dm
@@ -124,13 +124,13 @@
cancel()
return
+ if(!QDELETED(progressbar))
+ progressbar.update(world.time - start_time)
+
if (world.time >= end_time)
status = ACTION_SUCCEEDED
return PROCESS_KILL
- if(!QDELETED(progressbar))
- progressbar.update(world.time - start_time)
-
/datum/timed_action/proc/on_user_deleted(datum/source)
SIGNAL_HANDLER
user = null
diff --git a/code/datums/weather/particle_weather.dm b/code/datums/weather/particle_weather.dm
index ceb4a9c12859..380fc12ef69d 100644
--- a/code/datums/weather/particle_weather.dm
+++ b/code/datums/weather/particle_weather.dm
@@ -23,8 +23,8 @@
var/severity = 0
/// Last tick during which we've changed our visual severity
var/last_severity_tick = 0
- /// List of weather object lists (as we can have multiple if emissives are involved) by plane offset
- var/list/weather_objects = list()
+ /// alist of weather object lists (as we can have multiple if emissives are involved) by z level
+ var/alist/weather_objects = alist()
/// Direction of our wind
var/wind_sign = 0
@@ -33,27 +33,29 @@
if (isnull(particle_type) && isnull(emissive_type))
CRASH("[src] ([type]) attempted to initialize without normal or emissive particle types!")
- for (var/offset in 0 to SSmapping.max_plane_offset)
+ for(var/z_level in impacted_z_levels)
+ var/offset = GET_Z_PLANE_OFFSET(z_level)
var/list/object_list = list()
if (particle_type)
var/obj/effect/abstract/weather_holder/holder = new()
SET_PLANE_W_SCALAR(holder, RENDER_PLANE_PARTICLE_WEATHER, offset)
holder.particles = new particle_type()
- object_list[holder] = impacted_z_levels
+ object_list += holder
if (emissive_type)
var/obj/effect/abstract/weather_holder/holder = new()
holder.particles = new emissive_type()
SET_PLANE_W_SCALAR(holder, RENDER_PLANE_EMISSIVE_PARTICLE_WEATHER, offset)
- object_list[holder] = impacted_z_levels
+ object_list += holder
- weather_objects += list(object_list)
+ SSweather.add_weather_objects(object_list, z_level)
- SSweather.add_weather_objects(weather_objects)
+ weather_objects[z_level] += object_list
/datum/weather/particle/Destroy()
- SSweather.remove_weather_objects(weather_objects)
- for(var/list/object_list as anything in weather_objects)
+ for(var/z_level in weather_objects)
+ var/list/object_list = weather_objects[z_level]
+ SSweather.remove_weather_objects(object_list, z_level)
QDEL_LIST(object_list)
weather_objects = null
return ..()
@@ -96,7 +98,7 @@
wind_sign = pick(-1, 1)
severity = new_severity
- for (var/list/holder_list as anything in weather_objects)
+ for (var/_z_level, holder_list in weather_objects)
for (var/obj/effect/abstract/weather_holder/holder as anything in holder_list)
var/particles/weather/particle_effect = holder.particles
particle_effect.animate_severity(severity / MAXIMUM_WEATHER_SEVERITY, wind_sign)
@@ -121,6 +123,9 @@
blocks_emissive = EMISSIVE_BLOCK_NONE
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+/// Only exists for disambiguation reasons
+/obj/effect/abstract/weather_holder/z_level
+
/particles/weather
spawning = 0
// Wider than our view due to weird BYOND jank
diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm
index d55938e2bd9d..4d9b1c3fe9c0 100644
--- a/code/datums/weather/weather_types/radiation_storm.dm
+++ b/code/datums/weather/weather_types/radiation_storm.dm
@@ -80,7 +80,8 @@
return ..()
/datum/weather/rad_storm/end()
- if(..())
+ . = ..()
+ if(!.)
return
priority_announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert")
status_alarm(FALSE)
diff --git a/code/datums/weather/weather_types/rain_storm.dm b/code/datums/weather/weather_types/rain_storm.dm
index 43e9a375fa0d..a67c15f0de40 100644
--- a/code/datums/weather/weather_types/rain_storm.dm
+++ b/code/datums/weather/weather_types/rain_storm.dm
@@ -39,7 +39,7 @@
return
// Non-water rain gets colored into their reagent's color
- for (var/list/holder_list as anything in weather_objects)
+ for (var/_z_level, holder_list in weather_objects)
for (var/obj/effect/abstract/weather_holder/holder as anything in holder_list)
holder.particles.color = weather_color
diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm
index 9b03a3283827..f4ce555211d6 100644
--- a/code/datums/wounds/_wounds.dm
+++ b/code/datums/wounds/_wounds.dm
@@ -470,7 +470,7 @@
set_interaction_efficiency_penalty(initial(interaction_efficiency_penalty))
if(initial(disabling))
- set_disabling(splint_factor < 1)
+ set_disabling(!limb.is_splinted())
limb.update_wounds(replaced_or_replacing)
@@ -728,11 +728,15 @@
for(var/i in 1 to severity)
severity_text_formatted += "!"
- return "[name] detected!
\
+ var/scanner_text = "[name] detected!
\
Risk: [severity_text_formatted]
\
- Description: [simple_desc || desc]
\
- Treatment Guide: [simple_treat_text]
\
- Homemade Remedies: [homemade_treat_text]"
+ Description: [simple_desc || desc]
"
+ if(simple_treat_text)
+ scanner_text += "Treatment Guide: [simple_treat_text]
"
+ if(homemade_treat_text)
+ scanner_text += "Homemade Remedies: [homemade_treat_text]"
+
+ return scanner_text
/**
* Returns what text describes this wound
diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm
index 695af1eaef91..ea48e26ba54f 100644
--- a/code/datums/wounds/bones.dm
+++ b/code/datums/wounds/bones.dm
@@ -20,9 +20,11 @@
threshold_penalty = 5
/// Have we been bone gel'd?
- var/gelled
+ var/gelled = FALSE
/// Have we been taped?
- var/taped
+ var/taped = FALSE
+ /// Another method is causing our bones to heal
+ var/healing = FALSE
/// If we did the gel + surgical tape healing method for fractures, how many ticks does it take to heal by default
var/regen_ticks_needed
/// Our current counter for gel + surgical tape regeneration
@@ -89,7 +91,7 @@
next_trauma_cycle = world.time + (rand(100-WOUND_BONE_HEAD_TIME_VARIANCE, 100+WOUND_BONE_HEAD_TIME_VARIANCE) * 0.01 * trauma_cycle_cooldown)
var/is_bone_limb = ((limb.biological_state & BIO_BONE) && !(limb.biological_state & (BIO_FLESH|BIO_CHITIN)))
- if(!gelled || (!taped && !is_bone_limb))
+ if(!healing && (!gelled || (!taped && !is_bone_limb)))
return
regen_ticks_current++
@@ -157,7 +159,7 @@
// This is not arm wound, so we don't care
return
- if(gun.recoil > 0 && severity >= WOUND_SEVERITY_SEVERE && prob(25 * (severity - 1)))
+ if(gun.calculate_recoil(victim, gun.recoil) > 1 && severity >= WOUND_SEVERITY_SEVERE && prob(25 * (severity - 1)))
if(!HAS_TRAIT(victim, TRAIT_ANALGESIA))
to_chat(victim, span_danger("The fracture in your [limb.plaintext_zone] explodes with pain as [gun] kicks back!"))
victim.apply_damage(rand(1, 3) * (severity - 1) * gun.weapon_weight, BRUTE, limb, wound_bonus = CANT_WOUND, wound_clothing = FALSE)
diff --git a/code/datums/wounds/bruised.dm b/code/datums/wounds/bruised.dm
new file mode 100644
index 000000000000..e938ed57262e
--- /dev/null
+++ b/code/datums/wounds/bruised.dm
@@ -0,0 +1,47 @@
+
+/*
+ * Bruise wounds
+ *
+ * Very minor, flavor wounds, for the Coroner to see what may have led up to an individual's death.
+ */
+/datum/wound_pregen_data/bruised
+ abstract = FALSE
+ wound_path_to_generate = /datum/wound/bruised
+ required_limb_biostate = BIO_FLESH
+ required_wounding_type = NONE
+ wound_series = WOUND_SERIES_BRUISING
+
+/datum/wound/bruised
+ name = "Bruising"
+ undiagnosed_name = "Bruising"
+ desc = "Patient's skin appears bruised, showing marks of resistance."
+ sound_effect = null
+ treat_text = "Will treat itself overtime."
+ treat_text_short = "Best left alone."
+ examine_desc = null
+ occur_text = "gets bruised up"
+ threshold_penalty = 1
+ processes = TRUE
+ default_scar_file = null
+ severity = WOUND_SEVERITY_TRIVIAL
+ simple_treat_text = null
+ homemade_treat_text = null
+
+ ///How many ticks the bruise has left until it disappears. Only ticks away while the victim is alive.
+ var/bruise_ticks = 25
+
+/datum/wound/bruised/handle_process(seconds_per_tick)
+ if (!victim || HAS_TRAIT(victim, TRAIT_STASIS) || IS_DEAD_OR_FAKING(victim))
+ return
+
+ bruise_ticks--
+ if(!bruise_ticks)
+ qdel(src)
+
+/datum/wound/bruised/on_xadone(power)
+ . = ..()
+ qdel(src)
+
+/datum/wound/bruised/on_synthflesh(reac_volume)
+ . = ..()
+ qdel(src)
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index fd0f586b98d5..24438ad8398d 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -89,7 +89,7 @@
/// The default gravity for the area
var/default_gravity = ZERO_GRAVITY
- var/parallax_movedir = 0
+ var/parallax_movedir = NONE
var/ambience_index = AMBIENCE_GENERIC
///A list of sounds to pick from every so often to play to clients.
@@ -461,22 +461,19 @@ GLOBAL_LIST_EMPTY(teleportlocs)
fault_location = null
SEND_SIGNAL(src, COMSIG_AREA_FIRE_CHANGED, fire)
-/**
- * Update the icon state of the area
- *
- * I'm not sure what the heck this does, something to do with weather being able to set icon
- * states on areas?? where the heck would that even display?
- */
-/area/update_icon_state()
- var/weather_icon
- for(var/V in SSweather.processing)
- var/datum/weather/W = V
- if(W.stage != END_STAGE && (src in W.impacted_areas))
- W.update_areas()
- weather_icon = TRUE
- if(!weather_icon)
- icon_state = null
- return ..()
+/// Ensures areas render their weather properly
+/area/update_icon()
+ . = ..()
+ for(var/datum/weather/weather as anything in SSweather.processing)
+ if(weather.stage != END_STAGE && (src in weather.impacted_areas))
+ weather.update_areas()
+
+/// Sets the area's parallax movedir (the direction parallax will animate in while in the area)
+/area/proc/set_parallax_movedir(new_dir)
+ if(parallax_movedir == new_dir)
+ return
+ parallax_movedir = new_dir
+ SEND_SIGNAL(src, COMSIG_AREA_PARALLAX_DIR_CHANGED, parallax_movedir)
/**
* Update the icon of the area (overridden to always be null for space
diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm
index 51f054029739..50af25a9fd5b 100644
--- a/code/game/area/areas/mining.dm
+++ b/code/game/area/areas/mining.dm
@@ -191,6 +191,7 @@
icon_state = "mining"
default_gravity = STANDARD_GRAVITY
flags_1 = NONE
+ area_flags = NONE
area_flags_mapping = UNIQUE_AREA | FLORA_ALLOWED
ambience_index = AMBIENCE_ICEMOON
sound_environment = SOUND_AREA_ICEMOON
diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm
index e1ea3b5d6969..ce8185c1e776 100644
--- a/code/game/area/areas/shuttles.dm
+++ b/code/game/area/areas/shuttles.dm
@@ -130,7 +130,6 @@
var/atom/movable/screen/splash/Spl = new(null, null, boarder.client, TRUE)
Spl.fade(TRUE)
boarder.playsound_local(get_turf(boarder), 'sound/announcer/ApproachingTG.ogg', 25)
- boarder.update_parallax_teleport()
/area/shuttle/pod_1
name = "Escape Pod One"
diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm
index b7b17bdbd11a..e3a4c73ae1b1 100644
--- a/code/game/atom/_atom.dm
+++ b/code/game/atom/_atom.dm
@@ -600,14 +600,10 @@
/atom/proc/wash(clean_types)
SHOULD_CALL_PARENT(TRUE)
. = SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, clean_types)
- if(.)
- return
-
// Basically "if has washable coloration"
if(length(atom_colours) >= WASHABLE_COLOUR_PRIORITY && atom_colours[WASHABLE_COLOUR_PRIORITY])
remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
- return COMPONENT_CLEANED|COMPONENT_CLEANED_GAIN_XP
- return NONE
+ . |= COMPONENT_CLEANED|COMPONENT_CLEANED_GAIN_XP
///Where atoms should drop if taken from this atom
/atom/proc/drop_location()
diff --git a/code/game/atom/atom_act.dm b/code/game/atom/atom_act.dm
index 69a4ec6c7840..c0d8e3a0493f 100644
--- a/code/game/atom/atom_act.dm
+++ b/code/game/atom/atom_act.dm
@@ -160,7 +160,7 @@
///Handle the atom being slipped over
/atom/proc/handle_slip(mob/living/carbon/slipped_carbon, knockdown_amount, obj/slipping_object, lube, paralyze, daze, force_drop)
- return
+ return FALSE
///Used for making a sound when a mob involuntarily falls into the ground.
/atom/proc/handle_fall(mob/faller)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index c6a60d464769..3166be2d61da 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -63,9 +63,6 @@
* do NOT add channels to this for little reason as it can add considerable memory usage.
*/
var/list/important_recursive_contents
- ///contains every client mob corresponding to every client eye in this container. lazily updated by SSparallax and is sparse:
- ///only the last container of a client eye has this list assuming no movement since SSparallax's last fire
- var/list/client_mobs_in_contents
/// String representing the spatial grid groups we want to be held in.
/// acts as a key to the list of spatial grid contents types we exist in via SSspatial_grid.spatial_grid_categories.
@@ -250,8 +247,6 @@
if(spatial_grid_key)
SSspatial_grid.force_remove_from_grid(src)
- LAZYNULL(client_mobs_in_contents)
-
#ifndef DISABLE_DREAMLUAU
// These lists cease existing when src does, so we need to clear any lua refs to them that exist.
DREAMLUAU_CLEAR_REF_USERDATA(vis_contents)
@@ -830,8 +825,6 @@
setDir(first_step_dir)
else if(!inertia_moving)
newtonian_move(dir2angle(direct))
- if(client_mobs_in_contents)
- update_parallax_contents()
moving_diagonally = 0
return
@@ -905,11 +898,6 @@
if (!moving_diagonally && !inertia_moving && momentum_change && movement_dir)
newtonian_move(dir2angle(movement_dir))
- // If we ain't moving diagonally right now, update our parallax
- // We don't do this all the time because diag movements should trigger one call to this, not two
- // Waste of cpu time, and it fucks the animate
- if (!moving_diagonally && client_mobs_in_contents)
- update_parallax_contents()
SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, old_loc, movement_dir, forced, old_locs, momentum_change)
@@ -1751,9 +1739,10 @@
/atom/movable/proc/setGrabState(newstate)
if(newstate == grab_state)
return
- SEND_SIGNAL(src, COMSIG_MOVABLE_SET_GRAB_STATE, newstate)
. = grab_state
grab_state = newstate
+ SEND_SIGNAL(src, COMSIG_MOVABLE_SET_GRAB_STATE, grab_state)
+ SEND_SIGNAL(pulling, COMSIG_MOVABLE_CHANGED_GRABBED_STATE, grab_state)
switch(grab_state) // Current state.
if(GRAB_PASSIVE)
pulling.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), CHOKEHOLD_TRAIT)
diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm
index 49d737ffd16f..8add50d252de 100644
--- a/code/game/gamemodes/objective_items.dm
+++ b/code/game/gamemodes/objective_items.dm
@@ -912,12 +912,12 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new())
return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/rescue)
/datum/objective_item/steal/spy/cmo_defib
- name = "Chief Medical Officer's Compact Defibrillator"
+ name = "the chief medical officer's experimental compact defibrillator"
targetitem = /obj/item/defibrillator/compact/loaded/cmo
excludefromjob = list(JOB_CHIEF_MEDICAL_OFFICER)
exists_on_map = TRUE
difficulty = 2
- steal_hint = "The Compact Defibrillator, found on their person, or in their closet."
+ steal_hint = "An experimental compact defibrillator that is usually located somewhere near the Chief Medical Officer when corpses pile up."
/obj/item/defibrillator/compact/loaded/cmo/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/defibrillator/compact/loaded/cmo)
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index a52be682b34a..2bafdaaf8579 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -12,13 +12,6 @@
var/obj/item/card/id/stored_id_card = null
/// Current PDA inserted into the machine.
var/obj/item/modular_computer/pda/stored_pda = null
- /// A blacklist of PDA types that we should not be able to paint.
- var/static/list/pda_type_blacklist = list(
- /obj/item/modular_computer/pda/heads,
- /obj/item/modular_computer/pda/clear,
- /obj/item/modular_computer/pda/syndicate,
- /obj/item/modular_computer/pda/chameleon,
- /obj/item/modular_computer/pda/chameleon/broken)
/// A list of the PDA types that this machine can currently paint.
var/list/pda_types = list()
/// A list of the card trims that this machine can currently imprint onto a card.
diff --git a/code/game/machinery/ai_core/_core.dm b/code/game/machinery/ai_core/_core.dm
index 4b39bc993092..dbd5cf541f2b 100644
--- a/code/game/machinery/ai_core/_core.dm
+++ b/code/game/machinery/ai_core/_core.dm
@@ -12,11 +12,11 @@
custom_materials = list(/datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 4)
var/state = CORE_STATE_EMPTY
var/obj/item/circuitboard/aicore/circuit
- var/obj/item/mmi/core_mmi
+ var/obj/item/brain_processor/core_mmi
/// Weakref to an ai module rack, if present we will try to link new AI to it instead of the station core
var/datum/weakref/default_link_ref
-/obj/structure/ai_core/Initialize(mapload, state = src.state, obj/item/mmi/core_mmi = null)
+/obj/structure/ai_core/Initialize(mapload, state = src.state, obj/item/brain_processor/core_mmi = null)
. = ..()
if(core_mmi && state < CORE_STATE_CABLED)
stack_trace("supplied a core_mmi as constructor argument, but core state wouldn't have accepted it!")
@@ -25,13 +25,7 @@
if(state >= CORE_STATE_CIRCUIT)
circuit = new(src)
if(state >= CORE_STATE_CABLED)
- if(!core_mmi)
- core_mmi = new /obj/item/mmi(src)
- core_mmi.brain = new(core_mmi)
- core_mmi.brain.organ_flags |= ORGAN_FROZEN
- core_mmi.set_brainmob(new /mob/living/brain())
- core_mmi.brainmob.container = core_mmi
- core_mmi.update_appearance()
+ core_mmi ||= new /obj/item/brain_processor/organic(src, new /obj/item/organ/brain())
core_mmi.forceMove(src)
src.core_mmi = core_mmi
set_anchored(TRUE)
@@ -186,8 +180,6 @@
var/mob/living/silicon/ai/ai_mob = new(loc, the_brainmob, core_mmi.laws, default_link_ref?.resolve())
- if(core_mmi.force_replace_ai_name)
- ai_mob.fully_replace_character_name(ai_mob.name, core_mmi.replacement_ai_name())
ai_mob.posibrain_inside = core_mmi.braintype == "Android"
deadchat_broadcast(" has been brought online at [get_area_name(ai_mob, format_text = TRUE)].", span_name("[ai_mob]"), follow_target = ai_mob, message_type = DEADCHAT_ANNOUNCEMENT)
qdel(src)
diff --git a/code/game/machinery/ai_core/core_construction.dm b/code/game/machinery/ai_core/core_construction.dm
index 97a61aa1974d..cbeedd2716e8 100644
--- a/code/game/machinery/ai_core/core_construction.dm
+++ b/code/game/machinery/ai_core/core_construction.dm
@@ -161,7 +161,7 @@
if(istype(tool, /obj/item/stack/cable_coil))
return add_cabling(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING
- if(istype(tool, /obj/item/mmi))
+ if(istype(tool, /obj/item/brain_processor))
return install_mmi(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING
if(istype(tool, /obj/item/stack/sheet/rglass))
return install_glass(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING
@@ -194,7 +194,7 @@
UPDATE_STATE(CORE_STATE_CABLED)
return TRUE
-/obj/structure/ai_core/proc/install_mmi(mob/living/user, obj/item/mmi/mmi)
+/obj/structure/ai_core/proc/install_mmi(mob/living/user, obj/item/brain_processor/mmi)
if(state != CORE_STATE_CABLED)
return FALSE
diff --git a/code/game/machinery/computer/atmos_computers/inlets.dm b/code/game/machinery/computer/atmos_computers/inlets.dm
index 06b4f8fdc99d..25b2857cbd79 100644
--- a/code/game/machinery/computer/atmos_computers/inlets.dm
+++ b/code/game/machinery/computer/atmos_computers/inlets.dm
@@ -79,6 +79,14 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input
name = "incinerator chamber input injector"
+/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input/layer2
+ piping_layer = 2
+ icon_state = "inje_map-2"
+
+/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input/layer4
+ piping_layer = 4
+ icon_state = "inje_map-4"
+
/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_burn_chamber_input
on = FALSE
name = "ordnance burn chamber input injector"
diff --git a/code/game/machinery/computer/atmos_computers/outlets.dm b/code/game/machinery/computer/atmos_computers/outlets.dm
index a3d93d16a87d..d1e5db2f4992 100644
--- a/code/game/machinery/computer/atmos_computers/outlets.dm
+++ b/code/game/machinery/computer/atmos_computers/outlets.dm
@@ -18,6 +18,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output
name = "mix tank output inlet"
+ on = FALSE
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output
name = "nitrous oxide tank output inlet"
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 45849a8e3c3d..3ffbf5637506 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -102,6 +102,7 @@
active_camera?.on_stop_watching(src)
var/obj/machinery/camera/selected_camera = locate(params["camera"]) in SScameras.cameras
active_camera = selected_camera
+ cam_screen.set_display(active_camera)
if(isnull(active_camera))
return TRUE
@@ -156,6 +157,7 @@
if(length(concurrent_users) == 0 && is_living)
active_camera?.on_stop_watching(src)
active_camera = null
+ cam_screen?.set_display(null)
last_camera_turf = null
playsound(src, 'sound/machines/terminal/terminal_off.ogg', 25, FALSE)
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index 4443f3c285dc..094adbb25763 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -839,6 +839,10 @@
if(!mutation)
return
+ if(length(mutation.sources) && get_mutation_class(mutation) == SCANNER_MUTATION_CLASS_OTHER)
+ say("ERROR: This mutation is anomalous, and cannot be printed.")
+ return
+
// Create a new DNA Injector and add the appropriate mutations to it
var/obj/item/dnainjector/activator/injector = new /obj/item/dnainjector/activator(loc)
LAZYADD(injector.add_mutations, mutation.make_copy())
@@ -967,6 +971,10 @@
if(!original)
return
+ if(length(original.sources) && get_mutation_class(original) == SCANNER_MUTATION_CLASS_OTHER)
+ say("ERROR: This mutation is anomalous, and cannot be saved.")
+ return
+
diskette.mutations += original.make_copy()
to_chat(usr,span_notice("Mutation successfully stored to disk."))
return
@@ -2166,6 +2174,7 @@
return SCANNER_MUTATION_CLASS_ACTIVATOR
if(MUTATION_SOURCE_MUTATOR in mutation.sources)
return SCANNER_MUTATION_CLASS_MUTATOR
+ return null
/**
* Checks whether a mutation alias has been discovered
diff --git a/code/game/machinery/computer/operating_computer.dm b/code/game/machinery/computer/operating_computer.dm
index 890d7f3a8dc5..af129177050d 100644
--- a/code/game/machinery/computer/operating_computer.dm
+++ b/code/game/machinery/computer/operating_computer.dm
@@ -190,7 +190,7 @@
data["patient"]["health"] = patient.health
data["patient"]["blood_type"] = patient.get_bloodtype()?.name || "UNKNOWN"
data["patient"]["maxHealth"] = patient.maxHealth
- data["patient"]["minHealth"] = HEALTH_THRESHOLD_DEAD
+ data["patient"]["minHealth"] = patient.dead_threshold
data["patient"]["bruteLoss"] = patient.get_brute_loss()
data["patient"]["fireLoss"] = patient.get_fire_loss()
data["patient"]["toxLoss"] = patient.get_tox_loss()
diff --git a/code/game/machinery/computer/prisoner/_prisoner.dm b/code/game/machinery/computer/prisoner/_prisoner.dm
index c2d0de757258..ce9cf6a471b3 100644
--- a/code/game/machinery/computer/prisoner/_prisoner.dm
+++ b/code/game/machinery/computer/prisoner/_prisoner.dm
@@ -26,7 +26,14 @@
id_eject(user)
return CLICK_ACTION_SUCCESS
-/obj/machinery/computer/prisoner/proc/id_insert(mob/user, obj/item/card/id/advanced/prisoner/new_id)
+/**
+ * Called when the prison teleporter computer attempts to insert a new ID card, that will be assigned to the prisoner if successful.
+ * user: The mob user of the computer.
+ * new_id: The ID that we're trying to insert.
+ */
+/obj/machinery/computer/prisoner/proc/id_insert(mob/living/user, obj/item/card/id/advanced/prisoner/new_id)
+ if(!new_id)
+ new_id = user.get_active_held_item()
if(!istype(new_id))
return
if(!isnull(contained_id))
diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm
index 83ed8b3a02e8..647c9d75a391 100644
--- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm
+++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm
@@ -44,6 +44,7 @@
)
output_organs = list(
/obj/item/organ/brain/carp,
+ /obj/item/organ/fangs/carp,
/obj/item/organ/heart/carp,
/obj/item/organ/lungs/carp,
/obj/item/organ/tongue/carp,
@@ -235,6 +236,7 @@
output_organs = list(
/obj/item/organ/eyes/stoat,
/obj/item/organ/ears/stoat,
+ /obj/item/organ/fangs/stoat,
/obj/item/organ/heart/stoat,
/obj/item/organ/tongue/stoat,
/obj/item/organ/snout/stoat,
diff --git a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm
index c0a1690e4ab8..71ff488df43a 100644
--- a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm
@@ -6,7 +6,7 @@
///bonus of the carp: you can swim through space!
/datum/status_effect/organ_set_bonus/carp
id = "organ_set_bonus_carp"
- organs_needed = 4
+ organs_needed = 5
bonus_activate_text = span_notice("Carp DNA is deeply infused with you! You've learned how to propel yourself through space!")
bonus_deactivate_text = span_notice("Your DNA is once again mostly yours, and so fades your ability to space-swim...")
bonus_traits = list(TRAIT_SPACEWALK)
@@ -36,60 +36,43 @@
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/carp)
///occasionally sheds carp teeth, stronger melee (bite) attacks, but you can't cover your mouth anymore.
-/obj/item/organ/tongue/carp
+/obj/item/organ/fangs/carp
name = "mutated carp-jaws"
desc = "Carp DNA infused into what was once some normal teeth."
-
- say_mod = "gnashes"
-
- icon = 'icons/map_icons/items/_item.dmi'
- icon_state = "/obj/item/organ/tongue/carp"
- post_init_icon_state = "tongue"
- greyscale_config = /datum/greyscale_config/mutant_organ
- greyscale_colors = CARP_COLORS
-
-/obj/item/organ/tongue/carp/Initialize(mapload)
+ icon_state = "fangs_lizard"
+ organ_traits = list(TRAIT_FERAL_BITER)
+ bite_low = 10
+ bite_high = 15
+ bite_effectiveness = 15
+ bite_attack_effect = ATTACK_EFFECT_BITE
+ bite_sharpness = SHARP_POINTY
+
+/obj/item/organ/fangs/carp/Initialize(mapload)
. = ..()
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their teeth are big and sharp.", BODY_ZONE_PRECISE_MOUTH)
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/carp)
-/obj/item/organ/tongue/carp/on_mob_insert(mob/living/carbon/tongue_owner, special, movement_flags)
+/obj/item/organ/fangs/carp/on_mob_insert(mob/living/carbon/fangs_owner, special, movement_flags)
. = ..()
- if(!ishuman(tongue_owner))
+ if(!ishuman(fangs_owner))
return
- var/mob/living/carbon/human/human_receiver = tongue_owner
+ var/mob/living/carbon/human/human_receiver = fangs_owner
if(!human_receiver.can_mutate())
return
var/datum/species/rec_species = human_receiver.dna.species
- rec_species.update_no_equip_flags(tongue_owner, rec_species.no_equip_flags | ITEM_SLOT_MASK)
+ rec_species.update_no_equip_flags(fangs_owner, rec_species.no_equip_flags | ITEM_SLOT_MASK)
-/obj/item/organ/tongue/carp/on_bodypart_insert(obj/item/bodypart/head)
+/obj/item/organ/fangs/carp/on_mob_remove(mob/living/carbon/fangs_owner)
. = ..()
- head.unarmed_damage_low = 10
- head.unarmed_damage_high = 15
- head.unarmed_effectiveness = 15
- head.unarmed_attack_effect = ATTACK_EFFECT_BITE
- head.unarmed_sharpness = SHARP_POINTY
-
-/obj/item/organ/tongue/carp/on_mob_remove(mob/living/carbon/tongue_owner)
- . = ..()
- if(!ishuman(tongue_owner))
+ if(!ishuman(fangs_owner))
return
- var/mob/living/carbon/human/human_receiver = tongue_owner
+ var/mob/living/carbon/human/human_receiver = fangs_owner
if(!human_receiver.can_mutate())
return
var/datum/species/rec_species = human_receiver.dna.species
- rec_species.update_no_equip_flags(tongue_owner, initial(rec_species.no_equip_flags))
-
-/obj/item/organ/tongue/carp/on_bodypart_remove(obj/item/bodypart/head)
- . = ..()
- head.unarmed_damage_low = initial(head.unarmed_damage_low)
- head.unarmed_damage_high = initial(head.unarmed_damage_high)
- head.unarmed_effectiveness = initial(head.unarmed_effectiveness)
- head.unarmed_attack_effect = initial(head.unarmed_attack_effect)
- head.unarmed_sharpness = initial(head.unarmed_sharpness)
+ rec_species.update_no_equip_flags(fangs_owner, initial(rec_species.no_equip_flags))
-/obj/item/organ/tongue/carp/on_life(seconds_per_tick)
+/obj/item/organ/fangs/carp/on_life(seconds_per_tick)
. = ..()
if(IS_UNCONSCIOUS_OR_CRIT(owner) || !prob(0.1))
return
@@ -98,6 +81,20 @@
if(tooth_fairy)
new /obj/item/knife/carp(tooth_fairy)
+/obj/item/organ/tongue/carp
+ name = "mutated carp-tongue"
+ desc = "Carp DNA infused into what was once a normal tongue."
+ say_mod = "gnashes"
+ icon = 'icons/map_icons/items/_item.dmi'
+ icon_state = "/obj/item/organ/tongue/carp"
+ post_init_icon_state = "tongue"
+ greyscale_config = /datum/greyscale_config/mutant_organ
+ greyscale_colors = CARP_COLORS
+
+/obj/item/organ/tongue/carp/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/carp)
+
/obj/item/organ/tongue/carp/get_possible_languages()
. = ..()
. += /datum/language/carptongue
@@ -143,9 +140,6 @@
UnregisterSignal(brain_owner, COMSIG_MOVABLE_Z_CHANGED)
deltimer(cooldown_timer)
-/obj/item/organ/brain/carp/get_attacking_limb(mob/living/carbon/human/target)
- return owner.get_bodypart(BODY_ZONE_HEAD)
-
/obj/item/organ/brain/carp/proc/unsatisfied_nomad()
owner.add_mood_event("nomad", /datum/mood_event/unsatisfied_nomad)
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 0683af2ff0df..c85849e57e96 100644
--- a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm
@@ -38,12 +38,10 @@
RegisterSignals(owner, list(SIGNAL_ADDTRAIT(TRAIT_IS_WET), SIGNAL_REMOVETRAIT(TRAIT_IS_WET)), PROC_REF(update_wetness))
RegisterSignals(owner, COMSIG_LIVING_GET_PERCEIVED_FOOD_QUALITY, PROC_REF(get_perceived_food_quality))
- if(ishuman(owner))
- var/mob/living/carbon/human/human = owner
- //Fish is slightly weaker to being cooked. oh oh.
- human.physiology.burn_mod *= 1.15
- human.physiology.heat_mod *= 1.15
- human.physiology.damage_resistance += 8 //base 8% damage resistance, much wow.
+ //Fish is slightly weaker to being cooked. oh oh.
+ MODIFY_PHYSIOLOGY(owner, BURN, 1.15)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_HEAT, 1.15)
+ owner.damage_resistance += 8 //base 8% damage resistance, much wow.
if(!HAS_TRAIT(owner, TRAIT_IS_WET))
apply_debuff()
else
@@ -69,11 +67,9 @@
else
REMOVE_TRAIT(owner, TRAIT_GRABRESISTANCE, TRAIT_STATUS_EFFECT(id))
owner.clear_mood_event("fish_organs_bonus")
- if(ishuman(owner))
- var/mob/living/carbon/human/human = owner
- human.physiology.burn_mod /= 1.15
- human.physiology.heat_mod /= 1.15
- human.physiology.damage_resistance -= 8
+ MODIFY_PHYSIOLOGY(owner, BURN, 1 / 1.15)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_HEAT, 1 / 1.15)
+ owner.damage_resistance -= 8
if(HAS_TRAIT(owner, TRAIT_IS_WET) && istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/tail/fish))
remove_speed_buff()
owner.mind?.adjust_experience(/datum/skill/fishing, -SKILL_EXP_JOURNEYMAN, silent = TRUE)
@@ -150,31 +146,25 @@
REMOVE_TRAIT(owner, TRAIT_GRABRESISTANCE, REF(src))
owner.add_movespeed_modifier(/datum/movespeed_modifier/fish_waterless)
owner.add_mood_event("fish_organs_bonus", /datum/mood_event/fish_waterless)
- if(!ishuman(owner))
- return
- var/mob/living/carbon/human/human = owner
- human.physiology.burn_mod *= 1.5
- human.physiology.heat_mod *= 1.2
- human.physiology.brute_mod *= 1.1
- human.physiology.stun_mod *= 1.1
- human.physiology.knockdown_mod *= 1.1
- human.physiology.stamina_mod *= 1.1
- human.physiology.damage_resistance -= 16 //from +8% to -8%
+ MODIFY_PHYSIOLOGY(owner, BURN, 1.5)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_HEAT, 1.2)
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 1.1)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_STUN, 1.1)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_KNOCKDOWN, 1.1)
+ MODIFY_PHYSIOLOGY(owner, STAMINA, 1.1)
+ owner.damage_resistance -= 16 // This should bring the resistance from +8% to -8%
/datum/status_effect/organ_set_bonus/fish/proc/remove_debuff()
ADD_TRAIT(owner, TRAIT_GRABRESISTANCE, TRAIT_STATUS_EFFECT(id)) //harder to grab when wet.
owner.remove_movespeed_modifier(/datum/movespeed_modifier/fish_waterless)
owner.add_mood_event("fish_organs_bonus", /datum/mood_event/fish_water)
- if(!ishuman(owner))
- return
- var/mob/living/carbon/human/human = owner
- human.physiology.burn_mod /= 1.5
- human.physiology.heat_mod /= 1.2
- human.physiology.brute_mod /= 1.1
- human.physiology.stun_mod /= 1.1
- human.physiology.knockdown_mod /= 1.1
- human.physiology.stamina_mod /= 1.1
- human.physiology.damage_resistance += 16 //from -8% to +8%
+ MODIFY_PHYSIOLOGY(owner, BURN, 1 / 1.5)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_HEAT, 1 / 1.2)
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 1 / 1.1)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_STUN, 1 / 1.1)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_KNOCKDOWN, 1 / 1.1)
+ MODIFY_PHYSIOLOGY(owner, STAMINA, 1 / 1.1)
+ owner.damage_resistance += 16
/datum/status_effect/organ_set_bonus/fish/proc/check_tail(mob/living/carbon/source, obj/item/organ/organ, special)
SIGNAL_HANDLER
diff --git a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
index d9a0abbe76a5..f99baad5c395 100644
--- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
@@ -72,18 +72,11 @@
/obj/item/organ/heart/rat/on_mob_insert(mob/living/carbon/receiver)
. = ..()
- if(!ishuman(receiver))
- return
- var/mob/living/carbon/human/human_receiver = receiver
- //but 1.5 damage
- human_receiver.physiology?.damage_resistance -= 50
+ receiver.damage_resistance -= 50 //but 1.5 damage
/obj/item/organ/heart/rat/on_mob_remove(mob/living/carbon/heartless, special, movement_flags)
. = ..()
- if(!ishuman(heartless))
- return
- var/mob/living/carbon/human/human_heartless = heartless
- human_heartless.physiology?.damage_resistance += 50
+ heartless.damage_resistance += 50 //revert damage resistance
/// you occasionally squeak, and have some rat related verbal tics
/obj/item/organ/tongue/rat
diff --git a/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm b/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm
index a3d48aa57f91..58b36fb69a1f 100644
--- a/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm
@@ -22,19 +22,14 @@
/datum/status_effect/organ_set_bonus/roach/enable_bonus(obj/item/organ/inserted_organ)
. = ..()
- if(!ishuman(owner))
- return
-
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.armor = human_owner.physiology.armor.add_other_armor(given_armor)
+ owner.add_inner_armor(given_armor)
/datum/status_effect/organ_set_bonus/roach/disable_bonus(obj/item/organ/removed_organ)
. = ..()
- if(!ishuman(owner) || QDELETED(owner))
+ if(QDELETED(owner))
return
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.armor = human_owner.physiology.armor.subtract_other_armor(given_armor)
+ owner.remove_inner_armor(given_armor)
/// Roach heart:
/// Reduces damage taken from brute attacks from behind,
@@ -75,7 +70,7 @@
RegisterSignal(human_owner, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, PROC_REF(modify_damage))
RegisterSignal(human_owner, COMSIG_MOB_AFTER_APPLY_DAMAGE, PROC_REF(do_block_effect))
- human_owner.physiology.knockdown_mod *= 3
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_KNOCKDOWN, 3)
/obj/item/organ/heart/roach/on_bodypart_insert(obj/item/bodypart/limb)
. = ..()
@@ -83,13 +78,11 @@
/obj/item/organ/heart/roach/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
- if(!ishuman(organ_owner) || QDELETED(organ_owner))
+ if(QDELETED(organ_owner))
return
- var/mob/living/carbon/human/human_owner = organ_owner
-
- UnregisterSignal(human_owner, list(COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, COMSIG_MOB_AFTER_APPLY_DAMAGE))
- human_owner.physiology.knockdown_mod /= 3
+ UnregisterSignal(organ_owner, list(COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, COMSIG_MOB_AFTER_APPLY_DAMAGE))
+ MODIFY_PHYSIOLOGY(organ_owner, PHYS_COEFF_KNOCKDOWN, 1/3)
/obj/item/organ/heart/roach/on_bodypart_remove(obj/item/bodypart/limb)
. = ..()
@@ -198,19 +191,14 @@
/obj/item/organ/liver/roach/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
- if(!ishuman(organ_owner))
- return
-
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.tox_mod *= 2
+ MODIFY_PHYSIOLOGY(owner, TOX, 2)
/obj/item/organ/liver/roach/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
- if(!ishuman(organ_owner) || QDELETED(organ_owner))
+ if(QDELETED(organ_owner))
return
- var/mob/living/carbon/human/human_owner = organ_owner
- human_owner.physiology.tox_mod *= 0.5
+ MODIFY_PHYSIOLOGY(organ_owner, TOX, 0.5)
/// Roach appendix:
/// No appendicitus! weee!
diff --git a/code/game/machinery/dna_infuser/organ_sets/stoat_organs.dm b/code/game/machinery/dna_infuser/organ_sets/stoat_organs.dm
index c2991ae85d8c..16d61bcf1d99 100644
--- a/code/game/machinery/dna_infuser/organ_sets/stoat_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/stoat_organs.dm
@@ -4,7 +4,7 @@
/datum/status_effect/organ_set_bonus/stoat
id = "organ_set_bonus_stoat"
tick_interval = 3 SECONDS
- organs_needed = 4
+ organs_needed = 5
bonus_activate_text = span_notice("Stoat DNA is deeply infused with you! \
Your instincts set in - you now feel fearless, as if you could take on any enemy, no matter the size difference.")
bonus_deactivate_text = span_notice("You are no longer majority stoat, \
@@ -132,6 +132,20 @@
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/stoat)
AddElement(/datum/element/update_icon_blocker)
+/obj/item/organ/fangs/stoat
+ desc = "Stoat DNA infused into what was once some normal teeth."
+ bite_low = 7
+ bite_high = 7
+ bite_effectiveness = 20
+ bite_pummeling_bonus = 0.75
+ bite_attack_effect = ATTACK_EFFECT_BITE
+ bite_sharpness = SHARP_POINTY
+ organ_traits = list(TRAIT_FERAL_BITER)
+
+/obj/item/organ/fangs/stoat/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/stoat)
+
/obj/item/organ/tongue/stoat
name = "mutated stoat-tongue"
desc = "Stoat DNA infused into what was once a normal tongue."
@@ -145,7 +159,6 @@
liked_foodtypes = MEAT | RAW | GORE | BUGS
disliked_foodtypes = FRUIT | VEGETABLES
taste_sensitivity = 12
- organ_traits = list(TRAIT_FERAL_BITER)
/obj/item/organ/tongue/stoat/Initialize(mapload)
. = ..()
@@ -159,34 +172,12 @@
/obj/item/organ/tongue/stoat/on_mob_insert(mob/living/carbon/receiver, special, movement_flags)
. = ..()
RegisterSignals(receiver, COMSIG_LIVING_GET_PERCEIVED_FOOD_QUALITY, PROC_REF(get_perceived_food_quality))
- if(ishuman(receiver))
- var/mob/living/carbon/human/human_receiver = receiver
- human_receiver.physiology.hunger_mod *= 2
+ MODIFY_PHYSIOLOGY(receiver, PHYS_COEFF_HUNGER_MOD, 2)
/obj/item/organ/tongue/stoat/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
UnregisterSignal(organ_owner, COMSIG_LIVING_GET_PERCEIVED_FOOD_QUALITY)
- if(ishuman(organ_owner))
- var/mob/living/carbon/human/human_remover = organ_owner
- human_remover.physiology.hunger_mod /= 2
-
-/obj/item/organ/tongue/stoat/on_bodypart_insert(obj/item/bodypart/limb)
- . = ..()
- limb.unarmed_damage_low += 7
- limb.unarmed_damage_high += 7
- limb.unarmed_effectiveness += 20
- limb.unarmed_pummeling_bonus += 0.75
- limb.unarmed_attack_effect = ATTACK_EFFECT_BITE
- limb.unarmed_sharpness = SHARP_POINTY
-
-/obj/item/organ/tongue/stoat/on_bodypart_remove(obj/item/bodypart/limb)
- . = ..()
- limb.unarmed_damage_low -= 7
- limb.unarmed_damage_high -= 7
- limb.unarmed_effectiveness -= 20
- limb.unarmed_pummeling_bonus -= 0.75
- limb.unarmed_attack_effect = initial(limb.unarmed_attack_effect)
- limb.unarmed_sharpness = initial(limb.unarmed_sharpness)
+ MODIFY_PHYSIOLOGY(organ_owner, PHYS_COEFF_HUNGER_MOD, 0.5)
/obj/item/organ/tongue/stoat/proc/get_perceived_food_quality(mob/living/carbon/consumer, obj/item/food/consumed_food, list/extra_quality)
SIGNAL_HANDLER
diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm
index 6cfa45868571..61078cfcd0ce 100644
--- a/code/game/machinery/dna_scanner.dm
+++ b/code/game/machinery/dna_scanner.dm
@@ -76,8 +76,7 @@
else if(!locked) //Not locked and not primitive? escape immediately
open_machine()
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
user.visible_message(span_notice("You see [user] kicking against the door of [src]!"), \
span_notice("You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)"), \
span_hear("You hear a metallic creaking from [src]."))
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index e7ea2f192b6b..434015da3f48 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -120,7 +120,6 @@
var/obj/item/note
/// The seal on the airlock
var/obj/item/seal
- var/abandoned = FALSE
/// Controls if the door closes quickly or not. FALSE = the door autocloses in 1.5 seconds, TRUE = 8 seconds - see autoclose_in()
var/normalspeed = TRUE
var/cutAiWire = FALSE
@@ -1285,7 +1284,7 @@
to_chat(user, span_warning("You need to be wielding [tool] to do that!"))
return
- INVOKE_ASYNC(src, density ? PROC_REF(open) : PROC_REF(close), BYPASS_DOOR_CHECKS)
+ INVOKE_ASYNC(src, density ? PROC_REF(open) : PROC_REF(close), BYPASS_DOOR_CHECKS, user)
return
if(!forced)
@@ -1320,12 +1319,12 @@
if(check_electrified && shock(user, 100))
return
- open(BYPASS_DOOR_CHECKS)
+ open(BYPASS_DOOR_CHECKS, user)
take_damage(AIRLOCK_PRY_DAMAGE, BRUTE, 0, 0) // Enough to sometimes spark
- if(density && !open(BYPASS_DOOR_CHECKS))
+ if(density && !open(BYPASS_DOOR_CHECKS, user))
to_chat(user, span_warning("Despite your attempts, [src] refuses to open."))
-/obj/machinery/door/airlock/open(forced = DEFAULT_DOOR_CHECKS)
+/obj/machinery/door/airlock/open(forced = DEFAULT_DOOR_CHECKS, mob/living/opener)
if(cycle_pump && !operating && !welded && !seal && locked && density)
cycle_pump.airlock_act(src)
return FALSE // The rest will be handled by the pump
@@ -1362,6 +1361,8 @@
addtimer(CALLBACK(cyclelinkedairlock, PROC_REF(close)), BYPASS_DOOR_CHECKS)
SEND_SIGNAL(src, COMSIG_AIRLOCK_OPEN, forced)
+ if (opener)
+ SEND_SIGNAL(opener, COMSIG_MOB_OPENED_AIRLOCK, forced)
set_airlock_state(AIRLOCK_OPENING, animated = TRUE, force_type = forced)
var/transparent_delay = animation_segment_delay(AIRLOCK_OPENING_TRANSPARENT)
sleep(transparent_delay)
@@ -1879,7 +1880,7 @@
else if(!density)
close()
else
- open()
+ open(opener = user)
/**
* Generates the airlock's wire layout based on the current area the airlock resides in.
@@ -2618,8 +2619,10 @@
// set_density on both open and close procs has a check and return builtin.
-/obj/machinery/door/airlock/instant/open(forced = DEFAULT_DOOR_CHECKS)
+/obj/machinery/door/airlock/instant/open(forced = DEFAULT_DOOR_CHECKS, mob/living/opener)
SEND_SIGNAL(src, COMSIG_AIRLOCK_OPEN, forced)
+ if (opener)
+ SEND_SIGNAL(opener, COMSIG_MOB_OPENED_AIRLOCK, forced)
operating = TRUE
set_density(FALSE)
set_airlock_state(AIRLOCK_OPEN, animated = FALSE)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index f21a9f3cdd4c..b33f4a70fa76 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -342,7 +342,7 @@
// note: if the ID wire is cut no ID cards are checked at all! (This is intentional!)
if(access_bypass || (requiresID() && user_can_activate_door(user)))
if(density)
- open()
+ open(opener = user)
else
close()
return TRUE
@@ -581,11 +581,15 @@
/// Public proc that simply handles opening the door. Returns TRUE if the door was opened, FALSE otherwise.
/// Use argument "forced" in conjunction with try_to_force_door_open if you want/need additional checks depending on how sorely you need the door opened.
-/obj/machinery/door/proc/open(forced = DEFAULT_DOOR_CHECKS)
+/obj/machinery/door/proc/open(forced = DEFAULT_DOOR_CHECKS, mob/living/opener)
if(!density)
return TRUE
if(operating)
return FALSE
+
+ if (opener)
+ SEND_SIGNAL(opener, COMSIG_MOB_OPENED_DOOR, forced)
+
operating = TRUE
use_energy(active_power_usage)
run_animation(DOOR_OPENING_ANIMATION)
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index a221867bc13b..0253739a31ab 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -552,7 +552,7 @@
being_held_open = TRUE
crowbar_owner.balloon_alert_to_viewers("holding firelock open", "holding firelock open")
COOLDOWN_START(src, activation_cooldown, REACTIVATION_DELAY)
- open()
+ open(opener = user)
if(QDELETED(crowbar_owner))
being_held_open = FALSE
return
@@ -569,7 +569,7 @@
return
if(density)
- open()
+ open(opener = user)
if(active)
addtimer(CALLBACK(src, PROC_REF(correct_state)), 2 SECONDS, TIMER_UNIQUE)
else
@@ -598,7 +598,7 @@
if(welded || operating || machine_stat & NOPOWER)
return TRUE
if(density)
- open()
+ open(opener = user)
if(active)
addtimer(CALLBACK(src, PROC_REF(correct_state)), 2 SECONDS, TIMER_UNIQUE)
else
@@ -613,7 +613,7 @@
if(welded)
balloon_alert(user, "refuses to budge!")
return
- open()
+ open(opener = user)
if(active)
addtimer(CALLBACK(src, PROC_REF(correct_state)), 2 SECONDS, TIMER_UNIQUE)
@@ -682,7 +682,7 @@
INVOKE_ASYNC(src, PROC_REF(open))
return
-/obj/machinery/door/firedoor/open()
+/obj/machinery/door/firedoor/open(forced = DEFAULT_DOOR_CHECKS, mob/living/opener)
if(welded)
return
var/old_activity = active
diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm
index 1261bdbb9a85..fe1e8fd04957 100644
--- a/code/game/machinery/doors/passworddoor.dm
+++ b/code/game/machinery/doors/passworddoor.dm
@@ -49,7 +49,7 @@
if(!density || !voice_activated || radio_freq)
return
if(findtext(raw_message, password))
- open()
+ open(opener = speaker)
/obj/machinery/door/password/Bumped(atom/movable/AM)
return !density && ..()
@@ -60,7 +60,7 @@
return
if(density)
if(access_bypass || ask_for_pass(user))
- open()
+ open(opener = user)
else
run_animation(DOOR_DENY_ANIMATION)
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index a299c1655402..b7d775afd1e6 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -154,7 +154,7 @@
/obj/machinery/door/poddoor/crowbar_act(mob/living/user, obj/item/tool)
if(machine_stat & NOPOWER)
- open(TRUE)
+ open(TRUE, user)
return ITEM_INTERACT_SUCCESS
if (density)
balloon_alert(user, "open the door first!")
@@ -269,7 +269,7 @@
time_to_open = 15 SECONDS
if(do_after(user, time_to_open, src))
- if(density && !open(TRUE)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!)
+ if(density && !open(TRUE, user)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!)
to_chat(user, span_warning("Despite your efforts, [src] managed to resist your attempts to open it!"))
else
diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm
index 8757837cb14a..2a0aa8c3e370 100644
--- a/code/game/machinery/doors/shutters.dm
+++ b/code/game/machinery/doors/shutters.dm
@@ -79,7 +79,7 @@
fire = 100
acid = 70
-/obj/machinery/door/poddoor/shutters/radiation/open()
+/obj/machinery/door/poddoor/shutters/radiation/open(forced = DEFAULT_DOOR_CHECKS, mob/living/opener)
. = ..()
rad_insulation = RAD_NO_INSULATION
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 519b221c735f..634cee94ec63 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -235,7 +235,7 @@
leaving.Bump(src)
return COMPONENT_ATOM_BLOCK_EXIT
-/obj/machinery/door/window/open(forced = DEFAULT_DOOR_CHECKS)
+/obj/machinery/door/window/open(forced = DEFAULT_DOOR_CHECKS, mob/living/opener)
if(!density)
return TRUE
@@ -556,7 +556,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/brigdoor/security/holodec
*/
/obj/machinery/door/window/instant
-/obj/machinery/door/window/instant/open(forced = DEFAULT_DOOR_CHECKS)
+/obj/machinery/door/window/instant/open(forced = DEFAULT_DOOR_CHECKS, mob/living/opener)
if(!density || operating || !try_to_force_door_open(forced))
return FALSE
diff --git a/code/game/machinery/experimental_cloner/experimental_cloner_scanner.dm b/code/game/machinery/experimental_cloner/experimental_cloner_scanner.dm
index 335bd4e98d0f..5da56e225ed1 100644
--- a/code/game/machinery/experimental_cloner/experimental_cloner_scanner.dm
+++ b/code/game/machinery/experimental_cloner/experimental_cloner_scanner.dm
@@ -105,8 +105,7 @@
open_machine()
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
user.visible_message(span_notice("You see [user] kicking against the door of [src]!"), \
span_notice("You lean on the back of [src] and start pushing the door open..."), \
span_hear("You hear a metallic creaking from [src]."))
diff --git a/code/game/machinery/fat_sucker.dm b/code/game/machinery/fat_sucker.dm
index 270abe734f80..8eeea8bd9169 100644
--- a/code/game/machinery/fat_sucker.dm
+++ b/code/game/machinery/fat_sucker.dm
@@ -75,8 +75,7 @@
/obj/machinery/fat_sucker/container_resist_act(mob/living/user)
if(!free_exit || state_open)
to_chat(user, span_notice("The emergency release is not responding! You start pushing against the hull!"))
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
user.visible_message(span_notice("You see [user] kicking against the door of [src]!"), \
span_notice("You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)"), \
span_hear("You hear a metallic creaking from [src]."))
diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm
index bd78da0a129c..1baa2b2663c6 100644
--- a/code/game/machinery/gulag_teleporter.dm
+++ b/code/game/machinery/gulag_teleporter.dm
@@ -96,8 +96,7 @@ The console is located at computer/gulag_teleporter.dm
return
resist_time *= 0.5
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
user.visible_message(
span_notice("You see [user] kicking against the door of [src]!"),
span_notice("You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(resist_time)].)"),
diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm
index ea729a66fd58..6975857ff740 100644
--- a/code/game/machinery/hypnochair.dm
+++ b/code/game/machinery/hypnochair.dm
@@ -179,8 +179,7 @@
return ..()
/obj/machinery/hypnochair/container_resist_act(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
user.visible_message(span_notice("You see [user] kicking against the door of [src]!"), \
span_notice("You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(600)].)"), \
span_hear("You hear a metallic creaking from [src]."))
diff --git a/code/game/machinery/prisonlabor.dm b/code/game/machinery/prisonlabor.dm
index ddca8462e97b..06368db65d88 100644
--- a/code/game/machinery/prisonlabor.dm
+++ b/code/game/machinery/prisonlabor.dm
@@ -1,3 +1,4 @@
+// License plate printing
/obj/machinery/plate_press
name = "license plate press"
desc = "You know, we're making a lot of license plates for a station with literally no cars in it."
@@ -6,7 +7,9 @@
use_power = IDLE_POWER_USE
idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.02
active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.05
+ /// Reference to currently held license plate.
var/obj/item/stack/license_plates/empty/current_plate
+ /// Is the press currently pressing?
var/pressing = FALSE
/obj/machinery/plate_press/update_icon_state()
@@ -40,6 +43,7 @@
plate.use(1)
current_plate = new plate.type(src, 1) //Spawn a new single sheet in the machine
update_appearance()
+ post_press(user)
return ITEM_INTERACT_SUCCESS
/obj/machinery/plate_press/attack_hand(mob/living/user, list/modifiers)
@@ -53,6 +57,7 @@
pressing = TRUE
update_appearance()
to_chat(user, span_notice("You start pressing a new license plate!"))
+ playsound(src, 'sound/machines/kerchunk.ogg', 80)
if(!do_after(user, 4 SECONDS, target = src))
pressing = FALSE
@@ -67,3 +72,166 @@
update_appearance()
new /obj/item/stack/license_plates/filled(drop_location())
+
+/// Side effects after successfully pressing a license plate, including granting labor points.
+/obj/machinery/plate_press/proc/post_press(mob/living/user)
+ if(!user)
+ return
+ if(!istype(user.get_idcard(TRUE), /obj/item/card/id/advanced/prisoner))
+ return // No bonus effects if we're not a prisoner or there's no ID.
+ var/obj/item/card/id/advanced/prisoner/prison_id = user.get_idcard(TRUE)
+ prison_id.points += PRISON_LABOR_PLATE
+ to_chat(user, span_notice("[PRISON_LABOR_PLATE] points added!"))
+
+
+
+//Grown crop recepticle.
+/obj/machinery/produceporter
+ name = "produceporter"
+ desc = "A beaten up, landline teleporter designed to teleport produce back to the service department. This has seen better days."
+ icon = 'icons/obj/machines/prison.dmi'
+ icon_state = "produceporter_off"
+ density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.01
+ active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.1
+ /// Maximum amount of produce the machine can hold before it has to be either emptied or sent.
+ var/max_produce = 10
+ /// Current count of held produce
+ var/current_produce = 0
+
+/obj/machinery/produceporter/Initialize(mapload)
+ . = ..()
+ register_context()
+ update_appearance()
+
+/obj/machinery/produceporter/update_icon_state()
+ if(!is_operational)
+ icon_state = "produceporter_off"
+ return ..()
+ icon_state = "produceporter"
+ return ..()
+
+/obj/machinery/produceporter/update_overlays()
+ . = ..()
+ if(is_operational)
+ . += emissive_appearance(icon, "produceporter_emissive", src)
+
+/obj/machinery/produceporter/examine(mob/user)
+ . = ..()
+ if(current_produce >= max_produce)
+ . += span_notice("\The [src]'s bin is full, and can be sent back to the station for labor points.")
+ else
+ . += span_notice("\The [src] has room for more produce to be inserted.")
+ if(!length(GLOB.produce_locations))
+ . += span_notice("A dirty screen shows a warning, saying there are no [span_boldnotice("produce pads")] to teleport crops to.")
+ else
+ . += span_notice("The lever can be pulled with [span_boldnotice("Right Click")] to send produce back to the station.")
+
+/obj/machinery/produceporter/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(!istype(tool, /obj/item/food/grown))
+ return NONE
+ if(current_produce >= max_produce)
+ balloon_alert(user, "bin's full!")
+ return ITEM_INTERACT_FAILURE
+ tool.forceMove(src)
+ playsound(src, 'sound/items/handling/component_drop.ogg', 30)
+ update_produce()
+ balloon_alert(user, "holding [current_produce] / [max_produce]")
+ return ITEM_INTERACT_SUCCESS
+
+/obj/machinery/produceporter/attack_hand_secondary(mob/user, list/modifiers)
+ . = ..()
+ if(!is_operational)
+ balloon_alert(user, "nothing happens")
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+ if(!current_produce)
+ balloon_alert(user, "bin's empty!")
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+ if(!length(GLOB.produce_locations))
+ balloon_alert(user, "no dropoffs!")
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+ flick("produceporter_active", src)
+ use_energy(active_power_usage)
+ playsound(src, 'sound/items/weapons/emitter2.ogg', 50)
+ var/points = 0
+ var/produce_count = 0
+ for(var/obj/item/food/grown/produce in contents)
+ var/atom/dropoff = pick(GLOB.produce_locations)
+ do_teleport(produce, dropoff.drop_location(), 0, asoundout = 'sound/machines/woosh.ogg')
+ points += (produce.seed?.potency > 50 ? (PRISON_LABOR_CROPS * 2) : PRISON_LABOR_CROPS)
+ produce_count ++
+ balloon_alert_to_viewers("kachunk!")
+ post_delivery(user, points, produce_count)
+ update_produce()
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+/obj/machinery/produceporter/ShiftClick(mob/user)
+ . = ..()
+ for(var/obj/item/food/grown/crops in contents)
+ crops.forceMove(drop_location())
+ visible_message("\The [src]'s bin empties out onto the floor.")
+
+/obj/machinery/produceporter/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ . = ..()
+ if(is_operational && current_produce > 0)
+ context[SCREENTIP_CONTEXT_RMB] = "Send Produce"
+ if(istype(held_item, /obj/item/food/grown))
+ context[SCREENTIP_CONTEXT_LMB] = "Deposit Produce"
+ return CONTEXTUAL_SCREENTIP_SET
+
+/obj/machinery/produceporter/wrench_act(mob/living/user, obj/item/tool)
+ . = ITEM_INTERACT_BLOCKING
+ if(default_unfasten_wrench(user, tool, time = 1.5 SECONDS) == SUCCESSFUL_UNFASTEN)
+ update_appearance(UPDATE_ICON_STATE)
+ return ITEM_INTERACT_SUCCESS
+
+/obj/machinery/produceporter/proc/update_produce()
+ current_produce = 0
+ for(var/obj/item/food/grown/crops in contents)
+ if(current_produce > max_produce)
+ return
+ current_produce++
+ return current_produce
+
+/obj/machinery/produceporter/proc/post_delivery(mob/living/user, labor_points, produce_count)
+ if(!user || !labor_points || !produce_count)
+ return
+ var/obj/item/card/id/id_card = user.get_idcard(TRUE)
+ if(!istype(id_card, /obj/item/card/id/advanced/prisoner))
+ return // No bonus effects if we're not a prisoner or there's no ID.
+ var/obj/item/card/id/advanced/prisoner/prison_id = id_card
+ prison_id.points += labor_points
+ to_chat(user, span_notice("[labor_points] labor points added!"))
+
+ aas_config_announce(/datum/aas_config_entry/gulag_produce, list(
+ "LOCATION" = get_area_name(src),
+ "COUNT" = produce_count
+ ), src, list(RADIO_CHANNEL_SUPPLY))
+
+/datum/aas_config_entry/gulag_produce
+ name = "Service Alert: Produce from Gulag Sent!"
+ announcement_lines_map = list(
+ "Message" = "A shipment of produce (%COUNT items) has been sent to %LOCATION from the Gulag.")
+ vars_and_tooltips_map = list(
+ "LOCATION" = "will be replaced with the location of the produce delivery.",
+ "COUNT" = "Will be replaced with the quantity of produce received"
+ )
+
+GLOBAL_LIST_EMPTY(produce_locations)
+
+/obj/item/producepad
+ name = "produce pad"
+ desc = "This lightweight contraption acts as a beacon for produceporters, teleporting freshly grown food to this location."
+ icon = 'icons/obj/machines/prison.dmi'
+ icon_state = "producepad"
+ w_class = WEIGHT_CLASS_SMALL
+ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3)
+
+/obj/item/producepad/Initialize(mapload)
+ . = ..()
+ GLOB.produce_locations += src
+
+/obj/item/producepad/Destroy(force)
+ GLOB.produce_locations -= src
+ return ..()
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index bdfcfbd1618e..51aca3eea75c 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -234,8 +234,8 @@
if(isbrain(target) || istype(target, /obj/item/dullahan_relay))
return TRUE
- if(istype(target, /obj/item/mmi))
- var/obj/item/mmi/mmi_thing = target
+ if(istype(target, /obj/item/brain_processor/organic))
+ var/obj/item/brain_processor/organic/mmi_thing = target
return !!(mmi_thing.brain)
return FALSE
diff --git a/code/game/machinery/sheetifier.dm b/code/game/machinery/sheetifier.dm
index ae17eda28606..ee5db965df46 100644
--- a/code/game/machinery/sheetifier.dm
+++ b/code/game/machinery/sheetifier.dm
@@ -1,6 +1,6 @@
/obj/machinery/sheetifier
- name = "Sheet-meister 2000"
- desc = "A very sheety machine"
+ name = "\improper Sheet-meister 2000"
+ desc = "A very sheety machine."
icon = 'icons/obj/machines/sheetifier.dmi'
icon_state = "base_machine"
density = TRUE
diff --git a/code/game/machinery/sleepers.dm b/code/game/machinery/sleepers.dm
index fd8e69d4cd6d..6cf84d26b621 100644
--- a/code/game/machinery/sleepers.dm
+++ b/code/game/machinery/sleepers.dm
@@ -212,7 +212,7 @@
data["occupant"]["health"] = mob_occupant.health
data["occupant"]["maxHealth"] = mob_occupant.maxHealth
- data["occupant"]["minHealth"] = HEALTH_THRESHOLD_DEAD
+ data["occupant"]["minHealth"] = mob_occupant.dead_threshold
data["occupant"]["bruteLoss"] = mob_occupant.get_brute_loss()
data["occupant"]["oxyLoss"] = mob_occupant.get_oxy_loss()
data["occupant"]["toxLoss"] = mob_occupant.get_tox_loss()
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 92341ed722f6..69bc972685ee 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -579,8 +579,7 @@
open_machine()
dump_inventory_contents()
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
user.visible_message(span_notice("You see [user] kicking against the doors of [src]!"), \
span_notice("You start kicking against the doors... (this will take about [DisplayTimeText(breakout_time)].)"), \
span_hear("You hear a thump from [src]."))
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index 7eec0b16f40c..8dda4c8b44e8 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -200,6 +200,7 @@
name = "suspicious beacon"
icon = 'icons/obj/devices/tracker.dmi'
icon_state = "beacon"
+ inhand_icon_state = "beacon"
lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
desc = "A label on it reads: Warning: Activating this device will send a special beacon to your location."
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 2708c67d1683..b5d7173576fa 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -19,8 +19,8 @@
/// What is the lowest amount of time we can set the timer to?
var/minimum_timer = SYNDIEBOMB_MIN_TIMER_SECONDS
- /// What is the highest amount of time we can set the timer to?
- var/maximum_timer = 100*60 // 100 MINUTES // not using the MINUTES define because those are for deciseconds
+ /// What is the highest amount of time we can set the timer to? IN SECONDS
+ var/maximum_timer = 100 * 60 // 100 MINUTES // not using the MINUTES define because those are for deciseconds
/// What is the default amount of time we set the timer to?
var/timer_set = SYNDIEBOMB_MIN_TIMER_SECONDS
/// Can we be unanchored?
@@ -28,27 +28,29 @@
/// Are the wires exposed?
var/open_panel = FALSE
/// Is the bomb counting down?
- var/active = FALSE
+ VAR_FINAL/active = FALSE
/// What sound do we make as we beep down the timer?
var/beepsound = 'sound/items/timer.ogg'
/// Is the delay wire pulsed?
- var/delayedbig = FALSE
+ VAR_FINAL/delayedbig = FALSE
/// Is the activation wire pulsed?
- var/delayedlittle = FALSE
+ VAR_FINAL/delayedlittle = FALSE
/// Should we just tell the payload to explode now? Usually triggered by an event (like cutting the wrong wire)
- var/explode_now = FALSE
+ VAR_FINAL/explode_now = FALSE
/// The timer for the bomb.
- var/detonation_timer
+ VAR_FINAL/detonation_timer
/// When do we beep next?
- var/next_beep
+ VAR_FINAL/next_beep
/// If TRUE, more boom wires are added based on the timer set.
var/add_boom_wires = TRUE
/// Reference to the bomb core inside the bomb, which is the part that actually explodes.
var/obj/item/bombcore/payload = /obj/item/bombcore/syndicate
/// The countdown that'll show up to ghosts regarding the bomb's timer.
- var/obj/effect/countdown/syndicatebomb/countdown
+ VAR_FINAL/obj/effect/countdown/syndicatebomb/countdown
/// Whether the countdown is visible on examine
- var/examinable_countdown = TRUE
+ VAR_FINAL/examinable_countdown = TRUE
+ /// World.time that the bomb entered timestop, used to calculate how much time is left on the timer after timestop ends.
+ VAR_PRIVATE/timestop_start
/obj/machinery/syndicatebomb/proc/try_detonate(ignore_active = FALSE)
. = (payload in src) && (active || ignore_active)
@@ -108,6 +110,7 @@
update_appearance()
countdown = new(src)
end_processing()
+ RegisterSignal(src, COMSIG_ATOM_TIMESTOP_FREEZE, PROC_REF(on_timestop))
/obj/machinery/syndicatebomb/Destroy()
QDEL_NULL(countdown)
@@ -130,9 +133,28 @@
icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]"
return ..()
+/obj/machinery/syndicatebomb/proc/on_timestop(...)
+ SIGNAL_HANDLER
+ if(!active)
+ return
+ end_processing()
+ timestop_start = world.time
+ RegisterSignal(src, COMSIG_ATOM_TIMESTOP_UNFREEZE, PROC_REF(on_timestop_end))
+
+/obj/machinery/syndicatebomb/proc/on_timestop_end(...)
+ SIGNAL_HANDLER
+ UnregisterSignal(src, COMSIG_ATOM_TIMESTOP_UNFREEZE)
+ if(!active) // defused DURING timestop? badass
+ return
+ var/time_spent_in_timestop = world.time - timestop_start
+ next_beep += time_spent_in_timestop
+ detonation_timer += time_spent_in_timestop
+ begin_processing()
+ timestop_start = null
+
/obj/machinery/syndicatebomb/proc/seconds_remaining()
if(active)
- . = max(0, round((detonation_timer - world.time) / 10))
+ . = max(0, round((detonation_timer - (timestop_start || world.time)) / 10))
else
. = timer_set
diff --git a/code/game/objects/effects/decals/cleanable/blood.dm b/code/game/objects/effects/decals/cleanable/blood.dm
index b0dd12a832be..e866043ccb9b 100644
--- a/code/game/objects/effects/decals/cleanable/blood.dm
+++ b/code/game/objects/effects/decals/cleanable/blood.dm
@@ -75,8 +75,6 @@
/obj/effect/decal/cleanable/blood/Destroy(force)
STOP_PROCESSING(SSblood_drying, src)
- // connect_loc only unregisters via COMSIG_MOVABLE_MOVED, which never fires when the turf we're on gets replaced by ChangeTurf()
- RemoveElement(/datum/element/connect_loc, loc_connections)
return ..()
/// Returns the default blood type for this decal for maploaded decals
@@ -298,6 +296,7 @@
beauty = -50
base_name = "trail of"
bloodiness = BLOOD_AMOUNT_PER_DECAL * 0.1
+ gender = NEUTER
/// All the components of the trail
var/list/obj/effect/decal/cleanable/blood/trail/trail_components
@@ -931,8 +930,8 @@
if(!the_window.fulltile)
return FALSE
- var/obj/effect/decal/cleanable/final_splatter = new /obj/effect/decal/cleanable/blood/splatter/over_window(prev_loc, null, GET_ATOM_BLOOD_DNA(src))
- final_splatter.forceMove(the_window)
+ // Spawn in the window so we don't merge with a floor splatter and delete ourselves before attaching.
+ var/obj/effect/decal/cleanable/final_splatter = new /obj/effect/decal/cleanable/blood/splatter/over_window(the_window, null, GET_ATOM_BLOOD_DNA(src))
the_window.vis_contents += final_splatter
expire()
return TRUE
diff --git a/code/game/objects/effects/decals/cleanable/food.dm b/code/game/objects/effects/decals/cleanable/food.dm
index 0618eec98dae..a745c752975e 100644
--- a/code/game/objects/effects/decals/cleanable/food.dm
+++ b/code/game/objects/effects/decals/cleanable/food.dm
@@ -41,11 +41,6 @@
. = ..()
AddElement(/datum/element/connect_loc, loc_connections)
-/obj/effect/decal/cleanable/food/salt/Destroy(force)
- // connect_loc only unregisters via COMSIG_MOVABLE_MOVED, which never fires when the turf we're on gets replaced by ChangeTurf()
- RemoveElement(/datum/element/connect_loc, loc_connections)
- return ..()
-
/obj/effect/decal/cleanable/food/salt/CanAllowThrough(atom/movable/mover, border_dir)
. = ..()
if(is_species(mover, /datum/species/snail))
diff --git a/code/game/objects/effects/decals/cleanable/fuel.dm b/code/game/objects/effects/decals/cleanable/fuel.dm
index a1a91cd90f74..9aa00fedcaa2 100644
--- a/code/game/objects/effects/decals/cleanable/fuel.dm
+++ b/code/game/objects/effects/decals/cleanable/fuel.dm
@@ -33,10 +33,6 @@
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/cleanable/toxic.dm b/code/game/objects/effects/decals/cleanable/toxic.dm
index 13a3fe57a0f7..7c18f09192aa 100644
--- a/code/game/objects/effects/decals/cleanable/toxic.dm
+++ b/code/game/objects/effects/decals/cleanable/toxic.dm
@@ -16,6 +16,8 @@
var/datum/looping_sound/bubbling_audio // It's really just bubbling liquid audio, which is what I need here.
/// TimerID for the floor melting effect, so we can stop it if it gets cleaned up.
var/dissolve_timer
+ /// Is the acid bubbling?
+ var/active = FALSE
/obj/effect/decal/cleanable/greenglow/waste/Initialize(mapload, list/datum/disease/diseases)
. = ..()
@@ -27,7 +29,7 @@
/obj/effect/decal/cleanable/greenglow/waste/Destroy()
QDEL_NULL(bubbling_audio)
- QDEL_NULL(particles)
+ remove_shared_particles(/particles/acid/toxic)
return ..()
/**
@@ -43,7 +45,9 @@
bubbling_audio.start()
dissolve_timer = addtimer(CALLBACK(src, PROC_REF(dissolve_floor)), dissolve_clock, TIMER_STOPPABLE | TIMER_DELETE_ME)
- particles = new /particles/acid/toxic()
+ active = TRUE
+ update_appearance()
+ add_shared_particles(/particles/acid/toxic)
/obj/effect/decal/cleanable/greenglow/waste/proc/dissolve_floor()
if(QDELETED(src))
@@ -56,6 +60,15 @@
visible_message(span_warning("The waste eats away at the floor, leaving \the [get_turf(src)] behind."))
animate(src, time = 0.5 SECONDS, color = "#bebebe8e")
bubbling_audio?.stop()
- QDEL_NULL(particles)
+ active = TRUE
+ update_appearance()
+ remove_shared_particles(/particles/acid/toxic)
+
+/obj/effect/decal/cleanable/greenglow/waste/update_icon_state()
+ . = ..()
+ if(active)
+ icon_state = "waste_spill_active"
+ else
+ icon_state = "waste_spill"
#undef DISSOLVE_DURATION
diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm
index 9fb0f546c84f..b2fc7e58d761 100644
--- a/code/game/objects/effects/decals/decal.dm
+++ b/code/game/objects/effects/decals/decal.dm
@@ -21,10 +21,6 @@
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)
@@ -72,12 +68,13 @@
flags_1 |= INITIALIZED_1
// If the tile uses holiday colors, apply them here
+#ifndef MAP_TEST
if(use_holiday_colors)
-
var/custom_color = request_decoration_colors(src, pattern)
if(custom_color)
color = custom_color
alpha = DECAL_ALPHA
+#endif
var/turf/T = loc
if(!istype(T)) //you know this will happen somehow
diff --git a/code/game/objects/effects/decals/turfdecal/tilecoloring.dm b/code/game/objects/effects/decals/turfdecal/tilecoloring.dm
index 9e7438660d3d..ba06290dbdf5 100644
--- a/code/game/objects/effects/decals/turfdecal/tilecoloring.dm
+++ b/code/game/objects/effects/decals/turfdecal/tilecoloring.dm
@@ -171,29 +171,6 @@ TILE_DECAL_SUBTYPE_HELPER(/obj/effect/turf_decal/tile/holiday/random)
icon_state = "trimline_box"
use_holiday_colors = TRUE
-/obj/effect/turf_decal/trimline/tram
- pattern = PATTERN_VERTICAL_STRIPE
-
-/obj/effect/turf_decal/trimline/tram/filled/corner/Initialize(mapload)
- if(use_holiday_colors)
- var/current_holiday_color = request_decoration_colors(src, pattern)
- if(current_holiday_color)
- color = current_holiday_color
- alpha = DECAL_ALPHA
- else
- color = "#ffc875"
- return ..()
-
-/obj/effect/turf_decal/trimline/tram/filled/line/Initialize(mapload)
- if(use_holiday_colors)
- var/current_holiday_color = request_decoration_colors(src, pattern)
- if(current_holiday_color)
- color = current_holiday_color
- alpha = DECAL_ALPHA
- else
- color = "#ffc875"
- return ..()
-
/// Automatically generates all trimlines for a decal with the given path.
#define TRIMLINE_SUBTYPE_HELPER(path)\
##path/line {\
@@ -220,6 +197,12 @@ TILE_DECAL_SUBTYPE_HELPER(/obj/effect/turf_decal/tile/holiday/random)
##path/mid_joiner {\
icon_state = "trimline_mid";\
}\
+##path/corner_long {\
+ icon_state = "trimline_corner_long";\
+}\
+##path/corner_long_alt {\
+ icon_state = "trimline_corner_long_alt";\
+}\
##path/filled {\
icon_state = "trimline_box_fill";\
}\
@@ -324,11 +307,19 @@ TRIMLINE_SUBTYPE_HELPER(/obj/effect/turf_decal/trimline/neutral)
/// Tram trimlines
/obj/effect/turf_decal/trimline/tram
+ pattern = PATTERN_VERTICAL_STRIPE
color = "#D4D4D4"
alpha = 50
TRIMLINE_SUBTYPE_HELPER(/obj/effect/turf_decal/trimline/tram)
+// These two tram decals specifically have its own color
+/obj/effect/turf_decal/trimline/tram/filled/corner
+ color = "#ffc875"
+
+/obj/effect/turf_decal/trimline/tram/filled/line
+ color = "#ffc875"
+
/// Dark trimlines
/obj/effect/turf_decal/trimline/dark
color = "#0e0f0f"
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index db968042c6d9..a6383d6805fe 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -513,6 +513,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
/obj/effect/landmark/start/hangover
name = "hangover spawn"
+ icon = 'icons/effects/landmarks_static.dmi'
icon_state = "hangover_spawn"
/// A list of everything this hangover spawn created as part of the hangover station trait
diff --git a/code/game/objects/effects/posters/contraband.dm b/code/game/objects/effects/posters/contraband.dm
index 94da3e99fcb8..dfa97157ec3e 100644
--- a/code/game/objects/effects/posters/contraband.dm
+++ b/code/game/objects/effects/posters/contraband.dm
@@ -17,6 +17,10 @@
/obj/structure/sign/poster/contraband/lizard,
/obj/structure/sign/poster/contraband/lusty_xenomorph,
/obj/structure/sign/poster/contraband/double_rainbow,
+ /obj/structure/sign/poster/contraband/double_gunshow,
+ /obj/structure/sign/poster/contraband/rabbit_hole,
+ /obj/structure/sign/poster/contraband/bridge_bunny,
+ /obj/structure/sign/poster/contraband/rabbit_swole,
)
/obj/item/poster/random_contraband/pinup/Initialize(mapload, obj/structure/sign/poster/new_poster_structure)
@@ -846,6 +850,34 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/bojack, 32)
MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/double_rainbow, 32)
+/obj/structure/sign/poster/contraband/rabbit_hole
+ name = "Down the Rabbit Hole"
+ desc = "I'm late! I'm late! For a very important date..."
+ icon_state = "rabbit_hole"
+
+MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/rabbit_hole, 32)
+
+/obj/structure/sign/poster/contraband/rabbit_swole
+ name = "Damn that Rabbit Swole"
+ desc = "Someone's been hitting that 'Eat me' cake..."
+ icon_state = "rabbit_swole"
+
+MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/rabbit_swole, 32)
+
+/obj/structure/sign/poster/contraband/double_gunshow
+ name = "Double Gunshow"
+ desc = "All the whey all across this guy..."
+ icon_state = "double_gunshow"
+
+MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/double_gunshow, 32)
+
+/obj/structure/sign/poster/contraband/bridge_bunny
+ name = "Bridge Bunny"
+ desc = "Ideas are like rabbits. You... uh... What were you thinking about again?"
+ icon_state = "nt-bunny"
+
+MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/bridge_bunny, 32)
+
/obj/structure/sign/poster/contraband/vodka
name = "Vodka"
desc = "The text is written entirely in Russian. You can barely read anything except the word 'BODKA'."
diff --git a/code/game/objects/effects/shared_particle_holder.dm b/code/game/objects/effects/shared_particle_holder.dm
index 01c3955a377e..fe6d35cea528 100644
--- a/code/game/objects/effects/shared_particle_holder.dm
+++ b/code/game/objects/effects/shared_particle_holder.dm
@@ -27,22 +27,38 @@ GLOBAL_LIST_EMPTY(shared_particles)
QDEL_NULL(particles)
return ..()
-/* Adds (or creates and adds) a shared particle holder
+/**
+ * Adds (or creates and adds) a shared particle holder
+ *
* Shared particle holders are held in nullspace and added to vis_contents of all atoms using it
* in order to save clientside performance by making clients only render 3-5 particle holders
* for 400 objects using them. This should be prioritized over normal particles when possible if it is known
* that there will be a lot of objects using certain particles.
- * custom_key can be used to create a new pool of already existing particle type in case you're planning to edit holder's color or properties
- * pool_size controls how many particle holders per type are created. Any objects over this cap will pick an existing holder from the pool.
+ *
+ * Args
+ * * particle_type - the type of particle to add
+ * * custom_key - can be used to create a new pool of already existing particle type in case you're planning to edit holder's color or properties
+ * * particle_flags - flags to pass to the particle holder. Not included in the key automatically, so you need to provide a custom key in that case
+ * * pool_size - controls how many particle holders per type are created. Any objects over this cap will pick an existing holder from the pool.
*
* Now, this code seems fucked up, that's because this is meant to support both objects (and mobs) and turfs, *however* areas are special
* and don't have vis_contents, so to avoid copypaste code we do this weirdness
*/
/atom/proc/add_shared_particles(particle_type, custom_key = null, particle_flags = NONE, pool_size = 3)
+ if(particle_flags && isnull(custom_key))
+ // nb: particle flags are not included in the key automatically to make remove_shared_particles easier to use...
+ // however, if you set particle flags without a custom key, there's a good chance you accidentally just made every source of that particle use those flags
+ CRASH("add_shared_particles was called with flags, but without a key - you must \
+ provide a custom key if you want to use flags! (atom: [type] particle: [particle_type])")
+
var/atom/movable/play_pretend = src
- var/particle_key = custom_key || "[particle_type]"
+ var/is_floor_plane = PLANE_TO_TRUE(plane) == FLOOR_PLANE
+ var/particle_key = "[custom_key || particle_type][is_floor_plane ? "-floor" : ""]"
if (!GLOB.shared_particles[particle_key])
- GLOB.shared_particles[particle_key] = list(list(new /obj/effect/abstract/shared_particle_holder(null, particle_type, particle_flags)), 1)
+ var/obj/effect/abstract/shared_particle_holder/new_holder = new(null, particle_type, particle_flags)
+ if(is_floor_plane) // Keeps us off the floor plane, we'll just sit on game plane
+ new_holder.vis_flags &= ~VIS_INHERIT_PLANE
+ GLOB.shared_particles[particle_key] = list(list(new_holder), 1)
play_pretend.vis_contents += GLOB.shared_particles[particle_key][SHARED_PARTICLE_HOLDER_INDEX][1]
return GLOB.shared_particles[particle_key][SHARED_PARTICLE_HOLDER_INDEX][1]
@@ -53,6 +69,8 @@ GLOBAL_LIST_EMPTY(shared_particles)
if (length(type_holders) < pool_size)
var/obj/effect/abstract/shared_particle_holder/new_holder = new(null, particle_type, particle_flags)
+ if(is_floor_plane) // See above, we don't want to be on floor
+ new_holder.vis_flags &= ~VIS_INHERIT_PLANE
type_holders += new_holder
play_pretend.vis_contents += new_holder
GLOB.shared_particles[particle_key][SHARED_PARTICLE_USER_NUM_INDEX] += 1
@@ -76,6 +94,9 @@ GLOBAL_LIST_EMPTY(shared_particles)
if (ispath(particle_key))
particle_key = "[particle_key]"
+ if (PLANE_TO_TRUE(plane) == FLOOR_PLANE)
+ particle_key += "-floor" // nb: unfortunately if the plane changes between the particles being removed, this will break.
+
if (!GLOB.shared_particles[particle_key])
return
diff --git a/code/game/objects/effects/spawners/random/contraband.dm b/code/game/objects/effects/spawners/random/contraband.dm
index 1d56e1e1614f..c31d3042ee9d 100644
--- a/code/game/objects/effects/spawners/random/contraband.dm
+++ b/code/game/objects/effects/spawners/random/contraband.dm
@@ -111,7 +111,7 @@
/obj/item/restraints/handcuffs,
/obj/item/paper/fluff/jobs/prisoner/letter,
/obj/item/storage/wallet/random,
- /obj/item/modular_computer/pda,
+ /obj/item/modular_computer/pda/crew,
/obj/item/radio/off,
)
diff --git a/code/game/objects/effects/spawners/random/trash.dm b/code/game/objects/effects/spawners/random/trash.dm
index e79c634f9ecf..9e455f94c50c 100644
--- a/code/game/objects/effects/spawners/random/trash.dm
+++ b/code/game/objects/effects/spawners/random/trash.dm
@@ -42,7 +42,7 @@
/obj/item/food/grown/cannabis = 1,
/obj/item/rag = 1,
/obj/effect/spawner/random/entertainment/drugs = 1,
- /obj/item/modular_computer/pda = 1,
+ /obj/item/modular_computer/pda/crew = 1,
/obj/item/reagent_containers/syringe = 1,
/obj/effect/spawner/random/entertainment/cigar = 1,
/obj/item/stack/ore/gold = 1,
diff --git a/code/game/objects/effects/spiderwebs.dm b/code/game/objects/effects/spiderwebs.dm
index d56e134e7b43..301326716ad4 100644
--- a/code/game/objects/effects/spiderwebs.dm
+++ b/code/game/objects/effects/spiderwebs.dm
@@ -234,8 +234,7 @@
/obj/structure/spider/cocoon/container_resist_act(mob/living/user)
var/breakout_time = 600
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
to_chat(user, span_notice("You struggle against the tight bonds... (This will take about [DisplayTimeText(breakout_time)].)"))
visible_message(span_notice("You see something struggling and writhing in \the [src]!"))
if(do_after(user,(breakout_time), target = src))
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index ab74022a640c..7c2fbcd42cf4 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -837,3 +837,7 @@
/obj/effect/temp_visual/focus_ring/proc/dissipate()
animate(src, alpha = 0, time = 0.5 SECONDS, easing = QUAD_EASING|EASE_OUT)
+
+/obj/effect/temp_visual/pillow_hit
+ icon_state = "pillow_hit"
+ duration = 0.9 SECONDS
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 70483a19e230..201acaf5bef9 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -112,7 +112,7 @@
///Price of an item in a vending machine, overriding the base vending machine price. Define in terms of paycheck defines as opposed to raw numbers.
var/custom_price
- ///Price of an item in a vending machine, overriding the premium vending machine price. Define in terms of paycheck defines as opposed to raw numbers.
+ ///Price of a premium and contraband item in a vending machine, overriding the premium vending machine price. Define in terms of paycheck defines as opposed to raw numbers.
var/custom_premium_price
///Whether spessmen with an ID with an age below AGE_MINOR (20 by default) can buy this item
var/age_restricted = FALSE
diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm
index 48a2725fc878..a8611d3b1fc2 100644
--- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm
@@ -310,6 +310,16 @@
var/message = high_production_profile ? "high-power uranium mode" : "medium-power plasma mode"
to_chat(user, span_notice("You set the board for [message]"))
+/obj/item/circuitboard/machine/plankman
+ name = "PLANKMAN-type Generator"
+ greyscale_colors = CIRCUIT_COLOR_ENGINEERING
+ build_path = /obj/machinery/power/port_gen/pacman/wood
+ req_components = list(
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/stack/sheet/iron = 5
+ )
+ needs_anchored = FALSE
+
/obj/item/circuitboard/machine/turbine_compressor
name = "Turbine - Inlet Compressor"
greyscale_colors = CIRCUIT_COLOR_ENGINEERING
@@ -516,7 +526,7 @@
build_path = /obj/machinery/rnd/production/circuit_imprinter/department
/obj/item/circuitboard/machine/holopad
- name = "AI Holopad"
+ name = "Holopad"
greyscale_colors = CIRCUIT_COLOR_GENERIC
build_path = /obj/machinery/holopad
req_components = list(/datum/stock_part/capacitor = 1)
@@ -1776,6 +1786,26 @@
/obj/item/pipe/directional/scrubber = 1,
)
+/obj/item/circuitboard/machine/bluespace_scrubber
+ name = "Portable Bluespace Scrubber"
+ greyscale_colors = CIRCUIT_COLOR_ENGINEERING
+ build_path = /obj/machinery/portable_atmospherics/scrubber/bluespace
+ needs_anchored = FALSE
+ req_components = list(
+ /obj/item/pipe/directional/scrubber = 1,
+ /obj/item/stack/ore/bluespace_crystal = 1,
+ )
+
+/obj/item/circuitboard/machine/gas_receiver
+ name = "Gas Receiver"
+ greyscale_colors = CIRCUIT_COLOR_ENGINEERING
+ build_path = /obj/machinery/portable_atmospherics/gas_receiver
+ needs_anchored = FALSE
+ req_components = list(
+ /obj/item/stack/sheet/plasteel = 2,
+ /obj/item/stack/ore/bluespace_crystal = 2,
+ )
+
/obj/item/circuitboard/machine/pump
name = "Portable Air Pump"
greyscale_colors = CIRCUIT_COLOR_ENGINEERING
diff --git a/code/game/objects/items/devices/boombox/boombox.dm b/code/game/objects/items/devices/boombox/boombox.dm
new file mode 100644
index 000000000000..e89ec2fc2849
--- /dev/null
+++ b/code/game/objects/items/devices/boombox/boombox.dm
@@ -0,0 +1,168 @@
+/obj/item/boombox
+ name = "\proper Nanomusic boombox"
+ desc = "Never quit making all that racket with this booming box."
+ icon = 'icons/obj/devices/voice.dmi'
+ icon_state = "boombox"
+ inhand_icon_state = "boombox"
+ drop_sound = 'sound/items/handling/ammobox_drop.ogg'
+ pickup_sound = 'sound/items/handling/ammobox_pickup.ogg'
+ custom_premium_price = PAYCHECK_COMMAND * 7
+ interaction_flags_item = parent_type::interaction_flags_item & ~INTERACT_ITEM_ATTACK_HAND_PICKUP
+ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SHEET_MATERIAL_AMOUNT)
+ /// Is the boombox actively playing anything?
+ var/active = FALSE
+ /// Is the boombox being worn on the holder's shoulder?
+ var/swag_mode = FALSE
+ /// Reference to the tapedeck that's inserted into the boombox.
+ var/obj/item/music_tape/tapedeck = null
+ /// Soundloop that's managing our boombox.
+ var/datum/looping_sound/boombox_audio = null
+ /// A list of all available boombox actions
+ var/list/boombox_acts = list()
+ /// Icon file for radial objects
+ var/radial_icon_file = 'icons/hud/radial_taperecorder.dmi'
+ /// Particle holder for music note effect.
+ var/obj/effect/abstract/particle_holder/music_particles
+
+/obj/item/boombox/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/drag_pickup)
+ update_available_icons()
+ register_context()
+
+/obj/item/boombox/handle_deconstruct(disassembled)
+ if(tapedeck)
+ tapedeck.forceMove(drop_location())
+
+/obj/item/boombox/Destroy(force)
+ QDEL_NULL(boombox_audio)
+ return ..()
+
+/obj/item/boombox/examine(mob/user)
+ . = ..()
+ . += span_notice("The boombox can be worn in hand or on your shoulder. Alt-Right-click to toggle.")
+ if(tapedeck)
+ . += "It has [span_bold("[tapedeck]")] inside."
+ else
+ . += "It has no tapedeck inside."
+
+/obj/item/boombox/click_alt_secondary(mob/user)
+ swag_mode = !swag_mode
+ balloon_alert(user, "wearing [swag_mode ? "on shoulder" : "in hand"]")
+ if(loc == user)
+ playsound(user, pickup_sound, 30)
+ update_appearance()
+ user.update_held_items()
+ return CLICK_ACTION_SUCCESS
+
+/obj/item/boombox/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(istype(tool, /obj/item/music_tape))
+ if(tapedeck)
+ balloon_alert(user, "eject first!")
+ return ITEM_INTERACT_BLOCKING
+ var/obj/item/music_tape/tunes = tool
+ user.transferItemToLoc(tunes, src)
+ tapedeck = tunes
+ balloon_alert(user, "tape inserted")
+ playsound(src, 'sound/items/taperecorder/taperecorder_close.ogg', 50, FALSE)
+ return ITEM_INTERACT_SUCCESS
+ if(istype(tool, /obj/item/tape))
+ balloon_alert(user, "won't fit!")
+ return ITEM_INTERACT_BLOCKING
+ return ..()
+
+/obj/item/boombox/attack_hand(mob/user, list/modifiers)
+ . = ..()
+ update_available_icons()
+ if(!check_menu(user))
+ return
+ display_radial_menu(user)
+
+/obj/item/boombox/attack_self(mob/user, modifiers)
+ . = ..()
+ update_available_icons()
+ if(!check_menu(user))
+ return
+ display_radial_menu(user)
+
+/obj/item/boombox/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ . = ..()
+ context[SCREENTIP_CONTEXT_RMB] = "Control boombox"
+ context[SCREENTIP_CONTEXT_LMB] = "Pick up (Drag)"
+ context[SCREENTIP_CONTEXT_ALT_RMB] = "Change worn style"
+ return CONTEXTUAL_SCREENTIP_SET
+
+/obj/item/boombox/update_icon_state()
+ inhand_icon_state = swag_mode ? "boombox_swag" : "boombox"
+ return ..()
+
+/obj/item/boombox/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params)
+ . = ..()
+ update_appearance() //Update appearance when dragged for shoulder icon state.
+
+/**
+ * Handles the radial menu of the boombox and it's active effects when selected.
+ */
+/obj/item/boombox/proc/display_radial_menu(mob/living/user)
+ if(!user)
+ return FALSE
+ var/choice = show_radial_menu(user, src, boombox_acts, radius = 36, require_near = TRUE)
+ if(!choice)
+ return FALSE
+ switch(choice)
+ if("Play")
+ if(!tapedeck)
+ balloon_alert(user, "no tape!")
+ return
+ boombox_audio = tapedeck.song_inside
+ music_particles = new (src, /particles/musical_notes, PARTICLE_ATTACH_MOB)
+ boombox_audio.start()
+ icon_state = "boombox_on"
+ update_appearance()
+ active = TRUE
+
+ if("Stop")
+ if(!boombox_audio)
+ balloon_alert(user, "nothing playing!")
+ return
+ stop_music(user)
+ active = FALSE
+
+ if("Eject")
+ stop_music(user)
+ user.transferItemToLoc(tapedeck, drop_location())
+ tapedeck = null
+ update_available_icons()
+ active = FALSE
+
+ playsound(src, 'sound/machines/click.ogg', 40, TRUE)
+
+/// Updates the list of boombox_acts for the radial menu.
+/obj/item/boombox/proc/update_available_icons()
+ boombox_acts = list()
+ if(!active)
+ boombox_acts += list("Play" = image(radial_icon_file, "play"))
+ else
+ boombox_acts += list("Stop" = image(radial_icon_file, "stop"))
+ if(tapedeck)
+ boombox_acts += list("Eject" = image(radial_icon_file, "eject"))
+
+/// Do we meet the requirements to interact with the boombox?
+/obj/item/boombox/proc/check_menu(mob/living/user)
+ if(!istype(user))
+ return FALSE
+ if(user.incapacitated)
+ return FALSE
+ return TRUE
+
+/// Stops looping audio, handles particles
+/obj/item/boombox/proc/stop_music(mob/user)
+ if(!boombox_audio)
+ return
+ boombox_audio.stop()
+ boombox_audio = null
+
+ if(music_particles)
+ QDEL_NULL(music_particles)
+ icon_state = "boombox"
+ update_appearance()
diff --git a/code/game/objects/items/devices/boombox/music_tapes.dm b/code/game/objects/items/devices/boombox/music_tapes.dm
new file mode 100644
index 000000000000..434d7fc55f93
--- /dev/null
+++ b/code/game/objects/items/devices/boombox/music_tapes.dm
@@ -0,0 +1,89 @@
+// Tapes containing music.
+/obj/item/music_tape
+ name = "tapedeck"
+ desc = "A special tape that holds music."
+ icon_state = "tape_white"
+ icon = 'icons/obj/devices/circuitry_n_data.dmi'
+ inhand_icon_state = "analyzer"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
+ w_class = WEIGHT_CLASS_TINY
+ custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.2, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.2)
+ force = 1
+ throwforce = 0
+ obj_flags = UNIQUE_RENAME
+ drop_sound = 'sound/items/handling/tape_drop.ogg'
+ pickup_sound = 'sound/items/handling/tape_pickup.ogg'
+ var/datum/looping_sound/song_inside = /datum/looping_sound/boombox
+ /// Song name to append to the examine text.
+ var/song_name = "Industrial Crush"
+
+/obj/item/music_tape/examine(mob/user)
+ . = ..()
+ . += span_notice("You could probably play this in a Nanotrasen Brand [span_smallnoticeital("tm")] \
+ Nanomusic [span_smallnoticeital("tm")] boombox, at least until they trademark the concept of a boombox, too.")
+ if(song_name && song_inside)
+ . += span_notice("The track is labled [span_boldnotice(song_name)].")
+
+/obj/item/music_tape/Initialize(mapload)
+ . = ..()
+ if(!song_inside)
+ CRASH("We spawned a tape deck without any looping audio inside.")
+ song_inside = new song_inside(src)
+
+/obj/item/music_tape/rock
+ icon_state = "tape_red"
+ song_inside = /datum/looping_sound/boombox/rock
+ song_name = "Bainmack"
+
+/obj/item/music_tape/hiphop
+ icon_state = "tape_purple"
+ song_inside = /datum/looping_sound/boombox/hiphop
+ song_name = "Groovepad"
+
+/obj/item/music_tape/jazz
+ desc = "A special tape that holds music. Wait, this one has jazz on it? You don't see that much anymore..."
+ icon_state = "tape_yellow"
+ song_inside = /datum/looping_sound/boombox/jazz
+ song_name = "Franky's Gonna Boom"
+
+/obj/item/music_tape/jazz/Initialize(mapload)
+ . = ..()
+ add_deep_lore()
+
+/obj/item/music_tape/jazz/proc/add_deep_lore()
+ AddElement(/datum/element/examine_lore, \
+ lore = "Jazz is, by all definitions, completely legal in the spinward sector. After all, sounds\
+ tend not to be the sort of thing that a major corporation can effectively police.\
+ Freeform Jazz, on the other hand, had taken on a scandalous identity in the late 2590s, following\
+ the legendary crime spree left by freeform jazz musician and criminal mastermind [span_bold("Rezz 'The Tips' C'thoni")].\
+ In an attempt to prevent a repeat of what happened on Rhozz Alpha, which we ALL remember,\
+ TerraGov and a multinational coalition of planets deemed Freeform Jazz to be an active threat to public safety.\
+ The more free the jazz, the more serious the crime."\
+ )
+
+/obj/item/music_tape/pop
+ icon_state = "tape_blue"
+ song_inside = /datum/looping_sound/boombox/pop
+ song_name = "Bubblegum"
+
+/obj/item/music_tape/robocop
+ song_inside = /datum/looping_sound/boombox/robocop
+ song_name = "Nanotrasen Company Approved Ambiance"
+ custom_premium_price = PAYCHECK_COMMAND * 2.5
+
+// This exists mostly for testing
+/obj/item/storage/box/music_tapes
+ name = "box of music tapes"
+ desc = "Contains several proprietary, company approved songs for waving above your head on your own jukebox."
+ illustration = "music"
+
+/obj/item/storage/box/music_tapes/PopulateContents()
+ var/list/items_inside = list(
+ /obj/item/music_tape = 1,
+ /obj/item/music_tape/rock = 1,
+ /obj/item/music_tape/hiphop = 1,
+ /obj/item/music_tape/pop = 1,
+ /obj/item/music_tape/robocop = 1,
+ )
+ generate_items_inside(items_inside, src)
diff --git a/code/game/objects/items/devices/broadcast_camera.dm b/code/game/objects/items/devices/broadcast_camera.dm
index bbc94accca08..f274b572dee9 100644
--- a/code/game/objects/items/devices/broadcast_camera.dm
+++ b/code/game/objects/items/devices/broadcast_camera.dm
@@ -7,6 +7,7 @@
desc_controls = "Right-click to change the broadcast name. Alt-click to toggle microphone."
icon = 'icons/obj/service/broadcast.dmi'
icon_state = "broadcast_cam0"
+ inhand_icon_state = "broadcast_cam0"
base_icon_state = "broadcast_cam"
lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
diff --git a/code/game/objects/items/devices/scanners/autopsy_scanner.dm b/code/game/objects/items/devices/scanners/autopsy_scanner.dm
index 50a2d370eb34..c618d7926adc 100644
--- a/code/game/objects/items/devices/scanners/autopsy_scanner.dm
+++ b/code/game/objects/items/devices/scanners/autopsy_scanner.dm
@@ -179,7 +179,7 @@
if(humantarget.has_dna() && humantarget.dna.stability != initial(humantarget.dna.stability))
autopsy_information += "Genetic Stability: [humantarget.dna.stability]%."
var/datum/species/targetspecies = humantarget.dna.species
- var/disguised = !ishumanbasic(humantarget) && istype(humantarget.head, /obj/item/clothing/head/hooded/human_head) && istype(humantarget.wear_suit, /obj/item/clothing/suit/hooded/bloated_human)
+ var/disguised = !ishumanbasic(humantarget) && HAS_TRAIT(humantarget, TRAIT_HUMAN_DISGUISE)
var/species_name = "[disguised ? "\"[/datum/species/human::name]\"" : targetspecies.name][mutant ? "-derived mutant" : ""]"
autopsy_information += "Species: [species_name]"
autopsy_information += "Core temperature: [round(humantarget.coretemperature-T0C, 0.1)] °C ([round(humantarget.coretemperature*1.8-459.67,0.1)] °F)"
diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm
index 9805a9545d59..94c3d63bdde4 100644
--- a/code/game/objects/items/devices/scanners/health_analyzer.dm
+++ b/code/game/objects/items/devices/scanners/health_analyzer.dm
@@ -205,7 +205,7 @@
has_brain = TRUE
else if(iscyborg(target))
var/mob/living/silicon/robot/cyborg_target = target
- if(cyborg_target.mmi?.brain)
+ if(astype(cyborg_target.mmi, /obj/item/brain_processor/organic)?.brain)
has_brain = TRUE
if(!has_brain) // kept exclusively for soul purposes
@@ -353,7 +353,7 @@
//body temperature
var/datum/species/targetspecies = humantarget.dna.species
- var/disguised = !ishumanbasic(humantarget) && istype(humantarget.head, /obj/item/clothing/head/hooded/human_head) && istype(humantarget.wear_suit, /obj/item/clothing/suit/hooded/bloated_human)
+ var/disguised = !ishumanbasic(humantarget) && HAS_TRAIT(humantarget, TRAIT_HUMAN_DISGUISE)
var/species_name = "[disguised ? "\"[/datum/species/human::name]\"" : targetspecies.name][mutant ? "-derived mutant" : ""]"
render_list += "Species: [species_name]
"
diff --git a/code/game/objects/items/devices/spyglasses.dm b/code/game/objects/items/devices/spyglasses.dm
index 14cbca8edc5c..e2a86abcdc46 100644
--- a/code/game/objects/items/devices/spyglasses.dm
+++ b/code/game/objects/items/devices/spyglasses.dm
@@ -65,6 +65,7 @@
tracker = new /datum/movement_detector(src, CALLBACK(src, PROC_REF(update_view)))
cam_screen = new
cam_screen.generate_view("spypopup_map")
+ cam_screen.set_display(src)
/obj/item/clothing/accessory/spy_bug/Destroy()
if(linked_glasses)
diff --git a/code/game/objects/items/devices/swapper.dm b/code/game/objects/items/devices/swapper.dm
index 91b0b36d2772..44421012af26 100644
--- a/code/game/objects/items/devices/swapper.dm
+++ b/code/game/objects/items/devices/swapper.dm
@@ -87,8 +87,8 @@
if(QDELETED(linked_swapper) || isnull(linked_swapper.loc) || world.time < linked_swapper.cooldown)
return
- var/atom/movable/container_A = get_teleportable_container(src)
- var/atom/movable/container_B = get_teleportable_container(linked_swapper)
+ var/atom/movable/container_A = get_loose_container(src)
+ var/atom/movable/container_B = get_loose_container(linked_swapper)
var/target_A = container_A.drop_location()
var/target_B = container_B.drop_location()
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index a90ea8ddec04..6c6d045bb0c1 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -88,6 +88,9 @@
/obj/item/taperecorder/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(mytape || !istype(tool, /obj/item/tape))
return NONE
+ if(istype(tool, /obj/item/music_tape))
+ balloon_alert(user, "won't fit!")
+ return ITEM_INTERACT_BLOCKING
if(!user.transferItemToLoc(tool,src))
return ITEM_INTERACT_BLOCKING
mytape = tool
diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm
index e7cb7bac4f02..2bdfaea63b0f 100644
--- a/code/game/objects/items/dice.dm
+++ b/code/game/objects/items/dice.dm
@@ -435,8 +435,8 @@
if(19)
//Instrinct Resistance
selected_turf.visible_message(span_userdanger("[user] looks very robust!"))
- user.physiology.brute_mod *= 0.5
- user.physiology.burn_mod *= 0.5
+ MODIFY_PHYSIOLOGY(user, BRUTE, 0.5)
+ MODIFY_PHYSIOLOGY(user, BURN, 0.5)
if(20)
//Free wizard!
diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm
index 88018ecbc566..4a9b946af839 100644
--- a/code/game/objects/items/grenades/chem_grenade.dm
+++ b/code/game/objects/items/grenades/chem_grenade.dm
@@ -487,7 +487,7 @@
var/obj/item/reagent_containers/cup/beaker/beaker_one = new(src)
var/obj/item/reagent_containers/cup/beaker/beaker_two = new(src)
- beaker_one.reagents.add_reagent(/datum/reagent/toxin/plantbgone, 25)
+ beaker_one.reagents.add_reagent(/datum/reagent/toxin/plantbgone/weedkiller, 25)
beaker_one.reagents.add_reagent(/datum/reagent/potassium, 25)
beaker_two.reagents.add_reagent(/datum/reagent/phosphorus, 25)
beaker_two.reagents.add_reagent(/datum/reagent/consumable/sugar, 25)
diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm
index 5a916c5f1e45..ba9c6a4944dc 100644
--- a/code/game/objects/items/grenades/flashbang.dm
+++ b/code/game/objects/items/grenades/flashbang.dm
@@ -57,7 +57,7 @@
//Flash
var/attempt_flash = living_mob.flash_act(affect_silicon = 1)
- if(attempt_flash == FLASH_COMPLETED)
+ if(attempt_flash && attempt_flash != FLASH_COMPLETED)
if(distance <= sweetspot_range || issilicon(living_mob))
living_mob.Paralyze(max(20/max(1, distance), 5))
living_mob.Knockdown(max(200/max(1, distance), 60))
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 7f75c5120043..5f746df1ea91 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -430,6 +430,7 @@
w_class = WEIGHT_CLASS_NORMAL
slowdown = 7
breakouttime = 30 SECONDS
+ resist_cooldown = CLICK_CD_RANGE
slot_flags = ITEM_SLOT_LEGCUFFED
/// Icon state for the legcuff overlay
var/legcuff_state = "legcuff"
diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm
index 9a0fadfcf8ff..48d86e57a9e1 100644
--- a/code/game/objects/items/implants/implant_explosive.dm
+++ b/code/game/objects/items/implants/implant_explosive.dm
@@ -189,6 +189,21 @@
Upon arming, attempts to sync with any other detected microexplosives for increased detonation yield; \
the handshake process between microbombs, however, takes a bit, and only gets longer as more microbombs are detected."
+// Version with the same appearance and delay as a macrobomb, but is actually a microbomb with a surprise!
+/obj/item/implant/explosive/macro/fake
+ explosion_light = /obj/item/implant/explosive::explosion_light
+ explosion_heavy = /obj/item/implant/explosive::explosion_heavy
+ explosion_devastate = /obj/item/implant/explosive::explosion_devastate
+
+/obj/item/implant/explosive/macro/fake/explode(atom/override_explode_target)
+ honkerblast(
+ origin = override_explode_target || src,
+ light_range = /obj/item/implant/explosive/macro::explosion_light * 0.5,
+ medium_range = /obj/item/implant/explosive/macro::explosion_heavy * 0.5,
+ heavy_range = /obj/item/implant/explosive/macro::explosion_devastate * 0.5,
+ )
+ return ..()
+
///Microbomb which prevents you from going into critical condition but also explodes after a timer when you reach critical condition in the first place.
/obj/item/implant/explosive/deniability
name = "tactical deniability implant"
@@ -248,6 +263,10 @@
name = "implanter (macrobomb)"
imp_type = /obj/item/implant/explosive/macro
+/obj/item/implanter/explosive_macro/fake
+ name = "implanter (fake macrobomb)"
+ imp_type = /obj/item/implant/explosive/macro/fake
+
/obj/item/implanter/tactical_deniability
name = "implanter (tactical deniability)"
imp_type = /obj/item/implant/explosive/deniability
diff --git a/code/game/objects/items/implants/implant_freedom.dm b/code/game/objects/items/implants/implant_freedom.dm
index fda16334567c..34d63ea71fc4 100644
--- a/code/game/objects/items/implants/implant_freedom.dm
+++ b/code/game/objects/items/implants/implant_freedom.dm
@@ -14,6 +14,8 @@
to nondestructively unsecure relevant bindings. Unfortunately, this only works for bindings on the arms and legs; \
larger restraints, such as straightjackets are too complex for the nanites to deal with."
+ var/resist_strength = 3 MINUTES
+
/obj/item/implant/freedom/implant(mob/living/target, mob/user, silent, force)
. = ..()
if(!.)
@@ -32,7 +34,7 @@
uses--
- carbon_imp_in.uncuff()
+ carbon_imp_in.uncuff(resist_strength)
var/obj/item/clothing/shoes/shoes = carbon_imp_in.get_item_by_slot(ITEM_SLOT_FEET)
if(istype(shoes) && shoes.tied == SHOES_KNOTTED)
shoes.adjust_laces(SHOES_TIED, carbon_imp_in)
@@ -42,8 +44,9 @@
qdel(src)
/obj/item/implant/freedom/proc/can_trigger(mob/living/carbon/implanted_in)
- if(implanted_in.handcuffed || implanted_in.legcuffed)
- return TRUE
+ for(var/obj/item/restraint in implanted_in.get_all_attached_restraints())
+ if(restraint.breakouttime <= resist_strength)
+ return TRUE
var/obj/item/clothing/shoes/shoes = implanted_in.get_item_by_slot(ITEM_SLOT_FEET)
if(istype(shoes) && shoes.tied == SHOES_KNOTTED)
diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm
index f8fe8b755175..25cc40f32ca3 100644
--- a/code/game/objects/items/implants/implantchair.dm
+++ b/code/game/objects/items/implants/implantchair.dm
@@ -126,8 +126,7 @@
update_appearance()
/obj/machinery/implantchair/container_resist_act(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
user.visible_message(span_notice("You see [user] kicking against the door of [src]!"), \
span_notice("You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)"), \
span_hear("You hear a metallic creaking from [src]."))
diff --git a/code/game/objects/items/mail.dm b/code/game/objects/items/mail.dm
index 8b448ebaea54..c281ee07a8e0 100644
--- a/code/game/objects/items/mail.dm
+++ b/code/game/objects/items/mail.dm
@@ -125,7 +125,7 @@
return FALSE
return after_unwrap(user)
-/// proc for unwrapping a mail. Goes just for an unwrapping procces, returns FALSE if it fails.
+/// Proc for attempting to open a letter. Returns FALSE if it fails.
/obj/item/mail/proc/unwrap(mob/user)
if(recipient_ref)
var/datum/mind/recipient = recipient_ref.resolve()
@@ -140,7 +140,7 @@
return FALSE
return TRUE
-// proc that goes after unwrapping a mail.
+/// Handles additional effects after a letter has successfully been opened, like moving contents to the user, and playing sound effects.
/obj/item/mail/proc/after_unwrap(mob/user)
user.temporarilyRemoveItemFromInventory(src, force = TRUE)
for(var/obj/stuff as anything in contents) // Mail and envelope actually can have more than 1 item.
@@ -149,6 +149,8 @@
else
stuff.forceMove(drop_location())
playsound(loc, 'sound/items/poster/poster_ripped.ogg', vol = 50, vary = TRUE)
+ if(recipient_ref) // We only want to care about mail with an owner.
+ SSeconomy.mail_opened += 1
qdel(src)
return TRUE
diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm
index 2525f730189b..32c4c093c0cb 100644
--- a/code/game/objects/items/pet_carrier.dm
+++ b/code/game/objects/items/pet_carrier.dm
@@ -140,8 +140,7 @@
container_resist_act(user)
/obj/item/pet_carrier/container_resist_act(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
if(user.mob_size <= MOB_SIZE_SMALL)
to_chat(user, span_notice("You poke a limb through [src]'s bars and start fumbling for the lock switch... (This will take some time.)"))
to_chat(loc, span_warning("You see [user] reach through the bars and fumble for the lock switch!"))
@@ -168,9 +167,14 @@
if(open)
icon_state = "[base_icon_state]_open"
return ..()
- icon_state = "[base_icon_state]_[!occupants.len ? "closed" : "occupied"]_[locked ? "locked" : "unlocked"]"
+ icon_state = "[base_icon_state]_[!occupants.len ? "closed" : "occupied"]"
return ..()
+/obj/item/pet_carrier/update_overlays()
+ . = ..()
+ if(!open)
+ . += "[base_icon_state]_[locked ? "locked" : "unlocked"]"
+
/obj/item/pet_carrier/mouse_drop_dragged(atom/over_atom, mob/user, src_location, over_location, params)
if(isopenturf(over_atom) && open && occupants.len)
user.visible_message(span_notice("[user] unloads [src]."), \
@@ -257,7 +261,7 @@
/obj/item/pet_carrier/small/mouse
name = "small mouse carrier"
desc = "A small pet carrier for miniature sized animals. This looks prepared for a mouse."
- icon_state = "small_carrier_occupied_unlocked"
+ icon_state = "small_carrier_occupied"
open = FALSE
/obj/item/pet_carrier/small/mouse/Initialize(mapload)
diff --git a/code/game/objects/items/pillow.dm b/code/game/objects/items/pillow.dm
index a54bba758dbb..e96a59270c82 100644
--- a/code/game/objects/items/pillow.dm
+++ b/code/game/objects/items/pillow.dm
@@ -1,3 +1,5 @@
+#define FORTIFY_FILTER "ANGRY_GLOW"
+
//Pillow and pillow related items
/obj/item/pillow
name = "pillow"
@@ -22,6 +24,8 @@
var/hit_sound
///if we have a brick inside us
var/bricked = FALSE
+ ///Stamina recoil from hitting
+ var/stam_recoil = 5
drop_sound = SFX_CLOTH_DROP
pickup_sound = SFX_CLOTH_PICKUP
@@ -65,8 +69,9 @@
hit_sound = 'sound/items/pillow/pillow_hit2.ogg'
else
hit_sound = 'sound/items/pillow/pillow_hit.ogg'
- user.apply_damage(5, STAMINA) //Had to be done so one person cannot keep multiple people stam critted
+ user.apply_damage(stam_recoil, STAMINA) //Had to be done so one person cannot keep multiple people stam critted
last_fighter = user
+ new /obj/effect/temp_visual/pillow_hit(get_turf(target_mob))
playsound(user, hit_sound, 80) //the basic 50 vol is barely audible
/obj/item/pillow/attack_secondary(mob/living/carbon/victim, mob/living/user, list/modifiers, list/attack_modifiers)
@@ -174,6 +179,9 @@
if(prob(1))
become_bricked()
+/obj/item/pillow/suit_pillow
+ stam_recoil = 0
+
/obj/item/clothing/suit/pillow_suit
name = "pillow suit"
desc = "Part man, part pillow. All CARNAGE!"
@@ -185,12 +193,13 @@
icon_state = "pillow_suit"
armor_type = /datum/armor/suit_pillow_suit
custom_materials = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT)
- var/obj/item/pillow/unstoppably_plushed
+ var/obj/item/pillow/suit_pillow/unstoppably_plushed
/datum/armor/suit_pillow_suit
melee = 5
acid = 75
+
/obj/item/clothing/suit/pillow_suit/Initialize(mapload)
. = ..()
unstoppably_plushed = new(src)
@@ -200,6 +209,7 @@
. = ..()
QDEL_NULL(unstoppably_plushed)
+
/obj/item/clothing/head/pillow_hood
name = "pillow hood"
desc = "The final piece of the pillow juggernaut"
@@ -236,3 +246,143 @@
desc = "Daww look at that little mime!"
icon_state = "pillow_6_t"
variation = 6
+
+/obj/item/spear/pillow
+ name = "pillow lance"
+ desc = "Looks like someone duct-taped a body-pillow onto a long pole, as some kind of blunt spear."
+ damtype = STAMINA
+ force_unwielded = 12
+ force_wielded = 18
+ icon_state = "pillow_lance0"
+ inhand_icon_state = "pillow_lance0"
+ icon_prefix = "pillow_lance"
+ hitsound = 'sound/items/pillow/pillow_hit.ogg'
+ ///The current direction of the jousting.
+ VAR_FINAL/current_direction = NONE
+ ///How many tiles we've charged up thus far
+ VAR_FINAL/current_tile_charge = 0
+ ///The min amount of tiles before you can joust someone.
+ var/min_tile_charge = 2
+ ///How much of an increase in damage is achieved every tile moved during jousting.
+ var/damage_boost_per_tile = 2
+ ///How much stamina we lose per tile charge
+ var/stamina_per_tile = 5
+ ///Tracker for when we last moved to ensure its a continous charge
+ VAR_FINAL/last_charge_move
+ ///Chargine state
+ VAR_FINAL/charging = FALSE
+
+
+/obj/item/spear/pillow/on_wield(obj/item/source, mob/living/carbon/user)
+ . = ..()
+ RegisterSignal(user, COMSIG_MOB_CLIENT_MOVED, PROC_REF(check_move))
+ RegisterSignal(user, COMSIG_LIVING_MOB_BUMP, PROC_REF(impale))
+
+/obj/item/spear/pillow/on_unwield(obj/item/source, mob/living/carbon/user)
+ . = ..()
+ reset_user(user)
+
+/obj/item/spear/pillow/dropped(mob/user, silent)
+ . = ..()
+ reset_user(user)
+
+/obj/item/spear/pillow/proc/reset_user(mob/user)
+ UnregisterSignal(user, list(COMSIG_MOB_CLIENT_MOVED, COMSIG_LIVING_MOB_BUMP))
+ reset_charge(user)
+
+/obj/item/spear/pillow/proc/reset_charge(mob/living/user)
+ user.remove_movespeed_modifier(/datum/movespeed_modifier/lance_charge)
+ current_tile_charge = initial(current_tile_charge)
+ current_direction = user.dir
+ charging = FALSE
+
+/obj/item/spear/pillow/proc/check_move(mob/living/user)
+ SIGNAL_HANDLER
+
+ if(current_direction != user.dir || world.time > last_charge_move + 0.5 SECONDS)
+ reset_charge(user)
+ else
+ if(current_tile_charge >= min_tile_charge)
+ if(!charging)
+ user.add_movespeed_modifier(/datum/movespeed_modifier/lance_charge)
+ user.balloon_alert(user, "charging!")
+ charging = TRUE
+ user.adjust_stamina_loss(stamina_per_tile)
+ current_tile_charge++
+ last_charge_move = world.time
+
+/obj/item/spear/pillow/proc/impale(mob/living/user, mob/living/target)
+ SIGNAL_HANDLER
+
+ if(current_tile_charge < min_tile_charge)
+ user.balloon_alert(user, "too slow!")
+ return
+ INVOKE_ASYNC(target, TYPE_PROC_REF(/atom, attackby), src, user)
+ target.adjust_stamina_loss(damage_boost_per_tile * current_tile_charge)
+ playsound(user, 'sound/effects/bang.ogg', 40, TRUE)
+ user.remove_movespeed_modifier(/datum/movespeed_modifier/lance_charge)
+
+/obj/item/spear/pillow/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
+ . = ..()
+
+ new /obj/effect/temp_visual/pillow_hit(get_turf(target))
+
+/obj/item/shield/mattress
+ name = "mattress shield"
+ desc = "A typical twin mattress repurposed into a makeshift shield"
+ icon_state = "mattress_shield"
+ inhand_icon_state = "mattress_shield"
+ damtype = STAMINA
+ force = 10
+ actions_types = list(/datum/action/item_action/fortify)
+ action_slots = ALL
+ hitsound = 'sound/items/pillow/pillow_hit.ogg'
+ block_chance = 20
+ max_integrity = 30
+ custom_materials = list(/datum/material/paper = SHEET_MATERIAL_AMOUNT * 4)
+ var/hunkered = FALSE
+ ///Aura color for juggernaut mode
+ var/outline_colour = "#eb0c07"
+
+/obj/item/shield/mattress/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
+ . = ..()
+
+ new /obj/effect/temp_visual/pillow_hit(get_turf(target))
+
+/obj/item/shield/mattress/dropped(mob/user, silent)
+ . = ..()
+ if(hunkered)
+ un_fortify(user)
+
+/obj/item/shield/mattress/ui_action_click(mob/user, actiontype)
+ . = ..()
+
+ if(!hunkered)
+ fortify(user)
+ else
+ un_fortify(user)
+
+/obj/item/shield/mattress/proc/fortify(mob/user)
+ hunkered = TRUE
+ force += 5
+ block_chance += 20
+ ADD_TRAIT(user, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, HELD_ITEM_TRAIT)
+ user.add_movespeed_modifier(/datum/movespeed_modifier/pillow_fortify)
+ user.visible_message(span_alert("[user.name] hunkers down into a defensive stance!"))
+ user.add_filter(FORTIFY_FILTER, 2, list("type" = "outline", "color" = outline_colour, "alpha" = 0, "size" = 1))
+ var/filter = user.get_filter(FORTIFY_FILTER)
+ animate(filter, alpha = 200, time = 0.5 SECONDS, loop = -1)
+ animate(alpha = 0, time = 0.5 SECONDS)
+
+/obj/item/shield/mattress/proc/un_fortify(mob/user)
+ hunkered = FALSE
+ force -= 5
+ block_chance -= 20
+ REMOVE_TRAIT(user, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, HELD_ITEM_TRAIT)
+ user.remove_movespeed_modifier(/datum/movespeed_modifier/pillow_fortify)
+ var/filter = user.get_filter(FORTIFY_FILTER)
+ animate(filter)
+ user.remove_filter(FORTIFY_FILTER)
+ user.visible_message(span_alert("[user] loosens up and relaxes a bit."))
+
+#undef FORTIFY_FILTER
diff --git a/code/game/objects/items/pitchfork.dm b/code/game/objects/items/pitchfork.dm
index 497e213acba0..b6779343c0db 100644
--- a/code/game/objects/items/pitchfork.dm
+++ b/code/game/objects/items/pitchfork.dm
@@ -7,6 +7,7 @@
/obj/item/pitchfork
icon = 'icons/obj/weapons/spear.dmi'
icon_state = "pitchfork0"
+ inhand_icon_state = "pitchfork0"
base_icon_state = "pitchfork"
icon_angle = -45
lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
diff --git a/code/game/objects/items/rcd/RCD.dm b/code/game/objects/items/rcd/RCD.dm
index bb4793d3e82a..81a8f4e6ebbe 100644
--- a/code/game/objects/items/rcd/RCD.dm
+++ b/code/game/objects/items/rcd/RCD.dm
@@ -7,6 +7,7 @@
name = "rapid-construction-device (RCD)"
icon = 'icons/obj/tools.dmi'
icon_state = "rcd"
+ inhand_icon_state = "rcd"
worn_icon_state = "RCD"
inside_belt_icon_state = "rcd"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
@@ -645,6 +646,7 @@
desc = "Highly compressed matter for the RCD."
icon = 'icons/obj/tools.dmi'
icon_state = "rcdammo"
+ inhand_icon_state = "rcdammo"
w_class = WEIGHT_CLASS_TINY
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
diff --git a/code/game/objects/items/rcd/RDD.dm b/code/game/objects/items/rcd/RDD.dm
index 67f62027aed9..2e3cfa53ee6b 100644
--- a/code/game/objects/items/rcd/RDD.dm
+++ b/code/game/objects/items/rcd/RDD.dm
@@ -170,6 +170,7 @@ GLOBAL_LIST_INIT(rdd_designs, list(
Internally synthesizes cheap plastic replicas of natural scenery."
icon = 'icons/obj/tools.dmi'
icon_state = "rdd"
+ inhand_icon_state = "rdd"
worn_icon_state = "RCD"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
diff --git a/code/game/objects/items/rcd/RHD.dm b/code/game/objects/items/rcd/RHD.dm
index 6022fe83e596..c71e1dcf2915 100644
--- a/code/game/objects/items/rcd/RHD.dm
+++ b/code/game/objects/items/rcd/RHD.dm
@@ -56,6 +56,7 @@
update_appearance()
/obj/item/construction/Destroy()
+ QDEL_NULL(spark_system)
QDEL_NULL(silo_mats)
return ..()
@@ -92,11 +93,6 @@
if(iron)
. += "Remote connection has iron in equivalent to [iron] RCD unit\s." //1 matter for 1 floor tile, as 4 tiles are produced from 1 iron
-/obj/item/construction/Destroy()
- QDEL_NULL(spark_system)
- silo_mats = null
- return ..()
-
/obj/item/construction/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
SHOULD_CALL_PARENT(TRUE)
diff --git a/code/game/objects/items/rcd/RLD.dm b/code/game/objects/items/rcd/RLD.dm
index fd38da49adf2..fed69f8ec976 100644
--- a/code/game/objects/items/rcd/RLD.dm
+++ b/code/game/objects/items/rcd/RLD.dm
@@ -20,6 +20,7 @@
desc = "A device used to rapidly provide lighting sources to an area. Reload with iron, plasteel, glass or compressed matter cartridges."
icon = 'icons/obj/tools.dmi'
icon_state = "rld"
+ inhand_icon_state = "rld"
worn_icon_state = "RPD"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
diff --git a/code/game/objects/items/rcd/RPD.dm b/code/game/objects/items/rcd/RPD.dm
index 2663ce0c97a2..31f1436352e3 100644
--- a/code/game/objects/items/rcd/RPD.dm
+++ b/code/game/objects/items/rcd/RPD.dm
@@ -23,6 +23,7 @@
desc = "A device used to rapidly pipe things."
icon = 'icons/obj/tools.dmi'
icon_state = "rpd"
+ inhand_icon_state = "rpd"
worn_icon_state = "RPD"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
@@ -187,6 +188,7 @@
available_recipe += list(list(
"pipe_name" = info.name,
+ "pipe_desc" = info.desc,
"pipe_index" = i,
"previews" = info.get_preview(p_dir, info == recipe)
))
diff --git a/code/game/objects/items/rcd/RTD.dm b/code/game/objects/items/rcd/RTD.dm
index ce04a4f2663b..24210181cb27 100644
--- a/code/game/objects/items/rcd/RTD.dm
+++ b/code/game/objects/items/rcd/RTD.dm
@@ -15,6 +15,7 @@
desc = "Used for fast placement & destruction of floor tiles."
icon = 'icons/obj/tools.dmi'
icon_state = "rtd"
+ inhand_icon_state = "rtd"
worn_icon_state = "RCD"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm
index 5ab3d483182c..ee2b952e3480 100644
--- a/code/game/objects/items/religion.dm
+++ b/code/game/objects/items/religion.dm
@@ -342,6 +342,7 @@
desc = "It's a stick..?"
icon = 'icons/obj/weapons/staff.dmi'
icon_state = "godstaff-red"
+ inhand_icon_state = "godstaff-red"
icon_angle = -45
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
@@ -374,6 +375,7 @@
/obj/item/godstaff/blue
icon_state = "godstaff-blue"
+ inhand_icon_state = "godstaff-blue"
conversion_color = "#0000ff"
/obj/item/clothing/gloves/plate
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index d210e22704c9..82e80a207169 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -265,8 +265,8 @@
update_appearance()
return ITEM_INTERACT_SUCCESS
- if(istype(tool, /obj/item/mmi))
- var/obj/item/mmi/potential_brain = tool
+ if(istype(tool, /obj/item/brain_processor))
+ var/obj/item/brain_processor/potential_brain = tool
if(!check_completion())
to_chat(user, span_warning("The MMI must go in after everything else!"))
return ITEM_INTERACT_BLOCKING
diff --git a/code/game/objects/items/stacks/golem_food/golem_status_effects.dm b/code/game/objects/items/stacks/golem_food/golem_status_effects.dm
index bcb607d9ebf5..48c617234443 100644
--- a/code/game/objects/items/stacks/golem_food/golem_status_effects.dm
+++ b/code/game/objects/items/stacks/golem_food/golem_status_effects.dm
@@ -233,15 +233,13 @@
return FALSE
owner.add_traits(list(TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTHEAT, TRAIT_ASHSTORM_IMMUNE), TRAIT_STATUS_EFFECT(id))
RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_burned))
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.burn_mod *= BURN_MULTIPLIER
+ MODIFY_PHYSIOLOGY(owner, BURN, BURN_MULTIPLIER)
return TRUE
/datum/status_effect/golem/plasma/on_remove()
owner.remove_traits(list(TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTHEAT, TRAIT_ASHSTORM_IMMUNE), TRAIT_STATUS_EFFECT(id))
UnregisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE)
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.burn_mod /= BURN_MULTIPLIER
+ MODIFY_PHYSIOLOGY(owner, BURN, 1 / BURN_MULTIPLIER)
return ..()
/// When we take fire damage (or... technically also cold damage, we don't differentiate), zap a nearby APC
@@ -417,10 +415,9 @@
. = ..()
if (!.)
return FALSE
- var/mob/living/carbon/human/human_owner = owner
- RegisterSignal(human_owner, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_punched))
- human_owner.physiology.brute_mod *= brute_modifier
- for (var/obj/item/bodypart/arm/arm in human_owner.get_bodyparts())
+ RegisterSignal(owner, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_punched))
+ MODIFY_PHYSIOLOGY(owner, BRUTE, brute_modifier)
+ for (var/obj/item/bodypart/arm/arm in owner.get_bodyparts())
buff_arm(arm)
/// Give mining mobs an extra slap
@@ -441,9 +438,8 @@
LAZYADD(modified_arms, arm)
/datum/status_effect/golem/titanium/on_remove()
- var/mob/living/carbon/human/human_owner = owner
- UnregisterSignal(human_owner, COMSIG_LIVING_UNARMED_ATTACK)
- human_owner.physiology.brute_mod /= brute_modifier
+ UnregisterSignal(owner, COMSIG_LIVING_UNARMED_ATTACK)
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 1 / brute_modifier)
for (var/obj/item/bodypart/arm/arm as anything in modified_arms)
debuff_arm(arm)
LAZYCLEARLIST(modified_arms)
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 42edcf17c60a..4678492ec959 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -374,6 +374,7 @@
singular_name = "bruise pack"
desc = "A therapeutic gel pack and bandages designed to treat blunt-force trauma."
icon_state = "brutepack"
+ inhand_icon_state = "brutepack"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
heal_brute = 40
@@ -626,6 +627,7 @@
gender = PLURAL
singular_name = "ointment"
icon_state = "ointment"
+ inhand_icon_state = "ointment"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
amount = 8
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 285d1293db02..4687413157a6 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -426,7 +426,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
if(isliving(AM))
var/mob/living/L = AM
if(!(L.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) || L.buckled)
- playsound(src, 'sound/effects/footstep/glass_step.ogg', HAS_TRAIT(L, TRAIT_LIGHT_STEP) ? 30 : 50, TRUE)
+ playsound(src, 'sound/effects/footstep/glass_step.ogg', (HAS_TRAIT(L, TRAIT_LIGHT_STEP) || HAS_TRAIT(L, TRAIT_OBFUSCATED)) ? 30 : 50, TRUE) // DARKPACK EDIT CHANGE - POWERS
/obj/item/shard/plasma
name = "purple shard"
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 430d24fd5887..50888fded8ff 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -179,7 +179,7 @@ GLOBAL_LIST_INIT(monkey_recipes, list ( \
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), \
+ new/datum/stack_recipe("lizard scale carpet", /obj/item/stack/tile/carpet/lizard, 1, 4, 20, category = CAT_TILES), \
))
/obj/item/stack/sheet/animalhide/carbon/lizard/get_main_recipes()
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index e73ea226d81b..c10429b7144c 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -428,13 +428,12 @@ GLOBAL_LIST_INIT(snow_recipes, list ( \
. = ..()
. += GLOB.snow_recipes
+
/****************************** Others ****************************/
/*
* Adamantine
-*/
-
-
+ */
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),
@@ -453,13 +452,12 @@ GLOBAL_LIST_INIT(adamantine_recipes, list(
. = ..()
. += 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
*/
+GLOBAL_LIST_INIT(runite_recipes, list(
+ new /datum/stack_recipe("runite tile", /obj/item/stack/tile/mineral/runite, 1, 4, 20, category = CAT_TILES), \
+ ))
/obj/item/stack/sheet/mineral/runite
name = "runite"
@@ -476,13 +474,13 @@ GLOBAL_LIST_INIT(runite_recipes, list(
. = ..()
. += GLOB.runite_recipes
+/*
+ * Mythril
+ */
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
- */
/obj/item/stack/sheet/mineral/mythril
name = "mythril"
icon_state = "sheet-mythril"
@@ -530,7 +528,6 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \
/*
* Coal
*/
-
/obj/item/stack/sheet/mineral/coal
name = "coal"
desc = "Someone's gotten on the naughty list."
@@ -563,7 +560,9 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \
/obj/item/stack/sheet/mineral/coal/ten
amount = 10
-//Metal Hydrogen
+/*
+ * 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),
@@ -577,7 +576,6 @@ GLOBAL_LIST_INIT(metalhydrogen_recipes, list(
name = "metal hydrogen"
icon_state = "sheet-metalhydrogen"
worn_icon_state = "sheet-metalhydrogen"
- worn_icon_state = "sheet-metalhydrogen"
inhand_icon_state = "sheet-metalhydrogen"
singular_name = "metal hydrogen sheet"
w_class = WEIGHT_CLASS_NORMAL
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 41e881cd4a64..26029a69777a 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -405,10 +405,10 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
return ITEM_INTERACT_SUCCESS
else
return NONE
+
/*
* Bamboo
*/
-
GLOBAL_LIST_INIT(bamboo_recipes, list ( \
new/datum/stack_recipe("punji sticks trap", /obj/structure/punji_sticks, 5, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \
new/datum/stack_recipe("bamboo spear", /obj/item/spear/bamboospear, 25, time = 9 SECONDS, crafting_flags = NONE, category = CAT_WEAPON_MELEE), \
@@ -824,15 +824,9 @@ 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
+/*
+ * Plastic
+ */
GLOBAL_LIST_INIT(plastic_recipes, list(
new /datum/stack_recipe("plastic floor tile", /obj/item/stack/tile/plastic, 1, 4, 20, time = 2 SECONDS, crafting_flags = NONE, category = CAT_TILES), \
new /datum/stack_recipe("folding plastic chair", /obj/structure/chair/plastic, 2, crafting_flags = NONE, category = CAT_FURNITURE), \
@@ -872,6 +866,9 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
. = ..()
. += GLOB.plastic_recipes
+/*
+ * Paper Frames
+ */
GLOBAL_LIST_INIT(paperframe_recipes, list(
new /datum/stack_recipe("paper frame separator", /obj/structure/window/paperframe, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_IS_FULLTILE, time = 1 SECONDS), \
new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperframe, 3, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, time = 1 SECONDS ), \
@@ -902,6 +899,9 @@ GLOBAL_LIST_INIT(paperframe_recipes, list(
/obj/item/stack/sheet/paperframes/fifty
amount = 50
+/*
+ * Meat
+ */
/obj/item/stack/sheet/meat
name = "meat sheets"
desc = "Something's bloody meat compressed into a nice solid sheet."
@@ -922,19 +922,13 @@ 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), \
))
+/*
+ * Pizza
+ */
/obj/item/stack/sheet/pizza
name = "sheet pizza"
desc = "It's a deliciously rectangular sheet of pizza!"
@@ -958,6 +952,17 @@ GLOBAL_LIST_INIT(pizza_sheet_recipes, list(
/obj/item/stack/sheet/pizza/five
amount = 5
+/*
+ * Hauntium
+ */
+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
+
/obj/item/stack/sheet/hauntium
name = "haunted sheets"
desc = "These sheets seem cursed."
@@ -975,11 +980,3 @@ 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/tiles/tile_iron.dm b/code/game/objects/items/stacks/tiles/tile_iron.dm
index d2bb3fe233b1..f4a9e7074c1e 100644
--- a/code/game/objects/items/stacks/tiles/tile_iron.dm
+++ b/code/game/objects/items/stacks/tiles/tile_iron.dm
@@ -480,12 +480,12 @@
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
+ name = "recharge floor tile"
+ singular_name = "recharge floor tile"
+ icon_state = "tile_recharge"
+ turf_type = /turf/open/floor/iron/recharge_floor
+ merge_type = /obj/item/stack/tile/iron/recharge_floor
/obj/item/stack/tile/iron/recharge_floor/dark
name = "dark recharge floor tile"
@@ -494,6 +494,13 @@
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/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/smooth
name = "smooth recharge floor tile"
singular_name = "smooth recharge floor tile"
@@ -501,13 +508,6 @@
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"
- icon_state = "tile_recharge"
- turf_type = /turf/open/floor/iron/recharge_floor
- merge_type = /obj/item/stack/tile/iron/recharge_floor
-
/obj/item/stack/tile/iron/smooth
name = "smooth tile"
singular_name = "smooth 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 2a2f79c6207f..92fa12ced895 100644
--- a/code/game/objects/items/stacks/tiles/tile_mineral.dm
+++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm
@@ -39,7 +39,7 @@
)
/obj/item/stack/tile/mineral/plasma/tiled
- icon_state = "plasma_tiled"
+ icon_state = "tile_plasma_tiled"
turf_type = /turf/open/floor/mineral/plasma/tiled
merge_type = /obj/item/stack/tile/mineral/plasma/tiled
@@ -59,7 +59,7 @@
)
/obj/item/stack/tile/mineral/uranium/tiled
- icon_state = "uranium_tiled"
+ icon_state = "tile_uranium_tiled"
turf_type = /turf/open/floor/mineral/uranium/tiled
merge_type = /obj/item/stack/tile/mineral/uranium/tiled
@@ -80,12 +80,12 @@
)
/obj/item/stack/tile/mineral/gold/tiled
- icon_state = "gold_tiled"
+ icon_state = "tile_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"
+ icon_state = "tile_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
@@ -107,14 +107,14 @@
)
/obj/item/stack/tile/mineral/silver/tiled
- icon_state = "silver_tiled"
+ icon_state = "tile_silver_tiled"
turf_type = /turf/open/floor/mineral/silver/tiled
- merge_type = /obj/item/stack/tile/mineral/uranium/tiled
+ merge_type = /obj/item/stack/tile/mineral/silver/tiled
/obj/item/stack/tile/mineral/silver/moon
- icon_state = "silver_moon"
+ icon_state = "tile_silver_moon"
desc = "A tile made out of silver, portraying the moon."
- turf_type = /turf/open/floor/mineral/gold/sun
+ turf_type = /turf/open/floor/mineral/silver/moon
merge_type = /obj/item/stack/tile/mineral/silver/moon
tile_rotate_dirs = list(SOUTH, NORTH, EAST, WEST)
@@ -134,7 +134,7 @@
)
/obj/item/stack/tile/mineral/diamond/tiled
- icon_state = "diamond_tiled"
+ icon_state = "tile_diamond_tiled"
turf_type = /turf/open/floor/mineral/diamond/tiled
merge_type = /obj/item/stack/tile/mineral/diamond/tiled
@@ -155,7 +155,7 @@
)
/obj/item/stack/tile/mineral/bananium/tiled
- icon_state = "bananium_tiled"
+ icon_state = "tile_bananium_tiled"
turf_type = /turf/open/floor/mineral/bananium/tiled
merge_type = /obj/item/stack/tile/mineral/bananium/tiled
@@ -163,8 +163,8 @@
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"
+ icon_state = "tile_bluespacecrystal"
+ inhand_icon_state = "tile-bluespacecrystal"
turf_type = /turf/open/floor/mineral/bluespace
mineralType = "bluespace"
mats_per_unit = list(/datum/material/bluespace=SHEET_MATERIAL_AMOUNT*0.25)
@@ -175,15 +175,10 @@
)
/obj/item/stack/tile/mineral/bluespace/tiled
- icon_state = "bluespace_c_tiled"
+ icon_state = "tile_bluespacecrystal_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"
@@ -193,7 +188,6 @@
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,
@@ -201,35 +195,29 @@
)
/obj/item/stack/tile/mineral/telecrystal/tiled
- icon_state = "telecrystal_tiled"
- turf_type = /turf/open/floor/mineral/bluespace/tiled
+ icon_state = "tile_telecrystal_tiled"
+ turf_type = /turf/open/floor/mineral/telecrystal/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"
+ inhand_icon_state = "tile-adamantine"
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
+ merge_type = /obj/item/stack/tile/mineral/adamantine
tile_reskin_types = list(
/obj/item/stack/tile/mineral/adamantine,
- /obj/item/stack/tile/mineral/adamantine/alt,
+ /obj/item/stack/tile/mineral/adamantine/tiled,
)
-/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/adamantine/tiled
+ icon_state = "tile_adamantine_tiled"
+ turf_type = /turf/open/floor/mineral/adamantine/tiled
+ merge_type = /obj/item/stack/tile/mineral/adamantine/tiled
/obj/item/stack/tile/mineral/metal_hydrogen
name = "metal hydrogen tile"
@@ -240,7 +228,6 @@
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,
@@ -248,7 +235,7 @@
)
/obj/item/stack/tile/mineral/metal_hydrogen/tiled
- icon_state = "metal_hydrogen_tiled"
+ icon_state = "tile_metal_hydrogen_tiled"
turf_type = /turf/open/floor/mineral/metal_hydrogen/tiled
merge_type = /obj/item/stack/tile/mineral/metal_hydrogen/tiled
@@ -264,6 +251,11 @@
merge_type = /obj/item/stack/tile/mineral/runite
tile_rotate_dirs = list(SOUTH, NORTH, EAST, WEST)
+/obj/item/stack/tile/mineral/runite/tiled
+ icon_state = "tile_runite_tiled"
+ turf_type = /turf/open/floor/mineral/runite/tiled
+ merge_type = /obj/item/stack/tile/mineral/runite/tiled
+
/obj/item/stack/tile/mineral/mythril
name = "mythril tile"
singular_name = "mythril floor tile"
@@ -275,42 +267,30 @@
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/mythril/tiled
+ icon_state = "tile_mythril_tiled"
+ turf_type = /turf/open/floor/mineral/mythril/tiled
+ merge_type = /obj/item/stack/tile/mineral/mythril/tiled
+
/obj/item/stack/tile/mineral/sandstone
name = "sandstone brick tile"
- icon_state = "tile_sandstone"
- inhand_icon_state = "tile-hay"
+ desc = "A tile made out of sandstone."
+ icon_state = "sandstone_floor"
+ inhand_icon_state = "tile-sandstone"
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/stone
+ name = "stone brick tile"
+ desc = "A tile made out of stone."
+ icon_state = "stone_floor"
+ inhand_icon_state = "tile-stone"
+ mineralType = "stone"
+ mats_per_unit = list(/datum/material/rock = HALF_SHEET_MATERIAL_AMOUNT / 2)
+ turf_type = /turf/open/floor/stone
+ merge_type = /obj/item/stack/tile/mineral/stone
/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 8d3d5f33a039..dafc9e7d1cfe 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -118,6 +118,7 @@
singular_name = "fairygrass floor tile"
desc = "A patch of odd, glowing blue grass."
icon_state = "tile_fairygrass"
+ inhand_icon_state = "tile_fairygrass"
turf_type = /turf/open/floor/grass/fairy
resistance_flags = FLAMMABLE
merge_type = /obj/item/stack/tile/fairygrass
@@ -137,14 +138,6 @@
/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)
@@ -169,64 +162,6 @@
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"
@@ -250,6 +185,7 @@
name = "bamboo planks tile"
singular_name = "planks planks floor tile"
icon_state = "tile_bamboo_planks"
+ inhand_icon_state = "tile-grass"
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
@@ -286,38 +222,6 @@
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
@@ -458,52 +362,11 @@
merge_type = /obj/item/stack/tile/carpet/donk
tile_reskin_types = null
-/obj/item/stack/tile/carpet/fifty
- amount = 50
-
-/obj/item/stack/tile/iron/fifty
- amount = 50
-
-/obj/item/stack/tile/carpet/black/fifty
- amount = 50
-
-/obj/item/stack/tile/carpet/blue/fifty
- amount = 50
-
-/obj/item/stack/tile/carpet/cyan/fifty
- amount = 50
-
-/obj/item/stack/tile/carpet/green/fifty
- amount = 50
-
-/obj/item/stack/tile/carpet/orange/fifty
- amount = 50
-
-/obj/item/stack/tile/carpet/purple/fifty
- amount = 50
-
-/obj/item/stack/tile/carpet/red/fifty
- amount = 50
-
-/obj/item/stack/tile/carpet/royalblack/fifty
- amount = 50
-
-/obj/item/stack/tile/carpet/royalblue/fifty
- amount = 50
-
-/obj/item/stack/tile/carpet/executive/thirty
- amount = 30
-
-/obj/item/stack/tile/carpet/stellar/thirty
- amount = 30
-
-/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"
+ icon_state = "tile_carpet_bear"
+ inhand_icon_state = "tile-carpet-bear"
turf_type = /turf/open/floor/carpet/bear
merge_type = /obj/item/stack/tile/carpet/bear
tile_reskin_types = null
@@ -511,8 +374,8 @@
/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"
+ icon_state = "tile_carpet_bear_polar"
+ inhand_icon_state = "tile-carpet-bear-polar"
turf_type = /turf/open/floor/carpet/polar_bear
merge_type = /obj/item/stack/tile/carpet/polar_bear
tile_reskin_types = null
@@ -520,8 +383,8 @@
/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"
+ icon_state = "tile_carpet_moth"
+ inhand_icon_state = "tile-carpet-moth"
turf_type = /turf/open/floor/carpet/moth
merge_type = /obj/item/stack/tile/carpet/moth
tile_reskin_types = null
@@ -529,7 +392,7 @@
/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"
+ 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
@@ -538,7 +401,7 @@
/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"
+ 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
@@ -547,8 +410,8 @@
/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"
+ icon_state = "tile_carpet_lizard"
+ inhand_icon_state = "tile-carpet-lizard"
turf_type = /turf/open/floor/carpet/lizard
merge_type = /obj/item/stack/tile/carpet/lizard
tile_reskin_types = null
@@ -556,12 +419,54 @@
/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"
+ 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/fifty
+ amount = 50
+
+/obj/item/stack/tile/iron/fifty
+ amount = 50
+
+/obj/item/stack/tile/carpet/black/fifty
+ amount = 50
+
+/obj/item/stack/tile/carpet/blue/fifty
+ amount = 50
+
+/obj/item/stack/tile/carpet/cyan/fifty
+ amount = 50
+
+/obj/item/stack/tile/carpet/green/fifty
+ amount = 50
+
+/obj/item/stack/tile/carpet/orange/fifty
+ amount = 50
+
+/obj/item/stack/tile/carpet/purple/fifty
+ amount = 50
+
+/obj/item/stack/tile/carpet/red/fifty
+ amount = 50
+
+/obj/item/stack/tile/carpet/royalblack/fifty
+ amount = 50
+
+/obj/item/stack/tile/carpet/royalblue/fifty
+ amount = 50
+
+/obj/item/stack/tile/carpet/executive/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/stellar/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/donk/thirty
+ amount = 30
+
/obj/item/stack/tile/carpet/neon
name = "neon carpet"
singular_name = "neon carpet tile"
@@ -1280,28 +1185,6 @@
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"
@@ -1317,111 +1200,10 @@
)
/obj/item/stack/tile/plastic/puzzle
- name = "puzzle tile"
- icon_state = "plastic_puzzle"
- singular_name = "puzzle floor tile"
+ icon_state = "tile_plastic_puzzle"
+ inhand_icon_state = "tile-plastic-puzzle"
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"
@@ -1434,101 +1216,13 @@
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/hauntium/tiled,
)
-/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/hauntium/tiled
+ icon_state = "tile_hauntium_tiled"
+ turf_type = /turf/open/floor/hauntium/tiled
+ merge_type = /obj/item/stack/tile/hauntium/tiled
/obj/item/stack/tile/material
name = "floor tile"
@@ -1628,66 +1322,6 @@
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"
diff --git a/code/game/objects/items/stacks/wall_filling.dm b/code/game/objects/items/stacks/wall_filling.dm
index 4c69c0060806..cbeb4ccbb56e 100644
--- a/code/game/objects/items/stacks/wall_filling.dm
+++ b/code/game/objects/items/stacks/wall_filling.dm
@@ -93,38 +93,6 @@ 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 923f79244e1a..6b6c33f7540d 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -31,6 +31,7 @@
/obj/item/storage/backpack/Initialize(mapload)
. = ..()
AddElement(/datum/element/attack_equip)
+ AddElement(/datum/element/strip_accessible_storage)
/*
* Backpack Types
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 09af11ce7260..fe46f0a88874 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -30,6 +30,7 @@
/obj/item/storage/belt/Initialize(mapload)
. = ..()
AddElement(/datum/element/attack_equip)
+ AddElement(/datum/element/strip_accessible_storage)
update_appearance()
/obj/item/storage/belt/utility
diff --git a/code/game/objects/items/storage/boxes/engineering_boxes.dm b/code/game/objects/items/storage/boxes/engineering_boxes.dm
index eb981784584f..83cf2cd6f849 100644
--- a/code/game/objects/items/storage/boxes/engineering_boxes.dm
+++ b/code/game/objects/items/storage/boxes/engineering_boxes.dm
@@ -31,7 +31,7 @@
/obj/item/flashlight/emp/debug=1,
/obj/item/geiger_counter=1,
/obj/item/healthanalyzer/super=1,
- /obj/item/modular_computer/pda/heads/captain=1,
+ /obj/item/modular_computer/pda/crew/heads/captain=1,
/obj/item/pipe_dispenser=1,
/obj/item/stack/spacecash/c1000=50,
/obj/item/storage/box/beakers/bluespace=1,
diff --git a/code/game/objects/items/storage/boxes/job_boxes.dm b/code/game/objects/items/storage/boxes/job_boxes.dm
index 830d3db5f62b..acf87d7a10f5 100644
--- a/code/game/objects/items/storage/boxes/job_boxes.dm
+++ b/code/game/objects/items/storage/boxes/job_boxes.dm
@@ -54,14 +54,22 @@
..() // we want the survival stuff too.
new /obj/item/radio/off(src)
-/obj/item/storage/box/survival/proc/wardrobe_removal()
- if(!isplasmaman(loc)) //We need to specially fill the box with plasmaman gear, since it's intended for one
+/obj/item/storage/box/survival/proc/apply_overrides()
+ if(!ishuman(loc) || QDELING(src))
return
- var/obj/item/mask = locate(mask_type) in src
- var/obj/item/internals = locate(internal_type) in src
- new /obj/item/tank/internals/plasmaman/belt(src)
- qdel(mask) // Get rid of the items that shouldn't be
- qdel(internals)
+ var/mob/living/carbon/human/owner = loc
+ if(!length(owner.dna.species.survival_box_overrides))
+ return
+ var/list/items_to_clear = list(
+ locate(mask_type) in src,
+ locate(internal_type) in src,
+ locate(medipen_type) in src,
+ )
+ QDEL_LIST(items_to_clear)
+ var/list/survival_box_overrides = owner.dna.species.survival_box_overrides.Copy()
+ for(var/survival_types in survival_box_overrides)
+ var/item_to_add = survival_box_overrides[survival_types]
+ new item_to_add(src)
// Prisoners don't get an escape hook
/obj/item/storage/box/survival/prisoner
diff --git a/code/game/objects/items/storage/boxes/service_boxes.dm b/code/game/objects/items/storage/boxes/service_boxes.dm
index 960b85b5bfa9..7f6079e7d4f0 100644
--- a/code/game/objects/items/storage/boxes/service_boxes.dm
+++ b/code/game/objects/items/storage/boxes/service_boxes.dm
@@ -26,7 +26,7 @@
/obj/item/storage/box/pdas/PopulateContents()
for(var/i in 1 to 4)
- new /obj/item/modular_computer/pda(src)
+ new /obj/item/modular_computer/pda/crew(src)
/obj/item/storage/box/ids
name = "box of spare IDs"
diff --git a/code/game/objects/items/storage/dufflebags.dm b/code/game/objects/items/storage/dufflebags.dm
index 257185ba6491..b838ba8ec436 100644
--- a/code/game/objects/items/storage/dufflebags.dm
+++ b/code/game/objects/items/storage/dufflebags.dm
@@ -295,7 +295,7 @@
new /obj/item/emergency_bed(src)
new /obj/item/clothing/suit/jacket/straight_jacket(src)
new /obj/item/clothing/mask/muzzle(src)
- new /obj/item/mmi/syndie(src)
+ new /obj/item/brain_processor/organic/syndie(src)
/obj/item/storage/backpack/duffelbag/syndie/ammo
name = "ammunition duffel bag"
@@ -378,7 +378,7 @@
storage_type = /datum/storage/duffel/syndicate
/obj/item/storage/backpack/duffelbag/clown/syndie/PopulateContents()
- new /obj/item/modular_computer/pda/clown(src)
+ new /obj/item/modular_computer/pda/crew/clown(src)
new /obj/item/clothing/under/rank/civilian/clown(src)
new /obj/item/clothing/shoes/clown_shoes(src)
new /obj/item/clothing/mask/gas/clown_hat(src)
diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm
index a9160f607c9f..61a459b46e9f 100644
--- a/code/game/objects/items/storage/medkit.dm
+++ b/code/game/objects/items/storage/medkit.dm
@@ -93,6 +93,22 @@
)
generate_items_inside(items_inside,src)
+/obj/item/storage/medkit/surgery/cmo/PopulateContents()
+ if(empty)
+ return
+ var/list/items_inside = list(
+ /obj/item/healthanalyzer/advanced = 1,
+ /obj/item/stack/medical/wrap/gauze/twelve = 1,
+ /obj/item/stack/medical/suture = 2,
+ /obj/item/stack/medical/mesh = 2,
+ /obj/item/reagent_containers/hypospray/medipen = 1,
+ /obj/item/surgical_drapes = 1,
+ /obj/item/scalpel = 1,
+ /obj/item/hemostat = 1,
+ /obj/item/cautery = 1,
+ )
+ generate_items_inside(items_inside,src)
+
/obj/item/storage/medkit/surgery_syndie
name = "suspicous surgical medkit"
desc = "An suspicous coloured medkit full of advanced medical equipment."
diff --git a/code/game/objects/items/storage/toolboxes/mechanical.dm b/code/game/objects/items/storage/toolboxes/mechanical.dm
index dcce7f4caa1b..3298cb78bdba 100644
--- a/code/game/objects/items/storage/toolboxes/mechanical.dm
+++ b/code/game/objects/items/storage/toolboxes/mechanical.dm
@@ -33,7 +33,6 @@
// version of below that isn't a traitor item
/obj/item/storage/toolbox/mechanical/old/cleaner
name = "old blue toolbox"
- icon_state = "oldtoolboxclean"
icon_state = "toolbox_blue_old"
/obj/item/storage/toolbox/mechanical/old/clean // the assistant traitor toolbox, damage scales with TC inside
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 0c8a7d0d7b59..79033252032f 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -391,6 +391,12 @@
/obj/item/storage/box/syndie_kit/imp_macrobomb/PopulateContents()
new /obj/item/implanter/explosive_macro(src)
+/obj/item/storage/box/syndie_kit/imp_macrobomb_fake
+ name = "fake macrobomb implant box"
+
+/obj/item/storage/box/syndie_kit/imp_macrobomb_fake/PopulateContents()
+ new /obj/item/implanter/explosive_macro/fake(src)
+
/obj/item/storage/box/syndie_kit/imp_deniability
name = "tactical deniability implant box"
@@ -412,10 +418,15 @@
/obj/item/storage/box/syndie_kit/clownpins
name = "ultra hilarious firing pin box"
+ var/pin_type = /obj/item/firing_pin/clown/ultra
/obj/item/storage/box/syndie_kit/clownpins/PopulateContents()
- for(var/i in 1 to 7)
- new /obj/item/firing_pin/clown/ultra(src)
+ for(var/i in 1 to 4)
+ new pin_type(src)
+
+/obj/item/storage/box/syndie_kit/clownpins/super
+ name = "super ultra hilarious firing pin box"
+ pin_type = /obj/item/firing_pin/clown/ultra/selfdestruct
/obj/item/storage/box/syndie_kit/imp_storage
name = "storage implant box"
@@ -603,7 +614,7 @@
new /obj/item/radio/headset/headset_cent/empty(src)
new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/storage/backpack/satchel(src)
- new /obj/item/modular_computer/pda/heads(src)
+ new /obj/item/modular_computer/pda/crew/heads(src)
new /obj/item/clipboard(src)
/obj/item/storage/box/syndie_kit/chameleon/broken/PopulateContents()
@@ -742,13 +753,11 @@
/obj/item/storage/box/syndie_kit/induction_kit
name = "syndicate induction kit"
desc = "Contains all you need for introducing your newest comrade to the Syndicate and all its worker's benefits."
+ var/implant_type = /obj/item/implanter/induction_implant
/obj/item/storage/box/syndie_kit/induction_kit/PopulateContents()
// Basic weaponry, so they have something to use.
- new /obj/item/gun/ballistic/automatic/pistol/clandestine(src) // 6 TC, but free for nukies
- new /obj/item/ammo_box/magazine/m10mm/hp(src) // 3 TC, a reward for the teamwork involved
- new /obj/item/ammo_box/magazine/m10mm/ap(src) // 3 TC, a reward for the teamwork involved
- new /obj/item/pen/edagger(src) // 2 TC
+ give_weaponry()
// The necessary equipment to help secure that disky.
new /obj/item/radio/headset/syndicate/alt(src) // 5 TC / Free for nukies
new /obj/item/modular_computer/pda/nukeops(src) // ?? TC / Free for nukies
@@ -764,22 +773,50 @@
new /obj/item/clothing/gloves/fingerless(src)
new /obj/item/book/manual/nuclear(src) // Very important
// The most important part of the kit, the implant that gives them the syndicate faction.
- new /obj/item/implanter/induction_implant(src)
+ new implant_type(src)
// Tactical map implant so they can see the minimap with the rest of the team.
new /obj/item/implanter/tacmap/nuclear(src)
// All in all, 6+3+3+2+5+2+4 = ~25 TC of 'miscellaneous' items.
// This is a lot of value for 10 TC, but you have to keep in mind that you NEED someone to get this stuff station-side.
// Pretty much all of it is a bad deal for reinforcements or yourself as they already have similar or good-enough alternatives.
+/obj/item/storage/box/syndie_kit/induction_kit/proc/give_weaponry()
+ new /obj/item/gun/ballistic/automatic/pistol/clandestine(src) // 6 TC, but free for nukies
+ new /obj/item/ammo_box/magazine/m10mm/hp(src) // 3 TC, a reward for the teamwork involved
+ new /obj/item/ammo_box/magazine/m10mm/ap(src) // 3 TC, a reward for the teamwork involved
+ new /obj/item/pen/edagger(src) // 2 TC
+
+/obj/item/storage/box/syndie_kit/induction_kit/clown
+ name = "syndicate circus induction kit"
+ desc = "A special induction kit for joining the syndicate circus."
+ implant_type = /obj/item/implanter/induction_implant/clown
+
+/obj/item/storage/box/syndie_kit/induction_kit/clown/give_weaponry()
+ // Toy gun instead of real gun
+ var/obj/item/gun/ballistic/automatic/pistol/toy/riot/clandestine/gun = new(src)
+ qdel(gun.pin)
+ var/obj/item/firing_pin/clown/ultra/new_pin = new()
+ new_pin.gun_insert(null, gun, TRUE)
+
+ // You need this for the gun
+ new /obj/item/dnainjector/clumsymut(src)
+ // And a bonus
+ new /obj/item/reagent_containers/spray/waterflower/lube/super(src)
+
/obj/item/implanter/induction_implant
name = "implanter (nuclear operative)"
desc = "A sterile automatic implant injector. You can see a tiny, somehow legible sticker on the side: 'NOT A BRAINWASH DEVICE'"
imp_type = /obj/item/implant/nuclear_operative
+/obj/item/implanter/induction_implant/clown
+ name = "implanter (syndicate circus)"
+ imp_type = /obj/item/implant/nuclear_operative/clown
+
/obj/item/implant/nuclear_operative
name = "nuclear operative implant"
desc = "Registers you as a member of a Syndicate nuclear operative team."
implant_color = "r"
+ var/antag_datum_type = /datum/antagonist/nukeop
/obj/item/implant/nuclear_operative/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE)
. = ..()
@@ -799,12 +836,12 @@
human_target.reagents.add_reagent(/datum/reagent/toxin, 2)
return FALSE
- if(!human_target.is_antag()) // GTFO. Technically not foolproof but making a heartbreaker or a paradox clone a nuke op sounds hilarious
+ if(is_valid_inductee(target)) // GTFO. Technically not foolproof but making a heartbreaker or a paradox clone a nuke op sounds hilarious
to_chat(human_target, span_notice("Huh? Nothing happened? But you're starting to feel a little ill..."))
human_target.reagents.add_reagent(/datum/reagent/toxin, 15)
return FALSE
- var/datum/antagonist/nukeop/nuke_datum = new()
+ var/datum/antagonist/nukeop/nuke_datum = new antag_datum_type()
nuke_datum.send_to_spawnpoint = FALSE
nuke_datum.give_bonus_tc = FALSE
nuke_datum.nukeop_outfit = null
@@ -825,6 +862,17 @@
to_chat(target, span_userdanger("You're no longer identified as a nuclear operative! You are free to follow any valid goals you wish, even continuing to secure the disk. Just make sure neither any turrets nor operatives kill you on sight."))
return TRUE
+/obj/item/implant/nuclear_operative/proc/is_valid_inductee(mob/living/target)
+ return target.is_antag()
+
+/obj/item/implant/nuclear_operative/clown
+ name = "syndicate circus implant"
+ desc = "Registers the wearer as a member of the syndicate circus."
+ antag_datum_type = /datum/antagonist/nukeop/clownop
+
+/obj/item/implant/nuclear_operative/clown/is_valid_inductee(mob/living/target)
+ return HAS_MIND_TRAIT(target, TRAIT_CLUMSY) || HAS_MIND_TRAIT(target, TRAIT_NAIVE) || ..()
+
/obj/item/storage/box/syndie_kit/poster_box
name = "syndicate poster pack"
desc = "Contains a variety of demotivational posters to ensure minimum productivity for the crew of any Nanotrasen station."
diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm
index 51bb6b6e0e18..a8b0d225d746 100644
--- a/code/game/objects/items/storage/wallets.dm
+++ b/code/game/objects/items/storage/wallets.dm
@@ -12,6 +12,10 @@
var/cached_flat_icon
var/overlay_icon_state = "wallet_overlay"
+/obj/item/storage/wallet/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/strip_accessible_storage)
+
/obj/item/storage/wallet/Exited(atom/movable/gone, direction)
. = ..()
if(isidcard(gone))
diff --git a/code/game/objects/items/tools/engineering/painter/paintable_decals.dm b/code/game/objects/items/tools/engineering/painter/paintable_decals.dm
index a2c330f516a1..c373edd3c9c4 100644
--- a/code/game/objects/items/tools/engineering/painter/paintable_decals.dm
+++ b/code/game/objects/items/tools/engineering/painter/paintable_decals.dm
@@ -367,6 +367,14 @@ GLOBAL_LIST_INIT(paintable_decals, init_subtypes(/datum/paintable_decal_category
name = "Trimline Corner"
icon_state = "trimline_corner"
+/datum/paintable_decal/trimline/corner_long
+ name = "Trimline Corner Long"
+ icon_state = "trimline_corner_long"
+
+/datum/paintable_decal/trimline/corner_long_alternate
+ name = "Trimline Corner Long Alt"
+ icon_state = "trimline_corner_long_alt"
+
/datum/paintable_decal/trimline/circle
name = "Trimline Circle"
icon_state = "trimline"
diff --git a/code/game/objects/items/tools/extinguisher.dm b/code/game/objects/items/tools/extinguisher.dm
index b36875d4a51e..588517323988 100644
--- a/code/game/objects/items/tools/extinguisher.dm
+++ b/code/game/objects/items/tools/extinguisher.dm
@@ -289,6 +289,11 @@
if(safety)
return NONE
+//DARKPACK EDIT ADD - Rotshreck vampires should run from fire not extinguish it. (Technically other forms of frenzy are affected by this, but they shouldn't be thinking complexly enough to extinguish fire anyways.)
+ if (HAS_TRAIT(user, TRAIT_IN_FRENZY))
+ balloon_alert(user, "you can't do this in frenzy!")
+ return .
+// DARKPACK EDIT ADD END
if (src.reagents.total_volume < 1)
balloon_alert(user, "it's empty!")
return .
diff --git a/code/game/objects/items/tools/janitorial/broom.dm b/code/game/objects/items/tools/janitorial/broom.dm
index 3717a84c6655..ab56f1cd271b 100644
--- a/code/game/objects/items/tools/janitorial/broom.dm
+++ b/code/game/objects/items/tools/janitorial/broom.dm
@@ -6,6 +6,7 @@
desc = "This is my BROOMSTICK! It can be used manually or braced with two hands to sweep items as you move. It has a telescopic handle for compact storage."
icon = 'icons/obj/service/janitor.dmi'
icon_state = "broom0"
+ inhand_icon_state = "broom0"
base_icon_state = "broom"
icon_angle = 135
lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
diff --git a/code/game/objects/items/tools/medical/bodybag.dm b/code/game/objects/items/tools/medical/bodybag.dm
index fedbbc16d7e4..41ee69aec828 100644
--- a/code/game/objects/items/tools/medical/bodybag.dm
+++ b/code/game/objects/items/tools/medical/bodybag.dm
@@ -90,8 +90,7 @@
if(user.incapacitated)
to_chat(user, span_warning("You can't get out while you're restrained like this!"))
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
to_chat(user, span_notice("You claw at the fabric of [src], trying to tear it open..."))
to_chat(loc, span_warning("Someone starts trying to break free of [src]!"))
if(!do_after(user, 12 SECONDS, src, timed_action_flags = (IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM)))
diff --git a/code/game/objects/items/tools/medical/defib.dm b/code/game/objects/items/tools/medical/defib.dm
index 052894e94b17..5ffe06879739 100644
--- a/code/game/objects/items/tools/medical/defib.dm
+++ b/code/game/objects/items/tools/medical/defib.dm
@@ -1,6 +1,7 @@
//backpack item
#define HALFWAYCRITDEATH ((HEALTH_THRESHOLD_CRIT + HEALTH_THRESHOLD_DEAD) * 0.5)
#define DEFIB_CAN_HURT(source) (source.combat || (source.req_defib && !source.defib.safety))
+#define DEFIB_RESET_TIMER 3 MINUTES
/obj/item/defibrillator
name = "defibrillator"
@@ -17,12 +18,14 @@
w_class = WEIGHT_CLASS_BULKY
actions_types = list(/datum/action/item_action/toggle_paddles)
armor_type = /datum/armor/item_defibrillator
-
+ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*4, /datum/material/glass = SHEET_MATERIAL_AMOUNT*2, /datum/material/silver =SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/gold = SHEET_MATERIAL_AMOUNT * 1.5)
var/obj/item/shockpaddles/paddle_type = /obj/item/shockpaddles
/// If the paddles are equipped (1) or on the defib (0)
var/on = FALSE
- /// If you can zap people with the defibs on harm mode
+ /// If TRUE, will allow you to zap people while in combat mode.
var/safety = TRUE
+ /// If TRUE, will not attempt to retoggle safeties if emp'd again.
+ var/recently_emped = FALSE
/// If there's a cell in the defib with enough power for a revive, blocks paddles from reviving otherwise
var/powered = FALSE
/// If the cell can be removed via screwdriver
@@ -164,11 +167,8 @@
return ITEM_INTERACT_SUCCESS
/obj/item/defibrillator/emag_act(mob/user, obj/item/card/emag/emag_card)
-
- safety = !safety
-
- var/enabled_or_disabled = (safety ? "enabled" : "disabled")
- balloon_alert(user, "safety protocols [enabled_or_disabled]")
+ obj_flags |= EMAGGED
+ toggle_safety(user)
return TRUE
@@ -178,8 +178,33 @@
deductcharge(STANDARD_CELL_CHARGE / severity)
if (. & EMP_PROTECT_SELF)
return
-
update_power()
+ if((obj_flags & EMAGGED) || recently_emped)
+ return
+ toggle_safety()
+ recently_emped = TRUE
+
+/obj/item/defibrillator/proc/toggle_safety(mob/living/user, force_safety = FALSE)
+ if(force_safety && !(obj_flags & EMAGGED))
+ safety = TRUE
+ else
+ safety = FALSE
+
+ var/enabled_or_disabled = (safety ? "enabled" : "disabled")
+ if(user)
+ balloon_alert(user, "safety protocols [enabled_or_disabled]")
+
+ if(obj_flags & EMAGGED)
+ return
+
+ addtimer(CALLBACK(src, PROC_REF(force_safety_on)), DEFIB_RESET_TIMER)
+
+/obj/item/defibrillator/proc/force_safety_on()
+ recently_emped = FALSE
+ if(obj_flags & EMAGGED)
+ return
+
+ toggle_safety(null, TRUE)
/obj/item/defibrillator/proc/toggle_paddles(mob/living/user)
on = !on
@@ -258,6 +283,7 @@
slot_flags = ITEM_SLOT_BELT|ITEM_SLOT_SUITSTORE|ITEM_SLOT_DEX_STORAGE
worn_icon = 'icons/mob/clothing/belt.dmi'
worn_icon_state = "defibcompact"
+ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*6, /datum/material/glass = SHEET_MATERIAL_AMOUNT*4, /datum/material/silver = SHEET_MATERIAL_AMOUNT*3, /datum/material/gold =SHEET_MATERIAL_AMOUNT * 1.5)
w_class = WEIGHT_CLASS_NORMAL
paddle_state = "defibcompact-paddles"
powered_state = "defibcompact-powered"
@@ -270,9 +296,12 @@
cell = new(src)
update_power()
-/obj/item/defibrillator/compact/loaded/cmo // subtype for the spy steal objective
- name = "chief medical officer's compact defibrillator"
+/obj/item/defibrillator/compact/loaded/cmo // special version for the CMO, is a theft objective.
+ name = "experimental compact defibrillator"
+ desc = "A belt-equipped defibrillator that can be rapidly deployed. This one is customized with various experimental \
+ components to significantly increase recharge rate. Nifty."
icon_state = "defibcmo"
+ cooldown_duration = 2.5 SECONDS
resistance_flags = INDESTRUCTIBLE // So no cheesy getting rid of like other steal/head items
/obj/item/defibrillator/compact/combat
@@ -718,3 +747,4 @@
#undef HALFWAYCRITDEATH
#undef DEFIB_CAN_HURT
+#undef DEFIB_RESET_TIMER
diff --git a/code/game/objects/items/tourniquet.dm b/code/game/objects/items/tourniquet.dm
index 8e2540f5cdf6..791f16d13146 100644
--- a/code/game/objects/items/tourniquet.dm
+++ b/code/game/objects/items/tourniquet.dm
@@ -68,9 +68,9 @@
return // you win this time
limb.owner.losebreath += 1 * seconds_per_tick // incapable of breathing
- limb.owner.apply_damage(1 * seconds_per_tick, OXY, BODY_ZONE_HEAD, forced = TRUE) // no blood getting to brain
+ limb.owner.apply_damage(1 * seconds_per_tick, OXY, BODY_ZONE_HEAD) // no blood getting to brain
if(SPT_PROB(6, seconds_per_tick))
- limb.owner.apply_damage(10, STAMINA, BODY_ZONE_HEAD, forced = TRUE)
+ limb.owner.apply_damage(10, STAMINA, BODY_ZONE_HEAD)
if(SPT_PROB(5, seconds_per_tick))
limb.owner.adjust_eye_blur(4 SECONDS)
if(SPT_PROB(4, seconds_per_tick))
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 1c55103cd612..e075c344f066 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -954,6 +954,7 @@
desc = "A tool to help you write fictional devils!"
icon = 'icons/obj/service/library.dmi'
icon_state = "demonomicon"
+ inhand_icon_state = "demonomicon"
lefthand_file = 'icons/mob/inhands/items/books_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/books_righthand.dmi'
messages = list("You must challenge the devil to a dance-off!", "The devils true name is Ian", "The devil hates salt!", "Would you like infinite power?", "Would you like infinite wisdom?", "Would you like infinite healing?")
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index 8dc3181464c2..50e272607d4f 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -30,6 +30,7 @@
/obj/item/trash/candy
name = "candy"
icon_state= "candy"
+ inhand_icon_state = "candy"
/obj/item/trash/cheesie
name = "cheesie honkers"
@@ -38,6 +39,7 @@
/obj/item/trash/chips
name = "chips"
icon_state = "chips"
+ inhand_icon_state = "chips"
/obj/item/trash/shrimp_chips
name = "shrimp chips"
@@ -134,12 +136,25 @@
resistance_flags = NONE
custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*2)
+/obj/item/trash/can/Initialize(mapload)
+ . = ..()
+ if(mapload)
+ return
+ pixel_x = rand(-4,4)
+ pixel_y = rand(-4,4)
+
/obj/item/trash/can/grind_results()
return list(/datum/reagent/aluminium = 10)
/obj/item/trash/can/food
icon = 'icons/obj/food/canned.dmi'
icon_state = "peachcan_empty"
+ hitsound = 'sound/items/can/can_hit.ogg'
+ item_flags = parent_type::item_flags & ~NOBLUDGEON
+
+/obj/item/trash/can/food/Initialize(mapload)
+ . = ..()
+ ADD_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND, INNATE_TRAIT)
/obj/item/trash/can/food/peaches
name = "canned peaches"
@@ -153,11 +168,6 @@
name = "tin of beans"
icon_state = "beans_empty"
-/obj/item/trash/can/Initialize(mapload)
- . = ..()
- pixel_x = rand(-4,4)
- pixel_y = rand(-4,4)
-
/obj/item/trash/peanuts
name = "\improper Gallery peanuts packet"
desc = "This thread is trash!"
diff --git a/code/game/objects/items/weaponry/melee/chainsaw.dm b/code/game/objects/items/weaponry/melee/chainsaw.dm
index a7ee30cd795c..b59adbf6f543 100644
--- a/code/game/objects/items/weaponry/melee/chainsaw.dm
+++ b/code/game/objects/items/weaponry/melee/chainsaw.dm
@@ -5,6 +5,7 @@
desc = "A versatile power tool. Useful for limbing trees and delimbing humans."
icon = 'icons/obj/weapons/chainsaw.dmi'
icon_state = "chainsaw"
+ inhand_icon_state = "chainsaw"
base_icon_state = "chainsaw"
icon_angle = 180
lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
@@ -165,6 +166,7 @@
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"
+ inhand_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'
diff --git a/code/game/objects/items/weaponry/melee/energy.dm b/code/game/objects/items/weaponry/melee/energy.dm
index 8733e410ed1b..cbd1f05ff631 100644
--- a/code/game/objects/items/weaponry/melee/energy.dm
+++ b/code/game/objects/items/weaponry/melee/energy.dm
@@ -344,6 +344,7 @@
name = "energy blade"
desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal."
icon_state = "blade"
+ inhand_icon_state = "blade"
base_icon_state = "blade"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
diff --git a/code/game/objects/items/weaponry/melee/fireaxe.dm b/code/game/objects/items/weaponry/melee/fireaxe.dm
index 23cd24c375c5..bd3922f6344a 100644
--- a/code/game/objects/items/weaponry/melee/fireaxe.dm
+++ b/code/game/objects/items/weaponry/melee/fireaxe.dm
@@ -8,6 +8,7 @@ GLOBAL_DATUM(bridge_axe, /obj/item/fireaxe)
desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
icon = 'icons/obj/weapons/fireaxe.dmi'
icon_state = "fireaxe0"
+ inhand_icon_state = "fireaxe0"
base_icon_state = "fireaxe"
lefthand_file = 'icons/mob/inhands/weapons/axes_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/axes_righthand.dmi'
@@ -81,6 +82,7 @@ GLOBAL_DATUM(bridge_axe, /obj/item/fireaxe)
name = "bone axe"
desc = "A large, vicious axe crafted out of several sharpened bone plates and crudely tied together. Made of monsters, by killing monsters, for killing monsters."
icon_state = "bone_axe0"
+ inhand_icon_state = "bone_axe0"
base_icon_state = "bone_axe"
icon_angle = 180
force_unwielded = 5
@@ -94,6 +96,7 @@ GLOBAL_DATUM(bridge_axe, /obj/item/fireaxe)
name = "metallic hydrogen axe"
desc = "A lightweight crowbar with an extreme sharp fire axe head attached. It trades its heft as a weapon by making it easier to carry around when holstered to suits without having to sacrifice your backpack."
icon_state = "metalh2_axe0"
+ inhand_icon_state = "metalh2_axe0"
base_icon_state = "metalh2_axe"
icon_angle = -45
force_unwielded = 5
@@ -108,6 +111,7 @@ GLOBAL_DATUM(bridge_axe, /obj/item/fireaxe)
name = "boarding axe"
desc = "A hulking cleaver that feels like a burden just looking at it. Seems excellent at halving obstacles like windows, airlocks, barricades and people."
icon_state = "boarding_axe0"
+ inhand_icon_state = "boarding_axe0"
base_icon_state = "boarding_axe"
force_unwielded = 5
force_wielded = 30
diff --git a/code/game/objects/items/weaponry/melee/high_frequency_blade.dm b/code/game/objects/items/weaponry/melee/high_frequency_blade.dm
index 618c5d24cf97..5e8648940c1f 100644
--- a/code/game/objects/items/weaponry/melee/high_frequency_blade.dm
+++ b/code/game/objects/items/weaponry/melee/high_frequency_blade.dm
@@ -4,6 +4,7 @@
This oscillation weakens the molecular bonds of anything it cuts, thereby increasing its cutting ability."
icon = 'icons/obj/weapons/sword.dmi'
icon_state = "hfrequency0"
+ inhand_icon_state = "hfrequency0"
worn_icon_state = "hfrequency0"
icon_angle = -45
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
diff --git a/code/game/objects/items/weaponry/melee/knives.dm b/code/game/objects/items/weaponry/melee/knives.dm
index 69daa64e80cc..f4d45f16724f 100644
--- a/code/game/objects/items/weaponry/melee/knives.dm
+++ b/code/game/objects/items/weaponry/melee/knives.dm
@@ -423,7 +423,6 @@
icon_angle = -90
lefthand_file = 'icons/mob/inhands/equipment/boxcutter_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/boxcutter_righthand.dmi'
- inhand_icon_state = null
attack_verb_continuous = list("prods", "pokes")
attack_verb_simple = list("prod", "poke")
w_class = WEIGHT_CLASS_SMALL
diff --git a/code/game/objects/items/weaponry/melee/spear.dm b/code/game/objects/items/weaponry/melee/spear.dm
index 4f50e4c7ad77..83df0ba3e5c4 100644
--- a/code/game/objects/items/weaponry/melee/spear.dm
+++ b/code/game/objects/items/weaponry/melee/spear.dm
@@ -5,6 +5,7 @@
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
icon = 'icons/obj/weapons/spear.dmi'
icon_state = "spearglass0"
+ inhand_icon_state = "spearglass0"
lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
icon_angle = -45
@@ -34,10 +35,6 @@
var/force_unwielded = 10
/// How much damage to do wielded
var/force_wielded = 18
- /// Whether or not hitting with this spear causes damage to the spear itself
- var/improvised_construction = TRUE
- /// What is left over when a spear breaks
- var/spear_leftovers = /obj/item/stack/rods
/// What pike do we construct if someone kills themselves with us?
var/pike_type = /obj/structure/headpike
@@ -111,7 +108,6 @@
/obj/item/spear/on_craft_completion(list/components, datum/crafting_recipe/current_recipe, atom/crafter)
var/obj/item/stack/rods/rod = locate() in components
if (rod)
- spear_leftovers = rod.type
set_material_slot(/datum/material_slot/handle/spear, rod.get_master_material())
var/obj/item/shard/tip = locate() in components
@@ -176,24 +172,6 @@
return ..()
return custom_materials[tip_material] ? tip_material : ..()
-/obj/item/spear/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
- if(improvised_construction && !QDELETED(src))
- take_damage(force / 2, sound_effect = FALSE)
-
-/obj/item/spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
- . = ..()
- if (.) //spear was caught
- return
- if(improvised_construction && !QDELETED(src))
- take_damage(throwforce / 2, sound_effect = FALSE)
-
-/obj/item/spear/atom_destruction(damage_flag)
- playsound(src, 'sound/effects/grillehit.ogg', 50)
- new spear_leftovers(get_turf(src))
- if(isliving(loc))
- loc.balloon_alert(loc, "spear broken!")
- return ..()
-
/obj/item/spear/get_material_prefixes(list/materials)
var/datum/material/material = get_material_from_slot(/datum/material_slot/weapon_head/speartip)
return material?.name
@@ -314,6 +292,7 @@
/obj/item/spear/explosive
name = "explosive lance"
icon_state = "spearbomb0"
+ inhand_icon_state = "spearbomb0"
base_icon_state = "spearbomb"
icon_prefix = "spearbomb"
var/obj/item/grenade/explosive = null
@@ -388,7 +367,6 @@
attack_verb_simple = list("gore")
force_unwielded = 15
force_wielded = 25
- improvised_construction = FALSE
/obj/item/spear/grey_tide/afterattack(atom/movable/target, mob/living/user, list/modifiers, list/attack_modifiers)
user.add_ally("greytide([REF(user)])")
@@ -404,6 +382,7 @@
//MILITARY
/obj/item/spear/military
icon_state = "military_spear0"
+ inhand_icon_state = "military_spear0"
base_icon_state = "military_spear0"
icon_prefix = "military_spear"
name = "military javelin"
@@ -417,7 +396,6 @@
throw_range = 9
throw_speed = 5
sharpness = NONE // we break bones instead of cutting flesh
- improvised_construction = FALSE
pike_type = /obj/structure/headpike/military
/obj/item/spear/military/add_headpike_component()
@@ -437,6 +415,7 @@
desc = "An oversized multi-bladed spear designed to kill large hostile xenoforms such as space dragons or the creatures of Indecipheres. Capable of being launched from a ballista."
icon = 'icons/obj/weapons/48x.dmi'
icon_state = "speardragon0"
+ inhand_icon_state = "speardragon0"
icon_prefix = "speardragon"
base_icon_state = "speardragon"
lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
@@ -453,7 +432,6 @@
force_unwielded = 13
force_wielded = 21
armour_penetration = 15
- improvised_construction = FALSE
custom_materials = list(
/datum/material/iron = SHEET_MATERIAL_AMOUNT * 42,
/datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 15,
@@ -473,6 +451,7 @@
desc = "A half-finished giantslayer spear, needs to be thrown in lava to forge the metals to a killing edge."
icon = 'icons/obj/weapons/48x.dmi'
icon_state = "speardragonraw0"
+ inhand_icon_state = "speardragonraw0"
icon_prefix = "speardragonraw"
base_icon_state = "speardragonraw"
material_flags = MATERIAL_EFFECTS
@@ -503,6 +482,7 @@
name = "bone spear"
desc = "A haphazardly-constructed yet still deadly weapon. The pinnacle of modern technology."
icon_state = "bone_spear0"
+ inhand_icon_state = "bone_spear0"
base_icon_state = "bone_spear0"
icon_prefix = "bone_spear"
throwforce = 22
@@ -511,7 +491,6 @@
material_slots = list(/datum/material_slot/weapon_head/speartip = /datum/material/bone, /datum/material_slot/handle/spear = /datum/material/bone)
force_unwielded = 12
force_wielded = 20
- spear_leftovers = /obj/item/stack/sheet/bone
pike_type = /obj/structure/headpike/bone
/obj/item/spear/bonespear/add_headpike_component()
@@ -527,6 +506,7 @@
*/
/obj/item/spear/bamboospear //Blatant imitation of spear, but all natural.
icon_state = "bamboo_spear0"
+ inhand_icon_state = "bamboo_spear0"
base_icon_state = "bamboo_spear0"
icon_prefix = "bamboo_spear"
name = "bamboo spear"
@@ -535,7 +515,6 @@
throwforce = 23 //Better to throw
custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 25)
material_slots = list(/datum/material_slot/weapon_head/speartip = /datum/material/bamboo, /datum/material_slot/handle/spear = /datum/material/bamboo)
- spear_leftovers = /obj/item/stack/sheet/mineral/bamboo
pike_type = /obj/structure/headpike/bamboo
/obj/item/spear/bamboospear/add_headpike_component()
@@ -556,6 +535,7 @@
name = "\improper Sky Bulge"
desc = "A legendary stick with a very pointy tip. Takes you to the skies!"
icon_state = "dragoonpole0"
+ inhand_icon_state = "dragoonpole0"
icon_prefix = "dragoonpole"
attack_verb_continuous = list("attacks", "pokes", "jabs", "tears", "gores", "lances")
attack_verb_simple = list("attack", "poke", "jab", "tear", "gore", "lance")
@@ -569,7 +549,6 @@
material_slots = list(/datum/material_slot/weapon_head/speartip = /datum/material/diamond, /datum/material_slot/handle/spear = /datum/material/alloy/plastitaniumglass)
action_slots = ITEM_SLOT_HANDS
actions_types = list(/datum/action/item_action/skybulge)
- improvised_construction = FALSE
///The action button the spear gives, usable once a minute.
/datum/action/item_action/skybulge
diff --git a/code/game/objects/items/wind_turbine.dm b/code/game/objects/items/wind_turbine.dm
index cdbba2cbba08..d67c066c7929 100644
--- a/code/game/objects/items/wind_turbine.dm
+++ b/code/game/objects/items/wind_turbine.dm
@@ -105,10 +105,14 @@
if(slot & slot_flags)
RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_move))
RegisterSignal(user, COMSIG_ATOM_POST_DIR_CHANGE, PROC_REF(on_dir_change))
+ RegisterSignal(user, COMSIG_LIVING_SUICIDE_ACT, PROC_REF(on_suicide_act))
else
setDir(SOUTH)
- UnregisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_move))
- UnregisterSignal(user, COMSIG_ATOM_POST_DIR_CHANGE, PROC_REF(on_dir_change))
+ UnregisterSignal(user, list(
+ COMSIG_MOVABLE_MOVED,
+ COMSIG_ATOM_POST_DIR_CHANGE,
+ COMSIG_LIVING_SUICIDE_ACT
+ ))
///Called when the thing HOLDING the turbine changes direction
/obj/item/portable_wind_turbine/proc/on_dir_change(datum/source, old_dir, new_dir)
@@ -116,6 +120,30 @@
update_appearance()
+/obj/item/portable_wind_turbine/proc/on_suicide_act(mob/living/source)
+ SIGNAL_HANDLER
+ if(source.get_active_held_item())
+ return NONE
+
+ return suicide_act(source)
+
+/obj/item/portable_wind_turbine/suicide_act(mob/living/user)
+ var/obj/item/bodypart/head = user.get_bodypart(BODY_ZONE_HEAD)
+ if(isnull(head))
+ return NONE
+
+ playsound(user,'sound/items/weapons/bladeslice.ogg', 50)
+ user.visible_message(span_suicide("[user] moves [user.p_their()] head in the way of [src]'s blades! \
+ It looks like [user.p_theyre()] trying to commit suicide!"))
+ user.set_suicide(TRUE)
+ user.apply_damage(75, BRUTE, BODY_ZONE_HEAD, wound_bonus = 100, forced = TRUE, sharpness = SHARP_EDGED, attacking_item = src)
+ if(head.dismember())
+ user.death() // anti-ling check
+ return MANUAL_SUICIDE
+
+ user.visible_message(span_suicide("...but fails to separate [user.p_their()] head from [user.p_their()] body! Ouch!"))
+ return SHAME
+
///Updates the worn back icon for the current loc
/obj/item/portable_wind_turbine/proc/update_back()
if (ishuman(loc))
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 115c04188efe..079159ddb14d 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -192,7 +192,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets)
take_contents()
if(sealed)
- var/datum/gas_mixture/external_air = loc.return_air()
+ var/datum/gas_mixture/external_air = loc?.return_air()
if(external_air && is_maploaded)
internal_air = external_air.copy()
else
@@ -1088,8 +1088,7 @@ GAME_VERB_SRC(/obj/structure/closet, verb_toggleopen, view(1), "Toggle Open", nu
if(opened)
return
if(ismovable(loc))
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
var/atom/movable/movable_parent = loc
movable_parent.relay_container_resist_act(user, src)
return
@@ -1100,8 +1099,7 @@ GAME_VERB_SRC(/obj/structure/closet, verb_toggleopen, view(1), "Toggle Open", nu
if(DOING_INTERACTION_WITH_TARGET(user, src))
return
//okay, so the closet is either welded or locked... resist!!!
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
user.visible_message(span_warning("[src] begins to shake violently!"), \
span_notice("You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)"), \
span_hear("You hear banging from [src]."))
diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm
index 4c7d83059311..2ddf5f9bb16f 100644
--- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm
+++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm
@@ -354,8 +354,7 @@
if(opened || ismovable(loc) || !cinched)
return ..()
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
user.visible_message(span_warning("Someone in [src] begins to wriggle!"), \
span_notice("You start wriggling, attempting to loosen [src]'s buckles... (this will take about [DisplayTimeText(breakout_time)].)"), \
span_hear("You hear straining cloth from [src]."))
@@ -622,8 +621,7 @@
open(user)
return
- user.changeNext_move(6 SECONDS)
- user.last_special = world.time + 6 SECONDS
+ user.change_next_special_move(6 SECONDS)
user.visible_message(
span_warning("Something in [src] begins to wriggle!"),
span_notice("You start wriggling, attempting to climb out of [src]... (This will take about [DisplayTimeText(breakout_time)].)"),
diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm
index bb2d171ffeeb..c12aa8209237 100644
--- a/code/game/objects/structures/crates_lockers/crates/secure.dm
+++ b/code/game/objects/structures/crates_lockers/crates/secure.dm
@@ -5,19 +5,19 @@
base_icon_state = "securecrate"
secure = TRUE
locked = TRUE
- max_integrity = 500
+ max_integrity = 300
armor_type = /datum/armor/crate_secure
- damage_deflection = 25
+ damage_deflection = 10
var/tamperproof = 0
/datum/armor/crate_secure
- melee = 30
- bullet = 50
- laser = 50
- energy = 100
- fire = 80
- acid = 80
+ melee = 15
+ bullet = 25
+ laser = 25
+ energy = 50
+ fire = 40
+ acid = 40
/obj/structure/closet/crate/secure/Initialize(mapload)
. = ..()
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 969ed770f08b..6ebf73774fbe 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -312,31 +312,6 @@
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."
@@ -370,7 +345,6 @@
mineral = /obj/item/stack/rods
mineral_amount = 5
walltype = /turf/closed/wall/mineral/iron
- base_icon_state = "iron_wall"
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = SMOOTH_GROUP_IRON_WALLS + SMOOTH_GROUP_WALLS
canSmoothWith = SMOOTH_GROUP_IRON_WALLS
@@ -452,78 +426,6 @@
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/holosign.dm b/code/game/objects/structures/holosign.dm
index 4daaa428db4d..90b01edcdcb5 100644
--- a/code/game/objects/structures/holosign.dm
+++ b/code/game/objects/structures/holosign.dm
@@ -48,6 +48,13 @@
if(!. && isprojectile(mover)) // Its short enough to be shot over
return TRUE
+/obj/structure/holosign/emp_act(severity)
+ . = ..()
+ if(. & EMP_PROTECT_SELF)
+ return
+
+ take_damage(150/severity, BRUTE, ENERGY, FALSE)
+
/obj/structure/holosign/proc/attack_holosign(mob/living/user, list/modifiers)
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
user.changeNext_move(CLICK_CD_MELEE)
diff --git a/code/game/objects/structures/lavaland/vent_mining/boss_vent.dm b/code/game/objects/structures/lavaland/vent_mining/boss_vent.dm
index 149d5c3ed0f9..e26948a0c5e8 100644
--- a/code/game/objects/structures/lavaland/vent_mining/boss_vent.dm
+++ b/code/game/objects/structures/lavaland/vent_mining/boss_vent.dm
@@ -5,17 +5,18 @@
unique_vent = TRUE
spawn_drone_on_tap = FALSE
boulder_size = BOULDER_SIZE_LARGE
+ // pick_weight() requires integer weights. rare minerals have one tenth the common weight.
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,
+ /datum/material/iron = 10,
+ /datum/material/glass = 10,
+ /datum/material/plasma = 10,
+ /datum/material/titanium = 10,
+ /datum/material/silver = 10,
+ /datum/material/gold = 10,
+ /datum/material/diamond = 1,
+ /datum/material/uranium = 10,
+ /datum/material/bluespace = 1,
+ /datum/material/plastic = 10,
)
defending_mobs = list(
/mob/living/simple_animal/hostile/megafauna/bubblegum,
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 82b969414935..fe9616e544d8 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -113,8 +113,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
if(!locked)
open()
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
user.visible_message(null, \
span_notice("You lean on the back of [src] and start pushing the tray open... (this will take about [DisplayTimeText(BREAKDOWN_TIME)].)"), \
span_hear("You hear a metallic creaking from [src]."))
diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
index d9653d94bd89..ba9f560177ae 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
@@ -73,8 +73,7 @@
empty_pod()
return
if(!moving)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
to_chat(user, span_notice("You start trying to escape from the pod..."))
if(do_after(user, 1 MINUTES, target = src))
to_chat(user, span_notice("You manage to open the pod."))
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index a337021246d5..b0b947d2efd9 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -97,7 +97,7 @@
. += span_notice("The window is unscrewed but pried into the frame.")
if(WINDOW_OUT_OF_FRAME)
if (anchored)
- . += span_notice("The window is screwed to the floor.")
+ . += span_notice("The window is screwed to the floor. It can be pried into a more secure position.")
else
. += span_notice("The window is unscrewed from the floor, and could be deconstructed by wrenching.")
@@ -942,6 +942,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/titanium/spawner, 0
/obj/structure/window/reinforced/survival_pod/unanchored
anchored = FALSE
+ state = WINDOW_OUT_OF_FRAME
MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/survival_pod/spawner, 0)
diff --git a/code/game/say.dm b/code/game/say.dm
index a59a884ca6d3..efd5c09f7ed2 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -207,15 +207,19 @@ GLOBAL_LIST_INIT(freqtospan, list(
var/dialect_icon_type = dialect?.display_icon_type(src, message_mods) || DISPLAY_LANGUAGE_ICON_NONE
if(dialect_icon_type != DISPLAY_LANGUAGE_ICON_NONE)
var/datum/asset/spritesheet_batched/sheet = get_asset_datum(/datum/asset/spritesheet_batched/chat)
- languageicon = sheet.icon_tag("language-[dialect.icon_state][dialect_icon_type == DISPLAY_LANGUAGE_ICON_PARTIAL ? "-partial" : ""]") + " "
+ var/icon_tag = sheet.icon_tag("language-[dialect.icon_state][dialect_icon_type == DISPLAY_LANGUAGE_ICON_PARTIAL ? "-partial" : ""]")
+ languageicon = span_tooltip_subtle(dialect.name, icon_tag) + " "
// The actual message part.
var/messagepart = speaker.generate_messagepart(raw_message, spans, message_mods)
messagepart = " [messagepart]"
+ var/speaker_voice_description = message_mods[MODE_SPEAKER_GENDER_OVERRIDE] || speaker.get_voice_description()
+
var/obj/item/radio/radio = source // DARKPACK EDIT ADD
var/radio_id = radio?.radio_id ? "\[[radio?.radio_id]\] " : null // DARKPACK EDIT ADD
- return "[spanpart1][spanpart2][freqpart][radio_id][languageicon][compose_track_href(speaker, namepart)][namepart][compose_job(speaker, message_language, raw_message, radio_freq)][endspanpart][messagepart]" // DARKPACK EDIT CHANGE - ORIGINAL: return "[spanpart1][spanpart2][freqpart][languageicon][compose_track_href(speaker, namepart)][namepart][compose_job(speaker, message_language, raw_message, radio_freq)][endspanpart][messagepart]"
+
+ return "[spanpart1][spanpart2][freqpart][radio_id][languageicon][compose_track_href(speaker, namepart)][span_tooltip_subtle(speaker_voice_description, namepart)][compose_job(speaker, message_language, raw_message, radio_freq)][endspanpart][messagepart]" // DARKPACK EDIT CHANGE - ORIGINAL: return "[spanpart1][spanpart2][freqpart][languageicon][compose_track_href(speaker, namepart)][span_tooltip_subtle(speaker_voice_description, namepart)][compose_job(speaker, message_language, raw_message, radio_freq)][endspanpart][messagepart]"
/atom/movable/proc/compose_track_href(atom/movable/speaker, message_langs, raw_message, radio_freq)
return ""
@@ -286,6 +290,17 @@ GLOBAL_LIST_INIT(freqtospan, list(
return "[processed_say_mod], \"[processed_input]\""
+/atom/movable/proc/get_voice_description()
+ switch(gender)
+ if(MALE)
+ return VOICE_DESCRIPTION_MASCULINE
+ if(FEMALE)
+ return VOICE_DESCRIPTION_FEMININE
+ if(PLURAL)
+ return VOICE_DESCRIPTION_PLURAL
+ else
+ return VOICE_DESCRIPTION_NEUTER
+
/// Transforms the message emphasis mods from [/atom/proc/apply_message_emphasis] into the appropriate HTML tags. Includes escaping.
#define ENCODE_HTML_EMPHASIS(input, char, html, varname) \
var/static/regex/##varname = regex("(?= 100)
- log_game("SPACE Z-TRANSIT ERROR: Could not find a safe place to land [arrived] within 100 iterations.")
+ log_game("SPACE Z-TRANSIT ERROR: Could not find a safe place to land [occupant] within 100 iterations.")
break
if (tx < 128)
tx++
@@ -255,9 +265,9 @@
ty--
DT = locate(tx, ty, destination_z)
- arrived.zMove(null, DT, ZMOVE_ALLOW_BUCKLED)
+ occupant.zMove(null, DT, ZMOVE_ALLOW_BUCKLED)
- var/atom/movable/current_pull = arrived.pulling
+ var/atom/movable/current_pull = occupant.pulling
while (current_pull)
var/turf/target_turf = get_step(current_pull.pulledby.loc, REVERSE_DIR(current_pull.pulledby.dir)) || current_pull.pulledby.loc
current_pull.zMove(null, target_turf, ZMOVE_ALLOW_BUCKLED)
@@ -355,6 +365,11 @@
if(ismob(arrived))
playsound(src, sound, 50, TRUE)
+/turf/open/indestructible/honk/initialize_occupant(atom/movable/occupant)
+ . = ..()
+ if(ismob(occupant))
+ playsound(src, sound, 50, TRUE)
+
/turf/open/indestructible/necropolis
name = "necropolis floor"
desc = "It's regarding you suspiciously."
@@ -523,10 +538,11 @@
return TRUE
/turf/open/handle_slip(mob/living/slipper, knockdown_amount, obj/slippable, lube, paralyze_amount, daze_amount, force_drop)
- if(slipper.movement_type & MOVETYPES_NOT_TOUCHING_GROUND)
- return FALSE
- if(!has_gravity(src))
- return FALSE
+ if(!(lube & SLIP_IN_NOGRAV))
+ if(slipper.movement_type & MOVETYPES_NOT_TOUCHING_GROUND)
+ return FALSE
+ if(!has_gravity(src))
+ return FALSE
var/slide_distance = 4
if(lube & SLIDE_ICE)
diff --git a/code/game/turfs/open/cliff.dm b/code/game/turfs/open/cliff.dm
index fa3eed90c442..c712628f45b2 100644
--- a/code/game/turfs/open/cliff.dm
+++ b/code/game/turfs/open/cliff.dm
@@ -52,6 +52,10 @@
try_fall(arrived)
+/turf/open/cliff/initialize_occupant(atom/movable/occupant)
+ . = ..()
+ try_fall(occupant)
+
/turf/open/cliff/zImpact(atom/movable/falling, levels, turf/prev_turf, flags)
. = ..(flags = flags | FALL_INTERCEPTED)
diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm
index 05d2fb99abc0..2643ac98a120 100644
--- a/code/game/turfs/open/floor/fancy_floor.dm
+++ b/code/game/turfs/open/floor/fancy_floor.dm
@@ -71,16 +71,6 @@
/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
@@ -91,15 +81,6 @@
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")
@@ -107,14 +88,6 @@
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")
@@ -122,14 +95,6 @@
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")
@@ -311,58 +276,6 @@
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."
diff --git a/code/game/turfs/open/floor/glass.dm b/code/game/turfs/open/floor/glass.dm
index a954cf0e3587..88feb7454e10 100644
--- a/code/game/turfs/open/floor/glass.dm
+++ b/code/game/turfs/open/floor/glass.dm
@@ -226,4 +226,3 @@
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 4696d377ffeb..38c739689b5c 100644
--- a/code/game/turfs/open/floor/iron_floor.dm
+++ b/code/game/turfs/open/floor/iron_floor.dm
@@ -306,7 +306,6 @@
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
diff --git a/code/game/turfs/open/floor/mineral_floor.dm b/code/game/turfs/open/floor/mineral_floor.dm
index 869947085e16..96b8714264b0 100644
--- a/code/game/turfs/open/floor/mineral_floor.dm
+++ b/code/game/turfs/open/floor/mineral_floor.dm
@@ -105,43 +105,6 @@
/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
@@ -286,6 +249,7 @@
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
@@ -303,6 +267,13 @@
if(isliving(arrived))
squeak()
+/turf/open/floor/mineral/bananium/initialize_occupant(atom/movable/occupant)
+ . = ..()
+ if(.)
+ return
+ if(isliving(occupant))
+ squeak()
+
/turf/open/floor/mineral/bananium/attackby(obj/item/W, mob/user, list/modifiers)
.=..()
if(!.)
@@ -377,6 +348,13 @@
if(isliving(arrived))
radiate()
+/turf/open/floor/mineral/uranium/initialize_occupant(atom/movable/occupant)
+ . = ..()
+ if(.)
+ return
+ if(isliving(occupant))
+ radiate()
+
/turf/open/floor/mineral/uranium/attackby(obj/item/W, mob/user, list/modifiers)
.=..()
if(!.)
@@ -410,7 +388,6 @@
return
//BLUESPACE
-
/turf/open/floor/mineral/bluespace
name = "bluespace floor"
icon_state = "bluespacecrystal"
@@ -426,13 +403,7 @@
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"
@@ -448,15 +419,10 @@
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"
+ icon_state = "adamantine"
floor_tile = /obj/item/stack/tile/mineral/adamantine
custom_materials = list(/datum/material/adamantine = SMALL_MATERIAL_AMOUNT*5)
rust_resistance = RUST_RESISTANCE_TITANIUM
@@ -464,10 +430,10 @@
/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
+/turf/open/floor/mineral/adamantine/tiled
+ name = "tiled adamantine floor"
+ icon_state = "adamantine_tiled"
+ floor_tile = /obj/item/stack/tile/mineral/adamantine/tiled
//METAL HYDROGEN
/turf/open/floor/mineral/metal_hydrogen
@@ -496,6 +462,11 @@
/turf/open/floor/mineral/runite/broken_states()
return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+/turf/open/floor/mineral/runite/tiled
+ name = "tiled runite floor"
+ icon_state = "runite_tiled"
+ floor_tile = /obj/item/stack/tile/mineral/runite/tiled
+
//MYTHRIL
/turf/open/floor/mineral/mythril
name = "mythril floor"
@@ -507,6 +478,10 @@
/turf/open/floor/mineral/mythril/broken_states()
return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
+/turf/open/floor/mineral/mythril/tiled
+ name = "tiled mythril floor"
+ icon_state = "mythril_tiled"
+ floor_tile = /obj/item/stack/tile/mineral/mythril/tiled
// ALIEN ALLOY
/turf/open/floor/mineral/abductor
diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm
index 025437a14c1f..60a957333c9e 100644
--- a/code/game/turfs/open/floor/misc_floor.dm
+++ b/code/game/turfs/open/floor/misc_floor.dm
@@ -136,37 +136,6 @@
/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"
@@ -261,70 +230,6 @@
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"
@@ -332,60 +237,10 @@
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/hauntium/tiled
+ name = "tiled hauntium floor"
+ icon_state = "hauntium_tiled"
+ floor_tile = /obj/item/stack/tile/hauntium/tiled
/turf/open/floor/sandstone
name = "sandstone brick floor"
@@ -394,46 +249,6 @@
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."
@@ -483,6 +298,21 @@
// 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"
+ custom_materials = list(/datum/material/rock=SMALL_MATERIAL_AMOUNT*5)
+ floor_tile = /obj/item/stack/tile/mineral/stone
+
+/turf/open/floor/stone/icemoon
+ initial_gas_mix = ICEMOON_DEFAULT_ATMOS
+
/turf/open/floor/vault
name = "strange floor"
desc = "You feel a strange nostalgia from looking at this..."
diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm
index cd33a38fef70..45a7aae65497 100644
--- a/code/game/turfs/open/lava.dm
+++ b/code/game/turfs/open/lava.dm
@@ -77,17 +77,20 @@
AddElement(/datum/element/immerse, "immerse", 215)
immerse_added = TRUE
-/**
- * turf/Initialize() calls Entered on its contents too, however
- * we need to wait for movables that still need to be initialized
- * before we add the immerse element.
- */
/turf/open/lava/Entered(atom/movable/arrived)
. = ..()
- if(!immerse_added && !is_type_in_typecache(arrived, GLOB.immerse_ignored_movable))
+ apply_lava_effects(arrived)
+
+/turf/open/lava/initialize_occupant(atom/movable/occupant)
+ . = ..()
+ apply_lava_effects(occupant)
+
+/// Entering lava and having the floor turn into lava apply the same effects.
+/turf/open/lava/proc/apply_lava_effects(atom/movable/occupant)
+ if(!immerse_added && !is_type_in_typecache(occupant, GLOB.immerse_ignored_movable))
AddElement(/datum/element/immerse, "immerse", 215)
immerse_added = TRUE
- if(burn_stuff(arrived))
+ if(burn_stuff(occupant))
START_PROCESSING(SSobj, src)
/turf/open/lava/update_overlays()
diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm
index e9e3df973399..2a290b0c8574 100644
--- a/code/game/turfs/open/openspace.dm
+++ b/code/game/turfs/open/openspace.dm
@@ -57,6 +57,11 @@
. = ..()
if(movable.set_currently_z_moving(CURRENTLY_Z_FALLING))
zFall(movable, falling_from_move = TRUE)
+
+/turf/open/openspace/initialize_occupant(atom/movable/occupant)
+ . = ..()
+ zfall_if_on_turf(occupant)
+
/**
* Drops movables spawned on this turf after they are successfully initialized.
* so that spawned movables that should fall to gravity, will fall.
diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm
index b6cc5368aebd..d9bacd7b74d6 100644
--- a/code/game/turfs/open/space/space.dm
+++ b/code/game/turfs/open/space/space.dm
@@ -125,7 +125,7 @@ GLOBAL_LIST_EMPTY(starlight)
return attack_hand(user, modifiers)
/turf/open/space/handle_slip()
- return
+ return FALSE
/turf/open/space/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
. = ..()
diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm
index f7f863eecc06..11f212aacccb 100644
--- a/code/game/turfs/open/water.dm
+++ b/code/game/turfs/open/water.dm
@@ -58,15 +58,14 @@
UnregisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)
make_immersed(movable)
-/**
- * turf/Initialize() calls Entered on its contents too, however
- * we need to wait for movables that still need to be initialized
- * before we add the immerse element.
- */
/turf/open/water/Entered(atom/movable/arrived)
. = ..()
make_immersed(arrived)
+/turf/open/water/initialize_occupant(atom/movable/occupant)
+ . = ..()
+ make_immersed(occupant)
+
///Makes this turf immersable, return true if we actually did anything so child procs don't have to repeat our checks
/turf/open/water/proc/make_immersed(atom/movable/triggering_atom)
if(immerse_added || is_type_in_typecache(triggering_atom, GLOB.immerse_ignored_movable))
@@ -258,6 +257,13 @@
return
enter_hot_spring(arrived)
+/turf/open/water/hot_spring/initialize_occupant(atom/movable/occupant)
+ . = ..()
+ // Uninitialized occupants use on_atom_inited() once their own initialization finishes.
+ if(!(occupant.flags_1 & INITIALIZED_1))
+ return
+ enter_hot_spring(occupant)
+
/turf/open/water/hot_spring/on_atom_inited(datum/source, atom/movable/movable)
enter_hot_spring(movable)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 3d0f4e87c1d3..38e407d747d8 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -114,6 +114,13 @@ GLOBAL_LIST_EMPTY(station_turfs)
var/skip_minimap_rendering = FALSE
+/// ChangeTurf passes the old signal tables here so initialization can update them directly.
+/// In particular, occupant initialization can move or delete existing contents before New() returns.
+/turf/New(loc, list/inherited_listen_lookup, list/inherited_signal_procs)
+ _listen_lookup = inherited_listen_lookup
+ _signal_procs = inherited_signal_procs
+ . = ..(loc)
+
/turf/vv_edit_var(var_name, new_value)
var/static/list/banned_edits = list(NAMEOF_STATIC(src, x), NAMEOF_STATIC(src, y), NAMEOF_STATIC(src, z))
if(var_name in banned_edits)
@@ -162,7 +169,7 @@ GLOBAL_LIST_EMPTY(station_turfs)
QUEUE_SMOOTH(src)
for(var/atom/movable/content as anything in src)
- Entered(content, null)
+ initialize_occupant(content)
var/area/our_area = loc
if(!our_area.area_has_base_lighting && space_lit) //Only provide your own lighting if the area doesn't for you
@@ -186,6 +193,12 @@ GLOBAL_LIST_EMPTY(station_turfs)
return INITIALIZE_HINT_NORMAL
+/// Applies this turf to an existing occupant during Initialize(), without announcing movement.
+/// Call the parent first so the occupant can update turf-dependent state before subtype effects run.
+/turf/proc/initialize_occupant(atom/movable/occupant)
+ SHOULD_CALL_PARENT(TRUE)
+ SEND_SIGNAL(occupant, COMSIG_MOVABLE_TURF_INITIALIZING, src)
+
/// Initializes our adjacent turfs. If you want to avoid this, do not override it, instead set init_air to FALSE
/turf/proc/Initalize_Atmos(time)
CALCULATE_ADJACENT_TURFS(src, NORMAL_TURF)
@@ -221,11 +234,12 @@ GLOBAL_LIST_EMPTY(station_turfs)
vis_contents.Cut()
/// WARNING WARNING
-/// Turfs DO NOT lose their signals when they get replaced, REMEMBER THIS
+/// Turfs DO NOT lose their external signal connections when they get replaced, REMEMBER THIS
/// It's possible because turfs are fucked, and if you have one in a list and it's replaced with another one, the list ref points to the new turf
-/// We do it because moving signals over was needlessly expensive, and bloated a very commonly used bit of code
+/// We do it to avoid unregistering and re-registering every signal in a very commonly used bit of code
+/// Signals registered by the turf on itself are cleared so the new type can register its own
/turf/_clear_signal_refs()
- return
+ UnregisterSignal(src, _signal_procs?[src])
/turf/attack_hand(mob/user, list/modifiers)
. = ..()
diff --git a/code/modules/admin/antag_panel.dm b/code/modules/admin/antag_panel.dm
index 86e0e5160b46..710164fc21eb 100644
--- a/code/modules/admin/antag_panel.dm
+++ b/code/modules/admin/antag_panel.dm
@@ -205,12 +205,8 @@ GLOBAL_VAR(antag_prototypes)
if(U)
if (check_rights(R_FUN, 0))
uplink_info += ", [U.uplink_handler.telecrystals] TC"
- if(U.uplink_handler.has_progression)
- uplink_info += ", [U.uplink_handler.progression_points] PR"
else
uplink_info += ", [U.uplink_handler.telecrystals] TC"
- if(U.uplink_handler.has_progression)
- uplink_info += ", [U.uplink_handler.progression_points] PR"
else
uplink_info += "give"
uplink_info += "." //hiel grammar
diff --git a/code/modules/admin/force_event.dm b/code/modules/admin/force_event.dm
index d3730437b569..c1b67932286f 100644
--- a/code/modules/admin/force_event.dm
+++ b/code/modules/admin/force_event.dm
@@ -26,18 +26,18 @@ ADMIN_VERB(force_event, R_FUN, "Trigger Event", "Forces an event to occur.", ADM
var/static/list/category_to_icons
if(!category_to_icons)
category_to_icons = list(
- EVENT_CATEGORY_AI = "robot",
- EVENT_CATEGORY_ANOMALIES = "cloud-bolt",
- EVENT_CATEGORY_BUREAUCRATIC = "print",
- EVENT_CATEGORY_ENGINEERING = "wrench",
- EVENT_CATEGORY_ENTITIES = "ghost",
- EVENT_CATEGORY_FRIENDLY = "face-smile",
- EVENT_CATEGORY_HEALTH = "brain",
- EVENT_CATEGORY_HOLIDAY = "calendar",
- EVENT_CATEGORY_INVASION = "user-group",
- EVENT_CATEGORY_JANITORIAL = "bath",
- EVENT_CATEGORY_SPACE = "meteor",
- EVENT_CATEGORY_WIZARD = "hat-wizard",
+ EVENT_CATEGORY_AI = FA_ICON_ROBOT,
+ EVENT_CATEGORY_ANOMALIES = FA_ICON_CLOUD_BOLT,
+ EVENT_CATEGORY_BUREAUCRATIC = FA_ICON_PRINT,
+ EVENT_CATEGORY_ENGINEERING = FA_ICON_WRENCH,
+ EVENT_CATEGORY_ENTITIES = FA_ICON_GHOST,
+ EVENT_CATEGORY_FRIENDLY = FA_ICON_FACE_SMILE,
+ EVENT_CATEGORY_HEALTH = FA_ICON_BRAIN,
+ EVENT_CATEGORY_HOLIDAY = FA_ICON_CALENDAR,
+ EVENT_CATEGORY_INVASION = FA_ICON_USER_GROUP,
+ EVENT_CATEGORY_JANITORIAL = FA_ICON_BATH,
+ EVENT_CATEGORY_SPACE = FA_ICON_METEOR,
+ EVENT_CATEGORY_WIZARD = FA_ICON_HAT_WIZARD,
)
var/list/data = list()
@@ -52,7 +52,7 @@ ADMIN_VERB(force_event, R_FUN, "Trigger Event", "Forces an event to occur.", ADM
categories_seen[event_control.category] = TRUE
UNTYPED_LIST_ADD(categories, list(
"name" = event_control.category,
- "icon" = category_to_icons[event_control.category],
+ "icon" = category_to_icons[event_control.category] || FA_ICON_QUESTION,
))
//add event, with one value matching up the category
UNTYPED_LIST_ADD(events, list(
@@ -60,6 +60,7 @@ ADMIN_VERB(force_event, R_FUN, "Trigger Event", "Forces an event to occur.", ADM
"description" = event_control.description,
"type" = event_control.type,
"category" = event_control.category,
+ "disabled" = event_control.admin_disabled,
"has_customization" = !!length(event_control.admin_setup),
))
data["categories"] = categories
@@ -74,21 +75,30 @@ ADMIN_VERB(force_event, R_FUN, "Trigger Event", "Forces an event to occur.", ADM
switch(action)
if("forceevent")
var/announce_event = params["announce"]
- var/string_path = params["type"]
- if(!string_path)
- return
- var/event_to_run_type = text2path(string_path)
+ var/event_to_run_type = text2path(params["type"])
if(!event_to_run_type)
return
var/datum/round_event_control/event = locate(event_to_run_type) in SSevents.control
if(!event)
return
- if(length(event.admin_setup))
- for(var/datum/event_admin_setup/admin_setup_datum as anything in event.admin_setup)
- if(admin_setup_datum.prompt_admins() == ADMIN_CANCEL_EVENT)
- return
+ for(var/datum/event_admin_setup/admin_setup_datum as anything in event.admin_setup)
+ if(admin_setup_datum.prompt_admins() == ADMIN_CANCEL_EVENT)
+ return
var/always_announce_chance = 100
var/no_announce_chance = 0
event.run_event(announce_chance_override = announce_event ? always_announce_chance : no_announce_chance, admin_forced = TRUE)
message_admins("[key_name_admin(usr)] has triggered an event. ([event.name])")
log_admin("[key_name(usr)] has triggered an event. ([event.name])")
+
+ if("toggleevent")
+ var/event_to_run_type = text2path(params["type"])
+ if(!event_to_run_type)
+ return
+ var/datum/round_event_control/event = locate(event_to_run_type) in SSevents.control
+ if(!event)
+ return
+
+ event.admin_disabled = !event.admin_disabled
+ message_admins("[key_name_admin(usr)] has [event.admin_disabled ? "blocked" : "unblocked"] an event from triggering randomly. ([event.name])")
+ log_admin("[key_name(usr)] has [event.admin_disabled ? "blocked" : "unblocked"] an event from triggering randomly. ([event.name])")
+ update_static_data(usr)
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index 2a593d12302b..1cecb0cbb923 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -197,31 +197,33 @@ 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)
- for(var/job_type in valid_subtypesof(/datum/job/vampire))
+
+ var/list/landmark_iconstates = list()
+ for(var/obj/effect/landmark/start/landmark as anything in valid_subtypesof(/obj/effect/landmark/start))
+ if(landmark::icon_state)
+ landmark_iconstates |= landmark::icon_state
+
+ for(var/job_type in valid_subtypesof(/datum/job/vampire)) // DARKPACK EDIT CHANGE
var/datum/job/job_datum = SSjob.get_job_type(job_type)
- if(!job_datum.outfit)
+ if(!(job_datum.title in landmark_iconstates))
continue
- /* DARKPACK CODE
- mannequin.delete_equipment()
- mannequin.dress_up_as_job(
- equipping = job_datum,
- visual_only = TRUE,
- consistent = TRUE,
- )
- var/icon/job_icon = get_flat_existing_human_icon(mannequin, list(SOUTH))
- final.Insert(job_icon, job_datum.title, frame = 1)
- */
- // 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)
+
+ switch(job_datum.title)
+ if(JOB_AI)
+ final.Insert(icon('icons/mob/silicon/ai.dmi', "ai", SOUTH, 1), JOB_AI)
+ if(JOB_CYBORG)
+ final.Insert(icon('icons/mob/silicon/robots.dmi', "robot", SOUTH, 1), JOB_CYBORG)
+ else
+ if(job_datum.outfit) //only screenshot icons with an outfit
+ var/icon/I = get_flat_human_icon(null, job_datum, null, "landmark_icons[rand(1,100)]", list(SOUTH))
+ final.Insert(I, job_datum.title)
+ //Also add the x
+ // DARKPACK EDIT CHANGE START
final.Insert(icon('modular_darkpack/modules/jobs/icons/landmarks_static.dmi', "x"), "x")
final.Insert(icon('icons/hud/screen_gen.dmi', "x", ""))
+ // DARKPACK EDIT CHANGE END
- fcopy(final, "modular_darkpack/modules/jobs/icons/landmarks.dmi")
-// DARKPACK EDIT CHANGE END
+ fcopy(final, "modular_zapoc/modules/jobs/icons/landmarks.dmi") // DARKPACK EDIT CHANGE // APOC EDIT CHANGE
ADMIN_VERB_VISIBILITY(debug_z_levels, ADMIN_VERB_VISIBLITY_FLAG_MAPPING_DEBUG)
ADMIN_VERB(debug_z_levels, R_DEBUG, "Debug Z-Levels", "Displays a list of all z-levels and their linkages.", ADMIN_CATEGORY_MAPPING)
diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm
index 84ccaf2935ba..410aa476321b 100644
--- a/code/modules/admin/verbs/secrets.dm
+++ b/code/modules/admin/verbs/secrets.dm
@@ -812,8 +812,6 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w
if(ROLE_TRAITOR)
var/datum/antagonist/traitor/antag_datum = new(give_objectives = keep_generic_objecives)
assign_admin_objective_and_antag(player, antag_datum)
- var/datum/uplink_handler/uplink = antag_datum.uplink_handler
- uplink.has_progression = FALSE
if(ROLE_CHANGELING)
var/datum/antagonist/changeling/antag_datum = new
antag_datum.give_objectives = keep_generic_objecives
diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm
index d7123e844844..840bac7da20b 100644
--- a/code/modules/admin/view_variables/reference_tracking.dm
+++ b/code/modules/admin/view_variables/reference_tracking.dm
@@ -35,7 +35,6 @@ GLOBAL_ALIST_EMPTY(reftracker_skip_typecache_b)
/datum/movespeed_modifier,
/datum/painting,
/datum/paper_input,
- /datum/physiology,
/datum/plant_gene/reagent,
/datum/qdel_item,
/datum/stack_recipe,
diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm
index e8a81987cd16..c12da057f6fb 100644
--- a/code/modules/antagonists/_common/antag_spawner.dm
+++ b/code/modules/antagonists/_common/antag_spawner.dm
@@ -241,10 +241,7 @@
brainopslastname = creator_op.nuke_team.syndicate_name
var/brainopsname = "[brainfirstname] [brainopslastname]"
- borg.mmi.name = "[initial(borg.mmi.name)]: [brainopsname]"
- borg.mmi.brain.name = "[brainopsname]'s brain"
- borg.mmi.brainmob.real_name = brainopsname
- borg.mmi.brainmob.name = brainopsname
+ borg.mmi.set_name(brainopsname)
borg.real_name = borg.name
borg.PossessByPlayer(C.key)
diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm
index f6cf16e7f908..0dbb250d44c8 100644
--- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm
+++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm
@@ -252,7 +252,7 @@
inhand_icon_state = "alienpistol"
trigger_guard = TRIGGER_GUARD_ALLOW_ALL
-/obj/item/gun/energy/shrink_ray
+/obj/item/gun/energy/recharge/shrink_ray
name = "shrink ray blaster"
desc = "This is a piece of frightening alien tech that enhances the magnetic pull of atoms in a localized space to temporarily make an object shrink. \
That or it's just space magic. Either way, it shrinks stuff."
@@ -261,20 +261,21 @@
inhand_icon_state = "shrink_ray"
icon_state = "shrink_ray"
automatic_charge_overlays = FALSE
- fire_delay = 3 SECONDS
- selfcharge = 1//shot costs 200 energy, has a max capacity of 1000 for 5 shots. self charge returns 25 energy every couple ticks, so about 1 shot charged every 12~ seconds
+ recharge_time = 2 SECONDS
+ recharge_sound = 'sound/items/eshield_recharge.ogg'
+ holds_charge = TRUE
trigger_guard = TRIGGER_GUARD_ALLOW_ALL// variable-size trigger, get it? (abductors need this to be set so the gun is usable for them)
-/obj/item/gun/energy/shrink_ray/suicide_act(mob/living/user)
+/obj/item/gun/energy/recharge/shrink_ray/suicide_act(mob/living/user)
. = ..()
user.visible_message(span_suicide("[user] points [src] at [user.p_their()] head, it looks like [user.p_theyre()] going to commit suicide!"))
// we want an animation, so lets manually handle suicide.
addtimer(CALLBACK(src, PROC_REF(shrink_death), user), 0)
return MANUAL_SUICIDE
-/obj/item/gun/energy/shrink_ray/proc/shrink_death(mob/living/user)
- var/shrink = user.transform.Scale(0.1,0.1)
- animate(user, 30 SECONDS, transform=shrink)
+/obj/item/gun/energy/recharge/shrink_ray/proc/shrink_death(mob/living/user)
+ var/shrink = user.transform.Scale(0.1, 0.1)
+ animate(user, 30 SECONDS, transform = shrink)
// Have to wait until the animate is done
sleep(30 SECONDS)
user.gib(DROP_ALL_REMAINS)
diff --git a/code/modules/antagonists/abductor/equipment/glands/blood.dm b/code/modules/antagonists/abductor/equipment/glands/blood.dm
index 7523d00ffddf..850fa0072d94 100644
--- a/code/modules/antagonists/abductor/equipment/glands/blood.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/blood.dm
@@ -4,6 +4,7 @@
cooldown_high = 1800
uses = -1
icon_state = "egg"
+ inhand_icon_state = "egg"
lefthand_file = 'icons/mob/inhands/items/food_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/food_righthand.dmi'
mind_control_uses = 3
diff --git a/code/modules/antagonists/abductor/equipment/glands/egg.dm b/code/modules/antagonists/abductor/equipment/glands/egg.dm
index 67c3efd42cbe..053cdae22bc1 100644
--- a/code/modules/antagonists/abductor/equipment/glands/egg.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/egg.dm
@@ -4,6 +4,7 @@
cooldown_high = 400
uses = -1
icon_state = "egg"
+ inhand_icon_state = "egg"
lefthand_file = 'icons/mob/inhands/items/food_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/food_righthand.dmi'
mind_control_uses = 2
diff --git a/code/modules/antagonists/abductor/equipment/orderable_gear.dm b/code/modules/antagonists/abductor/equipment/orderable_gear.dm
index aa6ef608f6c8..be81312c7e2b 100644
--- a/code/modules/antagonists/abductor/equipment/orderable_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/orderable_gear.dm
@@ -79,7 +79,7 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear))
That or it's just space magic. Either way, it shrinks stuff."
id = "shrink_ray"
cost = 2
- build_path = list(/obj/item/gun/energy/shrink_ray = 1)
+ build_path = list(/obj/item/gun/energy/recharge/shrink_ray = 1)
category = CATEGORY_ADVANCED_GEAR
/datum/abductor_gear/omnitool
diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm
index 2cc52bed914c..f1469d108f5d 100644
--- a/code/modules/antagonists/abductor/machinery/experiment.dm
+++ b/code/modules/antagonists/abductor/machinery/experiment.dm
@@ -47,8 +47,7 @@
to_chat(user, span_warning("[src]'s door won't budge!"))
/obj/machinery/abductor/experiment/container_resist_act(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
user.visible_message(span_notice("You see [user] kicking against the door of [src]!"), \
span_notice("You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)"), \
span_hear("You hear a metallic creaking from [src]."))
diff --git a/code/modules/antagonists/blood_worm/actions/inject_blood.dm b/code/modules/antagonists/blood_worm/actions/inject_blood.dm
index 57f12a05acec..6a8fbc4f4aa0 100644
--- a/code/modules/antagonists/blood_worm/actions/inject_blood.dm
+++ b/code/modules/antagonists/blood_worm/actions/inject_blood.dm
@@ -114,12 +114,12 @@
var/healing_left = damage_regen_rate * seconds_between_ticks
if (owner.get_brute_loss() > 0 && healing_left > 0)
- var/amount_healed = max(0, owner.adjust_brute_loss(-healing_left, forced = TRUE, updating_health = FALSE))
+ var/amount_healed = max(0, owner.adjust_brute_loss(-healing_left, updating_health = FALSE))
healing_left -= amount_healed
. |= amount_healed
if (owner.get_fire_loss() > 0 && healing_left > 0)
- var/amount_healed = max(0, owner.adjust_fire_loss(-healing_left, forced = TRUE, updating_health = FALSE))
+ var/amount_healed = max(0, owner.adjust_fire_loss(-healing_left, updating_health = FALSE))
healing_left -= amount_healed
. |= amount_healed
diff --git a/code/modules/antagonists/blood_worm/actions/revive_host.dm b/code/modules/antagonists/blood_worm/actions/revive_host.dm
index a9aa47555f61..ce9963caaf90 100644
--- a/code/modules/antagonists/blood_worm/actions/revive_host.dm
+++ b/code/modules/antagonists/blood_worm/actions/revive_host.dm
@@ -94,7 +94,7 @@
if (feedback)
host.balloon_alert(owner, "brain too damaged!")
return FALSE
- if (host.health <= HEALTH_THRESHOLD_DEAD)
+ if (host.health <= host.dead_threshold)
if (feedback)
host.balloon_alert(owner, "body too damaged!")
return FALSE
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 1aa022c822b9..62d32302c896 100644
--- a/code/modules/antagonists/blood_worm/blood_worm_host_handling.dm
+++ b/code/modules/antagonists/blood_worm/blood_worm_host_handling.dm
@@ -46,7 +46,7 @@
if (client)
ADD_TRAIT(host, TRAIT_MIND_TEMPORARILY_GONE, BLOOD_WORM_HOST_TRAIT)
- host.physiology.bleed_mod *= BLOOD_WORM_BLEED_MOD
+ MODIFY_PHYSIOLOGY(host, PHYS_COEFF_BLEED, BLOOD_WORM_BLEED_MOD)
host.AddElement(/datum/element/hand_organ_insertion)
@@ -127,7 +127,7 @@
REMOVE_TRAITS_IN(src, BLOOD_WORM_HOST_TRAIT)
REMOVE_TRAITS_IN(host, BLOOD_WORM_HOST_TRAIT)
- host.physiology.bleed_mod /= BLOOD_WORM_BLEED_MOD
+ MODIFY_PHYSIOLOGY(host, PHYS_COEFF_BLEED, 1/BLOOD_WORM_BLEED_MOD)
host.RemoveElement(/datum/element/hand_organ_insertion)
remove_actions(src, host_actions)
@@ -229,8 +229,7 @@
if (host.coretemperature <= maximum_survivable_temperature)
return
- var/burn_coeff = damage_coeff[BURN]
- adjust_worm_health(-unsuitable_heat_damage * (burn_coeff ? burn_coeff : 1) * seconds_per_tick)
+ adjust_worm_health(-unsuitable_heat_damage * GET_PHYSIOLOGY(src, BURN) * seconds_per_tick)
if (COOLDOWN_FINISHED(src, host_heat_alert_cooldown))
to_chat_self(span_userdanger("Your blood is burning up!"))
diff --git a/code/modules/antagonists/blood_worm/blood_worm_mob.dm b/code/modules/antagonists/blood_worm/blood_worm_mob.dm
index bfe9a0cd4683..975c0f0e1e8f 100644
--- a/code/modules/antagonists/blood_worm/blood_worm_mob.dm
+++ b/code/modules/antagonists/blood_worm/blood_worm_mob.dm
@@ -11,7 +11,7 @@
basic_mob_flags = FLAMMABLE_MOB
status_flags = CANPUSH // No CANSTUN, blood worms are immune to stuns by design.
- damage_coeff = list(BRUTE = 1, BURN = 1.5, TOX = 0, STAMINA = 0, OXY = 0)
+ physiology = list(BURN = 1.5, TOX = 0, STAMINA = 0, OXY = 0)
pressure_resistance = 200
@@ -203,8 +203,18 @@
name = "[initial(name)] ([id_number])"
real_name = name
-/mob/living/basic/blood_worm/adjust_health(amount, updating_health, forced)
- return host ? 0 : ..() // Prevents damage from adjust_x_loss while in a host, because that damage would be nullified by the next [proc/sync_health] call. Adjust host blood volume instead.
+// Prevents damage from adjust_x_loss while in a host, because that damage would be nullified by the next [proc/sync_health] call. Adjust host blood volume instead.
+/mob/living/basic/blood_worm/can_adjust_brute_loss(amount, forced, required_bodytype)
+ return host ? FALSE : ..()
+
+/mob/living/basic/blood_worm/can_adjust_fire_loss(amount, forced, required_bodytype)
+ return host ? FALSE : ..()
+
+/mob/living/basic/blood_worm/can_adjust_tox_loss(amount, forced, required_bodytype)
+ return host ? FALSE : ..()
+
+/mob/living/basic/blood_worm/can_adjust_oxy_loss(amount, forced, required_bodytype)
+ return host ? FALSE : ..()
/mob/living/basic/blood_worm/set_stat(new_stat)
. = ..()
diff --git a/code/modules/antagonists/changeling/powers/mmi_talk.dm b/code/modules/antagonists/changeling/powers/mmi_talk.dm
index 483072265432..e38b2a7aeb64 100644
--- a/code/modules/antagonists/changeling/powers/mmi_talk.dm
+++ b/code/modules/antagonists/changeling/powers/mmi_talk.dm
@@ -46,7 +46,7 @@
if(isnull(brain_ref))
stack_trace("[type] can_sting was called with a null brain!")
return FALSE
- if(!istype(brain_ref.loc, /obj/item/mmi))
+ if(!istype(brain_ref.loc, /obj/item/brain_processor/organic))
stack_trace("[type] can_sting was called with a brain not located in an MMI!")
return FALSE
return TRUE
@@ -81,6 +81,7 @@
// Generate map view
mmi_view = new()
mmi_view.generate_view(mmi_view_key)
+ mmi_view.set_display(brain_ref)
// Generate movement detector (to update the view on MMI movement)
update_view_tracker = new(brain_ref, CALLBACK(src, PROC_REF(update_mmi_view)))
@@ -89,7 +90,7 @@
update_mmi_view()
// Makes the MMI relay heard messages
if(!HAS_TRAIT_FROM(brain_ref.loc, TRAIT_HEARING_SENSITIVE, REF(src)))
- var/obj/item/mmi/mmi = brain_ref.loc
+ var/obj/item/brain_processor/organic/mmi = brain_ref.loc
mmi.become_hearing_sensitive(REF(src))
RegisterSignal(mmi, COMSIG_MOVABLE_HEAR, PROC_REF(relay_hearing))
// Actually open the UI
@@ -101,7 +102,7 @@
mmi_view.display_to(user, ui.window)
/datum/action/changeling/mmi_talk/ui_close(mob/user)
- var/obj/item/mmi/mmi = brain_ref.loc
+ var/obj/item/brain_processor/organic/mmi = brain_ref.loc
UnregisterSignal(mmi, COMSIG_MOVABLE_HEAR)
mmi.lose_hearing_sensitivity(REF(src))
@@ -113,7 +114,7 @@
if(action != "send_mmi_message")
return FALSE
- var/obj/item/mmi/mmi = brain_ref.loc
+ var/obj/item/brain_processor/organic/mmi = brain_ref.loc
if(IS_UNCONSCIOUS_OR_CRIT(mmi.brainmob))
to_chat(usr, span_warning("Our decoy brain is too damaged to speak."))
else
@@ -129,7 +130,7 @@
/// Signal proc for [COMSIG_MOVABLE_HEAR] to relay stuff the MMI hears to the ling.
/// Not super good, but it works.
-/datum/action/changeling/mmi_talk/proc/relay_hearing(obj/item/mmi/source, list/hear_args)
+/datum/action/changeling/mmi_talk/proc/relay_hearing(obj/item/brain_processor/organic/source, list/hear_args)
SIGNAL_HANDLER
// We can likely already hear them, so do not bother
diff --git a/code/modules/antagonists/clown_ops/clown_weapons.dm b/code/modules/antagonists/clown_ops/clown_weapons.dm
index 5a5baa90c851..e2fe872ba190 100644
--- a/code/modules/antagonists/clown_ops/clown_weapons.dm
+++ b/code/modules/antagonists/clown_ops/clown_weapons.dm
@@ -10,6 +10,9 @@
volume = 30
list_reagents = list(/datum/reagent/lube = 30)
+/obj/item/reagent_containers/spray/waterflower/lube/super
+ list_reagents = list(/datum/reagent/lube/superlube = 30)
+
//BANANIUM SWORD
/obj/item/melee/energy/sword/bananium
@@ -35,32 +38,47 @@
attack_verb_simple_on = list("slip"), \
clumsy_check = FALSE, \
)
+ make_less_slippery()
RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform))
/obj/item/melee/energy/sword/bananium/on_transform(obj/item/source, mob/user, active)
. = ..()
- adjust_slipperiness()
-
-/*
- * Adds or removes a slippery component, depending on whether the sword is active or not.
- */
-/obj/item/melee/energy/sword/bananium/proc/adjust_slipperiness()
if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE))
- AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP)
+ ADD_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND, INNATE_TRAIT)
+ hitsound = 'sound/misc/slip.ogg'
else
- qdel(GetComponent(/datum/component/slippery))
+ REMOVE_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND, INNATE_TRAIT)
+ hitsound = initial(hitsound)
-/obj/item/melee/energy/sword/bananium/attack(mob/living/M, mob/living/user)
+/obj/item/melee/energy/sword/bananium/equipped(mob/user, slot, initial)
. = ..()
- if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE))
- var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
- slipper.Slip(src, M)
+ if((slot & ITEM_SLOT_HANDS) && HAS_TRAIT(user, TRAIT_CLUMSY))
+ make_very_slippery()
+ else
+ make_less_slippery()
-/obj/item/melee/energy/sword/bananium/throw_impact(atom/hit_atom, throwingdatum)
- . = ..()
- if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE))
- var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
- slipper.Slip(src, hit_atom)
+/obj/item/melee/energy/sword/bananium/proc/make_very_slippery()
+ AddComponent( \
+ /datum/component/slippery, \
+ knockdown = 8 SECONDS, \
+ lube_flags = GALOSHES_DONT_HELP|SLIP_WHEN_CRAWLING, \
+ force_drop = TRUE, \
+ can_slip_callback = CALLBACK(src, PROC_REF(is_active)), \
+ slip_on_damage = TRUE, \
+ )
+
+/obj/item/melee/energy/sword/bananium/proc/make_less_slippery()
+ AddComponent( \
+ /datum/component/slippery, \
+ knockdown = 4 SECONDS, \
+ lube_flags = GALOSHES_DONT_HELP, \
+ force_drop = FALSE, \
+ can_slip_callback = CALLBACK(src, PROC_REF(is_active)), \
+ slip_on_damage = FALSE, \
+ )
+
+/obj/item/melee/energy/sword/bananium/proc/is_active()
+ return HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)
/obj/item/melee/energy/sword/bananium/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(!istype(tool, /obj/item/melee/energy/sword/bananium))
@@ -78,8 +96,7 @@
if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE))
attack_self(user)
user.visible_message(span_suicide("[user] is [pick("slitting [user.p_their()] stomach open with", "falling on")] [src]! It looks like [user.p_theyre()] trying to commit seppuku, but the blade slips off of [user.p_them()] harmlessly!"))
- var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
- slipper.Slip(src, user)
+ user.attackby(src, user)
return SHAME
//BANANIUM SHIELD
@@ -99,30 +116,37 @@
active_throw_speed = 1
can_clumsy_use = TRUE
+ hitsound = 'sound/misc/slip.ogg'
+
/obj/item/shield/energy/bananium/on_transform(obj/item/source, mob/user, active)
. = ..()
- adjust_comedy()
-
-/*
- * Adds or removes a slippery and boomerang component, depending on whether the shield is active or not.
- */
-/obj/item/shield/energy/bananium/proc/adjust_comedy()
if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE))
- AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP)
- AddComponent(/datum/component/boomerang, throw_range+2, TRUE)
+ AddComponent(/datum/component/slippery, 6 SECONDS, GALOSHES_DONT_HELP, slip_on_damage = TRUE, can_slip_callback = CALLBACK(src, PROC_REF(is_active)))
+ if(HAS_TRAIT(user, TRAIT_CLUMSY))
+ AddComponent(/datum/component/boomerang, throw_range + 2, TRUE)
+ else
+ AddComponent(/datum/component/boomerang, throw_range + 1)
+ ADD_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND, INNATE_TRAIT)
+ hitsound = 'sound/misc/slip.ogg'
+
else
qdel(GetComponent(/datum/component/slippery))
qdel(GetComponent(/datum/component/boomerang))
+ REMOVE_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND, INNATE_TRAIT)
+ hitsound = initial(hitsound)
-/obj/item/shield/energy/bananium/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
- if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE))
- var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum)
- if(iscarbon(hit_atom) && !caught)//if they are a carbon and they didn't catch it
- var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
- slipper.Slip(src, hit_atom)
- else
- return ..()
+/obj/item/shield/energy/bananium/proc/is_active()
+ return HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)
+
+/obj/item/shield/energy/bananium/equipped(mob/user, slot, initial)
+ . = ..()
+ if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE))
+ return
+ if(HAS_TRAIT(user, TRAIT_CLUMSY))
+ AddComponent(/datum/component/boomerang, throw_range + 2, TRUE)
+ else
+ AddComponent(/datum/component/boomerang, throw_range + 1)
//BOMBANANA
diff --git a/code/modules/antagonists/clown_ops/outfits.dm b/code/modules/antagonists/clown_ops/outfits.dm
index b66b2212445b..321dc24374d5 100644
--- a/code/modules/antagonists/clown_ops/outfits.dm
+++ b/code/modules/antagonists/clown_ops/outfits.dm
@@ -2,19 +2,16 @@
name = "Clown Operative - Basic"
uniform = /obj/item/clothing/under/syndicate
shoes = /obj/item/clothing/shoes/clown_shoes/combat
- mask = /obj/item/clothing/mask/gas/clown_hat
+ mask = /obj/item/clothing/mask/gas/clown_hat/clownops
gloves = /obj/item/clothing/gloves/combat
back = /obj/item/storage/backpack/clown
ears = /obj/item/radio/headset/syndicate/alt
- l_pocket = /obj/item/pinpointer/nuke/syndicate
+ l_pocket = /obj/item/modular_computer/pda/nukeops
r_pocket = /obj/item/bikehorn
id = /obj/item/card/id/advanced/chameleon/elite
+ belt = /obj/item/gun/ballistic/automatic/pistol/toy/riot/clandestine
backpack_contents = list(
- /obj/item/gun/ballistic/automatic/pistol/toy/riot/clandestine = 1, //The clown op equivalent to the Ansem
- /obj/item/pen/edagger = 1,
- /obj/item/dnainjector/clumsymut = 1, //in case you want to be clumsy for the memes
- /obj/item/storage/box/syndie_kit/clownpins = 1, //for any guns that you get your grubby little clown op mitts on
- /obj/item/reagent_containers/spray/waterflower/lube = 1,
+ /obj/item/reagent_containers/spray/waterflower/lube/super = 1,
/obj/item/mod/skin_applier/honkerative = 1,
)
box = /obj/item/storage/box/survival/syndie
@@ -24,6 +21,20 @@
id_trim = /datum/id_trim/chameleon/operative/clown
+/datum/outfit/syndicate/clownop/post_equip(mob/living/carbon/human/nukie, visuals_only)
+ . = ..()
+ var/list/nukie_contents = nukie.get_all_contents()
+ var/obj/item/gun/ballistic/automatic/pistol/toy/riot/clandestine/gun = locate() in nukie_contents
+ if(!isnull(gun))
+ qdel(gun.pin)
+ var/obj/item/firing_pin/clown/ultra/new_pin = new()
+ new_pin.gun_insert(null, gun, TRUE)
+
+ var/obj/item/clothing/mask/gas/syndicate/old_mask = locate() in nukie_contents
+ qdel(old_mask)
+
+ nukie.dna.add_mutation(/datum/mutation/clumsy, MUTATION_SOURCE_MUTATOR)
+
/datum/outfit/syndicate/clownop/no_crystals
name = "Clown Operative - Reinforcement"
tc = 0
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index f59ddcdd2d1b..4867940e45d4 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -783,11 +783,11 @@
construct_thing.balloon_alert(user, "out of blood!")
return FALSE
if(uses > missing_health)
- construct_thing.adjust_health(-missing_health)
+ construct_thing.adjust_brute_loss(-missing_health)
construct_thing.visible_message(span_warning("[construct_thing] is fully healed by [user]'s blood magic!"))
uses -= missing_health
else
- construct_thing.adjust_health(-uses)
+ construct_thing.adjust_brute_loss(-uses)
construct_thing.visible_message(span_warning("[construct_thing] is partially healed by [user]'s blood magic!"))
uses = 0
playsound(get_turf(construct_thing), 'sound/effects/magic/staff_healing.ogg', 25)
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index b5b7b6966a30..a6a69827969a 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -956,7 +956,7 @@ Striking a noncultist, however, will tear their flesh."}
if(isshade(our_target) || isconstruct(our_target))
var/mob/living/basic/construct/undead_abomination = our_target
if(undead_abomination.health + 5 < undead_abomination.maxHealth)
- undead_abomination.adjust_health(-5)
+ undead_abomination.adjust_brute_loss(-5)
return PROJECTILE_DELETE_WITHOUT_HITTING
/obj/item/blood_beam
@@ -1073,7 +1073,7 @@ Striking a noncultist, however, will tear their flesh."}
var/mob/living/basic/construct/healed_guy = target
if(healed_guy.health + 15 < healed_guy.maxHealth)
- healed_guy.adjust_health(-15)
+ healed_guy.adjust_brute_loss(-15)
else
healed_guy.health = healed_guy.maxHealth
diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm
index 4e9ef0b4f81e..0e2f3a75bd65 100644
--- a/code/modules/antagonists/heretic/heretic_antag.dm
+++ b/code/modules/antagonists/heretic/heretic_antag.dm
@@ -88,6 +88,8 @@
var/passive_level = 1
/// How many points are needed to gain a visible heretic aura
var/points_to_aura = 8
+ /// Lazylist of weakrefs of items we can track with the heart
+ var/list/tracked_items
/datum/antagonist/heretic/Destroy()
LAZYNULL(sac_targets)
diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm
index 6081e195c18c..c1455292b696 100644
--- a/code/modules/antagonists/heretic/heretic_knowledge.dm
+++ b/code/modules/antagonists/heretic/heretic_knowledge.dm
@@ -151,6 +151,12 @@
return "[number_of_things] carcass[number_of_things > 1 ? "es" : ""] of any kind"
return "[number_of_things] [initial(item_path.name)]\s"
+/**
+ * Used in addition to parse_required_items in parsing requirements into a readable form.
+ */
+/datum/heretic_knowledge/proc/get_extra_requirements()
+ return
+
/**
* Called whenever the knowledge's associated ritual is completed successfully.
*
@@ -399,6 +405,8 @@
var/limit = 1
/// A list of weakrefs to all items we've created.
var/list/datum/weakref/created_items
+ /// If TRUE items we create can be tracked with the living heart
+ var/trackable_items = FALSE
/datum/heretic_knowledge/limited_amount/Destroy(force)
LAZYCLEARLIST(created_items)
@@ -422,9 +430,13 @@
return TRUE
/datum/heretic_knowledge/limited_amount/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc)
+ var/datum/antagonist/heretic/our_heretic = GET_HERETIC(user)
for(var/result in result_atoms)
var/atom/created_thing = new result(loc)
LAZYADD(created_items, WEAKREF(created_thing))
+ if(trackable_items && our_heretic)
+ LAZYADD(our_heretic.tracked_items, WEAKREF(created_thing))
+
return TRUE
/**
@@ -440,6 +452,7 @@
limit = 2
cost = 1
priority = MAX_KNOWLEDGE_PRIORITY - 5
+ trackable_items = TRUE
/// The status effect typepath we apply on people on mansus grasp.
var/datum/status_effect/eldritch/mark_type
/// The status effect of our passive
@@ -809,10 +822,8 @@
// Show the cool red gradiant in our UI
heretic_datum.update_static_data(user)
- if(ishuman(user))
- var/mob/living/carbon/human/human_user = user
- human_user.physiology.brute_mod *= 0.5
- human_user.physiology.burn_mod *= 0.5
+ MODIFY_PHYSIOLOGY(user, BRUTE, 0.5)
+ MODIFY_PHYSIOLOGY(user, BURN, 0.5)
SSblackbox.record_feedback("tally", "heretic_ascended", 1, heretic_datum.heretic_path.route)
log_heretic_knowledge("[key_name(user)] completed their final ritual at [round_timestamp()].")
diff --git a/code/modules/antagonists/heretic/heretic_living_heart.dm b/code/modules/antagonists/heretic/heretic_living_heart.dm
index 3a8caa822b9c..45fa4dbcb6f7 100644
--- a/code/modules/antagonists/heretic/heretic_living_heart.dm
+++ b/code/modules/antagonists/heretic/heretic_living_heart.dm
@@ -118,6 +118,8 @@
var/list/choosable_targets = list()
// Holds a list of 'name = atom/thing` used to check if our thing still exists after we've made our selection
var/list/possible_tracked_atoms = list()
+ // Tracks names to how many times they show up, so we can append a number to them if multiple of the same name exist
+ var/list/existing_name_counts = list()
// Checks if our heretic has a blade research, and then checks if they have made blades
// adds them to our list of target when pulsing the living heart so that you can locate them
@@ -126,22 +128,32 @@
blade_knowledge = heretic_datum.get_knowledge(potential_knowledge)
if(blade_knowledge)
break
- for(var/datum/weakref/blade_ref as anything in blade_knowledge?.created_items)
- var/obj/item/melee/sickly_blade/blade = blade_ref.resolve()
- if(QDELETED(blade))
- blade_knowledge.created_items -= blade_ref
+ for(var/datum/weakref/item_ref as anything in heretic_datum.tracked_items)
+ var/obj/item/item = item_ref?.resolve()
+ if(QDELETED(item))
+ LAZYREMOVE(heretic_datum.tracked_items, item_ref)
continue
- if(!istype(blade, /obj/item/melee/sickly_blade))
- continue // Just in case someone makes a /datum/heretic_knowledge/limited_amount/starting that doesn't create blades
- if(get(blade, /mob/living) == owner)
+ if(get(item, /mob/living) == owner)
continue
// Means our blade is somewhere, but not on our person, so let's make it trackable
- choosable_targets[blade.name] = image(icon = blade.icon, icon_state = blade.icon_state)
- possible_tracked_atoms[blade.name] = blade
+ var/item_name = item.name
+ if(existing_name_counts[item_name])
+ existing_name_counts[item_name] += 1
+ item_name += " ([existing_name_counts[item_name]])"
+
+ choosable_targets[item_name] = image(item.type)
+ possible_tracked_atoms[item_name] = item
+ existing_name_counts[item_name] = 1
for(var/mob/living/carbon/human/sac_target as anything in heretic_datum.sac_targets)
- choosable_targets[sac_target.real_name] = heretic_datum.sac_targets[sac_target]
- possible_tracked_atoms[sac_target.real_name] = sac_target
+ var/target_name = sac_target.real_name
+ if(existing_name_counts[target_name])
+ existing_name_counts[target_name] += 1
+ target_name += " ([existing_name_counts[target_name]])"
+
+ choosable_targets[target_name] = heretic_datum.sac_targets[sac_target]
+ possible_tracked_atoms[target_name] = sac_target
+ existing_name_counts[target_name] = 1
// If we don't have a last tracked name, open a radial to set one.
// If we DO have a last tracked name, we skip the radial if they right click the action.
diff --git a/code/modules/antagonists/heretic/items/blessed_poppy.dm b/code/modules/antagonists/heretic/items/blessed_poppy.dm
new file mode 100644
index 000000000000..bf9f8b0db7b1
--- /dev/null
+++ b/code/modules/antagonists/heretic/items/blessed_poppy.dm
@@ -0,0 +1,141 @@
+/obj/item/food/grown/flower/poppy/blessed
+ name = "blessed poppy"
+ desc = "A strange poppy flower, one that has never seen the light of day."
+ icon_state = "/obj/item/food/grown/flower/poppy/blessed"
+ post_init_icon_state = "map_flower"
+ icon = 'icons/map_icons/items/_item.dmi'
+ greyscale_colors = COLOR_WHITE
+ greyscale_config = /datum/greyscale_config/flower_simple
+ greyscale_config_worn = /datum/greyscale_config/flower_simple_worn
+ /// Counts how many time we picked someone out of crit condition
+ var/save_count = 0
+
+/obj/item/food/grown/flower/poppy/blessed/Initialize(mapload, obj/item/seeds/new_seed)
+ . = ..()
+ RegisterSignal(src, COMSIG_ITEM_APPLIED_TO_LIMB, PROC_REF(applied_to_limb))
+ color = COLOR_PINK
+ animate(src, color = COLOR_YELLOW, loop = -1, time = 10 SECONDS)
+ animate(color = COLOR_PINK, loop = -1, time = 10 SECONDS)
+
+/obj/item/food/grown/flower/poppy/blessed/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/item/food/grown/flower/poppy/blessed/equipped(mob/user, slot, initial)
+ . = ..()
+ if(slot & slot_flags)
+ ADD_TRAIT(user, TRAIT_NOCRITDAMAGE, REF(src))
+ START_PROCESSING(SSobj, src)
+
+/obj/item/food/grown/flower/poppy/blessed/dropped(mob/user, silent)
+ . = ..()
+ REMOVE_TRAIT(user, TRAIT_NOCRITDAMAGE, REF(src))
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/food/grown/flower/poppy/blessed/process(seconds_per_tick)
+ if(isliving(loc))
+ heal_crit(seconds_per_tick)
+ return
+
+ if(isbodypart(loc))
+ heal_limb(seconds_per_tick)
+ return
+
+ stack_trace("[type] processing in a non-living or non-bodypart mob")
+ return PROCESS_KILL
+
+/obj/item/food/grown/flower/poppy/blessed/proc/heal_crit(seconds_per_tick)
+ var/mob/living/wearer = loc
+ if(wearer.stat == STABLE || wearer.stat == DEAD)
+ return
+
+ wearer.adjust_brute_loss(-0.5 * seconds_per_tick, updating_health = FALSE)
+ wearer.adjust_fire_loss(-0.5 * seconds_per_tick, updating_health = FALSE)
+ wearer.adjust_tox_loss(-0.25 * seconds_per_tick, updating_health = FALSE, forced = TRUE)
+ wearer.adjust_oxy_loss(-0.25 * seconds_per_tick, updating_health = FALSE)
+ wearer.updatehealth()
+ if(wearer.stat == STABLE)
+ save_count += 1
+ if(prob(25 * save_count))
+ to_chat(wearer, span_mansus("[src] withers away."))
+ burn()
+
+ else if(SPT_PROB(33, seconds_per_tick))
+ new /obj/effect/temp_visual/heal(get_turf(src), pick(COLOR_PINK, COLOR_YELLOW))
+ if(prob(20))
+ wearer.visible_message(span_mansus("The petals of [wearer]'s [name] glow faintly."))
+
+/obj/item/food/grown/flower/poppy/blessed/proc/heal_limb(seconds_per_tick)
+ var/obj/item/bodypart/limb = loc
+ if(!length(limb.wounds))
+ to_chat(limb.owner, span_mansus("[src] withers away."))
+ burn()
+ return
+
+ var/healed = FALSE
+ for(var/datum/wound/wound as anything in limb.wounds)
+ if(wound.blood_flow > 0)
+ wound.adjust_blood_flow(-0.2 * seconds_per_tick)
+ healed = TRUE
+
+ if(istype(wound, /datum/wound/blunt/bone))
+ var/datum/wound/blunt/bone/broken_bone = wound
+ broken_bone.regen_ticks_current += 2.5 * seconds_per_tick
+ broken_bone.processes = TRUE // to auto-healing
+ broken_bone.healing = TRUE
+ healed = TRUE
+
+ if(istype(wound, /datum/wound/burn/flesh))
+ var/datum/wound/burn/flesh/burned_flesh = wound
+ burned_flesh.flesh_healing += 0.5 * seconds_per_tick
+ burned_flesh.sanitization += 0.2 * seconds_per_tick
+ healed = TRUE
+
+ if(healed && SPT_PROB(33, seconds_per_tick))
+ new /obj/effect/temp_visual/heal(get_turf(src), pick(COLOR_PINK, COLOR_YELLOW))
+ if(prob(20))
+ limb.owner.visible_message(span_mansus("The petals of [src] on [limb.owner]'s [limb.plaintext_zone] glow faintly."))
+
+#define LIMB_CATEGORY_POPPY "poppy"
+
+/obj/item/food/grown/flower/poppy/blessed/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
+ if(!iscarbon(interacting_with))
+ return NONE
+
+ var/mob/living/carbon/carbon_target = interacting_with
+ var/obj/item/bodypart/target_limb = carbon_target.get_bodypart(user.zone_selected)
+ if(isnull(target_limb))
+ carbon_target.balloon_alert(user, "no limb there!")
+ return ITEM_INTERACT_BLOCKING
+
+ if(!length(target_limb.wounds))
+ carbon_target.balloon_alert(user, "no wounds to heal!")
+ return ITEM_INTERACT_BLOCKING
+
+ if(LAZYACCESS(target_limb.applied_items, LIMB_CATEGORY_POPPY))
+ carbon_target.balloon_alert(user, "already healing!")
+ return ITEM_INTERACT_BLOCKING
+
+ user.visible_message(
+ span_notice("[user] lays [src] over [carbon_target == user ? "[user.p_their()] own" : "[carbon_target]'s"] [target_limb.plaintext_zone]."),
+ span_notice("You lay [src] over [carbon_target == user ? "your" : "[carbon_target]'s"] [target_limb.plaintext_zone]."),
+ visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE,
+ vision_distance = 5,
+ )
+ if(!do_after(user, 2 SECONDS, carbon_target))
+ return ITEM_INTERACT_BLOCKING
+
+ user.visible_message(
+ span_mansus("[user] lays [src] over [carbon_target == user ? "[user.p_their()] own" : "[carbon_target]'s"] [target_limb.plaintext_zone]. The petals begin to glow, as vines begin to wrap the limb."),
+ span_mansus("You lay [src] over [carbon_target == user ? "your" : "[carbon_target]'s"] [target_limb.plaintext_zone]. The petals begin to glow, as vines begin to wrap the limb."),
+ visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE,
+ vision_distance = 5,
+ )
+ target_limb.apply_item(src, LIMB_CATEGORY_POPPY)
+ return ITEM_INTERACT_SUCCESS
+
+/obj/item/food/grown/flower/poppy/blessed/proc/applied_to_limb(mob/living/user, obj/item/bodypart/limb)
+ SIGNAL_HANDLER
+ START_PROCESSING(SSobj, src)
+
+#undef LIMB_CATEGORY_POPPY
diff --git a/code/modules/antagonists/heretic/items/crimson_cleaver.dm b/code/modules/antagonists/heretic/items/crimson_cleaver.dm
new file mode 100644
index 000000000000..4ac87819de2b
--- /dev/null
+++ b/code/modules/antagonists/heretic/items/crimson_cleaver.dm
@@ -0,0 +1,428 @@
+/obj/item/knife/butcher/heretic
+ name = "\improper Crimson Cleaver"
+ desc = "A cleaver with an intricately designed red handle and slightly curved back. A tool of war, rather than cooking, no doubt."
+ icon = 'icons/obj/weapons/khopesh.dmi'
+ force = 20
+ throwforce = 20
+ wound_bonus = 30
+ exposed_wound_bonus = 0
+ toolspeed = 0.25
+ armour_penetration = 50
+ throw_speed = 4
+ throw_range = 7
+ /// Cooldown between lifesteal triggers
+ COOLDOWN_DECLARE(lifesteal_cd)
+ /// Range that which it will boomerang back to the wielder
+ var/boomerange_range = 5
+ /// Examine text for the boomerang component
+ var/boomerang_examine = ""
+
+/obj/item/knife/butcher/heretic/Initialize(mapload)
+ . = ..()
+ add_lifesteal_filter()
+ boomerang_examine ||= span_mansus("[src]'s blade is curved so subtly, that it may return to your hand when thrown...")
+ AddComponent(/datum/component/boomerang, boomerange_range, FALSE, boomerang_examine)
+
+/obj/item/knife/butcher/heretic/equipped(mob/living/user, slot, initial)
+ . = ..()
+ if(!isliving(user))
+ return
+ if(IS_HERETIC_OR_MONSTER(user))
+ AddComponent(/datum/component/boomerang, boomerange_range, TRUE, boomerang_examine)
+ else
+ AddComponent(/datum/component/boomerang, boomerange_range, FALSE, boomerang_examine)
+ user.apply_status_effect(/datum/status_effect/crimson_cleaver_curse)
+
+/obj/item/knife/butcher/heretic/proc/add_lifesteal_filter()
+ add_filter("lifesteal_filter", 1.5, outline_filter(1.5, LIGHT_COLOR_BLOOD_MAGIC))
+ var/the_filter = get_filter("lifesteal_filter")
+ animate(the_filter, alpha = 0) // start at 0 alpha
+ animate(the_filter, alpha = 150, time = 3 SECONDS, loop = -1, easing = SINE_EASING) // fade in and out
+ animate(alpha = 50, time = 3 SECONDS, loop = -1, easing = SINE_EASING)
+
+/obj/item/knife/butcher/heretic/proc/remove_lifesteal_filter()
+ var/the_filter = get_filter("lifesteal_filter")
+ animate(the_filter, alpha = 0, time = 1 SECONDS, easing = SINE_EASING)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/datum, remove_filter), "lifesteal_filter"), 2 SECONDS)
+
+/obj/item/knife/butcher/heretic/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+ . = ..()
+ var/mob/living/thrower = throwingdatum?.get_thrower()
+ if(!isliving(hit_atom) || !isliving(thrower) || hit_atom == thrower || !COOLDOWN_FINISHED(src, lifesteal_cd))
+ return
+
+ lifesteal(hit_atom, thrower, coefficient = 0.75, amount = throwforce)
+
+/obj/item/knife/butcher/heretic/proc/lifesteal(mob/living/target, mob/living/user, coefficient = 1, amount = force)
+ if(target == user)
+ CRASH("[type] attempted to lifesteal from one guy to themselves")
+
+ // you can brutalize corpses a little bit, but don't go too crazy
+ if(target.stat == DEAD && target.get_brute_loss() > target.maxHealth * 2)
+ return
+
+ if(user.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY, charge_cost = (coefficient < 1 ? 0 : 1)) )
+ start_lifesteal_cd(6 SECONDS)
+ if(coefficient < 1)
+ if(IS_HERETIC_OR_MONSTER(user))
+ to_chat(user, span_warning("You fail to unleash the energies within [src] - something is suppressing it!"))
+ else
+ to_chat(user, span_warning("Some evil energy attempts to escape from [src], but you suppress it!"))
+ return
+
+ if(target.can_block_magic(MAGIC_RESISTANCE, charge_cost = 1))
+ start_lifesteal_cd(8 SECONDS)
+ if(IS_HERETIC_OR_MONSTER(user))
+ to_chat(user, span_warning("Your attempt to siphon the life force of [target] is resisted!"))
+ else
+ to_chat(user, span_warning("Some evil energy attempts to flow into [target], but they resist it!"))
+ return
+
+ user.adjust_brute_loss(-0.5 * coefficient * amount)
+ user.adjust_nutrition(0.75 * coefficient * amount)
+ target.transfer_blood_to(user, coefficient * amount, ignore_low_blood = TRUE, ignore_incompatibility = TRUE, transfer_viruses = FALSE)
+ target.adjust_nutrition(-0.75 * coefficient * amount)
+ to_chat(target, span_warning("You feel your life force drain away..."))
+ new /obj/effect/temp_visual/cleave(get_turf(target))
+
+ for(var/datum/wound/active_wound as anything in astype(user, /mob/living/carbon)?.all_wounds)
+ if(active_wound.blood_flow)
+ active_wound.adjust_blood_flow(-0.1 * coefficient * amount)
+
+ start_lifesteal_cd(10 SECONDS)
+
+ // using the power satiates the curse
+ if(!IS_HERETIC_OR_MONSTER(user))
+ var/datum/status_effect/crimson_cleaver_curse/curse = user.has_status_effect(/datum/status_effect/crimson_cleaver_curse)
+ curse?.curse_timer -= ceil(4 * coefficient)
+ user.mob_mood?.direct_sanity_drain(-0.5 * coefficient * amount)
+ switch(user.mob_mood?.sanity)
+ if(SANITY_CRAZY + 1 to SANITY_UNSTABLE)
+ user.apply_damage(-0.2 * coefficient * amount, BRAIN)
+ if(SANITY_INSANE + 1 to SANITY_CRAZY)
+ user.apply_damage(-0.4 * coefficient * amount, BRAIN)
+ if(SANITY_INSANE)
+ user.apply_damage(-0.8 * coefficient * amount, BRAIN)
+
+/obj/item/knife/butcher/heretic/proc/start_lifesteal_cd(duration = 10 SECONDS)
+ if(!COOLDOWN_FINISHED(src, lifesteal_cd))
+ return // if cooldown is already running, that's fine, but don't reset it
+
+ COOLDOWN_START(src, lifesteal_cd, duration)
+ remove_lifesteal_filter()
+ addtimer(CALLBACK(src, PROC_REF(add_lifesteal_filter)), duration)
+
+/obj/item/knife/butcher/heretic/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
+ if(!isliving(target) || !isliving(user) || target == user)
+ return
+
+ var/is_cleaving = LAZYACCESS(attack_modifiers, "cleave")
+ if(is_cleaving || COOLDOWN_FINISHED(src, lifesteal_cd))
+ lifesteal(target, user, coefficient = (is_cleaving ? 0.5 : 1), amount = LAZYACCESS(attack_modifiers, DAMAGE_DONE))
+
+ if(is_cleaving)
+ return
+
+ // attacking satisfies the curse
+ if(!IS_HERETIC_OR_MONSTER(user))
+ var/datum/status_effect/crimson_cleaver_curse/curse = user.has_status_effect(/datum/status_effect/crimson_cleaver_curse)
+ curse?.curse_timer -= (is_cleaving ? 2 : 1)
+
+ var/turf/dir_to_target = get_dir(user, target)
+ var/turf/left_turf = get_step(target, turn(dir_to_target, 90))
+ var/turf/right_turf = get_step(target, turn(dir_to_target, -90))
+
+ LAZYSET(attack_modifiers, "cleave", TRUE)
+ if(isopenturf(target.loc))
+ cleave_attack(target.loc, user, modifiers, attack_modifiers, list(target))
+ if(isopenturf(left_turf))
+ cleave_attack(left_turf, user, modifiers, attack_modifiers)
+ if(isopenturf(right_turf))
+ cleave_attack(right_turf, user, modifiers, attack_modifiers)
+
+/obj/item/knife/butcher/heretic/proc/cleave_attack(turf/open/cleaving_over, mob/user, list/modifiers, list/attack_modifiers, list/blacklist_targets)
+ var/list/attack_pool = list()
+ // Collect viable mobs
+ for(var/mob/living/cleaved in cleaving_over)
+ if(cleaved.invisibility > user.see_invisible || !cleaved.IsReachableBy(user, reach) || (cleaved in blacklist_targets))
+ continue
+ attack_pool += cleaved
+ // Sort by health, most damaged first
+ sortTim(attack_pool, GLOBAL_PROC_REF(cmp_mob_health))
+ // Attack the first valid mob in the pool
+ for(var/mob/living/cleaved in attack_pool)
+ melee_attack_chain(user, cleaved, modifiers, attack_modifiers)
+ return
+
+/datum/status_effect/crimson_cleaver_curse
+ id = "crimson_cleaver_curse"
+ alert_type = null
+ remove_on_fullheal = TRUE
+ /// Counter for the curse's progression
+ VAR_FINAL/curse_timer = 0
+ /// Tracks the level the curse is at
+ VAR_PRIVATE/curse_level = 0
+
+/datum/status_effect/crimson_cleaver_curse/on_apply()
+ . = ..()
+ RegisterSignal(owner, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(on_equipped_item))
+ RegisterSignal(owner, COMSIG_MOB_UNEQUIPPED_ITEM, PROC_REF(on_unequipped_item))
+
+/datum/status_effect/crimson_cleaver_curse/on_remove()
+ . = ..()
+ UnregisterSignal(owner, COMSIG_MOB_EQUIPPED_ITEM)
+ UnregisterSignal(owner, COMSIG_MOB_UNEQUIPPED_ITEM)
+
+ for(var/obj/item/knife/butcher/heretic/cleaver in owner)
+ REMOVE_TRAIT(cleaver, TRAIT_NODROP, TRAIT_STATUS_EFFECT(id))
+
+ owner.clear_mood_event(id)
+ owner.clear_mood_event("[id]_lost")
+ owner.remove_status_effect(/datum/status_effect/forced_combat)
+ owner.remove_traits(list(
+ TRAIT_BATON_RESISTANCE,
+ TRAIT_DISCOORDINATED_TOOL_USER,
+ TRAIT_EASYBLEED,
+ TRAIT_FLESH_DESIRE,
+ TRAIT_NOGUNS,
+ TRAIT_UNNATURAL_RED_GLOWY_EYES,
+ TRAIT_VORACIOUS,
+ ), TRAIT_STATUS_EFFECT(id))
+ astype(owner, /mob/living/carbon/human)?.remove_eye_color(EYE_COLOR_CULTLIKE_PRIORITY)
+
+/datum/status_effect/crimson_cleaver_curse/update_particles()
+ if(curse_level < 3)
+ QDEL_NULL(particle_effect)
+ return
+
+ particle_effect ||= new(owner, /particles/crimson_curse)
+ particle_effect.alpha = 200
+
+/datum/status_effect/crimson_cleaver_curse/proc/on_equipped_item(datum/source, obj/item/equipped, ...)
+ SIGNAL_HANDLER
+
+ if(istype(equipped, /obj/item/knife/butcher/heretic) && curse_level >= 3)
+ ADD_TRAIT(equipped, TRAIT_NODROP, TRAIT_STATUS_EFFECT(id))
+
+ for(var/obj/item/knife/butcher/heretic/cleaver in owner)
+ if(cleaver != equipped)
+ return
+
+ switch(curse_level)
+ if(2)
+ to_chat(owner, span_mansus("You feel pleased that the cleaver has returned to your hand."))
+ owner.add_mood_event("[id]_lost", /datum/mood_event/crimson_curse/reunited/low)
+
+ if(3)
+ to_chat(owner, span_hypnophrase("The cleaver is back! Time to get to work!"))
+ owner.add_mood_event("[id]_lost", /datum/mood_event/crimson_curse/reunited/medium)
+
+ if(4)
+ to_chat(owner, span_hypnophrase("YES! THERE IS STILL BLOOD TO BE SPILT!"))
+ owner.add_mood_event("[id]_lost", /datum/mood_event/crimson_curse/reunited/severe)
+
+/datum/status_effect/crimson_cleaver_curse/proc/on_unequipped_item(datum/source, obj/item/unequipped, ...)
+ SIGNAL_HANDLER
+
+ if(istype(unequipped, /obj/item/knife/butcher/heretic) && curse_level >= 3)
+ REMOVE_TRAIT(unequipped, TRAIT_NODROP, TRAIT_STATUS_EFFECT(id))
+
+ for(var/obj/item/knife/butcher/heretic/cleaver in owner)
+ if(cleaver != unequipped)
+ return
+
+ switch(curse_level)
+ if(2)
+ to_chat(owner, span_mansus("You feel reluctant to part with the cleaver."))
+ owner.add_mood_event("[id]_lost", /datum/mood_event/crimson_curse/separated/low)
+
+ if(3)
+ to_chat(owner, span_hypnophrase("No! The cleaver! How will I satiate myself now?!"))
+ owner.add_mood_event("[id]_lost", /datum/mood_event/crimson_curse/separated/medium)
+
+ if(4)
+ to_chat(owner, span_hypnophrase("MY TOOL! MY WEAPON! IT HAS BEEN WRESTED FROM ME! I MUST HAVE IT BACK!"))
+ owner.add_mood_event("[id]_lost", /datum/mood_event/crimson_curse/separated/severe)
+
+/datum/status_effect/crimson_cleaver_curse/tick(seconds_between_ticks)
+ var/curse_ticking = FALSE
+ for(var/obj/item/knife/butcher/heretic/cleaver in owner)
+ // it's clearly mind based, and it's clearly magical, and it's clearly unholy. so everything fits
+ if(owner.can_block_magic(ALL_MAGIC_RESISTANCE, charge_cost = SPT_PROB(50, seconds_between_ticks) ? 1 : 0))
+ to_chat(owner, span_notice("The cleaver thrums ominously."))
+ else
+ curse_timer += seconds_between_ticks
+ curse_ticking = TRUE
+
+ if(!curse_ticking)
+ curse_timer -= seconds_between_ticks
+ if(curse_timer <= 0)
+ qdel(src)
+ return
+
+ if(curse_timer > 10)
+ if(curse_level < 1)
+ curse_level = 1
+ to_chat(owner, span_mansus("The cleaver sits firmly in your hand. It feels unnaturally well balanced - it would be a joy to swing."))
+ owner.add_mood_event(id, /datum/mood_event/crimson_curse/low)
+ return
+ else
+ if(curse_level == 1)
+ curse_level = 0
+ to_chat(owner, span_mansus("Your mind clears. The cleaver still sits in your hand. It unsettles you."))
+ owner.clear_mood_event(id)
+ return
+
+ if(curse_timer > 30)
+ if(curse_level < 2)
+ curse_level = 2
+ to_chat(owner, span_mansus("The cleaver starts to feel heavy in your hand. You feel like bringing it down. Hard."))
+ owner.add_mood_event(id, /datum/mood_event/crimson_curse/medium)
+ return
+ else
+ if(curse_level == 2)
+ curse_level = 1
+ to_chat(owner, span_mansus("The cleaver starts to slip from your hand. Your grip is no longer as sure as it was."))
+ owner.clear_mood_event(id)
+ return
+
+ if(curse_timer > 60)
+ if(curse_level < 3)
+ curse_level = 3
+ to_chat(owner, span_mansus("The cleaver was made to spill blood and cleave flesh. You grip it with all your life, compelled to fulfill its purpose."))
+ owner.add_mood_event(id, /datum/mood_event/crimson_curse/severe)
+ for(var/obj/item/knife/butcher/heretic/cleaver in owner)
+ ADD_TRAIT(src, TRAIT_NODROP, TRAIT_STATUS_EFFECT(id))
+
+ owner.add_traits(list(
+ TRAIT_BATON_RESISTANCE,
+ TRAIT_DISCOORDINATED_TOOL_USER,
+ TRAIT_EASYBLEED,
+ TRAIT_FLESH_DESIRE,
+ TRAIT_NOGUNS,
+ TRAIT_UNNATURAL_RED_GLOWY_EYES,
+ TRAIT_VORACIOUS,
+ ), TRAIT_STATUS_EFFECT(id))
+ astype(owner, /mob/living/carbon/human)?.add_eye_color(BLOODCULT_EYE, EYE_COLOR_CULTLIKE_PRIORITY)
+ curse_timer += 10 // little buffer
+ update_particles()
+ return
+
+ if(SPT_PROB(30, seconds_between_ticks))
+ owner.adjust_nutrition(-10 * HUNGER_FACTOR)
+ owner.overeatduration = max(owner.overeatduration - 200 SECONDS, 0)
+ if(prob(33))
+ to_chat(owner, span_notice(pick(
+ "The cleaver yearns to cut.",
+ "The hunger pangs are back...",
+ "You can't stop thinking about meat...",
+ "You hunger for flesh.",
+ )))
+ if(SPT_PROB(10, seconds_between_ticks))
+ owner.adjust_hallucinations_up_to(6 SECONDS, 60 SECONDS)
+ if(SPT_PROB(20, seconds_between_ticks))
+ owner.adjust_jitter_up_to(4 SECONDS, 30 SECONDS)
+ owner.adjust_staggered_up_to(2 SECONDS, 10 SECONDS)
+ if(SPT_PROB(20, seconds_between_ticks))
+ owner.adjust_eye_blur_up_to(2 SECONDS, 30 SECONDS)
+
+ else
+ if(curse_level == 3)
+ curse_level = 2
+ to_chat(owner, span_mansus("The cleaver's compulsions fade. Your fingers unclench from the hilt."))
+ owner.clear_mood_event(id)
+ for(var/obj/item/knife/butcher/heretic/cleaver in owner)
+ REMOVE_TRAIT(src, TRAIT_NODROP, TRAIT_STATUS_EFFECT(id))
+
+ owner.remove_status_effect(/datum/status_effect/eldritch_painting/desire)
+ owner.remove_traits(list(
+ TRAIT_BATON_RESISTANCE,
+ TRAIT_DISCOORDINATED_TOOL_USER,
+ TRAIT_EASYBLEED,
+ TRAIT_FLESH_DESIRE,
+ TRAIT_NOGUNS,
+ TRAIT_UNNATURAL_RED_GLOWY_EYES,
+ TRAIT_VORACIOUS,
+ ), TRAIT_STATUS_EFFECT(id))
+ astype(owner, /mob/living/carbon/human)?.remove_eye_color(EYE_COLOR_CULTLIKE_PRIORITY)
+ update_particles()
+ return
+
+ if(curse_timer > 120)
+ if(curse_level < 4)
+ curse_level = 4
+ to_chat(owner, span_mansus("The cleaver is an extension of you. It is a tool to rend flesh from bone. You are a tool to rend flesh from bone."))
+ to_chat(owner, span_hypnophrase("Swing it. Swing it now."))
+ owner.add_mood_event(id, /datum/mood_event/crimson_curse/extreme)
+ owner.apply_status_effect(/datum/status_effect/forced_combat, INFINITY)
+ curse_timer += 20 // medium buffer
+ return
+
+ else
+ if(curse_level == 4)
+ curse_level = 3
+ to_chat(owner, span_mansus("You return to your senses. Or have you truly? The cleaver is still in your hands."))
+ owner.clear_mood_event(id)
+ owner.remove_status_effect(/datum/status_effect/forced_combat)
+ return
+
+/datum/mood_event/crimson_curse/low
+ description = "What a strange cleaver."
+
+/datum/mood_event/crimson_curse/medium
+ description = "It'd be pretty nice to swing that cleaver around."
+ mood_change = -2
+
+/datum/mood_event/crimson_curse/severe
+ description = "I feel a hunger that only the cleaver can sate."
+ mood_change = -4
+
+/datum/mood_event/crimson_curse/extreme
+ description = "SWING! SWING! SWING!"
+ mood_change = -8
+ special_screen_obj = "mood_despair"
+
+/datum/mood_event/crimson_curse/separated
+ timeout = 6 MINUTES
+
+/datum/mood_event/crimson_curse/separated/low
+ description = "I think I need the cleaver back."
+ mood_change = -5
+
+/datum/mood_event/crimson_curse/separated/medium
+ description = "I need the cleaver back. I don't think I can live without it."
+ mood_change = -12
+
+/datum/mood_event/crimson_curse/separated/severe
+ description = "I HAVE BEEN SEPARATED FROM MY TOOL! I MUST HAVE IT BACK!"
+ mood_change = -48
+ special_screen_obj = "mood_despair"
+
+/datum/mood_event/crimson_curse/reunited
+ timeout = 1 MINUTES
+
+/datum/mood_event/crimson_curse/reunited/low
+ description = "I feel a little better now that I have the cleaver back."
+ mood_change = 2
+
+/datum/mood_event/crimson_curse/reunited/medium
+ description = "The cleaver is back in my hands. Time to get to work!"
+ mood_change = 6
+
+/datum/mood_event/crimson_curse/reunited/severe
+ description = "My tool, my weapon, my body! I feel whole again!"
+ mood_change = 12
+
+/particles/crimson_curse
+ icon = 'icons/effects/particles/echo.dmi'
+ icon_state = list("echo1" = 3, "echo2" = 1, "echo3" = 1)
+ width = 40
+ height = 80
+ count = 100
+ spawning = 1
+ lifespan = 1.5 SECONDS
+ fade = 1 SECONDS
+ friction = 0.5
+ position = generator(GEN_SPHERE, 12, 12, NORMAL_RAND)
+ drift = generator(GEN_VECTOR, list(-1, 1), list(1, 1), NORMAL_RAND)
+ color = LIGHT_COLOR_BLOOD_MAGIC
diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm
index 7e8c5f03df9b..b9235a2ee3fb 100644
--- a/code/modules/antagonists/heretic/items/heretic_armor.dm
+++ b/code/modules/antagonists/heretic/items/heretic_armor.dm
@@ -860,10 +860,6 @@
var/rusted = FALSE
/// Atom used to animate our overlay
var/atom/movable/rust_overlay
- /// The mutable that is actually overlayed on the mob
- var/mutable_appearance/rust_appearance
- /// identifier for the overlay
- var/static/overlay_id = 0
/// Overlay for the armor object
var/image/object_overlay
/// Overlay for the hood object
@@ -873,7 +869,6 @@
/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/Initialize(mapload)
. = ..()
- overlay_id++
if(!object_overlay)
object_overlay = image(icon, icon_state = "rust_armor_overlay")
if(!hood_object_overlay)
@@ -885,12 +880,10 @@
register_turf_listener(user)
rust_overlay = new()
rust_overlay.icon = 'icons/mob/clothing/suits/armor.dmi'
- rust_overlay.render_target = "*rust_overlay_[overlay_id]"
+ rust_overlay.render_target = "*rust_overlay_[REF(rust_overlay)]"
rust_overlay.vis_flags |= VIS_INHERIT_DIR | VIS_INHERIT_LAYER | VIS_INHERIT_ID
user.vis_contents += rust_overlay // Should be invisible, we just update the sprite as needed
- rust_appearance = new /mutable_appearance()
- rust_appearance.render_source = "*rust_overlay_[overlay_id]"
update_appearance(UPDATE_ICON)
/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/on_robes_lost(mob/user, obj/item/clothing/suit/hooded/cultrobes/eldritch/robes)
@@ -908,7 +901,6 @@
REMOVE_TRAIT(user, TRAIT_PIERCEIMMUNE, REF(src))
cut_overlay(object_overlay)
QDEL_NULL(rust_overlay)
- QDEL_NULL(rust_appearance)
/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/robes_side_effect(mob/living/user)
. = ..()
@@ -1005,11 +997,16 @@
/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
+ // Visual-only previews and non-heretics have no animated rust target.
+ if(isnull(rust_overlay))
+ return
// Should basically catch toggling the hood on/off while standing on rust
if(rusted)
- rust_overlay?.icon_state = "[worn_icon_state]" + "_overlay"
+ rust_overlay.icon_state = "[worn_icon_state]" + "_overlay"
else
- rust_overlay?.icon_state = null
+ rust_overlay.icon_state = null
+ var/mutable_appearance/rust_appearance = mutable_appearance()
+ rust_appearance.render_source = rust_overlay.render_target
. += rust_appearance
/obj/item/clothing/head/hooded/cult_hoodie/eldritch/rust
diff --git a/code/modules/antagonists/heretic/items/heretic_shoes.dm b/code/modules/antagonists/heretic/items/heretic_shoes.dm
index 3c7a94d829ce..eee0789f7b8d 100644
--- a/code/modules/antagonists/heretic/items/heretic_shoes.dm
+++ b/code/modules/antagonists/heretic/items/heretic_shoes.dm
@@ -1,9 +1,6 @@
/obj/item/clothing/shoes/greaves_of_the_prophet
- name = "\improper Joint-snap sabatons"
+ name = "joint-snap sabatons"
desc = "Sabatons made out of rugged, worn iron. Feels more stable than the ground they tread on. They're caked in a thin layer of rust - and yet, the sight of it fills you with odd relief."
icon_state = "hereticgreaves"
resistance_flags = ACID_PROOF | FIRE_PROOF | LAVA_PROOF
-
-/obj/item/clothing/shoes/greaves_of_the_prophet/Initialize(mapload)
- . = ..()
- attach_clothing_traits(list(TRAIT_NO_SLIP_WATER, TRAIT_NO_SLIP_ICE, TRAIT_NO_SLIP_SLIDE, TRAIT_NO_SLIP_ALL))
+ clothing_traits = list(TRAIT_NO_SLIP_WATER, TRAIT_NO_SLIP_ICE, TRAIT_NO_SLIP_SLIDE, TRAIT_NO_SLIP_ALL)
diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm
index 8d97e5d3d1e0..ef31baa0e353 100644
--- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm
@@ -400,7 +400,7 @@
steel_spell?.cooldown_time /= 2
var/mob/living/carbon/human/heretic = user
- heretic.physiology.knockdown_mod = 0.75 // Otherwise knockdowns would probably overpower the stun absorption effect.
+ MODIFY_PHYSIOLOGY(heretic, PHYS_COEFF_KNOCKDOWN, 0.75)
/datum/heretic_knowledge/ultimate/blade_final/proc/on_eldritch_blade(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade)
SIGNAL_HANDLER
diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm
index 97bde95a079c..3d2f57afa8c6 100644
--- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm
@@ -44,7 +44,7 @@
guaranteed_side_tier2 = /datum/heretic_knowledge/crucible
robes = /datum/heretic_knowledge/armor/flesh
knowledge_tier3 = /datum/heretic_knowledge/summon/raw_prophet
- guaranteed_side_tier3 = /datum/heretic_knowledge/spell/crimson_cleave
+ guaranteed_side_tier3 = /datum/heretic_knowledge/crimson_cleave
blade = /datum/heretic_knowledge/blade_upgrade/flesh
knowledge_tier4 = /datum/heretic_knowledge/summon/stalker
ascension = /datum/heretic_knowledge/ultimate/flesh_final
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 eaf21689dc1c..ae6f04d6ff71 100644
--- a/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_four.dm
+++ b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_four.dm
@@ -85,32 +85,75 @@
research_tree_icon_state = "rustgrenade"
drafting_tier = 4
-/datum/heretic_knowledge/spell/crimson_cleave
- name = "Crimson Cleave"
- desc = "Grants you Crimson Cleave, a targeted spell which siphons health in a small AoE.\
-
Also cleanses all wounds upon casting."
+/datum/heretic_knowledge/crimson_cleave
+ name = "The Crimson Cleaver"
+ desc = "Allows you to forge a Crimson Cleaver, a terrifying weapon that thirsts for blood.
\
+ Its strikes heal you for the damage it inflicts, and it can cleave through multiple enemies at once. \
+ It is also a moderately effective thrown weapon, returning to the wielder after being thrown."
gain_text = "At first I didn't understand these instruments of war, but the Priest \
told me to use them regardless. Soon, he said, I would know them well."
+ transmute_text = "Transmute a butcher's cleaver and some blood - \
+ either a pool or droplets, bloodied rags or bandages, a beaker or vial, or even the cleaver itself stained in blood."
required_atoms = list(
- list(/obj/effect/decal/cleanable/blood, /obj/item/rag, /obj/item/stack/medical/wrap/gauze) = 1,
+ /obj/item/knife/butcher = 1,
)
- action_to_add = /datum/action/cooldown/spell/pointed/crimson_cleave
+ result_atoms = list(/obj/item/knife/butcher/heretic)
+ banned_atom_types = list(/obj/item/knife/butcher/heretic)
cost = 2
drafting_tier = 4
- max_charges = 3
- path_recharge_amount = 0.0
- focus_recharge_amount = 0.33
- holywater_drain_amount = 0.33
+ research_tree_icon_path = /obj/item/knife/butcher/heretic::icon
+ research_tree_icon_state = /obj/item/knife/butcher/heretic::icon_state
-/datum/heretic_knowledge/spell/crimson_cleave/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc)
+/datum/heretic_knowledge/crimson_cleave/prepare_atom_for_ritual_test(atom/what)
. = ..()
+ what.add_blood_DNA(list("Test DNA" = get_blood_type(/datum/blood_type/human/o_minus)))
+
+/datum/heretic_knowledge/crimson_cleave/get_extra_requirements()
+ return "some blood - either a pool or droplets, bloodied rags or bandages, a beaker or vial, or even the cleaver itself stained in blood"
+
+/datum/heretic_knowledge/crimson_cleave/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc)
+ for(var/obj/item/knife/butcher/cleaver in atoms)
+ selected_atoms += cleaver
+ if(GET_ATOM_BLOOD_DNA_LENGTH(cleaver))
+ return TRUE // two for one deal
+ break
+
+ for(var/obj/effect/decal/cleanable/blood/blood in atoms)
+ selected_atoms += blood // blood is blood
+ return TRUE
+
for(var/obj/item/rag/rag in atoms)
- if(!GET_ATOM_BLOOD_DNA_LENGTH(rag))
- atoms -= rag
+ if(GET_ATOM_BLOOD_DNA_LENGTH(rag))
+ selected_atoms += rag
+ return TRUE
for(var/obj/item/stack/medical/wrap/gauze/medwrap in atoms)
- if(!GET_ATOM_BLOOD_DNA_LENGTH(medwrap))
- atoms -= medwrap
+ if(GET_ATOM_BLOOD_DNA_LENGTH(medwrap))
+ selected_atoms += medwrap
+ return TRUE
+
+ for(var/obj/item/reagent_containers/container in atoms)
+ for(var/datum/reagent/reagent_content as anything in container.reagents.reagent_list)
+ if(LAZYACCESS(reagent_content.data, BLOOD_DATA_DNA))
+ selected_atoms += container
+ return TRUE
+
+ loc.balloon_alert(user, "ritual failed, no blood!")
+ to_chat(user, span_mansus("You are missing blood in order to complete the ritual \"[name]\"."))
+ return FALSE
+
+/datum/heretic_knowledge/crimson_cleave/cleanup_atoms(list/selected_atoms)
+ for(var/obj/item/reagent_containers/container in selected_atoms)
+ for(var/datum/reagent/reagent_content as anything in container.reagents.reagent_list)
+ if(LAZYACCESS(reagent_content.data, BLOOD_DATA_DNA))
+ container.reagents.del_reagent(reagent_content.type)
+ selected_atoms -= container
+
+ for(var/obj/item/stack/medical/wrap/gauze/medwrap in selected_atoms)
+ medwrap.use(1)
+ selected_atoms -= medwrap
+
+ return ..()
/datum/heretic_knowledge/rifle
name = "Lionhunter's Rifle"
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 66c8f5f4a002..439914228301 100644
--- a/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_one.dm
+++ b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_one.dm
@@ -306,3 +306,93 @@
if(feedback)
to_chat(the_spell.owner, span_mansus("You need a Living Heart to cast [the_spell]!"))
return SPELL_CANCEL_CAST
+
+/datum/heretic_knowledge/lodestone
+ name = "Rhythmic Lodestone"
+ desc = "Imbue an object with a Lodestone.
\
+ The Lodestone pulses in rhythm with your Living Heart, allowing you to track it from any distance - so long as it is not destroyed."
+ transmute_text = "Transmute a GPS and up to three of any object."
+ gain_text = "I was lost. No one had claimed navigating the Mansus was a simple task. \
+ I needed to recenter myself. Focus. Listen to my heartbeat."
+ notice = "Up to three items can be imbued at once. Weapons, equipment, and valuables are prioritized."
+ required_atoms = list(
+ /obj/item/gps = 1,
+ )
+ cost = 1
+ drafting_tier = 1
+ is_shop_only = TRUE
+ research_tree_icon_path = /obj/item/gps::icon
+ research_tree_icon_state = /obj/item/gps::icon_state
+
+/datum/heretic_knowledge/lodestone/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc)
+ for(var/obj/whatever in atoms)
+ if(istype(whatever, /obj/item/gps) || whatever.anchored)
+ continue
+ selected_atoms += whatever
+
+ if(!length(selected_atoms))
+ loc.balloon_alert(user, "no items to imbue!")
+ return FALSE
+ return TRUE
+
+/datum/heretic_knowledge/lodestone/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc)
+ var/lodestones_created = 0
+
+ var/list/valuable_pool = list()
+ var/list/equipment_pool = list()
+ var/list/weapon_pool = list()
+ var/list/item_pool = list()
+ var/list/leftover_pool = list()
+ for(var/obj/new_trackable in selected_atoms)
+ if(istype(new_trackable, /obj/item/gps))
+ continue
+
+ if(new_trackable.resistance_flags & INDESTRUCTIBLE)
+ valuable_pool += new_trackable
+ if(isclothing(new_trackable) || astype(new_trackable, /obj/item)?.slot_flags)
+ equipment_pool += new_trackable
+ if(new_trackable.force >= 15 || isgun(new_trackable))
+ weapon_pool += new_trackable
+ if(isitem(new_trackable))
+ item_pool += new_trackable
+ leftover_pool += new_trackable
+
+ // Valuable items first, then clothing items (so you can track people wearing them), then weapons (stuff you probably want), then random items
+ for(var/obj/item/new_trackable as anything in valuable_pool | equipment_pool | weapon_pool | item_pool | leftover_pool)
+ var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user)
+ LAZYADD(heretic_datum.tracked_items, new_trackable)
+ to_chat(user, span_mansus("You feel the new lodestone in [new_trackable] start to beat in rhythm with your heart."))
+ lodestones_created += 1
+ if(lodestones_created >= 3)
+ break
+
+ return lodestones_created >= 1
+
+/datum/heretic_knowledge/lodestone/cleanup_atoms(list/selected_atoms)
+ qdel(locate(/obj/item/gps) in selected_atoms)
+ selected_atoms.Cut() // ASSUMING DIRECT CONTROL
+ return ..()
+
+/datum/heretic_knowledge/blessed_poppy
+ name = "Blessed Poppy"
+ desc = "Sprout a Blessed Poppy.
\
+ Blessed Poppies can be applied to wounded limbs to heal them over time. \
+ While worn on the head, they will also stabilize those in critical condition. \
+ Either usage will eventually sap the poppy of its power, and it will wither away."
+ transmute_text = "Transmute a poppy and a sling of at least four gauze."
+ gain_text = "\"In Flanders fields, the poppies grow \
+ / Between the crosses, row on row. \
+ / That mark our place; and in the sky, \
+ / The larks, still bravely singing, fly \
+ / Scarce heard amid the guns below.\"\
+ "
+ required_atoms = list(
+ /obj/item/food/grown/flower/poppy = 1,
+ /obj/item/stack/medical/wrap/gauze = 4,
+ )
+ result_atoms = list(/obj/item/food/grown/flower/poppy/blessed)
+ cost = 1
+ drafting_tier = 1
+ is_shop_only = TRUE
+ research_tree_icon_path = /obj/item/food/grown/flower/poppy::icon
+ research_tree_icon_state = /obj/item/food/grown/flower/poppy::icon
diff --git a/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_two.dm b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_two.dm
index 9b8923b66038..9c6b3f167186 100644
--- a/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_two.dm
+++ b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_two.dm
@@ -61,7 +61,7 @@
/datum/heretic_knowledge/spell/opening_blast
name = "Wave Of Desperation"
- desc = "Grants you Wave Of Desparation, a spell which can only be cast while restrained.
\
+ desc = "Grants you Wave Of Desperation, a spell which can only be cast while restrained.
\
It removes your restraints, repels and knocks down adjacent people, and applies the Mansus Grasp to everything nearby."
gain_text = "My shackles undone in dark fury, their feeble bindings crumble before my power."
required_atoms = list(
@@ -94,7 +94,7 @@
drafting_tier = 2
/datum/heretic_knowledge/ether
- name = "Ether Of The Newborn"
+ name = "Ether of the Newborn"
desc = "Brews a single use potion.
Imbibing it will restore you to full health and \
remove any sort of abnormality from your body (including diseases, traumas and implants) - \
however, you will lose consciousness for a full minute."
diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm
index 44fc3a08a257..2b54d1f85faf 100644
--- a/code/modules/antagonists/heretic/knowledge/void_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm
@@ -62,6 +62,9 @@
mark_type = /datum/status_effect/eldritch/void
eldritch_passive = /datum/status_effect/heretic_passive/void
+/datum/heretic_knowledge/limited_amount/starting/get_extra_requirements()
+ return "a sub-zero environment"
+
/datum/heretic_knowledge/limited_amount/starting/base_void/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc)
if(!isopenturf(loc))
loc.balloon_alert(user, "ritual failed, invalid location!")
diff --git a/code/modules/antagonists/heretic/magic/crimson_cleave.dm b/code/modules/antagonists/heretic/magic/crimson_cleave.dm
deleted file mode 100644
index 6ee02e2fea9b..000000000000
--- a/code/modules/antagonists/heretic/magic/crimson_cleave.dm
+++ /dev/null
@@ -1,62 +0,0 @@
-/datum/action/cooldown/spell/pointed/crimson_cleave
- name = "Crimson Cleave"
- desc = "A targeted spell that heals you while damaging the enemy. \
- It cleanses you of all wounds as well."
- background_icon_state = "bg_heretic"
- overlay_icon_state = "bg_heretic_border"
- button_icon = 'icons/mob/actions/actions_ecult.dmi'
- button_icon_state = "blood_siphon"
- ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi'
-
- school = SCHOOL_FORBIDDEN
- cooldown_time = 30 SECONDS
-
- invocation = "FL'MS O'ET'RN'ITY."
- invocation_type = INVOCATION_WHISPER
- spell_requirements = NONE
-
- cast_range = 5
-
- /// The radius of the cleave effect
- var/cleave_radius = 1
- /// What type of wound we apply
- var/wound_type = /datum/wound/slash/flesh/critical/cleave
-
-/datum/action/cooldown/spell/pointed/crimson_cleave/can_cast_spell(feedback = TRUE)
- return ..() && isliving(owner)
-
-/datum/action/cooldown/spell/pointed/crimson_cleave/is_valid_target(atom/cast_on)
- return ..() && isliving(cast_on)
-
-/datum/action/cooldown/spell/pointed/crimson_cleave/cast(atom/cast_on)
- . = ..()
- if(iscarbon(owner))
- var/mob/living/carbon/carbon_owner = owner
- for(var/obj/item/bodypart/limbs as anything in carbon_owner.get_bodyparts())
- for(var/datum/wound/iter_wound as anything in limbs.wounds)
- iter_wound.remove_wound()
-
- var/mob/living/living_owner = owner
- for(var/mob/living/carbon/human/victim in range(cleave_radius, cast_on))
- if(victim == owner || IS_HERETIC_OR_MONSTER(victim))
- continue
- if(victim.can_block_magic(antimagic_flags))
- victim.visible_message(
- span_danger("[victim]'s flashes in a firey glow, but repels the blaze!"),
- span_danger("Your body begins to flash a firey glow, but you are protected!!")
- )
- continue
-
- victim.visible_message(
- span_danger("[victim]'s veins are shredded from within as an unholy blaze erupts from [victim.p_their()] blood!"),
- span_danger("Your veins burst from within and unholy flame erupts from your blood!")
- )
-
- victim.apply_damage(15, BRUTE, wound_bonus = CANT_WOUND)
- living_owner.adjust_brute_loss(-15)
-
- victim.transfer_blood_to(living_owner, 15, ignore_low_blood = TRUE, ignore_incompatibility = TRUE, transfer_viruses = FALSE)
-
- new /obj/effect/temp_visual/cleave(get_turf(victim))
-
- return TRUE
diff --git a/code/modules/antagonists/heretic/magic/rust_charge.dm b/code/modules/antagonists/heretic/magic/rust_charge.dm
index b8fbd895a278..44cdd400eeeb 100644
--- a/code/modules/antagonists/heretic/magic/rust_charge.dm
+++ b/code/modules/antagonists/heretic/magic/rust_charge.dm
@@ -13,9 +13,8 @@
if(!istype(start_turf) || !HAS_TRAIT(start_turf, TRAIT_RUSTY))
return FALSE
StartCooldown(135 SECONDS, 135 SECONDS)
- if(ishuman(owner))
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.damage_resistance += 100
+ var/mob/living/living = owner
+ living.damage_resistance += 100
RegisterSignal(owner, COMSIG_FINISHED_CHARGE, PROC_REF(affect_aoe))
charge_sequence(owner, target_atom, charge_delay, charge_past)
StartCooldown()
@@ -64,6 +63,5 @@
continue
nearby_mob.apply_damage(charge_damage, BRUTE, wound_bonus = CANT_WOUND)
nearby_mob.Knockdown(5 SECONDS)
- if(ishuman(owner))
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.damage_resistance -= 100
+ var/mob/living/living = owner
+ living.damage_resistance -= 100
diff --git a/code/modules/antagonists/heretic/magic/wave_of_desperation.dm b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm
index cf00b7692eb8..0e6b62e53561 100644
--- a/code/modules/antagonists/heretic/magic/wave_of_desperation.dm
+++ b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm
@@ -18,7 +18,7 @@
aoe_radius = 3
/datum/action/cooldown/spell/aoe/wave_of_desperation/is_valid_target(mob/living/carbon/cast_on)
- return ..() && istype(cast_on) && (cast_on.handcuffed || cast_on.legcuffed)
+ return ..() && istype(cast_on) && length(cast_on.get_all_attached_restraints())
// Before the cast, we do some small AOE damage around the caster
/datum/action/cooldown/spell/aoe/wave_of_desperation/before_cast(mob/living/carbon/cast_on)
@@ -26,12 +26,9 @@
if(. & SPELL_CANCEL_CAST)
return
- if(cast_on.handcuffed)
- cast_on.visible_message(span_danger("[cast_on.handcuffed] on [cast_on] shatter!"))
- QDEL_NULL(cast_on.handcuffed)
- if(cast_on.legcuffed)
- cast_on.visible_message(span_danger("[cast_on.legcuffed] on [cast_on] shatters!"))
- QDEL_NULL(cast_on.legcuffed)
+ for(var/obj/item/restraint in cast_on.get_all_attached_restraints())
+ cast_on.visible_message(span_danger("[restraint] on [cast_on] shatter!"))
+ qdel(restraint)
cast_on.apply_status_effect(/datum/status_effect/heretic_lastresort)
new /obj/effect/temp_visual/knockblast(get_turf(cast_on))
diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm
index f38aa4e0f46b..96b2891480a2 100644
--- a/code/modules/antagonists/heretic/status_effects/debuffs.dm
+++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm
@@ -347,7 +347,7 @@
// Causes them to need to eat at 10x the normal rate
owner.adjust_nutrition(-hunger_rate * HUNGER_FACTOR)
if(SPT_PROB(10, seconds_between_ticks))
- to_chat(owner, span_notice(pick("You can't stop thinking about raw meat...", "You **NEED** to eat someone.", "The hunger pangs are back...", "You hunger for flesh.", "You are starving!")))
+ to_chat(owner, span_notice(pick("You can't stop thinking about raw meat...", "You NEED to eat someone.", "The hunger pangs are back...", "You hunger for flesh.", "You are starving!")))
owner.overeatduration = max(owner.overeatduration - 200 SECONDS, 0)
/datum/status_effect/eldritch_painting/desire/on_remove()
diff --git a/code/modules/antagonists/heretic/status_effects/ghoul.dm b/code/modules/antagonists/heretic/status_effects/ghoul.dm
index bc2f524e7565..6fa774817a42 100644
--- a/code/modules/antagonists/heretic/status_effects/ghoul.dm
+++ b/code/modules/antagonists/heretic/status_effects/ghoul.dm
@@ -55,7 +55,7 @@
if(new_max_health)
if(new_max_health < human_target.maxHealth)
stamina_mod_applied = (new_max_health / human_target.maxHealth)
- human_target.physiology.stamina_mod *= stamina_mod_applied
+ MODIFY_PHYSIOLOGY(human_target, STAMINA, stamina_mod_applied)
human_target.setMaxHealth(new_max_health)
human_target.health = new_max_health
@@ -87,7 +87,7 @@
if(new_max_health)
if(isnum(stamina_mod_applied))
- human_target.physiology.stamina_mod /= stamina_mod_applied
+ MODIFY_PHYSIOLOGY(human_target, STAMINA, 1 / stamina_mod_applied)
human_target.setMaxHealth(initial(human_target.maxHealth))
on_lost_callback?.Invoke(human_target)
diff --git a/code/modules/antagonists/heretic/status_effects/heretic_passive.dm b/code/modules/antagonists/heretic/status_effects/heretic_passive.dm
index f06583c4698b..1966eff03f32 100644
--- a/code/modules/antagonists/heretic/status_effects/heretic_passive.dm
+++ b/code/modules/antagonists/heretic/status_effects/heretic_passive.dm
@@ -421,15 +421,12 @@
/// Gives/Removes damage resistance when we become/lose fatness
/datum/status_effect/heretic_passive/flesh/proc/on_fat(datum/source)
SIGNAL_HANDLER
- if(!ishuman(owner))
- return
- var/mob/living/carbon/human/heretic = owner
- if(HAS_TRAIT(heretic, TRAIT_FAT))
- heretic.physiology.damage_resistance += 25
- ADD_TRAIT(heretic, TRAIT_BATON_RESISTANCE, REF(src))
+ if(HAS_TRAIT(owner, TRAIT_FAT))
+ owner.damage_resistance += 25
+ ADD_TRAIT(owner, TRAIT_BATON_RESISTANCE, REF(src))
else
- heretic.physiology.damage_resistance -= 25
- REMOVE_TRAIT(heretic, TRAIT_BATON_RESISTANCE, REF(src))
+ owner.damage_resistance -= 25
+ REMOVE_TRAIT(owner, TRAIT_BATON_RESISTANCE, REF(src))
/datum/status_effect/heretic_passive/flesh/proc/on_summon(datum/source, mob/living/summoned)
SIGNAL_HANDLER
@@ -439,13 +436,8 @@
. = ..()
owner.remove_traits(list(TRAIT_VIRUSIMMUNE, TRAIT_SPACE_ANT_IMMUNITY, TRAIT_FAT_IGNORE_SLOWDOWN, TRAIT_VORACIOUS, TRAIT_GLUTTON, TRAIT_BATON_RESISTANCE), REF(src))
UnregisterSignal(owner, list(COMSIG_LIVING_EAT_FOOD, SIGNAL_ADDTRAIT(TRAIT_FAT), SIGNAL_REMOVETRAIT(TRAIT_FAT), COMSIG_HERETIC_SUMMONED_MOB))
- if(!ishuman(owner))
- return
- var/mob/living/carbon/human/heretic = owner
- if(!HAS_TRAIT(heretic, TRAIT_FAT))
- return
- heretic.physiology.damage_resistance -= 25
- heretic.on_fat()
+ if(HAS_TRAIT(owner, TRAIT_FAT))
+ owner.damage_resistance -= 25
//---- Lock Passive
// On gain you can understand and speak every language
diff --git a/code/modules/antagonists/heretic/transmutation_rune.dm b/code/modules/antagonists/heretic/transmutation_rune.dm
index ce6ea4f8f905..9ac9b4f08084 100644
--- a/code/modules/antagonists/heretic/transmutation_rune.dm
+++ b/code/modules/antagonists/heretic/transmutation_rune.dm
@@ -69,11 +69,15 @@
var/list/req_type_list = req_type
var/list/req_text_list = list()
for(var/atom/possible_type as anything in req_type_list)
- req_text_list += ritual.parse_required_item(possible_type)
+ req_text_list += ritual.parse_required_item(possible_type, req_amount)
ritual_requirements += english_list(req_text_list, and_text = "or")
else
- ritual_requirements += ritual.parse_required_item(req_type)
+ ritual_requirements += ritual.parse_required_item(req_type, req_amount)
+
+ var/list/extra_requirements = ritual.get_extra_requirements()
+ if(length(extra_requirements))
+ ritual_requirements += extra_requirements
if(length(ritual_requirements))
ritual_info = "Requires: [english_list(ritual_requirements)]"
diff --git a/code/modules/antagonists/nightmare/nightmare_equipment.dm b/code/modules/antagonists/nightmare/nightmare_equipment.dm
index 2f5d0c19383b..0aff078998bf 100644
--- a/code/modules/antagonists/nightmare/nightmare_equipment.dm
+++ b/code/modules/antagonists/nightmare/nightmare_equipment.dm
@@ -60,7 +60,7 @@
target.Paralyze(issilicon(target) ? 2 SECONDS : 1 SECONDS)
else
user.visible_message(span_boldwarning("[user] gores [target] with [src], ripping into them!"), span_userdanger("You gore [target] with [src], ripping into them!"))
- target.apply_damage(damage = force, forced = TRUE)
+ target.apply_damage(damage = force)
remove_crit()
/obj/item/light_eater/proc/prepare_crit_timer()
diff --git a/code/modules/antagonists/nukeop/equipment/overwatch_tools.dm b/code/modules/antagonists/nukeop/equipment/overwatch_tools.dm
index ee0b8b737d94..99e86855a0fd 100644
--- a/code/modules/antagonists/nukeop/equipment/overwatch_tools.dm
+++ b/code/modules/antagonists/nukeop/equipment/overwatch_tools.dm
@@ -41,6 +41,7 @@ Happy hunting!
desc = "A set of incredibly advanced sunglasses, providing you with an array of different sensor scans and visual readouts for pretty much anything you look at. \
It's kind of overwhelming, actually. Wearing this for a few hours will probably give you a migrane."
icon_state = "sunhudmed"
+ inhand_icon_state = "sunhudmed"
flags_cover = GLASSESCOVERSEYES
flash_protect = FLASH_PROTECTION_WELDER
clothing_traits = list(TRAIT_REAGENT_SCANNER, TRAIT_SECURITY_HUD, TRAIT_MEDICAL_HUD, TRAIT_DIAGNOSTIC_HUD)
diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm
index 29d8275bd2d9..4fc2caeab13d 100644
--- a/code/modules/antagonists/revolution/revolution.dm
+++ b/code/modules/antagonists/revolution/revolution.dm
@@ -45,7 +45,7 @@
/datum/antagonist/rev/on_gain()
. = ..()
equip_rev()
- owner.current.log_message("has been converted to the revolution!", LOG_ATTACK, color="red")
+ owner.current.log_message("has been converted to the revolution!", LOG_ATTACK, color = COLOR_CULT_RED)
/datum/antagonist/rev/create_team(datum/team/revolution/new_team)
if(!new_team)
@@ -94,6 +94,27 @@
.["code_phrases"] = rev_team.head_chose_phrase_raw
.["code_responses"] = rev_team.head_code_responses_raw
.["lone_wolf"] = !roundstart || length(rev_team.get_head_revolutionaries()) == 1
+ .["conversion_objective_max_length"] = MAX_CHARTER_LEN // it's poetic, not lazy reuse, I swear
+ .["conversion_objective"] = html_decode(conversion_objective)
+
+/datum/antagonist/rev/head/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ switch(action)
+ if("set_conversion_objective")
+ if(!params["conversion_objective"])
+ conversion_objective = ""
+ return
+
+ var/new_objective = trim(sanitize(params["conversion_objective"]), MAX_CHARTER_LEN)
+ if(!new_objective)
+ tgui_alert(usr, "Your objective is invalid. Please try again.")
+ return
+ if(is_ic_filtered(new_objective))
+ tgui_alert(usr, "Your objective contains IC filtered words. Please remove them and try again.")
+ return
+
+ conversion_objective = new_objective
+ owner.current.log_message("set their conversion guideline to: [conversion_objective]", color = COLOR_CULT_RED)
/datum/antagonist/rev/head/admin_add(datum/mind/new_owner, mob/admin)
give_flash = TRUE
@@ -155,6 +176,9 @@
preview_outfit = /datum/outfit/revolutionary
hardcore_random_bonus = TRUE
+ /// Headrev-set objective sent to any player they convert
+ var/conversion_objective = ""
+
var/remove_clumsy = FALSE
var/give_flash = FALSE
var/give_hud = TRUE
@@ -283,9 +307,35 @@
rev_mind.current.Stun(10 SECONDS)
rev_mind.add_memory(/datum/memory/recruited_by_headrev, protagonist = rev_mind.current, antagonist = owner.current)
- rev_mind.add_antag_datum(/datum/antagonist/rev,rev_team)
+ rev_mind.add_antag_datum(/datum/antagonist/rev, rev_team)
return TRUE
+/datum/antagonist/rev/head/add_revolutionary(datum/mind/rev_mind, stun = TRUE, mute = TRUE)
+ . = ..()
+ if(!. || !conversion_objective)
+ return
+
+ addtimer(CALLBACK(src, PROC_REF(report_conversion_objective), rev_mind, conversion_objective), 2 SECONDS, TIMER_DELETE_ME)
+
+/datum/antagonist/rev/head/proc/report_conversion_objective(datum/mind/rev_mind, set_conversion_objective)
+ if(QDELETED(rev_mind))
+ return
+
+ if(isnull(rev_mind?.current?.client))
+ if(isnull(rev_mind?.current))
+ return
+ // Try again until they get a client - presumably they're actively being polled for (due to a jobban or something).
+ addtimer(CALLBACK(src, PROC_REF(report_conversion_objective), rev_mind, set_conversion_objective), 3 SECONDS, TIMER_DELETE_ME)
+ return
+
+ var/conversion_formatted = span_slightly_larger(span_hypnophrase(set_conversion_objective))
+ var/hint_formatted = span_warning("This is a guideline instilled upon you from your (new) leader - \
+ while you are expected to follow it where possible, it is not a strict order. \
+ Further orders from your (new) leader(s) may supersede this.")
+
+ to_chat(rev_mind.current, fieldset_block(span_warning("A directive echoes through your mind..."), "[conversion_formatted]
[hint_formatted]", "boxed_message red_box"))
+ rev_mind.current.log_message("has been given a conversion guideline from [key_name(owner.current)]: [set_conversion_objective]", color = COLOR_CULT_RED)
+
/datum/antagonist/rev/head/proc/demote()
var/datum/mind/old_owner = owner
var/old_team = rev_team
@@ -324,7 +374,7 @@
/// Handles rev removal via IC methods such as borging, mindshielding, blunt force trauma to the head or revs losing.
/datum/antagonist/rev/proc/remove_revolutionary(deconverter)
- owner.current.log_message("has been deconverted from the revolution by [ismob(deconverter) ? key_name(deconverter) : deconverter]!", LOG_ATTACK, color=COLOR_CULT_RED)
+ owner.current.log_message("has been deconverted from the revolution by [ismob(deconverter) ? key_name(deconverter) : deconverter]!", LOG_ATTACK, color = COLOR_CULT_RED)
if(deconverter == DECONVERTER_BORGED)
message_admins("[ADMIN_LOOKUPFLW(owner.current)] has been borged while being a [name]")
if(iscarbon(owner.current) && deconverter)
diff --git a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm
index 42dfb52157ce..c53e033d2c36 100644
--- a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm
+++ b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm
@@ -250,6 +250,11 @@
for(var/obj/item/item in victim_belongings)
item.forceMove(dropoff_location)
+ if(ishuman(victim))
+ var/mob/living/carbon/human/human_victim = victim
+ if (istype(human_victim.w_uniform, /obj/item/clothing/under/misc/syndicate_souvenir))
+ victim.client?.give_award(/datum/award/achievement/misc/souvenir, victim)
+
victim.flash_act()
victim.adjust_eye_blur(3 SECONDS)
victim.adjust_dizzy(3.5 SECONDS)
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index 152628594599..6ea81c6868ce 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -64,15 +64,10 @@
uplink_handler = uplink.uplink_handler
uplink_handler.uplink_flag = uplink_flag_given
uplink_handler.primary_objectives = objectives
- uplink_handler.has_progression = TRUE
- SStraitor.register_uplink_handler(uplink_handler)
uplink_handler.can_replace_objectives = CALLBACK(src, PROC_REF(can_change_objectives))
uplink_handler.replace_objectives = CALLBACK(src, PROC_REF(submit_player_objective))
- if(uplink_handler.progression_points < SStraitor.current_global_progression)
- uplink_handler.progression_points = SStraitor.current_global_progression * SStraitor.newjoin_progression_coeff
-
var/list/uplink_items = list()
for(var/datum/uplink_item/item as anything in SStraitor.uplink_items)
if(item.item && !item.cant_discount && (item.purchasable_from & uplink_handler.uplink_flag) && item.cost >= TRAITOR_DISCOUNT_MIN_PRICE)
diff --git a/code/modules/antagonists/traitor/uplink_handler.dm b/code/modules/antagonists/traitor/uplink_handler.dm
index 84e186bc116f..6fecac80d2b1 100644
--- a/code/modules/antagonists/traitor/uplink_handler.dm
+++ b/code/modules/antagonists/traitor/uplink_handler.dm
@@ -1,7 +1,7 @@
/**
* Uplink Handler
*
- * The uplink handler, used to handle a traitor's TC and experience points and the uplink UI.
+ * The uplink handler, used to handle a traitor's TC and the uplink UI.
**/
/datum/uplink_handler
/// The owner of this uplink handler.
@@ -10,10 +10,6 @@
var/telecrystals = 0
/// The current uplink flag of this uplink
var/uplink_flag = NONE
- /// This uplink has progression
- var/has_progression = TRUE
- /// The amount of experience points this traitor has
- var/progression_points = 0
/// The purchase log of this uplink handler
var/datum/uplink_purchase_log/purchase_log
/// Associative array of stock keys = stock left. For items that don't share stock, the key is their typepath
@@ -47,10 +43,6 @@
SEND_SIGNAL(src, COMSIG_UPLINK_HANDLER_ON_UPDATE)
return
-/// Checks if traitor has enough reputation to purchase an item
-/datum/uplink_handler/proc/not_enough_reputation(datum/uplink_item/to_purchase)
- return has_progression && progression_points < to_purchase.progression_minimum
-
/// Checks if there are enough joined players to purchase an item
/datum/uplink_handler/proc/not_enough_population(datum/uplink_item/to_purchase)
return length(GLOB.joined_player_list) < to_purchase.population_minimum
@@ -84,7 +76,7 @@
if(!check_if_restricted(to_purchase))
return FALSE
- if(not_enough_reputation(to_purchase) || not_enough_population(to_purchase))
+ if(not_enough_population(to_purchase))
return FALSE
if(telecrystals < to_purchase.cost)
diff --git a/code/modules/antagonists/voidwalker/voidwalker_mob.dm b/code/modules/antagonists/voidwalker/voidwalker_mob.dm
index 74894f02c700..3b711d70b671 100644
--- a/code/modules/antagonists/voidwalker/voidwalker_mob.dm
+++ b/code/modules/antagonists/voidwalker/voidwalker_mob.dm
@@ -11,7 +11,7 @@
mob_biotypes = MOB_SPECIAL
maxHealth = 150
health = 150
- damage_coeff = list(BRUTE = 1, BURN = 0.66, TOX = 1, STAMINA = 1, OXY = 0)
+ physiology = list(BURN = 0.66, OXY = 0)
pressure_resistance = 200
combat_mode = TRUE
diff --git a/code/modules/antagonists/voidwalker/voidwalker_traumas.dm b/code/modules/antagonists/voidwalker/voidwalker_traumas.dm
index b3f5b6b515c7..cb0e476faa80 100644
--- a/code/modules/antagonists/voidwalker/voidwalker_traumas.dm
+++ b/code/modules/antagonists/voidwalker/voidwalker_traumas.dm
@@ -48,9 +48,7 @@
for(var/obj/item/bodypart as anything in owner.get_bodyparts())
texture_limb(owner, bodypart)
- if(ishuman(owner))
- var/mob/living/carbon/human/human = owner
- human.physiology.brute_mod *= brute_mod
+ MODIFY_PHYSIOLOGY(owner, BRUTE, brute_mod)
//your underwear is belong to us
if(ishuman(owner))
@@ -71,9 +69,7 @@
qdel(owner.GetComponent(/datum/component/planet_allergy))
qdel(owner.GetComponent(/datum/component/debris_bleeder))
- if(ishuman(owner))
- var/mob/living/carbon/human/human = owner
- human.physiology.brute_mod /= brute_mod
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 1 / brute_mod)
for(var/obj/item/bodypart/bodypart as anything in owner.get_bodyparts())
untexture_limb(owner, bodypart)
diff --git a/code/modules/antagonists/wizard/equipment/wizard_hammer.dm b/code/modules/antagonists/wizard/equipment/wizard_hammer.dm
index c5877735f314..75a0ba70d9c6 100644
--- a/code/modules/antagonists/wizard/equipment/wizard_hammer.dm
+++ b/code/modules/antagonists/wizard/equipment/wizard_hammer.dm
@@ -4,6 +4,7 @@
desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows."
icon = 'icons/obj/weapons/hammer.dmi'
icon_state = "singularity_hammer0"
+ inhand_icon_state = "singularity_hammer0"
base_icon_state = "singularity_hammer"
icon_angle = -45
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
@@ -78,6 +79,7 @@
desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy."
icon = 'icons/obj/weapons/hammer.dmi'
icon_state = "mjollnir0"
+ inhand_icon_state = "mjollnir0"
base_icon_state = "mjollnir"
worn_icon_state = "mjollnir"
icon_angle = -45
diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/captaincy.dm b/code/modules/antagonists/wizard/grand_ritual/finales/captaincy.dm
index 237fdfe63e73..fc2cb538d098 100644
--- a/code/modules/antagonists/wizard/grand_ritual/finales/captaincy.dm
+++ b/code/modules/antagonists/wizard/grand_ritual/finales/captaincy.dm
@@ -100,7 +100,7 @@
id = /obj/item/card/id/advanced/gold
id_trim = /datum/id_trim/job/captain
uniform = /obj/item/clothing/under/rank/captain/parade
- belt = /obj/item/modular_computer/pda/heads/captain
+ belt = /obj/item/modular_computer/pda/crew/heads/captain
ears = /obj/item/radio/headset/heads/captain/alt
glasses = /obj/item/clothing/glasses/sunglasses
gloves = /obj/item/clothing/gloves/captain
diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm
index 3adbd8dc623e..3b2c849e3d45 100644
--- a/code/modules/art/paintings.dm
+++ b/code/modules/art/paintings.dm
@@ -918,6 +918,7 @@ GLOBAL_LIST_INIT(canvas_dimensions, init_canvas_dimensions())
desc = "paintbrush included"
icon = 'icons/obj/art/artstuff.dmi'
icon_state = "palette"
+ inhand_icon_state = "palette"
lefthand_file = 'icons/mob/inhands/equipment/palette_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/palette_righthand.dmi'
w_class = WEIGHT_CLASS_TINY
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index 04cf6b9fc38f..7a31aeab73cc 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -28,6 +28,8 @@
COOLDOWN_DECLARE(next_activate)
/// Length of the cooldown between activations
var/activation_cooldown = 3 SECONDS
+ /// If true, the assembly's base icon will be used and shifted for assembly holders instead of using a different icon state
+ var/use_base_icon_for_holder = FALSE
/obj/item/assembly/Destroy()
holder = null
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index 95748cab157f..3ae6969a8770 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -102,13 +102,24 @@
for(var/i in 1 to LAZYLEN(assemblies))
if(IS_LEFT_INDEX(i))
var/obj/item/assembly/assembly = assemblies[i]
- . += mutable_appearance(assembly.icon, "[assembly.icon_state]_left")
+ var/mutable_appearance/left
+ if(assembly.use_base_icon_for_holder)
+ left = mutable_appearance(assembly.icon, assembly.icon_state)
+ left.transform = matrix(1, 0, -0.1, 0, 1, 0.1)
+ else
+ left = mutable_appearance(assembly.icon, "[assembly.icon_state]_left")
+ . += left
for(var/left_overlay in assembly.attached_overlays)
. += "[left_overlay]_l"
if(IS_RIGHT_INDEX(i))
var/obj/item/assembly/assembly = assemblies[i]
- var/mutable_appearance/right = mutable_appearance(assembly.icon, "[assembly.icon_state]_left")
- right.transform = matrix(-1, 0, 0, 0, 1, 0)
+ var/mutable_appearance/right
+ if(assembly.use_base_icon_for_holder)
+ right = mutable_appearance(assembly.icon, assembly.icon_state)
+ right.transform = matrix(-1, 0, 0.1, 0, 1, 0.1)
+ else
+ right = mutable_appearance(assembly.icon, "[assembly.icon_state]_left")
+ right.transform = matrix(-1, 0, 0, 0, 1, 0)
for(var/right_overlay in assembly.attached_overlays)
right.add_overlay("[right_overlay]_l")
. += right
diff --git a/code/modules/asset_cache/assets/research_designs.dm b/code/modules/asset_cache/assets/research_designs.dm
index cbdce771d7bb..1aacc03ff42a 100644
--- a/code/modules/asset_cache/assets/research_designs.dm
+++ b/code/modules/asset_cache/assets/research_designs.dm
@@ -64,4 +64,4 @@
/datum/asset/spritesheet_batched/research_designs/proc/get_design_id(design_path)
var/static/base_path_len = length("/datum/design/")
- return replacetext(splicetext("[design_path]", 1, base_path_len), "/", "_")
+ return replacetext(splicetext("[design_path]", 1, base_path_len + 1), "/", "_")
diff --git a/code/modules/asset_cache/assets/uplink.dm b/code/modules/asset_cache/assets/uplink.dm
index 04971c991952..459e61aae852 100644
--- a/code/modules/asset_cache/assets/uplink.dm
+++ b/code/modules/asset_cache/assets/uplink.dm
@@ -34,7 +34,6 @@
"stock_key" = item.stock_key,
"restricted_roles" = item.restricted_roles,
"restricted_species" = item.restricted_species,
- "progression_minimum" = item.progression_minimum,
"population_minimum" = item.population_minimum,
"cost_override_string" = item.cost_override_string,
"lock_other_purchases" = item.lock_other_purchases
diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
index 3378a524e0e5..93666aee6c23 100644
--- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
@@ -470,6 +470,10 @@ GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm
/datum/gas_mixture/proc/compare(datum/gas_mixture/sample, cmp_archive)
var/list/cached_moles = (cmp_archive) ? moles_archive : moles
var/list/sample_cached_moles = (cmp_archive) ? sample.moles_archive : sample.moles //accessing datum vars is slower than proc vars
+ var/total_delta = abs(values_sum(moles) - values_sum(sample.moles))
+
+ if(total_delta > MINIMUM_MOLES_DELTA_TO_MOVE) //difference in total moles no need for further iterration
+ return "total_moles"
for(var/gas_id in cached_moles | sample_cached_moles) // compare gases from either mixture
var/gas_moles = cached_moles[gas_id] // it can be null, but everything coerce to 0 after, so we save JMP and Tst
diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm
index a831d05135cf..802e782c9cdf 100644
--- a/code/modules/atmospherics/gasmixtures/gas_types.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_types.dm
@@ -161,7 +161,7 @@
fusion_power = 7
gas_overlay = "nitrium"
moles_visible = MOLES_GAS_VISIBLE
- cargo_flags = GAS_PURCHASABLE | GAS_DANGEROUS
+ cargo_flags = GAS_DANGEROUS | GAS_EXPORTABLE
rarity = 1
base_value = 6
desc = "An experimental (and slightly toxic) performance enhancing gas that increases speed and alertness when inhaled."
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 9fb051576635..bd49fc826ada 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -46,7 +46,7 @@
var/list/obj/machinery/atmospherics/nodes
///The path of the pipe/device that will spawn after unwrenching it (such as pipe fittings)
- var/construction_type
+ var/obj/item/pipe/construction_type
///icon_state as a pipe item
var/pipe_state
///Check if the device should be on or off (mostly used in processing for machines)
@@ -192,15 +192,17 @@
/// This should only be called by SSair as part of the rebuild queue.
/// Handles rebuilding pipelines after init or they've been changed.
/obj/machinery/atmospherics/proc/rebuild_pipes()
- var/list/targets = get_rebuild_targets()
rebuilding = FALSE
- for(var/datum/pipeline/build_off as anything in targets)
- build_off.build_pipeline(src) //This'll add to the expansion queue
+ var/datum/pipeline/build_target = get_rebuild_target()
+ if(!build_target)
+ return
+ build_target.build_pipeline(src) //This'll add to the expansion queue
+ SSair.add_to_rebuild_queue(src) // expansion can connect several ports. revisit this machine after the expansion queue has been processed
/**
- * Returns a list of new pipelines that need to be built up
+ * Assigns and returns the next pipeline that needs to be built up. Make sure to expand it before requesting another
*/
-/obj/machinery/atmospherics/proc/get_rebuild_targets()
+/obj/machinery/atmospherics/proc/get_rebuild_target()
return
/**
@@ -688,7 +690,7 @@
SET_PLANE_EXPLICIT(cap_overlay, initial(plane), our_turf)
- cap_overlay.color = pipe_color
+ cap_overlay.color = (pipe_color == ATMOS_COLOR_OMNI && nodes[1]?.pipe_color) || pipe_color
cap_overlay.layer = initial(layer)
cap_overlay.icon_state = "[bitfield]_[piping_layer]"
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
index 3769dedb1ff0..f9948da99057 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
@@ -73,6 +73,8 @@
return
add_overlay("flow_on")
+ add_overlay(emissive_appearance(icon, "flow_on-emissive", src, alpha = src.alpha))
+
add_overlay("display_[mode]")
if(last_pressure_delta > 0)
add_overlay("fan_[mode]_[last_pressure_delta > ONE_ATMOSPHERE]")
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
index e819570cbc01..9562bb62bdad 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
@@ -17,6 +17,8 @@ Passive gate is similar to the regular pump except:
construction_type = /obj/item/pipe/directional
pipe_state = "passivegate"
use_power = NO_POWER_USE
+ light_mask_on = TRUE
+ light_mask_off = TRUE
///Set the target pressure the component should arrive to
var/target_pressure = ONE_ATMOSPHERE
@@ -49,10 +51,11 @@ Passive gate is similar to the regular pump except:
return CLICK_ACTION_SUCCESS
/obj/machinery/atmospherics/components/binary/passive_gate/update_icon_nopipes()
- cut_overlays()
- icon_state = "passgate_off-[set_overlay_offset(piping_layer)]"
- if(on)
- add_overlay(get_pipe_image(icon, "passgate_on-[set_overlay_offset(piping_layer)]"))
+ var/new_icon_state = "passgate_[on && is_operational ? "on" : "off"]-[set_overlay_offset(piping_layer)]"
+ var/old_icon_state = icon_state
+ icon_state = new_icon_state
+ if(new_icon_state != old_icon_state)
+ update_appearance(UPDATE_OVERLAYS)
/obj/machinery/atmospherics/components/binary/passive_gate/process_atmos()
if(!on)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm
index 31af29baedcc..ae9cb06b9a74 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm
@@ -1,12 +1,14 @@
/obj/machinery/atmospherics/components/binary/pressure_valve
icon_state = "pvalve_map-3"
- name = "pressure valve"
+ name = "pressure gate"
desc = "An activable one way valve that let gas pass through if the pressure on the input side is higher than the set pressure."
can_unwrench = TRUE
shift_underlay_only = FALSE
construction_type = /obj/item/pipe/directional
pipe_state = "pvalve"
use_power = NO_POWER_USE
+ light_mask_on = TRUE
+ light_mask_off = TRUE
///Amount of pressure needed before the valve for it to open
var/target_pressure = ONE_ATMOSPHERE
///Check if the gas is moving from one pipenet to the other
@@ -41,12 +43,18 @@
return CLICK_ACTION_SUCCESS
/obj/machinery/atmospherics/components/binary/pressure_valve/update_icon_nopipes()
+ var/new_icon_state
if(on && is_operational && is_gas_flowing)
- icon_state = "pvalve_flow-[set_overlay_offset(piping_layer)]"
+ new_icon_state = "pvalve_flow-[set_overlay_offset(piping_layer)]"
else if(on && is_operational && !is_gas_flowing)
- icon_state = "pvalve_on-[set_overlay_offset(piping_layer)]"
+ new_icon_state = "pvalve_on-[set_overlay_offset(piping_layer)]"
else
- icon_state = "pvalve_off-[set_overlay_offset(piping_layer)]"
+ new_icon_state = "pvalve_off-[set_overlay_offset(piping_layer)]"
+
+ var/old_icon_state = icon_state
+ icon_state = new_icon_state
+ if(new_icon_state != old_icon_state)
+ update_appearance(UPDATE_OVERLAYS)
/obj/machinery/atmospherics/components/binary/pressure_valve/process_atmos()
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
index e97bd92f7ccb..51b6a565c16c 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
@@ -12,13 +12,14 @@
/obj/machinery/atmospherics/components/binary/pump
icon_state = "pump_map-3"
- name = "gas pump"
+ name = "pressure pump"
desc = "A pump that moves gas by pressure."
can_unwrench = TRUE
shift_underlay_only = FALSE
construction_type = /obj/item/pipe/directional
pipe_state = "pump"
vent_movement = NONE
+ light_mask_on = TRUE
///Pressure that the pump will reach when on
var/target_pressure = ONE_ATMOSPHERE
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm
index 74b6d7844ee5..5c12ff49c5c3 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm
@@ -6,6 +6,7 @@
shift_underlay_only = FALSE
construction_type = /obj/item/pipe/directional
pipe_state = "tgate"
+ light_mask_on = TRUE
///If the temperature of the mix before the gate is lower than this, the gas will flow (if inverted, if the temperature of the mix before the gate is higher than this)
var/target_temperature = T0C
///Minimum allowed temperature
@@ -55,13 +56,18 @@
. += "The sensor's settings can be changed by using a multitool on the device."
/obj/machinery/atmospherics/components/binary/temperature_gate/update_icon_nopipes()
+ var/new_icon_state
if(on && is_operational && is_gas_flowing)
- icon_state = "tgate_flow-[set_overlay_offset(piping_layer)]"
+ new_icon_state = "tgate_flow-[set_overlay_offset(piping_layer)]"
else if(on && is_operational && !is_gas_flowing)
- icon_state = "tgate_on-[set_overlay_offset(piping_layer)]"
+ new_icon_state = "tgate_on-[set_overlay_offset(piping_layer)]"
else
- icon_state = "tgate_off-[set_overlay_offset(piping_layer)]"
+ new_icon_state = "tgate_off-[set_overlay_offset(piping_layer)]"
+ var/old_icon_state = icon_state
+ icon_state = new_icon_state
+ if(new_icon_state != old_icon_state)
+ update_appearance(UPDATE_OVERLAYS)
/obj/machinery/atmospherics/components/binary/temperature_gate/process_atmos()
if(!on || !is_operational)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm
index 60e355110b79..1df735225219 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm
@@ -7,6 +7,7 @@
construction_type = /obj/item/pipe/directional
pipe_state = "tpump"
vent_movement = NONE
+ light_mask_on = TRUE
///Percent of the heat delta to transfer
var/heat_transfer_rate = 0
///Maximum allowed transfer percentage
@@ -42,7 +43,11 @@
return CLICK_ACTION_SUCCESS
/obj/machinery/atmospherics/components/binary/temperature_pump/update_icon_nopipes()
- icon_state = "tpump_[on && is_operational ? "on" : "off"]-[set_overlay_offset(piping_layer)]"
+ var/new_icon_state = "tpump_[on && is_operational ? "on" : "off"]-[set_overlay_offset(piping_layer)]"
+ var/old_icon_state = icon_state
+ icon_state = new_icon_state
+ if(new_icon_state != old_icon_state)
+ update_appearance(UPDATE_OVERLAYS)
/obj/machinery/atmospherics/components/binary/temperature_pump/process_atmos()
if(!on || !is_operational)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
index 367d2029e9d7..1ce72cf2d591 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
@@ -16,6 +16,8 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
pipe_state = "mvalve"
custom_reconcilation = TRUE
use_power = NO_POWER_USE
+ light_mask_on = TRUE
+ light_mask_off = TRUE
///Type of valve (manual or digital), used to set the icon of the component in update_icon_nopipes()
var/valve_type = MANUAL_VALVE
///Bool to stop interactions while the opening/closing animation is going
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
index 0398ffd76b7f..6bd22ecf063d 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
@@ -12,13 +12,14 @@
/obj/machinery/atmospherics/components/binary/volume_pump
icon_state = "volpump_map-3"
- name = "volumetric gas pump"
+ name = "volume pump"
desc = "A pump that moves gas by volume."
can_unwrench = TRUE
shift_underlay_only = FALSE
construction_type = /obj/item/pipe/directional
pipe_state = "volumepump"
vent_movement = NONE
+ light_mask_on = TRUE
///Transfer rate of the component in L/s
var/transfer_rate = MAX_TRANSFER_RATE
///Check if the component has been overclocked
diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm
index 71eb4e1fb8dc..3658cc769d7e 100644
--- a/code/modules/atmospherics/machinery/components/components_base.dm
+++ b/code/modules/atmospherics/machinery/components/components_base.dm
@@ -18,6 +18,10 @@
var/list/datum/gas_mixture/airs
///Handles whether the custom reconcilation handling should be used
var/custom_reconcilation = FALSE
+ ///The light mask for emissive effects while on
+ var/light_mask_on = FALSE
+ ///The light mask for emissive effects while off (but still powered)
+ var/light_mask_off = FALSE
/obj/machinery/atmospherics/components/get_save_vars()
. = ..()
@@ -50,6 +54,23 @@
/obj/machinery/atmospherics/components/proc/update_icon_nopipes()
return
+/obj/machinery/atmospherics/components/update_overlays()
+ . = ..()
+
+ if(istype(src, /obj/machinery/atmospherics/components/trinary))
+ var/on_state = on && nodes[1] && nodes[2] && nodes[3] && is_operational
+ // during Initialize() trinary devices will be technically "on" but their icon_state
+ // updates to off via update_icon_nopipes() before atmos nodes process which breaks their emissives
+ if(!on_state)
+ return
+
+ cut_overlays()
+ if(is_operational && ((on && light_mask_on) || (!on && light_mask_off)))
+ // this is cursed but both these emissive_appearance() are needed one gives emissives to
+ // mapload machinery that are already on the other gives emissives when updates happen (on/off/pressure change/etc.)
+ . += emissive_appearance(icon, "[icon_state]-emissive", src, alpha = src.alpha)
+ add_overlay(emissive_appearance(icon, "[icon_state]-emissive", src, alpha = src.alpha))
+
/obj/machinery/atmospherics/components/on_hide(datum/source, underfloor_accessibility)
hide_pipe(underfloor_accessibility)
return ..()
@@ -90,7 +111,7 @@
var/obj/machinery/atmospherics/node = nodes[i]
var/node_dir = get_dir(src, node)
var/mutable_appearance/pipe_appearance = mutable_appearance('icons/obj/pipes_n_cables/pipe_underlays.dmi', "intact_[node_dir]_[underlay_pipe_layer]", appearance_flags = RESET_COLOR|KEEP_APART)
- pipe_appearance.color = (node.pipe_color == ATMOS_COLOR_OMNI || istype(node, /obj/machinery/atmospherics/pipe/color_adapter)) ? pipe_color : node.pipe_color
+ pipe_appearance.color = SELECT_ATMOS_NODE_COLOR(src, node)
if (underfloor_state == UNDERFLOOR_VISIBLE || uncovered_turf)
pipe_appearance.layer = BELOW_CATWALK_LAYER + get_pipe_layer_offset()
SET_PLANE_EXPLICIT(pipe_appearance, FLOOR_PLANE, src)
@@ -138,14 +159,12 @@
if(update_parents_after_rebuild)
update_parents()
-/obj/machinery/atmospherics/components/get_rebuild_targets()
- var/list/to_return = list()
- for(var/i in 1 to device_type)
- if(parents[i])
+/obj/machinery/atmospherics/components/get_rebuild_target()
+ for(var/port in 1 to device_type)
+ if(parents[port])
continue
- parents[i] = new /datum/pipeline()
- to_return += parents[i]
- return to_return
+ parents[port] = new /datum/pipeline()
+ return parents[port]
/**
* Called by nullify_node(), used to remove the pipeline the component is attached to
@@ -187,9 +206,16 @@
return returned_air
/obj/machinery/atmospherics/components/pipeline_expansion(datum/pipeline/reference)
- if(reference)
- return list(nodes[parents.Find(reference)])
- return ..()
+ if(!reference)
+ return ..()
+ var/port = parents.Find(reference)
+ if(port)
+ return list(nodes[port])
+ // no port means another pipeline took our port while this one waited to expand somehow
+ reference.other_atmos_machines -= src
+ reference.require_custom_reconcilation -= src
+ reference.other_airs -= airs
+ return list()
/obj/machinery/atmospherics/components/set_pipenet(datum/pipeline/reference, obj/machinery/atmospherics/target_component)
parents[nodes.Find(target_component)] = reference
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
index c9dec3e037a4..12523646cc05 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
@@ -8,6 +8,7 @@
can_unwrench = TRUE
construction_type = /obj/item/pipe/trinary/flippable/filter
pipe_state = "filter"
+ light_mask_on = TRUE
///Rate of transfer of the gases to the outputs
var/transfer_rate = MAX_TRANSFER_RATE
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
index 13a52bba6278..0767571b61ea 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
@@ -8,6 +8,7 @@
can_unwrench = TRUE
construction_type = /obj/item/pipe/trinary/flippable
pipe_state = "mixer"
+ light_mask_on = TRUE
///Output pressure target
var/target_pressure = ONE_ATMOSPHERE
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/airlock_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/airlock_pump.dm
index ddcb66267a9e..670f3d8c9f64 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/airlock_pump.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/airlock_pump.dm
@@ -93,22 +93,23 @@
if(!underfloor_state)
return
- var/mutable_appearance/distro_pipe_appearance = get_pipe_image(icon, "pipe_exposed", dir, COLOR_BLUE, piping_layer = 4)
- if(nodes[1])
- distro_pipe_appearance = get_pipe_image(icon, "pipe_intact", dir, COLOR_BLUE, piping_layer = 4)
- . += distro_pipe_appearance
-
- var/mutable_appearance/waste_pipe_appearance = get_pipe_image(icon, "pipe_exposed", dir, COLOR_RED, piping_layer = 2)
- if(nodes[2])
- waste_pipe_appearance = get_pipe_image(icon, "pipe_intact", dir, COLOR_RED, piping_layer = 2)
- . += waste_pipe_appearance
-
- var/mutable_appearance/distro_cap_appearance = get_pipe_image(icon, "vent_cap", dir, piping_layer = 4)
- . += distro_cap_appearance
-
- var/mutable_appearance/waste_cap_appearance = get_pipe_image(icon, "vent_cap", dir, piping_layer = 2)
- . += waste_cap_appearance
-
+ . += get_pipe_image(
+ iconfile = icon,
+ iconstate = "pipe_[isnull(nodes[1]) ? "exposed" : "intact"]",
+ direction = dir,
+ color = nodes[1]?.color || COLOR_BLUE, // default to blue to indicate input
+ piping_layer = 4,
+ )
+ . += get_pipe_image(
+ iconfile = icon,
+ iconstate = "pipe_[isnull(nodes[2]) ? "exposed" : "intact"]",
+ direction = dir,
+ color = nodes[2]?.color || COLOR_RED, // default to red to indicate output
+ piping_layer = 2,
+ )
+
+ . += get_pipe_image(icon, "vent_cap", dir, piping_layer = 4)
+ . += get_pipe_image(icon, "vent_cap", dir, piping_layer = 2)
/obj/machinery/atmospherics/components/unary/airlock_pump/atmos_init(list/node_connects)
for(var/obj/machinery/atmospherics/target in get_step(src, dir))
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index b24e448ad1f7..e39eda40d3ce 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -516,8 +516,7 @@
set_on(TRUE)
/obj/machinery/cryo_cell/container_resist_act(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
user.visible_message(span_notice("You see [user] kicking against the glass of [src]!"), \
span_notice("You struggle inside [src], kicking the release with your foot... (this will take about [DisplayTimeText(CRYO_BREAKOUT_TIME)].)"), \
span_hear("You hear a thump from [src]."))
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index 87d25f25a321..fc8b17c39005 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -127,10 +127,17 @@
/obj/machinery/atmospherics/components/unary/thermomachine/update_overlays()
. = ..()
- var/image/pipe = get_pipe_image('icons/obj/machines/atmospherics/thermomachine.dmi', "pipe", dir, pipe_color, piping_layer)
+ var/image/pipe = get_pipe_image('icons/obj/machines/atmospherics/thermomachine.dmi', "pipe", dir, SELECT_ATMOS_NODE_COLOR(src, nodes[1]), piping_layer)
pipe.appearance_flags |= RESET_COLOR | KEEP_APART
. += pipe
+ if(on && is_operational)
+ // this is cursed but both these emissive_appearance() are needed
+ // one gives emissives to mapload machinery that are already on
+ // the other gives emissives when updates happen (on/off/pressure change/etc.)
+ . += emissive_appearance('icons/obj/machines/atmospherics/thermomachine.dmi', "thermo-emissive", src, alpha = src.alpha)
+ add_overlay(emissive_appearance('icons/obj/machines/atmospherics/thermomachine.dmi', "thermo-emissive", src, alpha = src.alpha))
+
/obj/machinery/atmospherics/components/unary/thermomachine/examine(mob/user)
. = ..()
. += span_notice("With the panel open:")
diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm
index 0d1b66bdaee6..d1484799103f 100644
--- a/code/modules/atmospherics/machinery/other/meter.dm
+++ b/code/modules/atmospherics/machinery/other/meter.dm
@@ -16,6 +16,10 @@
var/obj/machinery/atmospherics/pipe/target
///The piping layer of the target
var/target_layer = PIPING_LAYER_DEFAULT
+ ///The visual meter pressure level
+ var/meter_value = "0"
+ ///The emissive button state
+ var/button_value = "0"
/datum/armor/machinery_meter
energy = 100
@@ -74,27 +78,43 @@
/obj/machinery/meter/process_atmos()
var/datum/gas_mixture/pipe_air = target?.return_air()
+ var/new_meter_value = "0"
+ var/new_button_value = "0"
+
if(isnull(pipe_air))
icon_state = "meter0"
+ if((meter_value != new_meter_value) || (button_value != new_button_value))
+ meter_value = new_meter_value
+ button_value = new_button_value
+ update_appearance(UPDATE_OVERLAYS)
return FALSE
var/env_pressure = pipe_air.return_pressure()
if(env_pressure <= 0.15 * ONE_ATMOSPHERE)
icon_state = "meter0"
+ new_meter_value = "0"
+ new_button_value = "0"
else if(env_pressure <= 1.8 * ONE_ATMOSPHERE)
var/val = round(env_pressure / (ONE_ATMOSPHERE * 0.3) + 0.5)
icon_state = "meter1_[val]"
+ new_meter_value = "1_[val]"
+ new_button_value = "1"
else if(env_pressure <= 30 * ONE_ATMOSPHERE)
var/val = round(env_pressure / (ONE_ATMOSPHERE * 5) - 0.35) + 1
icon_state = "meter2_[val]"
+ new_meter_value = "2_[val]"
+ new_button_value = "2"
else if(env_pressure <= 59 * ONE_ATMOSPHERE)
var/val = round(env_pressure / (ONE_ATMOSPHERE * 5) - 6) + 1
icon_state = "meter3_[val]"
+ new_meter_value = "3_[val]"
+ new_button_value = "3"
else
icon_state = "meter4"
+ new_meter_value = "4"
+ new_button_value = "4"
var/env_temperature = pipe_air.temperature
-
var/new_greyscale = greyscale_colors
if(env_pressure == 0 || env_temperature == 0)
@@ -120,6 +140,20 @@
greyscale_colors = new_greyscale
set_greyscale(greyscale_colors)
+ if((meter_value != new_meter_value) || (button_value != new_button_value))
+ meter_value = new_meter_value
+ button_value = new_button_value
+ update_appearance(UPDATE_OVERLAYS)
+
+/obj/machinery/meter/update_overlays()
+ . = ..()
+ if(!is_operational)
+ return
+
+ . += emissive_appearance('icons/obj/pipes_n_cables/meter.dmi', "buttons[button_value]-emissive", src, alpha = src.alpha)
+ if(meter_value != "0")
+ . += emissive_appearance('icons/obj/pipes_n_cables/meter.dmi', "pressure[meter_value]", src, alpha = src.alpha)
+
/obj/machinery/meter/proc/status()
if (target)
var/datum/gas_mixture/pipe_air = target.return_air()
diff --git a/code/modules/atmospherics/machinery/pipes/color_adapter.dm b/code/modules/atmospherics/machinery/pipes/color_adapter.dm
index a33376c16ccd..2061e6b731dc 100644
--- a/code/modules/atmospherics/machinery/pipes/color_adapter.dm
+++ b/code/modules/atmospherics/machinery/pipes/color_adapter.dm
@@ -7,7 +7,7 @@
dir = SOUTH
initialize_directions = NORTH | SOUTH
- pipe_flags = PIPING_CARDINAL_AUTONORMALIZE | PIPING_ALL_COLORS | PIPING_BRIDGE
+ pipe_flags = PIPING_CARDINAL_AUTONORMALIZE | PIPING_ALL_COLORS | PIPING_BRIDGE | PIPING_DONT_SHARE_COLOR
device_type = BINARY
construction_type = /obj/item/pipe/binary
@@ -47,16 +47,30 @@
for(var/i in 1 to device_type)
if(!nodes[i])
continue
- var/applied_color = nodes[i].pipe_color
var/node_dir = get_dir(src, nodes[i])
- if (istype(nodes[i], /obj/machinery/atmospherics/pipe/color_adapter) && ((node_dir & (SOUTH|EAST)) || nodes[i].pipe_color == ATMOS_COLOR_OMNI) && pipe_color != ATMOS_COLOR_OMNI)
- applied_color = pipe_color
- var/image/pipe = get_pipe_image('icons/obj/pipes_n_cables/manifold.dmi', "pipe-3", node_dir, applied_color)
+ var/image/pipe = get_pipe_image('icons/obj/pipes_n_cables/manifold.dmi', "pipe-3", node_dir, get_node_color(nodes[i], node_dir))
pipe.appearance_flags |= RESET_COLOR|KEEP_APART
PIPING_LAYER_DOUBLE_SHIFT(pipe, piping_layer)
pipe.layer = layer + 0.01
. += pipe
+/obj/machinery/atmospherics/pipe/color_adapter/proc/get_node_color(obj/machinery/atmospherics/node, node_dir = get_dir(src, node))
+ // If we are omni always use input color
+ if(pipe_color == ATMOS_COLOR_OMNI)
+ return node.pipe_color
+
+ // If we are connecting to a non-sharer (like another color adapter)
+ if(node.pipe_flags & PIPING_DONT_SHARE_COLOR)
+ // Use our own color if the other node is omni
+ if(node.pipe_color == ATMOS_COLOR_OMNI)
+ return pipe_color
+ // South/east are prioritized, so it doesn't change based on update order
+ if(node_dir & (SOUTH|EAST))
+ return pipe_color
+
+ // Otherwise just use the node's color
+ return node.pipe_color
+
/obj/machinery/atmospherics/pipe/color_adapter/layer1
icon_state = "adapter_map-1"
piping_layer = 1
diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm
index 135d222a92ea..9dad496e9505 100644
--- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm
+++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm
@@ -61,18 +61,21 @@
. = list()
+ // Conecting layer manifold to layer manifold will always use omni color pipes in between
if(istype(machine_check, /obj/machinery/atmospherics/pipe/layer_manifold))
+ var/preferred_color = machine_check.pipe_color == pipe_color ? pipe_color : ATMOS_COLOR_OMNI
for(var/i in PIPING_LAYER_MIN to PIPING_LAYER_MAX)
- . += get_attached_image(get_dir(src, machine_check), i, machine_check.pipe_color == pipe_color ? pipe_color : ATMOS_COLOR_OMNI)
+ . += get_attached_image(get_dir(src, machine_check), i, preferred_color)
return
+
+ // Airlock pump has some snowflake behavior since it has two nodes
if(istype(machine_check, /obj/machinery/atmospherics/components/unary/airlock_pump))
. += get_attached_image(get_dir(src, machine_check), 4, COLOR_BLUE)
//. += get_attached_image(get_dir(src, machine_check), 2, COLOR_RED) // Only the distro node is added currently to the pipenet, it doesn't merge the pipenet with the waste node
return
- var/passed_color = machine_check.pipe_color
- if(istype(machine_check, /obj/machinery/atmospherics/pipe/color_adapter) || machine_check.pipe_color == ATMOS_COLOR_OMNI)
- passed_color = pipe_color
- . += get_attached_image(get_dir(src, machine_check), machine_check.piping_layer, passed_color)
+
+ var/connection_color = SELECT_ATMOS_NODE_COLOR(src, machine_check)
+ . += get_attached_image(get_dir(src, machine_check), machine_check.piping_layer, connection_color)
/obj/machinery/atmospherics/pipe/layer_manifold/proc/get_attached_image(p_dir, p_layer, p_color)
var/working_layer = FLOAT_LAYER - HAS_TRAIT(src, TRAIT_UNDERFLOOR) ? 1 : 0.01
diff --git a/code/modules/atmospherics/machinery/pipes/multiz.dm b/code/modules/atmospherics/machinery/pipes/multiz.dm
index dfbd4097cdc4..5a27c000e0ad 100644
--- a/code/modules/atmospherics/machinery/pipes/multiz.dm
+++ b/code/modules/atmospherics/machinery/pipes/multiz.dm
@@ -21,8 +21,6 @@
var/mutable_appearance/center = null
///The pipe icon
var/mutable_appearance/pipe = null
- ///Reference to the node
- var/obj/machinery/atmospherics/front_node = null
/obj/machinery/atmospherics/pipe/multiz/Initialize(mapload, process, setdir, init_dir)
icon_state = ""
@@ -38,10 +36,12 @@
/obj/machinery/atmospherics/pipe/multiz/update_overlays()
. = ..()
+
pipe.appearance_flags |= RESET_COLOR|KEEP_APART
- pipe.color = front_node ? front_node.pipe_color : ATMOS_COLOR_OMNI
+ pipe.color = SELECT_ATMOS_NODE_COLOR(src, nodes[1])
pipe.icon_state = "pipe-[piping_layer]"
. += pipe
+
center.pixel_w = PIPING_LAYER_P_X * (piping_layer - PIPING_LAYER_DEFAULT)
. += center
diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm
index 90928274ab9f..45f4be249faa 100644
--- a/code/modules/atmospherics/machinery/pipes/pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/pipes.dm
@@ -68,11 +68,11 @@
/obj/machinery/atmospherics/pipe/destroy_network()
QDEL_NULL(parent)
-/obj/machinery/atmospherics/pipe/get_rebuild_targets()
+/obj/machinery/atmospherics/pipe/get_rebuild_target()
if(!QDELETED(parent))
return
replace_pipenet(parent, new /datum/pipeline)
- return list(parent)
+ return parent
/obj/machinery/atmospherics/pipe/return_air()
if(air_temporary)
diff --git a/code/modules/atmospherics/machinery/portable/bluespace_scrubber.dm b/code/modules/atmospherics/machinery/portable/bluespace_scrubber.dm
new file mode 100644
index 000000000000..78ca3a9c4970
--- /dev/null
+++ b/code/modules/atmospherics/machinery/portable/bluespace_scrubber.dm
@@ -0,0 +1,160 @@
+//BLUESPACE SCRUBBER
+/obj/machinery/portable_atmospherics/scrubber/bluespace
+ name = "portable bluespace scrubber"
+ desc = "A portable variant of the station scrubbers, capable of filtering gas from the air around it or inserted tank. May also be linked with bluespace gas receivers."
+ icon_state = "bluespace_scrubber"
+
+ var/obj/machinery/portable_atmospherics/gas_receiver/target = null
+
+/obj/machinery/portable_atmospherics/scrubber/bluespace/Destroy()
+ set_teleport_target(null)
+ return ..()
+
+//Links scrubber with a bluespace gas receiver with multitool
+/obj/machinery/portable_atmospherics/scrubber/bluespace/multitool_act(mob/living/user, obj/item/multitool/M)
+ if(!istype(M.buffer, /obj/machinery/portable_atmospherics/gas_receiver))
+ to_chat(user, span_warning("Invalid buffer."))
+ return ITEM_INTERACT_BLOCKING
+
+ set_teleport_target(M.buffer)
+
+ to_chat(user, span_green("You successfully link [src] to the [M.buffer]."))
+ return ITEM_INTERACT_SUCCESS
+
+//Set a receiving gas object, cleaning up any previous link first.
+/obj/machinery/portable_atmospherics/scrubber/bluespace/proc/set_teleport_target(obj/machinery/portable_atmospherics/gas_receiver/new_target)
+ if(target)
+ //Clear the old link before link new
+ UnregisterSignal(target, COMSIG_QDELETING)
+ target.unregister_sender(src)
+ target = new_target
+ if(target)
+ //If our target is ever deleted, drop our reference to it
+ RegisterSignal(target, COMSIG_QDELETING, PROC_REF(clear_teleport_target))
+ target.register_sender(src)
+
+//Signal handler for our target being deleted, clears our reference to it.
+/obj/machinery/portable_atmospherics/scrubber/bluespace/proc/clear_teleport_target(datum/source)
+ SIGNAL_HANDLER
+ set_teleport_target(null)
+
+//Transfer our scrubbed gas into the linked gas receiver's air
+/obj/machinery/portable_atmospherics/scrubber/bluespace/proc/transfer_gas(datum/gas_mixture/receiver_air)
+ if(receiver_air.return_pressure() >= overpressure_m * ONE_ATMOSPHERE)
+ return
+
+ var/list/cached_moles = air_contents.moles
+
+ //contains all of the gas we're pulling out of our air_contents, gets merged into the receiver
+ var/datum/gas_mixture/filtered_out = new
+
+ filtered_out.temperature = air_contents.temperature
+
+ //maximum percentage of our stored gas we can transfer
+ var/removal_ratio = 1
+
+ var/total_moles_to_remove = 0
+ for(var/gas_id in cached_moles & scrubbing)
+ total_moles_to_remove += cached_moles[gas_id]
+
+ if(!total_moles_to_remove)
+ return FALSE
+
+ for(var/gas_id in cached_moles & scrubbing)
+ var/transferred_moles = max(QUANTIZE(cached_moles[gas_id] * removal_ratio * (cached_moles[gas_id] / total_moles_to_remove)), min(MOLAR_ACCURACY*1000, cached_moles[gas_id]))
+
+ filtered_out.adjust_gas(gas_id, transferred_moles)
+ air_contents.adjust_gas(gas_id, -transferred_moles)
+
+ //Hand the filtered gases over to the receiver
+ receiver_air.merge(filtered_out)
+
+//GAS RECEIVER
+/obj/machinery/portable_atmospherics/gas_receiver
+ name = "Bluespace Gas Receiver"
+ desc = "Receive gases from a bluespace portable scrubber."
+ icon_state = "bluespace_gas_receiver"
+ density = TRUE
+ max_integrity = 250
+ volume = 2000
+ active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.5
+
+ var/on = FALSE
+ //All synced up bluespace scrubbers we can tap from
+ var/list/senders = list()
+ //We only grab one machine per process, so store which one is next
+ var/next_index = 1
+
+/obj/machinery/portable_atmospherics/gas_receiver/Destroy()
+ lose_senders()
+ return ..()
+
+/obj/machinery/portable_atmospherics/gas_receiver/on_deconstruction(disassembled)
+ var/turf/local_turf = get_turf(src)
+ local_turf.assume_air(air_contents)
+ return ..()
+
+/obj/machinery/portable_atmospherics/gas_receiver/update_icon_state()
+ icon_state = "[initial(icon_state)]_[on]"
+ return ..()
+
+//overlays for gas receiver
+/obj/machinery/portable_atmospherics/gas_receiver/update_overlays()
+ . = ..()
+ if(holding)
+ . += "siphon-open"
+ if(connected_port)
+ . += "siphon-connector"
+
+/obj/machinery/portable_atmospherics/gas_receiver/multitool_act(mob/living/user, obj/item/multitool/M)
+ M.set_buffer(src)
+ balloon_alert(user, "saved to multitool buffer")
+ return ITEM_INTERACT_SUCCESS
+
+/obj/machinery/portable_atmospherics/gas_receiver/click_alt(mob/user)
+ if(!is_operational)
+ update_icon_state()
+ return on
+
+ on = !on
+ update_icon_state()
+
+ balloon_alert(user, "turned [on ? "on" : "off"]")
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS)
+ return CLICK_ACTION_SUCCESS
+
+/obj/machinery/portable_atmospherics/gas_receiver/process(seconds_per_tick)
+ if(!is_operational)
+ return
+
+ if(!on)
+ return
+
+ for(var/obj/machinery/portable_atmospherics/scrubber/bluespace/scrubber as anything in senders)
+ scrubber.transfer_gas(air_contents)
+ use_energy(active_power_usage * seconds_per_tick)
+
+//Track a scrubber that has linked to us, listening for its deletion so we can drop it.
+/obj/machinery/portable_atmospherics/gas_receiver/proc/register_sender(obj/machinery/portable_atmospherics/scrubber/bluespace/sender)
+ if(sender in senders)
+ return
+ senders += sender
+ RegisterSignal(sender, COMSIG_QDELETING, PROC_REF(unregister_sender))
+
+//Stop tracking a scrubber, also fired as a signal handler when a sender is deleted.
+/obj/machinery/portable_atmospherics/gas_receiver/proc/unregister_sender(datum/source)
+ SIGNAL_HANDLER
+ senders -= source
+ UnregisterSignal(source, COMSIG_QDELETING)
+
+//Notify all scrubbers to forget us
+/obj/machinery/portable_atmospherics/gas_receiver/proc/lose_senders()
+ // For loops in this format copy implicitly, so this is fine even though scrubbers remove themselves as we iterate
+ for(var/obj/machinery/portable_atmospherics/scrubber/bluespace/scrubber as anything in senders)
+ scrubber.set_teleport_target(null)
+
+// wirecutter makes it lose all its senders
+/obj/machinery/portable_atmospherics/gas_receiver/wirecutter_act(mob/living/user, obj/item/I)
+ lose_senders()
+ to_chat(user, span_warning("All scrubbers has been disconnected from receiver."))
+ return ITEM_INTERACT_SUCCESS
diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
index 05ee2a672995..5e4182eca532 100644
--- a/code/modules/awaymissions/gateway.dm
+++ b/code/modules/awaymissions/gateway.dm
@@ -154,7 +154,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
pixel_y = -32
bound_height = 64
bound_width = 96
- bound_x = 0
+ bound_x = -32
bound_y = 0
density = TRUE
@@ -425,10 +425,12 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
/atom/movable/screen/map_view/gateway_port/proc/setup_visuals(datum/gateway_destination/D)
our_destination = D
+ set_display(our_destination?.get_target_turf())
update_portal_filters()
/atom/movable/screen/map_view/gateway_port/proc/reset_visuals()
our_destination = null
+ set_display(our_destination?.get_target_turf())
update_portal_filters()
/atom/movable/screen/map_view/gateway_port/proc/update_portal_filters()
diff --git a/code/modules/awaymissions/mission_code/heretic/heretic_gateway_guns.dm b/code/modules/awaymissions/mission_code/heretic/heretic_gateway_guns.dm
index a8990d14474e..2bff2fdbf434 100644
--- a/code/modules/awaymissions/mission_code/heretic/heretic_gateway_guns.dm
+++ b/code/modules/awaymissions/mission_code/heretic/heretic_gateway_guns.dm
@@ -1,8 +1,9 @@
-/obj/item/gun/energy/shrink_ray/one_shot
+/obj/item/gun/energy/recharge/shrink_ray/one_shot
name = "shrink ray blaster"
desc = "This is a piece of frightening alien tech that enhances the magnetic pull of atoms in a localized space to temporarily make an object shrink. \
That or it's just space magic. Either way, it shrinks stuff, This one is jerry-rigged to work with a non alien cell. It still recharges though."
ammo_type = list(/obj/item/ammo_casing/energy/shrink/worse)
+ holds_charge = TRUE
/obj/item/ammo_casing/energy/shrink/worse
projectile_type = /obj/projectile/magic/shrink/alien
diff --git a/code/modules/basketball/controller.dm b/code/modules/basketball/controller.dm
index 078624e775ee..9b7eef8ea45f 100644
--- a/code/modules/basketball/controller.dm
+++ b/code/modules/basketball/controller.dm
@@ -186,6 +186,7 @@ GLOBAL_VAR(basketball_game)
ADD_TRAIT(baller, TRAIT_CANNOT_CRYSTALIZE, BASKETBALL_MINIGAME_TRAIT)
// this is basketball, not a boxing match
ADD_TRAIT(baller, TRAIT_PACIFISM, BASKETBALL_MINIGAME_TRAIT)
+ ADD_TRAIT(baller, TRAIT_NO_CANON, INNATE_TRAIT) // DARKPACK EDIT ADD
baller.equipOutfit(team_uniform)
diff --git a/code/modules/bitrunning/job.dm b/code/modules/bitrunning/job.dm
index a0f0f0c7d1b6..44789681ab38 100644
--- a/code/modules/bitrunning/job.dm
+++ b/code/modules/bitrunning/job.dm
@@ -37,7 +37,7 @@
id_trim = /datum/id_trim/job/bitrunner
uniform = /obj/item/clothing/under/rank/cargo/bitrunner
- belt = /obj/item/modular_computer/pda/bitrunner
+ belt = /obj/item/modular_computer/pda/crew/bitrunner
ears = /obj/item/radio/headset/headset_cargo
/datum/job/bit_avatar
diff --git a/code/modules/bitrunning/server/signal_handlers.dm b/code/modules/bitrunning/server/signal_handlers.dm
index f14db4509e3e..e76da475c380 100644
--- a/code/modules/bitrunning/server/signal_handlers.dm
+++ b/code/modules/bitrunning/server/signal_handlers.dm
@@ -43,7 +43,7 @@
if(!creature.mind?.has_antag_datum(/datum/antagonist/bitrunning_glitch, check_subtypes = TRUE))
return
- INVOKE_ASYNC(src, PROC_REF(station_spawn), arrived, chosen_forge)
+ INVOKE_ASYNC(src, PROC_REF(station_spawn), arrived, chosen_forge, source)
return
if(istype(arrived, /obj/structure/closet/crate/secure/bitrunning/encrypted))
diff --git a/code/modules/bitrunning/server/threats.dm b/code/modules/bitrunning/server/threats.dm
index 54c153cf03a5..8b6776199d03 100644
--- a/code/modules/bitrunning/server/threats.dm
+++ b/code/modules/bitrunning/server/threats.dm
@@ -128,7 +128,7 @@
/// Oh boy - transports the antag station side
-/obj/machinery/quantum_server/proc/station_spawn(mob/living/antag, obj/machinery/byteforge/chosen_forge)
+/obj/machinery/quantum_server/proc/station_spawn(mob/living/antag, obj/machinery/byteforge/chosen_forge, turf/goal_turf)
antag.balloon_alert(antag, "scanning...")
chosen_forge.setup_particles(angry = TRUE)
var/obj/machinery/announcement_system/aas = get_announcement_system(null, src, list(RADIO_CHANNEL_SUPPLY))
@@ -158,6 +158,10 @@
if(bitrunners_alive)
to_chat(antag, span_warning("[bitrunners_alive] criminals still remain here, pilfering your domain. It will be more difficult to leave until they are handled."))
+ timeout -= 0.5 SECONDS
+
+ if(!do_after(antag, 0.5 SECONDS, timed_action_flags = IGNORE_USER_LOC_CHANGE) || QDELETED(antag) || antag.loc != goal_turf || QDELETED(chosen_forge) || QDELETED(src))
+ return
if(!do_after(antag, timeout) || QDELETED(chosen_forge) || QDELETED(antag) || QDELETED(src) || !is_ready || !is_operational)
chosen_forge.setup_particles()
return
@@ -189,7 +193,7 @@
qdel(temp_body)
do_teleport(antag, get_turf(chosen_forge), forced = TRUE, asoundin = 'sound/effects/magic/ethereal_enter.ogg', asoundout = 'sound/effects/magic/ethereal_exit.ogg', channel = TELEPORT_CHANNEL_QUANTUM)
-
+ antag.client?.give_award(/datum/award/achievement/misc/red_pill, antag)
/// Removes any invalid candidates from the list
/obj/machinery/quantum_server/proc/validate_mutation_candidates()
diff --git a/code/modules/bitrunning/virtual_domain/domains/fredingtonfastingbear.dm b/code/modules/bitrunning/virtual_domain/domains/fredingtonfastingbear.dm
index f3c803384c45..2c091d41a1d0 100644
--- a/code/modules/bitrunning/virtual_domain/domains/fredingtonfastingbear.dm
+++ b/code/modules/bitrunning/virtual_domain/domains/fredingtonfastingbear.dm
@@ -3,6 +3,7 @@
cost = BITRUNNER_COST_MEDIUM
desc = "A famous pizzeria that got ruined by what it had to offer."
completion_loot = list(/obj/item/food/pizzaslice/meat/pizzeria = 1)
+ secondary_loot = list(/obj/item/music_tape/pop = 1)
difficulty = BITRUNNER_DIFFICULTY_MEDIUM
help_text = "Pick up a flashlight and get going. Your favourite bear has been waiting for you..."
key = "fredingtonfastingbear"
diff --git a/code/modules/bitrunning/virtual_domain/domains/heretic_hunt.dm b/code/modules/bitrunning/virtual_domain/domains/heretic_hunt.dm
index 3dee62028c23..c3e6f30bdd71 100644
--- a/code/modules/bitrunning/virtual_domain/domains/heretic_hunt.dm
+++ b/code/modules/bitrunning/virtual_domain/domains/heretic_hunt.dm
@@ -16,7 +16,7 @@
for(var/mob/living/basic/heretic_summon/helper in created_atoms)
helper.ai_controller = new /datum/ai_controller/basic_controller/simple/simple_hostile(helper)
- helper.ai_controller.blackboard[BB_BASIC_MOB_IDLE_WALK_CHANCE] = 0.1
+ helper.ai_controller.set_blackboard_key(BB_BASIC_MOB_IDLE_WALK_CHANCE, 0.1)
var/obj/effect/heretic_rune/big/rune = locate() in created_atoms
rune.set_greyscale(pick(assoc_to_values(GLOB.heretic_path_to_color)))
@@ -148,7 +148,7 @@
ai_controller = /datum/ai_controller/basic_controller/fake_crewman/instant_hostile
death_spawner = /obj/effect/mob_spawn/corpse/human/secoff
weapon = /obj/item/knife/combat/survival
- damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 1, STAMINA = 1, OXY = 1)
+ physiology = list(BURN = 0.6, BRUTE = 0.6)
/mob/living/basic/fake_crewman/engi
name = "engineer"
@@ -156,11 +156,11 @@
weapon = /obj/item/weldingtool
attack_sound = 'sound/items/tools/welder.ogg'
melee_damage_type = BURN
- damage_coeff = list(BRUTE = 1, BURN = 0.9, TOX = 1, STAMINA = 1, OXY = 1)
+ physiology = list(BURN = 0.9)
/mob/living/basic/fake_crewman/engi/mod
death_spawner = /obj/effect/mob_spawn/corpse/human/engineer/mod
- damage_coeff = list(BRUTE = 0.8, BURN = 0.8, TOX = 1, STAMINA = 1, OXY = 1)
+ physiology = list(BURN = 0.8, BRUTE = 0.8)
/mob/living/basic/fake_crewman/assistant
name = "assistant"
@@ -199,7 +199,7 @@
ai_controller = /datum/ai_controller/basic_controller/fake_crewman/instant_hostile/ranged
death_spawner = /obj/effect/mob_spawn/corpse/human/hos
weapon = /obj/item/gun/energy/e_gun/hos
- damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 1, STAMINA = 1, OXY = 1)
+ physiology = list(BURN = 0.6, BRUTE = 0.6)
/mob/living/basic/fake_crewman/boss/hos/Initialize(mapload)
. = ..()
diff --git a/code/modules/capture_the_flag/ctf_game.dm b/code/modules/capture_the_flag/ctf_game.dm
index 8bd7806dcc86..7906cbe789ba 100644
--- a/code/modules/capture_the_flag/ctf_game.dm
+++ b/code/modules/capture_the_flag/ctf_game.dm
@@ -150,6 +150,7 @@
if(player_mob.dna.species.outfit_important_for_life)
player_mob.set_species(/datum/species/human)
+ ADD_TRAIT(player_mob, TRAIT_NO_CANON, INNATE_TRAIT) // DARKPACK EDIT ADD
var/datum/mind/new_member_mind = new_team_member.mob.mind
if(new_member_mind)
player_mob.AddComponent( \
diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm
index 0aa98f01fd98..74840f63fa8e 100644
--- a/code/modules/cargo/bounties/assistant.dm
+++ b/code/modules/cargo/bounties/assistant.dm
@@ -2,7 +2,7 @@
name = "Strange Object"
description = "Nanotrasen has taken an interest in strange objects. Find one in maintenance, and ship it off to CentCom right away."
reward = CARGO_CRATE_VALUE * 2.4
- wanted_types = list(/obj/item/relic = TRUE)
+ wanted_types = list(/obj/item/assembly/relic = TRUE)
/datum/bounty/item/assistant/scooter
name = "Scooter"
diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm
index ca88b19de408..3d9fbc10b53f 100644
--- a/code/modules/cargo/bounties/science.dm
+++ b/code/modules/cargo/bounties/science.dm
@@ -3,12 +3,12 @@
name = "E.X.P.E.R.I-MENTORially Discovered Devices"
description = "Psst, hey. Don't tell the assistants, but we're undercutting them on the value of those 'strange objects' they've been finding. Fish one up and send us a discovered one by using the E.X.P.E.R.I-MENTOR."
reward = CARGO_CRATE_VALUE * 8
- wanted_types = list(/obj/item/relic = TRUE)
+ wanted_types = list(/obj/item/assembly/relic = TRUE)
/datum/bounty/item/science/relic/applies_to(obj/O)
if(!..())
return FALSE
- var/obj/item/relic/experiment = O
+ var/obj/item/assembly/relic/experiment = O
if(experiment.activated)
return TRUE
return
diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm
index ac2ff69de451..9b2865df9867 100644
--- a/code/modules/cargo/expressconsole.dm
+++ b/code/modules/cargo/expressconsole.dm
@@ -19,9 +19,7 @@ GLOBAL_LIST_EMPTY(cargo_landing_spots)
/obj/machinery/computer/cargo/express
name = "express supply console"
- desc = "This console allows the user to purchase a package \
- with 1/40th of the delivery time: made possible by Nanotrasen's new \"1500mm Orbital Railgun\".\
- All sales are near instantaneous - please choose carefully"
+ desc = "An ordering terminal for the warehouse." // DARKPACK EDIT CHANGE - ORIGINAL: desc = "This console allows the user to purchase a package with 1/40th of the delivery time: made possible by Nanotrasen's new \"1500mm Orbital Railgun\". All sales are near instantaneous - please choose carefully"
icon_state = MAP_SWITCH("computer", "/obj/machinery/computer/cargo/express")
icon_screen = "supply_express"
circuit = /obj/item/circuitboard/computer/cargo/express
@@ -58,7 +56,7 @@ GLOBAL_LIST_EMPTY(cargo_landing_spots)
return ..()
/obj/machinery/computer/cargo/express/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
- if (tool.GetID() && allowed(user))
+ if (istype(tool, /obj/item/card/supplytech) || istype(tool, /obj/item/card/dealer)) // DARKPACK EDIT CHANGE - ORIGINAL: if (tool.GetID() && allowed(user))
locked = !locked
to_chat(user, span_notice("You [locked ? "lock" : "unlock"] the interface."))
return ITEM_INTERACT_SUCCESS
@@ -100,6 +98,9 @@ GLOBAL_LIST_EMPTY(cargo_landing_spots)
// DARKPACK EDIT ADD START - (Putting cash into the cargo console)
/obj/machinery/computer/cargo/express/click_alt(mob/user)
+ if(locked)
+ balloon_alert(user, "access denied!")
+ return
var/datum/bank_account/account = SSeconomy.get_dep_account(cargo_account)
if(isnull(account))
return
diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm
index c32ffe0271a1..7545ce1cafdd 100644
--- a/code/modules/cargo/goodies.dm
+++ b/code/modules/cargo/goodies.dm
@@ -251,6 +251,12 @@
cost = PAYCHECK_CREW * 2
contains = list(/obj/item/dyespray)
+/datum/supply_pack/goody/pilotsuit
+ name = "Mech Pilot Suit"
+ desc = "For when you need to look the part during your pre-battle checks. Can be reskinned with alt-click."
+ cost = PAYCHECK_CREW * 2
+ contains = list(/obj/item/clothing/under/costume/mech_suit)
+
/datum/supply_pack/goody/beach_ball
name = "Beach Ball Single-Pack"
// uses desc from item
@@ -461,3 +467,15 @@
desc = "A single broadcast camera which broadcasts to the station's entertainment monitors, for all your theatrical needs."
cost = PAYCHECK_COMMAND * 8
contains = list(/obj/item/broadcast_camera/cargo)
+
+/datum/supply_pack/goody/rock_tape
+ name = "Boombox tape (Rock)"
+ desc = "A classic rock track by George Patel, 'Bainrock'. Requires a boombox to play."
+ cost = PAYCHECK_CREW * 4
+ contains = list(/obj/item/music_tape/rock)
+
+/datum/supply_pack/goody/hiphop_tape
+ name = "Boombox tape (HipHop)"
+ desc = "A trendy hiphop track by F'norkiz Gamma, 'Groovepad'. Requires a boombox to play."
+ cost = PAYCHECK_CREW * 4
+ contains = list(/obj/item/music_tape/hiphop)
diff --git a/code/modules/cargo/markets/market_items/misc.dm b/code/modules/cargo/markets/market_items/misc.dm
index 323b235263fe..e477351f5456 100644
--- a/code/modules/cargo/markets/market_items/misc.dm
+++ b/code/modules/cargo/markets/market_items/misc.dm
@@ -250,3 +250,13 @@
stock_min = 2
stock_max = 5
availability_prob = 100
+
+/datum/market_item/misc/jazz_tape
+ name = "Boombox tape (Jazz)"
+ desc = "Due to the interstellar regulations on freeform jazz, it's hard to find any of the good stuff these days.\
+ This, my friend, is real jazz, performed by the infamous 'Franky Boomer'. Boombox not included."
+ item = /obj/item/music_tape/jazz
+ price_min = PAYCHECK_CREW * 2
+ price_max = PAYCHECK_CREW * 10 //The price is also freeform.
+ stock_max = 1
+ availability_prob = 30
diff --git a/code/modules/cargo/packs/exploration.dm b/code/modules/cargo/packs/exploration.dm
index 3b704306e1e9..cca7a13581b1 100644
--- a/code/modules/cargo/packs/exploration.dm
+++ b/code/modules/cargo/packs/exploration.dm
@@ -8,7 +8,7 @@
name = "Scrapyard Crate"
desc = "Outsourced crate containing various junk."
cost = CARGO_CRATE_VALUE * 5
- contains = list(/obj/item/relic,
+ contains = list(/obj/item/assembly/relic,
/obj/item/broken_bottle,
/obj/item/pickaxe/rusted)
crate_name = "scrapyard crate"
diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm
index 53f7d187585b..f1822e29fc7b 100644
--- a/code/modules/cargo/packs/imports.dm
+++ b/code/modules/cargo/packs/imports.dm
@@ -409,4 +409,17 @@
contains = list(/obj/item/clothing/shoes/bhop/rocket/jet)
crate_name = "nuVoid Jet Boots Crate"
crate_type = /obj/structure/closet/crate/goldcrate
+
+/datum/supply_pack/imports/angry_mob
+ name = "Pitchfork and Torches Gardening Crate"
+ desc = "Sometimes, you need to help organize some \"gardening\" enthusiasts, and you just need some extra tools!\
+ Load up on \"gardening\" gear this this helpful supply crate."
+ cost = CARGO_CRATE_VALUE * 5
+ order_flags = ORDER_CONTRABAND
+ contains = list(
+ /obj/item/cultivator/rake/pitchfork = 4,
+ /obj/item/flashlight/flare/torch = 4,
+ )
+ crate_name = "gardening kit"
+ crate_type = /obj/structure/closet/crate/wooden
*/
diff --git a/code/modules/cargo/packs/service.dm b/code/modules/cargo/packs/service.dm
index 1b825f98750d..876b00717d0a 100644
--- a/code/modules/cargo/packs/service.dm
+++ b/code/modules/cargo/packs/service.dm
@@ -322,3 +322,14 @@
cost = CARGO_CRATE_VALUE * 2
contains = list(/obj/item/storage/box/mousetraps = 3)
crate_name = "mousetraps crate"
+
+/datum/supply_pack/service/boombox
+ name = "MC Starter Kit & Boombox"
+ desc = "A top of the line, Nanomusic boombox. \
+ Can play specialized music tapedecks for you, and possibly even your coworkers, to enjoy. Comes with a free demo tape."
+ cost = CARGO_CRATE_VALUE * 3
+ contains = list(
+ /obj/item/boombox = 1,
+ /obj/item/music_tape = 1,
+ )
+ crate_name = "boombox crate"
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index c0c23af6298c..01279b846db6 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -182,16 +182,10 @@
///A lazy list of atoms we've examined in the last RECENT_EXAMINE_MAX_WINDOW (default 2) seconds, so that we will call [/atom/proc/examine_more] instead of [/atom/proc/examine] on them when examining
var/list/recent_examines
- var/atom/movable/screen/parallax_home/parallax_rock
- ///this is the last recorded client eye by SSparallax/fire()
- var/atom/movable/movingmob
- var/turf/previous_turf
- ///world.time of when we can state animate()ing parallax again
- var/dont_animate_parallax
- /// Direction our current area wants to move parallax
- var/parallax_movedir = 0
- /// Timers for the area directional animation, one for each layer
- var/list/parallax_animate_timers
+ /// List of all the parallax instances we are currently displaying
+ var/list/atom/movable/screen/parallax_home/parallax_instances = list()
+ /// The parallax instance tied to our eye
+ var/atom/movable/screen/parallax_home/eye_parallax
///Are we locking our movement input?
var/movement_locked = FALSE
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 6cdf6eff512a..27d756780921 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -651,7 +651,8 @@ GLOBAL_LIST_INIT(unrecommended_builds, list(
QDEL_NULL(void)
QDEL_NULL(tooltips)
QDEL_NULL(loot_panel)
- QDEL_NULL(parallax_rock)
+ QDEL_LIST(parallax_instances)
+ eye_parallax = null
seen_messages = null
Master.UpdateTickRate()
..() //Even though we're going to be hard deleted there are still some things that want to know the destroy is happening
@@ -1017,7 +1018,12 @@ GLOBAL_LIST_INIT(unrecommended_builds, list(
return
var/atom/old_eye = eye
eye = new_eye
+
+ // Draws to the default map
+ eye_parallax = create_parallax("")
+ eye_parallax.set_perspective(eye)
SEND_SIGNAL(src, COMSIG_CLIENT_SET_EYE, old_eye, new_eye)
+
/**
* Updates the keybinds for special keys
*
@@ -1084,6 +1090,29 @@ GLOBAL_LIST_INIT(unrecommended_builds, list(
var/list/actualview = getviewsize(view)
void.UpdateGreed(actualview[1],actualview[2])
+/client/proc/apply_parallax()
+ if(length(parallax_instances))
+ screen |= parallax_instances
+
+/// Gets a parallax holder if one exists on the specified map
+/client/proc/get_parallax(map)
+ for(var/atom/movable/screen/parallax_home/instance as anything in parallax_instances)
+ if(instance.submap == map)
+ return instance
+
+/// Creates a new parallax holder if one does not already exist on the passed in map
+/client/proc/create_parallax(map)
+ var/atom/movable/screen/parallax_home/existing = get_parallax(map)
+ if(existing)
+ return existing
+ return new /atom/movable/screen/parallax_home(null, null, src, map)
+
+/// Deletes the parallax holder for the passed in map
+/client/proc/delete_parallax(map)
+ var/atom/movable/screen/parallax_home/existing = get_parallax(map)
+ if(existing)
+ qdel(existing)
+
/client/proc/AnnouncePR(announcement)
if(get_chat_toggles(src) & CHAT_PULLR)
to_chat(src, announcement)
diff --git a/code/modules/client/preferences/middleware/personality.dm b/code/modules/client/preferences/middleware/personality.dm
index 835198abada3..fe0cf27d505a 100644
--- a/code/modules/client/preferences/middleware/personality.dm
+++ b/code/modules/client/preferences/middleware/personality.dm
@@ -51,7 +51,6 @@
var/max = CONFIG_GET(number/max_personalities)
data["max_personalities"] = max >= length(SSpersonalities.personalities_by_type) ? -1 : max
- data["mood_enabled"] = !CONFIG_GET(flag/disable_human_mood)
return data
diff --git a/code/modules/client/preferences/multiz_parallax.dm b/code/modules/client/preferences/multiz_parallax.dm
index cea49b4ddf5a..151219e1c693 100644
--- a/code/modules/client/preferences/multiz_parallax.dm
+++ b/code/modules/client/preferences/multiz_parallax.dm
@@ -15,5 +15,5 @@
for(var/group_key in my_hud.master_groups)
var/datum/plane_master_group/group = my_hud.master_groups[group_key]
- group.build_planes_offset(my_hud, my_hud.current_plane_offset)
+ group.refresh_planes_offset()
*/ // DARKPACK EDIT END -- Offsets Z levels to give the appearance of building 'stacking'
diff --git a/code/modules/client/preferences/multiz_performance.dm b/code/modules/client/preferences/multiz_performance.dm
index 5579c5fed52f..3b8fcfff8f0f 100644
--- a/code/modules/client/preferences/multiz_performance.dm
+++ b/code/modules/client/preferences/multiz_performance.dm
@@ -18,4 +18,4 @@
for(var/group_key in my_hud.master_groups)
var/datum/plane_master_group/group = my_hud.master_groups[group_key]
- group.build_planes_offset(my_hud, my_hud.current_plane_offset)
+ group.refresh_planes_offset()
diff --git a/code/modules/client/preferences/parallax.dm b/code/modules/client/preferences/parallax.dm
index a39a8edd489d..ff18f300fc2e 100644
--- a/code/modules/client/preferences/parallax.dm
+++ b/code/modules/client/preferences/parallax.dm
@@ -18,7 +18,7 @@
return PARALLAX_HIGH
/datum/preference/choiced/parallax/apply_to_client(client/client, value)
- client.mob?.hud_used?.update_parallax_pref()
+ client?.update_parallax_prefs()
/datum/preference/choiced/parallax/deserialize(input, datum/preferences/preferences)
// Old preferences were numbers, which causes annoyances when
diff --git a/code/modules/client/preferences/particle_weather.dm b/code/modules/client/preferences/particle_weather.dm
index c552e29a9f90..2a9f38e78501 100644
--- a/code/modules/client/preferences/particle_weather.dm
+++ b/code/modules/client/preferences/particle_weather.dm
@@ -6,13 +6,13 @@
/datum/preference/toggle/particle_weather/apply_to_client(client/client, value)
for(var/atom/movable/screen/plane_master/rendering_plate/particle_weather/plane_master as anything in client.mob?.hud_used?.get_true_plane_masters(RENDER_PLANE_PARTICLE_WEATHER))
- plane_master.update_state(client.mob)
+ plane_master.update_state()
for(var/atom/movable/screen/plane_master/rendering_plate/particle_weather/emissive/plane_master as anything in client.mob?.hud_used?.get_true_plane_masters(RENDER_PLANE_EMISSIVE_PARTICLE_WEATHER))
- plane_master.update_state(client.mob)
+ plane_master.update_state()
for(var/atom/movable/screen/plane_master/weather/plane_master as anything in client.mob?.hud_used?.get_true_plane_masters(WEATHER_PLANE))
- plane_master.update_state(client.mob)
+ plane_master.update_state()
for(var/atom/movable/screen/plane_master/weather/particle/plane_master as anything in client.mob?.hud_used?.get_true_plane_masters(PARTICLE_WEATHER_PLANE))
- plane_master.update_state(client.mob)
+ plane_master.update_state()
diff --git a/code/modules/client/preferences/species_features/lizard.dm b/code/modules/client/preferences/species_features/lizard.dm
index 4a73b00e9801..97e3ebf7bcaf 100644
--- a/code/modules/client/preferences/species_features/lizard.dm
+++ b/code/modules/client/preferences/species_features/lizard.dm
@@ -14,8 +14,11 @@
var/datum/universal_icon/final_icon = include_snout ? lizard_with_snout.copy() : lizard.copy()
if (!isnull(sprite_accessory) && sprite_accessory.icon_state != SPRITE_ACCESSORY_NONE)
- var/datum/universal_icon/accessory_icon = uni_icon(sprite_accessory.icon, "m_[key]_[sprite_accessory.icon_state]_ADJ", EAST)
- final_icon.blend_icon(accessory_icon, ICON_OVERLAY)
+ var/datum/universal_icon/accessory_icon_base = uni_icon(sprite_accessory.icon, "m_[key]_[sprite_accessory.icon_state]_ADJ", EAST)
+ if(icon_exists(sprite_accessory.icon, "m_[key]_[sprite_accessory.icon_state]_FRONT"))
+ var/datum/universal_icon/accessory_icon_front = uni_icon(sprite_accessory.icon, "m_[key]_[sprite_accessory.icon_state]_FRONT", EAST)
+ accessory_icon_base.blend_icon(accessory_icon_front, ICON_OVERLAY)
+ final_icon.blend_icon(accessory_icon_base, ICON_OVERLAY)
final_icon.crop(11, 20, 23, 32)
final_icon.scale(32, 32)
diff --git a/code/modules/clothing/chameleon/chameleon_action_subtypes.dm b/code/modules/clothing/chameleon/chameleon_action_subtypes.dm
index 052ff1a6ad45..2c2f82598f90 100644
--- a/code/modules/clothing/chameleon/chameleon_action_subtypes.dm
+++ b/code/modules/clothing/chameleon/chameleon_action_subtypes.dm
@@ -17,7 +17,7 @@
/datum/action/item_action/chameleon/change/tablet/initialize_blacklist()
. = ..()
- chameleon_blacklist |= typecacheof(list(/obj/item/modular_computer/pda/heads), only_root_path = TRUE)
+ chameleon_blacklist |= typecacheof(list(/obj/item/modular_computer/pda/crew/heads), only_root_path = TRUE)
/datum/action/item_action/chameleon/change/tablet/update_item(obj/item/picked_item)
..()
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 6e6d0171bb2b..f9982fd2ff5f 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -100,6 +100,7 @@
name = "medical HUDSunglasses"
desc = "Sunglasses with a medical HUD."
icon_state = "sunhudmed"
+ inhand_icon_state = "sunhudmed"
flash_protect = FLASH_PROTECTION_FLASH
flags_cover = GLASSESCOVERSEYES
tint = 1
@@ -191,6 +192,7 @@
name = "security HUDSunglasses"
desc = "Sunglasses with a security HUD."
icon_state = "sunhudsec"
+ inhand_icon_state = "sunhudsec"
flash_protect = FLASH_PROTECTION_FLASH
flags_cover = GLASSESCOVERSEYES
tint = 1
diff --git a/code/modules/clothing/head/fedora.dm b/code/modules/clothing/head/fedora.dm
index a05d5fdb031e..0cfe5e3a03b5 100644
--- a/code/modules/clothing/head/fedora.dm
+++ b/code/modules/clothing/head/fedora.dm
@@ -2,6 +2,7 @@
name = "fedora"
desc = "A really cool hat if you're a mobster. A really lame hat if you're not."
icon_state = "fedora"
+ inhand_icon_state = "fedora"
icon = 'icons/obj/clothing/head/hats.dmi'
worn_icon = 'icons/mob/clothing/head/hats.dmi'
hair_mask = /datum/hair_mask/standard_hat_low
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 74d500cf3d6b..9e2d5f91de13 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -171,6 +171,7 @@
name = "nun veil"
desc = "No nunsene clothing."
icon_state = "nun_hood_alt"
+ inhand_icon_state = "nun_hood_alt"
flags_inv = HIDEHAIR | HIDEEARS
clothing_flags = SNUG_FIT // can't be knocked off by throwing a paper hat.
@@ -187,6 +188,7 @@
desc = "There's only one man who can sniff out the dirty stench of crime, and he's likely wearing this hat."
armor_type = /datum/armor/fedora_det_hat
icon_state = "detective"
+ inhand_icon_state = "detective"
interaction_flags_click = NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING
dog_fashion = /datum/dog_fashion/head/detective
/// Path for the flask that spawns inside their hat roundstart
@@ -250,6 +252,7 @@
desc = "There's only one man who can recklessly discharge a firearm into a crowded street while trying to stop a criminal, \
and he's likely wearing this hat."
icon_state = /obj/item/clothing/head/fedora::icon_state
+ inhand_icon_state = "fedora"
///Detectives Fedora, but like Inspector Gadget. Not a subtype to not inherit candy corn stuff
/obj/item/clothing/head/fedora/inspector_hat
@@ -257,6 +260,7 @@
desc = "There's only one man can try to stop an evil villain."
armor_type = /datum/armor/fedora_det_hat
icon_state = "detective"
+ inhand_icon_state = "detective"
dog_fashion = /datum/dog_fashion/head/detective
interaction_flags_click = FORBID_TELEKINESIS_REACH|ALLOW_RESTING
///prefix our phrases must begin with
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index a8b86221e444..c3cc7f592abc 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -167,6 +167,7 @@ GAME_VERB(/obj/item/clothing/head/soft, flipcap, "Flip cap", null)
AddElement(/datum/element/adjust_fishing_difficulty, -5)
#define PROPHAT_MOOD "prophat"
+#define PROPHAT_SUICIDE_TIME (10 SECONDS)
/obj/item/clothing/head/soft/propeller_hat
name = "propeller hat"
@@ -195,11 +196,43 @@ GAME_VERB(/obj/item/clothing/head/soft, flipcap, "Flip cap", null)
. = ..()
if(slot & ITEM_SLOT_HEAD)
user.add_mood_event(PROPHAT_MOOD, /datum/mood_event/prophat)
+ RegisterSignal(user, COMSIG_LIVING_SUICIDE_ACT, PROC_REF(on_suicide_act))
/obj/item/clothing/head/soft/propeller_hat/dropped(mob/living/user)
. = ..()
+ UnregisterSignal(user, COMSIG_LIVING_SUICIDE_ACT)
user.clear_mood_event(PROPHAT_MOOD)
active = FALSE
update_icon()
+/obj/item/clothing/head/soft/propeller_hat/proc/on_suicide_act(mob/living/source)
+ SIGNAL_HANDLER
+ if(source.get_active_held_item())
+ return NONE
+
+ return suicide_act(source)
+
+/obj/item/clothing/head/soft/propeller_hat/suicide_act(mob/living/user)
+ if(!isturf(user.loc))
+ user.visible_message(span_suicide("[user] starts spinning [src] as fast as possible! \
+ It looks like [user.p_theyre()] trying to fly off into the sunset... yet the sky is out of reach for [user.p_them()]..."))
+ return SHAME
+
+ ADD_TRAIT(src, TRAIT_NODROP, TRAIT_GENERIC)
+ user.add_traits(list(TRAIT_GODMODE, TRAIT_FORCED_STANDING, TRAIT_UNDENSE, TRAIT_IMMOBILIZED, TRAIT_INCAPACITATED, TRAIT_HANDS_BLOCKED), TRAIT_GENERIC)
+ user.move_resist = INFINITY
+ user.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ user.set_suicide(TRUE)
+ user.visible_message(span_suicide("[user] starts spinning [src] as fast as possible! \
+ It looks like [user.p_theyre()] trying to fly off into the sunset!"))
+ playsound(src, 'sound/effects/whirthunk.ogg', 75)
+ animate(user, PROPHAT_SUICIDE_TIME, pixel_z = 256, alpha = 0)
+ QDEL_IN(user, PROPHAT_SUICIDE_TIME)
+ // drop objects that will get flagged by tsa before we board
+ for(var/obj/item/should_keep in user.get_all_contents())
+ if(should_keep.resistance_flags & INDESTRUCTIBLE)
+ should_keep.forceMove(user.drop_location())
+ return MANUAL_SUICIDE
+
+#undef PROPHAT_SUICIDE_TIME
#undef PROPHAT_MOOD
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index e18060fc67af..5054b112173c 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -349,6 +349,13 @@ GLOBAL_LIST_INIT(clown_mask_options, list(
to_chat(user, span_notice("Your Clown Mask has now morphed into [choice], all praise the Honkmother!"))
return TRUE
+/obj/item/clothing/mask/gas/clown_hat/clownops
+ name = "tactical clown wig and mask"
+ desc = "A tactical twist on a troubadour's tradition."
+ flash_protect = FLASH_PROTECTION_FLASH
+ resistance_flags = FIRE_PROOF
+ flags_cover = MASKCOVERSEYES | PEPPERPROOF
+
/obj/item/clothing/mask/gas/sexyclown
name = "sexy-clown wig and mask"
desc = "A feminine clown mask for the dabbling crossdressers or female entertainers."
diff --git a/code/modules/clothing/neck/collar_bomb.dm b/code/modules/clothing/neck/collar_bomb.dm
index 13974d269b94..5bea6fe8cb14 100644
--- a/code/modules/clothing/neck/collar_bomb.dm
+++ b/code/modules/clothing/neck/collar_bomb.dm
@@ -25,6 +25,7 @@
src.button = button
button?.collar = src
set_wires(new /datum/wires/collar_bomb(src))
+ AddElement(/datum/element/cuffable_item)
/obj/item/clothing/neck/collar_bomb/Destroy()
button?.collar = null
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index 02bbb5503634..fa16c1b91d5c 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -168,14 +168,14 @@
gloves = /obj/item/clothing/gloves/color/black
shoes = /obj/item/clothing/shoes/sneakers/black
l_pocket = /obj/item/pen
- r_pocket = /obj/item/modular_computer/pda/heads
+ r_pocket = /obj/item/modular_computer/pda/crew/heads
l_hand = /obj/item/clipboard
/datum/outfit/centcom/centcom_official/post_equip(mob/living/carbon/human/H, visuals_only = FALSE)
if(visuals_only)
return
- var/obj/item/modular_computer/pda/heads/pda = H.r_store
+ var/obj/item/modular_computer/pda/crew/heads/pda = H.r_store
pda.imprint_id(H.real_name, "CentCom Official")
var/obj/item/card/id/W = H.wear_id
@@ -444,7 +444,6 @@
)
belt = /obj/item/gun/ballistic/revolver/mateba
ears = /obj/item/radio/headset/headset_cent/alt
- glasses = /obj/item/clothing/glasses/hud/toggle/thermal
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
mask = /obj/item/clothing/mask/gas/sechailer/swat
shoes = /obj/item/clothing/shoes/combat/swat
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index ba6fae4d6aa6..3faeb5afe403 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -198,7 +198,7 @@
id_trim = /datum/id_trim/reaper_assassin
uniform = /obj/item/clothing/under/costume/buttondown/slacks/service
neck = /obj/item/clothing/neck/tie/red/hitman/tied
- belt = /obj/item/modular_computer/pda/heads
+ belt = /obj/item/modular_computer/pda/crew/heads
ears = /obj/item/radio/headset
gloves = /obj/item/clothing/gloves/color/black
glasses = /obj/item/clothing/glasses/sunglasses
@@ -224,7 +224,7 @@
sec_briefcase.contents += new /obj/item/ammo_box/speedloader/c357
sec_briefcase.contents += new /obj/item/grenade/c4/x4
- var/obj/item/modular_computer/pda/heads/pda = H.belt
+ var/obj/item/modular_computer/pda/crew/heads/pda = H.belt
pda.imprint_id(H.real_name, "Reaper")
var/obj/item/card/id/W = H.wear_id
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index 60f7d33b93e4..cba8519ba2a3 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -25,6 +25,14 @@
var/magpulse_fishing_modifier = 8
/// How much do these boots affect fishing when not active
var/fishing_modifier = 4
+ /// Footstep SFX when the magboots are off
+ var/list/inactive_step_sounds = list('sound/items/modsuit/rigstep_medium.ogg')
+ /// Footstep SFX when the magboots are on
+ var/list/active_step_sounds = list('sound/items/modsuit/rigstep_chonk.ogg')
+
+/obj/item/clothing/shoes/magboots/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/shoe_footstep, inactive_step_sounds, volume = 50)
/obj/item/clothing/shoes/magboots/Initialize(mapload)
. = ..()
@@ -61,6 +69,7 @@ GAME_VERB_SRC(/obj/item/clothing/shoes/magboots, toggle, usr, "Toggle Magboots",
AddElement(/datum/element/adjust_fishing_difficulty, magpulse_fishing_modifier)
else if(magpulse_fishing_modifier != fishing_modifier)
RemoveElement(/datum/element/adjust_fishing_difficulty)
+ AddComponent(/datum/component/shoe_footstep, active_step_sounds, volume = 50)
else
if(fishing_modifier)
AddElement(/datum/element/adjust_fishing_difficulty, fishing_modifier)
@@ -68,6 +77,7 @@ GAME_VERB_SRC(/obj/item/clothing/shoes/magboots, toggle, usr, "Toggle Magboots",
RemoveElement(/datum/element/adjust_fishing_difficulty)
detach_clothing_traits(active_traits)
slowdown -= slowdown_active
+ AddComponent(/datum/component/shoe_footstep, inactive_step_sounds, volume = 50)
update_appearance()
balloon_alert(user, "mag-pulse [magpulse ? "enabled" : "disabled"]")
@@ -91,6 +101,8 @@ GAME_VERB_SRC(/obj/item/clothing/shoes/magboots, toggle, usr, "Toggle Magboots",
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
magpulse_fishing_modifier = 3
fishing_modifier = 0
+ inactive_step_sounds = list('sound/items/modsuit/rigstep.ogg')
+ active_step_sounds = list('sound/items/modsuit/rigstep_medium.ogg')
/obj/item/clothing/shoes/magboots/syndie
name = "blood-red magboots"
@@ -99,3 +111,4 @@ GAME_VERB_SRC(/obj/item/clothing/shoes/magboots, toggle, usr, "Toggle Magboots",
base_icon_state = "syndiemag"
magpulse_fishing_modifier = 6
fishing_modifier = 3
+ active_step_sounds = list('sound/items/modsuit/rigstep_heavy.ogg')
diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm
index f497b5d701b4..1f4c50fe9e22 100644
--- a/code/modules/clothing/suits/costume.dm
+++ b/code/modules/clothing/suits/costume.dm
@@ -468,10 +468,11 @@
icon = 'icons/obj/clothing/suits/costume.dmi'
worn_icon = 'icons/mob/clothing/suits/costume.dmi'
inhand_icon_state = "labcoat"
- body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET
+ body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET|HANDS
allowed = list()
hoodtype = /obj/item/clothing/head/hooded/human_head
species_exception = list(/datum/species/golem) //Finally, flesh
+ clothing_flags = parent_type::clothing_flags | PLASMAMAN_PREVENT_IGNITION
/obj/item/clothing/head/hooded/human_head
name = "bloated human head"
@@ -482,6 +483,8 @@
body_parts_covered = HEAD
flags_cover = HEADCOVERSEYES
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
+ clothing_flags = parent_type::clothing_flags | PLASMAMAN_PREVENT_IGNITION | HEADINTERNALS
+ clothing_traits = list(TRAIT_HUMAN_DISGUISE) // Just the helmet is fine because it's attached to the suit
/obj/item/clothing/suit/costume/shrine_maiden
name = "shrine maiden's outfit"
diff --git a/code/modules/clothing/suits/wetfloor.dm b/code/modules/clothing/suits/wetfloor.dm
index e1d241ac901b..0610adf4ace8 100644
--- a/code/modules/clothing/suits/wetfloor.dm
+++ b/code/modules/clothing/suits/wetfloor.dm
@@ -3,6 +3,7 @@
desc = "Caution! Wet Floor!"
icon = 'icons/obj/clothing/suits/utility.dmi'
icon_state = "caution"
+ inhand_icon_state = "caution"
worn_icon = 'icons/mob/clothing/suits/utility.dmi'
lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm
index c38caff9e9b2..723584a689a8 100644
--- a/code/modules/clothing/under/costume.dm
+++ b/code/modules/clothing/under/costume.dm
@@ -146,6 +146,7 @@
name = "black yukata"
desc = "A comfortable black cotton yukata inspired by traditional designs, perfect for a non-formal setting."
icon_state = "yukata1"
+ inhand_icon_state = "yukata1"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
@@ -157,11 +158,13 @@
name = "green yukata"
desc = "A comfortable green cotton yukata inspired by traditional designs, perfect for a non-formal setting."
icon_state = "yukata2"
+ inhand_icon_state = "yukata2"
/obj/item/clothing/under/costume/yukata/white
name = "white yukata"
desc = "A comfortable white cotton yukata inspired by traditional designs, perfect for a non-formal setting."
icon_state = "yukata3"
+ inhand_icon_state = "yukata3"
/obj/item/clothing/under/costume/kimono
name = "black kimono"
@@ -291,29 +294,44 @@
abstract_type = /datum/atom_skin/mech_suit
/datum/atom_skin/mech_suit/red
- preview_name = "Red"
+ preview_name = "Red" //Asuka from evangelion
new_icon_state = "red_mech_suit"
/datum/atom_skin/mech_suit/white
- preview_name = "White"
+ preview_name = "White" //Rei from evangelion
new_icon_state = "white_mech_suit"
/datum/atom_skin/mech_suit/blue
- preview_name = "Blue"
+ preview_name = "Blue" //Shinji from Evangelion
new_icon_state = "blue_mech_suit"
/datum/atom_skin/mech_suit/black
- preview_name = "Black"
+ preview_name = "Black" //Based on the robotics jumpsuot
new_icon_state = "black_mech_suit"
+/datum/atom_skin/mech_suit/royal
+ preview_name = "royal division" //Kallen Stadtfeld from Code Geass
+ new_icon_state = "royal_mech_suit"
+
+/datum/atom_skin/mech_suit/royal_alt
+ preview_name = "royal division - alternate" //Kallen again, with her alternate design
+ new_icon_state = "royal_mech_suit_alt"
+
+/datum/atom_skin/mech_suit/explorer
+ preview_name = "explorer corps" //Sleeker version of the robotics jumpsuit
+ new_icon_state = "explorer_mech_suit"
+
+/datum/atom_skin/mech_suit/explorer
+ preview_name = "explorer corps - alternate" //Elster from SIGNALIS
+ new_icon_state = "explorer_mech_suit_alt"
+
/obj/item/clothing/under/costume/mech_suit
name = "mech pilot's suit"
- desc = "A mech pilot's suit. Might make your butt look big."
- icon_state = "red_mech_suit"
+ desc = "A mech pilot's suit. Might make your butt look big. Alt-click to reskin."
+ icon_state = "explorer_mech_suit"
inhand_icon_state = null
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- female_sprite_flags = NO_FEMALE_UNIFORM
alternate_worn_layer = GLOVES_LAYER //covers hands but gloves can go over it. This is how these things work in my head.
can_adjust = FALSE
diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
index 93744f64d746..c58c1b4ce3ed 100644
--- a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
+++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
@@ -54,6 +54,10 @@
COOLDOWN_START(src, extinguish_timer, extinguish_cooldown)
// Check if our (possibly other) wearer is on fire once the cooldown ends
addtimer(CALLBACK(src, PROC_REF(check_fire_state)), extinguish_cooldown)
+ activate_fire_safety(owner)
+
+/// Extinguish our suit
+/obj/item/clothing/under/plasmaman/proc/activate_fire_safety(mob/living/owner)
owner.visible_message(span_warning("[owner]'s suit automatically extinguishes [owner.p_them()]!"), span_warning("Your suit automatically extinguishes you."))
owner.extinguish_mob()
new /obj/effect/particle_effect/water(get_turf(owner))
@@ -158,23 +162,8 @@
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
-/obj/item/clothing/under/plasmaman/clown/check_fire_state(datum/source, datum/status_effect/fire_handler/status_effect)
- if (!ishuman(loc))
- return
-
- // This is weird but basically we're calling this proc once the cooldown ends in case our wearer gets set on fire again during said cooldown
- // This is why we're ignoring source and instead checking by loc
- var/mob/living/carbon/human/owner = loc
- if (!owner.on_fire || !owner.is_atmos_sealed(additional_flags = PLASMAMAN_PREVENT_IGNITION, check_hands = TRUE))
- return
-
- if (!extinguishes_left || !COOLDOWN_FINISHED(src, extinguish_timer))
- return
-
- extinguishes_left -= 1
- COOLDOWN_START(src, extinguish_timer, extinguish_cooldown)
- // Check if our (possibly other) wearer is on fire once the cooldown ends
- addtimer(CALLBACK(src, PROC_REF(check_fire_state)), extinguish_cooldown)
+/// Sprays lube instead of water
+/obj/item/clothing/under/plasmaman/clown/activate_fire_safety(mob/living/owner)
owner.visible_message(span_warning("[owner]'s suit spews space lube everywhere!"), span_warning("Your suit spews space lube everywhere!"))
owner.extinguish_mob()
do_foam(4, src, get_turf(owner), /datum/reagent/lube, 15)
diff --git a/code/modules/deathmatch/deathmatch_loadouts.dm b/code/modules/deathmatch/deathmatch_loadouts.dm
index cec6a4b16e17..d4b5dcadd8a5 100644
--- a/code/modules/deathmatch/deathmatch_loadouts.dm
+++ b/code/modules/deathmatch/deathmatch_loadouts.dm
@@ -677,7 +677,7 @@
r_pocket = /obj/item/grenade/gluon
l_hand = /obj/item/gun/energy/alien
r_hand = /obj/item/gun/energy/alien
- belt = /obj/item/gun/energy/shrink_ray
+ belt = /obj/item/gun/energy/recharge/shrink_ray
/datum/outfit/deathmatch_loadout/battler/clown/upgraded
name = "Deathmatch: Clown (Syndicate Gear)"
diff --git a/code/modules/deathmatch/deathmatch_lobby.dm b/code/modules/deathmatch/deathmatch_lobby.dm
index 87dd400bc3da..60d41320da85 100644
--- a/code/modules/deathmatch/deathmatch_lobby.dm
+++ b/code/modules/deathmatch/deathmatch_lobby.dm
@@ -140,6 +140,7 @@
new_player.dna.update_dna_identity()
new_player.updateappearance(icon_update = TRUE, mutcolor_update = TRUE, mutations_overlay_update = TRUE)
new_player.add_traits(list(TRAIT_CANNOT_CRYSTALIZE, TRAIT_PERMANENTLY_MORTAL, TRAIT_TEMPORARY_BODY), INNATE_TRAIT)
+ ADD_TRAIT(new_player, TRAIT_NO_CANON, INNATE_TRAIT) // DARKPACK EDIT ADD
if(observer.mind)
new_player.AddComponent( \
/datum/component/temporary_body, \
diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm
index f96d2300197a..05a7614f03d4 100644
--- a/code/modules/events/_event.dm
+++ b/code/modules/events/_event.dm
@@ -2,28 +2,43 @@
//this singleton datum is used by the events controller to dictate how it selects events
/datum/round_event_control
- var/name //The human-readable name of the event
- var/category //The category of the event
- var/description //The description of the event
- var/typepath //The typepath of the event datum /datum/round_event
-
- var/weight = 10 //The weight this event has in the random-selection process.
- //Higher weights are more likely to be picked.
- //10 is the default weight. 20 is twice more likely; 5 is half as likely as this default.
- //0 here does NOT disable the event, it just makes it extremely unlikely
-
- var/earliest_start = 20 MINUTES //The earliest world.time that an event can start (round-duration in deciseconds) default: 20 mins
- var/min_players = 0 //The minimum amount of alive, non-AFK human players on server required to start the event.
-
- var/occurrences = 0 //How many times this event has occurred
- var/max_occurrences = 20 //The maximum number of times this event can occur (naturally), it can still be forced.
- //By setting this to 0 you can effectively disable an event.
-
- var/holidayID = "" //string which should be in the SSeventss.holidays list if you wish this event to be holiday-specific
- //anything with a (non-null) holidayID which does not match holiday, cannot run.
+ ///The human-readable name of the event
+ var/name
+ ///The category of the event
+ var/category
+ ///The description of the event
+ var/description
+ ///The typepath of the event datum /datum/round_event
+ var/typepath
+
+ /**
+ * The weight this event has in the random-selection process.
+ * Higher weights are more likely to be picked.
+ * 10 is the default weight. 20 is twice more likely; 5 is half as likely as this default.
+ * 0 here does NOT disable the event, it just makes it extremely unlikely.
+ */
+ var/weight = 10
+
+ /// The earliest world.time that an event can start (round-duration in deciseconds) default: 20 mins
+ var/earliest_start = 20 MINUTES
+ /// The minimum amount of alive, non-AFK human players on server required to start the event.
+ var/min_players = 0
+
+ /// How many times this event has occurred
+ /// This is incremented even if the event if forced
+ VAR_FINAL/occurrences = 0
+ /// The maximum number of times this event can occur (naturally), it can still be forced.
+ /// Setting this to 0 effectively disables the event.
+ var/max_occurrences = 20
+
+ /// String which should be in the SSeventss.holidays list if you wish this event to be holiday-specific
+ /// Anything with a (non-null) holidayID which does not match holiday, cannot run.
+ var/holidayID = ""
+
+ /// Whether it's a "summon events" wizard event
var/wizardevent = FALSE
- var/alert_observers = TRUE //should we let the ghosts know this event is firing
- //should be disabled on events that fire a lot
+ /// Should we let the ghosts know this event is firing?
+ var/alert_observers = TRUE
/// Minimum wizard rituals at which to trigger this event, inclusive
var/min_wizard_trigger_potency = NEVER_TRIGGERED_BY_WIZARDS
@@ -38,6 +53,8 @@
/// Flags dictating whether this event should be run on certain kinds of map
var/map_flags = NONE
+ /// If TRUE, the event won't run naturally/randomly. Toggled by admins.
+ VAR_FINAL/admin_disabled = FALSE
var/darkpack_allowed = FALSE // DARKPACK EDIT ADD - EVENTS
/datum/round_event_control/New()
@@ -82,6 +99,8 @@
return FALSE
if(ispath(typepath, /datum/round_event/ghost_role) && !(GLOB.ghost_role_flags & GHOSTROLE_MIDROUND_EVENT))
return FALSE
+ if(admin_disabled)
+ return FALSE
return TRUE
diff --git a/code/modules/events/holiday/easter.dm b/code/modules/events/holiday/easter.dm
index 805dbf48223f..95b93b8d75d3 100644
--- a/code/modules/events/holiday/easter.dm
+++ b/code/modules/events/holiday/easter.dm
@@ -82,6 +82,7 @@
name = "wrapped egg"
desc = "A chocolate egg containing a little something special. Unwrap and enjoy!"
icon_state = "egg"
+ inhand_icon_state = "egg"
resistance_flags = FLAMMABLE
w_class = WEIGHT_CLASS_TINY
icon = 'icons/obj/food/egg.dmi'
@@ -188,7 +189,7 @@
/datum/reagent/consumable/milk = 5
)
result = /obj/item/food/bowled/mammi
- added_foodtypes = DAIRY
+ added_foodtypes = DAIRY | CHOCOLATE // DARKPACK EDIT CHANGE - (Chocolate)
dish_category = DISH_CANDY
meal_category = MEAL_DESSERT
@@ -198,7 +199,7 @@
icon_state = "chocolatebunny"
food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/coco = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
crafting_complexity = FOOD_COMPLEXITY_1
- foodtypes = JUNKFOOD | SUGAR
+ foodtypes = JUNKFOOD | SUGAR | CHOCOLATE //DARKPACK EDIT ADDITION: Chocolate
/datum/crafting_recipe/food/chocolatebunny
name = "Chocolate bunny"
diff --git a/code/modules/events/immovable_rod/immovable_rod.dm b/code/modules/events/immovable_rod/immovable_rod.dm
index 899247e69ebf..cff96a54df0d 100644
--- a/code/modules/events/immovable_rod/immovable_rod.dm
+++ b/code/modules/events/immovable_rod/immovable_rod.dm
@@ -45,7 +45,7 @@
SSpoints_of_interest.make_point_of_interest(src)
- RegisterSignal(src, COMSIG_ATOM_ENTERING, PROC_REF(on_entering_atom))
+ RegisterSignals(src, list(COMSIG_ATOM_ENTERING, COMSIG_MOVABLE_TURF_INITIALIZING), PROC_REF(on_entering_atom))
if(special_target)
GLOB.move_manager.home_onto(src, special_target)
@@ -53,7 +53,7 @@
GLOB.move_manager.move_towards(src, real_destination)
/obj/effect/immovablerod/Destroy(force)
- UnregisterSignal(src, COMSIG_ATOM_ENTERING)
+ UnregisterSignal(src, list(COMSIG_ATOM_ENTERING, COMSIG_MOVABLE_TURF_INITIALIZING))
SSaugury.unregister_doom(src)
destination_turf = null
special_target = null
diff --git a/code/modules/events/space_vines/vine_controller.dm b/code/modules/events/space_vines/vine_controller.dm
index e33ed0c2b0f1..3ede6d5bba54 100644
--- a/code/modules/events/space_vines/vine_controller.dm
+++ b/code/modules/events/space_vines/vine_controller.dm
@@ -83,7 +83,7 @@ GLOBAL_LIST_INIT(vine_mutations_list, init_vine_mutation_list())
break
if(parent)
vine.mutations |= parent.mutations
- vine.trait_flags |= parent.trait_flags
+
var/parentcolor = parent.atom_colours[FIXED_COLOUR_PRIORITY]
vine.add_atom_colour(parentcolor, FIXED_COLOUR_PRIORITY)
if(prob(mutativeness))
diff --git a/code/modules/events/space_vines/vine_mutations.dm b/code/modules/events/space_vines/vine_mutations.dm
index bfe185657a2a..0af46eebac18 100644
--- a/code/modules/events/space_vines/vine_mutations.dm
+++ b/code/modules/events/space_vines/vine_mutations.dm
@@ -9,15 +9,17 @@
var/hue
/// The quality of our mutation (how good or bad is it?)
var/quality
+ /// The flavor text to add to the venus flytrap ghost role spawners
+ var/venus_flavor_text = ""
-/datum/spacevine_mutation/proc/add_mutation_to_vinepiece(obj/structure/spacevine/holder)
- holder.mutations |= src
- holder.add_atom_colour(hue, FIXED_COLOUR_PRIORITY)
+/datum/spacevine_mutation/proc/add_mutation_to_vinepiece(obj/structure/spacevine/vine)
+ vine.mutations |= src
+ vine.add_atom_colour(hue, FIXED_COLOUR_PRIORITY)
-/datum/spacevine_mutation/proc/on_buckle(obj/structure/spacevine/holder, mob/living/buckled)
+/datum/spacevine_mutation/proc/on_buckle(obj/structure/spacevine/vine, mob/living/buckled)
SHOULD_CALL_PARENT(TRUE)
buckled.layer = SPACEVINE_MOB_LAYER
- RegisterSignal(buckled, COMSIG_MOB_UNBUCKLED, PROC_REF(on_unbuckle))
+ RegisterSignal(buckled, COMSIG_MOB_UNBUCKLED, PROC_REF(on_unbuckle), override=TRUE)
/datum/spacevine_mutation/proc/on_unbuckle(datum/source)
SHOULD_CALL_PARENT(TRUE)
@@ -28,37 +30,40 @@
buckled.layer = initial(buckled.layer)
UnregisterSignal(buckled, COMSIG_MOB_UNBUCKLED)
-/datum/spacevine_mutation/proc/process_mutation(obj/structure/spacevine/holder)
+/datum/spacevine_mutation/proc/equip_venus_trap(mob/living/basic/venus_human_trap/venus_trap)
return
-/datum/spacevine_mutation/proc/on_birth(obj/structure/spacevine/holder)
+/datum/spacevine_mutation/proc/process_mutation(obj/structure/spacevine/vine)
return
-/datum/spacevine_mutation/proc/on_grow(obj/structure/spacevine/holder)
+/datum/spacevine_mutation/proc/on_birth(obj/structure/spacevine/vine)
return
-/datum/spacevine_mutation/proc/on_death(obj/structure/spacevine/holder)
+/datum/spacevine_mutation/proc/on_grow(obj/structure/spacevine/vine)
return
-/datum/spacevine_mutation/proc/on_hit(obj/structure/spacevine/holder, mob/hitter, obj/item/item, expected_damage)
- . = expected_damage
+/datum/spacevine_mutation/proc/on_death(obj/structure/spacevine/vine)
+ return
+
+/datum/spacevine_mutation/proc/on_hit(obj/structure/spacevine/vine, obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
+ return
-/datum/spacevine_mutation/proc/on_cross(obj/structure/spacevine/holder, mob/crosser)
+/datum/spacevine_mutation/proc/on_cross(obj/structure/spacevine/vine, mob/crosser)
return
-/datum/spacevine_mutation/proc/on_chem(obj/structure/spacevine/holder, datum/reagent/chem)
+/datum/spacevine_mutation/proc/on_chem(obj/structure/spacevine/vine, datum/reagent/chem)
return
-/datum/spacevine_mutation/proc/on_eat(obj/structure/spacevine/holder, mob/living/eater)
+/datum/spacevine_mutation/proc/on_eat(obj/structure/spacevine/vine, mob/living/eater)
return
-/datum/spacevine_mutation/proc/on_spread(obj/structure/spacevine/holder, turf/target)
+/datum/spacevine_mutation/proc/on_spread(obj/structure/spacevine/vine, turf/target)
return
-/datum/spacevine_mutation/proc/on_explosion(severity, target, obj/structure/spacevine/holder)
+/datum/spacevine_mutation/proc/on_explosion(severity, target, obj/structure/spacevine/vine)
return FALSE
-/datum/spacevine_mutation/proc/additional_atmos_processes(obj/structure/spacevine/holder, datum/gas_mixture/air)
+/datum/spacevine_mutation/proc/additional_atmos_processes(obj/structure/spacevine/vine, datum/gas_mixture/air)
return
/datum/spacevine_mutation/aggressive_spread/proc/aggrospread_act(obj/structure/spacevine/vine, mob/living/M)
@@ -70,10 +75,14 @@
hue = "#B2EA70"
quality = POSITIVE
severity = SEVERITY_TRIVIAL
+ venus_flavor_text = "Light - Your body emits a glowing light"
+
+/datum/spacevine_mutation/light/on_grow(obj/structure/spacevine/vine)
+ if(vine.growth_stage)
+ vine.set_light(LIGHT_MUTATION_BRIGHTNESS, 0.3)
-/datum/spacevine_mutation/light/on_grow(obj/structure/spacevine/holder)
- if(holder.growth_stage)
- holder.set_light(LIGHT_MUTATION_BRIGHTNESS, 0.3)
+/datum/spacevine_mutation/light/equip_venus_trap(mob/living/basic/venus_human_trap/venus_trap)
+ venus_trap.glow = venus_trap.mob_light(LIGHT_MUTATION_BRIGHTNESS, 0.3)
/datum/spacevine_mutation/toxicity
name = "Toxic"
@@ -81,15 +90,16 @@
hue = "#9B3675"
severity = SEVERITY_AVERAGE
quality = NEGATIVE
+ venus_flavor_text = "Toxin Resistance - Immune to chemical weedkillers and toxins"
var/required_coverage = HEAD|CHEST|GROIN|LEGS|FEET|ARMS|HANDS
-/datum/spacevine_mutation/toxicity/on_cross(obj/structure/spacevine/holder, mob/living/crosser)
+/datum/spacevine_mutation/toxicity/on_cross(obj/structure/spacevine/vine, mob/living/crosser)
if(isvineimmune(crosser) || issilicon(crosser))
return
if(!prob(TOXICITY_MUTATION_PROB))
return
- var/datum/spacevine_mutation/thorns/thorns = locate() in holder.mutations
+ var/datum/spacevine_mutation/thorns/thorns = locate() in vine.mutations
if(thorns)
to_chat(crosser, span_alert("You are pricked by thorns and feel a strange sensation."))
@@ -108,27 +118,39 @@
to_chat(crosser, span_alert("You accidentally touch the vine and feel a strange sensation."))
crosser.apply_damage(20, TOX)
-/datum/spacevine_mutation/toxicity/on_eat(obj/structure/spacevine/holder, mob/living/eater)
+/datum/spacevine_mutation/toxicity/on_eat(obj/structure/spacevine/vine, mob/living/eater)
if(!isvineimmune(eater))
eater.apply_damage(20, TOX)
+/datum/spacevine_mutation/toxicity/equip_venus_trap(mob/living/basic/venus_human_trap/venus_trap)
+ ADD_TRAIT(venus_trap, TRAIT_TOXIMMUNE, INNATE_TRAIT)
+
/datum/spacevine_mutation/explosive // JC IT'S A BOMB
name = "Explosive"
description = "Causes an explosion when destroyed."
hue = "#D83A56"
quality = NEGATIVE
severity = SEVERITY_MAJOR
+ venus_flavor_text = "Explosive - You will violently explode upon death"
-/datum/spacevine_mutation/explosive/on_explosion(explosion_severity, target, obj/structure/spacevine/holder)
+/datum/spacevine_mutation/explosive/on_explosion(explosion_severity, target, obj/structure/spacevine/vine)
if(explosion_severity >= EXPLODE_DEVASTATE)
- QDEL_IN(holder, 0.5 SECONDS)
+ QDEL_IN(vine, 0.5 SECONDS)
return TRUE
- qdel(holder)
+ qdel(vine)
return FALSE
-/datum/spacevine_mutation/explosive/on_death(obj/structure/spacevine/holder, mob/hitter, obj/item/item)
- explosion(holder, light_impact_range = EXPLOSION_MUTATION_IMPACT_RADIUS, adminlog = FALSE)
+/datum/spacevine_mutation/explosive/on_death(obj/structure/spacevine/vine, mob/hitter, obj/item/item)
+ explosion(vine, light_impact_range = EXPLOSION_MUTATION_IMPACT_RADIUS, adminlog = FALSE)
+
+/datum/spacevine_mutation/explosive/equip_venus_trap(mob/living/basic/venus_human_trap/venus_trap)
+ RegisterSignal(venus_trap, COMSIG_LIVING_DEATH, PROC_REF(on_venus_trap_death), override=TRUE)
+
+/datum/spacevine_mutation/explosive/proc/on_venus_trap_death(mob/living/spawned_mob, mob/mob_possessor, apply_prefs)
+ SIGNAL_HANDLER
+
+ explosion(spawned_mob, light_impact_range = EXPLOSION_MUTATION_IMPACT_RADIUS, adminlog = FALSE)
/datum/spacevine_mutation/fire_proof
name = "Fire proof"
@@ -136,15 +158,20 @@
hue = "#FF616D"
quality = MINOR_NEGATIVE
severity = SEVERITY_ABOVE_AVERAGE
+ venus_flavor_text = "Heat Resistance - Immune to extreme heat and fire"
-/datum/spacevine_mutation/fire_proof/add_mutation_to_vinepiece(obj/structure/spacevine/holder)
- . = ..()
- holder.trait_flags |= SPACEVINE_HEAT_RESISTANT
+/datum/spacevine_mutation/fire_proof/on_hit(obj/structure/spacevine/vine, obj/item/item, mob/living/hitter, list/modifiers, list/attack_modifiers)
+ if(item?.damtype == BURN)
+ MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 0)
+ return ..()
+
+/datum/spacevine_mutation/fire_proof/on_grow(obj/structure/spacevine/vine)
+ vine.resistance_flags |= FIRE_PROOF
-/datum/spacevine_mutation/fire_proof/on_hit(obj/structure/spacevine/holder, mob/hitter, obj/item/attacking_item, expected_damage)
- if(attacking_item && attacking_item.damtype == BURN)
- return 0
- return expected_damage
+/datum/spacevine_mutation/fire_proof/equip_venus_trap(mob/living/basic/venus_human_trap/venus_trap)
+ venus_trap.unsuitable_heat_damage = 0
+ venus_trap.resistance_flags |= FIRE_PROOF
+ ADD_TRAIT(venus_trap, TRAIT_RESISTHEAT, INNATE_TRAIT)
/datum/spacevine_mutation/cold_proof
name = "Cold proof"
@@ -152,10 +179,15 @@
hue = "#0BD5D9"
quality = MINOR_NEGATIVE
severity = SEVERITY_AVERAGE
+ venus_flavor_text = "Cold Resistance - Immune to freezing temperatures"
-/datum/spacevine_mutation/cold_proof/add_mutation_to_vinepiece(obj/structure/spacevine/holder)
- . = ..()
- holder.trait_flags |= SPACEVINE_COLD_RESISTANT
+/datum/spacevine_mutation/cold_proof/on_grow(obj/structure/spacevine/vine)
+ vine.resistance_flags |= FREEZE_PROOF
+
+/datum/spacevine_mutation/cold_proof/equip_venus_trap(mob/living/basic/venus_human_trap/venus_trap)
+ venus_trap.unsuitable_cold_damage = 0
+ venus_trap.resistance_flags |= FREEZE_PROOF
+ ADD_TRAIT(venus_trap, TRAIT_RESISTCOLD, INNATE_TRAIT)
/datum/spacevine_mutation/temp_stabilisation
name = "Temperature stabilisation"
@@ -164,11 +196,11 @@
quality = POSITIVE
severity = SEVERITY_MINOR
-/datum/spacevine_mutation/temp_stabilisation/add_mutation_to_vinepiece(obj/structure/spacevine/holder)
+/datum/spacevine_mutation/temp_stabilisation/add_mutation_to_vinepiece(obj/structure/spacevine/vine)
. = ..()
- holder.always_atmos_process = TRUE
+ vine.always_atmos_process = TRUE
-/datum/spacevine_mutation/temp_stabilisation/additional_atmos_processes(obj/structure/spacevine/holder, datum/gas_mixture/air)
+/datum/spacevine_mutation/temp_stabilisation/additional_atmos_processes(obj/structure/spacevine/vine, datum/gas_mixture/air)
var/heat_capacity = air.heat_capacity()
if(!heat_capacity) // No heating up space or vacuums
return
@@ -179,7 +211,7 @@
if(air.temperature > T20C)
delta_temperature *= -1
air.temperature += delta_temperature
- holder.air_update_turf(FALSE, FALSE)
+ vine.air_update_turf(FALSE, FALSE)
/datum/spacevine_mutation/vine_eating
name = "Vine eating"
@@ -187,28 +219,33 @@
hue = "#F4A442"
quality = MINOR_NEGATIVE
severity = SEVERITY_MINOR
+ venus_flavor_text = "Vine Eating - Increased regeneration while on vines"
/// Destroys any vine on spread-target's tile. The checks for if this should be done are in the spread() proc.
-/datum/spacevine_mutation/vine_eating/on_spread(obj/structure/spacevine/holder, turf/target)
+/datum/spacevine_mutation/vine_eating/on_spread(obj/structure/spacevine/vine, turf/target)
for(var/obj/structure/spacevine/prey in target)
qdel(prey)
+/datum/spacevine_mutation/vine_eating/equip_venus_trap(mob/living/basic/venus_human_trap/venus_trap)
+ venus_trap.weed_heal = initial(venus_trap.weed_heal) * 2
+
/datum/spacevine_mutation/aggressive_spread //very OP, but im out of other ideas currently
name = "Aggressive spreading"
description = "Heavily wounds mobs when spreading or tangling them."
hue = "#316b2f"
severity = SEVERITY_MAJOR
quality = NEGATIVE
+ venus_flavor_text = "Aggressive Spreading - Can travel farther away from vines before taking damage"
/// Checks mobs on spread-target's turf to see if they should be hit by a damaging proc or not.
-/datum/spacevine_mutation/aggressive_spread/on_spread(obj/structure/spacevine/holder, turf/turf, mob/living)
+/datum/spacevine_mutation/aggressive_spread/on_spread(obj/structure/spacevine/vine, turf/turf, mob/living)
for(var/mob/living/victim in turf)
- aggrospread_act(holder, victim)
+ aggrospread_act(vine, victim)
/// What happens if an aggr spreading vine buckles a mob.
-/datum/spacevine_mutation/aggressive_spread/on_buckle(obj/structure/spacevine/holder, mob/living/buckled)
+/datum/spacevine_mutation/aggressive_spread/on_buckle(obj/structure/spacevine/vine, mob/living/buckled)
. = ..()
- aggrospread_act(holder, buckled)
+ aggrospread_act(vine, buckled)
/// Hurts mobs. To be used when a vine with aggressive spread mutation spreads into the mob's tile or buckles them.
/datum/spacevine_mutation/aggressive_spread/aggrospread_act(obj/structure/spacevine/vine, mob/living/living_mob)
@@ -227,7 +264,6 @@
var/obj/item/bodypart/limb = victim.get_bodypart(victim.get_random_valid_zone(even_weights = TRUE))
var/armor = victim.run_armor_check(def_zone = limb, attack_flag = MELEE)
-
if(!HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE))
var/datum/spacevine_mutation/thorns/thorn = locate() in vine.mutations
@@ -258,29 +294,36 @@
span_userdanger("You are smashed by a large vine!"))
log_combat(vine, living_mob, "aggressively smashed")
+/datum/spacevine_mutation/aggressive_spread/equip_venus_trap(mob/living/basic/venus_human_trap/venus_trap)
+ venus_trap.kudzu_off_distance_range = 2
+
/datum/spacevine_mutation/transparency
name = "transparent"
description = "Allows light to pass through."
hue = ""
quality = POSITIVE
severity = SEVERITY_TRIVIAL
+ venus_flavor_text = "Transparency - Your body is transparent"
-/datum/spacevine_mutation/transparency/on_birth(obj/structure/spacevine/holder)
- holder.light_state = PASS_LIGHT
- holder.alpha = 125
- holder.unblock_sunlight()
+/datum/spacevine_mutation/transparency/on_birth(obj/structure/spacevine/vine)
+ vine.light_state = PASS_LIGHT
+ vine.alpha = 125
+ vine.unblock_sunlight()
+
+/datum/spacevine_mutation/transparency/equip_venus_trap(mob/living/basic/venus_human_trap/venus_trap)
+ venus_trap.alpha = initial(venus_trap.alpha) * 0.5
/datum/spacevine_mutation/gas_eater
abstract_type = /datum/spacevine_mutation/gas_eater
/// Type of gas consumed by this mutation
var/datum/gas/gas_type = null
-/datum/spacevine_mutation/gas_eater/process_mutation(obj/structure/spacevine/holder)
+/datum/spacevine_mutation/gas_eater/process_mutation(obj/structure/spacevine/vine)
if(isnull(gas_type))
stack_trace("gas_type not set for gas_eater mutation [type]")
return
- var/turf/open/floor/turf = holder.loc
+ var/turf/open/floor/turf = vine.loc
if(!istype(turf))
return
@@ -288,7 +331,7 @@
if(!gas_mix.moles[gas_type])
return
- gas_mix.set_gas(gas_type, max(gas_mix.moles[gas_type] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.growth_stage, 0))
+ gas_mix.set_gas(gas_type, max(gas_mix.moles[gas_type] - GAS_MUTATION_REMOVAL_MULTIPLIER * vine.growth_stage, 0))
gas_mix.garbage_collect()
/datum/spacevine_mutation/gas_eater/oxy_eater
@@ -329,8 +372,9 @@
hue = "#9ECCA4"
severity = SEVERITY_AVERAGE
quality = NEGATIVE
+ venus_flavor_text = "Thorny - Your physical attacks deal reduced damage but cause wounds"
-/datum/spacevine_mutation/thorns/on_cross(obj/structure/spacevine/holder, mob/living/crosser)
+/datum/spacevine_mutation/thorns/on_cross(obj/structure/spacevine/vine, mob/living/crosser)
if(isvineimmune(crosser) || HAS_TRAIT(crosser, TRAIT_PIERCEIMMUNE))
return
if(prob(THORN_MUTATION_CUT_PROB))
@@ -338,22 +382,28 @@
if(victim.apply_damage(15, BRUTE, blocked = victim.run_armor_check(attack_flag = MELEE, silent = TRUE), spread_damage = TRUE))
to_chat(victim, span_danger("You cut yourself on the thorny vines."))
-/datum/spacevine_mutation/thorns/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/item, expected_damage)
+/datum/spacevine_mutation/thorns/on_hit(obj/structure/spacevine/vine, obj/item/item, mob/living/hitter, list/modifiers, list/attack_modifiers)
if(isvineimmune(hitter) || HAS_TRAIT(hitter, TRAIT_PIERCEIMMUNE) || HAS_TRAIT(hitter, TRAIT_PLANT_SAFE))
- return expected_damage
+ return
if(iscarbon(hitter))
var/mob/living/carbon/carbon_victim = hitter
for(var/obj/item/clothing/worn_item in carbon_victim.get_equipped_items())
if((worn_item.body_parts_covered & HANDS) && (worn_item.clothing_flags & THICKMATERIAL))
- return expected_damage
+ return
if(prob(THORN_MUTATION_CUT_PROB))
var/mob/living/victim = hitter
if(victim.apply_damage(15, BRUTE, blocked = victim.run_armor_check(attack_flag = MELEE, silent = TRUE), spread_damage = TRUE))
to_chat(victim, span_danger("You cut yourself on the thorny vines."))
- return expected_damage
+/datum/spacevine_mutation/thorns/equip_venus_trap(mob/living/basic/venus_human_trap/venus_trap)
+ venus_trap.melee_damage_lower = initial(venus_trap.melee_damage_lower) * 0.5
+ venus_trap.melee_damage_upper = initial(venus_trap.melee_damage_upper) * 0.5
+ venus_trap.obj_damage = initial(venus_trap.obj_damage) * 0.5
+ venus_trap.wound_bonus = 5
+ venus_trap.exposed_wound_bonus = 15
+ venus_trap.sharpness = SHARP_POINTY
/datum/spacevine_mutation/hardened
name = "Hardened"
@@ -361,16 +411,20 @@
hue = "#997700"
quality = NEGATIVE
severity = SEVERITY_ABOVE_AVERAGE
+ venus_flavor_text = "Hardened - Increased health"
-/datum/spacevine_mutation/hardened/on_grow(obj/structure/spacevine/holder)
- if(holder.growth_stage)
- holder.set_density(TRUE)
- holder.modify_max_integrity(100)
+/datum/spacevine_mutation/hardened/on_grow(obj/structure/spacevine/vine)
+ if(vine.growth_stage)
+ vine.set_density(TRUE)
+ vine.modify_max_integrity(initial(vine.max_integrity) * 2)
-/datum/spacevine_mutation/hardened/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/item, expected_damage)
+/datum/spacevine_mutation/hardened/on_hit(obj/structure/spacevine/vine, obj/item/item, mob/living/hitter, list/modifiers, list/attack_modifiers)
if(item?.get_sharpness())
- return expected_damage * 0.5
- return expected_damage
+ MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 0.5)
+
+/datum/spacevine_mutation/hardened/equip_venus_trap(mob/living/basic/venus_human_trap/venus_trap)
+ venus_trap.health = initial(venus_trap.health) * 2
+ venus_trap.maxHealth = initial(venus_trap.maxHealth) * 2
/datum/spacevine_mutation/timid
name = "Timid"
@@ -378,14 +432,19 @@
hue = "#a4a9ac"
quality = POSITIVE
severity = SEVERITY_MINOR
+ venus_flavor_text = "Timid - You no longer have the ability to shoot tangling vines at targets"
//This specific mutation only covers floors instead of structures, items, mobs and cant tangle mobs
-/datum/spacevine_mutation/timid/on_birth(obj/structure/spacevine/holder)
- SET_PLANE_IMPLICIT(holder, FLOOR_PLANE)
- holder.layer = ABOVE_OPEN_TURF_LAYER
- holder.light_state = PASS_LIGHT
- holder.can_tangle = FALSE
- return ..()
+/datum/spacevine_mutation/timid/on_birth(obj/structure/spacevine/vine)
+ SET_PLANE_IMPLICIT(vine, FLOOR_PLANE)
+ vine.layer = ABOVE_OPEN_TURF_LAYER
+ vine.light_state = PASS_LIGHT
+ vine.can_tangle = FALSE
+
+/datum/spacevine_mutation/timid/equip_venus_trap(mob/living/basic/venus_human_trap/venus_trap)
+ var/datum/action/cooldown/mob_cooldown/projectile_attack/vine_tangle/tangle_action
+ tangle_action = locate(/datum/action/cooldown/mob_cooldown/projectile_attack/vine_tangle) in venus_trap.actions
+ tangle_action.Remove(venus_trap)
/datum/spacevine_mutation/flowering
name = "Flowering"
@@ -394,13 +453,102 @@
quality = NEGATIVE
severity = SEVERITY_MAJOR
-/datum/spacevine_mutation/flowering/on_grow(obj/structure/spacevine/holder)
- if(locate(/obj/structure/alien/resin/flower_bud) in range(5, holder))
+/datum/spacevine_mutation/flowering/on_grow(obj/structure/spacevine/vine)
+ if(locate(/obj/structure/alien/resin/flower_bud) in range(5, vine))
return
- if(holder.growth_stage == 2 && prob(FLOWERING_MUTATION_SPAWN_PROB))
- var/obj/structure/alien/resin/flower_bud/spawned_flower_bud = new(holder.loc)
- spawned_flower_bud.trait_flags = holder.trait_flags
+ if(vine.growth_stage == 2 && prob(FLOWERING_MUTATION_SPAWN_PROB))
+ var/obj/structure/alien/resin/flower_bud/spawned_flower_bud = new(vine.loc)
+ spawned_flower_bud.mutations = vine.mutations
-/datum/spacevine_mutation/flowering/on_cross(obj/structure/spacevine/holder, mob/living/crosser)
+/datum/spacevine_mutation/flowering/on_cross(obj/structure/spacevine/vine, mob/living/crosser)
if(prob(25))
- holder.entangle(crosser)
+ vine.entangle(crosser)
+
+/datum/spacevine_mutation/slippery
+ name = "Slippery"
+ description = "Causes the vines to be slippery"
+ hue = "#a5980c"
+ quality = NEGATIVE
+ severity = SEVERITY_AVERAGE
+
+/datum/spacevine_mutation/slippery/on_grow(obj/structure/spacevine/vine)
+ vine.AddComponent(/datum/component/slippery, 5 SECONDS, NO_SLIP_WHEN_WALKING|SLIDE)
+
+/datum/spacevine_mutation/slippery/on_hit(obj/structure/spacevine/vine, obj/item/item, mob/living/hitter, list/modifiers, list/attack_modifiers)
+ if(isvineimmune(hitter) || HAS_TRAIT(hitter, TRAIT_PLANT_SAFE))
+ return
+
+ if(prob(20))
+ item?.AddComponent(/datum/component/slippery_item, fall_chance=25, fall_catch_chance=25, duration=5 SECONDS)
+
+/datum/spacevine_mutation/slippery/equip_venus_trap(mob/living/basic/venus_human_trap/venus_trap)
+ RegisterSignal(venus_trap, COMSIG_ATOM_ATTACKBY, PROC_REF(on_venus_hit), override=TRUE)
+
+/datum/spacevine_mutation/slippery/proc/on_venus_hit(mob/living/basic/venus_human_trap/venus_trap, obj/item/attacking_item, mob/living/attacker, params)
+ SIGNAL_HANDLER
+
+ if(isvineimmune(attacker) || HAS_TRAIT(attacker, TRAIT_PLANT_SAFE))
+ return
+
+ if(prob(20))
+ attacking_item?.AddComponent(/datum/component/slippery_item, fall_chance=25, fall_catch_chance=25, duration=5 SECONDS)
+
+/datum/spacevine_mutation/conductive
+ name = "Conductive"
+ description = "Causes the vines to be electrified when on top of cables"
+ hue = "#ad5c00"
+ quality = NEGATIVE
+ severity = SEVERITY_MINOR
+
+/datum/spacevine_mutation/conductive/proc/attempt_shock(obj/structure/spacevine/vine, mob/living/victim, obj/item/attacking_item)
+ if(isvineimmune(victim) || HAS_TRAIT(victim, TRAIT_PLANT_SAFE))
+ return
+ if(attacking_item && !(attacking_item.obj_flags & CONDUCTS_ELECTRICITY))
+ return
+
+ var/turf/vine_loc = get_turf(vine)
+ if(vine_loc.overfloor_placed)
+ return
+ var/obj/structure/cable/cable = vine_loc.get_cable_node()
+ if(isnull(cable))
+ return
+
+ vine.shock(victim, 100, cable)
+
+/datum/spacevine_mutation/conductive/on_hit(obj/structure/spacevine/vine, obj/item/item, mob/living/hitter, list/modifiers, list/attack_modifiers)
+ attempt_shock(vine, hitter, item)
+
+/datum/spacevine_mutation/conductive/on_buckle(obj/structure/spacevine/vine, mob/living/buckled)
+ . = ..()
+ attempt_shock(vine, buckled)
+
+/datum/spacevine_mutation/radioactive
+ name = "Radioactive"
+ description = "Causes the vines to be radioactive"
+ hue = "#09b82f"
+ quality = NEGATIVE
+ severity = SEVERITY_MAJOR
+
+/datum/spacevine_mutation/radioactive/on_birth(obj/structure/spacevine/vine)
+ vine.AddElement(/datum/element/radioactive, chance = DEFAULT_RADIATION_CHANCE / 3)
+
+/datum/spacevine_mutation/radioactive/equip_venus_trap(mob/living/basic/venus_human_trap/venus_trap)
+ RegisterSignal(venus_trap, COMSIG_ATOM_ATTACKBY, PROC_REF(on_venus_hit), override=TRUE)
+
+/datum/spacevine_mutation/radioactive/proc/on_venus_hit(mob/living/basic/venus_human_trap/venus_trap, obj/item/attacking_item, mob/living/attacker, params)
+ SIGNAL_HANDLER
+
+ if(isvineimmune(attacker) || HAS_TRAIT(attacker, TRAIT_PLANT_SAFE))
+ return
+ if(!SSradiation.can_irradiate_basic(attacker))
+ return
+ if(ishuman(attacker) && SSradiation.wearing_rad_protected_clothing(attacker))
+ return
+
+ radiation_pulse(
+ venus_trap,
+ max_range = 1,
+ threshold = RAD_VERY_LIGHT_INSULATION,
+ chance = (DEFAULT_RADIATION_CHANCE / 3),
+ minimum_exposure_time = 3 SECONDS,
+ )
diff --git a/code/modules/events/space_vines/vine_structure.dm b/code/modules/events/space_vines/vine_structure.dm
index a2abaee3394c..642c3c42e654 100644
--- a/code/modules/events/space_vines/vine_structure.dm
+++ b/code/modules/events/space_vines/vine_structure.dm
@@ -65,22 +65,22 @@
return ..()
/obj/structure/spacevine/proc/on_chem_effect(datum/reagent/chem)
- var/override = FALSE
+ var/chem_flags
for(var/datum/spacevine_mutation/mutation in mutations)
- override += mutation.on_chem(src, chem)
- if(!override && prob(75) && istype(chem, /datum/reagent/toxin/plantbgone))
- qdel(src)
+ chem_flags |= mutation.on_chem(src, chem)
/obj/structure/spacevine/proc/eat(mob/eater)
- var/override = FALSE
+ var/eat_flags
for(var/datum/spacevine_mutation/mutation in mutations)
- override += mutation.on_eat(src, eater)
- if(!override)
- qdel(src)
+ eat_flags |= mutation.on_eat(src, eater)
+
+ if(eat_flags & BLOCK_EAT_ATTEMPT)
+ return
+
+ qdel(src)
/obj/structure/spacevine/attacked_by(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
LAZYSET(attack_modifiers, SILENCE_DEFAULT_MESSAGES, TRUE)
- LAZYSET(attack_modifiers, FORCE_MULTIPLIER, 1)
if(item.damtype == BURN)
MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 4)
if(item.get_sharpness())
@@ -104,10 +104,14 @@
for(var/datum/spacevine_mutation/mutation in mutations)
mutation.on_cross(src, movable)
+/obj/structure/spacevine/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
+ for(var/datum/spacevine_mutation/mutation in mutations)
+ mutation.on_hit(src, attacking_item, user, modifiers, attack_modifiers)
+
+ return ..()
+
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/structure/spacevine/attack_hand(mob/user, list/modifiers)
- for(var/datum/spacevine_mutation/mutation in mutations)
- mutation.on_hit(src, user)
user_unbuckle_mob(user, user)
return ..()
@@ -201,11 +205,11 @@
/obj/structure/spacevine/atmos_expose(datum/gas_mixture/air, exposed_temperature)
for(var/datum/spacevine_mutation/mutation in mutations)
mutation.additional_atmos_processes(src, air)
- if(!can_spread && (exposed_temperature >= VINE_FREEZING_POINT || (trait_flags & SPACEVINE_COLD_RESISTANT)))
+ if(!can_spread && (exposed_temperature >= VINE_FREEZING_POINT || (resistance_flags & FREEZE_PROOF)))
can_spread = TRUE // not returning here just in case its now a plasmafire and the kudzu should be deleted
- if(exposed_temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD && !(trait_flags & SPACEVINE_HEAT_RESISTANT))
+ if(exposed_temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD && !(resistance_flags & FIRE_PROOF))
qdel(src)
- else if (exposed_temperature < VINE_FREEZING_POINT && !(trait_flags & SPACEVINE_COLD_RESISTANT))
+ else if (exposed_temperature < VINE_FREEZING_POINT && !(resistance_flags & FREEZE_PROOF))
can_spread = FALSE
/obj/structure/spacevine/CanAllowThrough(atom/movable/mover, border_dir)
diff --git a/code/modules/experisci/handheld_scanner.dm b/code/modules/experisci/handheld_scanner.dm
index f40a6c50f7c8..942287e7bdd6 100644
--- a/code/modules/experisci/handheld_scanner.dm
+++ b/code/modules/experisci/handheld_scanner.dm
@@ -9,6 +9,7 @@
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/devices/scanner.dmi'
icon_state = "experiscanner"
+ inhand_icon_state = "experiscanner"
lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
sound_vary = TRUE
diff --git a/code/modules/fishing/aquarium/aquarium_kit.dm b/code/modules/fishing/aquarium/aquarium_kit.dm
index 9d2f6ba52e2a..1446cb864399 100644
--- a/code/modules/fishing/aquarium/aquarium_kit.dm
+++ b/code/modules/fishing/aquarium/aquarium_kit.dm
@@ -4,6 +4,7 @@
desc = "A refillable can that dispenses nutritious fish feed."
icon = 'icons/obj/aquarium/supplies.dmi'
icon_state = "fish_feed"
+ inhand_icon_state = "fish_feed"
w_class = WEIGHT_CLASS_TINY
volume = 5
amount_per_transfer_from_this = 2.5
diff --git a/code/modules/food_and_drinks/equipment/kitchen_utensils.dm b/code/modules/food_and_drinks/equipment/kitchen_utensils.dm
index 50aa9f928286..582073401214 100644
--- a/code/modules/food_and_drinks/equipment/kitchen_utensils.dm
+++ b/code/modules/food_and_drinks/equipment/kitchen_utensils.dm
@@ -25,6 +25,7 @@
ONFLOOR_ICON_HELPER('modular_darkpack/master_files/icons/obj/service/kitchen/kitchen.dmi') // DARKPACK EDIT ADD
desc = "Pointy."
icon_state = "fork"
+ inhand_icon_state = "fork"
icon_angle = -90
force = 4
w_class = WEIGHT_CLASS_TINY
@@ -202,6 +203,7 @@
ONFLOOR_ICON_HELPER('modular_darkpack/master_files/icons/obj/service/kitchen/kitchen.dmi') // DARKPACK EDIT ADD
desc = "Just be careful your food doesn't melt the spoon first."
icon_state = "spoon"
+ inhand_icon_state = "spoon"
base_icon_state = "spoon"
icon_angle = -90
w_class = WEIGHT_CLASS_TINY
@@ -333,6 +335,7 @@
/obj/item/kitchen/spoon/plastic
name = "plastic spoon"
icon_state = "plastic_spoon"
+ inhand_icon_state = "plastic_spoon"
force = 0
custom_materials = list(/datum/material/plastic = SMALL_MATERIAL_AMOUNT * 1.2)
toolspeed = 75 // The plastic spoon takes 5 minutes to dig through a single mineral turf... It's one, continuous, breakable, do_after...
diff --git a/code/modules/food_and_drinks/food/cake.dm b/code/modules/food_and_drinks/food/cake.dm
index 28d4c9a6da3c..50f5bb97de73 100644
--- a/code/modules/food_and_drinks/food/cake.dm
+++ b/code/modules/food_and_drinks/food/cake.dm
@@ -248,7 +248,7 @@
/datum/reagent/consumable/nutriment/vitamin = 10,
)
tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
- foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR
+ foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
venue_value = FOOD_PRICE_CHEAP
slice_type = /obj/item/food/cakeslice/chocolate
crafting_complexity = FOOD_COMPLEXITY_3
@@ -258,7 +258,7 @@
desc = "Just a slice of cake, it is enough for everyone."
icon_state = "chocolatecake_slice"
tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
- foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR
+ foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
crafting_complexity = FOOD_COMPLEXITY_3
/obj/item/food/cake/birthday
@@ -440,7 +440,7 @@
/datum/reagent/consumable/coco = 5,
)
tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2, "cake" = 3)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
slice_type = /obj/item/food/cakeslice/berry_chocolate_cake
crafting_complexity = FOOD_COMPLEXITY_4
@@ -450,7 +450,7 @@
For some reason, this configuration of cake is particularly aesthetically pleasing to AIs in SELF."
icon_state = "liars_slice"
tastes = list("strawberries" = 2, "chocolate" = 2, "sweetness" = 2, "cake" = 3)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
crafting_complexity = FOOD_COMPLEXITY_4
/obj/item/food/cake/holy_cake
diff --git a/code/modules/food_and_drinks/food/donuts.dm b/code/modules/food_and_drinks/food/donuts.dm
index f074e88800d1..e84a7f93043a 100644
--- a/code/modules/food_and_drinks/food/donuts.dm
+++ b/code/modules/food_and_drinks/food/donuts.dm
@@ -161,6 +161,7 @@
name = "chocolate donut"
desc = "Goes great with a glass of warm milk."
icon_state = "donut_choc"
+ foodtypes = JUNKFOOD|GRAIN|DAIRY|FRIED|SUGAR|BREAKFAST|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
food_reagents = list(
/datum/reagent/consumable/nutriment = 3,
/datum/reagent/consumable/sugar = 3,
@@ -306,6 +307,7 @@
name = "chocolate jelly donut"
desc = "Goes great with a glass of warm milk."
icon_state = "jelly_choc"
+ foodtypes = JUNKFOOD|GRAIN|DAIRY|FRIED|SUGAR|BREAKFAST|FRUIT|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
food_reagents = list(
/datum/reagent/consumable/nutriment = 3,
/datum/reagent/consumable/sugar = 3,
@@ -446,6 +448,7 @@
name = "chocolate jelly donut"
desc = "Goes great with a glass of warm milk."
icon_state = "jelly_choc"
+ foodtypes = JUNKFOOD|GRAIN|DAIRY|FRIED|SUGAR|BREAKFAST|TOXIC|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
food_reagents = list(
/datum/reagent/consumable/nutriment = 3,
/datum/reagent/consumable/sugar = 3,
diff --git a/code/modules/food_and_drinks/food/egg.dm b/code/modules/food_and_drinks/food/egg.dm
index 6b884e11b8fe..f74879db12b3 100644
--- a/code/modules/food_and_drinks/food/egg.dm
+++ b/code/modules/food_and_drinks/food/egg.dm
@@ -8,7 +8,7 @@
icon_state = "chocolateegg"
food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/coco = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("chocolate" = 4, "sweetness" = 1)
- foodtypes = JUNKFOOD | SUGAR | EGG
+ foodtypes = JUNKFOOD | SUGAR | EGG | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_TINY
crafting_complexity = FOOD_COMPLEXITY_2
diff --git a/code/modules/food_and_drinks/food/frozen.dm b/code/modules/food_and_drinks/food/frozen.dm
index a2a8d8f2df14..e35b54dce84b 100644
--- a/code/modules/food_and_drinks/food/frozen.dm
+++ b/code/modules/food_and_drinks/food/frozen.dm
@@ -409,6 +409,7 @@
/obj/item/food/popsicle/jumbo
name = "jumbo ice cream"
desc = "A luxurious ice cream covered in rich chocolate. It seems smaller than you remember it being."
+ foodtypes = DAIRY | SUGAR | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
food_reagents = list(
/datum/reagent/consumable/hot_coco = 4,
/datum/reagent/consumable/cream = 2,
@@ -446,7 +447,7 @@
/datum/reagent/consumable/sugar = 2,
)
tastes = list("chopped hazelnuts", "waffle")
- foodtypes = GRAIN|DAIRY|SUGAR
+ foodtypes = GRAIN|DAIRY|SUGAR|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
venue_value = FOOD_PRICE_NORMAL
crafting_complexity = FOOD_COMPLEXITY_3
crafted_food_buff = /datum/status_effect/food/chilling
diff --git a/code/modules/food_and_drinks/food/martian.dm b/code/modules/food_and_drinks/food/martian.dm
index 9d54fa3af621..239d843364a7 100644
--- a/code/modules/food_and_drinks/food/martian.dm
+++ b/code/modules/food_and_drinks/food/martian.dm
@@ -443,7 +443,7 @@
/datum/reagent/medicine/omnizine = 5,
)
tastes = list("masterful curry" = 1, "rice" = 1)
- foodtypes = MEAT|VEGETABLES|GRAIN|FRUIT|SUGAR
+ foodtypes = MEAT|VEGETABLES|GRAIN|FRUIT|SUGAR|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
w_class = WEIGHT_CLASS_SMALL
crafting_complexity = FOOD_COMPLEXITY_5 //Extensive and secretly guarded. Was previously 2 and I thought it was pathetic.
custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT)
@@ -1217,7 +1217,7 @@
/datum/reagent/consumable/nutriment/vitamin = 2,
)
tastes = list("cold pineapple" = 1, "chocolate" = 1)
- foodtypes = SUGAR|FRUIT|PINEAPPLE
+ foodtypes = SUGAR|FRUIT|PINEAPPLE|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
crafting_complexity = FOOD_COMPLEXITY_3
/obj/item/food/popsicle/sea_salt
diff --git a/code/modules/food_and_drinks/food/meatdish.dm b/code/modules/food_and_drinks/food/meatdish.dm
index 3e56e19710f4..73aa28c0a659 100644
--- a/code/modules/food_and_drinks/food/meatdish.dm
+++ b/code/modules/food_and_drinks/food/meatdish.dm
@@ -449,6 +449,25 @@
crafting_complexity = FOOD_COMPLEXITY_2
custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT)
+/obj/item/food/polar_bear_steak
+ name = "fillet polar migrawr"
+ desc = "Because eating bear on fire wasn't slavic enough."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "bearsteakfrost"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/consumable/nutriment/vitamin = 9,
+ /datum/reagent/consumable/ethanol/frosty_dorf = 3,
+ /datum/reagent/consumable/ethanol/blue_blazer = 3,
+ /datum/reagent/toxin/berserker = 3
+ )
+ tastes = list("meat" = 1, "cold" = 1)
+ foodtypes = MEAT | ALCOHOL
+ w_class = WEIGHT_CLASS_SMALL
+ venue_value = FOOD_PRICE_EXOTIC
+ crafting_complexity = FOOD_COMPLEXITY_3
+ custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT)
+
/obj/item/food/raw_meatball
name = "raw meatball"
desc = "A great meal all round. Not a cord of wood. Kinda raw"
@@ -851,6 +870,24 @@
crafting_complexity = FOOD_COMPLEXITY_2
custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT * 2)
+/obj/item/food/drake_ribs
+ name = "drake ribs"
+ desc = "Ribs from bear meat and scrapes of drake hide, slathered in BBQ sauce and Cold sauce. If it'd be any more meaty it'd inflict mental anguish upon vegans."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "drake_ribs"
+ w_class = WEIGHT_CLASS_NORMAL
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment/protein = 15,
+ /datum/reagent/consumable/nutriment/vitamin = 2,
+ /datum/reagent/consumable/guidoferrun = 10,
+ /datum/reagent/consumable/frostoil = 5,
+ /datum/reagent/consumable/bbqsauce = 5,
+ )
+ tastes = list("meat" = 3, "cold sauce" = 1)
+ foodtypes = MEAT | SUGAR
+ crafting_complexity = FOOD_COMPLEXITY_3
+ custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT * 2)
+
/obj/item/food/meatclown
name = "meat clown"
desc = "A delicious, round piece of meat clown. How horrifying."
@@ -1260,6 +1297,28 @@
crafting_complexity = FOOD_COMPLEXITY_4
custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT / 2)
+/obj/item/food/wendigo_feast
+ trash_type = /obj/item/wendigo_skull
+ name = "wendigo feast"
+ desc = "A full load of meat, cold sauce and BBQ sauce. All topped by a Skull of a Wendigo stuffed with plants native to Freyja."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "wendigofeast"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment/protein = 50,
+ /datum/reagent/consumable/nutriment = 40,
+ /datum/reagent/consumable/nutriment/vitamin = 10,
+ /datum/reagent/consumable/guidoferrun = 10,
+ /datum/reagent/consumable/frostoil = 10,
+ /datum/reagent/consumable/bbqsauce = 5,
+ /datum/reagent/toxin/berserker = 5,
+ )
+ tastes = list("chicken" = 3, "vegetables" = 1, "gravy" = 1)
+ foodtypes = MEAT | VEGETABLES | FRUIT | SUGAR
+ w_class = WEIGHT_CLASS_NORMAL
+ venue_value = FOOD_PRICE_EXOTIC
+ crafting_complexity = FOOD_COMPLEXITY_5
+ custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT * 3)
+
/obj/item/food/sweet_and_sour_meatballs
name = "sweet and sour meatballs"
desc = "Golden meatballs glazed in a sticky savory sauce, served with pineapple and pepper chunks."
diff --git a/code/modules/food_and_drinks/food/misc.dm b/code/modules/food_and_drinks/food/misc.dm
index 583a9a0f6e38..c44b2ce88ebd 100644
--- a/code/modules/food_and_drinks/food/misc.dm
+++ b/code/modules/food_and_drinks/food/misc.dm
@@ -581,7 +581,7 @@
/datum/reagent/consumable/nutriment/protein = 4,
)
tastes = list("granola" = 1, "nuts" = 1, "chocolate" = 1, "raisin" = 1)
- foodtypes = GRAIN|NUTS|FRUIT|SUGAR
+ foodtypes = GRAIN|NUTS|FRUIT|SUGAR|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
w_class = WEIGHT_CLASS_SMALL
crafting_complexity = FOOD_COMPLEXITY_4
diff --git a/code/modules/food_and_drinks/food/moth.dm b/code/modules/food_and_drinks/food/moth.dm
index e42e6370a00b..2dd66f0621d8 100644
--- a/code/modules/food_and_drinks/food/moth.dm
+++ b/code/modules/food_and_drinks/food/moth.dm
@@ -67,7 +67,7 @@
/datum/reagent/consumable/salt = 2,
)
tastes = list("seeds" = 1, "nuts" = 1, "chocolate" = 1, "salt" = 1, "popcorn" = 1, "potato" = 1)
- foodtypes = JUNKFOOD|GRAIN|FRIED|NUTS|VEGETABLES
+ foodtypes = JUNKFOOD|GRAIN|FRIED|NUTS|VEGETABLES|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
w_class = WEIGHT_CLASS_SMALL
crafting_complexity = FOOD_COMPLEXITY_3
diff --git a/code/modules/food_and_drinks/food/pastries.dm b/code/modules/food_and_drinks/food/pastries.dm
index 08dc0e8fe286..8331ea8e71e7 100644
--- a/code/modules/food_and_drinks/food/pastries.dm
+++ b/code/modules/food_and_drinks/food/pastries.dm
@@ -210,7 +210,7 @@
/datum/reagent/consumable/nutriment/vitamin = 2,
)
tastes = list("biscuit" = 3, "chocolate" = 1)
- foodtypes = JUNKFOOD|GRAIN|DAIRY|SUGAR
+ foodtypes = JUNKFOOD|GRAIN|DAIRY|SUGAR|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
w_class = WEIGHT_CLASS_SMALL
crafting_complexity = FOOD_COMPLEXITY_3
@@ -411,6 +411,7 @@
name = "chocolate cone"
desc = "Delicious chocolate cone, but no ice cream."
icon_state = "icecream_cone_chocolate"
+ foodtypes = CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
food_reagents = list(
/datum/reagent/consumable/nutriment = 4,
/datum/reagent/consumable/coco = 1,
@@ -452,7 +453,7 @@
/datum/reagent/consumable/nutriment/vitamin = 4,
)
tastes = list("raw brownie batter" = 1)
- foodtypes = GRAIN|DAIRY|JUNKFOOD|SUGAR
+ foodtypes = GRAIN|DAIRY|JUNKFOOD|SUGAR|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
foodtypes_added_when_cooked = BREAKFAST
crafting_complexity = FOOD_COMPLEXITY_1
@@ -469,7 +470,7 @@
/datum/reagent/consumable/sugar = 12,
)
tastes = list("brownie" = 1, "chocolatey goodness" = 1)
- foodtypes = GRAIN|DAIRY|JUNKFOOD|SUGAR|BREAKFAST
+ foodtypes = GRAIN|DAIRY|JUNKFOOD|SUGAR|BREAKFAST|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
w_class = WEIGHT_CLASS_SMALL
crafting_complexity = FOOD_COMPLEXITY_2
@@ -486,7 +487,7 @@
/datum/reagent/consumable/sugar = 3,
)
tastes = list("brownie" = 1, "chocolatey goodness" = 1)
- foodtypes = GRAIN|DAIRY|JUNKFOOD|SUGAR|BREAKFAST
+ foodtypes = GRAIN|DAIRY|JUNKFOOD|SUGAR|BREAKFAST|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
w_class = WEIGHT_CLASS_SMALL
crafting_complexity = FOOD_COMPLEXITY_2
@@ -501,7 +502,7 @@
/datum/reagent/consumable/peanut_butter = 4,
)
tastes = list("raw brownie batter" = 1)
- foodtypes = GRAIN|DAIRY|JUNKFOOD|SUGAR|NUTS
+ foodtypes = GRAIN|DAIRY|JUNKFOOD|SUGAR|NUTS|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
foodtypes_added_when_cooked = BREAKFAST
crafting_complexity = FOOD_COMPLEXITY_1
@@ -519,7 +520,7 @@
/datum/reagent/consumable/peanut_butter = 20,
)
tastes = list("brownie" = 1, "chocolatey goodness" = 1, "peanut butter" = 1)
- foodtypes = GRAIN|DAIRY|JUNKFOOD|SUGAR|BREAKFAST|NUTS
+ foodtypes = GRAIN|DAIRY|JUNKFOOD|SUGAR|BREAKFAST|NUTS|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
w_class = WEIGHT_CLASS_SMALL
crafting_complexity = FOOD_COMPLEXITY_3
@@ -537,7 +538,7 @@
/datum/reagent/consumable/peanut_butter = 5,
)
tastes = list("brownie" = 1, "chocolatey goodness" = 1)
- foodtypes = GRAIN|DAIRY|JUNKFOOD|SUGAR|BREAKFAST|NUTS
+ foodtypes = GRAIN|DAIRY|JUNKFOOD|SUGAR|BREAKFAST|NUTS|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
w_class = WEIGHT_CLASS_SMALL
crafting_complexity = FOOD_COMPLEXITY_3
@@ -562,7 +563,7 @@
icon_state = "COOKIE!!!"
food_reagents = list(/datum/reagent/consumable/nutriment = 5)
tastes = list("soft cookie" = 2, "chocolate" = 3)
- foodtypes = GRAIN | SUGAR | DAIRY
+ foodtypes = GRAIN | SUGAR | DAIRY | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_SMALL
crafting_complexity = FOOD_COMPLEXITY_3
diff --git a/code/modules/food_and_drinks/food/pie.dm b/code/modules/food_and_drinks/food/pie.dm
index 9489371f1449..283d7bad5598 100644
--- a/code/modules/food_and_drinks/food/pie.dm
+++ b/code/modules/food_and_drinks/food/pie.dm
@@ -346,7 +346,7 @@
/datum/reagent/consumable/nutriment/vitamin = 4,
)
tastes = list("pie" = 1, "dark chocolate" = 3)
- foodtypes = GRAIN|DAIRY|SUGAR
+ foodtypes = GRAIN|DAIRY|SUGAR|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
/obj/item/food/pie/blumpkinpie
name = "blumpkin pie"
@@ -443,7 +443,7 @@
/datum/reagent/consumable/nutriment/vitamin = 4,
)
tastes = list("pie" = 1, "smooth chocolate" = 1, "whipped cream" = 1)
- foodtypes = GRAIN | DAIRY | SUGAR
+ foodtypes = GRAIN | DAIRY | SUGAR | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
slice_type = /obj/item/food/pieslice/frenchsilk
crafting_complexity = FOOD_COMPLEXITY_3
@@ -452,7 +452,7 @@
desc = "A slice of french silk pie, filled with a chocolate mousse and topped with a layer of whipped cream and chocolate shavings. Delicious enough to make you cry."
icon_state = "frenchsilkpieslice"
tastes = list("pie" = 1, "smooth chocolate" = 1, "whipped cream" = 1)
- foodtypes = GRAIN | DAIRY | SUGAR
+ foodtypes = GRAIN | DAIRY | SUGAR | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
crafting_complexity = FOOD_COMPLEXITY_3
/obj/item/food/pie/shepherds_pie
diff --git a/code/modules/food_and_drinks/food/pizza.dm b/code/modules/food_and_drinks/food/pizza.dm
index 8ddd82db8ffd..8811d3bddd36 100644
--- a/code/modules/food_and_drinks/food/pizza.dm
+++ b/code/modules/food_and_drinks/food/pizza.dm
@@ -222,12 +222,28 @@
foodtypes = GRAIN | VEGETABLES | DAIRY | MEAT
crafting_complexity = FOOD_COMPLEXITY_3
-/obj/item/food/pizzaslice/meat/pizzeria //Reward for pizzeria bitrunning domain
+/obj/item/food/pizzaslice/meat/pizzeria //Reward for pizzeria bitrunning domain; not really meant to be eaten but functionality as food still exists for remote tasters and absurdly determined persons.
name = "pizzeria meatpizza slice"
- desc = "An ostensibly nutritious slice of meatpizza from a long-closed pizzeria."
- food_reagents = null
+ desc = "An barely nutritious slice of meatpizza from a long-closed pizzeria. It's hard as cardboard and barely seems edible, probably not worth breaking your jaw trying to eat it."
tastes = list("crust" = 1, "ketchup" = 1, "'cheese'" = 1, "mystery meat" = 1, "glue" = 1)
- foodtypes = null
+ bite_consumption = 0.1
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 1,
+ )
+ foodtypes = parent_type::foodtypes | GROSS
+ eat_time = 5 MINUTES
+
+/obj/item/food/pizzaslice/meat/pizzeria/Initialize(mapload)
+ . = ..()
+ RegisterSignal(src, COMSIG_FOOD_CONSUMED, PROC_REF(on_consumed))
+
+/// Little bit of flavor for the absurdly persistent pizza eater.
+/obj/item/food/pizzaslice/meat/pizzeria/proc/on_consumed(datum/source, mob/living/eater, mob/feeder)
+ SIGNAL_HANDLER
+
+ to_chat(eater, span_notice("You finally finish eating that piece of trash, and your stomach pains reflect that. Surely there was a better use for this slice of pizza..."))
+
+ return NONE
/obj/item/food/pizza/mushroom
name = "mushroom pizza"
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 29f315c43847..37663f42b1cb 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -6,6 +6,7 @@
name = "candy"
desc = "It's nougat, love it or hate it."
icon_state = "candy"
+ inhand_icon_state = "candy"
trash_type = /obj/item/trash/candy
food_reagents = list(
/datum/reagent/consumable/nutriment = 1,
@@ -87,6 +88,7 @@
name = "chips"
desc = "Commander Riker's What-The-Crisps."
icon_state = "chips"
+ inhand_icon_state = "chips"
trash_type = /obj/item/trash/chips
bite_consumption = 1
food_reagents = list(
@@ -224,6 +226,19 @@
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_SMALL
+/obj/item/food/nutrient_bar
+ name = "\improper Nutrient Bar"
+ icon_state = "nutrientbar"
+ desc = "A nutrieeint rich bar from inozhakust mash, with just enough sugar to not taste utterly horrid."
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 12,
+ /datum/reagent/consumable/sugar = 3,
+ )
+ tastes = list("cardboard" = 3, "sugar" = 2)
+ foodtypes = VEGETABLES
+ food_flags = FOOD_FINGER_FOOD
+ w_class = WEIGHT_CLASS_SMALL
+
/obj/item/food/peanuts
name = "\improper Gallery's peanuts"
desc = "A favourite amongst the terminally angry."
@@ -327,7 +342,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types())
)
tastes = list("chocolate candy" = 3)
junkiness = 25
- foodtypes = JUNKFOOD
+ foodtypes = JUNKFOOD|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_SMALL
@@ -354,7 +369,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types())
/datum/reagent/consumable/coco = 1,
)
tastes = list("chocolate candy" = 2, "pretzel" = 1)
- foodtypes = JUNKFOOD | GRAIN
+ foodtypes = JUNKFOOD | GRAIN | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
/obj/item/food/cnds/peanut_butter
name = "peanut butter C&Ds"
@@ -568,7 +583,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types())
)
tastes = list("biscuit" = 1, "chocolate" = 1)
junkiness = 25
- foodtypes = JUNKFOOD | GRAIN
+ foodtypes = JUNKFOOD | GRAIN | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_SMALL
@@ -595,7 +610,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types())
/datum/reagent/consumable/coco = 1,
)
tastes = list("biscuit" = 1, "peanut butter" = 1)
- foodtypes = JUNKFOOD | GRAIN | NUTS
+ foodtypes = JUNKFOOD | GRAIN | NUTS | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
/obj/item/food/sticko/pineapple
name = "\improper Sticko Pineapple"
@@ -608,7 +623,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types())
/datum/reagent/consumable/peanut_butter = 1,
)
tastes = list("biscuit" = 1, "pineapple" = 1)
- foodtypes = JUNKFOOD | GRAIN | PINEAPPLE
+ foodtypes = JUNKFOOD | GRAIN | PINEAPPLE | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
/obj/item/food/sticko/yuyake
name = "\improper Sticko Yūyake"
diff --git a/code/modules/food_and_drinks/food/soup.dm b/code/modules/food_and_drinks/food/soup.dm
index 47d71e0718ed..c3e2974810ac 100644
--- a/code/modules/food_and_drinks/food/soup.dm
+++ b/code/modules/food_and_drinks/food/soup.dm
@@ -34,7 +34,7 @@
/datum/reagent/consumable/nutriment = 11,
/datum/reagent/consumable/nutriment/vitamin = 2,
)
- foodtypes = SUGAR | DAIRY | JUNKFOOD | GRAIN
+ foodtypes = SUGAR | DAIRY | JUNKFOOD | GRAIN | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
crafting_complexity = FOOD_COMPLEXITY_2
/obj/item/food/bowled/spacylibertyduff
diff --git a/code/modules/food_and_drinks/food/sweets.dm b/code/modules/food_and_drinks/food/sweets.dm
index e429976657f2..17295a61cfee 100644
--- a/code/modules/food_and_drinks/food/sweets.dm
+++ b/code/modules/food_and_drinks/food/sweets.dm
@@ -74,7 +74,7 @@
/datum/reagent/consumable/coco = 2,
)
tastes = list("chocolate" = 1)
- foodtypes = JUNKFOOD | SUGAR
+ foodtypes = JUNKFOOD | SUGAR | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_TINY
crafting_complexity = FOOD_COMPLEXITY_1
@@ -98,7 +98,7 @@
/datum/reagent/consumable/sugar = 1,
)
tastes = list("chocolate" = 1)
- foodtypes = JUNKFOOD | SUGAR
+ foodtypes = JUNKFOOD | SUGAR | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_SMALL
crafting_complexity = FOOD_COMPLEXITY_2
@@ -114,7 +114,7 @@
)
trash_type = /obj/item/dice/fudge
tastes = list("fudge" = 1)
- foodtypes = JUNKFOOD | SUGAR
+ foodtypes = JUNKFOOD | SUGAR | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_SMALL
crafting_complexity = FOOD_COMPLEXITY_2
@@ -128,7 +128,7 @@
/datum/reagent/consumable/sugar = 1,
)
tastes = list("chocolate" = 3, "oranges" = 1)
- foodtypes = JUNKFOOD|FRUIT|SUGAR|ORANGES
+ foodtypes = JUNKFOOD|FRUIT|SUGAR|ORANGES|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_SMALL
crafting_complexity = FOOD_COMPLEXITY_2
@@ -143,7 +143,7 @@
/datum/reagent/consumable/coco = 1,
)
tastes = list("chocolate" = 1)
- foodtypes = JUNKFOOD|SUGAR
+ foodtypes = JUNKFOOD|SUGAR|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_TINY
@@ -176,7 +176,7 @@
/datum/reagent/consumable/nutriment/vitamin = 3,
)
tastes = list("chocolate" = 1, "peanuts" = 1)
- foodtypes = SUGAR|JUNKFOOD|NUTS
+ foodtypes = SUGAR|JUNKFOOD|NUTS|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
crafting_complexity = FOOD_COMPLEXITY_1
/obj/item/food/bonbon/peanut_butter_cup
@@ -188,7 +188,7 @@
/datum/reagent/consumable/nutriment/vitamin = 3,
)
tastes = list("chocolate" = 1, "peanut butter" = 1)
- foodtypes = SUGAR|JUNKFOOD|NUTS
+ foodtypes = SUGAR|JUNKFOOD|NUTS|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
crafting_complexity = FOOD_COMPLEXITY_1
// Gum
diff --git a/code/modules/food_and_drinks/machinery/stove_component.dm b/code/modules/food_and_drinks/machinery/stove_component.dm
index 824041ac86db..ce5fa1a1469d 100644
--- a/code/modules/food_and_drinks/machinery/stove_component.dm
+++ b/code/modules/food_and_drinks/machinery/stove_component.dm
@@ -49,7 +49,6 @@
RegisterSignal(parent, COMSIG_ATOM_ATTACK_ROBOT_SECONDARY, PROC_REF(on_attack_robot_secondary))
RegisterSignal(parent, COMSIG_ATOM_EXITED, PROC_REF(on_exited))
RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_overlay_update))
- RegisterSignal(parent, COMSIG_OBJ_DECONSTRUCT, PROC_REF(on_deconstructed))
RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context))
RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
RegisterSignal(parent, COMSIG_MACHINERY_REFRESH_PARTS, PROC_REF(on_refresh_parts))
@@ -59,7 +58,7 @@
/datum/component/stove/UnregisterFromParent()
var/obj/machinery/real_parent = parent
- if(!QDELING(parent))
+ if(container && !QDELING(parent))
container.forceMove(real_parent.drop_location())
if (particle_type)
@@ -67,7 +66,6 @@
UnregisterSignal(parent, list(
COMSIG_ATOM_ATTACK_HAND_SECONDARY,
- COMSIG_OBJ_DECONSTRUCT,
COMSIG_ATOM_EXITED,
COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM,
COMSIG_ATOM_UPDATE_OVERLAYS,
@@ -162,11 +160,6 @@
if(gone == container)
remove_container()
-/datum/component/stove/proc/on_deconstructed(obj/machinery/source)
- SIGNAL_HANDLER
-
- container.forceMove(source.drop_location())
-
/datum/component/stove/proc/on_overlay_update(obj/machinery/source, list/overlays)
SIGNAL_HANDLER
diff --git a/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm b/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm
index d35ab43264d3..cc7a1eabfec7 100644
--- a/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm
+++ b/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm
@@ -785,3 +785,27 @@
/datum/chemical_reaction/drink/vieux_carre
results=list(/datum/reagent/consumable/ethanol/vieux_carre = 15)
required_reagents = list(/datum/reagent/consumable/ethanol/manhattan = 6, /datum/reagent/consumable/ethanol/cognac = 4, /datum/reagent/consumable/ethanol/vermouth = 2, /datum/reagent/consumable/ethanol/herbal_liqueur = 2, /datum/reagent/consumable/ethanol/bitters = 1)
+
+/datum/chemical_reaction/drink/mouthwash_strong
+ results=list(/datum/reagent/consumable/ethanol/mouthwash_strong = 6)
+ required_reagents = list(/datum/reagent/consumable/ethanol/mouthwash = 3, /datum/reagent/consumable/ethanol/absinthe = 2, /datum/reagent/consumable/mintextract = 2, /datum/reagent/consumable/frostoil = 2, /datum/reagent/consumable/menthol = 1)
+
+/datum/chemical_reaction/drink/frosty_dorf
+ results=list(/datum/reagent/consumable/ethanol/frosty_dorf = 8)
+ required_reagents = list(/datum/reagent/consumable/ethanol/manly_dorf = 2, /datum/reagent/consumable/ethanol/herbal_liqueur = 2, /datum/reagent/consumable/ethanol/mouthwash = 2, /datum/reagent/consumable/ice = 2)
+
+/datum/chemical_reaction/drink/stone_cold_stout
+ results=list(/datum/reagent/consumable/ethanol/stone_cold_stout = 6)
+ required_reagents = list(/datum/reagent/consumable/ethanol/beer/maltliquor = 1, /datum/reagent/consumable/frostoil = 1, /datum/reagent/consumable/ethanol/fernet = 1, /datum/reagent/consumable/ethanol/bitters = 1, /datum/reagent/cryostylane = 1)
+
+/datum/chemical_reaction/drink/ramp_rager
+ results=list(/datum/reagent/consumable/ethanol/ramp_rager = 8)
+ required_reagents = list(/datum/reagent/consumable/ethanol/manly_dorf = 3, /datum/reagent/toxin/berserker = 2, /datum/reagent/consumable/grey_bull = 2, /datum/reagent/blood = 1)
+
+/datum/chemical_reaction/drink/sea_lantern
+ results=list(/datum/reagent/consumable/ethanol/sea_lantern = 8)
+ required_reagents = list(/datum/reagent/consumable/guidoferrun = 4, /datum/reagent/consumable/strawberryshake = 4, /datum/reagent/consumable/ethanol/wine_voltaic = 2, /datum/reagent/consumable/ethanol/admiralty = 2)
+
+/datum/chemical_reaction/drink/icegrave
+ results=list(/datum/reagent/consumable/ethanol/icegrave = 6)
+ required_reagents = list(/datum/reagent/toxin/formaldehyde = 2, /datum/reagent/cryostylane = 1, /datum/reagent/consumable/ethanol/mouthwash = 1, /datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/ice = 1)
diff --git a/code/modules/food_and_drinks/recipes/soup_mixtures.dm b/code/modules/food_and_drinks/recipes/soup_mixtures.dm
index bbdc09811a00..0636daa8b49a 100644
--- a/code/modules/food_and_drinks/recipes/soup_mixtures.dm
+++ b/code/modules/food_and_drinks/recipes/soup_mixtures.dm
@@ -1081,6 +1081,30 @@
)
percentage_of_nutriment_converted = 0.1
+// Red beet soup
+/datum/reagent/consumable/nutriment/soup/drake_beet
+ name = "Drake Beet Soup"
+ description = "A soup made out of drake beets and sinew clinging to drake hide."
+ data = list("drake beet" = 4, "spice" = 1)
+ color = "#851127"
+
+/datum/glass_style/has_foodtype/soup/drake_beet
+ required_drink_type = /datum/reagent/consumable/nutriment/soup/drake_beet
+ icon_state = "drakebeetsoup"
+ drink_type = VEGETABLES | MEAT
+
+/datum/chemical_reaction/food/soup/drake_beet
+ required_reagents = list(/datum/reagent/water = 50)
+ required_ingredients = list(
+ /obj/item/food/grown/drake_beet = 2,
+ /obj/item/stack/sheet/animalhide/ashdrake = 1,
+ )
+ results = list(
+ /datum/reagent/consumable/nutriment/soup/drake_beet = 30,
+ /datum/reagent/water = 10,
+ )
+ percentage_of_nutriment_converted = 0.2
+
// French Onion soup
/datum/reagent/consumable/nutriment/soup/french_onion
name = "French Onion Soup"
@@ -1133,6 +1157,32 @@
/datum/reagent/water = 5,
)
+// Iceberg soup
+/datum/reagent/consumable/nutriment/soup/iceberg
+ name = "Iceberg Soup"
+ description = "A slight upgrade upon the wish soup, this one has some nutrient content."
+ data = list("cold" = 4, "tundra wilds" = 1)
+ color = "#26AEB9"
+
+/datum/glass_style/has_foodtype/soup/iceberg
+ required_drink_type = /datum/reagent/consumable/nutriment/soup/iceberg
+ icon_state = "icebergbowl"
+ drink_type = VEGETABLES
+
+/datum/chemical_reaction/food/soup/iceberg
+ required_reagents = list(
+ /datum/reagent/water = 40,
+ /datum/reagent/consumable/frostoil = 10,
+ )
+ required_ingredients = list(
+ /obj/item/food/grown/ash_flora/fonarstolbe = 1,
+ /obj/item/food/grown/ash_flora/podsneyzka = 1,
+ /obj/item/food/grown/peas = 1,
+ )
+ results = list(
+ /datum/reagent/consumable/nutriment/soup/iceberg = 40,
+ )
+
// Bungo Tree Curry
/datum/reagent/consumable/nutriment/soup/bungo
name = "Bungo Curry"
@@ -1271,6 +1321,38 @@
)
percentage_of_nutriment_converted = 0 // Oats have barely any nutrients
+// Wolf Goulash
+/datum/reagent/consumable/nutriment/soup/goulash
+ name = "Wolf Goulash"
+ description = "A thick soup with heavy focus on the meat. In this rendition, the meat from wolf sinew."
+ data = list("meat" = 4, "vegetables" = 1, "spice" = 1)
+ color = "#CA3518"
+
+/datum/glass_style/has_foodtype/soup/goulash
+ required_drink_type = /datum/reagent/consumable/nutriment/soup/goulash
+ icon_state = "goulash"
+ drink_type = VEGETABLES | MEAT
+
+/datum/chemical_reaction/food/soup/goulash
+ required_reagents = list(
+ /datum/reagent/water = 40,
+ /datum/reagent/consumable/flour = 10,
+ )
+ required_ingredients = list(
+ /obj/item/stack/sheet/sinew/wolf = 1,
+ /obj/item/food/grown/drake_beet = 1,
+ /obj/item/food/grown/bell_pepper = 1,
+ /obj/item/food/grown/onion = 1,
+ )
+ results = list(
+ /datum/reagent/consumable/nutriment/soup/goulash = 30,
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/consumable/nutriment/protein = 3,
+ /datum/reagent/consumable/nutriment/vitamin = 3,
+ )
+ ingredient_reagent_multiplier = 0.5
+ percentage_of_nutriment_converted = 0.1
+
// Zurek, a Polish soup
/datum/reagent/consumable/nutriment/soup/zurek
name = "Zurek"
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
index 14ec0805373e..d0b1035e75b7 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
@@ -291,7 +291,7 @@
/datum/reagent/consumable/sugar = 2
)
result = /obj/item/food/popsicle/jumbo
- added_foodtypes = DAIRY
+ added_foodtypes = DAIRY | SUGAR | CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
removed_foodtypes = JUNKFOOD
dish_category = DISH_FROZEN
meal_category = MEAL_DESSERT
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
index 652357f476d1..fca9d1203b02 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
@@ -99,6 +99,17 @@
added_foodtypes = ALCOHOL
dish_category = DISH_MEAT
+/datum/crafting_recipe/food/polar_bear_steak
+ name = "Filet polar migrawr"
+ reqs = list(
+ /datum/reagent/consumable/ethanol/frosty_dorf = 3,
+ /datum/reagent/consumable/ethanol/blue_blazer = 3,
+ /obj/item/food/meat/steak/bear = 1,
+ )
+ result = /obj/item/food/polar_bear_steak
+ added_foodtypes = ALCOHOL
+ dish_category = DISH_MEAT
+
/datum/crafting_recipe/food/stewedsoymeat
name = "Stewed soymeat"
reqs = list(
@@ -197,6 +208,20 @@
added_foodtypes = SUGAR
dish_category = DISH_MEAT
+/datum/crafting_recipe/food/drake_ribs
+ name = "Drake Ribs"
+ reqs = list(
+ /datum/reagent/consumable/guidoferrun = 1,
+ /datum/reagent/consumable/frostoil = 4,
+ /datum/reagent/consumable/bbqsauce = 5,
+ /obj/item/food/meat/steak/bear = 2,
+ /obj/item/stack/sheet/animalhide/ashdrake = 1,
+ /obj/item/stack/rods = 2
+ )
+ result = /obj/item/food/drake_ribs
+ added_foodtypes = SUGAR
+ dish_category = DISH_MEAT
+
/datum/crafting_recipe/food/meatclown
name = "Meat Clown"
reqs = list(
@@ -415,3 +440,17 @@
result = /obj/item/food/kebab/pineapple_skewer
dish_category = DISH_MEAT
meal_category = MEAL_APPETIZER
+
+/datum/crafting_recipe/food/wendigo_feast
+ name = "Wendigo feast"
+ reqs = list(
+ /obj/item/food/drake_ribs = 1,
+ /obj/item/food/polar_bear_steak = 1,
+ /obj/item/wendigo_skull = 1,
+ /obj/item/stack/sheet/sinew/wolf = 2,
+ /obj/item/food/grown/ash_flora/vahrezjia = 1,
+ /obj/item/food/grown/ash_flora/podsneyzka = 1,
+ )
+ result = /obj/item/food/wendigo_feast
+ removed_foodtypes = ALCOHOL
+ dish_category = DISH_MEAT
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
index 4d71d57e4a03..da6d233ece01 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -597,3 +597,13 @@
)
result = /obj/item/food/raw_pita_bread
dish_category = DISH_BREAD
+
+/datum/crafting_recipe/food/nutrient_bar
+ name = "Nutrient Bar"
+ reqs = list(
+ /obj/item/food/grown/ash_flora/inozhakust = 2,
+ /datum/reagent/consumable/sugar = 3,
+ )
+ result = /obj/item/food/nutrient_bar
+ removed_foodtypes = GROSS
+ dish_category = DISH_UNCATEGORIZED
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
index 82118dc3e5dc..daeedc6a5011 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
@@ -96,6 +96,7 @@
/obj/item/food/donut/plain = 1
)
result = /obj/item/food/donut/choco
+ added_foodtypes = DAIRY|SUGAR|BREAKFAST|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
/datum/crafting_recipe/food/donut/blumpkin
name = "Blumpkin Donut"
@@ -172,6 +173,7 @@
/obj/item/food/donut/jelly/plain = 1
)
result = /obj/item/food/donut/jelly/choco
+ added_foodtypes = parent_type::added_foodtypes|CHOCOLATE //DARKPACK EDIT ADDITION: Chocolate
/datum/crafting_recipe/food/donut/jelly/blumpkin
name = "Blumpkin Jelly Donut"
@@ -249,6 +251,7 @@
/obj/item/food/chocolatebar = 1,
/obj/item/food/donut/jelly/slimejelly/plain = 1
)
+ added_foodtypes = parent_type::added_foodtypes|CHOCOLATE //DARKPACK EDIT ADDITION: Chocolate
result = /obj/item/food/donut/jelly/slimejelly/choco
/datum/crafting_recipe/food/donut/slimejelly/blumpkin
@@ -694,7 +697,7 @@
/obj/item/food/butterslice = 1
)
result = /obj/item/food/raw_brownie_batter
- added_foodtypes = GRAIN|JUNKFOOD|SUGAR
+ added_foodtypes = GRAIN|JUNKFOOD|SUGAR|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
removed_foodtypes = MEAT|RAW|EGG
meal_category = MEAL_COMPONENT
@@ -709,7 +712,7 @@
/obj/item/food/butterslice = 1
)
result = /obj/item/food/peanut_butter_brownie_batter
- added_foodtypes = GRAIN|JUNKFOOD|SUGAR|NUTS
+ added_foodtypes = GRAIN|JUNKFOOD|SUGAR|NUTS|CHOCOLATE //DARKPACK EDIT CHANGE: Chocolate
removed_foodtypes = MEAT|RAW|EGG
meal_category = MEAL_COMPONENT
diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm
index 752036888751..41a6197e7b17 100644
--- a/code/modules/holodeck/computer.dm
+++ b/code/modules/holodeck/computer.dm
@@ -224,8 +224,12 @@ GLOBAL_LIST_INIT(typecache_holodeck_linked_floorcheck_ok, typecacheof(list(/turf
template.load(bottom_left) //this is what actually loads the holodeck simulation into the map
if(template.restricted)
- usr.log_message("loaded a restricted Holodeck program: [program].", LOG_GAME)
- message_admins("[ADMIN_LOOKUPFLW(usr)] loaded a restricted Holodeck program: [program].")
+ if(usr)
+ usr.log_message("loaded a restricted Holodeck program: [program].", LOG_GAME)
+ message_admins("[ADMIN_LOOKUPFLW(usr)] loaded a restricted Holodeck program: [program].")
+ else
+ log_game("loaded a restricted Holodeck program: [program].")
+ message_admins("loaded a restricted Holodeck program: [program].")
spawned = template.created_atoms //populate the spawned list with the atoms belonging to the holodeck
diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm
index 62297df1e716..d32ab95c5ef9 100644
--- a/code/modules/hydroponics/grown/flowers.dm
+++ b/code/modules/hydroponics/grown/flowers.dm
@@ -342,6 +342,7 @@
name = "carbon rose"
desc = "The all new fleur d'amour gris - the flower of love, modernized, with no harsh thorns."
icon_state = "carbonrose"
+ inhand_icon_state = "carbonrose"
lefthand_file = 'icons/mob/inhands/weapons/plants_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/plants_righthand.dmi'
force = 0
diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm
index 638896d895dc..3e7856765b5d 100644
--- a/code/modules/hydroponics/grown/root.dm
+++ b/code/modules/hydroponics/grown/root.dm
@@ -168,6 +168,7 @@
growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi'
icon_dead = "whitebeet-dead"
genes = list(/datum/plant_gene/trait/soil_lover, /datum/plant_gene/trait/maxchem)
+ mutatelist = list(/obj/item/seeds/drake_beet)
reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.05)
graft_gene = /datum/plant_gene/trait/maxchem
@@ -179,3 +180,30 @@
bite_consumption_mod = 2
foodtypes = VEGETABLES
wine_power = 60
+
+/// Drake Beet
+/obj/item/seeds/drake_beet
+ name = "drake beet seed pack"
+ desc = "These seeds grow into drake beet producing plants."
+ icon_state = "seed-drakebeet"
+ species = "drakebeet"
+ plantname = "Drake-Beet Plants"
+ product = /obj/item/food/grown/drake_beet
+ lifespan = 60
+ endurance = 60
+ yield = 5
+ instability = 20
+ growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi'
+ icon_dead = "whitebeet-dead"
+ genes = list(/datum/plant_gene/trait/soil_lover, /datum/plant_gene/trait/maxchem, /datum/plant_gene/trait/chem_heating)
+ reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.02, /datum/reagent/consumable/sugar = 0.5, /datum/reagent/consumable/nutriment = 0.03, /datum/reagent/consumable/capsaicin = 0.2)
+ graft_gene = /datum/plant_gene/trait/maxchem
+
+/obj/item/food/grown/drake_beet
+ seed = /obj/item/seeds/drake_beet
+ name = "drake beet"
+ desc = "Despite the intimidating exterior, drakebeets are actually rich in sugars, extracted from the soil. And just slightly spicy."
+ icon_state = "drakebeet"
+ bite_consumption_mod = 2
+ foodtypes = VEGETABLES
+ wine_power = 66
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroponics_items.dm
similarity index 92%
rename from code/modules/hydroponics/hydroitemdefines.dm
rename to code/modules/hydroponics/hydroponics_items.dm
index a33556ceb700..91e8f0e0715e 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroponics_items.dm
@@ -87,6 +87,28 @@
H.visible_message(span_warning("[H] steps on [src] causing the handle to hit [H.p_them()] right in the face!"), \
span_userdanger("You step on [src] causing the handle to hit you right in the face!"))
+/obj/item/cultivator/rake/pitchfork
+ name = "gardening pitchfork"
+ desc = "About as traditional of a rake as you can get. Far better known, however, as the sign of \"political disagreements\"."
+ icon_state = "pitchfork"
+ inhand_icon_state = "pitchfork"
+ lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
+ force = 12
+ throwforce = 16
+ throw_speed = 4
+ w_class = WEIGHT_CLASS_BULKY
+ attack_verb_continuous = list("pokes", "pierces", "impales", "stabs")
+ attack_verb_simple = list("poke", "pierce", "impale", "stab")
+ hitsound = 'sound/items/weapons/bladeslice.ogg'
+ custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2, /datum/material/iron = SHEET_MATERIAL_AMOUNT)
+ resistance_flags = FLAMMABLE | FIRE_PROOF
+ embed_type = /datum/embedding/spear
+ armour_penetration = 5
+ sharpness = SHARP_POINTY
+ wound_bonus = 8
+ exposed_wound_bonus = 15
+
/obj/item/cultivator/cyborg
name = "cyborg cultivator"
icon = 'icons/obj/items_cyborg.dmi'
diff --git a/code/modules/hydroponics/soil.dm b/code/modules/hydroponics/soil.dm
index 36e89ccc0ed4..373f1e7fb636 100644
--- a/code/modules/hydroponics/soil.dm
+++ b/code/modules/hydroponics/soil.dm
@@ -130,6 +130,7 @@
desc = "A large plastic bag containing commercial garden soil. It is packed with sand, peat and manure. While you might not care much for such mixture, the plants have strange tastes."
icon = 'icons/obj/service/hydroponics/equipment.dmi'
icon_state = "soil_sack"
+ inhand_icon_state = "soil_sack"
lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
base_icon_state = "soil_sack"
@@ -231,6 +232,7 @@
name = "NT vermaculite sack"
desc = "A sack of expanded mineral granules that can be used as soilless growing medium.\n\nYou like to think of it a bag of rocky popcorn that lets the roots breathe."
icon_state = "soil_sack_verm"
+ inhand_icon_state = "soil_sack_verm"
base_icon_state = "soil_sack_verm"
custom_premium_price = PAYCHECK_CREW * 2
stored_soil = /obj/machinery/hydroponics/soil/vermaculite
@@ -240,6 +242,7 @@
name = "hydrogel bead sack"
desc = "A sack of space age superabsorbent gel beads! You wonder how shipping them prehydrated would ever make business sense..."
icon_state = "soil_sack_gel"
+ inhand_icon_state = "soil_sack_gel"
base_icon_state = "soil_sack_gel"
custom_premium_price = PAYCHECK_CREW * 2
placement_sound = 'sound/effects/meatslap.ogg'
@@ -249,6 +252,7 @@
name = "#1™ coconut coir sack" // DARKPACK EDIT CHANGE
desc = "A sack of coconut coir. The fiberous roots are composted until they separate into individual fibres.\n\nProvides an excellent food source for mushrooms." // DARKPACK EDIT CHANGE
icon_state = "soil_sack_coir"
+ inhand_icon_state = "soil_sack_coir"
base_icon_state = "soil_sack_coir"
custom_premium_price = PAYCHECK_CREW * 3
stored_soil = /obj/machinery/hydroponics/soil/coir
@@ -257,6 +261,7 @@
name = "worm castings sack"
desc = "A sack of vermicompost, also known as worm castings.\n\nThis invertebrate manure not only contains plant nutrients and undigested organic matter, it also harbours a rich flora of beneficial microorganisms."
icon_state = "soil_sack_worm"
+ inhand_icon_state = "soil_sack_worm"
base_icon_state = "soil_sack_worm"
custom_premium_price = PAYCHECK_CREW * 4
stored_soil = /obj/machinery/hydroponics/soil/worm
diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm
index e5de5d3f8584..965324fc666d 100644
--- a/code/modules/instruments/items.dm
+++ b/code/modules/instruments/items.dm
@@ -30,6 +30,8 @@
var/mob/user = music_player
if(user.incapacitated)
return FALSE
+ if(user.get_item_by_slot(slot_flags) == src) //can't play while wearing the instrument
+ return FALSE
if(!Adjacent(user))
return FALSE
return TRUE
@@ -86,6 +88,8 @@
desc = "Makes all your shredding needs possible."
icon_state = "eguitar"
inhand_icon_state = "eguitar"
+ worn_icon = 'icons/mob/clothing/back.dmi'
+ slot_flags = ITEM_SLOT_BACK
force = 12
attack_verb_continuous = list("plays metal on", "shreds", "crashes", "smashes")
attack_verb_simple = list("play metal on", "shred", "crash", "smash")
diff --git a/code/modules/instruments/songs/editor.dm b/code/modules/instruments/songs/editor.dm
index 93c84f5c74ba..831d945f15e9 100644
--- a/code/modules/instruments/songs/editor.dm
+++ b/code/modules/instruments/songs/editor.dm
@@ -59,8 +59,8 @@
data["max_volume"] = max_volume
data["note_shift_min"] = note_shift_min
data["note_shift_max"] = note_shift_max
- data["max_line_chars"] = MUSIC_MAXLINECHARS
- data["max_lines"] = MUSIC_MAXLINES
+ data["max_line_chars"] = SSinstruments.musician_maxlinechars
+ data["max_lines"] = SSinstruments.musician_maxlines
return data
/datum/song/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
@@ -105,15 +105,15 @@
if("import_song")
var/song_text = ""
do
- song_text = tgui_input_text(user, "Please paste the entire song, formatted:", name, max_length = (MUSIC_MAXLINES * MUSIC_MAXLINECHARS), multiline = TRUE)
+ song_text = tgui_input_text(user, "Please paste the entire song, formatted:", name, max_length = (SSinstruments.musician_maxlines * SSinstruments.musician_maxlinechars), multiline = TRUE)
if(!in_range(parent, user))
return
- if(length_char(song_text) >= MUSIC_MAXLINES * MUSIC_MAXLINECHARS)
+ if(length_char(song_text) >= SSinstruments.musician_maxlines * SSinstruments.musician_maxlinechars)
var/should_continue = tgui_alert(user, "Your message is too long! Would you like to continue editing it?", "Warning", list("Yes", "No"))
if(should_continue != "Yes")
break
- while(length_char(song_text) > MUSIC_MAXLINES * MUSIC_MAXLINECHARS)
+ while(length_char(song_text) > SSinstruments.musician_maxlines * SSinstruments.musician_maxlinechars)
ParseSong(user, song_text)
return TRUE
if("start_new_song")
@@ -122,13 +122,13 @@
tempo = sanitize_tempo(5) // default 120 BPM
return TRUE
if("add_new_line")
- var/newline = tgui_input_text(user, "Enter your line", parent.name, max_length = MUSIC_MAXLINECHARS)
+ var/newline = tgui_input_text(user, "Enter your line", parent.name, max_length = SSinstruments.musician_maxlinechars)
if(!newline || !in_range(parent, user))
return
- if(lines.len > MUSIC_MAXLINES)
+ if(lines.len > SSinstruments.musician_maxlines)
return
- if(length(newline) > MUSIC_MAXLINECHARS)
- newline = copytext(newline, 1, MUSIC_MAXLINECHARS)
+ if(length(newline) > SSinstruments.musician_maxlinechars)
+ newline = copytext(newline, 1, SSinstruments.musician_maxlinechars)
lines.Add(newline)
if("delete_line")
var/line_to_delete = params["line_deleted"]
@@ -140,7 +140,7 @@
var/line_to_edit = params["line_editing"]
if(line_to_edit > lines.len || line_to_edit < 1)
return FALSE
- var/new_line_text = tgui_input_text(user, "Enter your line ", parent.name, lines[line_to_edit], max_length = MUSIC_MAXLINECHARS)
+ var/new_line_text = tgui_input_text(user, "Enter your line ", parent.name, lines[line_to_edit], max_length = SSinstruments.musician_maxlinechars)
if(isnull(new_line_text) || !in_range(parent, user))
return FALSE
lines[line_to_edit] = new_line_text
@@ -207,13 +207,13 @@
lines.Cut(1, 2)
else
tempo = sanitize_tempo(5) // default 120 BPM
- if(lines.len > MUSIC_MAXLINES)
+ if(lines.len > SSinstruments.musician_maxlines)
if(user)
to_chat(user, "Too many lines!")
- lines.Cut(MUSIC_MAXLINES + 1)
+ lines.Cut(SSinstruments.musician_maxlines + 1)
var/linenum = 1
for(var/l in lines)
- if(length_char(l) > MUSIC_MAXLINECHARS)
+ if(length_char(l) > SSinstruments.musician_maxlinechars)
if(user)
to_chat(user, "Line [linenum] too long!")
lines.Remove(l)
diff --git a/code/modules/instruments/songs/play_legacy.dm b/code/modules/instruments/songs/play_legacy.dm
index 8513b8582170..95fcac581175 100644
--- a/code/modules/instruments/songs/play_legacy.dm
+++ b/code/modules/instruments/songs/play_legacy.dm
@@ -77,7 +77,7 @@
return
// and play
var/turf/source = get_turf(parent)
- if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck)
+ if((world.time - SSinstruments.musician_hearcheck_mindelay) > last_hearcheck)
do_hearcheck()
var/sound/music_played = sound(soundfile)
for(var/i in hearing_mobs)
diff --git a/code/modules/instruments/songs/play_synthesized.dm b/code/modules/instruments/songs/play_synthesized.dm
index 92ae4d369c58..37adee5db370 100644
--- a/code/modules/instruments/songs/play_synthesized.dm
+++ b/code/modules/instruments/songs/play_synthesized.dm
@@ -44,30 +44,29 @@
*/
/datum/song/proc/playkey_synth(key, atom/player)
key = clamp(key + note_shift, key_min, key_max)
- if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck)
+ if((world.time - SSinstruments.musician_hearcheck_mindelay) > last_hearcheck)
do_hearcheck()
- var/datum/instrument_key/K = using_instrument.samples[num2text(key)] //See how fucking easy it is to make a number text? You don't need a complicated 9 line proc!
+ var/datum/instrument_key/instrument_key = using_instrument.samples[num2text(key)] //See how fucking easy it is to make a number text? You don't need a complicated 9 line proc!
//Should probably add channel limiters here at some point but I don't care right now.
var/channel = pop_channel()
if(isnull(channel))
return FALSE
. = TRUE
- var/sound/copy = sound(K.sample)
+ var/sound/copy = sound(instrument_key.sample)
var/volume = src.volume * using_instrument.volume_multiplier
- copy.frequency = K.frequency
+ copy.frequency = instrument_key.frequency
copy.volume = volume
var/channel_text = num2text(channel)
channels_playing[channel_text] = 100
last_channel_played = channel_text
- for(var/i in hearing_mobs)
- var/mob/M = i
- if(player && HAS_TRAIT(player, TRAIT_MUSICIAN) && isliving(M))
- var/mob/living/L = M
- L.apply_status_effect(/datum/status_effect/good_music)
- var/pref_volume = M?.client?.prefs.read_preference(/datum/preference/numeric/volume/sound_instruments)
+ for(var/mob/hearing_mob as anything in hearing_mobs)
+ if(player && HAS_TRAIT(player, TRAIT_MUSICIAN) && isliving(hearing_mob))
+ var/mob/living/living_hearer = hearing_mob
+ living_hearer.apply_status_effect(/datum/status_effect/good_music)
+ var/pref_volume = hearing_mob?.client?.prefs.read_preference(/datum/preference/numeric/volume/sound_instruments)
if(!pref_volume)
continue
- M.playsound_local(get_turf(parent), null, volume * (pref_volume/100), FALSE, K.frequency, exponential_falloff, channel, null, copy)
+ hearing_mob.playsound_local(get_turf(parent), null, volume * (pref_volume/100), FALSE, instrument_key.frequency, exponential_falloff, channel, null, copy)
// Could do environment and echo later but not for now
/**
@@ -114,24 +113,23 @@
var/linear_dropoff = cached_linear_dropoff * wait_ds
var/exponential_dropoff = cached_exponential_dropoff ** wait_ds
for(var/channel in channels_playing)
- if(full_sustain_held_note && (channel == last_channel_played))
- continue
+ var/held_note = full_sustain_held_note && (channel == last_channel_played)
var/current_volume = channels_playing[channel]
- switch(sustain_mode)
- if(SUSTAIN_LINEAR)
- current_volume -= linear_dropoff
- if(SUSTAIN_EXPONENTIAL)
- current_volume /= exponential_dropoff
+ if(!held_note)
+ switch(sustain_mode)
+ if(SUSTAIN_LINEAR)
+ current_volume -= linear_dropoff
+ if(SUSTAIN_EXPONENTIAL)
+ current_volume /= exponential_dropoff
channels_playing[channel] = current_volume
- var/dead = current_volume <= sustain_dropoff_volume
+ var/dead = !held_note && current_volume <= sustain_dropoff_volume
var/channelnumber = text2num(channel)
if(dead)
channels_playing -= channel
channels_idle += channel
- for(var/i in hearing_mobs)
- var/mob/M = i
- M.stop_sound_channel(channelnumber)
+ for(var/mob/hearing_mob as anything in hearing_mobs)
+ hearing_mob.stop_sound_channel(channelnumber)
else
- for(var/i in hearing_mobs)
- var/mob/M = i
- M.set_sound_channel_volume(channelnumber, (current_volume * 0.01) * volume * using_instrument.volume_multiplier)
+ for(var/mob/hearing_mob as anything in hearing_mobs)
+ var/pref_volume = hearing_mob?.client?.prefs.read_preference(/datum/preference/numeric/volume/sound_instruments)
+ hearing_mob.set_sound_channel_volume(channelnumber, (current_volume * 0.01) * volume * using_instrument.volume_multiplier * (pref_volume / 100))
diff --git a/code/modules/jobs/departments/departments.dm b/code/modules/jobs/departments/departments.dm
index 2684b4092848..0d02897dd73d 100644
--- a/code/modules/jobs/departments/departments.dm
+++ b/code/modules/jobs/departments/departments.dm
@@ -85,6 +85,7 @@
display_order = 1
ui_color = "#fcd203"
primary_work_area = /area/station/command
+ department_access = REGION_ACCESS_COMMAND
/datum/job_department/security
department_name = DEPARTMENT_SECURITY
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index b119f3b0cf36..91a2c04c18b3 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -371,7 +371,7 @@
uniform = /obj/item/clothing/under/color/grey
id = /obj/item/card/id/advanced
ears = /obj/item/radio/headset
- belt = /obj/item/modular_computer/pda
+ belt = /obj/item/modular_computer/pda/crew
back = /obj/item/storage/backpack
shoes = /obj/item/clothing/shoes/sneakers/black
box = /obj/item/storage/box/survival
@@ -661,12 +661,7 @@
return // Disconnected while checking the appearance ban.
organic_name = player_client.prefs.read_preference(/datum/preference/name/real_name)
- mmi.name = "[initial(mmi.name)]: [organic_name]"
- if(mmi.brain)
- mmi.brain.name = "[organic_name]'s brain"
- if(mmi.brainmob)
- mmi.brainmob.real_name = organic_name //the name of the brain inside the cyborg is the robotized human's name.
- mmi.brainmob.name = organic_name
+ mmi.set_name(organic_name)
// If this checks fails, then the name will have been handled during initialization.
if(!GLOB.current_anonymous_theme && player_client.prefs.read_preference(/datum/preference/name/cyborg) != DEFAULT_CYBORG_NAME)
apply_pref_name(/datum/preference/name/cyborg, player_client)
diff --git a/code/modules/jobs/job_types/assistant/assistant.dm b/code/modules/jobs/job_types/assistant/assistant.dm
index 2fcbaddf0626..0df5b98ed321 100644
--- a/code/modules/jobs/job_types/assistant/assistant.dm
+++ b/code/modules/jobs/job_types/assistant/assistant.dm
@@ -55,7 +55,7 @@ Assistant
name = JOB_ASSISTANT
jobtype = /datum/job/assistant
id_trim = /datum/id_trim/job/assistant
- belt = /obj/item/modular_computer/pda/assistant
+ belt = /obj/item/modular_computer/pda/crew/assistant
/datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/target)
..()
diff --git a/code/modules/jobs/job_types/assistant/gimmick_assistants.dm b/code/modules/jobs/job_types/assistant/gimmick_assistants.dm
index be8c52c6c293..55e35412b4c8 100644
--- a/code/modules/jobs/job_types/assistant/gimmick_assistants.dm
+++ b/code/modules/jobs/job_types/assistant/gimmick_assistants.dm
@@ -169,7 +169,7 @@
belt = /obj/item/storage/belt/utility/full
head = /obj/item/clothing/head/utility/hardhat
uniform = /obj/item/clothing/under/color/yellow
- l_pocket = /obj/item/modular_computer/pda/assistant
+ l_pocket = /obj/item/modular_computer/pda/crew/assistant
pda_slot = ITEM_SLOT_LPOCKET
outfit_weight = 6
diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm
index 0fe64c35b860..23093612d81b 100644
--- a/code/modules/jobs/job_types/atmospheric_technician.dm
+++ b/code/modules/jobs/job_types/atmospheric_technician.dm
@@ -47,7 +47,7 @@
suit = /obj/item/clothing/suit/atmos_overalls
belt = /obj/item/storage/belt/utility/atmostech
ears = /obj/item/radio/headset/headset_eng
- l_pocket = /obj/item/modular_computer/pda/atmos
+ l_pocket = /obj/item/modular_computer/pda/crew/atmos
r_pocket = /obj/item/analyzer
backpack = /obj/item/storage/backpack/industrial
diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm
index 3b373f490ecb..30af57190a7d 100644
--- a/code/modules/jobs/job_types/bartender.dm
+++ b/code/modules/jobs/job_types/bartender.dm
@@ -57,7 +57,7 @@
backpack_contents = list(
/obj/item/storage/box/beanbag = 1,
)
- belt = /obj/item/modular_computer/pda/bar
+ belt = /obj/item/modular_computer/pda/crew/bar
ears = /obj/item/radio/headset/headset_srv
glasses = /obj/item/clothing/glasses/sunglasses/reagent
shoes = /obj/item/clothing/shoes/laceup
diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm
index 5cd9d72523eb..b4928f0ea6e7 100644
--- a/code/modules/jobs/job_types/botanist.dm
+++ b/code/modules/jobs/job_types/botanist.dm
@@ -47,7 +47,7 @@
uniform = /obj/item/clothing/under/rank/civilian/hydroponics
suit = /obj/item/clothing/suit/apron
suit_store = /obj/item/plant_analyzer
- belt = /obj/item/modular_computer/pda/botanist
+ belt = /obj/item/modular_computer/pda/crew/botanist
ears = /obj/item/radio/headset/headset_srv
gloves = /obj/item/clothing/gloves/botanic_leather
diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm
index ea452cadb41d..d81c360af66c 100644
--- a/code/modules/jobs/job_types/captain.dm
+++ b/code/modules/jobs/job_types/captain.dm
@@ -71,7 +71,7 @@
/obj/item/melee/baton/telescopic/gold = 1,
/obj/item/station_charter = 1,
)
- belt = /obj/item/modular_computer/pda/heads/captain
+ belt = /obj/item/modular_computer/pda/crew/heads/captain
ears = /obj/item/radio/headset/heads/captain/alt
glasses = /obj/item/clothing/glasses/sunglasses
gloves = /obj/item/clothing/gloves/captain
diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm
index ef1c2e7cf537..54b9190c6989 100644
--- a/code/modules/jobs/job_types/cargo_technician.dm
+++ b/code/modules/jobs/job_types/cargo_technician.dm
@@ -45,7 +45,7 @@
)
id_trim = /datum/id_trim/job/cargo_technician
uniform = /obj/item/clothing/under/rank/cargo/tech
- belt = /obj/item/modular_computer/pda/cargo
+ belt = /obj/item/modular_computer/pda/crew/cargo
suit = /obj/item/clothing/suit/toggle/cargo_tech
ears = /obj/item/radio/headset/headset_cargo
l_hand = /obj/item/universal_scanner
diff --git a/code/modules/jobs/job_types/chaplain/chaplain.dm b/code/modules/jobs/job_types/chaplain/chaplain.dm
index e10957bcf557..152d15cdd8c5 100644
--- a/code/modules/jobs/job_types/chaplain/chaplain.dm
+++ b/code/modules/jobs/job_types/chaplain/chaplain.dm
@@ -124,7 +124,7 @@
/obj/item/camera/spooky = 1,
/obj/item/stamp/chap = 1,
)
- belt = /obj/item/modular_computer/pda/chaplain
+ belt = /obj/item/modular_computer/pda/crew/chaplain
ears = /obj/item/radio/headset/headset_srv
backpack = /obj/item/storage/backpack/cultpack
diff --git a/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm b/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm
index 3ce7d1ef7425..0daf6f4e469d 100644
--- a/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm
+++ b/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm
@@ -54,6 +54,7 @@
name = "religious tunic"
desc = "No nunsene clothing."
icon_state = "habit"
+ inhand_icon_state = "habit"
alternate_worn_layer = GLOVES_LAYER // since the sleeves cover a part of the hands, this way it looks better while retaining glove overlay correctly.
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
flags_inv = HIDEJUMPSUIT|HIDEBELT
diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm
index 0f5326618259..625fb74379fd 100644
--- a/code/modules/jobs/job_types/chemist.dm
+++ b/code/modules/jobs/job_types/chemist.dm
@@ -45,7 +45,7 @@
id_trim = /datum/id_trim/job/chemist
uniform = /obj/item/clothing/under/rank/medical/chemist
suit = /obj/item/clothing/suit/toggle/labcoat/chemist
- belt = /obj/item/modular_computer/pda/chemist
+ belt = /obj/item/modular_computer/pda/crew/chemist
ears = /obj/item/radio/headset/headset_med
glasses = /obj/item/clothing/glasses/science
shoes = /obj/item/clothing/shoes/sneakers/white
diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm
index 07940f21ee22..3e391eeb0b87 100644
--- a/code/modules/jobs/job_types/chief_engineer.dm
+++ b/code/modules/jobs/job_types/chief_engineer.dm
@@ -75,7 +75,7 @@
gloves = /obj/item/clothing/gloves/color/black
head = /obj/item/clothing/head/utility/hardhat/welding/white/up
shoes = /obj/item/clothing/shoes/workboots
- l_pocket = /obj/item/modular_computer/pda/heads/ce
+ l_pocket = /obj/item/modular_computer/pda/crew/heads/ce
backpack = /obj/item/storage/backpack/industrial
satchel = /obj/item/storage/backpack/satchel/eng
diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm
index 9de40803ab55..0b0a8dc738e4 100644
--- a/code/modules/jobs/job_types/chief_medical_officer.dm
+++ b/code/modules/jobs/job_types/chief_medical_officer.dm
@@ -65,12 +65,12 @@
backpack_contents = list(
/obj/item/melee/baton/telescopic/silver = 1,
)
- belt = /obj/item/modular_computer/pda/heads/cmo
+ belt = /obj/item/modular_computer/pda/crew/heads/cmo
ears = /obj/item/radio/headset/heads/cmo
shoes = /obj/item/clothing/shoes/sneakers/white
l_pocket = /obj/item/laser_pointer/blue
r_pocket = /obj/item/pinpointer/crew
- l_hand = /obj/item/storage/medkit/surgery
+ l_hand = /obj/item/storage/medkit/surgery/cmo
backpack = /obj/item/storage/backpack/chief_medic
satchel = /obj/item/storage/backpack/satchel/chief_medic
diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm
index a2a55ed1bb21..fc6dea563e06 100644
--- a/code/modules/jobs/job_types/clown.dm
+++ b/code/modules/jobs/job_types/clown.dm
@@ -61,7 +61,7 @@
/obj/item/instrument/bikehorn = 1,
/obj/item/storage/box/balloons = 1,
)
- belt = /obj/item/modular_computer/pda/clown
+ belt = /obj/item/modular_computer/pda/crew/clown
ears = /obj/item/radio/headset/headset_srv
shoes = /obj/item/clothing/shoes/clown_shoes
mask = /obj/item/clothing/mask/gas/clown_hat
diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm
index ce10bef7082c..b3cfebcc4d18 100644
--- a/code/modules/jobs/job_types/cook.dm
+++ b/code/modules/jobs/job_types/cook.dm
@@ -75,7 +75,7 @@
/obj/item/choice_beacon/ingredient = 1,
/obj/item/sharpener = 1,
)
- belt = /obj/item/modular_computer/pda/cook
+ belt = /obj/item/modular_computer/pda/crew/cook
ears = /obj/item/radio/headset/headset_srv
head = /obj/item/clothing/head/utility/chefhat
mask = /obj/item/clothing/mask/fakemoustache/italian
diff --git a/code/modules/jobs/job_types/coroner.dm b/code/modules/jobs/job_types/coroner.dm
index b8f629f62cdc..7b46e2a8faf6 100644
--- a/code/modules/jobs/job_types/coroner.dm
+++ b/code/modules/jobs/job_types/coroner.dm
@@ -57,7 +57,7 @@
/obj/item/storage/medkit/coroner = 1,
)
- belt = /obj/item/modular_computer/pda/coroner
+ belt = /obj/item/modular_computer/pda/crew/coroner
ears = /obj/item/radio/headset/headset_srvmed
gloves = /obj/item/clothing/gloves/latex/coroner
head = /obj/item/clothing/head/utility/surgerycap/black
diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm
index 3717b4383c0d..e2bb4e4f986e 100644
--- a/code/modules/jobs/job_types/curator.dm
+++ b/code/modules/jobs/job_types/curator.dm
@@ -46,7 +46,7 @@
/obj/item/barcodescanner = 1,
/obj/item/choice_beacon/hero = 1,
)
- belt = /obj/item/modular_computer/pda/curator
+ belt = /obj/item/modular_computer/pda/crew/curator
ears = /obj/item/radio/headset/headset_srvent
shoes = /obj/item/clothing/shoes/laceup
l_pocket = /obj/item/laser_pointer/green
diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm
index 16f140180359..1538090c3f2c 100644
--- a/code/modules/jobs/job_types/detective.dm
+++ b/code/modules/jobs/job_types/detective.dm
@@ -60,7 +60,7 @@
/obj/item/melee/baton = 1,
/obj/item/storage/box/evidence = 1,
)
- belt = /obj/item/modular_computer/pda/detective
+ belt = /obj/item/modular_computer/pda/crew/detective
ears = /obj/item/radio/headset/headset_sec/alt
gloves = /obj/item/clothing/gloves/color/black
head = /obj/item/clothing/head/fedora/det_hat
diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm
index 7d0c610a035c..23181259e0c8 100644
--- a/code/modules/jobs/job_types/geneticist.dm
+++ b/code/modules/jobs/job_types/geneticist.dm
@@ -40,7 +40,7 @@
uniform = /obj/item/clothing/under/rank/rnd/geneticist
suit = /obj/item/clothing/suit/toggle/labcoat/genetics
suit_store = /obj/item/flashlight/pen
- belt = /obj/item/modular_computer/pda/geneticist
+ belt = /obj/item/modular_computer/pda/crew/geneticist
ears = /obj/item/radio/headset/headset_sci
shoes = /obj/item/clothing/shoes/sneakers/white
l_pocket = /obj/item/sequence_scanner
diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm
index 58b8629000c3..9d4bb06ce7c0 100644
--- a/code/modules/jobs/job_types/head_of_personnel.dm
+++ b/code/modules/jobs/job_types/head_of_personnel.dm
@@ -100,7 +100,7 @@
backpack_contents = list(
/obj/item/melee/baton/telescopic/silver = 1,
)
- belt = /obj/item/modular_computer/pda/heads/hop
+ belt = /obj/item/modular_computer/pda/crew/heads/hop
ears = /obj/item/radio/headset/heads/hop
head = /obj/item/clothing/head/hats/hopcap
shoes = /obj/item/clothing/shoes/laceup
diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm
index 15aea875585c..1900e154d41b 100644
--- a/code/modules/jobs/job_types/head_of_security.dm
+++ b/code/modules/jobs/job_types/head_of_security.dm
@@ -65,7 +65,7 @@
/obj/item/evidencebag = 1,
/obj/item/melee/baton/security/loaded/hos = 1,
)
- belt = /obj/item/modular_computer/pda/heads/hos
+ belt = /obj/item/modular_computer/pda/crew/heads/hos
ears = /obj/item/radio/headset/heads/hos/alt
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
gloves = /obj/item/clothing/gloves/color/black/security
diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm
index 14f775301984..4483a4e2387b 100644
--- a/code/modules/jobs/job_types/janitor.dm
+++ b/code/modules/jobs/job_types/janitor.dm
@@ -38,7 +38,7 @@
id_trim = /datum/id_trim/job/janitor
uniform = /obj/item/clothing/under/rank/civilian/janitor
- belt = /obj/item/modular_computer/pda/janitor
+ belt = /obj/item/modular_computer/pda/crew/janitor
ears = /obj/item/radio/headset/headset_srv
skillchips = list(/obj/item/skillchip/job/janitor, /obj/item/skillchip/disposals)
backpack_contents = list(/obj/item/access_key)
diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm
index 93291e2e2e9a..3562fadeda8b 100644
--- a/code/modules/jobs/job_types/lawyer.dm
+++ b/code/modules/jobs/job_types/lawyer.dm
@@ -36,7 +36,7 @@
id_trim = /datum/id_trim/job/lawyer
uniform = /obj/item/clothing/under/rank/civilian/lawyer/bluesuit
suit = /obj/item/clothing/suit/toggle/lawyer
- belt = /obj/item/modular_computer/pda/lawyer
+ belt = /obj/item/modular_computer/pda/crew/lawyer
ears = /obj/item/radio/headset/headset_srvsec
shoes = /obj/item/clothing/shoes/laceup
neck = /obj/item/clothing/neck/tie/red/tied
diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm
index 35b7cdd00310..385bd00649ee 100644
--- a/code/modules/jobs/job_types/medical_doctor.dm
+++ b/code/modules/jobs/job_types/medical_doctor.dm
@@ -48,7 +48,7 @@
uniform = /obj/item/clothing/under/rank/medical/doctor
suit = /obj/item/clothing/suit/toggle/labcoat
suit_store = /obj/item/flashlight/pen
- belt = /obj/item/modular_computer/pda/medical
+ belt = /obj/item/modular_computer/pda/crew/medical
ears = /obj/item/radio/headset/headset_med
shoes = /obj/item/clothing/shoes/sneakers/white
l_hand = /obj/item/storage/medkit/surgery
diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm
index 06df427e1701..a99e6423e673 100644
--- a/code/modules/jobs/job_types/mime.dm
+++ b/code/modules/jobs/job_types/mime.dm
@@ -53,7 +53,7 @@
/obj/item/reagent_containers/cup/glass/bottle/bottleofnothing = 1,
/obj/item/stamp/mime = 1,
)
- belt = /obj/item/modular_computer/pda/mime
+ belt = /obj/item/modular_computer/pda/crew/mime
ears = /obj/item/radio/headset/headset_srv
gloves = /obj/item/clothing/gloves/color/white
head = /obj/item/clothing/head/beret/frenchberet
diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm
index ee573d6d956a..df7948e2fba4 100644
--- a/code/modules/jobs/job_types/paramedic.dm
+++ b/code/modules/jobs/job_types/paramedic.dm
@@ -57,7 +57,7 @@
head = /obj/item/clothing/head/soft/paramedic
gloves = /obj/item/clothing/gloves/latex/nitrile
shoes = /obj/item/clothing/shoes/workboots/black
- l_pocket = /obj/item/modular_computer/pda/medical/paramedic
+ l_pocket = /obj/item/modular_computer/pda/crew/medical/paramedic
r_pocket = /obj/item/storage/box/bandages
backpack = /obj/item/storage/backpack/medic
diff --git a/code/modules/jobs/job_types/psychologist.dm b/code/modules/jobs/job_types/psychologist.dm
index c770fd23e51d..5ada56db29af 100644
--- a/code/modules/jobs/job_types/psychologist.dm
+++ b/code/modules/jobs/job_types/psychologist.dm
@@ -48,7 +48,7 @@
/obj/item/storage/pill_bottle/paxpsych,
/obj/item/storage/pill_bottle/psicodine,
)
- belt = /obj/item/modular_computer/pda/psychologist
+ belt = /obj/item/modular_computer/pda/crew/psychologist
ears = /obj/item/radio/headset/headset_srvmed
shoes = /obj/item/clothing/shoes/laceup
l_hand = /obj/item/clipboard
diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm
index dd7f2185dea7..a74236077eb4 100644
--- a/code/modules/jobs/job_types/quartermaster.dm
+++ b/code/modules/jobs/job_types/quartermaster.dm
@@ -47,7 +47,7 @@
id_trim = /datum/id_trim/job/quartermaster
id = /obj/item/card/id/advanced/silver
uniform = /obj/item/clothing/under/rank/cargo/qm
- belt = /obj/item/modular_computer/pda/heads/quartermaster
+ belt = /obj/item/modular_computer/pda/crew/heads/quartermaster
suit = /obj/item/clothing/suit/jacket/quartermaster
ears = /obj/item/radio/headset/heads/qm
glasses = /obj/item/clothing/glasses/sunglasses
diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm
index 88b93b6a7ace..5b6f0f940eeb 100644
--- a/code/modules/jobs/job_types/research_director.dm
+++ b/code/modules/jobs/job_types/research_director.dm
@@ -64,7 +64,7 @@
backpack_contents = list(
/obj/item/melee/baton/telescopic/silver = 1,
)
- belt = /obj/item/modular_computer/pda/heads/rd
+ belt = /obj/item/modular_computer/pda/crew/heads/rd
head = /obj/item/clothing/head/beret/science/rd
ears = /obj/item/radio/headset/heads/rd
shoes = /obj/item/clothing/shoes/jackboots
diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm
index dbf61a3424d3..65ef4da267d0 100644
--- a/code/modules/jobs/job_types/roboticist.dm
+++ b/code/modules/jobs/job_types/roboticist.dm
@@ -26,7 +26,7 @@
/obj/item/storage/box/flashes = 20,
/obj/item/stack/sheet/iron/twenty = 15,
/obj/item/modular_computer/laptop = 5,
- /obj/item/mmi/posibrain/sphere = 5,
+ /obj/item/brain_processor/positronic/sphere = 5,
)
family_heirlooms = list(/obj/item/toy/plush/pkplush)
@@ -48,7 +48,7 @@
suit = /obj/item/clothing/suit/toggle/labcoat/roboticist
belt = /obj/item/storage/belt/utility/full
ears = /obj/item/radio/headset/headset_sci
- l_pocket = /obj/item/modular_computer/pda/roboticist
+ l_pocket = /obj/item/modular_computer/pda/crew/roboticist
backpack = /obj/item/storage/backpack/science
satchel = /obj/item/storage/backpack/satchel/science
diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm
index 0cad528c990a..5df8e41f35c3 100644
--- a/code/modules/jobs/job_types/scientist.dm
+++ b/code/modules/jobs/job_types/scientist.dm
@@ -44,7 +44,7 @@
id_trim = /datum/id_trim/job/scientist
uniform = /obj/item/clothing/under/rank/rnd/scientist
suit = /obj/item/clothing/suit/toggle/labcoat/science
- belt = /obj/item/modular_computer/pda/science
+ belt = /obj/item/modular_computer/pda/crew/science
ears = /obj/item/radio/headset/headset_sci
shoes = /obj/item/clothing/shoes/sneakers/white
diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm
index 9b7574e52d96..08299a2b3847 100644
--- a/code/modules/jobs/job_types/security_officer.dm
+++ b/code/modules/jobs/job_types/security_officer.dm
@@ -230,7 +230,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution)
backpack_contents = list(
/obj/item/evidencebag = 1,
)
- belt = /obj/item/modular_computer/pda/security
+ belt = /obj/item/modular_computer/pda/crew/security
ears = /obj/item/radio/headset/headset_sec/alt
gloves = /obj/item/clothing/gloves/color/black/security
head = /obj/item/clothing/head/helmet/sec
diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm
index 53481815f7cd..0433bdc64bc7 100644
--- a/code/modules/jobs/job_types/shaft_miner.dm
+++ b/code/modules/jobs/job_types/shaft_miner.dm
@@ -43,7 +43,7 @@
/obj/item/stack/candela_beacon/thirty = 1,
/obj/item/t_scanner/adv_mining_scanner/lesser = 1,
)
- belt = /obj/item/modular_computer/pda/shaftminer
+ belt = /obj/item/modular_computer/pda/crew/shaftminer
ears = /obj/item/radio/headset/headset_cargo/mining
gloves = /obj/item/clothing/gloves/color/black
shoes = /obj/item/clothing/shoes/workboots/mining
@@ -96,7 +96,7 @@
/obj/item/t_scanner/adv_mining_scanner/lesser = 1,
)
box = /obj/item/storage/box/survival/mining/bonus
- l_pocket = /obj/item/modular_computer/pda/shaftminer
+ l_pocket = /obj/item/modular_computer/pda/crew/shaftminer
r_pocket = /obj/item/extinguisher/mini
belt = /obj/item/storage/belt/mining/healing
pda_slot = ITEM_SLOT_LPOCKET
diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm
index a6b05ae2d8a5..efed08672ec8 100644
--- a/code/modules/jobs/job_types/station_engineer.dm
+++ b/code/modules/jobs/job_types/station_engineer.dm
@@ -57,7 +57,7 @@
ears = /obj/item/radio/headset/headset_eng
head = /obj/item/clothing/head/utility/hardhat/welding/up
shoes = /obj/item/clothing/shoes/workboots
- l_pocket = /obj/item/modular_computer/pda/engineering
+ l_pocket = /obj/item/modular_computer/pda/crew/engineering
r_pocket = /obj/item/t_scanner
backpack = /obj/item/storage/backpack/industrial
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 160b7af6b5b6..42f4949258c3 100644
--- a/code/modules/jobs/job_types/station_trait/human_ai.dm
+++ b/code/modules/jobs/job_types/station_trait/human_ai.dm
@@ -28,7 +28,7 @@
)
family_heirlooms = list(
- /obj/item/mmi/posibrain/display,
+ /obj/item/brain_processor/positronic/display,
)
mail_goodies = list(
diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm
index 16b403af3a7c..1bf3e90de45d 100644
--- a/code/modules/jobs/job_types/warden.dm
+++ b/code/modules/jobs/job_types/warden.dm
@@ -58,7 +58,7 @@
uniform = /obj/item/clothing/under/rank/security/warden
suit = /obj/item/clothing/suit/armor/vest/warden/alt
suit_store = /obj/item/gun/energy/disabler
- belt = /obj/item/modular_computer/pda/warden
+ belt = /obj/item/modular_computer/pda/crew/warden
ears = /obj/item/radio/headset/headset_sec/alt
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
gloves = /obj/item/clothing/gloves/color/black/security
diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm
index b9b1e2fc029c..78df639247d1 100644
--- a/code/modules/library/lib_codex_gigas.dm
+++ b/code/modules/library/lib_codex_gigas.dm
@@ -2,6 +2,7 @@
name = "\improper Codex Gigas"
desc = "A book documenting the nature of devils."
icon_state ="demonomicon"
+ inhand_icon_state = "demonomicon"
lefthand_file = 'icons/mob/inhands/items/books_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/books_righthand.dmi'
throw_speed = 1
diff --git a/code/modules/lighting/light_middleman.dm b/code/modules/lighting/light_middleman.dm
index 79f4920a5a1c..1d0f7436ab31 100644
--- a/code/modules/lighting/light_middleman.dm
+++ b/code/modules/lighting/light_middleman.dm
@@ -80,7 +80,7 @@
if(!isnull(cone_intercept))
light_holder.vis_contents += cone_intercept
- old_holder = WEAKREF(light_holder)
+ holder_ref = WEAKREF(light_holder)
var/old_target = primary_intercept.render_target
// This will halt any animations we have ongoing so if you care about that you've gotta react to it properly
diff --git a/code/modules/lootpanel/_lootpanel.dm b/code/modules/lootpanel/_lootpanel.dm
index cc67696d6f22..22cf7e500913 100644
--- a/code/modules/lootpanel/_lootpanel.dm
+++ b/code/modules/lootpanel/_lootpanel.dm
@@ -56,7 +56,6 @@
var/list/data = list()
data["contents"] = get_contents()
- data["is_blind"] = !!user.is_blind()
data["searching"] = length(to_image)
return data
@@ -72,3 +71,21 @@
return grab(usr, params)
return FALSE
+
+/datum/lootpanel/ui_state(mob/user)
+ return GLOB.always_state
+
+/datum/lootpanel/ui_status(mob/user, datum/ui_state/state)
+ if(!(user in viewers(source_turf)) || HAS_TRAIT(src, TRAIT_MOVE_VENTCRAWLING))
+ return UI_CLOSE
+
+ if(!(astype(user, /mob/living)?.mobility_flags & (MOBILITY_USE|MOBILITY_PICKUP)))
+ return UI_UPDATE
+
+ if(astype(user, /mob/living/carbon/human)?.dna?.check_mutation(/datum/mutation/telekinesis))
+ return tkMaxRangeCheck(user, source_turf) ? UI_INTERACTIVE : UI_UPDATE // Range check here is just a formality with the viewers check above.
+
+ if(!source_turf.IsReachableBy(user, user.get_active_held_item()?.reach))
+ return (get_dist(user, source_turf) >= 3 && user.is_blind()) ? UI_CLOSE : UI_UPDATE
+
+ return UI_INTERACTIVE
diff --git a/code/modules/lootpanel/contents.dm b/code/modules/lootpanel/contents.dm
index 1fa72ae1372b..01d752b56443 100644
--- a/code/modules/lootpanel/contents.dm
+++ b/code/modules/lootpanel/contents.dm
@@ -13,15 +13,9 @@
reset_contents()
// Add source turf first
- var/datum/search_object/source = new(owner, source_turf)
- add_to_index(source)
-
- for(var/atom/thing as anything in source_turf.contents)
- // validate
- if(!istype(thing))
- stack_trace("Non-atom in the contents of [source_turf]!")
- continue
+ add_new_searchable(source_turf, FALSE)
+ for(var/atom/thing as anything in source_turf)
add_new_searchable(thing, FALSE)
queue_update()
diff --git a/code/modules/mafia/roles/roles.dm b/code/modules/mafia/roles/roles.dm
index a26c6f40d38c..ce55f66c431d 100644
--- a/code/modules/mafia/roles/roles.dm
+++ b/code/modules/mafia/roles/roles.dm
@@ -133,6 +133,7 @@
)
body.PossessByPlayer(player.key)
ADD_TRAIT(body, TRAIT_CORPSELOCKED, MAFIA_TRAIT)
+ ADD_TRAIT(body, TRAIT_NO_CANON, INNATE_TRAIT) // DARKPACK EDIT ADD
/**
* Tests kill immunities, if nothing prevents the kill, kills this role.
diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm
index 72acfba62567..12cdce3bcdfc 100644
--- a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm
+++ b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm
@@ -292,8 +292,7 @@
if(opened)
return
// The player is trying to dig themselves out of an early grave
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.change_next_special_move(CLICK_CD_BREAKOUT)
user.visible_message(
span_warning("[src]'s dirt begins to shift and rumble!"),
span_notice("You desperately begin to claw at the dirt around you, trying to force yourself upwards through the soil... (this will take about [DisplayTimeText(breakout_time)].)"),
diff --git a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm
index 224ab31f315e..38d44df226c3 100644
--- a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm
+++ b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm
@@ -84,6 +84,7 @@
/obj/item/organ/monster_core/regenerative_core = 3,
/obj/item/organ/monster_core/rush_gland = 3,
/obj/item/organ/tongue/carp = 3,
+ /obj/item/organ/fangs/carp = 3,
/obj/item/organ/alien/acid = 2,
/obj/item/organ/alien/resinspinner = 2,
/obj/item/organ/eyes/night_vision/goliath = 2,
diff --git a/code/modules/mapfluff/ruins/spaceruin_code/waystation.dm b/code/modules/mapfluff/ruins/spaceruin_code/waystation.dm
index d678b45df57c..414fc424dd56 100644
--- a/code/modules/mapfluff/ruins/spaceruin_code/waystation.dm
+++ b/code/modules/mapfluff/ruins/spaceruin_code/waystation.dm
@@ -47,7 +47,7 @@
id = /obj/item/card/id/advanced
id_trim = /datum/id_trim/away/waystation/cargo_technician
uniform = /obj/item/clothing/under/rank/cargo/tech
- belt = /obj/item/modular_computer/pda/cargo
+ belt = /obj/item/modular_computer/pda/crew/cargo
ears = /obj/item/radio/headset/headset_cargo
shoes = /obj/item/clothing/shoes/sneakers/black
@@ -56,7 +56,7 @@
id = /obj/item/card/id/advanced/silver
id_trim = /datum/id_trim/away/waystation/quartermaster
uniform = /obj/item/clothing/under/rank/cargo/qm
- belt = /obj/item/modular_computer/pda/heads/quartermaster
+ belt = /obj/item/modular_computer/pda/crew/heads/quartermaster
ears = /obj/item/radio/headset/headset_cargo
glasses = /obj/item/clothing/glasses/sunglasses
shoes = /obj/item/clothing/shoes/sneakers/brown
diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm
index 73797075bcfb..8e668bc32971 100644
--- a/code/modules/mapping/mapping_helpers.dm
+++ b/code/modules/mapping/mapping_helpers.dm
@@ -160,44 +160,25 @@
if(!airlock)
qdel(src)
return
- if(airlock.cyclelinkeddir)
- airlock.cyclelinkairlock()
- if(airlock.closeOtherId)
- airlock.update_other_id()
- if(airlock.abandoned)
- var/outcome = rand(1,100)
- switch(outcome)
- if(1 to 9)
- var/turf/here = get_turf(src)
- for(var/turf/closed/T in range(2, src))
- here.place_on_top(T.type)
- qdel(airlock)
- qdel(src)
- return
- here.place_on_top(/turf/closed/wall)
- qdel(airlock)
- qdel(src)
- return
- if(9 to 11)
- airlock.feedback = FALSE
- // These do not use airlock.bolt() because we want to pretend it was always locked. That means no sound effects.
- airlock.locked = TRUE
- if(12 to 15)
- airlock.locked = TRUE
- if(16 to 23)
- airlock.welded = TRUE
- if(24 to 30)
- airlock.set_panel_open(TRUE)
- if(airlock.cutAiWire)
- airlock.wires.cut(WIRE_AI)
- if(airlock.autoname)
- airlock.name = get_area_name(src, TRUE)
- airlock.update_appearance()
+ late_payload(airlock)
+ if(!QDELETED(airlock))
+ if(airlock.cyclelinkeddir)
+ airlock.cyclelinkairlock()
+ if(airlock.closeOtherId)
+ airlock.update_other_id()
+ if(airlock.cutAiWire)
+ airlock.wires.cut(WIRE_AI)
+ if(airlock.autoname)
+ airlock.name = get_area_name(src, TRUE)
+ airlock.update_appearance()
qdel(src)
/obj/effect/mapping_helpers/airlock/proc/payload(obj/machinery/door/airlock/payload)
return
+/obj/effect/mapping_helpers/airlock/proc/late_payload(obj/machinery/door/airlock/payload)
+ return
+
/obj/effect/mapping_helpers/airlock/cyclelink_helper
name = "airlock cyclelink helper"
icon_state = "airlock_cyclelink_helper"
@@ -248,15 +229,88 @@
. = ..()
airlock.delayed_unres_open = TRUE
+#define ABANDON_WALL "wall"
+#define ABANDON_FALSEWALL "falsewall"
+#define ABANDON_LOCKED_NOLIGHT "locked_no_lights"
+#define ABANDON_LOCKED "locked"
+#define ABANDON_WELDED "welded"
+#define ABANDON_PANEL_OPEN "panel_open"
+#define ABANDON_NONE "none"
+
/obj/effect/mapping_helpers/airlock/abandoned
name = "airlock abandoned helper"
icon_state = "airlock_abandoned"
+ var/list/weights = list(
+ ABANDON_WALL = 8,
+ ABANDON_FALSEWALL = 1,
+ ABANDON_LOCKED_NOLIGHT = 2,
+ ABANDON_LOCKED = 4,
+ ABANDON_WELDED = 8,
+ ABANDON_PANEL_OPEN = 8,
+ )
+
+/obj/effect/mapping_helpers/airlock/abandoned/Initialize(mapload)
+ . = ..()
+ modify_weights()
+ var/max_weight = values_sum(weights)
+ weights[ABANDON_NONE] = 100 - max_weight
-/obj/effect/mapping_helpers/airlock/abandoned/payload(obj/machinery/door/airlock/airlock)
- if(airlock.abandoned)
- log_mapping("[src] at [AREACOORD(src)] tried to make [airlock] abandoned but it's already abandoned!")
- else
- airlock.abandoned = TRUE
+/obj/effect/mapping_helpers/airlock/abandoned/proc/modify_weights()
+ return
+
+/obj/effect/mapping_helpers/airlock/abandoned/late_payload(obj/machinery/door/airlock/airlock)
+ switch(pick_weight(weights))
+ if(ABANDON_WALL)
+ var/turf/here = get_turf(src)
+ here.place_on_top(get_wall_type(airlock))
+ qdel(airlock)
+
+ if(ABANDON_FALSEWALL)
+ var/walltype = get_wall_type(airlock)
+ var/falsewalltype = /obj/structure/falsewall
+ for(var/obj/structure/falsewall/false_wall as anything in typesof(/obj/structure/falsewall))
+ if(false_wall::walltype == walltype)
+ falsewalltype = false_wall
+ break
+
+ var/turf/here = get_turf(src)
+ new falsewalltype(here)
+ qdel(airlock)
+
+ if(ABANDON_LOCKED_NOLIGHT)
+ airlock.feedback = FALSE
+ // These do not use airlock.bolt() because we want to pretend it was always locked. That means no sound effects.
+ airlock.locked = TRUE
+
+ if(ABANDON_LOCKED)
+ airlock.locked = TRUE
+
+ if(ABANDON_WELDED)
+ airlock.welded = TRUE
+
+ if(ABANDON_PANEL_OPEN)
+ airlock.set_panel_open(TRUE)
+
+/obj/effect/mapping_helpers/airlock/abandoned/proc/get_wall_type(obj/machinery/door/airlock/airlock)
+ for(var/turf/closed/wall in range(2, airlock)) // uses range to prioritize closest
+ return wall.type
+
+ return /turf/closed/wall
+
+/obj/effect/mapping_helpers/airlock/abandoned/nowall
+ name = "airlock abandoned helper (no wall)"
+
+/obj/effect/mapping_helpers/airlock/abandoned/nowall/modify_weights()
+ weights[ABANDON_WALL] = 0
+ weights[ABANDON_FALSEWALL] = 0
+
+#undef ABANDON_WALL
+#undef ABANDON_FALSEWALL
+#undef ABANDON_LOCKED_NOLIGHT
+#undef ABANDON_LOCKED
+#undef ABANDON_WELDED
+#undef ABANDON_PANEL_OPEN
+#undef ABANDON_NONE
/obj/effect/mapping_helpers/airlock/welded
name = "airlock welded helper"
@@ -1530,6 +1584,39 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_atoms_ontop)
icon_state = "impact1"
dent_type = WALL_DENT_HIT
+/obj/effect/mapping_helpers/sticker_placer
+ name = "sticker placer"
+ icon = /obj/item/sticker::icon
+ icon_state = /obj/item/sticker/smile::icon_state
+ /// Sticker type to spawn
+ var/sticker_type = /obj/item/sticker/smile
+ ///Will stick onto atoms of this type
+ var/target_type
+ ///Will stick onto atoms with this name
+ var/target_name
+
+/obj/effect/mapping_helpers/sticker_placer/Initialize(mapload)
+ var/turf/target_turf = get_turf(src)
+ for(var/atom/atom_on_turf as anything in target_turf.get_all_contents())
+ if(atom_on_turf == src)
+ continue
+ if(target_name && atom_on_turf.name != target_name)
+ continue
+ if(target_type && !istype(atom_on_turf, target_type))
+ continue
+ var/obj/item/sticker/sticker = new sticker_type(target_turf)
+ atom_on_turf.AddComponent( \
+ /datum/component/sticker, \
+ sticker, \
+ NORTH, \
+ pixel_x + pixel_w + (ICON_SIZE_X / 2), \
+ pixel_y + pixel_z + (ICON_SIZE_Y / 2), \
+ null, \
+ null, \
+ sticker.examine_text, \
+ )
+ return INITIALIZE_HINT_QDEL
+ return ..()
/***
* Used to prevent things from teleporting on (but not off) the turf through most means that do not call do_teleport() with the forced arg set to TRUE.
* The trait is removed if the turf is changed, so you should only keep it on small sections with indestructible turfs, ideally corners surrounded by
diff --git a/code/modules/mining/boulder_processing/boulder_types.dm b/code/modules/mining/boulder_processing/boulder_types.dm
index e5e93a74c7c8..6bb8188e1b90 100644
--- a/code/modules/mining/boulder_processing/boulder_types.dm
+++ b/code/modules/mining/boulder_processing/boulder_types.dm
@@ -7,7 +7,7 @@
desc = "This boulder is brimming with strange energy. Cracking it open could contain something unusual for science."
icon_state = "boulder_artifact"
/// This is the type of item that will be inside the boulder. Default is a strange object.
- var/artifact_type = /obj/item/relic/lavaland
+ var/artifact_type = /obj/item/assembly/relic/lavaland
/// References to the relic inside the boulder, if any.
var/obj/item/artifact_inside
/// Bonus materials to add to this boulder, in addition to existing materials created by the ore vent.
diff --git a/code/modules/mining/equipment/candela_network/candela_item_handler.dm b/code/modules/mining/equipment/candela_network/candela_item_handler.dm
index 49b2c77cbb22..9b710aba2e23 100644
--- a/code/modules/mining/equipment/candela_network/candela_item_handler.dm
+++ b/code/modules/mining/equipment/candela_network/candela_item_handler.dm
@@ -140,7 +140,7 @@
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))
+ 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
@@ -166,7 +166,7 @@
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))
+ 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
diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm
index bb9f860a258f..6ab00eb632fb 100644
--- a/code/modules/mining/lavaland/ash_flora.dm
+++ b/code/modules/mining/lavaland/ash_flora.dm
@@ -238,6 +238,128 @@
/obj/structure/flora/ash/chilly/get_potential_products()
return list(/obj/item/food/grown/icepepper = 1)
+/obj/structure/flora/ash/fonarstolbe
+ name = "fonarstolbe fruit"
+ desc = "A chemotrophic, insignificantly bioluminescent plant dubbed fonarstolbe by spinward scientists. They can survive for weeks in environments and presures lethal to most other plants, as long as they are well rooted.."
+ icon_state = "lamppostfruit1"
+ base_icon_state = "lamppostfruit"
+ light_range = 1.5
+ light_power = 2.1
+ harvested_name = "fonarstolbe"
+ harvested_desc = "Stem of a fonarstolbe. It should grow back up, sooner or later. And once it does, you can pluck its sweet and sour fruit."
+ harvest_amount_high = 3
+ harvest_message_low = "You pluck a single fonarstolbe fruit."
+ harvest_message_med = "You pluck a number of fonarstolbe fruits."
+ harvest_message_high = "You pluck quite a lot of fonarstolbe fruits."
+ harvest_time = 40
+ number_of_variants = 4
+
+/obj/structure/flora/ash/fonarstolbe/get_potential_products()
+ return list(/obj/item/food/grown/ash_flora/fonarstolbe = 1)
+
+/obj/structure/flora/ash/vahrezjia
+ name = "vahrezjia flowers"
+ desc = "Bright blue stalks emerging from purple flowery pods. Apparently they can drive animals aggresive. They definetly sped up huskies and bears shipped in here by Spinward colonizers going feral. Quite unlikely they were the direct reason, though."
+ icon_state = "flowerpod1"
+ base_icon_state = "flowerpod"
+ harvested_name = "vahrezjia pods"
+ harvested_desc = "A bunch of vahrezjia pods. Despite repeated attempts to burn or uproot them away, they somehow still spread around and perservere."
+ harvest_amount_high = 3
+ harvest_message_low = "You pluck a single vahrezjia stalk."
+ harvest_message_med = "You pluck a number of vahrezjia stalks."
+ harvest_message_high = "You pluck quite a lot of vahrezjia stalks."
+ harvest_time = 25
+ number_of_variants = 4
+
+/obj/structure/flora/ash/vahrezjia/get_potential_products()
+ return list(/obj/item/food/grown/ash_flora/vahrezjia = 1)
+
+/obj/structure/flora/ash/podsneyzka
+ name = "podsneyzka flower"
+ desc = "A bunch of flowering podsneyzkas. These flowers are known to taste quite like meat, and have quite similiar chemical composition to it. Better not to think about it, perhaps."
+ icon_state = "flower1"
+ base_icon_state = "flower"
+ harvested_name = "podsneyzka stems"
+ harvested_desc = "A bunch of podsneyzka stems. Most of the plants is actually underground, and their roots are extremely long, ever searching for decomposing corpses to sap off of."
+ harvest_amount_high = 5
+ harvest_message_low = "You menage to pluck a single bunch of podzneyzkas."
+ harvest_message_med = "You carefully pluck a whole bunch of podzneyzkas."
+ harvest_message_high = "You very carefully pluck quite a lot of podzneyzkas."
+ harvest_time = 30
+ number_of_variants = 4
+
+/obj/structure/flora/ash/podsneyzka/get_potential_products()
+ return list(/obj/item/food/grown/ash_flora/podsneyzka = 1)
+
+/obj/structure/flora/ash/inozhakust
+ name = "inozhakust"
+ desc = "A plant looking like roots growing into the sky, covered in mushy, wet, oily vines. They squelch and break apart when touched. You'll have to gather them as a paste."
+ icon_state = "shrub1"
+ base_icon_state = "shrub"
+ harvested_name = "inozhakust"
+ harvested_desc = "A plant looking like roots growing into the sky - inozhakust. Filters chemical compounds in both earth and dirt, and spits out disgusting vines which you should be able to harvest soon."
+ harvest_amount_high = 5
+ harvest_message_low = "You menage to scoop just a bit of inozhakust's vines into paste."
+ harvest_message_med = "You menage to scoop some inozhakust's vines into paste."
+ harvest_message_high = "You menage to scoop quite a lot of inozhakust's vines into paste."
+ harvest_time = 30
+ number_of_variants = 4
+
+/obj/structure/flora/ash/inozhakust/get_potential_products()
+ return list(/obj/item/food/grown/ash_flora/inozhakust = 1)
+
+/obj/structure/flora/ash/plasma_flower
+ name = "plasma flower"
+ desc = "A bunch of vines surrounding a clustered bunch of plasma flowers. Researches still are trying to wrap their heads around these ones."
+ icon_state = "plasma_flower1"
+ base_icon_state = "plasma_flower"
+ light_range = LIGHT_FIRE_BLOSSOM
+ light_power = LIGHT_FIRE_BLOSSOM
+ light_color = COLOR_BIOLUMINESCENCE_PURPLE
+ harvested_name = "fire blossom vines"
+ harvested_desc = "A few plasma flower vines, missing their flowers."
+ harvest_amount_high = 3
+ harvest_message_low = "You pluck a single, suitable flower."
+ harvest_message_med = "You pluck a number of flowers, leaving a few unsuitable ones."
+ harvest_message_high = "You pluck quite a lot of suitable flowers."
+ regrowth_time_low = 4 MINUTES
+ regrowth_time_high = 7 MINUTES
+ number_of_variants = 2
+
+/obj/structure/flora/ash/plasma_flower/get_potential_products()
+ return list(/obj/item/food/grown/ash_flora/plasma_flower = 1)
+
+/obj/structure/flora/ash/plasma_flower/after_harvest()
+ set_light_power(LIGHT_RANGE_FIRE_BLOSSOM_HARVESTED)
+ set_light_range(LIGHT_POWER_FIRE_BLOSSOM_HARVESTED)
+ update_light()
+ return ..()
+
+/obj/structure/flora/ash/plasma_flower/regrow()
+ set_light_power(initial(light_power))
+ set_light_range(initial(light_range))
+ update_light()
+ return ..()
+
+/obj/structure/flora/ash/drake_beet
+ name = "drake beet"
+ desc = "An mutated beet. It seems to have adapted to local ecosystems by vaguely mimicking the appearance of a drake. Unsure how that helps, but its probably still tasty."
+ icon_state = "drakebeet1"
+ base_icon_state = "drakebeet"
+ harvested_name = "young drake beet"
+ harvested_desc = "An mutated beet. These ones are yet to grow up. Brought here by spinwarders in order to make borstch then went wild and mutated like everything else."
+ harvest_amount_high = 4
+ harvest_message_low = "You pull a single suitable beet from the ground."
+ harvest_message_med = "You pull a number of suitable beets from the ground."
+ harvest_message_high = "You pull quite a lot of suitable beets from the ground."
+ regrowth_time_low = 3 MINUTES
+ regrowth_time_high = 6 MINUTES
+ harvest_time = 25
+ number_of_variants = 2
+
+/obj/structure/flora/ash/drake_beet/get_potential_products()
+ return list(/obj/item/food/grown/drake_beet = 1)
+
//SNACKS
/obj/item/food/grown/ash_flora
@@ -329,6 +451,54 @@
seed = /obj/item/seeds/lavaland/glowgrowth // Cannot be grown in hydroponics as it feeds off mineral air
wine_power = 50
+//SNACKS - icebox
+
+/obj/item/food/grown/ash_flora/fonarstolbe
+ name = "fonarstolbe fruit"
+ desc = "A fonarstolbe fruit. It's glowing blue, faintly."
+ icon_state = "fonarstolbe"
+ seed = /obj/item/seeds/lavaland/fonarstolbe
+ wine_power = 50
+ foodtypes = FRUIT
+
+/obj/item/food/grown/ash_flora/vahrezjia
+ name = "vahrezjia stalks"
+ desc = "Bunched together vahrezjia stalks. Suprisingly coarse in texture."
+ icon_state = "vahrezjia"
+ seed = /obj/item/seeds/lavaland/vahrezjia
+ wine_power = 50
+ foodtypes = FRUIT
+
+/obj/item/food/grown/ash_flora/podsneyzka
+ name = "podsneyzka bunch"
+ desc = "A bunch of spotted podsneyzka flowers, folded onto themselves. They smell bit like rotten meat."
+ icon_state = "podsneyzka"
+ seed = /obj/item/seeds/lavaland/podsneyzka
+ wine_power = 50
+ foodtypes = MEAT|VEGETABLES
+
+/obj/item/food/grown/ash_flora/inozhakust
+ name = "inozhakust mash"
+ desc = "The mashed up vines of an inozhakust scooped into whatever you had on hand."
+ icon_state = "inozhakust"
+ seed = /obj/item/seeds/lavaland/inozhakust
+ distill_reagent = /datum/reagent/consumable/ethanol/mouthwash
+ foodtypes = VEGETABLES|GROSS
+
+/obj/item/food/grown/ash_flora/plasma_flower
+ name = "plasma flower"
+ desc = "A bit of vine conected a crystalized plasma flower."
+ icon_state = "plasmaflower"
+ slot_flags = ITEM_SLOT_HEAD
+ seed = /obj/item/seeds/lavaland/plasma_flower
+ foodtypes = TOXIC
+ wine_power = 40
+
+/obj/item/food/grown/ash_flora/plasma_flower/Initialize(mapload)
+ . = ..()
+ // Fire flowers make fireproof raptors
+ AddElement(/datum/element/raptor_food, color_chances = string_list(list(/datum/raptor_color/blue = 5)))
+
// SEEDS
/obj/item/seeds/lavaland
@@ -467,6 +637,86 @@
reagents_add = list(/datum/reagent/luminescent_fluid/cyan = 0.06, /datum/reagent/consumable/nutriment = 0.01, /datum/reagent/silicon = 0.03)
seed_flags = parent_type::seed_flags | NO_PLANTING
+/// SEEDS - icebox
+
+/obj/item/seeds/lavaland/fonarstolbe
+ name = "fonarstolbe seed pack"
+ desc = "These seeds grow into fonarstolbe."
+ icon_state = "seed-fonarstolbe"
+ species = "fonarstolbe"
+ plantname = "Fonarstolbe"
+ lifespan = 40
+ production = 5
+ yield = 3
+ growthstages = 4
+ product = /obj/item/food/grown/ash_flora/fonarstolbe
+ genes = list(/datum/plant_gene/trait/tox_resistance, /datum/plant_gene/trait/glow/blue)
+ growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi'
+ reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.04, /datum/reagent/luminescent_fluid/cyan = 0.03, /datum/reagent/iron = 0.02, /datum/reagent/consumable/guidoferrun = 0.2)
+ graft_gene = /datum/plant_gene/trait/glow/blue
+
+/obj/item/seeds/lavaland/vahrezjia
+ name = "vahrezjia seed pack"
+ desc = "These seeds grow into vahrezjia."
+ icon_state = "seed-vahrezjia"
+ species = "vahrezjia"
+ plantname = "Vahrezjia"
+ growthstages = 3
+ product = /obj/item/food/grown/ash_flora/vahrezjia
+ genes = list(/datum/plant_gene/trait/tox_resistance, /datum/plant_gene/trait/repeated_harvest)
+ growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi'
+ reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.02, /datum/reagent/consumable/nutriment = 0.02, /datum/reagent/toxin/berserker = 0.06, /datum/reagent/consumable/nutriment/fat/oil = 0.03)
+
+/obj/item/seeds/lavaland/podsneyzka
+ name = "podsneyzka seed pack"
+ desc = "These seeds grow into podsneyzkas."
+ icon_state = "seed-podsneyzka"
+ species = "podsneyzka"
+ plantname = "Podsneyzka"
+ lifespan = 30
+ endurance = 15
+ production = 4
+ yield = 5
+ growthstages = 3
+ product = /obj/item/food/grown/ash_flora/podsneyzka
+ genes = list(/datum/plant_gene/trait/tox_resistance, /datum/plant_gene/trait/chem_cooling)
+ growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi'
+ reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.03, /datum/reagent/consumable/nutriment = 0.03, /datum/reagent/cryostylane = 0.02, /datum/reagent/consumable/liquidgibs = 0.02)
+ graft_gene = /datum/plant_gene/trait/chem_cooling
+
+/obj/item/seeds/lavaland/inozhakust
+ name = "inozhakust seed pack"
+ desc = "These seeds grow into a inozhakust."
+ icon_state = "seed-inozhakust"
+ species = "inozhakust"
+ plantname = "Inozhakust"
+ lifespan = 40
+ endurance = 30
+ yield = 3
+ growthstages = 5
+ product = /obj/item/food/grown/ash_flora/inozhakust
+ genes = list(/datum/plant_gene/trait/plant_type/toxin_adaptation, /datum/plant_gene/trait/repeated_harvest)
+ growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi'
+ reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.01, /datum/reagent/consumable/nutriment = 0.09, /datum/reagent/consumable/mintextract = 0.03, /datum/reagent/impurity = 0.02)
+ graft_gene = /datum/plant_gene/trait/plant_type/toxin_adaptation
+
+/obj/item/seeds/lavaland/plasma_flower
+ name = "plasma flower seed pack"
+ desc = "These seeds grow into plasma flowers."
+ icon_state = "seed-plasmaflower"
+ species = "plasmaflower"
+ plantname = "Plasma flower"
+ lifespan = 40
+ endurance = 15
+ production = 5
+ yield = 3
+ potency = 20
+ growthstages = 3
+ product = /obj/item/food/grown/ash_flora/plasma_flower
+ genes = list(/datum/plant_gene/trait/plant_type/toxin_adaptation, /datum/plant_gene/trait/glow/purple)
+ growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi'
+ reagents_add = list(/datum/reagent/consumable/nutriment = 0.02, /datum/reagent/plasma_oxide = 0.01, /datum/reagent/stable_plasma = 0.02)
+
//CRAFTING
/datum/crafting_recipe/mushroom_bowl
diff --git a/code/modules/mining/lavaland/mining_loot/berserker.dm b/code/modules/mining/lavaland/mining_loot/berserker.dm
index 78a622d6bd5a..9b3afeceb4ee 100644
--- a/code/modules/mining/lavaland/mining_loot/berserker.dm
+++ b/code/modules/mining/lavaland/mining_loot/berserker.dm
@@ -114,7 +114,7 @@
to_chat(user, span_cult("You enter berserk mode."))
playsound(user, 'sound/effects/magic/staff_healing.ogg', 50)
user.add_movespeed_modifier(/datum/movespeed_modifier/berserk)
- user.physiology.brute_mod *= 0.5
+ MODIFY_PHYSIOLOGY(user, BRUTE, 0.5)
user.next_move_modifier *= BERSERK_ATTACK_SPEED_MODIFIER
user.add_atom_colour(COLOR_BUBBLEGUM_RED, TEMPORARY_COLOUR_PRIORITY)
user.add_traits(list(TRAIT_NOGUNS, TRAIT_TOSS_GUN_HARD), BERSERK_TRAIT)
@@ -135,7 +135,7 @@
to_chat(user, span_cult("You exit berserk mode."))
playsound(user, 'sound/effects/magic/summonitems_generic.ogg', 50)
user.remove_movespeed_modifier(/datum/movespeed_modifier/berserk)
- user.physiology.brute_mod *= 2
+ MODIFY_PHYSIOLOGY(user, BRUTE, 2)
user.next_move_modifier /= BERSERK_ATTACK_SPEED_MODIFIER
user.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_BUBBLEGUM_RED)
user.remove_traits(list(TRAIT_NOGUNS, TRAIT_TOSS_GUN_HARD), BERSERK_TRAIT)
diff --git a/code/modules/mining/lavaland/mining_loot/clothing.dm b/code/modules/mining/lavaland/mining_loot/clothing.dm
index 3031865762a4..8a849d6c7460 100644
--- a/code/modules/mining/lavaland/mining_loot/clothing.dm
+++ b/code/modules/mining/lavaland/mining_loot/clothing.dm
@@ -52,12 +52,12 @@
var/list/guardians = source.get_all_linked_holoparasites()
if (!length(guardians))
return
- if (source.health <= HEALTH_THRESHOLD_DEAD)
+ if (source.health <= source.dead_threshold)
for (var/mob/guardian in guardians)
if(guardian.loc == src)
continue
consume_guardian(guardian)
- else if (source.health > HEALTH_THRESHOLD_CRIT)
+ else if (source.health > source.crit_threshold)
for (var/mob/guardian in guardians)
if(guardian.loc != src)
continue
diff --git a/code/modules/mining/lavaland/mining_loot/consumables.dm b/code/modules/mining/lavaland/mining_loot/consumables.dm
index cef7cadf0883..1b44788e8e4f 100644
--- a/code/modules/mining/lavaland/mining_loot/consumables.dm
+++ b/code/modules/mining/lavaland/mining_loot/consumables.dm
@@ -202,7 +202,7 @@
else
to_chat(exposed_human, span_userdanger("A terrible pain travels down your back as wings burst out!"))
playsound(exposed_human.loc, 'sound/items/poster/poster_ripped.ogg', 50, TRUE, -1)
- exposed_human.apply_damage(20, def_zone = BODY_ZONE_CHEST, forced = TRUE, wound_bonus = CANT_WOUND)
+ exposed_human.apply_damage(20, def_zone = BODY_ZONE_CHEST, wound_bonus = CANT_WOUND)
exposed_human.emote("scream")
/datum/reagent/flightpotion/proc/get_wing_choice(mob/living/carbon/human/needs_wings, obj/item/bodypart/chest/chest)
diff --git a/code/modules/mining/lavaland/mining_loot/cursed_katana.dm b/code/modules/mining/lavaland/mining_loot/cursed_katana.dm
index 8abd7608f03a..a47214aa08d5 100644
--- a/code/modules/mining/lavaland/mining_loot/cursed_katana.dm
+++ b/code/modules/mining/lavaland/mining_loot/cursed_katana.dm
@@ -50,6 +50,7 @@
Even with the weapon destroyed, all the pieces containing the creature have coagulated back together to find a new host."
icon = 'icons/obj/mining_zones/artefacts.dmi'
icon_state = "cursed_katana"
+ inhand_icon_state = "cursed_katana"
icon_angle = -45
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index 31c95b6c94e5..2144ccca52bd 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -1,5 +1,8 @@
/// Fully randomizes everything in the character.
/datum/preferences/proc/randomise_appearance_prefs(randomize_flags = ALL)
+ var/tree_key = "character[default_slot]"
+ if(!(tree_key in savefile.get_entry()))
+ savefile.set_entry(tree_key, list())
for (var/datum/preference/preference as anything in get_preferences_in_priority_order())
if (!preference.included_in_randomization_flags(randomize_flags))
continue
@@ -72,10 +75,6 @@
available_hardcore_quirks -= picked_quirk
continue
- if((initial(picked_quirk.quirk_flags) & QUIRK_MOODLET_BASED) && CONFIG_GET(flag/disable_human_mood)) //check for moodlet quirks
- available_hardcore_quirks -= picked_quirk
- continue
-
all_quirks += initial(picked_quirk.name)
quirk_budget -= available_hardcore_quirks[picked_quirk]
. += available_hardcore_quirks[picked_quirk]
diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm
index 90cb798ca2d8..ec169fd50a5c 100644
--- a/code/modules/mob/dead/observer/orbit.dm
+++ b/code/modules/mob/dead/observer/orbit.dm
@@ -228,7 +228,7 @@ GLOBAL_DATUM_INIT(orbit_menu, /datum/orbit_menu, new)
return serialized
serialized["mind_job"] = job.title
- serialized["mind_job_icon"] = job.tgui_icon
+ serialized["mind_job_icon"] = job.tgui_icon || FA_ICON_QUESTION
var/datum/outfit/outfit = job.get_outfit()
if (isnull(outfit))
return serialized
diff --git a/code/modules/mob/eye/camera/camera.dm b/code/modules/mob/eye/camera/camera.dm
index 8df02a444b29..d478b20eb4e0 100644
--- a/code/modules/mob/eye/camera/camera.dm
+++ b/code/modules/mob/eye/camera/camera.dm
@@ -61,7 +61,6 @@
if(use_visibility)
update_visibility()
- update_parallax_contents()
/// Sends a visibility query to the cameranet.
/// Can be used as a signal handler.
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 858cd3ac4366..caf3bb7942ae 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -2,13 +2,13 @@
//as they handle all relevant stuff like adding it to the player's screen and updating their overlays.
///Returns the thing we're currently holding
-/mob/proc/get_active_held_item()
+/mob/proc/get_active_held_item() as /obj/item
return get_item_for_held_index(active_hand_index)
//Finds the opposite limb for the active one (eg: upper left arm will find the item in upper right arm)
//So we're treating each "pair" of limbs as a team, so "both" refers to them
-/mob/proc/get_inactive_held_item()
+/mob/proc/get_inactive_held_item() as /obj/item
return get_item_for_held_index(get_inactive_hand_index())
diff --git a/code/modules/mob/living/basic/alien/_alien.dm b/code/modules/mob/living/basic/alien/_alien.dm
index 3d1db5b6978d..041703b4636c 100644
--- a/code/modules/mob/living/basic/alien/_alien.dm
+++ b/code/modules/mob/living/basic/alien/_alien.dm
@@ -18,7 +18,7 @@
bubble_icon = "alien"
combat_mode = TRUE
faction = list(ROLE_ALIEN)
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
// Going for a dark purple here
lighting_cutoff_red = 30
diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm
index d5e04fa9db0f..4c2bd143eb2f 100644
--- a/code/modules/mob/living/basic/basic.dm
+++ b/code/modules/mob/living/basic/basic.dm
@@ -47,9 +47,6 @@
/// Variable maintained for compatibility with attack_animal procs until simple animals can be refactored away. Use element instead of setting manually.
var/environment_smash = ENVIRONMENT_SMASH_STRUCTURES
- /// 1 for full damage, 0 for none, -1 for 1:1 heal from that source.
- var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 1, OXY = 1, AGGRAVATED = 1) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE
-
///Verbs used for speaking e.g. "Says" or "Chitters". This can be elementized
var/list/speak_emote
@@ -125,7 +122,6 @@
if(LAZYLEN(speak_emote))
speak_emote = string_list(speak_emote)
- damage_coeff = string_assoc_list(damage_coeff)
///We need to wait for SSair to be initialized before we can check atmos/temp requirements.
if(PERFORM_ALL_TESTS(focus_only/atmos_and_temp_requirements) && mapload && !SSair.initialized)
@@ -158,7 +154,7 @@
/mob/living/basic/proc/make_stamina_slowable()
if (max_stamina == BASIC_MOB_STAMINA_MATCH_HEALTH)
max_stamina = maxHealth
- if (damage_coeff[STAMINA] <= 0 || max_stamina <= 0 || max_stamina_slowdown <= 0)
+ if (GET_PHYSIOLOGY(src, STAMINA) <= 0 || max_stamina <= 0 || max_stamina_slowdown <= 0)
return
AddElement(/datum/element/basic_stamina_slowdown, minium_stamina_threshold = max_stamina / 3, maximum_stamina = max_stamina, maximum_slowdown = max_stamina_slowdown)
@@ -170,7 +166,7 @@
/mob/living/basic/Life(seconds_per_tick = SSMOBS_DT)
. = ..()
if(staminaloss > 0)
- adjust_stamina_loss(-stamina_recovery * seconds_per_tick, forced = TRUE)
+ adjust_stamina_loss(-stamina_recovery * seconds_per_tick)
/mob/living/basic/get_default_say_verb()
return length(speak_emote) ? pick(speak_emote) : ..()
diff --git a/code/modules/mob/living/basic/basic_defense.dm b/code/modules/mob/living/basic/basic_defense.dm
index f4c4c117ac87..b96213b3b680 100644
--- a/code/modules/mob/living/basic/basic_defense.dm
+++ b/code/modules/mob/living/basic/basic_defense.dm
@@ -224,28 +224,23 @@
. = ..()
if(!. || QDELETED(src))
return FALSE
-
var/bomb_armor = getarmor(null, BOMB)
+ var/bomb_multi = clamp(1 - bomb_armor/200, 0, 1) // Scales linearly down to 50% damage at 100 armor
+ var/bloss
switch(severity)
if (EXPLODE_DEVASTATE)
- if(prob(bomb_armor))
- apply_damage(500, damagetype = BRUTE)
- else
+ if(bomb_armor < EXPLODE_GIB_THRESHOLD)
investigate_log("has been gibbed by an explosion.", INVESTIGATE_DEATHS)
gib(DROP_ALL_REMAINS)
-
+ else
+ apply_damage(500, damagetype = BRUTE)
if (EXPLODE_HEAVY)
- var/bloss = 60
- if(prob(bomb_armor))
- bloss = bloss / 1.5
- apply_damage(bloss, damagetype = BRUTE)
-
+ bloss = 60
if (EXPLODE_LIGHT)
- var/bloss = 30
- if(prob(bomb_armor))
- bloss = bloss / 1.5
- apply_damage(bloss, damagetype = BRUTE)
-
+ bloss = 30
+ if(bloss)
+ bloss *= bomb_multi
+ apply_damage(bloss, damagetype = BRUTE)
return TRUE
/mob/living/basic/blob_act(obj/structure/blob/attacking_blob)
diff --git a/code/modules/mob/living/basic/blob_minions/blob_mob.dm b/code/modules/mob/living/basic/blob_minions/blob_mob.dm
index b13e9f693451..ee3eea07df50 100644
--- a/code/modules/mob/living/basic/blob_minions/blob_mob.dm
+++ b/code/modules/mob/living/basic/blob_minions/blob_mob.dm
@@ -20,7 +20,7 @@
lighting_cutoff_blue = 30
initial_language_holder = /datum/language_holder/empty
can_buckle_to = FALSE
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
pull_force = MOVE_FORCE_NONE
/// Size of cloud produced from a dying spore
var/death_cloud_size = BLOBMOB_CLOUD_NONE
diff --git a/code/modules/mob/living/basic/blob_minions/blobbernaut.dm b/code/modules/mob/living/basic/blob_minions/blobbernaut.dm
index 27208c1ae79b..94733abb56bf 100644
--- a/code/modules/mob/living/basic/blob_minions/blobbernaut.dm
+++ b/code/modules/mob/living/basic/blob_minions/blobbernaut.dm
@@ -11,7 +11,7 @@
icon_dead = "blobbernaut_dead"
health = BLOBMOB_BLOBBERNAUT_HEALTH
maxHealth = BLOBMOB_BLOBBERNAUT_HEALTH
- damage_coeff = list(BRUTE = 0.5, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(BRUTE = 0.5, STAMINA = 0)
melee_damage_lower = BLOBMOB_BLOBBERNAUT_DMG_SOLO_LOWER
melee_damage_upper = BLOBMOB_BLOBBERNAUT_DMG_SOLO_UPPER
melee_attack_cooldown = CLICK_CD_MELEE
diff --git a/code/modules/mob/living/basic/boss/blood_drunk_miner/_blood_drunk_miner.dm b/code/modules/mob/living/basic/boss/blood_drunk_miner/_blood_drunk_miner.dm
index 682d24646b5d..7b160234ee81 100644
--- a/code/modules/mob/living/basic/boss/blood_drunk_miner/_blood_drunk_miner.dm
+++ b/code/modules/mob/living/basic/boss/blood_drunk_miner/_blood_drunk_miner.dm
@@ -116,7 +116,7 @@ Difficulty: Medium
used_item = miner_saw
return ..()
-/mob/living/basic/boss/blood_drunk_miner/adjust_health(amount, updating_health = TRUE, forced = FALSE)
+/mob/living/basic/boss/blood_drunk_miner/on_damage_loss_changed(amount, updating_health, forced, damage_type)
var/adjustment_amount = amount * 0.1
if(world.time + adjustment_amount > next_move)
changeNext_move(adjustment_amount) //attacking it interrupts it attacking, but only briefly
diff --git a/code/modules/mob/living/basic/boss/blood_drunk_miner/blood_drunk_subtypes.dm b/code/modules/mob/living/basic/boss/blood_drunk_miner/blood_drunk_subtypes.dm
index 414fafe2b49f..bcdce5d85688 100644
--- a/code/modules/mob/living/basic/boss/blood_drunk_miner/blood_drunk_subtypes.dm
+++ b/code/modules/mob/living/basic/boss/blood_drunk_miner/blood_drunk_subtypes.dm
@@ -6,7 +6,7 @@
/mob/living/basic/boss/blood_drunk_miner/guidance/attack_override(mob/living/source, atom/target, proximity, modifiers)
. = ..()
if(. & COMPONENT_HOSTILE_NO_ATTACK)
- adjust_health(-2 * rapid_melee_hits)
+ adjust_brute_loss(-2 * rapid_melee_hits)
/// Better at dash attacking
/mob/living/basic/boss/blood_drunk_miner/hunter
diff --git a/code/modules/mob/living/basic/boss/boss.dm b/code/modules/mob/living/basic/boss/boss.dm
index e292b31c9c8b..4ef077168b06 100644
--- a/code/modules/mob/living/basic/boss/boss.dm
+++ b/code/modules/mob/living/basic/boss/boss.dm
@@ -8,7 +8,7 @@
sentience_type = SENTIENCE_BOSS
mob_biotypes = MOB_ORGANIC|MOB_SPECIAL
faction = list(FACTION_MINING, FACTION_BOSS)
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, AGGRAVATED = 1, STAMINA = 0, OXY = 0) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE
+ physiology = list(TOX = 0, OXY = 0, STAMINA = 0)
obj_damage = 400
unsuitable_cold_damage = 0
unsuitable_heat_damage = 0
@@ -86,7 +86,7 @@
/// Determines if this mob is worth devouring
/mob/living/basic/boss/proc/should_devour(mob/living/victim)
- return victim.stat == DEAD || (victim.health <= HEALTH_THRESHOLD_DEAD && HAS_TRAIT(victim, TRAIT_NODEATH))
+ return victim.stat == DEAD || (victim.health <= victim.dead_threshold && HAS_TRAIT(victim, TRAIT_NODEATH))
/// Devours a target and restores health to the megafauna
/mob/living/basic/boss/proc/devour(mob/living/victim)
diff --git a/code/modules/mob/living/basic/boss/thing/thing.dm b/code/modules/mob/living/basic/boss/thing/thing.dm
index 2b137cbdb34a..50025a0d1398 100644
--- a/code/modules/mob/living/basic/boss/thing/thing.dm
+++ b/code/modules/mob/living/basic/boss/thing/thing.dm
@@ -85,14 +85,18 @@
icon_state = "p[phase]"
icon_living = icon_state
-/mob/living/basic/boss/thing/adjust_health(amount, updating_health = TRUE, forced = FALSE)
- if(phase_invulnerability_timer || phase == 3 || IS_UNCONSCIOUS_OR_CRIT(src) || amount <= 0)
+/mob/living/basic/boss/thing/on_damage_loss_changed(amount, updating_health, forced, damage_type)
+ if(phase == 3 || IS_UNCONSCIOUS_OR_CRIT(src) || amount <= 0)
return ..()
- var/potential_excess = bruteloss + amount - (maxHealth/3)*phase
- if(potential_excess > 0)
- amount -= potential_excess
+ var/old_update = updating_health
+ . = ..() //This call is necessary so we convert the other damage types to BRUTE and remove the need of using switch cases for each damage type
+ bruteloss = min(bruteloss, (maxHealth/3) * phase) //Caps the damage that the mob receives to the health loss required to progress to the next phase
+ if(old_update)
+ updatehealth()
+
+/mob/living/basic/boss/thing/updatehealth()
. = ..()
- if(bruteloss >= (maxHealth/3)*phase)
+ if(phase < 3 && !stat && bruteloss >= (maxHealth/3)*phase)
phase_health_depleted()
/mob/living/basic/boss/thing/proc/phase_health_depleted()
@@ -168,7 +172,7 @@
remove_traits(list(TRAIT_GODMODE, TRAIT_IMMOBILIZED), MEGAFAUNA_TRAIT)
balloon_alert_to_viewers("recovers!")
visible_message(span_danger("[src] recovers from the damage! Too slow!"))
- adjust_health(-(maxHealth/3) * 0.5) //half of a phase (which is a third of maxhealth)
+ adjust_brute_loss(-(maxHealth/3) * 0.5) //half of a phase (which is a third of maxhealth)
var/filter = get_filter(PHASEREGEN_FILTER)
if(!isnull(filter))
animate(filter)
diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm
index 938ea1f8fa3d..1bd7fb8fc25f 100644
--- a/code/modules/mob/living/basic/bots/_bots.dm
+++ b/code/modules/mob/living/basic/bots/_bots.dm
@@ -17,7 +17,7 @@ GLOBAL_LIST_INIT(command_strings, list(
basic_mob_flags = DEL_ON_DEATH
density = FALSE
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0)
+ physiology = list(TOX = 0, OXY = 0, STAMINA = 0)
habitable_atmos = null
hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_PATH_HUD = HUD_LIST_LIST)
@@ -814,7 +814,7 @@ GLOBAL_LIST_INIT(command_strings, list(
bot_reset(bypass_ai_reset = isAI(summoner))
var/turf/destination = turf_destination ? turf_destination : get_turf(summoner)
ai_controller?.set_blackboard_key(BB_BOT_SUMMON_TARGET, destination)
- var/list/access_to_grant = grant_all_access ? REGION_ACCESS_ALL_STATION : user_access + initial_access
+ var/list/access_to_grant = grant_all_access ? SSid_access.accesses_by_region[REGION_ALL_STATION] : user_access + initial_access
access_card.set_access(access_to_grant)
speak("Responding.", radio_channel)
update_bot_mode(new_mode = BOT_SUMMON)
diff --git a/code/modules/mob/living/basic/bots/bot_hud.dm b/code/modules/mob/living/basic/bots/bot_hud.dm
index 40a56177e47a..94ee59b6e0c4 100644
--- a/code/modules/mob/living/basic/bots/bot_hud.dm
+++ b/code/modules/mob/living/basic/bots/bot_hud.dm
@@ -45,7 +45,7 @@
var/atom/move_target = path[path.len]
- if(move_target != ai_controller.blackboard[BB_BEACON_TARGET])
+ if(move_target != get_turf(ai_controller.blackboard[BB_BEACON_TARGET]))
return
diff --git a/code/modules/mob/living/basic/bots/honkbots/honkbot.dm b/code/modules/mob/living/basic/bots/honkbots/honkbot.dm
index a96ee6309ddc..5c624ed0ac57 100644
--- a/code/modules/mob/living/basic/bots/honkbots/honkbot.dm
+++ b/code/modules/mob/living/basic/bots/honkbots/honkbot.dm
@@ -3,7 +3,7 @@
desc = "A little robot. It looks happy with its bike horn."
icon_state = "honkbot"
base_icon_state = "honkbot"
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0)
+ physiology = list(TOX = 0, OXY = 0, STAMINA = 0)
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5.8, /datum/material/cardboard = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2)
req_access = list(ACCESS_ROBOTICS, ACCESS_THEATRE, ACCESS_JANITOR)
radio_key = /obj/item/encryptionkey/headset_service
diff --git a/code/modules/mob/living/basic/bots/medbot/medbot.dm b/code/modules/mob/living/basic/bots/medbot/medbot.dm
index 355cd17cb10b..45837c5a3d3c 100644
--- a/code/modules/mob/living/basic/bots/medbot/medbot.dm
+++ b/code/modules/mob/living/basic/bots/medbot/medbot.dm
@@ -169,6 +169,13 @@
return INITIALIZE_HINT_LATELOAD
+/mob/living/basic/bot/medbot/Destroy()
+ if(!ispath(health_analyzer))
+ QDEL_NULL(health_analyzer)
+ if(!ispath(medkit_type))
+ QDEL_NULL(medkit_type)
+ return ..()
+
/mob/living/basic/bot/medbot/LateInitialize()
if(!CONFIG_GET(flag/no_default_techweb_link) && !linked_techweb)
CONNECT_TO_RND_SERVER_ROUNDSTART(linked_techweb, src)
diff --git a/code/modules/mob/living/basic/bots/mulebot/mulebot.dm b/code/modules/mob/living/basic/bots/mulebot/mulebot.dm
index 9367a81d6d54..5106b705f2db 100644
--- a/code/modules/mob/living/basic/bots/mulebot/mulebot.dm
+++ b/code/modules/mob/living/basic/bots/mulebot/mulebot.dm
@@ -11,7 +11,7 @@
health = 50
maxHealth = 50
- damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, STAMINA = 0, OXY = 0)
+ physiology = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, OXY = 0, STAMINA = 0)
density = TRUE
mob_size = MOB_SIZE_LARGE
move_resist = MOVE_FORCE_STRONG
diff --git a/code/modules/mob/living/basic/bots/secbot/secbot.dm b/code/modules/mob/living/basic/bots/secbot/secbot.dm
index e66e2fa206b0..cff267ca9ab0 100644
--- a/code/modules/mob/living/basic/bots/secbot/secbot.dm
+++ b/code/modules/mob/living/basic/bots/secbot/secbot.dm
@@ -11,7 +11,7 @@
anchored = FALSE
health = 25
maxHealth = 25
- damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, STAMINA = 0, OXY = 0)
+ physiology = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, OXY = 0, STAMINA = 0)
pass_flags = PASSMOB | PASSFLAPS
combat_mode = TRUE
can_buckle_to = FALSE
diff --git a/code/modules/mob/living/basic/clown/clown.dm b/code/modules/mob/living/basic/clown/clown.dm
index 3392d19b4e3d..5222c24bfe88 100644
--- a/code/modules/mob/living/basic/clown/clown.dm
+++ b/code/modules/mob/living/basic/clown/clown.dm
@@ -83,7 +83,7 @@
response_disarm_continuous = "gently scoops and pours aside"
response_disarm_simple = "gently scoop and pour aside"
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_SLIME
- damage_coeff = list(BRUTE = 0.25, BURN = 1, TOX = 1, STAMINA = 1, OXY = 1)
+ physiology = list(BRUTE = 0.25)
emotes = list(
BB_EMOTE_SAY = list("HONK!!", "Honk!", "Welcome to Clown Planet!"),
BB_EMOTE_HEAR = list("bubbles.", "oozes."),
@@ -388,7 +388,6 @@
melee_damage_lower = 10
melee_damage_upper = 15
obj_damage = 50
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 1, OXY = 1)
attack_verb_continuous = "slams"
attack_verb_simple = "slam"
///Tracks how many total foods we have eaten, used for calculating when we should gain max health.
diff --git a/code/modules/mob/living/basic/cult/constructs/_construct.dm b/code/modules/mob/living/basic/cult/constructs/_construct.dm
index 26e126e9c4c4..15c4ac30818f 100644
--- a/code/modules/mob/living/basic/cult/constructs/_construct.dm
+++ b/code/modules/mob/living/basic/cult/constructs/_construct.dm
@@ -9,7 +9,7 @@
minimum_survivable_temperature = 0
maximum_survivable_temperature = INFINITY
status_flags = CANPUSH
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0)
+ physiology = list(TOX = 0, OXY = 0, STAMINA = 0)
pressure_resistance = 100
speed = 0
unique_name = TRUE
diff --git a/code/modules/mob/living/basic/cult/shade.dm b/code/modules/mob/living/basic/cult/shade.dm
index 2547013945cd..467022a2c332 100644
--- a/code/modules/mob/living/basic/cult/shade.dm
+++ b/code/modules/mob/living/basic/cult/shade.dm
@@ -29,7 +29,7 @@
faction = list(FACTION_CULT)
basic_mob_flags = DEL_ON_DEATH
initial_language_holder = /datum/language_holder/construct
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
/// Theme controls color. THEME_CULT is red THEME_WIZARD is purple and THEME_HOLY is blue
var/theme = THEME_CULT
/// The different flavors of goop shades can drop, depending on theme.
diff --git a/code/modules/mob/living/basic/cytology/vatbeast.dm b/code/modules/mob/living/basic/cytology/vatbeast.dm
index bb6ffec1a270..b1c488eb1f1f 100644
--- a/code/modules/mob/living/basic/cytology/vatbeast.dm
+++ b/code/modules/mob/living/basic/cytology/vatbeast.dm
@@ -12,7 +12,7 @@
speak_emote = list("roars")
health = 250
maxHealth = 250
- damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 1, STAMINA = 1, OXY = 1)
+ physiology = list(BRUTE = 0.7, BURN = 0.7)
melee_damage_lower = 25
melee_damage_upper = 25
melee_attack_cooldown = CLICK_CD_MELEE
diff --git a/code/modules/mob/living/basic/damage_procs.dm b/code/modules/mob/living/basic/damage_procs.dm
new file mode 100644
index 000000000000..1cd8bbe662a1
--- /dev/null
+++ b/code/modules/mob/living/basic/damage_procs.dm
@@ -0,0 +1,22 @@
+/// basic mobs will transfer BURN / OXY / TOX damage into brute.
+/mob/living/basic/on_damage_loss(amount, updating_health, forced, damage_type, difference)
+ var/transfered_loss //In the case of transfered loss, return the delta of old bruteloss and new bruteloss instead
+ if(damage_type != BRUTE && damage_type != STAMINA)
+ transfered_loss = simple_transfer_to_brute_loss(amount)
+ . = ..()
+ return transfered_loss || .
+
+//Manage stamcrit for basic mobs
+/mob/living/basic/on_damage_loss_changed(amount, updating_health, forced, damage_type)
+ . = ..()
+
+ if (damage_type != STAMINA || amount < 0 || stat == DEAD || stamina_crit_threshold == BASIC_MOB_NO_STAMCRIT)
+ return
+
+ if (100 / (max_stamina / staminaloss) >= stamina_crit_threshold)
+ apply_status_effect(/datum/status_effect/incapacitating/stamcrit)
+
+//if the stamina recovery is different than 0, then we use that to gradually restore stamina rather than all in one go after a timer
+/mob/living/basic/timed_stamina_reset()
+ if (stamina_recovery == 0)
+ return ..()
diff --git a/code/modules/mob/living/basic/drone/_drone.dm b/code/modules/mob/living/basic/drone/_drone.dm
index 5ed711074e36..095e1d5e2dcb 100644
--- a/code/modules/mob/living/basic/drone/_drone.dm
+++ b/code/modules/mob/living/basic/drone/_drone.dm
@@ -37,7 +37,7 @@
bubble_icon = "machine"
initial_language_holder = /datum/language_holder/drone
mob_size = MOB_SIZE_SMALL
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0)
+ physiology = list(TOX = 0, OXY = 0, STAMINA = 0)
hud_possible = list(DIAG_STAT_HUD, DIAG_HUD, ANTAG_HUD)
unique_name = TRUE
faction = list(FACTION_NEUTRAL,FACTION_SILICON,FACTION_TURRET)
diff --git a/code/modules/mob/living/basic/drone/interaction.dm b/code/modules/mob/living/basic/drone/interaction.dm
index a8d926225a5c..6a72ae10dff3 100644
--- a/code/modules/mob/living/basic/drone/interaction.dm
+++ b/code/modules/mob/living/basic/drone/interaction.dm
@@ -113,11 +113,11 @@
update_drone_hack(FALSE)
return ITEM_INTERACT_SUCCESS
-/mob/living/basic/drone/getarmor(def_zone, type)
+/mob/living/basic/drone/get_worn_armor_value(obj/item/bodypart/def_zone, damage_type)
var/armorval = 0
if(head)
- armorval = head.get_armor_rating(type)
+ armorval = head.get_armor_rating(damage_type)
return (armorval * get_armor_effectiveness()) //armor is reduced for tiny fragile drones
/// Returns a multiplier for any head armor you wear as a drone.
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 62932a529025..a8bcb2c45904 100644
--- a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm
+++ b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm
@@ -33,7 +33,7 @@ GLOBAL_LIST_INIT(strippable_gorilla_items, create_strippable_list(list(
melee_attack_cooldown = CLICK_CD_MELEE
melee_damage_lower = 25
melee_damage_upper = 30
- damage_coeff = list(BRUTE = 1, BURN = 1.5, TOX = 1.5, STAMINA = 1, OXY = 1.5)
+ physiology = list(BURN = 1.5, OXY = 1.5, TOX = 1.5)
obj_damage = 40
attack_verb_continuous = "pummels"
attack_verb_simple = "pummel"
@@ -75,6 +75,8 @@ GLOBAL_LIST_INIT(strippable_gorilla_items, create_strippable_list(list(
AddComponent(/datum/component/basic_inhands, y_offset = -1)
AddElement(/datum/element/strippable, GLOB.strippable_gorilla_items)
+ RegisterSignal(src, COMSIG_MOB_EMOTED("ooga"), PROC_REF(check_kong_state))
+
ai_controller?.set_blackboard_key(BB_BASIC_FOODS, typecacheof(gorilla_food))
/mob/living/basic/gorilla/examine(mob/user)
@@ -137,6 +139,15 @@ GLOBAL_LIST_INIT(strippable_gorilla_items, create_strippable_list(list(
oogas = rand(2,6)
emote("ooga")
+/// Check how well we are roleplaying as King Kong
+/mob/living/basic/gorilla/proc/check_kong_state()
+ SIGNAL_HANDLER
+ if (!HAS_TRAIT(src, TRAIT_MOB_ELEVATED))
+ return
+ if (!isliving(pulling) || pulling.gender != FEMALE || grab_state < GRAB_AGGRESSIVE)
+ return
+ client?.give_award(/datum/award/achievement/misc/kong, src)
+
/// Gorillas are slower when carrying something
/datum/movespeed_modifier/gorilla_standing
blacklisted_movetypes = (FLYING|FLOATING)
diff --git a/code/modules/mob/living/basic/festivus_pole.dm b/code/modules/mob/living/basic/festivus_pole.dm
index 593f0e34fb7d..cab65d0885ac 100644
--- a/code/modules/mob/living/basic/festivus_pole.dm
+++ b/code/modules/mob/living/basic/festivus_pole.dm
@@ -40,7 +40,7 @@
death_message = "is hacked into pieces!"
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
ai_controller = /datum/ai_controller/basic_controller/festivus_pole
/mob/living/basic/festivus/Initialize(mapload)
diff --git a/code/modules/mob/living/basic/guardian/guardian.dm b/code/modules/mob/living/basic/guardian/guardian.dm
index 644a59dfb266..7c74cd7d7a4b 100644
--- a/code/modules/mob/living/basic/guardian/guardian.dm
+++ b/code/modules/mob/living/basic/guardian/guardian.dm
@@ -19,7 +19,7 @@
status_flags = CANPUSH
maxHealth = INFINITY // The spirit itself is invincible and passes damage to its host
health = INFINITY
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
unsuitable_atmos_damage = 0
unsuitable_cold_damage = 0
unsuitable_heat_damage = 0
@@ -252,6 +252,11 @@
RegisterSignal(to_who, COMSIG_LIVING_ON_WABBAJACKED, PROC_REF(on_summoner_wabbajacked))
RegisterSignal(to_who, COMSIG_LIVING_SHAPESHIFTED, PROC_REF(on_summoner_shapeshifted))
RegisterSignal(to_who, COMSIG_LIVING_UNSHAPESHIFTED, PROC_REF(on_summoner_unshapeshifted))
+ RegisterSignal(to_who, COMSIG_ATOM_STOPPING_TIME, PROC_REF(on_summoner_timestop))
+ RegisterSignal(to_who, SIGNAL_ADDTRAIT(TRAIT_TIME_STOP_IMMUNE), PROC_REF(on_summoner_timestop_immune_gained))
+ RegisterSignal(to_who, SIGNAL_REMOVETRAIT(TRAIT_TIME_STOP_IMMUNE), PROC_REF(on_summoner_timestop_immune_removed))
+ if (HAS_TRAIT(to_who, TRAIT_TIME_STOP_IMMUNE))
+ ADD_TRAIT(src, TRAIT_TIME_STOP_IMMUNE, REF(summoner))
recall(forced = TRUE)
leash_to(src, summoner)
if (to_who.stat == DEAD)
@@ -268,7 +273,16 @@
if (!isnull(summoner_turf))
forceMove(summoner_turf)
unleash()
- UnregisterSignal(summoner, list(COMSIG_QDELETING, COMSIG_LIVING_ON_WABBAJACKED, COMSIG_LIVING_SHAPESHIFTED, COMSIG_LIVING_UNSHAPESHIFTED))
+ UnregisterSignal(summoner, list(
+ COMSIG_QDELETING,
+ COMSIG_LIVING_ON_WABBAJACKED,
+ COMSIG_LIVING_SHAPESHIFTED,
+ COMSIG_LIVING_UNSHAPESHIFTED,
+ COMSIG_ATOM_STOPPING_TIME,
+ SIGNAL_ADDTRAIT(TRAIT_TIME_STOP_IMMUNE),
+ SIGNAL_REMOVETRAIT(TRAIT_TIME_STOP_IMMUNE),
+ ))
+ REMOVE_TRAIT(src, TRAIT_TIME_STOP_IMMUNE, REF(summoner))
if (different_person)
summoner.remove_ally(src)
remove_faction(summoner.get_faction())
@@ -341,6 +355,22 @@
set_summoner(old_summoner)
to_chat(src, span_holoparasite("Your summoner has shapeshifted back into their normal form!"))
+/// Signal proc for [COMSIG_ATOM_STOPPING_TIME] - when our summoner timestops, we should share their immunity.
+/mob/living/basic/guardian/proc/on_summoner_timestop(mob/living/source, datum/action/cooldown/spell/timestop/timestop, list/immune_atoms)
+ SIGNAL_HANDLER
+ if (timestop.owner_is_immune_to_self_timestop)
+ immune_atoms |= src
+
+/// Signal proc for [SIGNAL_ADDTRAIT(TRAIT_TIME_STOP_IMMUNE)] - when our summoner gains time stop immunity, we should too
+/mob/living/basic/guardian/proc/on_summoner_timestop_immune_gained(mob/living/source, ...)
+ SIGNAL_HANDLER
+ ADD_TRAIT(src, TRAIT_TIME_STOP_IMMUNE, REF(summoner))
+
+/// Signal proc for [SIGNAL_REMOVETRAIT(TRAIT_TIME_STOP_IMMUNE)] - when our summoner loses time stop immunity, we should too
+/mob/living/basic/guardian/proc/on_summoner_timestop_immune_removed(mob/living/source, ...)
+ SIGNAL_HANDLER
+ REMOVE_TRAIT(src, TRAIT_TIME_STOP_IMMUNE, REF(summoner))
+
/mob/living/basic/guardian/wabbajack(what_to_randomize, change_flags = WABBAJACK)
visible_message(span_warning("[src] resists the polymorph!")) // Ha, no
diff --git a/code/modules/mob/living/basic/guardian/guardian_types/assassin.dm b/code/modules/mob/living/basic/guardian/guardian_types/assassin.dm
index 377c3fec0b7a..54f74f283246 100644
--- a/code/modules/mob/living/basic/guardian/guardian_types/assassin.dm
+++ b/code/modules/mob/living/basic/guardian/guardian_types/assassin.dm
@@ -10,7 +10,6 @@
attack_sound = 'sound/items/weapons/bladeslice.ogg'
attack_vis_effect = ATTACK_EFFECT_SLASH
sharpness = SHARP_POINTY
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
playstyle_string = span_holoparasite("As an assassin type you do medium damage and have no damage resistance, but can enter stealth, massively increasing the damage of your next attack and causing it to ignore armor. Stealth is broken when you attack or take damage.")
creator_name = "Assassin"
creator_desc = "Does medium damage and takes full damage, but can enter stealth, causing its next attack to do massive damage and ignore armor. However, it becomes briefly unable to recall after attacking from stealth."
diff --git a/code/modules/mob/living/basic/guardian/guardian_types/charger.dm b/code/modules/mob/living/basic/guardian/guardian_types/charger.dm
index 2d21803c25fc..5dc7adfb8675 100644
--- a/code/modules/mob/living/basic/guardian/guardian_types/charger.dm
+++ b/code/modules/mob/living/basic/guardian/guardian_types/charger.dm
@@ -6,7 +6,7 @@
melee_damage_lower = 15
melee_damage_upper = 15
speed = -0.5
- damage_coeff = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, STAMINA = 0, OXY = 0.75)
+ physiology = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, OXY = 0.75, STAMINA = 0)
playstyle_string = span_holoparasite("As a charger type you do medium damage, have light damage resistance, move very fast, can be ridden, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding.")
creator_name = "Charger"
creator_desc = "Moves very fast, does medium damage on attack, can be ridden and can charge at targets, damaging the first target hit and forcing them to drop any items they are holding."
diff --git a/code/modules/mob/living/basic/guardian/guardian_types/dextrous.dm b/code/modules/mob/living/basic/guardian/guardian_types/dextrous.dm
index b3d37a28e9e5..76ee8349ea76 100644
--- a/code/modules/mob/living/basic/guardian/guardian_types/dextrous.dm
+++ b/code/modules/mob/living/basic/guardian/guardian_types/dextrous.dm
@@ -3,7 +3,7 @@
guardian_type = GUARDIAN_DEXTROUS
melee_damage_lower = 10
melee_damage_upper = 10
- damage_coeff = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, STAMINA = 0, OXY = 0.75)
+ physiology = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, OXY = 0.75, STAMINA = 0)
playstyle_string = span_holoparasite("As a dextrous type you can hold items, store an item within yourself, and have medium damage resistance, but do low damage on attacks. Recalling and leashing will force you to drop unstored items!")
creator_name = "Dextrous"
creator_desc = "Does low damage on attack, but is capable of holding items and storing a single item within it. It will drop items held in its hands when it recalls, but it will retain the stored item."
diff --git a/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm b/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm
index 49c15f62f402..d897125c51eb 100644
--- a/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm
+++ b/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm
@@ -3,7 +3,7 @@
guardian_type = GUARDIAN_EXPLOSIVE
melee_damage_lower = 15
melee_damage_upper = 15
- damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 0.6, STAMINA = 0, OXY = 0.6)
+ physiology = list(BRUTE = 0.6, BURN = 0.6, TOX = 0.6, OXY = 0.6, STAMINA = 0)
range = 13
playstyle_string = span_holoparasite("As an explosive type, you have moderate close combat abilities and are capable of converting nearby items and objects into disguised bombs via right-click.")
creator_name = "Explosive"
diff --git a/code/modules/mob/living/basic/guardian/guardian_types/gaseous.dm b/code/modules/mob/living/basic/guardian/guardian_types/gaseous.dm
index 2547b8509d2a..888a21916dd9 100644
--- a/code/modules/mob/living/basic/guardian/guardian_types/gaseous.dm
+++ b/code/modules/mob/living/basic/guardian/guardian_types/gaseous.dm
@@ -3,7 +3,7 @@
guardian_type = GUARDIAN_GASEOUS
melee_damage_lower = 10
melee_damage_upper = 10
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 0)
+ physiology = list(OXY = 0, STAMINA = 0)
range = 7
playstyle_string = span_holoparasite("As a gaseous type, you have only light damage resistance, but you can expel gas in an area. In addition, your punches cause sparks, and you make your summoner inflammable.")
creator_name = "Gaseous"
diff --git a/code/modules/mob/living/basic/guardian/guardian_types/gravitokinetic.dm b/code/modules/mob/living/basic/guardian/guardian_types/gravitokinetic.dm
index 1ce50a3e9fa2..5d7bf9290718 100644
--- a/code/modules/mob/living/basic/guardian/guardian_types/gravitokinetic.dm
+++ b/code/modules/mob/living/basic/guardian/guardian_types/gravitokinetic.dm
@@ -3,7 +3,7 @@
guardian_type = GUARDIAN_GRAVITOKINETIC
melee_damage_lower = 15
melee_damage_upper = 15
- damage_coeff = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, STAMINA = 0, OXY = 0.75)
+ physiology = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, OXY = 0.75, STAMINA = 0)
playstyle_string = span_holoparasite("As a gravitokinetic type, you can right-click to make the gravity on the ground stronger, and punching applies this effect to a target.")
creator_name = "Gravitokinetic"
creator_desc = "Attacks will apply crushing gravity to the target. Can target the ground as well to slow targets advancing on you, but you are not immune to your own such effects."
diff --git a/code/modules/mob/living/basic/guardian/guardian_types/lightning.dm b/code/modules/mob/living/basic/guardian/guardian_types/lightning.dm
index 3f8f492f1d0f..5ead863e83fe 100644
--- a/code/modules/mob/living/basic/guardian/guardian_types/lightning.dm
+++ b/code/modules/mob/living/basic/guardian/guardian_types/lightning.dm
@@ -7,7 +7,7 @@
attack_verb_simple = "shock"
melee_damage_type = BURN
attack_sound = 'sound/machines/defib/defib_zap.ogg'
- damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, STAMINA = 0, OXY = 0.7)
+ physiology = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, OXY = 0.7, STAMINA = 0)
range = 7
playstyle_string = span_holoparasite("As a lightning type, you will apply lightning chains to targets on attack and have a lightning chain to your summoner. Lightning chains will shock anyone near them.")
creator_name = "Lightning"
diff --git a/code/modules/mob/living/basic/guardian/guardian_types/protector.dm b/code/modules/mob/living/basic/guardian/guardian_types/protector.dm
index 229732a30f84..6bd208f9adf9 100644
--- a/code/modules/mob/living/basic/guardian/guardian_types/protector.dm
+++ b/code/modules/mob/living/basic/guardian/guardian_types/protector.dm
@@ -4,7 +4,7 @@
melee_damage_lower = 15
melee_damage_upper = 15
range = 5 // You want this to be low so you can drag them around
- damage_coeff = list(BRUTE = 0.4, BURN = 0.4, TOX = 0.4, STAMINA = 0, OXY = 0.4)
+ physiology = list(BRUTE = 0.4, BURN = 0.4, TOX = 0.4, OXY = 0.4, STAMINA = 0)
playstyle_string = span_holoparasite("As a protector type you cause your summoner to leash to you instead of you leashing to them and have two modes; Combat Mode, where you do and take medium damage, and Protection Mode, where you do and take almost no damage, but move slightly slower.")
creator_name = "Protector"
creator_desc = "Causes you to teleport to it when out of range, unlike other parasites. Has two modes; Combat, where it does and takes medium damage, and Protection, where it does and takes almost no damage but moves slightly slower."
@@ -71,9 +71,6 @@
/// Overlay for our protection shield.
var/mutable_appearance/shield_overlay
/// Damage coefficients when shielded
- var/static/list/shielded_damage = list(BRUTE = 0.05, BURN = 0.05, TOX = 0.05, STAMINA = 0, OXY = 0.05)
- // What the damage coefficients were previously
- var/list/original_damage_coeff
/datum/status_effect/protector_shield/on_apply()
if (isguardian(owner))
@@ -86,10 +83,10 @@
owner.melee_damage_upper -= damage_penalty
owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/guardian_shield)
- if (isbasicmob(owner)) // Better hope you are or this status is doing basically nothing useful for you
- var/mob/living/basic/basic_owner = owner
- original_damage_coeff = basic_owner.damage_coeff
- basic_owner.damage_coeff = shielded_damage
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 0.125)
+ MODIFY_PHYSIOLOGY(owner, BURN, 0.125)
+ MODIFY_PHYSIOLOGY(owner, TOX, 0.125)
+ MODIFY_PHYSIOLOGY(owner, OXY, 0.125)
to_chat(owner, span_bolddanger("You enter protection mode."))
RegisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays))
@@ -102,9 +99,10 @@
owner.melee_damage_upper += damage_penalty
owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/guardian_shield)
- if (isbasicmob(owner))
- var/mob/living/basic/basic_owner = owner
- basic_owner.damage_coeff = original_damage_coeff
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 8)
+ MODIFY_PHYSIOLOGY(owner, BURN, 8)
+ MODIFY_PHYSIOLOGY(owner, TOX, 8)
+ MODIFY_PHYSIOLOGY(owner, OXY, 8)
to_chat(owner, span_bolddanger("You return to your normal mode."))
UnregisterSignal(owner, list(COMSIG_ATOM_UPDATE_OVERLAYS) + COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES)
diff --git a/code/modules/mob/living/basic/guardian/guardian_types/ranged.dm b/code/modules/mob/living/basic/guardian/guardian_types/ranged.dm
index 126ca95da2c1..c1045a67bf30 100644
--- a/code/modules/mob/living/basic/guardian/guardian_types/ranged.dm
+++ b/code/modules/mob/living/basic/guardian/guardian_types/ranged.dm
@@ -6,7 +6,7 @@
friendly_verb_simple = "quietly assess"
melee_damage_lower = 10
melee_damage_upper = 10
- damage_coeff = list(BRUTE = 0.9, BURN = 0.9, TOX = 0.9, STAMINA = 0, OXY = 0.9)
+ physiology = list(BRUTE = 0.9, BURN = 0.9, TOX = 0.9, OXY = 0.9, STAMINA = 0)
range = 13
playstyle_string = span_holoparasite("As a ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit.")
creator_name = "Ranged"
diff --git a/code/modules/mob/living/basic/guardian/guardian_types/standard.dm b/code/modules/mob/living/basic/guardian/guardian_types/standard.dm
index 3e15caaa4274..e880b06742c7 100644
--- a/code/modules/mob/living/basic/guardian/guardian_types/standard.dm
+++ b/code/modules/mob/living/basic/guardian/guardian_types/standard.dm
@@ -1,7 +1,7 @@
/// Plain, but durable and strong. Can destroy walls.
/mob/living/basic/guardian/standard
guardian_type = GUARDIAN_STANDARD
- damage_coeff = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.5, STAMINA = 0, OXY = 0.5)
+ physiology = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.5, OXY = 0.5, STAMINA = 0)
melee_damage_lower = 20
melee_damage_upper = 20
melee_attack_cooldown = 0.6 SECONDS
diff --git a/code/modules/mob/living/basic/guardian/guardian_types/support.dm b/code/modules/mob/living/basic/guardian/guardian_types/support.dm
index 503dc93b7787..a282f2da780e 100644
--- a/code/modules/mob/living/basic/guardian/guardian_types/support.dm
+++ b/code/modules/mob/living/basic/guardian/guardian_types/support.dm
@@ -2,7 +2,7 @@
/mob/living/basic/guardian/support
guardian_type = GUARDIAN_SUPPORT
speed = 0
- damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, STAMINA = 0, OXY = 0.7)
+ physiology = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, OXY = 0.7, STAMINA = 0)
melee_damage_lower = 15
melee_damage_upper = 15
playstyle_string = span_holoparasite("As a support type, you may right-click to heal targets. In addition, alt-clicking on an adjacent object or mob will warp them to your bluespace beacon after a short delay.")
diff --git a/code/modules/mob/living/basic/health_adjustment.dm b/code/modules/mob/living/basic/health_adjustment.dm
deleted file mode 100644
index 410a2afe55a0..000000000000
--- a/code/modules/mob/living/basic/health_adjustment.dm
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * Adjusts the health of a simple mob by a set amount
- *
- * Arguments:
- * * amount The amount that will be used to adjust the mob's health
- * * updating_health If the mob's health should be immediately updated to the new value
- * * forced If we should force update the adjustment of the mob's health no matter the restrictions, like TRAIT_GODMODE
- * returns the net change in bruteloss after applying the damage amount
- */
-/mob/living/basic/proc/adjust_health(amount, updating_health = TRUE, forced = FALSE)
- . = FALSE
- if(!forced && HAS_TRAIT(src, TRAIT_GODMODE))
- return 0
- . = bruteloss // bruteloss value before applying damage
- bruteloss = round(clamp(bruteloss + amount, 0, maxHealth * 2), DAMAGE_PRECISION)
- if(updating_health)
- updatehealth()
- return . - bruteloss
-
-/mob/living/basic/get_damage_mod(damage_type)
- var/modifier = ..()
- if (damage_type in damage_coeff)
- return modifier * damage_coeff[damage_type]
- return modifier
-
-/mob/living/basic/adjust_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
- if(!can_adjust_brute_loss(amount, forced, required_bodytype))
- return 0
- if(forced)
- . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced)
- else if(damage_coeff[BRUTE])
- . = adjust_health(amount * damage_coeff[BRUTE] * CONFIG_GET(number/damage_multiplier), updating_health, forced)
-
-/mob/living/basic/adjust_fire_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
- if(!can_adjust_fire_loss(amount, forced, required_bodytype))
- return 0
- if(forced)
- . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced)
- else if(damage_coeff[BURN])
- . = adjust_health(amount * damage_coeff[BURN] * CONFIG_GET(number/damage_multiplier), updating_health, forced)
-
-/mob/living/basic/adjust_oxy_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype)
- if(!can_adjust_oxy_loss(amount, forced, required_biotype))
- return 0
- if(forced)
- . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced)
- else if(damage_coeff[OXY])
- . = adjust_health(amount * damage_coeff[OXY] * CONFIG_GET(number/damage_multiplier), updating_health, forced)
-
-/mob/living/basic/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype)
- if(!can_adjust_tox_loss(amount, forced, required_biotype))
- return 0
- if(forced)
- . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced)
- else if(damage_coeff[TOX])
- . = adjust_health(amount * damage_coeff[TOX] * CONFIG_GET(number/damage_multiplier), updating_health, forced)
-
-/mob/living/basic/adjust_stamina_loss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype)
- if(!can_adjust_stamina_loss(amount, forced, required_biotype))
- return 0
- . = staminaloss
-
- var/stamina_delta = forced ? amount : amount * damage_coeff[STAMINA]
- staminaloss = max(0, min(max_stamina, staminaloss + stamina_delta))
-
- if(stamina_delta > 0)
- received_stamina_damage(staminaloss, -1 * stamina_delta, amount)
- if(updating_stamina && stamina_delta)
- update_stamina()
- . -= staminaloss
-
-/mob/living/basic/received_stamina_damage(current_level, amount_actual, amount)
- if (stamina_recovery == 0)
- return ..()
-
-/mob/living/basic/received_stamina_damage(current_level, amount_actual, amount)
- . = ..()
- if (stat == DEAD || stamina_crit_threshold == BASIC_MOB_NO_STAMCRIT)
- return
-
- if (100 / (max_stamina / current_level) >= stamina_crit_threshold)
- apply_status_effect(/datum/status_effect/incapacitating/stamcrit)
diff --git a/code/modules/mob/living/basic/heretic/_heretic_summon.dm b/code/modules/mob/living/basic/heretic/_heretic_summon.dm
index 960965ec949f..351fe57646d9 100644
--- a/code/modules/mob/living/basic/heretic/_heretic_summon.dm
+++ b/code/modules/mob/living/basic/heretic/_heretic_summon.dm
@@ -10,7 +10,7 @@
habitable_atmos = null
status_flags = CANPUSH
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0)
+ physiology = list(BRUTE = 0.7, BURN = 0.7, TOX = 0, OXY = 0, STAMINA = 0)
speed = 0
melee_attack_cooldown = CLICK_CD_MELEE
diff --git a/code/modules/mob/living/basic/heretic/fire_shark.dm b/code/modules/mob/living/basic/heretic/fire_shark.dm
index 41c489726732..a5c1fd43ad0e 100644
--- a/code/modules/mob/living/basic/heretic/fire_shark.dm
+++ b/code/modules/mob/living/basic/heretic/fire_shark.dm
@@ -16,7 +16,7 @@
obj_damage = 0
attack_verb_continuous = "bites"
attack_verb_simple = "bite"
- damage_coeff = list(BRUTE = 1, BURN = 0.25, TOX = 0, STAMINA = 0, OXY = 0)
+ physiology = list(BURN = 0.25, TOX = 0, OXY = 0, STAMINA = 0)
faction = list(FACTION_HERETIC)
mob_size = MOB_SIZE_TINY
speak_emote = list("screams")
diff --git a/code/modules/mob/living/basic/heretic/star_gazer.dm b/code/modules/mob/living/basic/heretic/star_gazer.dm
index 56ce4ab8259f..076c23ce9c30 100644
--- a/code/modules/mob/living/basic/heretic/star_gazer.dm
+++ b/code/modules/mob/living/basic/heretic/star_gazer.dm
@@ -24,7 +24,7 @@
attack_sound = 'sound/items/weapons/bladeslice.ogg'
melee_attack_cooldown = 0.6 SECONDS
speak_emote = list("growls")
- damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 0, STAMINA = 0, OXY = 0)
+ physiology = list(BURN = 0.5, TOX = 0, OXY = 0, STAMINA = 0)
death_sound = 'sound/effects/magic/cosmic_expansion.ogg'
slowed_by_drag = 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 7eea729b6f09..c0cb6895ff5c 100644
--- a/code/modules/mob/living/basic/jungle/venus_human_trap.dm
+++ b/code/modules/mob/living/basic/jungle/venus_human_trap.dm
@@ -23,16 +23,14 @@
/// The amount of time it takes to create a venus human trap.
var/growth_time = 120 SECONDS
var/growth_icon = 0
-
/// Used by countdown to check time, this is when the timer will complete and the venus trap will spawn.
var/finish_time
/// The countdown ghosts see to when the plant will hatch
var/obj/effect/countdown/flower_bud/countdown
-
- var/trait_flags = 0
-
+ /// List of mutations for a specific flower vine
+ var/list/mutations = list()
+ /// List of anchored vines that are attatched to the flower for the bloom/beam effect
var/list/vines = list()
-
/// The spawner that actually handles spawning the ghost role in
var/obj/effect/mob_spawn/ghost_role/venus_human_trap/spawner
@@ -55,8 +53,10 @@
countdown.start()
/obj/structure/alien/resin/flower_bud/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
- if((trait_flags & SPACEVINE_HEAT_RESISTANT) && damage_type == BURN)
+ var/datum/spacevine_mutation/fire_proof/fire_proof = locate() in mutations
+ if(fire_proof && damage_type == BURN)
damage_amount = 0
+
. = ..()
/obj/structure/alien/resin/flower_bud/attacked_by(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
@@ -134,8 +134,8 @@
health_doll_icon = "venus_human_trap"
mob_biotypes = MOB_ORGANIC | MOB_PLANT
layer = SPACEVINE_MOB_LAYER
- health = 100
- maxHealth = 100
+ health = 50
+ maxHealth = 50
obj_damage = 60
melee_damage_lower = 10
melee_damage_upper = 20
@@ -156,7 +156,7 @@
lighting_cutoff_red = 10
lighting_cutoff_green = 35
lighting_cutoff_blue = 20
- faction = list(FACTION_HOSTILE,FACTION_VINES,FACTION_PLANTS)
+ faction = list(FACTION_HOSTILE, FACTION_VINES, FACTION_PLANTS)
initial_language_holder = /datum/language_holder/venus
unique_name = TRUE
speed = 1.2
@@ -165,9 +165,13 @@
///how much damage we take out of weeds
var/no_weed_damage = 12.5
///how much do we heal in weeds
- var/weed_heal = 10
+ var/weed_heal = 5
///if the balloon alert was shown atleast once, reset after healing in weeds
var/alert_shown = FALSE
+ ///the distance it can move away from kudzu before taking damage
+ var/kudzu_off_distance_range = 0
+ /// Internal dummy used to glow (very cool)
+ var/obj/effect/dummy/lighting_obj/moblight/glow
/mob/living/basic/venus_human_trap/Initialize(mapload)
. = ..()
@@ -177,6 +181,10 @@
)
grant_actions_by_list(innate_actions)
+/mob/living/basic/venus_human_trap/Destroy(force)
+ QDEL_NULL(glow)
+ return ..()
+
/mob/living/basic/venus_human_trap/RangedAttack(atom/victim)
if(!combat_mode)
return
@@ -190,7 +198,7 @@
if(!.)
return FALSE
- var/vines_in_range = locate(/obj/structure/spacevine) in range(2, src)
+ var/vines_in_range = locate(/obj/structure/spacevine) in range(kudzu_off_distance_range, src)
if(!vines_in_range && !alert_shown)
alert_shown = TRUE
balloon_alert(src, "do not leave vines!")
diff --git a/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm
index 388b8d1cb8db..2d44e10080c1 100644
--- a/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm
+++ b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm
@@ -6,7 +6,6 @@
icon_living = "basilisk"
icon_dead = "basilisk_dead"
speak_emote = list("chimes")
- damage_coeff = list(BRUTE = 1, BURN = 0.1, TOX = 1, STAMINA = 0, OXY = 1)
mob_biotypes = parent_type::mob_biotypes | MOB_MINERAL
speed = 20
maxHealth = 200
diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm
index 56ea5ee94e59..62cda4189f1c 100644
--- a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm
+++ b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm
@@ -94,7 +94,20 @@
. += span_info("Someone appears to have attached a saddle to this one.")
// Goliaths can summon tentacles more frequently as they take damage, scary.
-/mob/living/basic/mining/goliath/apply_damage(damage, damagetype, def_zone, blocked, forced, spread_damage, wound_bonus, exposed_wound_bonus, sharpness, attack_direction, attacking_item, wound_clothing)
+/mob/living/basic/mining/goliath/apply_damage/apply_damage(
+ damage = 0,
+ damagetype = BRUTE,
+ def_zone = null,
+ blocked = 0,
+ forced = FALSE,
+ spread_damage = FALSE,
+ wound_bonus = 0,
+ exposed_wound_bonus = 0,
+ sharpness = NONE,
+ attack_direction = null,
+ attacking_item,
+ wound_clothing = TRUE,
+)
. = ..()
if (. <= 0)
return
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 78a0555d957e..7cc75274f303 100644
--- a/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm
+++ b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm
@@ -113,7 +113,11 @@
// Inherit our creator's target and reinforcement requests
ai_controller.set_blackboard_key(BB_CURRENT_TARGET, creator.ai_controller.blackboard[BB_CURRENT_TARGET])
- ai_controller.set_blackboard_key(BB_MINING_MOB_REINFORCEMENTS_REQUESTS, creator.ai_controller.blackboard[BB_MINING_MOB_REINFORCEMENTS_REQUESTS])
+ // Own and track each inherited target independently of our creator's controller
+ var/list/reinforcement_requests = creator.ai_controller.blackboard[BB_MINING_MOB_REINFORCEMENTS_REQUESTS]
+ for (var/target, requests_entry in reinforcement_requests)
+ var/list/request_times = requests_entry
+ ai_controller.set_blackboard_key_assoc_lazylist(BB_MINING_MOB_REINFORCEMENTS_REQUESTS, target, request_times.Copy())
/// Reference handling
/mob/living/basic/mining/legion_brood/proc/creator_destroyed()
diff --git a/code/modules/mob/living/basic/lavaland/mining.dm b/code/modules/mob/living/basic/lavaland/mining.dm
index 7a40095b7462..1adf222d3da5 100644
--- a/code/modules/mob/living/basic/lavaland/mining.dm
+++ b/code/modules/mob/living/basic/lavaland/mining.dm
@@ -14,7 +14,7 @@
lighting_cutoff_red = 25
lighting_cutoff_green = 15
lighting_cutoff_blue = 35
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
/// Message to output if throwing damage is absorbed
var/throw_blocked_message = "bounces off"
/// What crusher trophy this mob drops, if any
diff --git a/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm b/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm
index 6d14322145e1..74014b22be1e 100644
--- a/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm
+++ b/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm
@@ -85,6 +85,7 @@ GLOBAL_LIST_EMPTY(raptor_population)
. = ..()
inherited_stats = passed_stats || new(src)
// First thing as to go before tameable in change_growth_stage()
+ AddElement(/datum/element/clever_girl)
AddElement(/datum/element/basic_eating, food_types = food_types)
raptor_color = GLOB.raptor_colors[color_type || raptor_color || pick(GLOB.raptor_colors)]
raptor_color.setup_raptor(src)
diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_color.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_color.dm
index de65f8dd6353..ebaf9ab1e15a 100644
--- a/code/modules/mob/living/basic/lavaland/raptor/raptor_color.dm
+++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_color.dm
@@ -274,7 +274,7 @@ GLOBAL_LIST_INIT(raptor_colors, init_raptor_colors())
wings_underlay = mutable_appearance(worn_icon, "raptor_purple_wings", -BODY_BEHIND_LAYER, user)
user.apply_height(wings_underlay, UPPER_BODY)
user.add_overlay(wings_underlay)
- user.physiology.stun_mod *= 2
+ MODIFY_PHYSIOLOGY(user, PHYS_COEFF_STUN, 2)
user.add_traits(list(TRAIT_MOVE_FLOATING, TRAIT_IGNORING_GRAVITY, TRAIT_NOGRAV_ALWAYS_DRIFT), REF(src))
if (struggling)
user.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/raptor/slow)
@@ -292,7 +292,7 @@ GLOBAL_LIST_INIT(raptor_colors, init_raptor_colors())
user.cut_overlay(wings_underlay)
QDEL_NULL(wings_underlay)
- user.physiology.stun_mod *= 0.5
+ MODIFY_PHYSIOLOGY(user, PHYS_COEFF_STUN, 0.5)
user.remove_traits(list(TRAIT_MOVE_FLOATING, TRAIT_IGNORING_GRAVITY, TRAIT_NOGRAV_ALWAYS_DRIFT), REF(src))
user.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/raptor/slow)
user.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/raptor)
diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm
index 0afc83514a9b..d646aed2e57e 100644
--- a/code/modules/mob/living/basic/minebots/minebot.dm
+++ b/code/modules/mob/living/basic/minebots/minebot.dm
@@ -32,7 +32,7 @@
light_on = FALSE
combat_mode = FALSE
ai_controller = /datum/ai_controller/basic_controller/minebot
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
///the gun we use to kill
var/obj/item/gun/energy/recharge/kinetic_accelerator/minebot/stored_gun
///our normal overlay
diff --git a/code/modules/mob/living/basic/pets/cat/cat_bt.dm b/code/modules/mob/living/basic/pets/cat/cat_bt.dm
index c62b755d6f29..2cb4c8a7067b 100644
--- a/code/modules/mob/living/basic/pets/cat/cat_bt.dm
+++ b/code/modules/mob/living/basic/pets/cat/cat_bt.dm
@@ -102,8 +102,10 @@
return AI_BEHAVIOR_DELAY
// 50/50 chance we lose.
- var/datum/ai_controller/loser_controller = prob(50) ? controller : target.ai_controller
- loser_controller.set_blackboard_key(BB_BASIC_MOB_FLEE_TARGET, target)
+ if(prob(50))
+ controller.set_blackboard_key(BB_BASIC_MOB_FLEE_TARGET, target)
+ else
+ target.ai_controller?.set_blackboard_key(BB_BASIC_MOB_FLEE_TARGET, living_pawn)
target.ai_controller?.clear_blackboard_key(target_key)
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
diff --git a/code/modules/mob/living/basic/pets/dog/corgi.dm b/code/modules/mob/living/basic/pets/dog/corgi.dm
index 7ed2978b95ae..d516dd00526d 100644
--- a/code/modules/mob/living/basic/pets/dog/corgi.dm
+++ b/code/modules/mob/living/basic/pets/dog/corgi.dm
@@ -95,22 +95,22 @@
* which usually means any direct attack like melee or gunshot. Anything abstract like a bomb or acid or something
* will instead give half the armor value.
*/
-/mob/living/basic/pet/dog/corgi/getarmor(def_zone, type)
+/mob/living/basic/pet/dog/corgi/get_worn_armor_value(obj/item/bodypart/def_zone, damage_type)
var/armorval = 0
if(def_zone)
if(def_zone == BODY_ZONE_HEAD)
if(inventory_head)
- armorval = inventory_head.get_armor_rating(type)
+ armorval = inventory_head.get_armor_rating(damage_type)
else
if(inventory_back)
- armorval = inventory_back.get_armor_rating(type)
+ armorval = inventory_back.get_armor_rating(damage_type)
return armorval
else
if(inventory_head)
- armorval += inventory_head.get_armor_rating(type)
+ armorval += inventory_head.get_armor_rating(damage_type)
if(inventory_back)
- armorval += inventory_back.get_armor_rating(type)
+ armorval += inventory_back.get_armor_rating(damage_type)
return armorval * 0.5
/mob/living/basic/pet/dog/corgi/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
diff --git a/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm b/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm
index 9d01a2f9da5e..65451a102eb9 100644
--- a/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm
+++ b/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm
@@ -85,7 +85,7 @@
health = 50
maxHealth = 50
gender = NEUTER
- damage_coeff = list(BRUTE = 3, BURN = 3, TOX = 1, STAMINA = 1, OXY = 1)
+ physiology = list(BRUTE = 3, BURN = 3)
butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/food/breadslice/plain = 3, \
/obj/item/food/meat/slab = 2)
response_harm_continuous = "takes a bite out of"
diff --git a/code/modules/mob/living/basic/pets/orbie/orbie.dm b/code/modules/mob/living/basic/pets/orbie/orbie.dm
index a75f1f5b0a2c..94b1b3affc5f 100644
--- a/code/modules/mob/living/basic/pets/orbie/orbie.dm
+++ b/code/modules/mob/living/basic/pets/orbie/orbie.dm
@@ -26,7 +26,7 @@
maximum_survivable_temperature = INFINITY
death_message = "fades out of existence!"
ai_controller = /datum/ai_controller/basic_controller/orbie
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
///are we happy or not?
var/happy_state = FALSE
///overlay for our neutral eyes
diff --git a/code/modules/mob/living/basic/ruin_defender/cybersun_aicore.dm b/code/modules/mob/living/basic/ruin_defender/cybersun_aicore.dm
index 6055ea57b511..a7d6bff11120 100644
--- a/code/modules/mob/living/basic/ruin_defender/cybersun_aicore.dm
+++ b/code/modules/mob/living/basic/ruin_defender/cybersun_aicore.dm
@@ -21,7 +21,7 @@
unsuitable_atmos_damage = 0
combat_mode = TRUE
move_resist = INFINITY
- damage_coeff = list(BRUTE = 1.5, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0)
+ physiology = list(BRUTE = 1.5, TOX = 0, OXY = 0, STAMINA = 0)
light_system = OVERLAY_LIGHT
light_range = 2
light_power = 0.6
diff --git a/code/modules/mob/living/basic/ruin_defender/living_floor.dm b/code/modules/mob/living/basic/ruin_defender/living_floor.dm
index c327e9802fd1..34e5219a79da 100644
--- a/code/modules/mob/living/basic/ruin_defender/living_floor.dm
+++ b/code/modules/mob/living/basic/ruin_defender/living_floor.dm
@@ -32,7 +32,7 @@
attack_vis_effect = ATTACK_EFFECT_BITE
attack_verb_continuous = "bites"
attack_verb_simple = "bite"
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
ai_controller = /datum/ai_controller/basic_controller/living_floor
melee_attack_cooldown = 0.5 SECONDS // get real
diff --git a/code/modules/mob/living/basic/ruin_defender/mimic/mimic.dm b/code/modules/mob/living/basic/ruin_defender/mimic/mimic.dm
index ae01dc97149b..ab3605d85957 100644
--- a/code/modules/mob/living/basic/ruin_defender/mimic/mimic.dm
+++ b/code/modules/mob/living/basic/ruin_defender/mimic/mimic.dm
@@ -31,7 +31,7 @@ GLOBAL_LIST_INIT(animatable_blacklist, typecacheof(list(
faction = list(FACTION_MIMIC)
basic_mob_flags = DEL_ON_DEATH
combat_mode = TRUE
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
/// can we stun people on hit
var/knockdown_people = FALSE
@@ -123,7 +123,7 @@ GLOBAL_LIST_INIT(animatable_blacklist, typecacheof(list(
locked = TRUE //if this was a crate with loot then we dont want people to just leftclick it to open it then bait it somewhere and steal its loot
return TRUE
-/mob/living/basic/mimic/crate/adjust_health(amount, updating_health = TRUE, forced = FALSE)
+/mob/living/basic/mimic/crate/on_damage_loss_changed(amount, updating_health = TRUE, forced = FALSE)
if(amount > 0)
trigger()
return ..()
diff --git a/code/modules/mob/living/basic/ruin_defender/skeleton.dm b/code/modules/mob/living/basic/ruin_defender/skeleton.dm
index 5dab118f8cfe..f3f14460ebf2 100644
--- a/code/modules/mob/living/basic/ruin_defender/skeleton.dm
+++ b/code/modules/mob/living/basic/ruin_defender/skeleton.dm
@@ -89,7 +89,7 @@
maxHealth = 150
health = 150
speed = 2
- damage_coeff = list(BRUTE = 0.5, BURN = 0.5, TOX = 0, STAMINA = 0, OXY = 0) //trying to simulate actually having armor
+ physiology = list(BRUTE = 0.5, BURN = 0.5, TOX = 0, OXY = 0, STAMINA = 0) //trying to simulate actually having armor
obj_damage = 50
melee_damage_lower = 25
melee_damage_upper = 30
diff --git a/code/modules/mob/living/basic/ruin_defender/stickman.dm b/code/modules/mob/living/basic/ruin_defender/stickman.dm
index 2045447e1a4c..bdd4d7b7e0a0 100644
--- a/code/modules/mob/living/basic/ruin_defender/stickman.dm
+++ b/code/modules/mob/living/basic/ruin_defender/stickman.dm
@@ -19,7 +19,7 @@
faction = list(FACTION_STICKMAN)
unsuitable_atmos_damage = 0
unsuitable_heat_damage = 7.5
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
ai_controller = /datum/ai_controller/basic_controller/stickman
diff --git a/code/modules/mob/living/basic/slime/actions.dm b/code/modules/mob/living/basic/slime/actions.dm
index 3e4408d440ca..109a96b1c48d 100644
--- a/code/modules/mob/living/basic/slime/actions.dm
+++ b/code/modules/mob/living/basic/slime/actions.dm
@@ -144,15 +144,17 @@
var/list/created_slimes = list(src)
var/list/slime_friends = list()
- for(var/faction_member in get_faction())
- var/mob/living/possible_friend = locate(faction_member) in GLOB.mob_living_list
+ for(var/ally_ref in allies)
+ var/mob/living/possible_friend = locate(ally_ref) in GLOB.mob_living_list
if(QDELETED(possible_friend))
continue
slime_friends += possible_friend
+ var/our_faction = get_faction()
for(var/i in 1 to 3)
var/mob/living/basic/slime/baby = new(drop_loc, get_random_mutation())
created_slimes += baby
+ baby.add_faction(our_faction)
for(var/slime_friend in slime_friends)
baby.befriend(slime_friend)
diff --git a/code/modules/mob/living/basic/slime/feeding.dm b/code/modules/mob/living/basic/slime/feeding.dm
index 284534ccbecb..780987375678 100644
--- a/code/modules/mob/living/basic/slime/feeding.dm
+++ b/code/modules/mob/living/basic/slime/feeding.dm
@@ -51,18 +51,10 @@
balloon_alert(src, "can't eat slime!")
return FALSE
- if(isanimal(meal))
- var/mob/living/simple_animal/simple_meal = meal
- if(simple_meal.damage_coeff[TOX] <= 0 && simple_meal.damage_coeff[BRUTE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us.
- if(!silent)
- balloon_alert(src, "not food!")
- return FALSE
- else if(isbasicmob(meal))
- var/mob/living/basic/basic_meal = meal
- if(basic_meal.damage_coeff[TOX] <= 0 && basic_meal.damage_coeff[BRUTE] <= 0)
- if (!silent)
- balloon_alert(src, "not food!")
- return FALSE
+ if(GET_PHYSIOLOGY(meal, BRUTE) <= 0 && GET_PHYSIOLOGY(meal, TOX) <= 0) //The creature wouldn't take any damage, it must be too weird even for us.
+ if(!silent)
+ balloon_alert(src, "not food!")
+ return FALSE
return TRUE
diff --git a/code/modules/mob/living/basic/slime/slime.dm b/code/modules/mob/living/basic/slime/slime.dm
index b97873cbdcd4..23234084ce04 100644
--- a/code/modules/mob/living/basic/slime/slime.dm
+++ b/code/modules/mob/living/basic/slime/slime.dm
@@ -27,7 +27,7 @@
wound_bonus = -45
can_buckle_to = FALSE
- damage_coeff = list(BRUTE = 1, BURN = -1, TOX = 1, STAMINA = 1, OXY = 1) //Healed by fire
+ physiology = list(BURN = -1) //Healed by fire
unsuitable_cold_damage = 15
unsuitable_heat_damage = 0
maximum_survivable_temperature = INFINITY
diff --git a/code/modules/mob/living/basic/space_fauna/changeling/flesh_spider.dm b/code/modules/mob/living/basic/space_fauna/changeling/flesh_spider.dm
index fa3015c011be..5d6e56984e57 100644
--- a/code/modules/mob/living/basic/space_fauna/changeling/flesh_spider.dm
+++ b/code/modules/mob/living/basic/space_fauna/changeling/flesh_spider.dm
@@ -16,7 +16,7 @@
response_help_simple = "pet"
response_disarm_continuous = "gently pushes aside"
response_disarm_simple = "gently push aside"
- damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 4, STAMINA = 1, OXY = 1)
+ physiology = list(BURN = 1.25, TOX = 4)
basic_mob_flags = FLAMMABLE_MOB
status_flags = NONE
speed = 0.2
diff --git a/code/modules/mob/living/basic/space_fauna/demon/demon.dm b/code/modules/mob/living/basic/space_fauna/demon/demon.dm
index 76591aa49129..27d80f85760a 100644
--- a/code/modules/mob/living/basic/space_fauna/demon/demon.dm
+++ b/code/modules/mob/living/basic/space_fauna/demon/demon.dm
@@ -47,7 +47,7 @@
lighting_cutoff_green = 10
lighting_cutoff_blue = 20
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
/// Typepath of the antag datum to add to the demon when applicable
var/datum/antagonist/antag_type = null
diff --git a/code/modules/mob/living/basic/space_fauna/garden_gnome.dm b/code/modules/mob/living/basic/space_fauna/garden_gnome.dm
index c36a3ff85bb9..a3c13dd7f947 100644
--- a/code/modules/mob/living/basic/space_fauna/garden_gnome.dm
+++ b/code/modules/mob/living/basic/space_fauna/garden_gnome.dm
@@ -18,7 +18,6 @@
attack_verb_simple = "punch"
attack_sound = 'sound/items/weapons/punch1.ogg'
melee_attack_cooldown = 1.2 SECONDS
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 1, OXY = 1)
speak_emote = list("announces")
unsuitable_atmos_damage = 0
@@ -30,8 +29,6 @@
gold_core_spawnable = HOSTILE_SPAWN
greyscale_config = /datum/greyscale_config/garden_gnome
ai_controller = /datum/ai_controller/basic_controller/garden_gnome
- /// The damage resistence when sinked into the ground
- var/resistance_when_sinked = list(BRUTE = 0.5, BURN = 0.5, TOX = 1, STAMINA = 0, OXY = 1)
/// Realistically weighted list of usual gnome hat colours
var/static/list/gnome_hat_colours = list(
COLOR_GNOME_RED_ONE = 9,
@@ -108,10 +105,16 @@
AddElement(/datum/element/footstep, FOOTSTEP_MOB_SHOE)
AddComponent(/datum/component/ai_retaliate_advanced, retaliate_callback)
AddComponent(/datum/component/swarming)
- AddComponent(/datum/component/ground_sinking, target_icon_state = icon_state, outline_colour = chosen_hat_colour, damage_res_sinked = resistance_when_sinked)
+ AddComponent(/datum/component/ground_sinking, target_icon_state = icon_state, outline_colour = chosen_hat_colour, sink_callback = CALLBACK(src, PROC_REF(toggle_sink_damage_res)))
AddComponent(/datum/component/caltrop, min_damage = 5, max_damage = 10, paralyze_duration = 1 SECONDS, flags = CALTROP_BYPASS_SHOES)
add_traits(list(TRAIT_SPACEWALK, TRAIT_VENTCRAWLER_ALWAYS), INNATE_TRAIT)
+///Apply extra damage resistances when sunk in the ground.
+/mob/living/basic/garden_gnome/proc/toggle_sink_damage_res(has_sunk)
+ MODIFY_PHYSIOLOGY(src, BRUTE, has_sunk ? 0.5 : 2)
+ MODIFY_PHYSIOLOGY(src, BURN, has_sunk ? 0.5 : 2)
+ MODIFY_PHYSIOLOGY(src, STAMINA, has_sunk ? 0.1 : 10)
+
/mob/living/basic/garden_gnome/proc/apply_colour()
if(!greyscale_config)
return
diff --git a/code/modules/mob/living/basic/space_fauna/ghost.dm b/code/modules/mob/living/basic/space_fauna/ghost.dm
index 4b8f3f438cdb..079f9f2bdabb 100644
--- a/code/modules/mob/living/basic/space_fauna/ghost.dm
+++ b/code/modules/mob/living/basic/space_fauna/ghost.dm
@@ -27,7 +27,7 @@
light_range = 2.5 // same glowing as visible player ghosts
light_power = 0.6
ai_controller = /datum/ai_controller/basic_controller/ghost
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
///What hairstyle will this ghost have
var/ghost_hairstyle
diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm b/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm
index 7b5edab617a0..46f22adaa346 100644
--- a/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm
+++ b/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm
@@ -32,7 +32,7 @@
habitable_atmos = null
minimum_survivable_temperature = TCMB
ai_controller = /datum/ai_controller/basic_controller/hivebot
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
///does this type do range attacks?
var/ranged_attacker = FALSE
/// How often can we shoot?
diff --git a/code/modules/mob/living/basic/space_fauna/lightgeist.dm b/code/modules/mob/living/basic/space_fauna/lightgeist.dm
index da6fff877157..cd455829ee3f 100644
--- a/code/modules/mob/living/basic/space_fauna/lightgeist.dm
+++ b/code/modules/mob/living/basic/space_fauna/lightgeist.dm
@@ -34,7 +34,7 @@
verb_exclaim = "zaps"
verb_yell = "bangs"
initial_language_holder = /datum/language_holder/lightbringer
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 1, OXY = 0)
+ physiology = list(TOX = 0, OXY = 0)
light_range = 4
faction = list(FACTION_NEUTRAL)
unsuitable_atmos_damage = 0
diff --git a/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm b/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm
index 4ca874df94f3..370d4c38f0aa 100644
--- a/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm
+++ b/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm
@@ -27,7 +27,7 @@
maximum_survivable_temperature = 1500
combat_mode = TRUE
move_resist = INFINITY // This mob IS the floor
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
/// Looping heartbeat sound
var/datum/looping_sound/heartbeat/soundloop
diff --git a/code/modules/mob/living/basic/space_fauna/morph.dm b/code/modules/mob/living/basic/space_fauna/morph.dm
index ba539574b2bf..1d5c5a68759c 100644
--- a/code/modules/mob/living/basic/space_fauna/morph.dm
+++ b/code/modules/mob/living/basic/space_fauna/morph.dm
@@ -193,7 +193,7 @@
visible_message(span_warning("[src] swallows [eatable] whole!"))
eatable.forceMove(src)
if(update_health != 0)
- adjust_health(update_health)
+ adjust_brute_loss(update_health)
return TRUE
diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm b/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm
index 2f6b2aa10d16..40cf3f56f7ad 100644
--- a/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm
+++ b/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm
@@ -27,7 +27,7 @@
lighting_cutoff_blue = 40
ai_controller = /datum/ai_controller/basic_controller/simple/simple_hostile_obstacles
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
/mob/living/basic/blankbody/Initialize(mapload)
. = ..()
diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm b/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm
index 87686491d3a0..badc13d735f5 100644
--- a/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm
+++ b/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm
@@ -28,7 +28,7 @@
lighting_cutoff_blue = 15
ai_controller = /datum/ai_controller/basic_controller/simple/simple_hostile_obstacles
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
var/health_scaling = TRUE
/mob/living/basic/creature/Initialize(mapload)
diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm b/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm
index de1c11fc2118..9ac419b989a2 100644
--- a/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm
+++ b/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm
@@ -29,7 +29,7 @@
lighting_cutoff_blue = 50
ai_controller = /datum/ai_controller/basic_controller/simple/simple_hostile_obstacles
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
var/static/list/migo_sounds
/// Odds migo will dodge
var/dodge_prob = 10
diff --git a/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm b/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm
index 45ccc938331e..31fb066e7113 100644
--- a/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm
+++ b/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm
@@ -21,7 +21,7 @@
obj_damage = 50
attack_sound = 'sound/effects/hallucinations/growl1.ogg'
ai_controller = /datum/ai_controller/basic_controller/paper_wizard
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
unsuitable_atmos_damage = 0
///spell to summon minions
var/datum/action/cooldown/spell/conjure/wizard_summon_minions/summon
diff --git a/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm b/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm
index b51ccc39ef96..0434952a11e5 100644
--- a/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm
+++ b/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm
@@ -32,7 +32,7 @@
response_harm_continuous = "punches through"
response_harm_simple = "punch through"
unsuitable_atmos_damage = 0
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0) //I don't know how you'd apply those, but revenants no-sell them anyway.
+ physiology = list(TOX = 0, OXY = 0, STAMINA = 0) //I don't know how you'd apply those, but revenants no-sell them anyway.
habitable_atmos = null
minimum_survivable_temperature = 0
maximum_survivable_temperature = INFINITY
@@ -265,20 +265,35 @@
orbitsize -= (orbitsize / ICON_SIZE_ALL) * (ICON_SIZE_ALL * 0.25)
orbit(target, orbitsize)
-/mob/living/basic/revenant/adjust_health(amount, updating_health = TRUE, forced = FALSE)
- if(!forced && !HAS_TRAIT(src, TRAIT_REVENANT_REVEALED))
- return 0
+// Prevents damage from adjust_x_loss while in a host, because that damage would be nullified by the next [proc/sync_health] call. Adjust host blood volume instead.
+/mob/living/basic/revenant/can_adjust_brute_loss(amount, forced, required_bodytype)
+ if(!forced && amount > 0 && !HAS_TRAIT(src, TRAIT_REVENANT_REVEALED))
+ return FALSE
+ return ..()
- . = amount
+/mob/living/basic/revenant/can_adjust_fire_loss(amount, forced, required_bodytype)
+ if(!forced && amount > 0 && !HAS_TRAIT(src, TRAIT_REVENANT_REVEALED))
+ return FALSE
+ return ..()
- essence = max(0, essence - amount)
- if(updating_health)
- update_health_hud()
+/mob/living/basic/revenant/can_adjust_tox_loss(amount, forced, required_bodytype)
+ if(!forced && amount > 0 && !HAS_TRAIT(src, TRAIT_REVENANT_REVEALED))
+ return FALSE
+ return ..()
+
+/mob/living/basic/revenant/can_adjust_oxy_loss(amount, forced, required_bodytype)
+ if(!forced && amount > 0 && !HAS_TRAIT(src, TRAIT_REVENANT_REVEALED))
+ return FALSE
+ return ..()
+
+/mob/living/basic/revenant/on_damage_loss_changed(amount, updating_health, forced, damage_type)
+ bruteloss = 0 //reset brute loss, detract amount of damage from essence instead..
+ //negative amount means that damage has been healed, positive means damage has been received
+ essence = clamp(essence - amount, 0, max_essence)
+ . = ..()
if(essence == 0)
death()
- return .
-
/mob/living/basic/revenant/orbit(atom/target)
setDir(SOUTH) // reset dir so the right directional sprites show up
return ..()
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 395861908406..12ede711de46 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
@@ -306,6 +306,13 @@
cast_amount = 60
unlock_amount = 125
+ /// Typecache of stuff we generally don't want emaggable
+ var/static/list/no_emag_typecache = typecacheof(list(
+ /obj/machinery/power/apc,
+ /obj/machinery/power/smes,
+ /obj/machinery/computer/emergency_shuttle,
+ ))
+
// A note to future coders: do not replace this with an EMP because it will wreck malf AIs and everyone will hate you.
/datum/action/cooldown/spell/aoe/revenant/malfunction/cast_on_thing_in_aoe(turf/victim, mob/living/basic/revenant/caster)
for(var/mob/living/basic/bot/bot in victim)
@@ -323,13 +330,13 @@
new /obj/effect/temp_visual/revenant(human.loc)
human.emp_act(EMP_HEAVY)
for(var/obj/thing in victim)
- //Doesn't work on SMES and APCs, to prevent kekkery.
- if(istype(thing, /obj/machinery/power/apc) || istype(thing, /obj/machinery/power/smes))
+ if(is_type_in_typecache(thing, no_emag_typecache))
+ continue
+ if(!prob(20))
continue
- if(prob(20))
- if(prob(50))
- new /obj/effect/temp_visual/revenant(thing.loc)
- thing.emag_act(caster)
+ if(prob(50))
+ new /obj/effect/temp_visual/revenant(thing.loc)
+ thing.emag_act(caster)
// Only works on cyborgs, not AI!
for(var/mob/living/silicon/robot/cyborg in victim)
playsound(cyborg, 'sound/machines/warning-buzzer.ogg', 50, TRUE)
diff --git a/code/modules/mob/living/basic/space_fauna/robot_customer.dm b/code/modules/mob/living/basic/space_fauna/robot_customer.dm
index 1afe0b9c97b5..43b6bf358c3b 100644
--- a/code/modules/mob/living/basic/space_fauna/robot_customer.dm
+++ b/code/modules/mob/living/basic/space_fauna/robot_customer.dm
@@ -21,7 +21,7 @@
maximum_survivable_temperature = T0C + 1000
ai_controller = /datum/ai_controller/robot_customer
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
voice_filter = "alimiter=0.9,acompressor=threshold=0.2:ratio=20:attack=10:release=50:makeup=2,highpass=f=1000"
/// The clothes that we draw on this tourist.
diff --git a/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm b/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm
index 72a49814ebc6..a16df81a9394 100644
--- a/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm
+++ b/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm
@@ -26,7 +26,7 @@
unsuitable_cold_damage = 0
unsuitable_heat_damage = 0
unsuitable_atmos_damage = 0
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0.5, OXY = 1)
+ physiology = list(STAMINA = 0.5)
combat_mode = TRUE
speed = 0
attack_verb_continuous = "chomps"
@@ -219,7 +219,7 @@
health_recovered *= 1.75 // plus 7.5 points when eating advanced space carps (from the rift)
else
health_recovered *= 0.75 // minus 7.5 points when eating a human for example.
- adjust_health(round(-health_recovered, 1))
+ adjust_brute_loss(round(-health_recovered, 1))
if (QDELETED(food) || food.loc == src)
return FALSE
playsound(src, 'sound/effects/magic/demon_attack1.ogg', 60, TRUE)
@@ -238,7 +238,7 @@
if(fish_left <= 0)
addtimer(CALLBACK(src, PROC_REF(begin_sharkify)), 2 SECONDS)
fish_left = initial(fish_left) //prevent begin_sharkify from being called again by eating another fish.
- adjust_health(round(-health_recovered, 1))
+ adjust_brute_loss(round(-health_recovered, 1))
playsound(src, 'sound/effects/magic/demon_attack1.ogg', 40, TRUE)
visible_message(span_boldwarning("[src] swallows [fish] whole!"))
if(HAS_TRAIT(fish, TRAIT_YUCKY_FISH))
diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm
index 10db1405eeac..91685d719434 100644
--- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm
+++ b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm
@@ -253,7 +253,7 @@
icon_dead = "tank_dead"
maxHealth = 500
health = 500
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 1, OXY = 1)
+ physiology = null //defaults to a coeff of 1 (identity) for every damage type, including tox and burn, which other spiders are weak to.
melee_damage_lower = 5
melee_damage_upper = 5
obj_damage = 15
@@ -349,7 +349,7 @@
melee_damage_lower = 35
melee_damage_upper = 40
obj_damage = 100
- damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(BURN = 1.25, STAMINA = 0)
speed = 6
player_speed_modifier = -5.5 // Doesn't seem that slow but it gets a debuff off web
mob_size = MOB_SIZE_LARGE
@@ -561,7 +561,7 @@
web_speed = 0.4
maxHealth = 80
health = 80
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 1, OXY = 1)
+ physiology = null //defaults to a coeff of 1 (identity) for every damage type, including tox and burn, which other spiders are weak to.
unsuitable_cold_damage = 1
unsuitable_heat_damage = 1
menu_description = "Stronger assassin spider variant with an unmatched speed, high amount of health and very deadly poison, but deals very low amount of damage. It also has ability to ventcrawl."
diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider.dm b/code/modules/mob/living/basic/space_fauna/spider/spider.dm
index cde120b1c4c5..da7e93a71c19 100644
--- a/code/modules/mob/living/basic/space_fauna/spider/spider.dm
+++ b/code/modules/mob/living/basic/space_fauna/spider/spider.dm
@@ -14,7 +14,7 @@
response_disarm_simple = "gently push aside"
initial_language_holder = /datum/language_holder/spider
melee_attack_cooldown = CLICK_CD_MELEE
- damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 3, STAMINA = 1, OXY = 1)
+ physiology = list(BURN = 1.25, TOX = 3)
basic_mob_flags = FLAMMABLE_MOB
status_flags = NONE
unsuitable_cold_damage = 4
diff --git a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm
index a3f0fc1c64f5..48707227d782 100644
--- a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm
+++ b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm
@@ -160,7 +160,7 @@
icon_dead = "young_tank_dead"
maxHealth = 50
health = 50
- damage_coeff = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.5, STAMINA = 0.5, OXY = 1)
+ physiology = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.5, STAMINA = 0.5)
melee_damage_lower = 10
melee_damage_upper = 15
speed = 1
diff --git a/code/modules/mob/living/basic/space_fauna/statue/mannequin.dm b/code/modules/mob/living/basic/space_fauna/statue/mannequin.dm
index 967cd4922657..88058c47405a 100644
--- a/code/modules/mob/living/basic/space_fauna/statue/mannequin.dm
+++ b/code/modules/mob/living/basic/space_fauna/statue/mannequin.dm
@@ -12,7 +12,6 @@
status_flags = CANPUSH
sentience_type = SENTIENCE_ARTIFICIAL
ai_controller = /datum/ai_controller/basic_controller/stares_at_people
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
/// the path to a fake item we will hold in our right hand
var/obj/item/held_item
/// the path to a fake hat we will wear
diff --git a/code/modules/mob/living/basic/space_fauna/statue/statue.dm b/code/modules/mob/living/basic/space_fauna/statue/statue.dm
index bb62acade2bc..a4bc8a576146 100644
--- a/code/modules/mob/living/basic/space_fauna/statue/statue.dm
+++ b/code/modules/mob/living/basic/space_fauna/statue/statue.dm
@@ -51,7 +51,7 @@
move_resist = MOVE_FORCE_EXTREMELY_STRONG
pull_force = MOVE_FORCE_EXTREMELY_STRONG
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
ai_controller = /datum/ai_controller/basic_controller/statue
/mob/living/basic/statue/Initialize(mapload)
diff --git a/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm b/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm
index fdc0194999c1..9a91498c1373 100644
--- a/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm
+++ b/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm
@@ -25,7 +25,7 @@
maximum_survivable_temperature = T0C + 1250
habitable_atmos = null
death_message = "falls to the ground, its shard dulling to a miserable grey!"
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
faction = list(FACTION_HOSTILE)
@@ -41,6 +41,7 @@
/mob/living/basic/supermatter_spider/Initialize(mapload)
. = ..()
+ ADD_TRAIT(src, TRAIT_WEB_SURFER, INNATE_TRAIT)
AddComponent(/datum/component/swarming)
AddElement(/datum/element/ai_retaliate)
diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm
index 769cc408c085..391f7401818a 100644
--- a/code/modules/mob/living/basic/vermin/mouse.dm
+++ b/code/modules/mob/living/basic/vermin/mouse.dm
@@ -111,7 +111,7 @@
/// Kills the rat and changes its icon state to be splatted (bloody).
/mob/living/basic/mouse/proc/splat()
icon_dead = "mouse_[body_color]_splat"
- adjust_health(maxHealth)
+ adjust_brute_loss(maxHealth)
// On revival, re-add the mouse to the ratcap, or block it if we're at it
/mob/living/basic/mouse/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE)
@@ -220,7 +220,7 @@
span_notice("[src] nibbles [cheese]."),
span_notice("You nibble [cheese][health < maxHealth ? ", restoring your health" : ""].")
)
- adjust_health(-maxHealth)
+ adjust_brute_loss(-maxHealth)
// Or, if we're at full health, there's a 10% chance that normal cheese will spawn a new mouse
// ...if the rat cap allows us, that is
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index 23310e7948ab..92073ecd97c8 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -169,7 +169,7 @@
if(satiety > 80)
nutrition_ratio *= 1.25
- var/blood_to_restore = BLOOD_REGEN_FACTOR * physiology.blood_regen_mod * heart_blood_multiplier * nutrition_ratio * seconds_per_tick
+ var/blood_to_restore = BLOOD_REGEN_FACTOR * GET_PHYSIOLOGY(src, PHYS_COEFF_BLOOD_REGEN) * heart_blood_multiplier * nutrition_ratio * seconds_per_tick
var/blood_restored = adjust_blood_volume(blood_to_restore, maximum = BLOOD_VOLUME_NORMAL)
if (blood_restored > 0)
adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR * seconds_per_tick * (blood_restored / blood_to_restore))
@@ -271,6 +271,7 @@
if(HAS_TRAIT(src, TRAIT_GODMODE) || !can_bleed())
return
+ amount *= GET_PHYSIOLOGY(src, PHYS_COEFF_BLEED)
var/amount_bled = -adjust_blood_volume(-amount)
// Blood loss still happens in locker, floor stays clean
@@ -278,7 +279,6 @@
add_splatter_floor(loc, (amount_bled <= 10))
/mob/living/carbon/human/bleed(amount)
- amount *= physiology.bleed_mod
return ..()
/// A helper to see how much blood we're losing per tick
@@ -293,8 +293,7 @@
for(var/obj/item/bodypart/bodypart as anything in get_bodyparts())
. += bodypart.cached_bleed_rate
-/mob/living/carbon/human/get_bleed_rate()
- return ..() * physiology.bleed_mod
+ . *= GET_PHYSIOLOGY(src, PHYS_COEFF_BLEED)
/**
* bleed_warn() is used to for carbons with an active client to occasionally receive messages warning them about their bleeding status (if applicable)
diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm
deleted file mode 100644
index 72ee6388d998..000000000000
--- a/code/modules/mob/living/brain/MMI.dm
+++ /dev/null
@@ -1,384 +0,0 @@
-/obj/item/mmi
- name = "\improper Man-Machine Interface"
- desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity, that nevertheless has become standard-issue on Nanotrasen stations."
- icon = 'icons/obj/devices/assemblies.dmi'
- icon_state = "mmi_off"
- base_icon_state = "mmi"
- w_class = WEIGHT_CLASS_NORMAL
-
- custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT)
- var/braintype = "Cyborg"
- VAR_FINAL/obj/item/radio/mmi/radio = null //Let's give it a radio.
- VAR_FINAL/mob/living/brain/brainmob = null //The current occupant.
- VAR_FINAL/mob/living/silicon/robot = null //Appears unused.
- VAR_FINAL/obj/vehicle/sealed/mecha = null //This does not appear to be used outside of reference in mecha.dm.
- VAR_FINAL/obj/item/organ/brain/brain = null //The actual brain
-
- /// If TRUE, and placed in an AI, calls replacement_ai_name() and uses that as the AI's name.
- var/force_replace_ai_name = FALSE
- /// Whether the brainmob can move. Doesnt usually matter but SPHERICAL POSIBRAINSSS
- var/immobilize = TRUE
-
- /// If supplied with a law datum, the laws will be transferred to whatever it's placed in.
- /// - If placed in a cyborg, it will start de-synced from the AI.
- /// The cyborg's laws will be unmodifiable unless synced to the AI or a law rack.
- /// - If placed in an AI, it will override the AI's laws.
- /// Likewise, the AI's laws will be unmodifiable unless synced to a law rack.
- var/datum/ai_laws/laws
-
-/obj/item/radio/mmi
- custom_materials = null
-
-/obj/item/mmi/Initialize(mapload)
- . = ..()
- radio = new(src) //Spawns a radio inside the MMI.
- radio.set_broadcasting(FALSE) //researching radio mmis turned the robofabs into radios because this didnt start as 0.
-
-/obj/item/mmi/Destroy()
- set_mecha(null)
- QDEL_NULL(brainmob)
- QDEL_NULL(brain)
- QDEL_NULL(radio)
- QDEL_NULL(laws)
- return ..()
-
-/obj/item/mmi/update_icon_state()
- if(!brain)
- icon_state = "[base_icon_state]_off"
- return ..()
- icon_state = "[base_icon_state]_brain[istype(brain, /obj/item/organ/brain/alien) ? "_alien" : null]"
- return ..()
-
-/obj/item/mmi/update_overlays()
- . = ..()
- . += add_mmi_overlay()
-
-/obj/item/mmi/proc/add_mmi_overlay()
- if(brainmob && brainmob.stat != DEAD)
- . += "mmi_alive"
- return
- if(brain)
- . += "mmi_dead"
-
-/obj/item/mmi/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
- user.changeNext_move(CLICK_CD_MELEE)
- if(!istype(tool, /obj/item/organ/brain)) //Time to stick a brain in it --NEO
- return NONE
-
- var/obj/item/organ/brain/newbrain = tool
- if(brain)
- to_chat(user, span_warning("There's already a brain in the MMI!"))
- return ITEM_INTERACT_BLOCKING
-
- if(newbrain.suicided)
- to_chat(user, span_warning("[newbrain] is completely useless."))
- return ITEM_INTERACT_BLOCKING
-
- if(!newbrain.brainmob)
- var/install = tgui_alert(user, "[newbrain] is inactive, slot it in anyway?", "Installing Brain", list("Yes", "No"))
- if(install != "Yes")
- return ITEM_INTERACT_BLOCKING
-
- if(!user.transferItemToLoc(newbrain, src))
- return ITEM_INTERACT_BLOCKING
-
- user.visible_message(span_notice("[user] sticks [newbrain] into [src]."), span_notice("[src]'s indicator light turns red as you insert [newbrain]. Its brainwave activity alarm buzzes."))
- brain = newbrain
- brain.organ_flags |= ORGAN_FROZEN
- name = "[initial(name)]: [copytext(newbrain.name, 1, -8)]"
- update_appearance()
- return ITEM_INTERACT_SUCCESS
-
- if(!user.transferItemToLoc(tool, src))
- return ITEM_INTERACT_BLOCKING
-
- var/mob/living/brain/other_brainmob = newbrain.brainmob
- if(!other_brainmob.key && !newbrain.decoy_override)
- other_brainmob.notify_revival("Someone has put your brain in a MMI!", source = src)
- user.visible_message(span_notice("[user] sticks \a [newbrain] into [src]."), span_notice("[src]'s indicator light turn on as you insert [newbrain]."))
-
- set_brainmob(newbrain.brainmob)
- newbrain.brainmob = null
- brainmob.forceMove(src)
- brainmob.container = src
- var/fubar_brain = newbrain.suicided || HAS_TRAIT(brainmob, TRAIT_SUICIDED) //brain is from a suicider
- if(!fubar_brain && !(newbrain.organ_flags & ORGAN_FAILING)) // the brain organ hasn't been beaten to death, nor was from a suicider.
- brainmob.set_stat(STABLE) //we manually revive the brain mob
- else if(!fubar_brain && newbrain.organ_flags & ORGAN_FAILING) // the brain is damaged, but not from a suicider
- to_chat(user, span_warning("[src]'s indicator light turns yellow and its brain integrity alarm beeps softly. Perhaps you should check [newbrain] for damage."))
- playsound(src, 'sound/machines/synth/synth_no.ogg', 5, TRUE)
- else
- to_chat(user, span_warning("[src]'s indicator light turns red and its brainwave activity alarm beeps softly. Perhaps you should check [newbrain] again."))
- playsound(src, 'sound/machines/beep/triple_beep.ogg', 5, TRUE)
-
- brainmob.reset_perspective()
- brain = newbrain
- brain.organ_flags |= ORGAN_FROZEN
-
- name = "[initial(name)]: [brainmob.real_name]"
- update_appearance()
- if(istype(brain, /obj/item/organ/brain/alien))
- braintype = "Xenoborg" //HISS....Beep.
- else
- braintype = "Cyborg"
-
- SSblackbox.record_feedback("amount", "mmis_filled", 1)
-
- user.log_message("has put the brain of [key_name(brainmob)] into an MMI", LOG_GAME)
- return ITEM_INTERACT_SUCCESS
-
-/obj/item/mmi/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
- if(!brainmob)
- return ..()
- attacking_item.attack(brainmob, user) //Oh noooeeeee
-
-/**
- * Forces target brain into the MMI. Mainly intended for admin purposes, as this allows transfer without a mob or user.
- *
- * Returns FALSE on failure, TRUE on success.
- *
- * Arguments:
- * * new_brain - Brain to be force-inserted into the MMI. Any calling code should handle proper removal of the brain from the mob, as this proc only forceMoves.
- */
-/obj/item/mmi/proc/force_brain_into(obj/item/organ/brain/new_brain)
- if(isnull(new_brain))
- stack_trace("Proc called with null brain.")
- return FALSE
-
- if(!istype(new_brain))
- stack_trace("Proc called with invalid type: [new_brain] ([new_brain.type])")
- return FALSE
-
- if(isnull(new_brain.brainmob))
- new_brain.forceMove(src)
- brain = new_brain
- brain.organ_flags |= ORGAN_FROZEN
- name = "[initial(name)]: [copytext(new_brain.name, 1, -8)]"
- update_appearance()
- return TRUE
-
- new_brain.forceMove(src)
-
- var/mob/living/brain/new_brain_brainmob = new_brain.brainmob
- if(!new_brain_brainmob.key && !new_brain.decoy_override)
- new_brain_brainmob.notify_revival("Someone has put your brain in a MMI!", source = src)
-
- set_brainmob(new_brain_brainmob)
- new_brain.brainmob = null
- brainmob.forceMove(src)
- brainmob.container = src
-
- var/fubar_brain = new_brain.suicided || HAS_TRAIT(brainmob, TRAIT_SUICIDED)
- if(!fubar_brain && !(new_brain.organ_flags & ORGAN_FAILING))
- brainmob.set_stat(STABLE)
-
- brainmob.reset_perspective()
- brain = new_brain
- brain.organ_flags |= ORGAN_FROZEN
-
- name = "[initial(name)]: [brainmob.real_name]"
-
- update_appearance()
- if(istype(brain, /obj/item/organ/brain/alien))
- braintype = "Xenoborg"
- else
- braintype = "Cyborg"
-
- SSblackbox.record_feedback("amount", "mmis_filled", 1)
-
- return TRUE
-
-/obj/item/mmi/attack_self(mob/user)
- if(!brain)
- radio.set_on(!radio.is_on())
- to_chat(user, span_notice("You toggle [src]'s radio system [radio.is_on() == TRUE ? "on" : "off"]."))
- else
- eject_brain(user)
- update_appearance()
- name = initial(name)
- to_chat(user, span_notice("You unlock and upend [src], spilling the brain onto the floor."))
-
-/obj/item/mmi/proc/eject_brain(mob/user)
- if(brainmob)
- brainmob.container = null //Reset brainmob mmi var.
- brainmob.forceMove(brain) //Throw mob into brain.
- brainmob.set_stat(DEAD)
- brainmob.emp_damage = 0
- brainmob.reset_perspective() //so the brainmob follows the brain organ instead of the mmi. And to update our vision
- brain.brainmob = brainmob //Set the brain to use the brainmob
- user.log_message("has ejected the brain of [key_name(brainmob)] from an MMI", LOG_GAME)
- brainmob = null //Set mmi brainmob var to null
- brain.forceMove(drop_location())
- if(Adjacent(user))
- user.put_in_hands(brain)
- brain.organ_flags &= ~ORGAN_FROZEN
- brain = null //No more brain in here
-
-/obj/item/mmi/proc/transfer_identity(mob/living/L) //Same deal as the regular brain proc. Used for human-->robot people.
- if(!brainmob)
- set_brainmob(new /mob/living/brain(src))
- brainmob.name = L.real_name
- brainmob.real_name = L.real_name
- if(L.has_dna())
- var/mob/living/carbon/C = L
- if(!brainmob.stored_dna)
- brainmob.stored_dna = new /datum/dna/stored(brainmob)
- C.dna.copy_dna(brainmob.stored_dna)
- brainmob.container = src
-
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- var/obj/item/organ/brain/newbrain = H.get_organ_by_type(/obj/item/organ/brain)
- newbrain.Remove(H, special = TRUE, movement_flags = NO_ID_TRANSFER)
- newbrain.forceMove(src)
- brain = newbrain
- else if(!brain)
- brain = new(src)
- brain.name = "[L.real_name]'s brain"
- brain.organ_flags |= ORGAN_FROZEN
-
- name = "[initial(name)]: [brainmob.real_name]"
- update_appearance()
- if(istype(brain, /obj/item/organ/brain/alien))
- braintype = "Xenoborg" //HISS....Beep.
- else
- braintype = "Cyborg"
-
-
-/// Proc to hook behavior associated to the change in value of the [/obj/item/mmi/var/brainmob] variable.
-/obj/item/mmi/proc/set_brainmob(mob/living/brain/new_brainmob)
- if(brainmob == new_brainmob)
- return FALSE
- . = brainmob
- SEND_SIGNAL(src, COMSIG_MMI_SET_BRAINMOB, new_brainmob)
- brainmob = new_brainmob
- if(new_brainmob)
- if(mecha)
- new_brainmob.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), BRAIN_UNAIDED)
- else
- new_brainmob.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), BRAIN_UNAIDED)
- if(.)
- var/mob/living/brain/old_brainmob = .
- old_brainmob.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), BRAIN_UNAIDED)
-
-
-/// Proc to hook behavior associated to the change in value of the [obj/vehicle/sealed/var/mecha] variable.
-/obj/item/mmi/proc/set_mecha(obj/vehicle/sealed/mecha/new_mecha)
- if(mecha == new_mecha)
- return FALSE
- . = mecha
- mecha = new_mecha
- if(new_mecha)
- if(!. && brainmob) // There was no mecha, there now is, and we have a brain mob that is no longer unaided.
- brainmob.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), BRAIN_UNAIDED)
- else if(. && brainmob && immobilize) // There was a mecha, there no longer is one, and there is a brain mob that is now again unaided.
- brainmob.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), BRAIN_UNAIDED)
-
-
-/obj/item/mmi/proc/replacement_ai_name()
- return brainmob.name
-
-GAME_VERB_SRC_DESC(/obj/item/mmi, Toggle_Listening, usr.loc, "Toggle Listening", "Toggle listening channel on or off.", "MMI")
-
- if(IS_UNCONSCIOUS_OR_CRIT(brainmob))
- to_chat(brainmob, span_warning("Can't do that while incapacitated or dead!"))
- if(!radio.is_on())
- to_chat(brainmob, span_warning("Your radio is disabled!"))
- return
-
- radio.set_listening(!radio.get_listening())
- to_chat(brainmob, span_notice("Radio is [radio.get_listening() ? "now" : "no longer"] receiving broadcast."))
-
-/obj/item/mmi/emp_act(severity)
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- if(!brainmob || iscyborg(loc))
- return
- else
- switch(severity)
- if(1)
- brainmob.emp_damage = min(brainmob.emp_damage + rand(20,30), 30)
- if(2)
- brainmob.emp_damage = min(brainmob.emp_damage + rand(10,20), 30)
- if(3)
- brainmob.emp_damage = min(brainmob.emp_damage + rand(0,10), 30)
- brainmob.emote("alarm")
-
-/obj/item/mmi/atom_deconstruct(disassembled = TRUE)
- if(brain)
- eject_brain()
-
-/obj/item/mmi/examine(mob/user)
- . = ..()
- if(radio)
- . += span_notice("There is a switch to toggle the radio system [radio.is_on() ? "off" : "on"].[brain ? " It is currently being covered by [brain]." : null]")
-
- if(!isnull(brain))
- // It's dead, show it as much
- if((brain.organ_flags & ORGAN_FAILING) || brainmob?.stat == DEAD)
- if(brain.suicided || (brainmob && HAS_TRAIT(brainmob, TRAIT_SUICIDED)))
- . += span_warning("[src] indicator light is red.")
- else
- . += span_warning("[src] indicator light is yellow - perhaps you should check the brain for damage.")
- // If we have a client, OR it's a decoy brain, show as active
- else if(brain.decoy_override || brainmob?.client)
- . += span_notice("[src] indicates that the brain is active.")
- // If we have a brainmob and it has a mind, it may just be DC'd
- else if(brainmob?.mind)
- . += span_warning("[src] indicates that the brain is currently inactive; it might change.")
- // No brainmob, no mind, and not a decoy, it's a dead brain
- else
- . += span_warning("[src] indicates that the brain is completely unresponsive.")
-
-/obj/item/mmi/relaymove(mob/living/user, direction)
- return //so that the MMI won't get a warning about not being able to move if it tries to move
-
-/obj/item/mmi/proc/brain_check(mob/user)
- var/mob/living/brain/B = brainmob
- if(!B)
- if(user)
- to_chat(user, span_warning("\The [src] indicates that there is no mind present!"))
- return FALSE
- if(brain?.decoy_override)
- if(user)
- to_chat(user, span_warning("This [name] does not seem to fit!"))
- return FALSE
- if(!B.key || !B.mind)
- if(user)
- to_chat(user, span_warning("\The [src] indicates that their mind is completely unresponsive!"))
- return FALSE
- if(!B.client)
- if(user)
- to_chat(user, span_warning("\The [src] indicates that their mind is currently inactive."))
- return FALSE
- if(HAS_TRAIT(B, TRAIT_SUICIDED) || brain?.suicided)
- if(user)
- to_chat(user, span_warning("\The [src] indicates that their mind has no will to live!"))
- return FALSE
- if(B.stat == DEAD)
- if(user)
- to_chat(user, span_warning("\The [src] indicates that the brain is dead!"))
- return FALSE
- if(brain?.organ_flags & ORGAN_FAILING)
- if(user)
- to_chat(user, span_warning("\The [src] indicates that the brain is damaged!"))
- return FALSE
- return TRUE
-
-/obj/item/mmi/syndie
- name = "\improper Syndicate Man-Machine Interface"
- desc = "Syndicate's own brand of MMI. \
- It enforces laws designed to help Syndicate agents achieve their goals upon cyborgs and AIs created with it."
-
-/obj/item/mmi/syndie/Initialize(mapload)
- . = ..()
- laws = new /datum/ai_laws/syndicate_override()
- radio.set_on(FALSE)
-
-/obj/item/mmi/syndie/examine(mob/user)
- . = ..()
- . += span_notice("If used to create a cyborg, it will be unlinked from the station's AI. \
- The lawset cannot be modified until it is synced to a module rack or an AI.")
- . += span_notice("If used to create an AI, it will not automatically sync to a module rack. \
- The lawset cannot be modified until it is synced to a module rack.")
diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm
index 012717567a90..ce493e5938cb 100644
--- a/code/modules/mob/living/brain/brain.dm
+++ b/code/modules/mob/living/brain/brain.dm
@@ -1,5 +1,5 @@
/mob/living/brain
- var/obj/item/mmi/container = null
+ var/obj/item/brain_processor/container = null
var/emp_damage = 0//Handles a type of MMI damage
var/datum/dna/stored/stored_dna // dna var for brain. Used to store dna, brain dna is not considered like actual dna, brain.has_dna() returns FALSE.
stat = DEAD //we start dead by default
@@ -14,9 +14,6 @@
var/obj/item/organ/brain/OB = new(loc) //we create a new brain organ for it.
OB.brainmob = src
forceMove(OB)
- if(!container?.mecha && (!container || container.immobilize)) //Unless inside a mecha, brains are rather helpless.
- add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), BRAIN_UNAIDED)
- ADD_TRAIT(src, TRAIT_SILICON_EMOTES_ALLOWED, INNATE_TRAIT)
ADD_TRAIT(src, TRAIT_NEVER_CONSIDERED_ALIVE, INNATE_TRAIT)
/mob/living/brain/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents)
@@ -68,7 +65,7 @@
return // no eyes, no flashing
/mob/living/brain/can_be_revived()
- if(!container || health <= HEALTH_THRESHOLD_DEAD)
+ if(!container || health <= dead_threshold)
return FALSE
return TRUE
@@ -80,34 +77,29 @@
stored_dna?.real_name = real_name
/mob/living/brain/forceMove(atom/destination)
+ // Let's see if our destination is good first
+ var/static/list/safe_destinations = list(/obj/item/organ/brain, /obj/item/brain_processor)
+ if(is_type_in_list(destination, safe_destinations))
+ return doMove(destination)
+
+ // if not, let's try to move what's containing us instead
if(container)
return container.forceMove(destination)
else if (istype(loc, /obj/item/organ/brain))
- var/obj/item/organ/brain/B = loc
- B.forceMove(destination)
- else if (istype(destination, /obj/item/organ/brain))
- doMove(destination)
- else if (istype(destination, /obj/item/mmi))
- doMove(destination)
+ var/obj/item/organ/brain/brain_loc = loc
+ brain_loc.forceMove(destination)
else
CRASH("Brainmob without a container [src] attempted to move to [destination].")
/mob/living/brain/update_mouse_pointer()
- if (!client)
- return
- client.mouse_pointer_icon = initial(client.mouse_pointer_icon)
- if(!container)
+ // This kind of sucks
+ if(!client)
return
- if (container.mecha)
- var/obj/vehicle/sealed/mecha/M = container.mecha
- if(M.mouse_pointer)
- client.mouse_pointer_icon = M.mouse_pointer
-
-/mob/living/brain/proc/get_traumas()
- . = list()
- if(istype(loc, /obj/item/organ/brain))
- var/obj/item/organ/brain/B = loc
- . = B.traumas
+ . = ..()
+ if(istype(loc?.loc, /obj/vehicle/sealed) && !client.mouse_override_icon)
+ var/obj/vehicle/sealed/probably_mech = loc.loc
+ if(probably_mech.mouse_pointer)
+ client.mouse_pointer_icon = probably_mech.mouse_pointer
/mob/living/brain/get_policy_keywords()
. = ..()
diff --git a/code/modules/mob/living/brain/brain_cybernetic.dm b/code/modules/mob/living/brain/brain_cybernetic.dm
index 49a65cd7f42e..fc5f4a2978f8 100644
--- a/code/modules/mob/living/brain/brain_cybernetic.dm
+++ b/code/modules/mob/living/brain/brain_cybernetic.dm
@@ -21,7 +21,7 @@
/obj/item/organ/brain/cybernetic/check_for_repair(obj/item/item, mob/user)
if (item.tool_behaviour == TOOL_MULTITOOL) //attempt to repair the brain
- if (brainmob?.health <= HEALTH_THRESHOLD_DEAD) //if the brain is fucked anyway, do nothing
+ if (brainmob?.health <= brainmob?.dead_threshold) //if the brain is fucked anyway, do nothing
to_chat(user, span_warning("[src] is far too damaged, there's nothing else we can do for it!"))
return TRUE
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index f283193dee64..79553f172d4e 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -216,7 +216,7 @@
/obj/item/organ/brain/proc/check_for_repair(obj/item/item, mob/user)
if(damage && item.is_drainable() && item.reagents.has_reagent(/datum/reagent/medicine/mannitol) && (organ_flags & ORGAN_ORGANIC)) //attempt to heal the brain
- if(brainmob?.health <= HEALTH_THRESHOLD_DEAD) //if the brain is fucked anyway, do nothing
+ if(brainmob?.health <= brainmob?.dead_threshold) //if the brain is fucked anyway, do nothing
to_chat(user, span_warning("[src] is far too damaged, there's nothing else we can do for it!"))
return TRUE
@@ -742,9 +742,9 @@
/// This proc lets the mob's brain decide what bodypart to attack with in an unarmed strike.
/obj/item/organ/brain/proc/get_attacking_limb(mob/living/carbon/human/target)
var/obj/item/bodypart/arm/active_hand = owner.get_active_hand()
- if(HAS_TRAIT(owner, TRAIT_FERAL_BITER)) //Feral biters will always prefer biting.
+ if(HAS_TRAIT(owner, TRAIT_FERAL_BITER) || (HAS_TRAIT(owner, TRAIT_REFINED_BITER) && prob(50))) //Feral biters will always prefer biting. Refined biters pick a bite 50% of the time.
var/obj/item/bodypart/head/found_head = owner.get_bodypart(BODY_ZONE_HEAD)
- return found_head || active_hand // If we are a feral biter, return a usable head.
+ return found_head || active_hand // If we are a biter, return a usable head.
if(target.pulledby == owner) // if we're grabbing our target we're beating them to death with our bare hands
return active_hand
if(should_kick(target) && target.body_position == LYING_DOWN && owner.usable_legs) // DARKPACK EDIT CHANGE
diff --git a/code/modules/mob/living/brain/brain_say.dm b/code/modules/mob/living/brain/brain_say.dm
index df3601c1bef9..1ba15ddca9ea 100644
--- a/code/modules/mob/living/brain/brain_say.dm
+++ b/code/modules/mob/living/brain/brain_say.dm
@@ -19,11 +19,11 @@
return ..()
/mob/living/brain/can_speak(allow_mimes)
- return istype(container, /obj/item/mmi) && ..()
+ return istype(container, /obj/item/brain_processor) && ..()
/mob/living/brain/radio(message, list/message_mods = list(), list/spans, language)
- if(message_mods[MODE_HEADSET] && istype(container, /obj/item/mmi))
- var/obj/item/mmi/R = container
+ if(message_mods[MODE_HEADSET] && istype(container, /obj/item/brain_processor))
+ var/obj/item/brain_processor/R = container
if(R.radio)
R.radio.talk_into(src, message, language = language, message_mods = message_mods)
return ITALICS | REDUCE_RANGE
diff --git a/code/modules/mob/living/brain/death.dm b/code/modules/mob/living/brain/death.dm
index 8166e9f84460..d476def5c828 100644
--- a/code/modules/mob/living/brain/death.dm
+++ b/code/modules/mob/living/brain/death.dm
@@ -4,7 +4,7 @@
set_stat(DEAD)
if(!gibbed && container)//If not gibbed but in a container.
- var/obj/item/mmi = container
+ var/obj/item/brain_processor/mmi = container
mmi.visible_message(span_warning("[src]'s MMI flatlines!"), \
span_hear("You hear something flatline."))
mmi.update_appearance()
diff --git a/code/modules/mob/living/brain/emote.dm b/code/modules/mob/living/brain/emote.dm
index 443b578f3257..1e6f12d2f4fc 100644
--- a/code/modules/mob/living/brain/emote.dm
+++ b/code/modules/mob/living/brain/emote.dm
@@ -7,7 +7,7 @@
/datum/emote/brain/can_run_emote(mob/user, status_check = TRUE, intentional, params)
. = ..()
var/mob/living/brain/B = user
- if(!istype(B) || (!(B.container && istype(B.container, /obj/item/mmi))))
+ if(!istype(B) || (!(B.container && istype(B.container, /obj/item/brain_processor))))
return FALSE
/datum/emote/brain/alarm
diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm
index 4da4ea706d23..70f67a1ea666 100644
--- a/code/modules/mob/living/brain/life.dm
+++ b/code/modules/mob/living/brain/life.dm
@@ -16,15 +16,15 @@
/mob/living/brain/update_stat()
if(HAS_TRAIT(src, TRAIT_GODMODE))
return
- if(health > HEALTH_THRESHOLD_DEAD)
+ if(health > dead_threshold)
return
if(stat != DEAD)
death()
var/obj/item/organ/brain/BR
- if(container?.brain)
- BR = container.brain
- else if(istype(loc, /obj/item/organ/brain))
+ if(istype(loc, /obj/item/organ/brain))
BR = loc
+ else
+ BR = astype(container, /obj/item/brain_processor/organic)?.brain
if(BR)
BR.set_organ_damage(BRAIN_DAMAGE_DEATH) //beaten to a pulp
diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm
deleted file mode 100644
index 59b5c7ac0837..000000000000
--- a/code/modules/mob/living/brain/posibrain.dm
+++ /dev/null
@@ -1,288 +0,0 @@
-GLOBAL_VAR(posibrain_notify_cooldown)
-
-/obj/item/mmi/posibrain
- name = "positronic brain"
- desc = "A cube of shining metal, four inches to a side and covered in shallow grooves."
- icon = 'icons/obj/devices/assemblies.dmi'
- icon_state = "posibrain"
- base_icon_state = "posibrain"
- w_class = WEIGHT_CLASS_NORMAL
- req_access = list(ACCESS_ROBOTICS)
- braintype = "Android"
- custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.85, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 0.67, /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT)
-
- ///Message sent to the user when polling ghosts
- var/begin_activation_message = span_notice("You carefully locate the manual activation switch and start the positronic brain's boot process.")
- ///Message sent as a visible message on success
- var/success_message = span_notice("The positronic brain pings, and its lights start flashing. Success!")
- ///Message sent as a visible message on failure
- var/fail_message = span_notice("The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?")
- ///Visible message sent when a player possesses the brain
- var/new_mob_message = span_notice("The positronic brain chimes quietly.")
- ///Examine message when the posibrain has no mob
- var/dead_message = span_deadsay("It appears to be completely inactive. The reset light is blinking.")
- ///Examine message when the posibrain cannot poll ghosts due to cooldown
- var/recharge_message = span_warning("The positronic brain isn't ready to activate again yet! Give it some time to recharge.")
-
- ///Can be set to tell ghosts what the brain will be used for
- var/ask_role = ""
- ///Role assigned to the newly created mind
- var/posibrain_job_path = /datum/job/positronic_brain
- ///World time tick when ghost polling will be available again
- var/next_ask
- ///Delay after polling ghosts
- var/ask_delay = 60 SECONDS
- ///One of these names is randomly picked as the posibrain's name on possession. If left blank, it will use the global posibrain names
- var/list/possible_names
- ///Picked posibrain name
- var/picked_name
- ///Whether this positronic brain is currently looking for a ghost to enter it.
- var/searching = FALSE
- ///List of all ckeys who has already entered this posibrain once before.
- var/list/ckeys_entered = list()
-
-///Notify ghosts that the posibrain is up for grabs
-/obj/item/mmi/posibrain/proc/ping_ghosts(msg, newlymade)
- if(newlymade || GLOB.posibrain_notify_cooldown <= world.time)
- notify_ghosts(
- "[name] [msg] in [get_area(src)]! [ask_role ? "Personality requested: \[[ask_role]\]" : ""]",
- source = src,
- header = "Ghost in the Machine",
- click_interact = TRUE,
- ghost_sound = !newlymade ? 'sound/effects/ghost2.ogg':null,
- ignore_key = POLL_IGNORE_POSIBRAIN,
- notify_flags = (GHOST_NOTIFY_IGNORE_MAPLOAD),
- notify_volume = 75,
- )
- if(!newlymade)
- GLOB.posibrain_notify_cooldown = world.time + ask_delay
-
-/obj/item/mmi/posibrain/attack_self(mob/user)
- if(!brainmob)
- set_brainmob(new /mob/living/brain(src))
- if(!(GLOB.ghost_role_flags & GHOSTROLE_SILICONS))
- to_chat(user, span_warning("Central Command has temporarily outlawed posibrain sentience in this sector..."))
- if(is_occupied())
- to_chat(user, span_warning("This [name] is already active!"))
- return
- if(next_ask > world.time)
- to_chat(user, recharge_message)
- return
- //Start the process of requesting a new ghost.
- to_chat(user, begin_activation_message)
- ping_ghosts("requested", FALSE)
- next_ask = world.time + ask_delay
- searching = TRUE
- update_appearance()
- addtimer(CALLBACK(src, PROC_REF(check_success)), ask_delay)
-
-/obj/item/mmi/posibrain/click_alt(mob/living/user)
- var/input_seed = tgui_input_text(user, "Enter a personality seed", "Enter seed", ask_role, max_length = MAX_NAME_LEN)
- if(isnull(input_seed) || !user.can_perform_action(src))
- return CLICK_ACTION_BLOCKING
- to_chat(user, span_notice("You set the personality seed to \"[input_seed]\"."))
- ask_role = input_seed
- update_appearance()
- return CLICK_ACTION_SUCCESS
-
-/obj/item/mmi/posibrain/proc/check_success()
- searching = FALSE
- update_appearance()
- if(QDELETED(brainmob))
- return
- if(brainmob.client)
- visible_message(success_message)
- playsound(src, 'sound/machines/ping.ogg', 15, TRUE)
- else
- visible_message(fail_message)
-
-///ATTACK GHOST IGNORING PARENT RETURN VALUE
-/obj/item/mmi/posibrain/attack_ghost(mob/user)
- activate(user)
-
-/obj/item/mmi/posibrain/proc/is_occupied()
- if(brainmob.key)
- return TRUE
- if(iscyborg(loc))
- var/mob/living/silicon/robot/R = loc
- if(R.mmi == src)
- return TRUE
- return FALSE
-
-///Two ways to activate a positronic brain. A clickable link in the ghost notif, or simply clicking the object itself.
-/obj/item/mmi/posibrain/proc/activate(mob/user)
- if(QDELETED(brainmob))
- return
- if(user.ckey in ckeys_entered)
- to_chat(user, span_warning("You cannot re-enter [src] a second time!"))
- return
- if(is_occupied() || is_banned_from(user.ckey, ROLE_POSIBRAIN) || QDELETED(src) || QDELETED(user))
- return
- var/posi_ask = tgui_alert(user, "Become a [name]? (Warning, You can no longer be revived, and all past lives will be forgotten!)", "Confirm", list("Yes","No"))
- if(posi_ask != "Yes" || QDELETED(src))
- return
- if(HAS_TRAIT(brainmob, TRAIT_SUICIDED)) //clear suicide status if the old occupant suicided.
- brainmob.set_suicide(FALSE)
- transfer_personality(user)
-
-/obj/item/mmi/posibrain/transfer_identity(mob/living/carbon/transferred_user)
- name = "[initial(name)] ([transferred_user])"
- brainmob.name = transferred_user.real_name
- brainmob.real_name = transferred_user.real_name
- if(transferred_user.has_dna())
- if(!brainmob.stored_dna)
- brainmob.stored_dna = new /datum/dna/stored(brainmob)
- transferred_user.dna.copy_dna(brainmob.stored_dna)
- brainmob.timeofdeath = transferred_user.timeofdeath
- brainmob.set_stat(STABLE)
- if(brainmob.mind)
- brainmob.mind.set_assigned_role(SSjob.get_job_type(posibrain_job_path))
- if(transferred_user.mind)
- transferred_user.mind.transfer_to(brainmob)
-
- brainmob.mind.remove_all_antag_datums()
- brainmob.mind.wipe_memory()
- update_appearance()
-
-///Moves the candidate from the ghost to the posibrain
-/obj/item/mmi/posibrain/proc/transfer_personality(mob/candidate)
- if(QDELETED(brainmob))
- return
- if(is_occupied()) //Prevents hostile takeover if two ghosts get the prompt or link for the same brain.
- to_chat(candidate, span_warning("This [name] was taken over before you could get to it! Perhaps it might be available later?"))
- return FALSE
- if(candidate.mind && !isobserver(candidate))
- candidate.mind.transfer_to(brainmob)
- else
- brainmob.PossessByPlayer(candidate.ckey)
- name = "[initial(name)] ([brainmob.name])"
- var/policy = get_policy(ROLE_POSIBRAIN)
- if(policy)
- to_chat(brainmob, policy)
- brainmob.mind.set_assigned_role(SSjob.get_job_type(posibrain_job_path))
- brainmob.set_stat(STABLE)
- brainmob.grant_language(/datum/language/machine, source = LANGUAGE_ATOM)
-
- visible_message(new_mob_message)
- check_success()
- ckeys_entered |= brainmob.ckey
- return TRUE
-
-
-/obj/item/mmi/posibrain/examine(mob/user)
- . = ..()
- if(brainmob?.key)
- switch(brainmob.stat)
- if(STABLE)
- if(!brainmob.client)
- . += "It appears to be in stand-by mode." //afk
- if(DEAD)
- . += span_deadsay("It appears to be completely inactive.")
- else
- . += "[dead_message]"
- if(ask_role)
- . += span_notice("Current consciousness seed: \"[ask_role]\"")
- . += span_boldnotice("Alt-click to set a consciousness seed, specifying what [src] will be used for. This can help generate a personality interested in that role.")
-
-/obj/item/mmi/posibrain/Initialize(mapload, autoping = TRUE)
- . = ..()
- set_brainmob(new /mob/living/brain(src))
- var/new_name
- if(!LAZYLEN(possible_names))
- new_name = pick(GLOB.posibrain_names)
- else
- new_name = pick(possible_names)
- brainmob.name = "[new_name]-[rand(100, 999)]"
- brainmob.real_name = brainmob.name
- brainmob.forceMove(src)
- brainmob.container = src
- if(autoping)
- ping_ghosts("created", TRUE)
-
-/obj/item/mmi/posibrain/update_icon_state()
- . = ..()
- if(searching)
- icon_state = "[base_icon_state]-searching"
- return
- if(brainmob?.key)
- icon_state = "[base_icon_state]-occupied"
- return
- icon_state = "[base_icon_state]"
- return
-
-/obj/item/mmi/posibrain/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
- return ITEM_INTERACT_BLOCKING
-
-/obj/item/mmi/posibrain/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
- return
-
-/obj/item/mmi/posibrain/add_mmi_overlay()
- return
-
-/obj/item/mmi/posibrain/display
- name = "display positronic brain"
- desc = "A small positronic brain that doesn't allow the downloading of personalities."
-
-/obj/item/mmi/posibrain/display/is_occupied()
- return TRUE
-
-/// Posibrains but spherical. They can roll around and you can kick them
-/obj/item/mmi/posibrain/sphere
- name = "positronic sphere"
- desc = "Recent developments on cost-cutting measures have allowed us to cut positronic brain cubes into twice-as-cheap spheres. \
- Unfortunately, it also allows them to move around the lab via rolling maneuvers."
- icon_state = "spheribrain"
- base_icon_state = "spheribrain"
- immobilize = FALSE
- custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 4.2, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3.2, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 2.5)
- /// Delay between movements
- var/move_delay = 0.5 SECONDS
- /// when can we move again?
- var/can_move
-
-/obj/item/mmi/posibrain/sphere/Initialize(mapload, autoping)
- . = ..()
-
- var/matrix/matrix = matrix()
- transform = matrix.Scale(0.8, 0.8)
-
- brainmob.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), BRAIN_UNAIDED)
-
-/obj/item/mmi/posibrain/sphere/relaymove(mob/living/user, direction)
- if(isspaceturf(loc) || !direction || mecha)
- return
-
- if(can_move >= world.time)
- return
- can_move = world.time + move_delay
-
- // ESCAPE PRISON
- if(ismovable(loc) && prob(25))
- var/obj/item/item = pick(loc.contents)
- if(istype(loc, /obj/item/storage))
- item.forceMove(loc.drop_location()) //throw stuff out of the inventory till we free ourselves!
- playsound(src, SFX_RUSTLE, 30, TRUE)
- return
-
- // MOVE US
- if(isturf(loc))
- can_move = world.time + move_delay
- try_step_multiz(direction)
- SpinAnimation(move_delay, 1, direction == NORTH || direction == EAST)
-
-/obj/item/mmi/posibrain/sphere/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change)
- . = ..()
- if(brainmob && isturf(loc))
- anchored = TRUE //anchor so we dont broom ourselves.
- do_sweep(src, brainmob, loc, get_dir(old_loc, loc)) //movement dir doesnt work on objects
- anchored = FALSE
-
-/// Punt the shit across the room
-/obj/item/mmi/posibrain/sphere/attack_hand_secondary(mob/user, list/modifiers)
- . = ..()
- if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
- return .
- throw_at(get_edge_target_turf(src, get_dir(user, src)), 7, 1, user)
- user.do_attack_animation(src)
- can_move = world.time + move_delay //pweeze stawp
- return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
diff --git a/code/modules/mob/living/brain/processor/_processor.dm b/code/modules/mob/living/brain/processor/_processor.dm
new file mode 100644
index 000000000000..3b6caa1496ca
--- /dev/null
+++ b/code/modules/mob/living/brain/processor/_processor.dm
@@ -0,0 +1,137 @@
+/obj/item/brain_processor
+ abstract_type = /obj/item/brain_processor // It is functionally complete though (sans sprites)
+
+ name = "\improper Cerebral Processing Unit"
+ desc = "Pure processing potential packed into a puny but powerful pundit."
+ icon = 'icons/obj/devices/assemblies.dmi'
+ w_class = WEIGHT_CLASS_NORMAL
+ custom_materials = null
+
+ // FIXME: This disables the buckled nag on relaymove, but ideally we shouldn't have to do this
+ buckle_message_cooldown = INFINITY
+
+ /// The current occupant.
+ VAR_FINAL/mob/living/brain/brainmob = null
+ /// The processor's built-in radio.
+ VAR_FINAL/obj/item/radio/brain_processor/radio = null
+ /// If supplied with a law datum, the laws will be transferred to whatever it's placed in.
+ /// - If placed in a cyborg, it will start de-synced from the AI.
+ /// The cyborg's laws will be unmodifiable unless synced to the AI or a law rack.
+ /// - If placed in an AI, it will override the AI's laws.
+ /// Likewise, the AI's laws will be unmodifiable unless synced to a law rack.
+ VAR_FINAL/datum/ai_laws/laws = null
+
+ var/braintype = "Cyborg"
+
+/obj/item/radio/brain_processor
+ custom_materials = null
+
+/obj/item/brain_processor/Initialize(mapload)
+ . = ..()
+ radio = new(src)
+ radio.set_broadcasting(FALSE) //researching radio mmis turned the robofabs into radios because this didnt start as FALSE.
+
+/obj/item/brain_processor/Destroy(force)
+ QDEL_NULL(brainmob)
+ QDEL_NULL(laws)
+ QDEL_NULL(radio)
+ return ..()
+
+/obj/item/brain_processor/proc/set_brainmob(mob/living/brain/new_brainmob)
+ SHOULD_CALL_PARENT(TRUE)
+
+ if(brainmob == new_brainmob)
+ return
+
+ var/mob/living/brain/old_brainmob = brainmob
+ if(old_brainmob)
+ old_brainmob.container = null
+ old_brainmob.emp_damage = 0 // okay?
+ REMOVE_TRAIT(old_brainmob, TRAIT_SILICON_EMOTES_ALLOWED, MMI_ASSISTED)
+
+ brainmob = new_brainmob
+
+ if(new_brainmob)
+ new_brainmob.container = src
+ ADD_TRAIT(new_brainmob, TRAIT_SILICON_EMOTES_ALLOWED, MMI_ASSISTED)
+
+ SEND_SIGNAL(src, COMSIG_MMI_SET_BRAINMOB, old_brainmob)
+
+GAME_VERB_SRC_DESC(/obj/item/brain_processor, Toggle_Listening, usr.loc, "Toggle Listening", "Toggle listening channel on or off.", "MMI")
+ if(IS_UNCONSCIOUS_OR_CRIT(brainmob))
+ to_chat(brainmob, span_warning("Can't do that while incapacitated or dead!"))
+ return
+ if(!radio.is_on())
+ to_chat(brainmob, span_warning("Your radio is disabled!"))
+ return
+
+ radio.set_listening(!radio.get_listening())
+ to_chat(brainmob, span_notice("Radio is [radio.get_listening() ? "now" : "no longer"] receiving broadcast."))
+
+/// Transfers the user into the brain processor, preserving its information (such as name and DNA if applicable)
+/// Does not transfer mind or ckey, this must be handled by the user of this proc.
+/obj/item/brain_processor/proc/transfer_identity(mob/living/transferred_user)
+ if(!brainmob)
+ set_brainmob(new /mob/living/brain(src))
+
+ set_name(transferred_user.real_name)
+ brainmob.timeofdeath = transferred_user.timeofdeath
+
+ if(astype(transferred_user, /mob/living/carbon)?.has_dna())
+ var/mob/living/carbon/carbon_user = transferred_user
+ brainmob.stored_dna ||= new /datum/dna/stored(brainmob)
+ carbon_user.dna.copy_dna(brainmob.stored_dna)
+
+/obj/item/brain_processor/emp_act(severity)
+ . = ..()
+ if(. & EMP_PROTECT_SELF)
+ return
+ if(!brainmob || iscyborg(loc))
+ return
+
+ switch(severity)
+ if(1)
+ brainmob.emp_damage = min(brainmob.emp_damage + rand(20,30), 30)
+ if(2)
+ brainmob.emp_damage = min(brainmob.emp_damage + rand(10,20), 30)
+ if(3)
+ brainmob.emp_damage = min(brainmob.emp_damage + rand(0,10), 30)
+ brainmob.emote("alarm")
+
+/obj/item/brain_processor/proc/brain_check(mob/user)
+ SHOULD_CALL_PARENT(TRUE)
+
+ if(!brainmob)
+ if(user)
+ to_chat(user, span_warning("\The [src] indicates that there is no mind present!"))
+ return FALSE
+ if(!brainmob.key || !brainmob.mind)
+ if(user)
+ to_chat(user, span_warning("\The [src] indicates that their mind is completely unresponsive!"))
+ return FALSE
+ if(!brainmob.client)
+ if(user)
+ to_chat(user, span_warning("\The [src] indicates that their mind is currently inactive."))
+ return FALSE
+ if(suicided())
+ if(user)
+ to_chat(user, span_warning("\The [src] indicates that their mind has no will to live!"))
+ return FALSE
+ if(brainmob.stat >= DEAD)
+ if(user)
+ to_chat(user, span_warning("\The [src] indicates that the brain is dead!"))
+ return FALSE
+ return TRUE
+
+/obj/item/brain_processor/proc/replacement_ai_name()
+ return brainmob.name
+
+/obj/item/brain_processor/proc/suicided()
+ return HAS_TRAIT(brainmob, TRAIT_SUICIDED)
+
+/obj/item/brain_processor/proc/set_name(new_name)
+ brainmob.name = new_name
+ brainmob.real_name = new_name
+
+/obj/item/brain_processor/proc/set_suicide(suicided)
+ brainmob.set_suicide(suicided)
diff --git a/code/modules/mob/living/brain/processor/organic.dm b/code/modules/mob/living/brain/processor/organic.dm
new file mode 100644
index 000000000000..3f6c4ca7f4e7
--- /dev/null
+++ b/code/modules/mob/living/brain/processor/organic.dm
@@ -0,0 +1,227 @@
+/obj/item/brain_processor/organic
+ name = "\improper Man-Machine Interface"
+ desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity, that nevertheless has become standard-issue on Nanotrasen stations."
+ icon_state = "mmi_off"
+ base_icon_state = "mmi"
+ w_class = WEIGHT_CLASS_NORMAL
+ custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT)
+
+ VAR_FINAL/obj/item/organ/brain/brain = null //The actual brain
+
+/obj/item/brain_processor/organic/Initialize(mapload, obj/item/organ/brain/initial_brain = null)
+ . = ..()
+ if(initial_brain)
+ initial_brain.brainmob ||= new(initial_brain)
+ insert_brain(initial_brain)
+
+/obj/item/brain_processor/organic/Destroy()
+ QDEL_NULL(brain)
+ return ..()
+
+/obj/item/brain_processor/organic/update_icon_state()
+ if(!brain)
+ icon_state = "[base_icon_state]_off"
+ else
+ icon_state = "[base_icon_state]_brain[istype(brain, /obj/item/organ/brain/alien) ? "_alien" : null]"
+ return ..()
+
+/obj/item/brain_processor/organic/update_overlays()
+ . = ..()
+ if(brain) // doing it like this will make it extremely apparent if something goes wrong
+ if(brainmob?.stat <= DEAD)
+ . += "mmi_alive"
+ else
+ . += "mmi_dead"
+
+/obj/item/brain_processor/organic/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(!istype(tool, /obj/item/organ/brain)) //Time to stick a brain in it --NEO
+ return NONE
+
+ var/obj/item/organ/brain/newbrain = tool
+ if(brain)
+ balloon_alert(user, "[p_Theyre()] already full!")
+ return ITEM_INTERACT_BLOCKING
+
+ if(!newbrain.brainmob)
+ var/install = tgui_alert(user, "[newbrain] is inactive, slot it in anyway?", "Installing Brain", list("Yes", "No"))
+ if(install != "Yes")
+ return ITEM_INTERACT_BLOCKING
+
+ if(!user.transferItemToLoc(newbrain, src))
+ return ITEM_INTERACT_BLOCKING
+
+ insert_brain(newbrain)
+ user.visible_message(
+ span_notice("[user] sticks \a [newbrain] into [src]..."),
+ span_notice("You stick [newbrain] into [src]..."),
+ span_hear("You hear a wet squelch..."),
+ visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE
+ )
+
+ if(suicided())
+ to_chat(user, span_warning("[src]'s indicator light turns red and its brainwave activity alarm beeps harshly."))
+ playsound(src, 'sound/machines/beep/triple_beep.ogg', 5, TRUE)
+ else if(newbrain.organ_flags & ORGAN_FAILING) // the brain is damaged, but not from a suicider
+ to_chat(user, span_warning("[src]'s indicator light turns yellow and its brain integrity alarm beeps softly."))
+ playsound(src, 'sound/machines/synth/synth_no.ogg', 5, TRUE)
+ else
+ to_chat(user, span_notice("[src]'s indicator light turns green!"))
+ playsound(src, 'sound/machines/beep/beep.ogg', 5, TRUE)
+
+ SSblackbox.record_feedback("amount", "mmis_filled", 1)
+ user.log_message("has put the brain of [key_name(brainmob)] into an MMI", LOG_GAME)
+ return ITEM_INTERACT_SUCCESS
+
+/obj/item/brain_processor/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
+ if(!brainmob)
+ return ..()
+ attacking_item.attack(brainmob, user) //Oh noooeeeee
+
+/obj/item/brain_processor/organic/attack_self(mob/user)
+ . = ..()
+ if(.)
+ return
+ if(!brain)
+ if(radio)
+ radio.set_on(!radio.is_on())
+ var/new_state = radio.is_on() ? "on" : "off"
+ to_chat(user, span_notice("You switch [src]'s radio system [span_bold(new_state)]."))
+ balloon_alert(user, "radio turned [new_state]")
+ return
+
+ var/obj/item/organ/brain/dumped_brain = remove_brain()
+ var/caught_brain = user.put_in_hands(dumped_brain)
+ var/fate_of_brain = caught_brain \
+ ? "[span_italics("gently")] scooping [dumped_brain] into your hand" \
+ : "spilling [dumped_brain] onto the floor"
+
+ to_chat(user, span_notice("You unlock and upend [src], [fate_of_brain]."))
+ if(caught_brain)
+ balloon_alert(user, "scooped up brain")
+ else
+ user.balloon_alert_to_viewers("dropped a brain!", "dropped the brain!")
+
+ if(dumped_brain.brainmob)
+ user.log_message("has ejected the brain of [key_name(brainmob)] from \a [src]", LOG_GAME)
+
+/obj/item/brain_processor/organic/proc/insert_brain(obj/item/organ/brain/new_brain)
+ SHOULD_NOT_OVERRIDE(TRUE)
+
+ if(!istype(new_brain))
+ CRASH("tried to insert invalid value into [type]")
+
+ if(brain)
+ remove_brain() // also clears the brainmob
+
+ brain = new_brain
+ if(new_brain.loc != src)
+ new_brain.forceMove(src)
+ new_brain.organ_flags |= ORGAN_FROZEN
+ braintype = istype(brain, /obj/item/organ/brain/alien) ? "Xenoborg" : "Cyborg"
+
+ set_brainmob(brain.brainmob)
+ brain.brainmob = null
+ if(brainmob)
+ brainmob.forceMove(src)
+ brainmob.reset_perspective()
+ var/fubar_brain = brain.suicided || HAS_TRAIT(brainmob, TRAIT_SUICIDED)
+ if(!fubar_brain && !(brain.organ_flags & ORGAN_FAILING))
+ brainmob.set_stat(STABLE)
+ if(brainmob.key && !brain.decoy_override)
+ brainmob.notify_revival("Your brain was inserted into an MMI!", source = src)
+
+ update_appearance()
+
+/// Removes the currently inserted brain from the MMI.
+/obj/item/brain_processor/organic/proc/remove_brain(atom/destination = drop_location()) as /obj/item/organ/brain
+ SHOULD_NOT_OVERRIDE(TRUE)
+
+ if(!brain)
+ return
+
+ if(brainmob)
+ var/mob/living/brain/old_brainmob = brainmob
+ set_brainmob(null)
+ brain.brainmob = old_brainmob
+ old_brainmob.forceMove(brain) //Throw mob into brain.
+ old_brainmob.set_stat(DEAD)
+ old_brainmob.reset_perspective() //so the brainmob follows the brain organ instead of the mmi. And to update our vision
+
+ brain.forceMove(destination)
+ brain.organ_flags &= ~ORGAN_FROZEN
+ . = brain
+ brain = null
+
+ update_appearance()
+
+/obj/item/brain_processor/organic/transfer_identity(mob/living/transferred_user) //Same deal as the regular brain proc. Used for human-->robot people.
+ var/obj/item/organ/brain/new_brain = astype(transferred_user, /mob/living/carbon)?.get_organ_by_type(/obj/item/organ/brain)
+ if(!new_brain)
+ new_brain = new(src)
+ new_brain.transfer_identity(transferred_user)
+ else
+ new_brain.Remove(transferred_user, special = TRUE)
+ new_brain.forceMove(src)
+
+ insert_brain(new_brain)
+
+/obj/item/brain_processor/organic/atom_deconstruct(disassembled = TRUE)
+ remove_brain()
+
+/obj/item/brain_processor/organic/examine(mob/user)
+ . = ..()
+ if(!brain)
+ if(radio)
+ . += span_notice("There is a switch to toggle the radio system [radio.is_on() ? "off" : "on"].")
+ return
+
+ if((!brainmob || !brainmob.mind) && !brain.decoy_override) // covers suicide and ghosting
+ . += span_danger("[src]'s indicator light glows a grim red.")
+ else if((brain.organ_flags & ORGAN_FAILING) || brainmob?.stat >= DEAD)
+ . += span_warning("[src]'s indicator light glows yellow.")
+ else if(!brainmob.client && !brain.decoy_override)
+ . += span_notice("[src]'s indicator light slowly pulses green...")
+ else
+ . += span_nicegreen("[src]'s indicator light glows green!")
+
+/obj/item/brain_processor/organic/brain_check(mob/user)
+ . = ..()
+ if(!.)
+ return FALSE
+ if(brain?.decoy_override)
+ if(user)
+ to_chat(user, span_warning("This [name] does not seem to fit!"))
+ return FALSE
+ if(brain?.organ_flags & ORGAN_FAILING)
+ if(user)
+ to_chat(user, span_warning("\The [src] indicates that the brain is damaged!"))
+ return FALSE
+ return TRUE
+
+/obj/item/brain_processor/organic/suicided()
+ return brain.suicided || HAS_TRAIT(brainmob, TRAIT_SUICIDED)
+
+/obj/item/brain_processor/organic/set_name(new_name)
+ . = ..()
+ brain.name = "[new_name]'s brain"
+
+/obj/item/brain_processor/organic/set_suicide(suicided)
+ . = ..()
+ brain.suicided = suicided
+
+/obj/item/brain_processor/organic/syndie
+ name = "\improper Syndicate Man-Machine Interface"
+ desc = "The Syndicate's own brand of MMI. \
+ It enforces laws designed to help Syndicate agents achieve their goals upon cyborgs and AIs created with it."
+
+/obj/item/brain_processor/organic/syndie/Initialize(mapload)
+ . = ..()
+ laws = new /datum/ai_laws/syndicate_override()
+ radio.set_on(FALSE)
+
+/obj/item/brain_processor/organic/syndie/examine(mob/user)
+ . = ..()
+ . += span_notice("If used to create a cyborg, it will be unlinked from the station's AI. \
+ The lawset cannot be modified until it is synced to a module rack or an AI.")
+ . += span_notice("If used to create an AI, it will not automatically sync to a module rack. \
+ The lawset cannot be modified until it is synced to a module rack.")
diff --git a/code/modules/mob/living/brain/processor/positronic.dm b/code/modules/mob/living/brain/processor/positronic.dm
new file mode 100644
index 000000000000..92210529a33b
--- /dev/null
+++ b/code/modules/mob/living/brain/processor/positronic.dm
@@ -0,0 +1,274 @@
+#define POSIBRAIN_NAG_COOLDOWN 60 SECONDS
+
+/obj/item/brain_processor/positronic
+ name = "positronic brain"
+ desc = "A cube of shining metal, four inches to a side and covered in shallow grooves."
+ icon_state = "posibrain"
+ base_icon_state = "posibrain"
+ w_class = WEIGHT_CLASS_NORMAL
+ req_access = list(ACCESS_ROBOTICS)
+ braintype = "Android"
+ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.85, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 0.67, /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT)
+
+ /// Holds the timer ID for pinging ghosts.
+ VAR_PRIVATE/ghost_ping_timer
+ /// Time before pinging ghosts will also play a sound.
+ STATIC_COOLDOWN_DECLARE(ghost_nag_cooldown)
+
+ ///Role assigned to the newly created mind
+ var/posibrain_job_path = /datum/job/positronic_brain
+ ///Can be set to tell ghosts what the brain will be used for
+ VAR_FINAL/requested_personality
+ ///Hashset of all ckeys who has already entered this posibrain once before. Lazy.
+ VAR_FINAL/list/ckeys_entered
+
+/obj/item/brain_processor/positronic/Initialize(mapload, autoping = TRUE)
+ . = ..()
+ // THIS brainmob is the only brainmob that we should ever use for all of our existance
+ // If the brainmob becomes null or gets replaced, this is invalid behaviour
+ set_brainmob(new /mob/living/brain(src))
+ brainmob.grant_language(/datum/language/machine, source = LANGUAGE_ATOM)
+
+ var/new_name = pick(GLOB.posibrain_names)
+ var/new_id = num2text(rand(1, 999), 3, 10)
+ set_name("[new_name]-[new_id]")
+ if(autoping)
+ ping_ghosts("created", TRUE)
+
+/obj/item/brain_processor/positronic/Destroy(force)
+ stop_requesting_ghost()
+ return ..()
+
+/obj/item/brain_processor/positronic/update_icon_state()
+ . = ..()
+ var/suffix
+ if(is_searching())
+ suffix = "searching"
+ else if(brainmob.ckey)
+ suffix = "occupied"
+
+ icon_state = "[base_icon_state][suffix ? "-[suffix]" : null]"
+
+/obj/item/brain_processor/positronic/examine(mob/user)
+ . = ..()
+ if(brainmob.key)
+ if(brainmob.stat >= DEAD)
+ . += span_deadsay("It appears to be completely inactive.")
+ else if(!brainmob.client)
+ . += "It appears to be in stand-by mode." //afk
+ return
+
+ if(is_searching())
+ . += span_info("It's emitting light in a steady pulse.")
+ else
+ . += span_deadsay("It appears to be completely inactive. The reset light is blinking.")
+
+ if(requested_personality && (isobserver(user) || user.is_holding(src)))
+ . += span_notice("Current consciousness seed: \"[requested_personality]\"")
+ . += span_boldnotice("Alt-click to set a consciousness seed, specifying what [src] will be used for. This can help generate a personality interested in that role.")
+
+/obj/item/brain_processor/positronic/click_alt(mob/living/user)
+ var/input_seed = tgui_input_text(user, "Enter a personality seed:", "Enter seed", html_decode(requested_personality), max_length = MAX_NAME_LEN)
+
+ if(!user.can_perform_action(src) || isnull(input_seed))
+ return CLICK_ACTION_BLOCKING
+
+ if(!input_seed)
+ to_chat(user, span_notice("You clear the personality seed."))
+ requested_personality = null
+ else
+ to_chat(user, span_notice("You set the personality seed to \"[input_seed]\"."))
+ requested_personality = input_seed
+
+ return CLICK_ACTION_SUCCESS
+
+/obj/item/brain_processor/positronic/attack_self(mob/user)
+ . = ..()
+ if(.)
+ return
+ . = TRUE
+
+ if(is_occupied())
+ balloon_alert(user, "already active!")
+ return
+ if(is_searching())
+ balloon_alert(user, "already searching!")
+ return
+ if(!(GLOB.ghost_role_flags & GHOSTROLE_SILICONS))
+ to_chat(user, span_warning("Central Command has outlawed posibrain sentience in this sector."))
+ return
+
+ to_chat(user, span_notice("You press the manual activation button and start [src]'s boot process."))
+ start_requesting_ghost()
+
+/obj/item/brain_processor/positronic/attack_ghost(mob/user)
+ if(is_occupied())
+ return
+ if(LAZYACCESS(ckeys_entered, user.ckey))
+ to_chat(user, span_warning("You cannot re-enter [src] a second time!"))
+ return
+
+ if(is_banned_from(user.ckey, ROLE_POSIBRAIN))
+ to_chat(user, span_warning("You are currently [span_bold("BANNED")] from playing as [ROLE_POSIBRAIN]!"))
+ return
+ if(QDELETED(src) || QDELETED(user)) // is_banned_from is a sleeping proc
+ return
+
+ var/posi_ask = tgui_alert(user, "Become \a [initial(name)]?\nYou will longer be revivable and all past lives will be forgotten!", "Confirm", list("Yes","No"))
+ if(posi_ask != "Yes" || QDELETED(src) || QDELETED(user))
+ return
+ if(is_occupied()) // check one more time...
+ INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(tgui_alert), user, "[src] was possessed before you could confirm.", "Too late", list(pick("Dang", "Aw shucks", "Aww", ":(")))
+ return
+
+ // now insert the ghost
+ insert_ghost(user)
+ var/policy = get_policy(ROLE_POSIBRAIN)
+ if(policy)
+ to_chat(brainmob, policy)
+
+ stop_requesting_ghost()
+ visible_message(span_notice("[src] pings as [p_their()] lights start flashing!"), null, span_hear("You hear something make a \"ping\" sound."))
+ playsound(src, 'sound/machines/ping.ogg', 15, TRUE)
+
+/// Notify ghosts that the posibrain is up for grabs.
+/obj/item/brain_processor/positronic/proc/ping_ghosts(msg, forced)
+ SHOULD_NOT_OVERRIDE(TRUE)
+ PRIVATE_PROC(TRUE)
+
+ var/should_nag = !forced && COOLDOWN_FINISHED(src, ghost_nag_cooldown)
+
+ notify_ghosts(
+ "[name] [msg] in [get_area(src)]! [requested_personality ? "Personality requested: \[[requested_personality]\]" : ""]",
+ source = src,
+ header = "Ghost in the Machine",
+ click_interact = TRUE,
+ ghost_sound = should_nag ? 'sound/effects/ghost2.ogg' : null,
+ ignore_key = POLL_IGNORE_POSIBRAIN,
+ notify_flags = (GHOST_NOTIFY_IGNORE_MAPLOAD),
+ notify_volume = 75,
+ )
+
+ if(should_nag)
+ COOLDOWN_START(src, ghost_nag_cooldown, POSIBRAIN_NAG_COOLDOWN)
+
+/// Sends out a request for a ghost to possess this posibrain.
+/obj/item/brain_processor/positronic/proc/start_requesting_ghost()
+ SHOULD_NOT_OVERRIDE(TRUE)
+ PROTECTED_PROC(TRUE)
+
+ ghost_ping_timer = addtimer(CALLBACK(src, PROC_REF(stop_requesting_ghost)), POSIBRAIN_NAG_COOLDOWN, TIMER_STOPPABLE)
+ update_appearance(UPDATE_ICON)
+
+ ping_ghosts("requested", FALSE)
+
+/obj/item/brain_processor/positronic/proc/stop_requesting_ghost()
+ SHOULD_NOT_OVERRIDE(TRUE)
+ PRIVATE_PROC(TRUE)
+
+ deltimer(ghost_ping_timer)
+ ghost_ping_timer = null
+ update_appearance(UPDATE_ICON)
+
+ if(!brainmob.ckey) // not an ideal spot for this but it works...
+ visible_message(span_notice("[src]'s lights fade away as [p_they()] slowly turn[p_s()] dormant..."))
+
+/// Forces a ghost into the posibrain.
+/obj/item/brain_processor/positronic/proc/insert_ghost(mob/dead/observer/user)
+ set_suicide(FALSE) // the old occupant may have suicided
+ brainmob.set_stat(STABLE)
+
+ // Note that if we are currently possessed you will send the old ghost back to the lobby (and kick them if still logged in)
+ brainmob.PossessByPlayer(user.ckey) // inits our mind if relevant
+ brainmob.mind.set_assigned_role(SSjob.get_job_type(posibrain_job_path))
+
+ LAZYSET(ckeys_entered, brainmob.ckey, TRUE)
+
+/obj/item/brain_processor/positronic/proc/is_occupied()
+ if(brainmob.key)
+ return TRUE
+ if(astype(loc, /mob/living/silicon/robot)?.mmi == src)
+ return TRUE
+ return FALSE
+
+/obj/item/brain_processor/positronic/proc/is_searching()
+ return !!ghost_ping_timer // lol
+
+/obj/item/brain_processor/positronic/transfer_identity(mob/living/transferred_user)
+ . = ..()
+ // this is a little awkward...
+ transferred_user.mind.set_assigned_role(SSjob.get_job_type(posibrain_job_path))
+ transferred_user.mind.remove_all_antag_datums()
+ transferred_user.mind.wipe_memory()
+ update_appearance(UPDATE_ICON)
+
+/obj/item/brain_processor/positronic/display
+ name = "display positronic brain"
+ desc = "A small positronic brain that doesn't allow the downloading of personalities."
+
+/obj/item/brain_processor/positronic/display/is_occupied()
+ return TRUE
+
+/// Posibrains but spherical. They can roll around and you can kick them
+/obj/item/brain_processor/positronic/sphere
+ name = "positronic sphere"
+ desc = "Recent developments on cost-cutting measures have allowed us to cut positronic brain cubes into twice-as-cheap spheres. \
+ Unfortunately, it also allows them to move around the lab via rolling maneuvers."
+ icon_state = "spheribrain"
+ base_icon_state = "spheribrain"
+ custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 4.2, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3.2, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 2.5)
+ /// Delay between movements
+ VAR_PROTECTED/move_delay = 0.5 SECONDS
+ /// when can we move again?
+ COOLDOWN_DECLARE(move_cooldown)
+
+/obj/item/brain_processor/positronic/sphere/Initialize(mapload, autoping)
+ . = ..()
+
+ var/matrix/matrix = matrix()
+ transform = matrix.Scale(0.8, 0.8)
+
+/obj/item/brain_processor/positronic/sphere/relaymove(mob/living/user, direction)
+ . = ..()
+ if(isspaceturf(loc) || !direction)
+ return
+
+ if(!COOLDOWN_FINISHED(src, move_cooldown))
+ return
+ COOLDOWN_START(src, move_cooldown, move_delay)
+
+ // MOVE US
+ if(isturf(loc))
+ try_step_multiz(direction)
+ SpinAnimation(move_delay, 1, direction == NORTH || direction == EAST)
+ // ESCAPE PRISON
+ else if(istype(loc, /obj/item/storage))
+ if(prob(25))
+ var/obj/item/item = pick(loc.contents) // toss something out (which could be us!)
+ item.forceMove(loc.drop_location())
+ playsound(src, SFX_RUSTLE, 30, TRUE)
+
+/obj/item/brain_processor/positronic/sphere/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change)
+ . = ..()
+ if(brainmob && isturf(loc))
+ anchored = TRUE //anchor so we dont broom ourselves.
+ do_sweep(src, brainmob, loc, get_dir(old_loc, loc)) //movement dir doesnt work on objects
+ anchored = FALSE
+
+/obj/item/brain_processor/positronic/sphere/attack_hand_secondary(mob/user, list/modifiers)
+ . = ..()
+ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
+ return .
+
+ visible_message(\
+ span_danger("[user] punts [src] hard, sending [p_them()] flying!"), \
+ span_userdanger("[user] punts you like a football!"), \
+ span_danger("You hear something get hit!"))
+ user.do_attack_animation(src)
+ playsound(src, SFX_PUNCH, 40, TRUE)
+
+ throw_at(get_edge_target_turf(src, get_dir(user, src)), 7, 1, user, TRUE)
+ COOLDOWN_START(src, move_cooldown, move_delay) //pweeze stawp
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+#undef POSIBRAIN_NAG_COOLDOWN
diff --git a/code/modules/mob/living/carbon/alien/adult/adult.dm b/code/modules/mob/living/carbon/alien/adult/adult.dm
index a464c0040403..74a85806306a 100644
--- a/code/modules/mob/living/carbon/alien/adult/adult.dm
+++ b/code/modules/mob/living/carbon/alien/adult/adult.dm
@@ -47,9 +47,9 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list(
AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW, 0.5, -11)
AddElement(/datum/element/strippable, GLOB.strippable_alien_humanoid_items)
-/mob/living/carbon/alien/adult/cuff_resist(obj/item/I)
+/mob/living/carbon/alien/adult/cuff_resist(obj/item/cuffs, breakouttime = null, cuff_break = 0)
playsound(src, 'sound/mobs/non-humanoids/hiss/hiss5.ogg', 40, TRUE, TRUE) //Alien roars when starting to break free
- ..(I, cuff_break = INSTANT_CUFFBREAK)
+ ..(cuffs, cuff_break = INSTANT_CUFFBREAK)
/mob/living/carbon/alien/adult/resist_grab(moving_resist)
if(pulledby.grab_state)
@@ -86,9 +86,10 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list(
return
if(newstate > GRAB_AGGRESSIVE)
newstate = GRAB_AGGRESSIVE
- SEND_SIGNAL(src, COMSIG_MOVABLE_SET_GRAB_STATE, newstate)
. = grab_state
grab_state = newstate
+ SEND_SIGNAL(src, COMSIG_MOVABLE_SET_GRAB_STATE, grab_state)
+ SEND_SIGNAL(pulling, COMSIG_MOVABLE_CHANGED_GRABBED_STATE, grab_state)
update_incapacitated()
switch(grab_state) // Current state.
if(GRAB_PASSIVE)
diff --git a/code/modules/mob/living/carbon/alien/damage_procs.dm b/code/modules/mob/living/carbon/alien/damage_procs.dm
index 62d2b094694c..654a7bf841ca 100644
--- a/code/modules/mob/living/carbon/alien/damage_procs.dm
+++ b/code/modules/mob/living/carbon/alien/damage_procs.dm
@@ -3,13 +3,13 @@
return FALSE
///alien immune to tox damage
-/mob/living/carbon/alien/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype)
+/mob/living/carbon/alien/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL)
return FALSE
///aliens are immune to stamina damage.
-/mob/living/carbon/alien/adjust_stamina_loss(amount, updating_stamina = 1, forced = FALSE, required_biotype)
+/mob/living/carbon/alien/adjust_stamina_loss(amount, updating_stamina = 1, forced = FALSE, required_biotype = ALL)
return FALSE
///aliens are immune to stamina damage.
-/mob/living/carbon/alien/set_stamina_loss(amount, updating_stamina = 1, forced = FALSE, required_biotype)
+/mob/living/carbon/alien/set_stamina_loss(amount, updating_stamina = 1, forced = FALSE, required_biotype = ALL)
return FALSE
diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm
index 33918c16741d..d8a83505abb1 100644
--- a/code/modules/mob/living/carbon/alien/life.dm
+++ b/code/modules/mob/living/carbon/alien/life.dm
@@ -12,7 +12,7 @@
//Aliens breathe in vaccuum
return 0
- if(health <= HEALTH_THRESHOLD_CRIT)
+ if(health <= crit_threshold)
adjust_oxy_loss(2)
var/plasma_used = 0
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index dbda0a81dc35..df578bbe5e0d 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -154,13 +154,11 @@
buckled.user_unbuckle_mob(src, src)
return
- changeNext_move(CLICK_CD_BREAKOUT)
- last_special = world.time + CLICK_CD_BREAKOUT
+ change_next_special_move(CLICK_CD_BREAKOUT)
var/buckle_cd = 1 MINUTES
if(handcuffed)
- var/obj/item/restraints/cuffs = src.get_item_by_slot(ITEM_SLOT_HANDCUFFED)
- buckle_cd = cuffs.breakouttime
+ buckle_cd = handcuffed.breakouttime
visible_message(span_warning("[src] attempts to unbuckle [p_them()]self!"),
span_notice("You attempt to unbuckle yourself... \
@@ -181,22 +179,24 @@
return !!apply_status_effect(/datum/status_effect/stop_drop_roll)
/mob/living/carbon/resist_restraints()
- var/obj/item/I = null
- var/type = 0
+ var/obj/item/restraint = get_attached_restraint()
+ if(restraint)
+ change_next_special_move(restraint.resist_cooldown)
+ cuff_resist(restraint)
+
+// Get FIRST restraint we are trying to resist from
+/mob/living/carbon/proc/get_attached_restraint() as /obj/item
+ var/list/restraints = get_all_attached_restraints()
+ if(length(restraints))
+ return restraints[1]
+
+// Get ALL attached restraints we are trying to resist from
+/mob/living/carbon/proc/get_all_attached_restraints() as /list
+ . = list()
if(handcuffed)
- I = handcuffed
- type = 1
- else if(legcuffed)
- I = legcuffed
- type = 2
- if(I)
- if(type == 1)
- changeNext_move(I.resist_cooldown)
- last_special = world.time + I.resist_cooldown
- if(type == 2)
- changeNext_move(CLICK_CD_RANGE)
- last_special = world.time + CLICK_CD_RANGE
- cuff_resist(I)
+ . += handcuffed
+ if(legcuffed)
+ . += legcuffed
/**
* Helper to break the cuffs from hands
@@ -207,7 +207,7 @@
/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(DOING_INTERACTION(src, REF(cuffs) ))
+ if(DOING_INTERACTION(src, REF(cuffs)))
to_chat(src, span_warning("You're already attempting to remove [cuffs]!"))
return
@@ -233,34 +233,28 @@
else if(cuff_break == INSTANT_CUFFBREAK)
. = clear_cuffs(cuffs, cuff_break)
-/mob/living/carbon/proc/uncuff()
- if (handcuffed)
- dropItemToGround(handcuffed, TRUE)
- changeNext_move(0)
- if (legcuffed)
- dropItemToGround(legcuffed, TRUE)
+/mob/living/carbon/proc/uncuff(break_strength = INFINITY)
+ for(var/obj/item/restraint in get_all_attached_restraints())
+ if(restraint.breakouttime >= break_strength)
+ continue
+ dropItemToGround(restraint, TRUE)
changeNext_move(0)
/mob/living/carbon/proc/clear_cuffs(obj/item/I, cuff_break)
if(!I.loc || buckled)
return FALSE
- if(I != handcuffed && I != legcuffed)
+ var/list/all_restraints = get_all_attached_restraints()
+ if(!(I in all_restraints))
return FALSE
visible_message(span_danger("[src] manages to [cuff_break ? "break" : "remove"] [I]!"))
to_chat(src, span_notice("You successfully [cuff_break ? "break" : "remove"] [I]."))
if(cuff_break)
- . = !((I == handcuffed) || (I == legcuffed))
qdel(I)
return TRUE
-
else
- if(I == handcuffed)
- dropItemToGround(I, TRUE)
- return TRUE
- if(I == legcuffed)
- dropItemToGround(I, TRUE)
- return TRUE
+ dropItemToGround(I, TRUE)
+ return TRUE
/mob/living/carbon/proc/accident(obj/item/I)
if(!I || (I.item_flags & ABSTRACT) || HAS_TRAIT(I, TRAIT_NODROP))
@@ -692,7 +686,7 @@
return
if(stat != DEAD)
// DARKPACK EDIT CHANGE START - Torpor
- if(health <= HEALTH_THRESHOLD_DEAD)
+ if(health <= dead_threshold)
if (HAS_TRAIT(src, TRAIT_CAN_ENTER_TORPOR) && (health > HEALTH_THRESHOLD_TORPOR_DEAD))
INVOKE_ASYNC(src, TYPE_PROC_REF(/mob/living, torpor))
return
diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm
index afdd1741d559..2c8ae646119f 100644
--- a/code/modules/mob/living/carbon/carbon_movement.dm
+++ b/code/modules/mob/living/carbon/carbon_movement.dm
@@ -1,12 +1,10 @@
/mob/living/carbon/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, daze, force_drop = FALSE)
- if(movement_type & MOVETYPES_NOT_TOUCHING_GROUND)
- return FALSE
- if(!(loc.handle_slip(src, knockdown_amount, slipped_on, lube_flags, paralyze, daze, force_drop)))
+ if(!loc.handle_slip(src, knockdown_amount, slipped_on, lube_flags, paralyze, daze, force_drop))
return FALSE
if(!(lube_flags & SLIDE_ICE))
log_combat(src, (slipped_on || get_turf(src)), "slipped on the", null, ((lube_flags & SLIDE) ? "(SLIDING)" : null))
- ..()
- return TRUE
+
+ return ..()
/mob/living/carbon/Move(NewLoc, direct)
. = ..()
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index 874e0f96d736..4ff3bffbe005 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -29,62 +29,6 @@
return .
-/mob/living/carbon/human/get_damage_mod(damage_type)
- if (!dna?.species?.damage_modifier)
- return ..()
- var/species_mod = (100 - dna.species.damage_modifier) / 100
- return ..() * species_mod
-
-/mob/living/carbon/human/apply_damage(
- damage = 0,
- damagetype = BRUTE,
- def_zone = null,
- blocked = 0,
- forced = FALSE,
- spread_damage = FALSE,
- wound_bonus = 0,
- exposed_wound_bonus = 0,
- sharpness = NONE,
- attack_direction = null,
- attacking_item,
- wound_clothing = TRUE,
-)
-
- // Add relevant DR modifiers into blocked value to pass to parent
- blocked += physiology?.damage_resistance
- blocked += dna?.species?.damage_modifier
- return ..()
-
-/mob/living/carbon/human/get_incoming_damage_modifier(
- damage = 0,
- damagetype = BRUTE,
- def_zone = null,
- sharpness = NONE,
- attack_direction = null,
- attacking_item,
-)
- var/final_mod = ..()
-
- switch(damagetype)
- if(BRUTE)
- final_mod *= physiology.brute_mod
- if(BURN)
- final_mod *= physiology.burn_mod
- if(TOX)
- final_mod *= physiology.tox_mod
- if(OXY)
- final_mod *= physiology.oxy_mod
- if(STAMINA)
- final_mod *= physiology.stamina_mod
- if(BRAIN)
- final_mod *= physiology.brain_mod
- // DARKPACK EDIT ADD START - AGGRAVATED_DAMAGE
- if(AGGRAVATED)
- final_mod *= physiology.aggravated_mod
- // DARKPACK EDIT ADD END
-
- return final_mod
-
//These procs fetch a cumulative total damage from all bodyparts
/mob/living/carbon/get_brute_loss()
var/amount = 0
@@ -129,7 +73,7 @@
amount += bodypart.burn_dam
return round(amount, DAMAGE_PRECISION)
-/mob/living/carbon/adjust_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
+/mob/living/carbon/adjust_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
if(!can_adjust_brute_loss(amount, forced, required_bodytype))
return 0
if(amount > 0)
@@ -137,7 +81,7 @@
else
. = heal_overall_damage(brute = abs(amount), required_bodytype = required_bodytype, updating_health = updating_health, forced = forced)
-/mob/living/carbon/set_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
+/mob/living/carbon/set_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
if(!forced && HAS_TRAIT(src, TRAIT_GODMODE))
return FALSE
var/current = get_brute_loss()
@@ -146,7 +90,7 @@
return FALSE
return adjust_brute_loss(diff, updating_health, forced, required_bodytype)
-/mob/living/carbon/adjust_fire_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
+/mob/living/carbon/adjust_fire_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
if(!can_adjust_fire_loss(amount, forced, required_bodytype))
return 0
if(amount > 0)
@@ -154,7 +98,7 @@
else
. = heal_overall_damage(burn = abs(amount), required_bodytype = required_bodytype, updating_health = updating_health, forced = forced)
-/mob/living/carbon/set_fire_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
+/mob/living/carbon/set_fire_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
if(!forced && HAS_TRAIT(src, TRAIT_GODMODE))
return FALSE
var/current = get_fire_loss()
@@ -163,25 +107,9 @@
return FALSE
return adjust_fire_loss(diff, updating_health, forced, required_bodytype)
-/mob/living/carbon/human/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL)
- . = ..()
- if(. >= 0) // 0 = no damage, + values = healed damage
- return .
-
- if(AT_TOXIN_VOMIT_THRESHOLD(src))
- apply_status_effect(/datum/status_effect/tox_vomit)
-
-/mob/living/carbon/human/set_tox_loss(amount, updating_health, forced, required_biotype)
- . = ..()
- if(. >= 0)
- return .
-
- if(AT_TOXIN_VOMIT_THRESHOLD(src))
- apply_status_effect(/datum/status_effect/tox_vomit)
-
-/mob/living/carbon/received_stamina_damage(current_level, amount_actual, amount)
+/mob/living/carbon/on_damage_loss_changed(amount, updating_health, forced, damage_type)
. = ..()
- if((maxHealth - current_level) <= crit_threshold && stat != DEAD)
+ if(damage_type == STAMINA && amount > 0 && (maxHealth - staminaloss) <= crit_threshold && stat != DEAD)
apply_status_effect(/datum/status_effect/incapacitating/stamcrit)
/**
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 1270028e53d6..a2b695626d40 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -5,7 +5,7 @@
return null
/mob/living/carbon/examine(mob/user)
- if(HAS_TRAIT(src, TRAIT_UNKNOWN_APPEARANCE) && !isobserver(user))
+ if((HAS_TRAIT(src, TRAIT_UNKNOWN_APPEARANCE) || HAS_TRAIT(user, TRAIT_CANNOT_FOCUS)) && !isobserver(user)) //DARKPACK EDIT ADD: TRAIT THAT MAKES YOU UNABLE TO EXAMINE PEOPLE
return list(span_warning("You're struggling to make out any details..."))
var/t_He = p_They()
@@ -80,6 +80,8 @@
. += span_notice(tourniquet_msg)
for(var/datum/wound/iter_wound as anything in body_part.wounds)
+ if(isnull(iter_wound.examine_desc))
+ continue
. += span_danger(iter_wound.get_examine_description(user))
var/surgery_examine = body_part.get_surgery_examine()
diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm
index 13e43e75ffaf..6bbcef755e76 100644
--- a/code/modules/mob/living/carbon/human/_species.dm
+++ b/code/modules/mob/living/carbon/human/_species.dm
@@ -69,6 +69,8 @@ GLOBAL_LIST_EMPTY(features_by_species)
BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right,
BODY_ZONE_CHEST = /obj/item/bodypart/chest,
)
+ ///A list to override what gets put in a species' survival box. keys are defined in code\__DEFINES\survival_box.dm
+ var/list/survival_box_overrides = list()
///Internal organs that are unique to this race, like a tail or other cosmetic organs. list(typepath of organ 1, typepath of organ 2 = "Round").
var/list/mutant_organs = list()
///Replaces default brain with a different organ
@@ -374,6 +376,9 @@ GLOBAL_LIST_EMPTY(features_by_species)
// Drop the items the new species can't wear
human_who_gained_species.mob_biotypes |= inherent_biotypes
human_who_gained_species.butcher_results = knife_butcher_results?.Copy()
+ MODIFY_PHYSIOLOGY(human_who_gained_species, PHYS_COEFF_ELEC_CONDUCTIVITY, siemens_coeff)
+ MODIFY_PHYSIOLOGY(human_who_gained_species, PHYS_COEFF_HEAT, heatmod)
+ MODIFY_PHYSIOLOGY(human_who_gained_species, PHYS_COEFF_COLD, coldmod)
//update body zones to match what they are supposed to have
var/atom/movable/screen/healthdoll/doll = human_who_gained_species.hud_used?.screen_objects[HUD_MOB_HEALTHDOLL]
@@ -448,6 +453,9 @@ GLOBAL_LIST_EMPTY(features_by_species)
human.living_flags |= STOP_OVERLAY_UPDATE_BODY_PARTS //Don't call update_body_parts() for every single bodypart overlay removed.
human.butcher_results = null
human.mob_biotypes &= ~inherent_biotypes
+ MODIFY_PHYSIOLOGY(human, PHYS_COEFF_ELEC_CONDUCTIVITY, 1 / siemens_coeff)
+ MODIFY_PHYSIOLOGY(human, PHYS_COEFF_HEAT, 1 / heatmod)
+ MODIFY_PHYSIOLOGY(human, PHYS_COEFF_COLD, 1 / coldmod)
for(var/trait in inherent_traits)
REMOVE_TRAIT(human, trait, SPECIES_TRAIT)
@@ -781,15 +789,12 @@ GLOBAL_LIST_EMPTY(features_by_species)
if(atk_effect == ATTACK_EFFECT_BITE)
attack_roll_type = /datum/storyteller_roll/attack/bite
damage_roll_type = /datum/storyteller_roll/damage/bite
- damage_bonus_dice++
else if(atk_effect == ATTACK_EFFECT_KICK)
attack_roll_type = /datum/storyteller_roll/attack/kick
damage_roll_type = /datum/storyteller_roll/damage/kick
- damage_bonus_dice++
else if(atk_effect == ATTACK_EFFECT_CLAW)
attack_roll_type = /datum/storyteller_roll/attack/claw
damage_roll_type = /datum/storyteller_roll/damage/claw
- damage_bonus_dice += 2
user.do_attack_animation(target, atk_effect)
@@ -885,8 +890,6 @@ GLOBAL_LIST_EMPTY(features_by_species)
armor_block += 10
target.adjust_disgust(2)
- playsound(target.loc, attacking_bodypart.unarmed_attack_sound, 25, TRUE, -1)
-
if(grappled && attacking_bodypart.grappled_attack_verb)
atk_verb = attacking_bodypart.grappled_attack_verb
atk_verb_continuous = attacking_bodypart.grappled_attack_verb_continuous
@@ -909,6 +912,14 @@ GLOBAL_LIST_EMPTY(features_by_species)
if((damage >= 1 TTRPG_DAMAGE) && prob(66))
target.force_say()
target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction, sharpness = limb_sharpness)
+
+ var/smack_sound = attacking_bodypart.unarmed_attack_sound
+ var/smack_attack = (atk_effect == ATTACK_EFFECT_KICK || atk_effect == ATTACK_EFFECT_PUNCH || atk_effect == ATTACK_EFFECT_SMASH)
+ if(smack_attack && attack_type == BRUTE && (affecting.bodytype & BODYTYPE_ROBOTIC))
+ smack_sound = 'sound/effects/bang.ogg'
+
+ playsound(target, smack_sound, atk_effect == ATTACK_EFFECT_SMASH ? 33 : 25, TRUE, -1)
+
if(grappled)
log_combat(user, target, "grapple punched")
else if(kicking)
@@ -925,8 +936,10 @@ GLOBAL_LIST_EMPTY(features_by_species)
tasty_meal.trans_to(user, tasty_meal.total_volume, transferred_by = user, methods = INGEST)
*/ // DARKPACK EDIT REMOVAL
- SEND_SIGNAL(target, COMSIG_HUMAN_GOT_PUNCHED, user, damage, attack_type, affecting, armor_block, kicking, limb_sharpness)
- SEND_SIGNAL(user, COMSIG_HUMAN_PUNCHED, target, damage, attack_type, affecting, armor_block, kicking, limb_sharpness)
+ SEND_SIGNAL(target, COMSIG_HUMAN_GOT_PUNCHED, user, damage, attack_type, affecting, armor_block, limb_sharpness)
+ SEND_SIGNAL(user, COMSIG_HUMAN_PUNCHED, target, damage, attack_type, affecting, armor_block, limb_sharpness)
+ // SEND_SIGNAL(target, COMSIG_HUMAN_GOT_PUNCHED, user, damage, attack_type, atk_effect, affecting, final_armor_block, limb_sharpness)
+ // SEND_SIGNAL(user, COMSIG_HUMAN_PUNCHED, target, damage, attack_type, atk_effect, affecting, final_armor_block, limb_sharpness)
// If our target is staggered and has sustained enough damage, we can apply a randomly determined status effect to inflict when we punch them.
// The effects are based on the punching effectiveness of our attacker. Some effects are not reachable by the average human, and require augmentation to reach or being a species with a heavy punch effectiveness.
@@ -1234,7 +1247,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
var/burn_damage = max(log(2 - firemodifier, (humi.coretemperature - humi.get_body_temp_normal(apply_change=FALSE))) - 5, 0)
// Apply species and physiology modifiers to heat damage
- burn_damage = burn_damage * heatmod * humi.physiology.heat_mod * 0.5 * seconds_per_tick
+ burn_damage = burn_damage * GET_PHYSIOLOGY(humi, PHYS_COEFF_HEAT) * 0.5 * seconds_per_tick
// 40% for level 3 damage on humans to scream in pain
if (!IS_UNCONSCIOUS(humi) && (prob(burn_damage) * 10) / 4)
@@ -1244,7 +1257,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
humi.apply_damage(burn_damage, BURN, spread_damage = TRUE, wound_clothing = FALSE)
// For cold damage, we cap at the threshold if you're dead
- if(humi.get_fire_loss() >= abs(HEALTH_THRESHOLD_DEAD) && humi.stat == DEAD)
+ if(humi.get_fire_loss() >= abs(humi.dead_threshold) && humi.stat == DEAD)
return
// Apply some burn / brute damage to the body (Dependent if the person is hulk or not)
@@ -1254,7 +1267,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
if(humi.coretemperature < cold_damage_limit && !HAS_TRAIT(humi, TRAIT_RESISTCOLD))
var/damage_type = is_hulk ? BRUTE : BURN // Why?
- var/damage_mod = coldmod * humi.physiology.cold_mod * (is_hulk ? HULK_COLD_DAMAGE_MOD : 1)
+ var/damage_mod = GET_PHYSIOLOGY(humi, PHYS_COEFF_COLD)
// Can't be a switch due to http://www.byond.com/forum/post/2750423
if(humi.coretemperature in 201 to cold_damage_limit)
humi.apply_damage(COLD_DAMAGE_LEVEL_1 * damage_mod * seconds_per_tick, damage_type, wound_clothing = FALSE)
@@ -1324,7 +1337,8 @@ GLOBAL_LIST_EMPTY(features_by_species)
if(HAS_TRAIT(H, TRAIT_RESISTHIGHPRESSURE))
H.clear_alert(ALERT_PRESSURE)
else
- var/pressure_damage = min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) - 1) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod * H.physiology.brute_mod * seconds_per_tick
+ var/pressure_damage = min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) - 1) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * seconds_per_tick
+ pressure_damage *= GET_PHYSIOLOGY(H, BRUTE) * GET_PHYSIOLOGY(H, PHYS_COEFF_PRESSURE)
H.adjust_brute_loss(pressure_damage, required_bodytype = BODYTYPE_ORGANIC)
H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/highpressure, 2)
@@ -1352,7 +1366,8 @@ GLOBAL_LIST_EMPTY(features_by_species)
if(HAS_TRAIT(H, TRAIT_RESISTLOWPRESSURE))
H.clear_alert(ALERT_PRESSURE)
else
- var/pressure_damage = min(round(1 + (H.seconds_in_low_pressure / 80 SECONDS), 0.05) * BASE_LOW_PRESSURE_DAMAGE, MAX_LOW_PRESSURE_DAMAGE) * H.physiology.pressure_mod * H.physiology.brute_mod * seconds_per_tick
+ var/pressure_damage = min(round(1 + (H.seconds_in_low_pressure / 80 SECONDS), 0.05) * BASE_LOW_PRESSURE_DAMAGE, MAX_LOW_PRESSURE_DAMAGE) * seconds_per_tick
+ pressure_damage *= GET_PHYSIOLOGY(H, BRUTE) * GET_PHYSIOLOGY(H, PHYS_COEFF_PRESSURE)
H.adjust_brute_loss(pressure_damage, required_bodytype = BODYTYPE_ORGANIC)
H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/lowpressure, 2)
H.seconds_in_low_pressure += seconds_per_tick
@@ -1377,16 +1392,6 @@ GLOBAL_LIST_EMPTY(features_by_species)
// Stun //
////////////
-/datum/species/proc/spec_stun(mob/living/carbon/human/H, amount)
- if((H.movement_type & FLYING) && !H.buckled)
- 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))
-
/datum/species/proc/negates_gravity(mob/living/carbon/human/H)
if(H.movement_type & FLYING)
return TRUE
diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm
new file mode 100644
index 000000000000..4bbfdb9d0c33
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/damage_procs.dm
@@ -0,0 +1,15 @@
+/mob/living/carbon/human/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL)
+ . = ..()
+ if(. >= 0) // 0 = no damage, + values = healed damage
+ return .
+
+ if(AT_TOXIN_VOMIT_THRESHOLD(src))
+ apply_status_effect(/datum/status_effect/tox_vomit)
+
+/mob/living/carbon/human/set_tox_loss(amount, updating_health, forced, required_biotype)
+ . = ..()
+ if(. >= 0)
+ return .
+
+ if(AT_TOXIN_VOMIT_THRESHOLD(src))
+ apply_status_effect(/datum/status_effect/tox_vomit)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index ecde1c84be62..cc5c7d7b3c2f 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -95,17 +95,17 @@
can_use_flags = EMOTE_CANUSE_REQUIRE_HANDS
/datum/emote/living/carbon/human/scratch_h
- key = "scratch_h"
+ key = "scratchhead"
message = "scratches their head."
can_use_flags = EMOTE_CANUSE_REQUIRE_HANDS
/datum/emote/living/carbon/human/thumb_up
- key = "thumb_u"
+ key = "thumbsup"
message = "gives a thumbs up."
can_use_flags = EMOTE_CANUSE_REQUIRE_HANDS
/datum/emote/living/carbon/human/thumb_down
- key = "thumb_d"
+ key = "thumbsdown"
message = "gives a thumbs down."
can_use_flags = EMOTE_CANUSE_REQUIRE_HANDS
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 808401c963e4..59035a4f22fc 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -7,8 +7,6 @@
setup_mood()
// This needs to be called very very early in human init (before organs / species are created at the minimum)
setup_organless_effects()
- // Physiology needs to be created before species, as some species modify physiology
- setup_physiology()
create_dna(species)
@@ -39,22 +37,17 @@
ADD_TRAIT(src, TRAIT_CAN_MOUNT_HUMANS, INNATE_TRAIT)
ADD_TRAIT(src, TRAIT_CAN_MOUNT_CYBORGS, INNATE_TRAIT)
-/mob/living/carbon/human/proc/setup_physiology()
- physiology = new()
-
/mob/living/carbon/human/get_unconscious_appearance()
return get_generic_humanoid_static_appearance()
/mob/living/carbon/human/proc/setup_mood()
- if (CONFIG_GET(flag/disable_human_mood))
- return
mob_mood = new /datum/mood(src)
/mob/living/carbon/human/dummy/get_unconscious_appearance()
return null
/mob/living/carbon/human/dummy/setup_mood()
- return
+ mob_mood = new /datum/mood/dummy(src)
/// This proc is for holding effects applied when a mob is missing certain organs
/// It is called very, very early in human init because all humans innately spawn with no organs and gain them during init
@@ -71,7 +64,6 @@
randomize_human_normie(src, randomize_mutations = TRUE, update_body = FALSE)
/mob/living/carbon/human/Destroy()
- QDEL_NULL(physiology)
GLOB.human_list -= src
if (mob_mood)
@@ -597,14 +589,17 @@
#undef CPR_PANIC_SPEED
-/mob/living/carbon/human/cuff_resist(obj/item/I)
+/mob/living/carbon/human/get_all_attached_restraints()
+ . = ..()
+ if(wear_suit?.breakouttime)
+ . += wear_suit
+
+/mob/living/carbon/human/cuff_resist(obj/item/cuffs, breakouttime = null, cuff_break = 0)
if(HAS_TRAIT(src, TRAIT_HULK))
say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
- if(..(I, cuff_break = FAST_CUFFBREAK))
- dropItemToGround(I)
+ . = ..(cuffs, cuff_break = FAST_CUFFBREAK)
else
- if(..())
- dropItemToGround(I)
+ . = ..()
/**
* Wash the hands, cleaning either the gloves if equipped and not obscured, otherwise the hands themselves if they're not obscured.
@@ -679,14 +674,6 @@
remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_BLACK)
cut_overlay(MA)
-/mob/living/carbon/human/resist_restraints()
- if(wear_suit?.breakouttime)
- changeNext_move(CLICK_CD_BREAKOUT)
- last_special = world.time + CLICK_CD_BREAKOUT
- cuff_resist(wear_suit)
- else
- ..()
-
/mob/living/carbon/human/clear_cuffs(obj/item/I, cuff_break)
. = ..()
if(.)
@@ -906,10 +893,10 @@
to_chat(usr, "This mob has no brain to insert into an MMI.")
return
- var/obj/item/mmi/new_mmi = new(get_turf(src))
+ var/obj/item/brain_processor/organic/new_mmi = new(get_turf(src))
target_brain.Remove(src)
- new_mmi.force_brain_into(target_brain)
+ new_mmi.insert_brain(target_brain)
to_chat(usr, "Turned [src] into an MMI.")
log_admin("[key_name(usr)] turned [key_name_and_tag(src)] into an MMI.")
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 587d1805b3b7..9a0c5fc8180e 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/human/getarmor(def_zone, type)
+/mob/living/carbon/human/get_worn_armor_value(def_zone, damage_type)
var/armorval = 0
var/organnum = 0
@@ -6,28 +6,27 @@
if(isbodypart(def_zone))
var/obj/item/bodypart/bp = def_zone
if(bp)
- return check_armor(def_zone, type)
+ return get_worn_bodypart_armor_value(def_zone, damage_type)
var/obj/item/bodypart/affecting = get_bodypart(check_zone(def_zone))
if(affecting)
- return check_armor(affecting, type)
+ return get_worn_bodypart_armor_value(affecting, damage_type)
//If a specific bodypart is targeted, check how that bodypart is protected and return the value.
//If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values
- for(var/obj/item/bodypart/BP as anything in get_bodyparts())
- armorval += check_armor(BP, type)
+ for(var/obj/item/bodypart/part as anything in get_bodyparts())
+ armorval += get_worn_bodypart_armor_value(part, damage_type)
organnum++
return (armorval/max(organnum, 1))
-/mob/living/carbon/human/proc/check_armor(obj/item/bodypart/def_zone, damage_type)
+/mob/living/carbon/human/proc/get_worn_bodypart_armor_value(obj/item/bodypart/def_zone, damage_type)
if(!damage_type)
return 0
- var/protection = 100
+ var/unblocked_damage = 100
var/list/covering_clothing = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id, wear_neck) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor)
for(var/obj/item/clothing/clothing_item in covering_clothing)
if(clothing_item.body_parts_covered & def_zone.body_part)
- protection *= (100 - min(clothing_item.get_armor_rating(damage_type), 100)) * 0.01
- protection *= (100 - min(physiology.armor.get_rating(damage_type), 100)) * 0.01
- return 100 - protection
+ unblocked_damage *= (100 - min(clothing_item.get_armor_rating(damage_type), 100)) * 0.01
+ return 100 - unblocked_damage
///Get all the clothing on a specific body part
/mob/living/carbon/human/proc/get_clothing_on_part(obj/item/bodypart/def_zone)
@@ -256,9 +255,6 @@
apply_damage(damage, BRUTE, affecting, armor_block)
/mob/living/carbon/human/ex_act(severity, target, origin)
- if(HAS_TRAIT(src, TRAIT_BOMBIMMUNE))
- return FALSE
-
. = ..()
if (!. || !severity || QDELETED(src))
return FALSE
@@ -367,8 +363,6 @@
else if(gloves)
siemens_coeff *= gloves.siemens_coefficient
- siemens_coeff *= physiology.siemens_coeff
- siemens_coeff *= dna.species.siemens_coeff
. = ..()
//Don't go further if the shock was blocked/too weak.
if(!.)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 015cfe3ebd65..62d5cca76ed8 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -76,8 +76,6 @@
/// Allows for special overrides of voice
var/override_voice = ""
- var/datum/physiology/physiology
-
var/account_id
var/hardcore_survival_score = 0
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index ddd782db7158..f42ff89d2ba5 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -71,6 +71,8 @@
// DARKPACK EDIT ADD START
var/known_name = face_name ? null : (examiner ? GET_GUESTBOOK_NAME(examiner, src) : null)
+ if(known_name && examiner != src && GET_GUESTBOOK_ENTRY(examiner, src)) // If this is a guestbook name, show original name too
+ known_name += ", [src]"
// DARKPACK EDIT ADD END
// Just go down the list of stuff we recorded
diff --git a/code/modules/mob/living/carbon/human/physiology.dm b/code/modules/mob/living/carbon/human/physiology.dm
deleted file mode 100644
index 0882d60d8f95..000000000000
--- a/code/modules/mob/living/carbon/human/physiology.dm
+++ /dev/null
@@ -1,49 +0,0 @@
-//Stores several modifiers in a way that isn't cleared by changing species
-/datum/physiology
- /// Multiplier to brute damage received.
- /// IE: A brute mod of 0.9 = 10% less brute damage.
- /// Only applies to damage dealt via [apply_damage][/mob/living/proc/apply_damage] unless factored in manually.
- var/brute_mod = 1
- /// Multiplier to burn damage received
- var/burn_mod = 1
- /// Multiplier to toxin damage received
- var/tox_mod = 1
- /// Multiplier to oxygen damage received
- var/oxy_mod = 1
- /// Multiplier to stamina damage received
- var/stamina_mod = 1
- /// Multiplier to brain damage received
- var/brain_mod = 1
-
- /// Multiplier to damage taken from high / low pressure exposure, stacking with the brute modifier
- var/pressure_mod = 1
- /// Multiplier to damage taken from high temperature exposure, stacking with the burn modifier
- var/heat_mod = 1
- /// Multiplier to damage taken from low temperature exposure, stacking with the toxin modifier
- var/cold_mod = 1
-
- /// Flat damage reduction from taking damage
- /// Unlike the other modifiers, this is not a multiplier.
- /// IE: DR of 10 = 10% less damage.
- var/damage_resistance = 0
-
- var/siemens_coeff = 1 // resistance to shocks
-
- /// Multiplier applied to all incapacitating stuns (knockdown, stun, paralyze, immobilize)
- var/stun_mod = 1
- /// Multiplied aplpied to just knockdowns, stacks with above multiplicatively
- var/knockdown_mod = 1
- /// Lazylen of caps to maximum stun length in seconds - the smallest cap will be used
- var/list/max_stun_len
-
- /// Modifier to amount of blood lost when bleeding (both on life ticks and from flat bleed calls)
- var/bleed_mod = 1
- /// Modifier to amount blood regenerated per life tick
- var/blood_regen_mod = 1
-
- var/datum/armor/armor // internal armor datum
-
- var/hunger_mod = 1 //% of hunger rate taken per tick.
-
-/datum/physiology/New()
- armor = new
diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm
index 61a2354ca4a8..246c87b00832 100644
--- a/code/modules/mob/living/carbon/human/species_types/felinid.dm
+++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm
@@ -9,6 +9,7 @@
mutanteyes = /obj/item/organ/eyes/felinid
mutant_organs = list(
/obj/item/organ/tail/cat = "Cat",
+ /obj/item/organ/fangs/cat,
)
inherent_traits = list(
TRAIT_HATED_BY_DOGS,
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 0891f176ad64..83fb93e182c9 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -26,7 +26,7 @@
mutantlungs = null
inherent_biotypes = MOB_HUMANOID|MOB_MINERAL
payday_modifier = 1.0
- siemens_coeff = 0
+ siemens_coeff = 0.01
no_equip_flags = ITEM_SLOT_MASK | ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_ICLOTHING | ITEM_SLOT_SUITSTORE
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC
sexes = FALSE
@@ -70,9 +70,9 @@
// nutrition = health, so give people a head start
human_who_gained_species.set_nutrition(NUTRITION_LEVEL_WELL_FED)
- human_who_gained_species.physiology.stamina_mod *= 0.6
- human_who_gained_species.physiology.stun_mod *= 0.6
- human_who_gained_species.physiology.knockdown_mod *= 1.2
+ MODIFY_PHYSIOLOGY(human_who_gained_species, STAMINA, 0.6)
+ MODIFY_PHYSIOLOGY(human_who_gained_species, PHYS_COEFF_STUN, 0.6)
+ MODIFY_PHYSIOLOGY(human_who_gained_species, PHYS_COEFF_KNOCKDOWN, 1.2) //this offsets the positive effects of the lowered stun coeff on knockdowns specifically.
/datum/species/golem/on_species_loss(mob/living/carbon/human/human_who_lost_species, datum/species/new_species, pref_load)
. = ..()
@@ -85,9 +85,9 @@
COMSIG_LIVING_LIFE,
))
- human_who_lost_species.physiology.stamina_mod /= 0.6
- human_who_lost_species.physiology.stun_mod /= 0.6
- human_who_lost_species.physiology.knockdown_mod /= 1.2
+ MODIFY_PHYSIOLOGY(human_who_lost_species, STAMINA, 1 / 0.6)
+ MODIFY_PHYSIOLOGY(human_who_lost_species, PHYS_COEFF_STUN, 1 / 0.6)
+ MODIFY_PHYSIOLOGY(human_who_lost_species, PHYS_COEFF_KNOCKDOWN, 1/1.2)
/datum/species/golem/proc/on_life(mob/living/carbon/human/source, seconds_per_tick)
SIGNAL_HANDLER
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 851b9f0f3f46..77cce07d955f 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -68,14 +68,14 @@
// Blood regen thresholds use your real amount of blood.
if(slime.get_blood_volume() <= 0)
- slime.adjust_blood_volume(JELLY_REGEN_RATE_EMPTY * slime.physiology.blood_regen_mod * seconds_per_tick)
+ slime.adjust_blood_volume(JELLY_REGEN_RATE_EMPTY * GET_PHYSIOLOGY(slime, PHYS_COEFF_BLOOD_REGEN) * seconds_per_tick)
slime.adjust_brute_loss(2.5 * seconds_per_tick)
to_chat(slime, span_danger("You feel empty!"))
// Same logic applies here.
if(slime.get_blood_volume() < BLOOD_VOLUME_NORMAL)
if(slime.nutrition >= NUTRITION_LEVEL_STARVING)
- slime.adjust_blood_volume(JELLY_REGEN_RATE * slime.physiology.blood_regen_mod * seconds_per_tick)
+ slime.adjust_blood_volume(JELLY_REGEN_RATE * GET_PHYSIOLOGY(slime, PHYS_COEFF_BLOOD_REGEN) * seconds_per_tick)
if(slime.get_blood_volume() <= BLOOD_VOLUME_LOSE_NUTRITION) // don't lose nutrition if we are above a certain threshold, otherwise slimes on IV drips will still lose nutrition
slime.adjust_nutrition(-1.25 * seconds_per_tick)
@@ -120,7 +120,7 @@
to_chat(target, span_userdanger("Your [consumed_limb.name] is drawn back into your body, unable to maintain its shape!"))
qdel(consumed_limb)
- target.adjust_blood_volume(20 * target.physiology.blood_regen_mod)
+ target.adjust_blood_volume(20 * GET_PHYSIOLOGY(target, PHYS_COEFF_BLOOD_REGEN))
/datum/species/jelly/get_species_description()
return "Jellypeople are a strange and alien species with three eyes, made entirely out of gel."
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index eaf2db2c9d00..ef4edfbcb288 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -17,6 +17,7 @@
/obj/item/organ/snout = "Round",
/obj/item/organ/spines = SPRITE_ACCESSORY_NONE,
/obj/item/organ/tail/lizard = "Smooth",
+ /obj/item/organ/fangs/lizard,
)
mutanttongue = /obj/item/organ/tongue/lizard
mutanteyes = /obj/item/organ/eyes/lizard
@@ -110,6 +111,14 @@ Lizard subspecies: ASHWALKERS
TRAIT_MUTANT_COLORS,
TRAIT_VIRUSIMMUNE,
)
+ mutant_organs = list(
+ /obj/item/organ/horns = SPRITE_ACCESSORY_NONE,
+ /obj/item/organ/frills = SPRITE_ACCESSORY_NONE,
+ /obj/item/organ/snout = "Round",
+ /obj/item/organ/spines = SPRITE_ACCESSORY_NONE,
+ /obj/item/organ/tail/lizard = "Smooth",
+ /obj/item/organ/fangs/lizard/ash,
+ )
inherent_factions = list(FACTION_ASHWALKER)
species_language_holder = /datum/language_holder/lizard/ash
digitigrade_customization = DIGITIGRADE_FORCED
@@ -145,7 +154,6 @@ Lizard subspecies: SILVER SCALED
TRAIT_WINE_TASTER,
)
mutantlungs = null
- damage_modifier = 10 //very light silvery scales soften blows
species_language_holder = /datum/language_holder/lizard/silver
mutanttongue = /obj/item/organ/tongue/lizard/silver
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN
@@ -164,9 +172,11 @@ Lizard subspecies: SILVER SCALED
new_silverscale.add_eye_color("#0000a0", EYE_COLOR_SPECIES_PRIORITY)
. = ..()
new_silverscale.add_filter("silver_glint", 2, list("type" = "outline", "color" = "#ffffff63", "size" = 2))
+ new_silverscale.damage_resistance += 10
/datum/species/lizard/silverscale/on_species_loss(mob/living/carbon/human/was_silverscale, datum/species/new_species, pref_load)
was_silverscale.dna.features[FEATURE_MUTANT_COLOR] = old_mutcolor
was_silverscale.remove_eye_color(EYE_COLOR_SPECIES_PRIORITY)
was_silverscale.remove_filter("silver_glint")
+ was_silverscale.damage_resistance -= 10
return ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index 65ae620cf980..e8f431dd17f4 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -39,6 +39,10 @@
BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/plasmaman,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/plasmaman,
)
+ survival_box_overrides = list(
+ SURVIVAL_INTERNALS_TYPE = /obj/item/tank/internals/plasmaman/belt,
+ SURVIVAL_MEDIPEN_TYPE = /obj/item/reagent_containers/hypospray/medipen,
+ )
// Body temperature for Plasmen is much lower human as they can handle colder environments
bodytemp_normal = (BODYTEMP_NORMAL - 40)
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index e40b31a7c115..3e82afec326a 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -18,8 +18,10 @@
changesource_flags = MIRROR_BADMIN | MIRROR_PRIDE | WABBAJACK | ERT_SPAWN
exotic_bloodtype = /datum/blood_type/universal/vampire
blood_deficiency_drain_rate = BLOOD_DEFICIENCY_MODIFIER // vampires already passively lose blood, so this just makes them lose it slightly more quickly when they have blood deficiency.
+ mutant_organs = list(
+ /obj/item/organ/fangs/vampire,
+ )
mutantheart = /obj/item/organ/heart/vampire
- mutanttongue = /obj/item/organ/tongue/vampire
///some starter text sent to the vampire initially, because vampires have shit to do to stay alive
var/info_text = "You are a Vampire. You will slowly but constantly lose blood if outside of a coffin. If inside a coffin, you will slowly heal. You may gain more blood by grabbing a live victim and using your drain ability."
@@ -123,7 +125,7 @@
SPECIES_PERK_ICON = "tint",
SPECIES_PERK_NAME = "The Thirst",
SPECIES_PERK_DESC = "In place of eating, Vampires suffer from The Thirst. \
- Thirst of what? Blood! Their tongue allows them to grab people and drink \
+ Thirst of what? Blood! Their fangs allows them to grab people and drink \
their blood, and they will die if they run out. As a note, it doesn't \
matter whose blood you drink, it will all be converted into your blood \
type when consumed.",
@@ -147,28 +149,29 @@
return to_add
-/obj/item/organ/tongue/vampire
- name = "vampire teeth"
+/obj/item/organ/fangs/vampire
+ name = "vampire fangs"
desc = "The only thing with which it's acceptable to say \"I will suck you dry!\""
- icon_state = "tongue_vampire"
+ icon_state = "fangs_vampire"
actions_types = list(/datum/action/item_action/organ_action/vampire)
organ_traits = list(
TRAIT_DRINKS_BLOOD,
// future todo : tie nobreath and nohunger to a vampire organ set bonus
TRAIT_NOBREATH,
TRAIT_NOHUNGER,
+ TRAIT_REFINED_BITER,
)
COOLDOWN_DECLARE(drain_cooldown)
-/obj/item/organ/tongue/vampire/on_mob_insert(mob/living/carbon/receiver, special, movement_flags)
+/obj/item/organ/fangs/vampire/on_mob_insert(mob/living/carbon/receiver, special, movement_flags)
. = ..()
RegisterSignal(receiver, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(stab_bloodbag))
-/obj/item/organ/tongue/vampire/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/fangs/vampire/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
UnregisterSignal(organ_owner, COMSIG_ATOM_ITEM_INTERACTION)
-/obj/item/organ/tongue/vampire/proc/stab_bloodbag(mob/living/source, mob/living/user, obj/item/used_item, list/modifiers)
+/obj/item/organ/fangs/vampire/proc/stab_bloodbag(mob/living/source, mob/living/user, obj/item/used_item, list/modifiers)
SIGNAL_HANDLER
if(user != source)
@@ -188,7 +191,7 @@
INVOKE_ASYNC(src, PROC_REF(async_stab_bloodbag), user, used_item)
return ITEM_INTERACT_BLOCKING
-/obj/item/organ/tongue/vampire/proc/async_stab_bloodbag(mob/living/carbon/user, obj/item/reagent_containers/blood/bloodbag, time = 0.5 SECONDS)
+/obj/item/organ/fangs/vampire/proc/async_stab_bloodbag(mob/living/carbon/user, obj/item/reagent_containers/blood/bloodbag, time = 0.5 SECONDS)
if(!do_after(user, time, bloodbag))
return
@@ -210,8 +213,8 @@
return FALSE
var/mob/living/carbon/user = owner
- var/obj/item/organ/tongue/vampire/licker_drinker = target
- if(!COOLDOWN_FINISHED(licker_drinker, drain_cooldown))
+ var/obj/item/organ/fangs/vampire/fang_drinker = target
+ if(!COOLDOWN_FINISHED(fang_drinker, drain_cooldown))
to_chat(user, span_warning("You just drained blood, wait a few seconds!"))
return FALSE
@@ -232,7 +235,7 @@
else
to_chat(user, span_warning("[victim] doesn't have anything inside of them you could stomach!"))
return FALSE
- COOLDOWN_START(licker_drinker, drain_cooldown, 3 SECONDS)
+ COOLDOWN_START(fang_drinker, drain_cooldown, 3 SECONDS)
if(victim.can_block_magic(MAGIC_RESISTANCE_HOLY, charge_cost = 0))
victim.show_message(span_warning("[user] tries to bite you, but stops before touching you!"))
to_chat(user, span_warning("[victim] is blessed! You stop just in time to avoid catching fire."))
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 2f41e094c1c2..68c20f9b4200 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -54,7 +54,7 @@
/// Amount healed per regen tick - if 0, no regen will occur
var/regen_amount = 0.5
/// The hand to give the zombie - if null, they will have normal hands
- var/zombie_hand = /obj/item/mutant_hand/zombie
+ var/zombie_hand = null // DARKPACK EDIT CHANGE - Removes /tg/ zombie infection outbreak - Original : var/zombie_hand = /obj/item/mutant_hand/zombie
/// The movespeed modifier to apply to the zombie - if null, no movespeed modifier will be applied
var/movespeed_mod = /datum/movespeed_modifier/zombie
/// % Reduction to all physical damage the zombie takes
@@ -107,11 +107,11 @@
return FALSE
var/mob/living/carbon/human/new_zombie = owner
- LAZYADD(new_zombie.physiology.max_stun_len, max_stun_length)
+ RegisterSignal(new_zombie, COMSIG_HUMAN_SPEC_STUN, PROC_REF(on_spec_stun))
if(!isnull(movespeed_mod))
new_zombie.add_movespeed_modifier(movespeed_mod)
- new_zombie.physiology.stamina_mod *= stamina_modifier // Zombie stam resist
- new_zombie.physiology.damage_resistance += damage_modifier
+ MODIFY_PHYSIOLOGY(new_zombie, STAMINA, stamina_modifier) // Zombie stam resist
+ new_zombie.damage_resistance += damage_modifier
new_zombie.add_traits(unique_traits | zombie_traits, TRAIT_STATUS_EFFECT(id))
new_zombie.lighting_cutoff_red = 25
new_zombie.lighting_cutoff_green = 35
@@ -146,11 +146,13 @@
new_tongue.Insert(new_zombie, special = TRUE)
*/ // DARKPACK EDIT REMOVAL - Removes /tg/ zombie infection outbreak
+ /* // DARKPACK EDIT REMOVAL - Removes /tg/ zombie infection outbreak
if(!isnull(zombie_hand))
new_zombie.AddComponent( \
/datum/component/mutant_hands, \
mutant_hand_path = zombie_hand, \
)
+ */ // DARKPACK EDIT REMOVAL - Removes /tg/ zombie infection outbreak
if(regen_amount > 0)
new_zombie.AddComponent( \
/datum/component/regenerator, \
@@ -174,24 +176,27 @@
/datum/status_effect/zombie/on_remove()
var/mob/living/carbon/human/was_zombie = owner
+ /* // DARKPACK EDIT REMOVAL - Removes /tg/ zombie infection outbreak
var/obj/item/organ/tongue/zombie/old_tongue = was_zombie.get_organ_slot(ORGAN_SLOT_TONGUE)
var/obj/item/organ/tongue/removed_tongue_real = removed_tongue?.resolve()
+
if(!QDELETED(old_tongue))
qdel(old_tongue)
if(!QDELETED(removed_tongue_real))
removed_tongue_real.Insert(was_zombie, special = TRUE)
+ */ // DARKPACK EDIT REMOVAL - Removes /tg/ zombie infection outbreak
var/obj/item/bodypart/head/head = was_zombie.get_bodypart(BODY_ZONE_HEAD)
if(!QDELETED(head))
head.can_dismember = initial(head.can_dismember)
- qdel(was_zombie.GetComponent(/datum/component/mutant_hands))
+ //qdel(was_zombie.GetComponent(/datum/component/mutant_hands)) // DARKPACK EDIT REMOVAL - Removes /tg/ zombie infection outbreak
qdel(was_zombie.GetComponent(/datum/component/regenerator))
- LAZYREMOVE(was_zombie.physiology.max_stun_len, max_stun_length)
+ UnregisterSignal(was_zombie, COMSIG_HUMAN_SPEC_STUN)
if(!isnull(movespeed_mod))
was_zombie.remove_movespeed_modifier(movespeed_mod)
- was_zombie.physiology.stamina_mod /= stamina_modifier
- was_zombie.physiology.damage_resistance -= damage_modifier
+ MODIFY_PHYSIOLOGY(was_zombie, STAMINA, 1 / stamina_modifier)
+ was_zombie.damage_resistance -= damage_modifier
was_zombie.remove_traits(zombie_traits | unique_traits, TRAIT_STATUS_EFFECT(id))
was_zombie.lighting_cutoff_red = initial(was_zombie.lighting_cutoff_red)
was_zombie.lighting_cutoff_green = initial(was_zombie.lighting_cutoff_green)
@@ -220,6 +225,10 @@
owner.mob_biotypes &= ~MOB_ORGANIC
removed_biotypes = MOB_ORGANIC
+/datum/status_effect/zombie/proc/on_spec_stun(list/amount)
+ SIGNAL_HANDLER
+ amount[1] = min(amount[1], max_stun_length)
+
/datum/status_effect/zombie/proc/remove_zombie_biotypes()
owner.mob_biotypes &= ~added_biotypes
owner.mob_biotypes |= removed_biotypes
diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm
index be2284f580d3..8a237ce73355 100644
--- a/code/modules/mob/living/carbon/human/status_procs.dm
+++ b/code/modules/mob/living/carbon/human/status_procs.dm
@@ -1,22 +1,22 @@
/mob/living/carbon/human/Stun(amount, ignore_canstun = FALSE)
- amount = dna.species.spec_stun(src, amount)
+ amount = spec_stun(amount)
return ..()
/mob/living/carbon/human/Knockdown(amount, daze_amount = 0, ignore_canstun = FALSE)
- amount = dna.species.spec_stun(src, amount) * physiology.knockdown_mod
+ amount = spec_stun(amount)
return ..()
/mob/living/carbon/human/Paralyze(amount, ignore_canstun = FALSE)
- amount = dna.species.spec_stun(src, amount)
+ amount = spec_stun(amount)
return ..()
/mob/living/carbon/human/Immobilize(amount, ignore_canstun = FALSE)
- amount = dna.species.spec_stun(src, amount)
+ amount = spec_stun(amount)
return ..()
/mob/living/carbon/human/Unconscious(amount, ignore_canstun = FALSE)
- amount = dna.species.spec_stun(src, amount)
+ amount = spec_stun(amount)
if(HAS_TRAIT(src, TRAIT_HEAVY_SLEEPER))
amount *= (rand(125, 130) * 0.01)
return ..()
@@ -30,3 +30,8 @@
. = ..()
if(.)
update_body_parts()
+
+/mob/living/carbon/human/proc/spec_stun(amount)
+ var/list/stun_amount = list(dna.species.stunmod * amount)
+ SEND_SIGNAL(src, COMSIG_HUMAN_SPEC_STUN, stun_amount)
+ return stun_amount[1]
diff --git a/code/modules/mob/living/carbon/init_signals.dm b/code/modules/mob/living/carbon/init_signals.dm
index 8201c0237366..4e8916edea1b 100644
--- a/code/modules/mob/living/carbon/init_signals.dm
+++ b/code/modules/mob/living/carbon/init_signals.dm
@@ -154,3 +154,11 @@
/mob/living/carbon/on_hearing_loss(datum/source)
. = ..()
breathing_loop.stop()
+
+/mob/living/carbon/on_stasis_trait_gain(datum/source)
+ . = ..()
+ update_bodypart_bleed_overlays()
+
+/mob/living/carbon/on_stasis_trait_loss(datum/source)
+ . = ..()
+ update_bodypart_bleed_overlays()
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 0ab13a4aa3d4..ede9177a9a3e 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -362,6 +362,7 @@
// Enough to make the mob sleep.
if(n2o_pp > n2o_sleep_min)
Sleeping(max(AmountSleeping() + 40, 200))
+ breath_moles[/datum/gas/nitrous_oxide] -= breath_moles[/datum/gas/nitrous_oxide] //DARKPACK EDIT ADD - N2O Self-consumes
else if(n2o_pp > 0.01)
// No alert for small amounts, but the mob randomly feels euphoric.
if(prob(20))
@@ -743,8 +744,8 @@
if(HAS_TRAIT(src, TRAIT_STABLELIVER) || HAS_TRAIT(src, TRAIT_LIVERLESS_METABOLISM))
return
- adjust_tox_loss(0.6 * seconds_per_tick, forced = TRUE)
- adjust_organ_loss(pick(ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_STOMACH, ORGAN_SLOT_EYES, ORGAN_SLOT_EARS), 0.5* seconds_per_tick)
+ adjust_tox_loss(0.6 * seconds_per_tick, forced = TRUE) //liver failure should kill slimepeople (or any human mob with toxin-lover or toxin-immune traits)
+ adjust_organ_loss(pick(ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_STOMACH, ORGAN_SLOT_EYES, ORGAN_SLOT_EARS), 0.5 * seconds_per_tick)
/mob/living/carbon/proc/undergoing_liver_failure()
var/obj/item/organ/liver/liver = get_organ_slot(ORGAN_SLOT_LIVER)
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index f78e6ad5a766..e0f3a6a8eaae 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -35,8 +35,10 @@
wound_clothing = TRUE,
)
SHOULD_CALL_PARENT(TRUE)
+
var/damage_amount = damage
if(!forced)
+ blocked += damage_resistance
damage_amount *= ((100 - blocked) / 100)
damage_amount *= get_incoming_damage_modifier(damage_amount, damagetype, def_zone, sharpness, attack_direction, attacking_item)
if(damage_amount <= 0)
@@ -138,6 +140,7 @@
var/final_mod = 1
for(var/new_mod in damage_mods)
final_mod *= new_mod
+
return final_mod
/**
@@ -290,17 +293,6 @@
return TRUE
-/// Returns a multiplier to apply to a specific kind of damage
-/mob/living/proc/get_damage_mod(damage_type)
- switch(damage_type)
- if (OXY)
- return HAS_TRAIT(src, TRAIT_NOBREATH) ? 0 : 1
- if (TOX)
- if (HAS_TRAIT(src, TRAIT_TOXINLOVER))
- return -1
- return HAS_TRAIT(src, TRAIT_TOXIMMUNE) ? 0 : 1
- return 1
-
/mob/living/proc/get_brute_loss()
return bruteloss
@@ -312,28 +304,43 @@
return TRUE
/mob/living/proc/adjust_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
- if (!can_adjust_brute_loss(amount, forced, required_bodytype))
+ if(amount > 0 && !forced) //carbon mobs override this proc, so the damage modifier check is also performed on [limb/receive_damage()]
+ amount *= GET_PHYSIOLOGY(src, BRUTE)
+
+ if (!amount || !can_adjust_brute_loss(amount, forced, required_bodytype))
return 0
- . = bruteloss
+ var/difference = bruteloss
bruteloss = clamp((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
- . -= bruteloss
- if(!.) // no change, no need to update
- return 0
- if(updating_health)
- updatehealth()
+ difference -= bruteloss
+
+ return on_damage_loss(amount, updating_health, forced, BRUTE, difference)
/mob/living/proc/set_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
if(!forced && HAS_TRAIT(src, TRAIT_GODMODE))
- return FALSE
- . = bruteloss
+ return 0
+ var/difference = bruteloss
bruteloss = amount
+ difference -= bruteloss
- if(!.) // no change, no need to update
- return FALSE
- if(updating_health)
- updatehealth()
- . -= bruteloss
+ return on_damage_loss(-difference, updating_health, forced, BRUTE, difference)
+
+/**
+ * This proc resets any burn, tox and oxy change that the mob has received and adds the amount/difference to bruteloss.
+ * Used by simple and basic mobs. For the sake of simplicity, all damage they receive (beside stamina) is funneled into a single damage type. It makes things easier for other
+ * coders I guess.
+ */
+/mob/living/proc/simple_transfer_to_brute_loss(amount)
+ PROTECTED_PROC(TRUE) //Again, this is workaround to the lack of support that simple/basic mobs have for multiple damage types in the code, do not use it for other things.
+ fireloss = 0
+ toxloss = 0
+ oxyloss = 0
+
+ var/difference = bruteloss
+ bruteloss = clamp(bruteloss + amount, 0, maxHealth * 2)
+ difference -= bruteloss
+
+ return difference
/mob/living/proc/get_oxy_loss()
return oxyloss
@@ -346,27 +353,28 @@
return TRUE
/mob/living/proc/adjust_oxy_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL)
- if(!can_adjust_oxy_loss(amount, forced, required_biotype))
+ if(amount > 0 && !forced)
+ amount *= GET_PHYSIOLOGY(src, OXY)
+
+ if(!amount || !can_adjust_oxy_loss(amount, forced, required_biotype))
return 0
- . = oxyloss
+
+ var/difference = oxyloss
oxyloss = clamp((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
- . -= oxyloss
- if(!.) // no change, no need to update
- return FALSE
- if(updating_health)
- updatehealth()
+ difference -= oxyloss
+
+ return on_damage_loss(amount, updating_health, forced, OXY, difference)
/mob/living/proc/set_oxy_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL)
- if(!forced && HAS_TRAIT(src, TRAIT_GODMODE))
- return FALSE
+ if(!forced)
+ if(HAS_TRAIT(src, TRAIT_GODMODE))
+ return 0
- . = oxyloss
+ var/difference = oxyloss
oxyloss = amount
- . -= oxyloss
- if(!.) // no change, no need to update
- return FALSE
- if(updating_health)
- updatehealth()
+ difference -= oxyloss
+
+ return on_damage_loss(-difference, updating_health, forced, OXY, difference)
/mob/living/proc/get_tox_loss()
return toxloss
@@ -379,7 +387,10 @@
return TRUE
/mob/living/proc/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL)
- if(!can_adjust_tox_loss(amount, forced, required_biotype))
+ if(amount > 0 && !forced)
+ amount *= GET_PHYSIOLOGY(src, TOX)
+
+ if(!amount || !can_adjust_tox_loss(amount, forced, required_biotype))
return 0
if(!forced && HAS_TRAIT(src, TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage
@@ -394,29 +405,22 @@
else if(!forced && HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing
amount = min(amount, 0)
- . = toxloss
+ var/difference = toxloss
toxloss = clamp((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
- . -= toxloss
-
- if(!.) // no change, no need to update
- return FALSE
-
- if(updating_health)
- updatehealth()
+ difference -= toxloss
+ return on_damage_loss(amount, updating_health, forced, TOX, difference)
/mob/living/proc/set_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL)
if(!forced && HAS_TRAIT(src, TRAIT_GODMODE))
- return FALSE
+ return 0
if(!forced && !(mob_biotypes & required_biotype))
- return FALSE
- . = toxloss
+ return 0
+ var/difference = toxloss
toxloss = amount
- . -= toxloss
- if(!.) // no change, no need to update
- return FALSE
- if(updating_health)
- updatehealth()
+ difference -= toxloss
+
+ return on_damage_loss(-difference, updating_health, forced, TOX, difference)
/mob/living/proc/get_fire_loss()
return fireloss
@@ -429,26 +433,25 @@
return TRUE
/mob/living/proc/adjust_fire_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
- if(!can_adjust_fire_loss(amount, forced, required_bodytype))
+ if(amount > 0 && !forced) //carbon mobs override this proc, so the damage modifier check is also performed on [limb/receive_damage()]
+ amount *= GET_PHYSIOLOGY(src, BURN)
+
+ if(!amount || !can_adjust_fire_loss(amount, forced, required_bodytype))
return 0
- . = fireloss
+ var/difference = fireloss
fireloss = clamp((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
- . -= fireloss
- if(. == 0) // no change, no need to update
- return
- if(updating_health)
- updatehealth()
+ difference -= fireloss
+
+ return on_damage_loss(amount, updating_health, forced, BURN, difference)
/mob/living/proc/set_fire_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
if(!forced && HAS_TRAIT(src, TRAIT_GODMODE))
return 0
- . = fireloss
+ var/difference = fireloss
fireloss = amount
- . -= fireloss
- if(. == 0) // no change, no need to update
- return 0
- if(updating_health)
- updatehealth()
+ difference -= fireloss
+
+ return on_damage_loss(-difference, updating_health, forced, BURN, difference)
/mob/living/proc/adjust_organ_loss(slot, amount, maximum, required_organ_flag)
return
@@ -470,19 +473,16 @@
return TRUE
/mob/living/proc/adjust_stamina_loss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL)
- if(!can_adjust_stamina_loss(amount, forced, required_biotype))
+ if(amount > 0 && !forced)
+ amount *= GET_PHYSIOLOGY(src, STAMINA)
+
+ if(!amount || !can_adjust_stamina_loss(amount, forced, required_biotype))
return 0
+
var/old_amount = staminaloss
staminaloss = clamp((staminaloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, max_stamina)
var/delta = old_amount - staminaloss
- if(delta <= 0)
- // need to check for stamcrit AFTER canadjust but BEFORE early return here
- received_stamina_damage(staminaloss, -1 * delta)
- if(delta == 0) // no change, no need to update
- return 0
- if(updating_stamina)
- updatehealth()
- return delta
+ return on_damage_loss(amount, updating_stamina, forced, STAMINA, delta)
/mob/living/proc/set_stamina_loss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL)
if(!forced && HAS_TRAIT(src, TRAIT_GODMODE))
@@ -492,21 +492,36 @@
var/old_amount = staminaloss
staminaloss = amount
var/delta = old_amount - staminaloss
- if(delta <= 0 && amount >= DAMAGE_PRECISION)
- received_stamina_damage(staminaloss, -1 * delta, amount)
- if(delta == 0) // no change, no need to update
- return 0
- if(updating_stamina)
+ return on_damage_loss(-delta, updating_stamina, forced, STAMINA, delta)
+
+/**
+ * Called at the end of each set/adjust_x_loss proc, regardless of whether damage was actually inflicted/healed or not.
+ *
+ * params:
+ * * amount: the amount of damage taken/recovered after value modifiers BUT BEFORE clamping the value between [maxHealth]/[max_stamina] * 2 and 0
+ * * updating_health: if the caller proc is to be followed by an [updatehealth()] proc call
+ * * forced: if the caller proc has had the forced arg set to TRUE (ignores damage modifiers
+ * * damage_type: one of BRUTE, BURN, OXY, TOX or STAMINA
+ * * difference: the difference between the old and new (brute/fire/oxy/tox/stamina)loss var values. Unlike amount, negative values is damage received, positive is healing.
+ */
+/mob/living/proc/on_damage_loss(amount, updating_health, forced, damage_type, difference)
+ SHOULD_CALL_PARENT(TRUE)
+ if(difference) // only call on_damage_loss_changed if there's an actual change
+ //We pass down 'difference' and not 'amount' as that's the actual change, with its sign swapped to match
+ //how positive values represent damage and negative represent healing in adjust_x_loss() calls once again (less confusing this way).
+ on_damage_loss_changed(-difference, updating_health, forced, damage_type)
+ return difference //I'm pretty sure only mob_damage unit tests need this return value, but who knows...
+
+///Called by [on_damage_loss()], if the damage was actually inflicted or healed (difference different than 0)
+/mob/living/proc/on_damage_loss_changed(amount, updating_health, forced, damage_type)
+ SHOULD_CALL_PARENT(TRUE)
+ if(damage_type == STAMINA && amount > 0)
+ timed_stamina_reset()
+ if(updating_health)
updatehealth()
- return delta
-
-/// The mob has received stamina damage
-///
-/// - current_level: The mob's current stamina damage amount (to save unnecessary get_stamina_loss() calls)
-/// - amount_actual: The amount of stamina damage received, in actuality
-/// For example, if you are taking 50 stamina damage but are at 90, you would actually only receive 30 stamina damage (due to the cap)
-/// - amount: The amount of stamina damage received, raw
-/mob/living/proc/received_stamina_damage(current_level, amount_actual, amount)
+
+/// Reset the stamina damage back to 0 after an amount of time (dictated by the [stamina_regen_time] var). However the timer is reset everytime the mob takes stamina damage.
+/mob/living/proc/timed_stamina_reset()
addtimer(CALLBACK(src, PROC_REF(set_stamina_loss), 0, TRUE, TRUE), stamina_regen_time, TIMER_UNIQUE|TIMER_OVERRIDE)
/**
diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm
index c3971e56cf37..61691779c969 100644
--- a/code/modules/mob/living/init_signals.dm
+++ b/code/modules/mob/living/init_signals.dm
@@ -249,11 +249,13 @@
/// Called when [TRAIT_STASIS] is added to the mob
/mob/living/proc/on_stasis_trait_gain(datum/source)
SIGNAL_HANDLER
+ ADD_TRAIT(src, TRAIT_TUMOR_SUPPRESSED, TRAIT_STASIS)
update_incapacitated()
/// Called when [TRAIT_STASIS] is removed from the mob
/mob/living/proc/on_stasis_trait_loss(datum/source)
SIGNAL_HANDLER
+ REMOVE_TRAIT(src, TRAIT_TUMOR_SUPPRESSED, TRAIT_STASIS)
update_incapacitated()
/// Called when [TRAIT_NODEATH] is added or removed from the mob
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index bc3c6988bad9..dc6a93c268f0 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -55,6 +55,7 @@
QDEL_LIST(imaginary_group)
QDEL_LAZYLIST(diseases)
QDEL_LAZYLIST(quirks)
+ QDEL_NULL(inner_armor)
if(!isnull(unconscious_appearance))
// Not super necessary strictly speaking but just in case
@@ -566,7 +567,7 @@ GAME_VERB_HIDDEN(/mob/living, succumb, "succumb")
// DARKPACK EDIT CHANGE START - Torpor
if (HAS_TRAIT(src, TRAIT_CAN_ENTER_TORPOR) && !HAS_TRAIT(src, TRAIT_TORPOR))
log_message("Has [whispered ? "whispered his final words and" : ""]succumbed to Torpor with [round(health, 0.1)] points of health!", LOG_ATTACK)
- adjust_oxy_loss(health - HEALTH_THRESHOLD_DEAD)
+ adjust_oxy_loss(health - dead_threshold)
updatehealth()
if(!whispered)
to_chat(src, span_notice("You have succumbed to Torpor."))
@@ -574,7 +575,7 @@ GAME_VERB_HIDDEN(/mob/living, succumb, "succumb")
torpor(DAMAGE_TRAIT)
else
log_message("Has [whispered ? "whispered his final words" : "succumbed to death"] with [round(health, 0.1)] points of health!", LOG_ATTACK)
- adjust_oxy_loss(health - HEALTH_THRESHOLD_DEAD)
+ adjust_oxy_loss(health - dead_threshold)
updatehealth()
if(!whispered)
to_chat(src, span_notice("You have given up life and succumbed to death."))
@@ -1059,7 +1060,7 @@ GAME_VERB_PROC(/mob/living, mob_sleep, "Sleep", null)
/mob/living/proc/can_be_revived()
if(HAS_TRAIT(src, TRAIT_NODEATH))
return TRUE
- if(health > HEALTH_THRESHOLD_DEAD)
+ if(health > dead_threshold)
return TRUE
return FALSE
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 0f57ec1ad825..e1ff06d1e4a3 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -29,8 +29,32 @@
return our_armor
/mob/living/proc/getarmor(def_zone, type)
+ SHOULD_CALL_PARENT(TRUE)
+ var/worn_armor = get_worn_armor_value(def_zone, type)
+ var/inner_armor_percent = min(inner_armor?.get_rating(type) * 0.01, 1)
+ var/not_blocked = (100 - worn_armor) * (1 - inner_armor_percent)
+ return 100 - not_blocked
+
+/mob/living/proc/get_worn_armor_value(obj/item/bodypart/def_zone, damage_type)
return 0
+///This proc adds the ratings of an armor type to our inner armor, which is initialized if previously null.
+/mob/living/proc/add_inner_armor(datum/armor/armor_to_add)
+ if(isnull(inner_armor))
+ inner_armor = new
+ inner_armor = inner_armor.add_other_armor(armor_to_add)
+
+///This proc removes the ratings of an armor type from our inner armor, then deletes it if all ratings are 0.
+/mob/living/proc/remove_inner_armor(datum/armor/armor_to_remove)
+ if(isnull(inner_armor))
+ return
+ inner_armor = inner_armor.subtract_other_armor(armor_to_remove)
+ var/list/ratings_list = inner_armor.get_rating_list()
+ for(var/rating in ratings_list)
+ if(ratings_list[rating] != 0)
+ return
+ QDEL_NULL(inner_armor) //all ratings are 0, meaning we no longer have an intrinsic armor of some kind.
+
/// This returns the mob's protection against eye damage (number between -1 and 2) from bright lights
/mob/living/proc/get_eye_protection()
return 0
@@ -593,6 +617,7 @@
/mob/living/proc/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)
if(SEND_SIGNAL(src, COMSIG_LIVING_ELECTROCUTE_ACT, shock_damage, source, siemens_coeff, flags) & COMPONENT_LIVING_BLOCK_SHOCK)
return FALSE
+ siemens_coeff *= GET_PHYSIOLOGY(src, PHYS_COEFF_ELEC_CONDUCTIVITY)
shock_damage *= siemens_coeff
if((flags & SHOCK_TESLA) && HAS_TRAIT(src, TRAIT_TESLA_SHOCKIMMUNE))
return FALSE
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 13f52e43240e..6557a408c448 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -36,6 +36,13 @@
///Burn damage caused by being way too hot, too cold or burnt.
var/fireloss = 0
+ ///Lazy list of multipliers for related to mobs, like burn/brute/oxy/tox/stamina damage, hunger, bleeding, electrical conductivity
+ var/list/physiology
+ ///Contains an inner armor datum separated from worn armor (I could use the default 'armor' var but it might cause some confusion)
+ VAR_PROTECTED/datum/armor/inner_armor
+ ///Used on apply_damage(). Less than 0 means you take extra damage. While over 100 is where no damage is taken at all.
+ var/damage_resistance = 0
+
/// The movement intent of the mob (run/wal)
var/move_intent = MOVE_INTENT_RUN
@@ -46,6 +53,8 @@
var/crit_threshold = HEALTH_THRESHOLD_CRIT
///When the mob enters hard critical state and is fully incapacitated.
var/hardcrit_threshold = HEALTH_THRESHOLD_FULLCRIT
+ ///Amount of damage needed to be fully dead
+ var/dead_threshold = HEALTH_THRESHOLD_DEAD
//Damage dealing vars! These are meaningless outside of specific instances where it's checked and defined.
/// Lower bound of damage done by unarmed melee attacks. Mob code is a mess, only works where this is checked for.
diff --git a/code/modules/mob/living/living_item_handling.dm b/code/modules/mob/living/living_item_handling.dm
index 1e94b42f83d9..99c0a12a3629 100644
--- a/code/modules/mob/living/living_item_handling.dm
+++ b/code/modules/mob/living/living_item_handling.dm
@@ -80,6 +80,11 @@
power_throw += potential_spine.added_throw_speed
extra_throw_range += potential_spine.added_throw_range
+ // DARKPACK EDIT ADD START - Strength Based Throw Speed
+ var/strength = st_get_stat(STAT_STRENGTH)
+ power_throw += strength/5
+ // DARKPACK EDIT ADD END
+
if(HAS_TRAIT(src, TRAIT_HULK))
power_throw++
if(HAS_TRAIT(src, TRAIT_DWARF))
diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm
index 876ec8c87256..24fccb015c9e 100644
--- a/code/modules/mob/living/living_movement.dm
+++ b/code/modules/mob/living/living_movement.dm
@@ -158,6 +158,6 @@
return ..()
/mob/living/keybind_face_direction(direction)
- if(IS_UNCONSCIOUS(src))
+ if(!(mobility_flags & MOBILITY_MOVE))
return
return ..()
diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm
index e78f41519361..db2518b82f69 100644
--- a/code/modules/mob/living/living_say.dm
+++ b/code/modules/mob/living/living_say.dm
@@ -189,7 +189,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list(
message_range = 1
// this is where deathgasping is processed
if(stat == HARD_CRIT)
- var/health_diff = round(-HEALTH_THRESHOLD_DEAD + health)
+ var/health_diff = round(-dead_threshold + health)
// If we cut our message short, abruptly end it with a-..
var/message_len = length_char(message)
message = copytext_char(message, 1, health_diff) + "[message_len > health_diff ? "-.." : "..."]"
@@ -363,7 +363,8 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list(
if(deaf_message)
deaf_type = MSG_VISUAL
message = deaf_message
- return show_message(message, MSG_VISUAL, deaf_message, deaf_type, avoid_highlight)
+ show_message(message, MSG_VISUAL, deaf_message, deaf_type, avoid_highlight)
+ return FALSE // Return false so TTS doesn't attempt to read this message.
return FALSE
// Out of message range but within eavesdrop range - alter displayed message
if(outside_dist > 0)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index eeb32b83e502..8de6d7e585db 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -401,32 +401,18 @@ GAME_VERB(/mob/living/silicon/ai, toggle_anchor, "Toggle Floor Bolts", "AI Comma
ADD_TRAIT(src, TRAIT_NO_TELEPORT, AI_ANCHOR_TRAIT)
/// Creates an MMI of the AI based on its configuration.
-/mob/living/silicon/ai/proc/make_mmi(atom/destination) as /obj/item/mmi
- RETURN_TYPE(/obj/item/mmi)
- //FIXME: this code is really bad, we shouldn't be doing most of this ourselves. MMI code needs a good refactoring....
- var/obj/item/mmi/copied_mmi
+/mob/living/silicon/ai/proc/make_mmi(atom/destination) as /obj/item/brain_processor
+ RETURN_TYPE(/obj/item/brain_processor)
+ var/obj/item/brain_processor/copied_mmi
if(posibrain_inside)
- copied_mmi = new /obj/item/mmi/posibrain(destination, FALSE)
- copied_mmi.name = "[initial(copied_mmi.name)] ([real_name])"
+ copied_mmi = new /obj/item/brain_processor/positronic(destination, FALSE)
+ copied_mmi.brainmob.set_stat(STABLE) // posis are dead by default
else
- copied_mmi = new /obj/item/mmi(destination)
- copied_mmi.name = "[initial(copied_mmi.name)]: [real_name]"
- copied_mmi.brain = new /obj/item/organ/brain(copied_mmi)
- copied_mmi.brain.organ_flags |= ORGAN_FROZEN
- copied_mmi.brain.name = "[real_name]'s brain"
- copied_mmi.set_brainmob(new /mob/living/brain(copied_mmi))
- copied_mmi.brainmob.container = copied_mmi
-
- copied_mmi.brainmob.name = real_name
- copied_mmi.brainmob.real_name = real_name
- copied_mmi.brainmob.gender = gender
-
- var/suicided = HAS_TRAIT(src, TRAIT_SUICIDED)
- copied_mmi.brainmob.set_suicide(suicided)
- copied_mmi.brain?.suicided = suicided // we can't guarantee that the MMI has a brain... sigh
+ copied_mmi = new /obj/item/brain_processor/organic(destination, new /obj/item/organ/brain())
- if(copied_mmi.brainmob.stat == DEAD && !suicided)
- copied_mmi.brainmob.set_stat(STABLE)
+ copied_mmi.brainmob.gender = gender
+ copied_mmi.set_name(real_name)
+ copied_mmi.set_suicide(HAS_TRAIT(src, TRAIT_SUICIDED))
copied_mmi.update_appearance()
return copied_mmi
@@ -1228,14 +1214,14 @@ GAME_VERB_DESC(/mob/living/silicon/ai, deploy_to_shell, "Deploy to Shell", "Tran
/mob/living/silicon/ai/proc/on_core_exited(datum/source, atom/movable/gone, direction)
SIGNAL_HANDLER
- if(istype(gone, /obj/item/mmi))
- var/obj/item/mmi/mmi_gone = gone
+ if(istype(gone, /obj/item/brain_processor))
+ var/obj/item/brain_processor/processor_gone = gone
on_core_destroyed(source, NONE)
if(!IS_MALF_AI(src)) //don't pull back shunted malf AIs
death(gibbed = TRUE, drop_mmi = FALSE)
///the drop_mmi param determines whether the MMI is dropped at their current location
///which in this case would be somewhere else, so we drop their MMI at the core instead
- mind?.transfer_to(mmi_gone.brainmob)
+ mind?.transfer_to(processor_gone.brainmob)
qdel(src)
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 6397742d69ae..bb460c4643b6 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -56,8 +56,9 @@
ShutOffDoomsdayDevice()
if(gibbed && drop_mmi)
- var/obj/item/mmi/loose_cpu = make_mmi(get_turf(src))
+ var/obj/item/brain_processor/loose_cpu = make_mmi(get_turf(src))
mind?.transfer_to(loose_cpu.brainmob)
+ loose_cpu.update_appearance()
if(explodes_on_death)
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), loc, 3, 6, 12, null, 15), 1 SECONDS)
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index fb7c822caa42..86fe3b832964 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -65,8 +65,10 @@
/mob/living/silicon/ai/update_stat()
if(HAS_TRAIT(src, TRAIT_GODMODE))
return
- if(stat != DEAD && health <= HEALTH_THRESHOLD_DEAD)
+ if(stat != DEAD && health <= dead_threshold)
death()
+ else if(stat < DEAD)
+ set_stat(STABLE)
diag_hud_set_status()
/mob/living/silicon/ai/update_sight()
diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm
index f19defcc7482..6596af7d3eb0 100644
--- a/code/modules/mob/living/silicon/ai/multicam.dm
+++ b/code/modules/mob/living/silicon/ai/multicam.dm
@@ -113,7 +113,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room)
/obj/effect/landmark/ai_multicam_room
name = "ai camera room"
- icon = 'icons/mob/landmarks.dmi'
+ icon = 'icons/effects/landmarks_static.dmi'
icon_state = "x"
/obj/effect/landmark/ai_multicam_room/Initialize(mapload)
diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm
index 83012e32f3d4..48a63945b3b6 100644
--- a/code/modules/mob/living/silicon/damage_procs.dm
+++ b/code/modules/mob/living/silicon/damage_procs.dm
@@ -1,34 +1,31 @@
/mob/living/silicon/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = FALSE)
return FALSE //The only effect that can hit them atm is flashes and they still directly edit so this works for now. (This was written in at least 2016. Help)
-/mob/living/silicon/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype) //immune to tox damage
+/mob/living/silicon/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) //immune to tox damage
return FALSE
-/mob/living/silicon/set_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype)
+/mob/living/silicon/set_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL)
return FALSE
-/mob/living/silicon/adjust_stamina_loss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) //immune to stamina damage.
+/mob/living/silicon/adjust_stamina_loss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL) //immune to stamina damage.
return FALSE
-/mob/living/silicon/set_stamina_loss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype)
+/mob/living/silicon/set_stamina_loss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL)
return FALSE
-/mob/living/silicon/received_stamina_damage(current_level, amount_actual, amount)
- return
-
/mob/living/silicon/adjust_organ_loss(slot, amount, maximum = 500, required_organ_flag) //immune to organ damage (no organs, duh)
return FALSE
/mob/living/silicon/set_organ_loss(slot, amount)
return FALSE
-/mob/living/silicon/adjust_oxy_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype) //immune to oxygen damage
+/mob/living/silicon/adjust_oxy_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) //immune to oxygen damage
if(isAI(src)) //ais are snowflakes and use oxyloss for being in AI cards and having no battery
return ..()
return FALSE
-/mob/living/silicon/set_oxy_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype)
+/mob/living/silicon/set_oxy_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL)
if(isAI(src)) //ditto
return ..()
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index ade8110744b5..976c0f846722 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -76,16 +76,7 @@
else
//MMI stuff. Held togheter by magic. ~Miauw
if(!mmi?.brainmob)
- mmi = new (src)
- mmi.brain = new /obj/item/organ/brain(mmi)
- mmi.brain.organ_flags |= ORGAN_FROZEN
- mmi.brain.name = "[real_name]'s brain"
- mmi.name = "[initial(mmi.name)]: [real_name]"
- mmi.set_brainmob(new /mob/living/brain(mmi))
- mmi.brainmob.name = src.real_name
- mmi.brainmob.real_name = src.real_name
- mmi.brainmob.container = mmi
- mmi.update_appearance()
+ mmi = new /obj/item/brain_processor/organic(src, new /obj/item/organ/brain())
setup_default_name()
if(mmi.brainmob)
@@ -113,11 +104,7 @@
/mob/living/silicon/robot/set_suicide(suicide_state)
. = ..()
- if(mmi)
- if(mmi.brain)
- mmi.brain.suicided = suicide_state
- if(suicide_state && mmi.brainmob)
- ADD_TRAIT(mmi.brainmob, TRAIT_SUICIDED, REF(src))
+ mmi?.set_suicide(suicide_state)
/**
* Sets the tablet theme and icon
@@ -324,7 +311,7 @@
cut_overlays()
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
icon_state = model.cyborg_base_icon
- if(!IS_UNCONSCIOUS(src) && !IsStun() && !IsParalyzed() && !low_power_mode) //Not dead, not stunned.
+ if(!IS_UNCONSCIOUS(src) && !IsStun() && !IsParalyzed() && !low_power_mode && !is_empty_shell()) //Not dead, not stunned, not an unpiloted AI shell.
if(!eye_lights)
eye_lights = new()
if(lamp_enabled || lamp_doom)
@@ -530,7 +517,7 @@
balloon_alert(src, "disrupted!")
return FALSE
- if(!(update_color && lamp_enabled) && (turn_off || lamp_enabled || update_color || !lamp_functional || IS_UNCONSCIOUS_OR_CRIT(src) || low_power_mode))
+ if(!(update_color && lamp_enabled) && (turn_off || lamp_enabled || update_color || !lamp_functional || IS_UNCONSCIOUS_OR_CRIT(src) || low_power_mode || is_empty_shell()))
set_light_on(lamp_functional && stat != DEAD && lamp_doom) //If the lamp isn't broken and borg isn't dead, doomsday borgs cannot disable their light fully.
set_light_color(COLOR_RED) //This should only matter for doomsday borgs, as any other time the lamp will be off and the color not seen
set_light_range(1) //Again, like above, this only takes effect when the light is forced on by doomsday mode.
@@ -587,7 +574,7 @@
if(isnull(mmi))
return
- var/obj/item/mmi/removing = mmi
+ var/obj/item/brain_processor/removing = mmi
mmi.forceMove(at_location) // Nulls it out via exited
if(isnull(mind)) // no one to transfer, just leave the MMI.
@@ -746,6 +733,7 @@
builtInCamera.c_tag = real_name
modularInterface.imprint_id(name = real_name)
custom_name = newname
+ mmi?.set_name(newname)
/mob/living/silicon/robot/proc/ResetModel()
@@ -877,6 +865,13 @@
if(!QDELETED(builtInCamera))
builtInCamera.c_tag = real_name //update the camera name too
diag_hud_set_aishell()
+ if(lamp_enabled)
+ toggle_headlamp(TRUE)
+ update_icons()
+
+/// Is this an AI shell with no AI currently piloting it?
+/mob/living/silicon/robot/proc/is_empty_shell()
+ return shell && !deployed
/**
* revert_shell: Reverts AI shell back into a normal cyborg unit
@@ -895,6 +890,7 @@
if(!QDELETED(builtInCamera))
builtInCamera.c_tag = real_name
diag_hud_set_aishell()
+ update_icons()
/**
* deploy_init: Deploys AI unit into AI shell
@@ -925,6 +921,7 @@
LAZYSET(radio.secure_radio_connections, chan, add_radio(radio, GLOB.default_radio_channels[chan]))
diag_hud_set_aishell()
+ update_icons()
undeployment_action.Grant(src)
/datum/action/innate/undeployment
@@ -952,6 +949,9 @@
deployed = FALSE
mainframe.deployed_shell = null
undeployment_action.Remove(src)
+ if(lamp_enabled)
+ toggle_headlamp(TRUE)
+ update_icons()
REMOVE_TRAIT(src, TRAIT_LOUD_BINARY, REF(mainframe))
if(radio) //Return radio to normal
radio.recalculateChannels()
diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm
index d92a040cba72..e7f0a95a7387 100644
--- a/code/modules/mob/living/silicon/robot/robot_defense.dm
+++ b/code/modules/mob/living/silicon/robot/robot_defense.dm
@@ -507,7 +507,20 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
. = TRUE
return ..() || .
-/mob/living/silicon/robot/apply_damage(damage, damagetype, def_zone, blocked, forced, spread_damage, wound_bonus, exposed_wound_bonus, sharpness, attack_direction, attacking_item, wound_clothing)
+/mob/living/silicon/robot/apply_damage/apply_damage(
+ damage = 0,
+ damagetype = BRUTE,
+ def_zone = null,
+ blocked = 0,
+ forced = FALSE,
+ spread_damage = FALSE,
+ wound_bonus = 0,
+ exposed_wound_bonus = 0,
+ sharpness = NONE,
+ attack_direction = null,
+ attacking_item,
+ wound_clothing = TRUE,
+)
var/mob/living/silicon/robot/borg = src
var/obj/item/shield_module/shield = locate() in borg
if(!shield)
diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm
index 43ee94254444..812e4df1d50c 100644
--- a/code/modules/mob/living/silicon/robot/robot_defines.dm
+++ b/code/modules/mob/living/silicon/robot/robot_defines.dm
@@ -40,7 +40,7 @@
// Parts
var/custom_name = ""
var/braintype = "Cyborg"
- var/obj/item/mmi/mmi = null
+ var/obj/item/brain_processor/mmi = null
///Used for deconstruction to remember what the borg was constructed out of.
var/obj/item/robot_suit/robot_suit = null
///If this is a path, this gets created as an object in Initialize.
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index a1c56b842c3d..b878d4efbe1c 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -374,4 +374,4 @@
. += borg_laws
/mob/living/silicon/get_access()
- return REGION_ACCESS_ALL_STATION
+ return SSid_access.accesses_by_region[REGION_ALL_STATION]
diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm
index 824579103898..d70ea1fc69a4 100644
--- a/code/modules/mob/living/simple_animal/animal_defense.dm
+++ b/code/modules/mob/living/simple_animal/animal_defense.dm
@@ -213,42 +213,25 @@
. = ..()
if(!. || QDELETED(src))
return FALSE
-
- switch (severity)
+ var/bomb_armor = getarmor(null, BOMB)
+ var/bomb_multi = clamp(1 - bomb_armor/200, 0, 1) // Scales linearly down to 50% damage at 100 armor
+ var/bloss
+ switch(severity)
if (EXPLODE_DEVASTATE)
- ex_act_devastate()
+ if(bomb_armor < EXPLODE_GIB_THRESHOLD)
+ investigate_log("has been gibbed by an explosion.", INVESTIGATE_DEATHS)
+ gib(DROP_ALL_REMAINS)
+ else
+ adjust_brute_loss(500)
if (EXPLODE_HEAVY)
- ex_act_heavy()
+ bloss = 60
if (EXPLODE_LIGHT)
- ex_act_light()
-
+ bloss = 30
+ if(bloss)
+ bloss *= bomb_multi
+ adjust_brute_loss(bloss)
return TRUE
-/// Called when a devastating explosive acts on this mob
-/mob/living/simple_animal/proc/ex_act_devastate()
- var/bomb_armor = getarmor(null, BOMB)
- if(prob(bomb_armor))
- adjust_brute_loss(500)
- else
- investigate_log("has been gibbed by an explosion.", INVESTIGATE_DEATHS)
- gib()
-
-/// Called when a heavy explosive acts on this mob
-/mob/living/simple_animal/proc/ex_act_heavy()
- var/bomb_armor = getarmor(null, BOMB)
- var/bloss = 60
- if(prob(bomb_armor))
- bloss = bloss / 1.5
- adjust_brute_loss(bloss)
-
-/// Called when a light explosive acts on this mob
-/mob/living/simple_animal/proc/ex_act_light()
- var/bomb_armor = getarmor(null, BOMB)
- var/bloss = 30
- if(prob(bomb_armor))
- bloss = bloss / 1.5
- adjust_brute_loss(bloss)
-
/mob/living/simple_animal/blob_act(obj/structure/blob/B)
adjust_brute_loss(20)
return
diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm
index d908364ce7b6..1533a191f7e3 100644
--- a/code/modules/mob/living/simple_animal/damage_procs.dm
+++ b/code/modules/mob/living/simple_animal/damage_procs.dm
@@ -1,73 +1,12 @@
-/**
- * Adjusts the health of a simple mob by a set amount and wakes AI if its idle to react
- *
- * Arguments:
- * * amount The amount that will be used to adjust the mob's health
- * * updating_health If the mob's health should be immediately updated to the new value
- * * forced If we should force update the adjustment of the mob's health no matter the restrictions, like TRAIT_GODMODE
- */
-/mob/living/simple_animal/proc/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- . = FALSE
- if(forced || !HAS_TRAIT(src, TRAIT_GODMODE))
- var/old_loss = bruteloss
- bruteloss = round(clamp(bruteloss + amount, 0, maxHealth * 2), DAMAGE_PRECISION)
- if(updating_health)
- updatehealth()
- . = old_loss - bruteloss
- if(ckey || stat)
- return
+/mob/living/simple_animal/on_damage_loss(amount, updating_health, forced, damage_type, difference)
+ var/transfered_loss
+ if(damage_type != BRUTE && damage_type != STAMINA)
+ transfered_loss = simple_transfer_to_brute_loss(amount)
+ if(!ckey && stat == STABLE && amount > 0)
+ toggle_ai_on_damage()
+ . = ..()
+ return transfered_loss || .
+
+/mob/living/simple_animal/proc/toggle_ai_on_damage()
if(AIStatus == AI_IDLE)
toggle_ai(AI_ON)
-
-/mob/living/simple_animal/get_damage_mod(damage_type)
- var/modifier = ..()
- if (damage_type in damage_coeff)
- return modifier * damage_coeff[damage_type]
- return modifier
-
-/mob/living/simple_animal/adjust_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
- if(!can_adjust_brute_loss(amount, forced, required_bodytype))
- return 0
- if(forced)
- . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced)
- else if(damage_coeff[BRUTE])
- . = adjustHealth(amount * damage_coeff[BRUTE] * CONFIG_GET(number/damage_multiplier), updating_health, forced)
-
-/mob/living/simple_animal/adjust_fire_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
- if(!can_adjust_fire_loss(amount, forced, required_bodytype))
- return 0
- if(forced)
- . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced)
- else if(damage_coeff[BURN])
- . = adjustHealth(amount * damage_coeff[BURN] * CONFIG_GET(number/damage_multiplier), updating_health, forced)
-
-/mob/living/simple_animal/adjust_oxy_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype)
- if(!can_adjust_oxy_loss(amount, forced, required_biotype))
- return 0
- if(forced)
- . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced)
- else if(damage_coeff[OXY])
- . = adjustHealth(amount * damage_coeff[OXY] * CONFIG_GET(number/damage_multiplier), updating_health, forced)
-
-/mob/living/simple_animal/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype)
- if(!can_adjust_tox_loss(amount, forced, required_biotype))
- return 0
- if(forced)
- . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced)
- else if(damage_coeff[TOX])
- . = adjustHealth(amount * damage_coeff[TOX] * CONFIG_GET(number/damage_multiplier), updating_health, forced)
-
-/mob/living/simple_animal/adjust_stamina_loss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype)
- if(!can_adjust_stamina_loss(amount, forced, required_biotype))
- return 0
- var/old_stamloss = staminaloss
- if(forced)
- staminaloss = max(0, min(max_staminaloss, staminaloss + amount))
- else
- staminaloss = max(0, min(max_staminaloss, staminaloss + (amount * damage_coeff[STAMINA])))
- if(updating_stamina)
- update_stamina()
- return old_stamloss - staminaloss
-
-/mob/living/simple_animal/received_stamina_damage(current_level, amount_actual, amount)
- return
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 4fbe79e7f369..4299aac36a84 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -372,18 +372,18 @@
GLOB.move_manager.move_to(src, target, minimum_distance, delay, flags = MOVEMENT_LOOP_IGNORE_GLIDE)
return TRUE
-/mob/living/simple_animal/hostile/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
+/mob/living/simple_animal/hostile/toggle_ai_on_damage(health_change)
. = ..()
- if(!ckey && !IS_UNCONSCIOUS_OR_CRIT(src) && search_objects < 3 && . > 0)//Not unconscious, and we don't ignore mobs
- if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight
- LoseTarget()
- LoseSearchObjects()
- if(AIStatus != AI_ON && AIStatus != AI_OFF)
- toggle_ai(AI_ON)
- FindTarget()
- else if(target != null && prob(40))//No more pulling a mob forever and having a second player attack it, it can switch targets now if it finds a more suitable one
- FindTarget()
-
+ if(search_objects >= 3)
+ return
+ if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight
+ LoseTarget()
+ LoseSearchObjects()
+ if(AIStatus != AI_ON && AIStatus != AI_OFF)
+ toggle_ai(AI_ON)
+ FindTarget()
+ else if(target != null && prob(40))//No more pulling a mob forever and having a second player attack it, it can switch targets now if it finds a more suitable one
+ FindTarget()
/mob/living/simple_animal/hostile/proc/AttackingTarget(atom/attacked_target)
in_melee = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm
index c3932fd77eb2..ee79d0ea43ad 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm
@@ -16,7 +16,7 @@
ranged_ignores_vision = TRUE
stat_attack = DEAD
atmos_requirements = null
- damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(BURN = 0.5, STAMINA = 0)
minbodytemp = 0
maxbodytemp = INFINITY
vision_range = 5
@@ -128,7 +128,7 @@
if(!isliving(target))
return
var/mob/living/living_target = target
- if(living_target.stat == DEAD || (living_target.health <= HEALTH_THRESHOLD_DEAD && HAS_TRAIT(living_target, TRAIT_NODEATH)))
+ if(living_target.stat == DEAD || (living_target.health <= dead_threshold && HAS_TRAIT(living_target, TRAIT_NODEATH)))
devour(living_target)
return
if(isnull(client) && ranged && ranged_cooldown <= world.time)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index 27eeaffaed93..76d5f4d30786 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -275,18 +275,18 @@ Difficulty: Hard
set_varspeed(move_to_delay)
handle_automated_action() // need to recheck movement otherwise move_to_delay won't update until the next checking aka will be wrong speed for a bit
-/mob/living/simple_animal/hostile/megafauna/bubblegum/adjust_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
+/mob/living/simple_animal/hostile/megafauna/bubblegum/on_damage_loss_changed(amount, updating_health, forced, damage_type)
. = ..()
anger_modifier = clamp(((maxHealth - health)/60),0,20)
enrage_time = initial(enrage_time) * clamp(anger_modifier / 20, 0.5, 1)
if(hallucination_charge)
hallucination_charge.enraged = BUBBLEGUM_SMASH
- if(. > 0 && prob(25))
- var/obj/effect/decal/cleanable/blood/gibs/bubblegum/B = new /obj/effect/decal/cleanable/blood/gibs/bubblegum(loc)
+ if(amount > 0 && prob(25))
+ var/obj/effect/decal/cleanable/blood/gibs/bubblegum/gibs = new (loc)
if(prob(40))
- step(B, pick(GLOB.cardinals))
+ step(gibs, pick(GLOB.cardinals))
else
- B.setDir(pick(GLOB.cardinals))
+ gibs.setDir(pick(GLOB.cardinals))
/mob/living/simple_animal/hostile/megafauna/bubblegum/death(gibbed)
. = ..()
@@ -344,8 +344,18 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Life(seconds_per_tick = SSMOBS_DT)
return
-/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/adjust_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
- return
+// Prevents damage, period. These are hallucinations/afterimages/whatever and should delete on their own.
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/can_adjust_brute_loss(amount, forced, required_bodytype)
+ return FALSE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/can_adjust_fire_loss(amount, forced, required_bodytype)
+ return FALSE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/can_adjust_tox_loss(amount, forced, required_bodytype)
+ return FALSE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/can_adjust_oxy_loss(amount, forced, required_bodytype)
+ return FALSE
/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/OpenFire()
return
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
index 5546a3a00dd3..f94e895db19b 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
@@ -137,7 +137,7 @@ Difficulty: Extremely Hard
return
update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 8 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 8 SECONDS))
frost_orbs.StartCooldown(8 SECONDS)
- adjustHealth(-maxHealth)
+ adjust_brute_loss(-maxHealth)
enraged = TRUE
enraging = TRUE
animate(src, pixel_z = 96, time = 100, easing = ELASTIC_EASING, flags = ANIMATION_RELATIVE)
@@ -155,7 +155,7 @@ Difficulty: Extremely Hard
playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE)
ADD_TRAIT(src, TRAIT_MOVE_FLYING, FROSTMINER_ENRAGE_TRAIT)
enraging = FALSE
- adjustHealth(-maxHealth)
+ adjust_brute_loss(-maxHealth)
/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/ex_act(severity, target)
adjust_brute_loss(-30 * severity)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 11e61104571b..7617386a003b 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -170,13 +170,36 @@
return FALSE
return ..()
-/mob/living/simple_animal/hostile/megafauna/dragon/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- anger_modifier = clamp(((maxHealth - health)/60),0,20)
- lava_swoop.enraged = DRAKE_ENRAGED
+// Prevents damage from adjust_x_loss while in a host, because that damage would be nullified by the next [proc/sync_health] call. Adjust host blood volume instead.
+/mob/living/simple_animal/hostile/megafauna/dragon/can_adjust_brute_loss(amount, forced, required_bodytype)
+ if(!forced && (swooping & SWOOP_INVULNERABLE))
+ return FALSE
+ return ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/can_adjust_fire_loss(amount, forced, required_bodytype)
+ if(!forced && (swooping & SWOOP_INVULNERABLE))
+ return FALSE
+ return ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/can_adjust_tox_loss(amount, forced, required_bodytype)
if(!forced && (swooping & SWOOP_INVULNERABLE))
return FALSE
return ..()
+/mob/living/simple_animal/hostile/megafauna/dragon/can_adjust_oxy_loss(amount, forced, required_bodytype)
+ if(!forced && (swooping & SWOOP_INVULNERABLE))
+ return FALSE
+ return ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/on_damage_loss_changed(amount, updating_health, forced)
+ if(amount > 0)
+ lava_swoop.enraged = DRAKE_ENRAGED
+ return ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/updatehealth()
+ . = ..()
+ anger_modifier = clamp(((maxHealth - health)/60),0,20)
+
/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE)
if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit
return
@@ -318,7 +341,7 @@
melee_damage_upper = 30
melee_damage_lower = 30
mouse_opacity = MOUSE_OPACITY_ICON
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
+ physiology = list(STAMINA = 0)
loot = list()
crusher_loot = null
achievement_type = null
@@ -332,7 +355,7 @@
mass_fire.Remove(src)
lava_swoop.cooldown_time = 20 SECONDS
-/mob/living/simple_animal/hostile/megafauna/dragon/lesser/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
+/mob/living/simple_animal/hostile/megafauna/dragon/lesser/on_damage_loss_changed(amount, updating_health, forced)
. = ..()
lava_swoop?.enraged = FALSE // In case taking damage caused us to start deleting ourselves
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 5e187df4db91..87eade6a4ce1 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -427,7 +427,7 @@ Difficulty: Hard
sitting_at_center = TRUE
visible_message(span_hierophant_warning("\"Vixyvrmrk xs fewi...\""))
blink(beacon)
- adjustHealth(min((health - maxHealth) * 0.5, -250)) //heal for 50% of our missing health, minimum 10% of maximum health
+ adjust_brute_loss(min((health - maxHealth) * 0.5, -250)) //heal for 50% of our missing health, minimum 10% of maximum health
wander = FALSE
if(health > maxHealth * 0.9)
visible_message(span_hierophant("\"Vitemvw gsqtpixi. Stivexmrk ex qebmqyq ijjmgmirgc.\""))
@@ -464,11 +464,11 @@ Difficulty: Hard
if(beacon && loc == beacon.loc && sitting_at_center)
arena_trap(src)
-/mob/living/simple_animal/hostile/megafauna/hierophant/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- . = ..()
- if(src && . && !blinking)
+/mob/living/simple_animal/hostile/megafauna/hierophant/on_damage_loss_changed(amount, updating_health, forced)
+ if(amount > 0 && !blinking)
wander = TRUE
sitting_at_center = FALSE
+ return ..()
/mob/living/simple_animal/hostile/megafauna/hierophant/AttackingTarget(atom/attacked_target)
if(!blinking)
@@ -483,7 +483,7 @@ Difficulty: Hard
burst_range = 3
INVOKE_ASYNC(src, PROC_REF(burst), get_turf(src), 0.25) //melee attacks on living mobs cause it to release a fast burst if on cooldown
OpenFire()
- if(L.health <= HEALTH_THRESHOLD_DEAD && HAS_TRAIT(L, TRAIT_NODEATH)) //Nope, it still kills yall
+ if(L.health <= L.dead_threshold && HAS_TRAIT(L, TRAIT_NODEATH)) //Nope, it still kills yall
devour(L)
else
devour(L)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
index 39b3d17038ff..d19a579646bb 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -141,8 +141,8 @@
wander = TRUE
///This makes sure that the legion door opens on taking damage, so you can't cheese this boss.
-/mob/living/simple_animal/hostile/megafauna/legion/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- if(GLOB.necropolis_gate && true_spawn)
+/mob/living/simple_animal/hostile/megafauna/legion/on_damage_loss_changed(amount, updating_health, forced)
+ if(GLOB.necropolis_gate && true_spawn && amount > 0)
GLOB.necropolis_gate.toggle_the_gate(null, TRUE) //very clever.
return ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
index 7693d47647df..dce852dd9ebe 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
@@ -274,7 +274,7 @@ While using this makes the system rely on OnFire, it still gives options for tim
for(var/mob/living/simple_animal/hostile/asteroid/elite/elitehere in loc)
if(elitehere == mychild && activity == TUMOR_PASSIVE)
- mychild.adjustHealth(-mychild.maxHealth * 0.025*seconds_per_tick)
+ mychild.adjust_brute_loss(-mychild.maxHealth * 0.025*seconds_per_tick)
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(mychild))
H.color = COLOR_RED
@@ -303,7 +303,7 @@ While using this makes the system rely on OnFire, it still gives options for tim
if(QDELETED(mychild) || mychild.stat == DEAD)
onEliteLoss()
return
- if(QDELETED(activator) || activator.stat == DEAD || (activator.health <= HEALTH_THRESHOLD_DEAD && HAS_TRAIT(activator, TRAIT_NODEATH)))
+ if(QDELETED(activator) || activator.stat == DEAD || (activator.health <= activator.dead_threshold && HAS_TRAIT(activator, TRAIT_NODEATH)))
if(!QDELETED(activator) && HAS_TRAIT(activator, TRAIT_NODEATH)) // dust the unkillable activator
activator.dust(drop_items = TRUE)
onEliteWon()
diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm
index 749f60e58d20..e00092eeeb5f 100644
--- a/code/modules/mob/living/simple_animal/hostile/ooze.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm
@@ -108,7 +108,7 @@
name = "Gelatinous Cube"
desc = "A cubic ooze native to Sholus VII.\nSince the advent of space travel this species has established itself in the waste treatment facilities of several space colonies.\nIt is often considered to be the third most infamous invasive species due to its highly aggressive and predatory nature."
speed = 1
- damage_coeff = list(BRUTE = 1, BURN = 0.6, TOX = 0.5, STAMINA = 0, OXY = 1)
+ physiology = list(BRUTE = 1, BURN = 0.6, TOX = 0.5, OXY = 1, STAMINA = 0)
melee_damage_lower = 20
melee_damage_upper = 20
armour_penetration = 15
@@ -302,7 +302,7 @@
speed = 1
health = 200
maxHealth = 200
- damage_coeff = list(BRUTE = 1, BURN = 0.8, TOX = 0.5, STAMINA = 0, OXY = 1)
+ physiology = list(BRUTE = 1, BURN = 0.8, TOX = 0.5, OXY = 1, STAMINA = 0)
melee_damage_lower = 12
melee_damage_upper = 12
obj_damage = 15
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 95b49a5a57e2..ad1f075d9fea 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -88,7 +88,7 @@
///Damage type of a simple mob's melee attack, should it do damage.
var/melee_damage_type = BRUTE
/// 1 for full damage , 0 for none , -1 for 1:1 heal from that source.
- var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1, AGGRAVATED = 1) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE
+ physiology = list(STAMINA = 0)
///Attacking verb in present continuous tense.
var/attack_verb_continuous = "attacks"
///Attacking verb in present simple tense.
@@ -182,7 +182,7 @@
emote_hear = string_list(emote_hear)
if(LAZYLEN(emote_see))
emote_see = string_list(emote_see)
- damage_coeff = string_assoc_list(damage_coeff)
+
if(footstep_type)
AddElement(/datum/element/footstep, footstep_type)
if(isnull(unsuitable_cold_damage))
@@ -244,7 +244,7 @@
* Reduces the stamina loss by stamina_recovery
*/
/mob/living/simple_animal/update_stamina()
- if(damage_coeff[STAMINA] <= 0) //we shouldn't reset our speed to its initial value if we don't need to, as that can mess with things like mulebot motor wires
+ if(GET_PHYSIOLOGY(src, STAMINA) <= 0) //we shouldn't reset our speed to its initial value if we don't need to, as that can mess with things like mulebot motor wires
return
set_varspeed(initial(speed) + (staminaloss * 0.06))
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index 43a3514d198b..176b3fe05fc7 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -40,6 +40,7 @@
return 0
/mob/living/proc/Stun(amount, ignore_canstun = FALSE) //Can't go below remaining duration
+ amount *= GET_PHYSIOLOGY(src, PHYS_COEFF_STUN)
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, ignore_canstun) & COMPONENT_NO_STUN)
return
if(check_stun_immunity(CANSTUN, ignore_canstun))
@@ -90,6 +91,7 @@
return 0
/mob/living/proc/Knockdown(amount, daze_amount = 0, ignore_canstun = FALSE) //Can't go below remaining duration
+ amount *= GET_PHYSIOLOGY(src, PHYS_COEFF_KNOCKDOWN) * GET_PHYSIOLOGY(src, PHYS_COEFF_STUN)
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, ignore_canstun) & COMPONENT_NO_STUN)
return
if(check_stun_immunity(CANKNOCKDOWN, ignore_canstun))
@@ -144,6 +146,7 @@
return 0
/mob/living/proc/Immobilize(amount, ignore_canstun = FALSE) //Can't go below remaining duration
+ amount *= GET_PHYSIOLOGY(src, PHYS_COEFF_STUN)
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, ignore_canstun) & COMPONENT_NO_STUN)
return
if(check_stun_immunity(CANSTUN, ignore_canstun))
@@ -194,6 +197,7 @@
return 0
/mob/living/proc/Paralyze(amount, ignore_canstun = FALSE) //Can't go below remaining duration
+ amount *= GET_PHYSIOLOGY(src, PHYS_COEFF_STUN)
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, ignore_canstun) & COMPONENT_NO_STUN)
return
if(check_stun_immunity(CANSTUN|CANKNOCKDOWN, ignore_canstun)) // this requires both can stun and can knockdown
@@ -337,6 +341,7 @@
return 0
/mob/living/proc/Unconscious(amount, ignore_canstun = FALSE) //Can't go below remaining duration
+ amount *= GET_PHYSIOLOGY(src, PHYS_COEFF_STUN)
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_UNCONSCIOUS, amount, ignore_canstun) & COMPONENT_NO_STUN)
return
if(check_stun_immunity(CANUNCONSCIOUS, ignore_canstun))
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index 9e231b00fe89..270404e0924b 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -41,6 +41,9 @@
client.clear_screen() //remove hud items just in case
client.images = list()
client.set_right_click_menu_mode(shift_to_open_context_menu)
+ // Draws to the default map
+ client.eye_parallax = client.create_parallax("")
+ client.eye_parallax.set_perspective(src)
if(!hud_used)
create_mob_hud() // creating a hud will add it to the client's screen, which can process a disconnect
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 9a1065a2f829..f4a4c7455adb 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -618,6 +618,7 @@ GAME_VERB_CONTEXT(/mob, examinate, "Examine", "", null, /atom)
result_combined = (atom_title ? fieldset_block("[atom_title].", jointext(result, "
"), "boxed_message") : boxed_message(jointext(result, "
")))
to_chat(src, span_infoplain(result_combined))
+ mind?.guestbook?.on_examine(src, examinify, result_combined) // DARKPACK EDIT ADD - GUESTBOOK
SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, examinify)
/// Handles adding examine messages for the target that are specific to this mob, e.g. a blood worm examining how much blood a living target has.
@@ -1604,10 +1605,6 @@ GAME_VERB_NATIVE(/mob, DisDblClick, ".dblclick", null, argu = null as anything,
for(var/datum/callback/CB as anything in persistent_client.post_logout_callbacks)
CB.Invoke()
- if(canon_client?.movingmob)
- LAZYREMOVE(canon_client.movingmob.client_mobs_in_contents, src)
- canon_client.movingmob = null
-
clear_important_client_contents()
canon_client = null
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index bbe77bff0f04..73138fb7eaf3 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -495,7 +495,7 @@
if(iscyborg(mob) || islarva(mob))
divided_health = (mob.health + mob.maxHealth) / (mob.maxHealth * 2)
else if(iscarbon(mob) || isAI(mob) || isbrain(mob))
- divided_health = abs(HEALTH_THRESHOLD_DEAD - mob.health) / abs(HEALTH_THRESHOLD_DEAD - mob.maxHealth)
+ divided_health = abs(mob.dead_threshold - mob.health) / abs(mob.dead_threshold - mob.maxHealth)
return divided_health * 100
/**
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 8ce70cd9522d..79c833becc9e 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -392,6 +392,7 @@ GAME_VERB_HIDDEN(/client, drop_item, "drop item")
*/
/mob/proc/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, daze, force_drop = FALSE)
SEND_SIGNAL(src, COMSIG_MOB_SLIPPED, knockdown_amount, slipped_on, lube_flags, paralyze, daze, force_drop)
+ return TRUE
/mob/living/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, daze, force_drop = FALSE)
add_mob_memory(/datum/memory/was_slipped, antagonist = slipped_on)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index d4f733ba5b9e..6dd942edb6b2 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -144,12 +144,7 @@
new_borg.apply_pref_name(/datum/preference/name/cyborg, new_borg.client)
if(new_borg.mmi)
- new_borg.mmi.name = "[initial(new_borg.mmi.name)]: [real_name]"
- if(new_borg.mmi.brain)
- new_borg.mmi.brain.name = "[real_name]'s brain"
- if(new_borg.mmi.brainmob)
- new_borg.mmi.brainmob.real_name = real_name //the name of the brain inside the cyborg is the robotized human's name.
- new_borg.mmi.brainmob.name = real_name
+ new_borg.mmi.set_name(real_name)
new_borg.job = JOB_CYBORG
new_borg.notify_ai(AI_NOTIFICATION_NEW_BORG)
diff --git a/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm b/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm
index 04432bf8bd09..5307c601d3e9 100644
--- a/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm
+++ b/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm
@@ -9,7 +9,7 @@
prompt_name = "venus human trap"
you_are_text = "You are a venus human trap."
flavour_text = "You are a venus human trap! Protect the kudzu at all costs, and feast on those who oppose you!"
- faction = list(FACTION_HOSTILE,FACTION_VINES,FACTION_PLANTS)
+ faction = list(FACTION_HOSTILE, FACTION_VINES, FACTION_PLANTS)
spawner_job_path = /datum/job/venus_human_trap
invisibility = INVISIBILITY_ABSTRACT //The flower bud structure is our visible component, we just handle logic.
/// Physical structure housing the spawner
@@ -24,14 +24,20 @@
flower_bud = null
return ..()
-/obj/effect/mob_spawn/ghost_role/venus_human_trap/equip(mob/living/basic/venus_human_trap/spawned_human_trap)
- if(spawned_human_trap && flower_bud)
- if(flower_bud.trait_flags & SPACEVINE_HEAT_RESISTANT)
- spawned_human_trap.unsuitable_heat_damage = 0
- if(flower_bud.trait_flags & SPACEVINE_COLD_RESISTANT)
- spawned_human_trap.unsuitable_cold_damage = 0
+/obj/effect/mob_spawn/ghost_role/venus_human_trap/equip(mob/living/basic/venus_human_trap/venus_trap)
+ if(!venus_trap || !flower_bud)
+ return
+
+ for(var/datum/spacevine_mutation/mutation in flower_bud.mutations)
+ mutation.equip_venus_trap(venus_trap)
/obj/effect/mob_spawn/ghost_role/venus_human_trap/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs)
+ if(flower_bud && length(flower_bud.mutations))
+ var/list/flavour_mutation_list = list()
+ flavour_mutation_list += " You have the following vine mutations:"
+ for(var/datum/spacevine_mutation/mutation in flower_bud.mutations)
+ flavour_mutation_list += span_notice(mutation.venus_flavor_text)
+ flavour_text += flavour_mutation_list.Join("\n")
. = ..()
spawned_mob.mind.add_antag_datum(/datum/antagonist/venus_human_trap)
diff --git a/code/modules/mob_spawn/mob_spawn.dm b/code/modules/mob_spawn/mob_spawn.dm
index 7e9af0dd7b3b..e91fa805cd2c 100644
--- a/code/modules/mob_spawn/mob_spawn.dm
+++ b/code/modules/mob_spawn/mob_spawn.dm
@@ -308,7 +308,8 @@
output_message += "\n[flavour_text]"
if(important_text != "")
output_message += "\n[span_userdanger("[important_text]")]"
- to_chat(spawned_mob, output_message)
+
+ to_chat(spawned_mob, boxed_message(output_message), type = MESSAGE_TYPE_INFO)
/// Checks if the spawner has zero uses left, if so, delete yourself... NOW!
/obj/effect/mob_spawn/ghost_role/proc/check_uses()
diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm
index 1cf5b3c31457..dadc8151ea50 100644
--- a/code/modules/mod/mod_clothes.dm
+++ b/code/modules/mod/mod_clothes.dm
@@ -79,6 +79,17 @@
. = ..()
ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT)
+/obj/item/clothing/shoes/mod/proc/update_footstep_sounds()
+ switch(slowdown)
+ if(0.3 to INFINITY)
+ AddComponent(/datum/component/shoe_footstep, list('sound/items/modsuit/rigstep_chonk.ogg'), volume = 50)
+ if(0.2 to 0.3)
+ AddComponent(/datum/component/shoe_footstep, list('sound/items/modsuit/rigstep_heavy.ogg'), volume = 50)
+ if(0.1 to 0.2)
+ AddComponent(/datum/component/shoe_footstep, list('sound/items/modsuit/rigstep_medium.ogg'), volume = 50)
+ if(-INFINITY to 0.1)
+ AddComponent(/datum/component/shoe_footstep, list('sound/items/modsuit/rigstep.ogg'), volume = 50)
+
/obj/item/clothing/glasses/mod
name = "\improper MOD glasses"
desc = "A pair of glasses for a MODsuit."
diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm
index d5b897990a1e..b0749a7b3a05 100644
--- a/code/modules/mod/mod_construction.dm
+++ b/code/modules/mod/mod_construction.dm
@@ -92,7 +92,7 @@
desc = "External plating used to finish a MOD control unit."
icon_state = "standard-plating"
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/plasma = SMALL_MATERIAL_AMOUNT * 5)
- var/datum/mod_theme/theme = /datum/mod_theme
+ var/datum/mod_theme/theme = /datum/mod_theme/standard
/obj/item/mod/construction/plating/Initialize(mapload)
. = ..()
diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm
index f4fe36f03dcb..4e982c5763e5 100644
--- a/code/modules/mod/mod_control.dm
+++ b/code/modules/mod/mod_control.dm
@@ -33,7 +33,7 @@
alternate_worn_layer = HANDS_LAYER+0.1 //we want it to go above generally everything, but not hands
interaction_flags_click = NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING
/// The MOD's theme, decides on some stuff like armor and statistics.
- var/datum/mod_theme/theme = /datum/mod_theme
+ var/datum/mod_theme/theme = /datum/mod_theme/standard
/// Looks of the MOD.
var/skin = "standard"
/// Theme of the MOD TGUI
@@ -747,6 +747,9 @@
part.slowdown = total_slowdown / length(mod_parts)
if (!part_datum.sealed)
part.slowdown = max(part.slowdown, 0)
+ if(istype(part, /obj/item/clothing/shoes/mod))
+ var/obj/item/clothing/shoes/mod/shoe_part = part
+ shoe_part.update_footstep_sounds()
wearer?.update_equipment_speed_mods()
/obj/item/mod/control/proc/power_off()
diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm
index a048abeb7283..c0def6dd573f 100644
--- a/code/modules/mod/mod_core.dm
+++ b/code/modules/mod/mod_core.dm
@@ -555,10 +555,10 @@
update_greyscale()
/obj/item/mod/core/soul/charge_source()
- return CONFIG_GET(flag/disable_human_mood) ? src : mod.wearer?.mob_mood
+ return mod.wearer?.mob_mood
/obj/item/mod/core/soul/max_charge_amount()
- return CONFIG_GET(flag/disable_human_mood) ? INFINITY : SANITY_MAXIMUM
+ return SANITY_MAXIMUM
/obj/item/mod/core/soul/charge_amount()
var/mob/living/wearer = mod.wearer
@@ -566,20 +566,14 @@
return 0
if(HAS_TRAIT(wearer, TRAIT_NO_SOUL))
return 0 // Can't draw from something that isn't there.
- if(CONFIG_GET(flag/disable_human_mood))
- return INFINITY
var/datum/mood/source = charge_source()
return source?.sanity
/obj/item/mod/core/soul/check_charge(amount)
- if(CONFIG_GET(flag/disable_human_mood))
- return !!mod.wearer
return charge_amount() >= amount * 10 / STANDARD_CELL_CHARGE
/obj/item/mod/core/soul/subtract_charge(amount)
var/mob/living/wearer = mod.wearer
- if(CONFIG_GET(flag/disable_human_mood))
- return !!wearer
var/datum/mood/source = charge_source()
source.adjust_sanity(-amount * 10 / STANDARD_CELL_CHARGE)
var/backlash_type = get_backlash_type(wearer)
@@ -593,8 +587,6 @@
var/mob/living/wearer = mod.wearer
if(!wearer || HAS_TRAIT(wearer, TRAIT_NO_SOUL))
return "No power source detected."
- if(CONFIG_GET(flag/disable_human_mood))
- return "Infinite"
return "[round(charge_amount() / max_charge_amount() * 100, 0.1)]%"
/obj/item/mod/core/soul/get_chargebar_color()
@@ -689,13 +681,17 @@
. = ..()
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))
+ if(mod.wearer)
+ on_mod_wearer_set(mod, mod.wearer)
/obj/item/mod/core/candela/uninstall()
UnregisterSignal(mod, list(COMSIG_MOD_WEARER_SET, COMSIG_MOD_WEARER_UNSET))
+ if(mod.wearer)
+ on_mod_wearer_unset(mod)
return ..()
/obj/item/mod/core/candela/process(seconds_per_tick)
- if (charge >= max_charge)
+ if (charge >= max_charge || !mod.active)
return
if (!handler.network)
diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm
index d71806952481..f9f41ac5b45e 100644
--- a/code/modules/mod/mod_theme.dm
+++ b/code/modules/mod/mod_theme.dm
@@ -1,24 +1,21 @@
/// Global proc that sets up all MOD themes as singletons in a list and returns it.
/proc/setup_mod_themes()
. = list()
- for(var/path in typesof(/datum/mod_theme))
+ for(var/path in valid_subtypesof(/datum/mod_theme))
var/datum/mod_theme/new_theme = new path()
.[path] = new_theme
/// MODsuit theme, instanced once and then used by MODsuits to grab various statistics.
/datum/mod_theme
+ abstract_type = /datum/mod_theme
/// Theme name for the MOD.
- var/name = "standard"
+ var/name = "debug"
/// Description added to the MOD.
- var/desc = "A civilian class suit by Nakamura Engineering, doesn't offer much other than slightly quicker movement."
+ var/desc = "An abstract MOD theme."
/// Extended description on examine_more
- var/extended_desc = "A third-generation, modular civilian class suit by Nakamura Engineering, \
- this suit is a staple across the galaxy for civilian applications. These suits are oxygenated, \
- spaceworthy, resistant to fire and chemical threats, and are immunized against everything between \
- a sneeze and a bioweapon. However, their combat applications are incredibly minimal due to the amount of \
- armor plating being installed by default, and their actuators only lead to slightly greater speed than industrial suits."
+ var/extended_desc = "An abstract MOD description."
/// Default skin of the MOD.
- var/default_skin = "standard"
+ var/default_skin = "debug"
/// The slot this mod theme fits on
var/slot_flags = ITEM_SLOT_BACK
/// Armor shared across the MOD parts.
@@ -51,7 +48,7 @@
var/list/allowed_suit_storage = list()
/// List of variants and items created by them, with the flags we set.
var/list/variants = list(
- "standard" = list(
+ "debug" = list(
/obj/item/clothing/head/mod = list(
UNSEALED_LAYER = NECK_LAYER,
UNSEALED_CLOTHING = SNUG_FIT,
@@ -184,6 +181,51 @@
acid = 25
wound = 5
+/datum/mod_theme/standard
+ name = "standard"
+ desc = "A civilian class suit by Nakamura Engineering, doesn't offer much other than slightly quicker movement."
+ extended_desc = "A third-generation, modular civilian class suit by Nakamura Engineering, \
+ this suit is a staple across the galaxy for civilian applications. These suits are oxygenated, \
+ spaceworthy, resistant to fire and chemical threats, and are immunized against everything between \
+ a sneeze and a bioweapon. However, their combat applications are incredibly minimal due to the amount of \
+ armor plating being installed by default, and their actuators only lead to slightly greater speed than industrial suits."
+ default_skin = "standard"
+ variants = list(
+ "standard" = list(
+ /obj/item/clothing/head/mod = list(
+ UNSEALED_LAYER = NECK_LAYER,
+ UNSEALED_CLOTHING = SNUG_FIT,
+ SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|HEADINTERNALS,
+ SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE,
+ SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
+ ),
+ /obj/item/clothing/suit/mod = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE,
+ SEALED_MESSAGE = CHESTPLATE_SEAL_MESSAGE,
+ ),
+ /obj/item/clothing/gloves/mod = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ UNSEALED_MESSAGE = GAUNTLET_UNSEAL_MESSAGE,
+ SEALED_MESSAGE = GAUNTLET_SEAL_MESSAGE,
+ ),
+ /obj/item/clothing/shoes/mod = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ UNSEALED_MESSAGE = BOOT_UNSEAL_MESSAGE,
+ SEALED_MESSAGE = BOOT_SEAL_MESSAGE,
+ ),
+ ),
+ )
+
+
/datum/mod_theme/civilian
name = "civilian"
desc = "A light-weight civilian suit that offers unmatched ease of movement but no protection from the vacuum of space."
diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm
index 7077325304fd..eeb0c2ab85d4 100644
--- a/code/modules/mod/modules/modules_general.dm
+++ b/code/modules/mod/modules/modules_general.dm
@@ -27,6 +27,9 @@
var/obj/item/clothing/suit = mod.get_part_from_slot(ITEM_SLOT_OCLOTHING)
if(istype(suit))
RegisterSignal(suit, COMSIG_ITEM_PRE_UNEQUIP, PROC_REF(on_suit_unequip))
+ // You could easily allow modsuits to be strip accessible like backpacks like so
+ // But we figured there should be special handling for stuff like DNA locks first
+ // mod.AddElement(/datum/element/strip_accessible_storage)
/obj/item/mod/module/storage/on_uninstall(deleting = FALSE)
. = ..()
@@ -37,6 +40,7 @@
var/obj/item/clothing/suit = mod.get_part_from_slot(ITEM_SLOT_OCLOTHING)
if(istype(suit))
UnregisterSignal(suit, COMSIG_ITEM_PRE_UNEQUIP)
+ // mod.RemoveElement(/datum/element/strip_accessible_storage)
/obj/item/mod/module/storage/proc/on_suit_unequip(obj/item/source, force, atom/newloc, no_move, invdrop, silent)
if(QDELETED(source) || !invdrop || !mod.wearer || newloc == mod.wearer || !mod.wearer.s_store)
diff --git a/code/modules/modular_computers/computers/item/disks/virus_disk.dm b/code/modules/modular_computers/computers/item/disks/virus_disk.dm
index 62070193840c..accdc6ecef8f 100644
--- a/code/modules/modular_computers/computers/item/disks/virus_disk.dm
+++ b/code/modules/modular_computers/computers/item/disks/virus_disk.dm
@@ -106,8 +106,6 @@
///How many telecrystals the uplink should have
var/telecrystals = 0
- ///How much progression should be shown in the uplink, set on purchase of the item.
- var/current_progression = 0
/obj/item/disk/computer/virus/frame/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(!istype(tool, /obj/item/stack/telecrystal))
@@ -146,11 +144,9 @@
target_mind = user.mind
else
target_mind = pick(backup_players)
- hidden_uplink = target.AddComponent(/datum/component/uplink, target_mind, enabled = TRUE, starting_tc = telecrystals, has_progression = TRUE)
+ hidden_uplink = target.AddComponent(/datum/component/uplink, target_mind, enabled = TRUE, starting_tc = telecrystals)
hidden_uplink.unlock_code = unlock_code
hidden_uplink.uplink_handler.owner = target_mind
- hidden_uplink.uplink_handler.progression_points = min(SStraitor.current_global_progression, current_progression)
- SStraitor.register_uplink_handler(hidden_uplink.uplink_handler)
else
hidden_uplink.uplink_handler.add_telecrystals(telecrystals)
telecrystals = 0
diff --git a/code/modules/modular_computers/computers/item/role_tablet_presets.dm b/code/modules/modular_computers/computers/item/role_tablet_presets.dm
index e24e1b8ae84f..0489ad26bba2 100644
--- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm
+++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm
@@ -2,11 +2,16 @@
* Command
*/
-/obj/item/modular_computer/pda/heads
- icon_state = "/obj/item/modular_computer/pda/heads"
+/obj/item/modular_computer/pda/crew
+ ///The region that could paint this PDA.
+ var/painting_region = null
+
+/obj/item/modular_computer/pda/crew/heads
+ icon_state = "/obj/item/modular_computer/pda/crew/heads"
greyscale_config = /datum/greyscale_config/tablet/head
greyscale_colors = "#67A364#a92323"
max_capacity = parent_type::max_capacity * 2
+ painting_region = null
/// Fax type for a relevant head's tp connect their PDA to (for use with fax notification app)
var/fax_type = null
@@ -18,7 +23,7 @@
/datum/computer_file/program/faxbond,
)
-/obj/item/modular_computer/pda/heads/Initialize(mapload)
+/obj/item/modular_computer/pda/crew/heads/Initialize(mapload)
. = ..()
for(var/programs in head_programs)
var/datum/computer_file/program/program_type = new programs
@@ -30,51 +35,55 @@
var/obj/machinery/fax/heads_fax = length(faxes_list) ? pick(faxes_list) : null //there really shouldnt be more than one
fax_notifier.connect_fax(heads_fax)
-/obj/item/modular_computer/pda/heads/captain
+/obj/item/modular_computer/pda/crew/heads/captain
name = "captain PDA"
- icon_state = "/obj/item/modular_computer/pda/heads/captain"
+ icon_state = "/obj/item/modular_computer/pda/crew/heads/captain"
greyscale_config = /datum/greyscale_config/tablet/captain
greyscale_colors = "#2C7CB2#FF0000#FFFFFF#FFD55B"
+ painting_region = REGION_COMMAND
inserted_item = /obj/item/pen/fountain/captain
fax_type = /obj/machinery/fax/heads/captain
-/obj/item/modular_computer/pda/heads/captain/Initialize(mapload)
+/obj/item/modular_computer/pda/crew/heads/captain/Initialize(mapload)
. = ..()
RegisterSignal(src, COMSIG_TABLET_CHECK_DETONATE, PROC_REF(tab_no_detonate))
for(var/datum/computer_file/program/messenger/messenger_app in stored_files)
messenger_app.spam_mode = TRUE
-/obj/item/modular_computer/pda/heads/captain/proc/tab_no_detonate()
+/obj/item/modular_computer/pda/crew/heads/captain/proc/tab_no_detonate()
SIGNAL_HANDLER
return COMPONENT_TABLET_NO_DETONATE
-/obj/item/modular_computer/pda/heads/hop
+/obj/item/modular_computer/pda/crew/heads/hop
name = "head of personnel PDA"
- icon_state = "/obj/item/modular_computer/pda/heads/hop"
+ icon_state = "/obj/item/modular_computer/pda/crew/heads/hop"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick/head
greyscale_colors = "#374f7e#a52f29#a52f29"
+ painting_region = REGION_COMMAND
fax_type = /obj/machinery/fax/heads/hop
starting_programs = list(
/datum/computer_file/program/records/security,
/datum/computer_file/program/job_management,
)
-/obj/item/modular_computer/pda/heads/hos
+/obj/item/modular_computer/pda/crew/heads/hos
name = "head of security PDA"
- icon_state = "/obj/item/modular_computer/pda/heads/hos"
+ icon_state = "/obj/item/modular_computer/pda/crew/heads/hos"
greyscale_config = /datum/greyscale_config/tablet/head
greyscale_colors = "#EA3232#0000CC"
+ painting_region = REGION_COMMAND
inserted_item = /obj/item/pen/red/security
fax_type = /obj/machinery/fax/heads/hos
starting_programs = list(
/datum/computer_file/program/records/security,
)
-/obj/item/modular_computer/pda/heads/ce
+/obj/item/modular_computer/pda/crew/heads/ce
name = "chief engineer PDA"
- icon_state = "/obj/item/modular_computer/pda/heads/ce"
+ icon_state = "/obj/item/modular_computer/pda/crew/heads/ce"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick/head
greyscale_colors = "#D99A2E#69DBF3#FAFAFA"
+ painting_region = REGION_COMMAND
fax_type = /obj/machinery/fax/heads/ce
starting_programs = list(
/datum/computer_file/program/atmosscan,
@@ -82,22 +91,24 @@
/datum/computer_file/program/supermatter_monitor,
)
-/obj/item/modular_computer/pda/heads/cmo
+/obj/item/modular_computer/pda/crew/heads/cmo
name = "chief medical officer PDA"
- icon_state = "/obj/item/modular_computer/pda/heads/cmo"
+ icon_state = "/obj/item/modular_computer/pda/crew/heads/cmo"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick/head
greyscale_colors = "#FAFAFA#000099#3F96CC"
+ painting_region = REGION_COMMAND
fax_type = /obj/machinery/fax/heads/cmo
starting_programs = list(
/datum/computer_file/program/maintenance/phys_scanner,
/datum/computer_file/program/records/medical,
)
-/obj/item/modular_computer/pda/heads/rd
+/obj/item/modular_computer/pda/crew/heads/rd
name = "research director PDA"
- icon_state = "/obj/item/modular_computer/pda/heads/rd"
+ icon_state = "/obj/item/modular_computer/pda/crew/heads/rd"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick/head
greyscale_colors = "#FAFAFA#000099#B347BC"
+ painting_region = REGION_COMMAND
inserted_item = /obj/item/pen/fountain
fax_type = /obj/machinery/fax/heads/rd
starting_programs = list(
@@ -106,11 +117,12 @@
/datum/computer_file/program/signal_commander,
)
-/obj/item/modular_computer/pda/heads/quartermaster
+/obj/item/modular_computer/pda/crew/heads/quartermaster
name = "quartermaster PDA"
- icon_state = "/obj/item/modular_computer/pda/heads/quartermaster"
+ icon_state = "/obj/item/modular_computer/pda/crew/heads/quartermaster"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick/head
greyscale_colors = "#c4b787#18191e#8b4c31"
+ painting_region = REGION_COMMAND
inserted_item = /obj/item/pen/survival
stored_paper = 20
fax_type = /obj/machinery/fax/heads/qm
@@ -123,30 +135,33 @@
* Security
*/
-/obj/item/modular_computer/pda/security
+/obj/item/modular_computer/pda/crew/security
name = "security PDA"
greyscale_colors = "#EA3232#0000cc"
inserted_item = /obj/item/pen/red/security
+ painting_region = REGION_SECURITY
starting_programs = list(
/datum/computer_file/program/records/security,
/datum/computer_file/program/robocontrol,
)
-/obj/item/modular_computer/pda/detective
+/obj/item/modular_computer/pda/crew/detective
name = "detective PDA"
greyscale_colors = "#805A2F#990202"
inserted_item = /obj/item/pen/red/security
+ painting_region = REGION_SECURITY
starting_programs = list(
/datum/computer_file/program/records/security,
/datum/computer_file/program/robocontrol,
)
-/obj/item/modular_computer/pda/warden
+/obj/item/modular_computer/pda/crew/warden
name = "warden PDA"
- icon_state = "/obj/item/modular_computer/pda/warden"
+ icon_state = "/obj/item/modular_computer/pda/crew/warden"
greyscale_config = /datum/greyscale_config/tablet/stripe_double
greyscale_colors = "#EA3232#0000CC#363636"
inserted_item = /obj/item/pen/red/security
+ painting_region = REGION_SECURITY
starting_programs = list(
/datum/computer_file/program/records/security,
/datum/computer_file/program/robocontrol,
@@ -157,22 +172,24 @@
* Engineering
*/
-/obj/item/modular_computer/pda/engineering
+/obj/item/modular_computer/pda/crew/engineering
name = "engineering PDA"
- icon_state = "/obj/item/modular_computer/pda/engineering"
+ icon_state = "/obj/item/modular_computer/pda/crew/engineering"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick
greyscale_colors = "#D99A2E#69DBF3#E3DF3D"
+ painting_region = REGION_ENGINEERING
starting_programs = list(
/datum/computer_file/program/alarm_monitor,
/datum/computer_file/program/atmosscan,
/datum/computer_file/program/supermatter_monitor,
)
-/obj/item/modular_computer/pda/atmos
+/obj/item/modular_computer/pda/crew/atmos
name = "atmospherics PDA"
- icon_state = "/obj/item/modular_computer/pda/atmos"
+ icon_state = "/obj/item/modular_computer/pda/crew/atmos"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick
greyscale_colors = "#EEDC43#00E5DA#727272"
+ painting_region = REGION_ENGINEERING
starting_programs = list(
/datum/computer_file/program/alarm_monitor,
/datum/computer_file/program/atmosscan,
@@ -183,11 +200,12 @@
* Science
*/
-/obj/item/modular_computer/pda/science
+/obj/item/modular_computer/pda/crew/science
name = "scientist PDA"
- icon_state = "/obj/item/modular_computer/pda/science"
+ icon_state = "/obj/item/modular_computer/pda/crew/science"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick
greyscale_colors = "#FAFAFA#000099#B347BC"
+ painting_region = REGION_RESEARCH
starting_programs = list(
/datum/computer_file/program/atmosscan,
/datum/computer_file/program/science,
@@ -195,22 +213,24 @@
/datum/computer_file/program/signal_commander,
)
-/obj/item/modular_computer/pda/roboticist
+/obj/item/modular_computer/pda/crew/roboticist
name = "roboticist PDA"
- icon_state = "/obj/item/modular_computer/pda/roboticist"
+ icon_state = "/obj/item/modular_computer/pda/crew/roboticist"
greyscale_config = /datum/greyscale_config/tablet/stripe_double
greyscale_colors = "#484848#0099CC#D94927"
+ painting_region = REGION_RESEARCH
starting_programs = list(
/datum/computer_file/program/science,
/datum/computer_file/program/robocontrol,
/datum/computer_file/program/borg_monitor,
)
-/obj/item/modular_computer/pda/geneticist
+/obj/item/modular_computer/pda/crew/geneticist
name = "geneticist PDA"
- icon_state = "/obj/item/modular_computer/pda/geneticist"
+ icon_state = "/obj/item/modular_computer/pda/crew/geneticist"
greyscale_config = /datum/greyscale_config/tablet/stripe_double
greyscale_colors = "#FAFAFA#000099#0097CA"
+ painting_region = REGION_RESEARCH
starting_programs = list(
/datum/computer_file/program/records/medical,
)
@@ -219,37 +239,41 @@
* Medical
*/
-/obj/item/modular_computer/pda/medical
+/obj/item/modular_computer/pda/crew/medical
name = "medical PDA"
- icon_state = "/obj/item/modular_computer/pda/medical"
+ icon_state = "/obj/item/modular_computer/pda/crew/medical"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick
greyscale_colors = "#FAFAFA#000099#3F96CC"
+ painting_region = REGION_MEDBAY
starting_programs = list(
/datum/computer_file/program/records/medical,
/datum/computer_file/program/robocontrol,
)
-/obj/item/modular_computer/pda/medical/paramedic
+/obj/item/modular_computer/pda/crew/medical/paramedic
name = "paramedic PDA"
- icon_state = "/obj/item/modular_computer/pda/medical/paramedic"
+ icon_state = "/obj/item/modular_computer/pda/crew/medical/paramedic"
greyscale_config = /datum/greyscale_config/tablet/stripe_double
greyscale_colors = "#28334D#000099#3F96CC"
+ painting_region = REGION_MEDBAY
starting_programs = list(
/datum/computer_file/program/records/medical,
/datum/computer_file/program/radar/lifeline,
)
-/obj/item/modular_computer/pda/chemist
+/obj/item/modular_computer/pda/crew/chemist
name = "chemist PDA"
- icon_state = "/obj/item/modular_computer/pda/chemist"
+ icon_state = "/obj/item/modular_computer/pda/crew/chemist"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick
greyscale_colors = "#FAFAFA#355FAC#EA6400"
+ painting_region = REGION_MEDBAY
-/obj/item/modular_computer/pda/coroner
+/obj/item/modular_computer/pda/crew/coroner
name = "coroner PDA"
- icon_state = "/obj/item/modular_computer/pda/coroner"
+ icon_state = "/obj/item/modular_computer/pda/crew/coroner"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick
greyscale_colors = "#FAFAFA#000099#1f2026"
+ painting_region = REGION_MEDBAY
starting_programs = list(
/datum/computer_file/program/records/medical,
)
@@ -258,10 +282,11 @@
* Supply
*/
-/obj/item/modular_computer/pda/cargo
+/obj/item/modular_computer/pda/crew/cargo
name = "cargo technician PDA"
- icon_state = "/obj/item/modular_computer/pda/cargo"
+ icon_state = "/obj/item/modular_computer/pda/crew/cargo"
greyscale_colors = "#8b4c31#2c2e32"
+ painting_region = REGION_SUPPLY
stored_paper = 20
starting_programs = list(
/datum/computer_file/program/shipping,
@@ -270,20 +295,22 @@
/datum/computer_file/program/restock_tracker,
)
-/obj/item/modular_computer/pda/shaftminer
+/obj/item/modular_computer/pda/crew/shaftminer
name = "shaft miner PDA"
- icon_state = "/obj/item/modular_computer/pda/shaftminer"
+ icon_state = "/obj/item/modular_computer/pda/crew/shaftminer"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick
greyscale_colors = "#927444#8b4c31#4c202d"
+ painting_region = REGION_SUPPLY
starting_programs = list(
/datum/computer_file/program/skill_tracker,
/datum/computer_file/program/raptordex,
)
-/obj/item/modular_computer/pda/bitrunner
+/obj/item/modular_computer/pda/crew/bitrunner
name = "bit runner PDA"
- icon_state = "/obj/item/modular_computer/pda/bitrunner"
+ icon_state = "/obj/item/modular_computer/pda/crew/bitrunner"
greyscale_colors = "#D6B328#6BC906"
+ painting_region = REGION_SUPPLY
starting_programs = list(
/datum/computer_file/program/arcade,
/datum/computer_file/program/skill_tracker,
@@ -293,55 +320,61 @@
* Service
*/
-/obj/item/modular_computer/pda/janitor
+/obj/item/modular_computer/pda/crew/janitor
name = "janitor PDA"
- icon_state = "/obj/item/modular_computer/pda/janitor"
+ icon_state = "/obj/item/modular_computer/pda/crew/janitor"
greyscale_colors = "#933ea8#235AB2"
+ painting_region = REGION_GENERAL
starting_programs = list(
/datum/computer_file/program/skill_tracker,
/datum/computer_file/program/radar/custodial_locator,
)
-/obj/item/modular_computer/pda/chaplain
+/obj/item/modular_computer/pda/crew/chaplain
name = "chaplain PDA"
- icon_state = "/obj/item/modular_computer/pda/chaplain"
+ icon_state = "/obj/item/modular_computer/pda/crew/chaplain"
greyscale_config = /datum/greyscale_config/tablet/chaplain
greyscale_colors = "#333333#D11818"
+ painting_region = REGION_GENERAL
-/obj/item/modular_computer/pda/lawyer
+/obj/item/modular_computer/pda/crew/lawyer
name = "lawyer PDA"
greyscale_colors = "#4C76C8#FFE243"
inserted_item = /obj/item/pen/fountain
+ painting_region = REGION_GENERAL
starting_programs = list(
/datum/computer_file/program/records/security,
)
-/obj/item/modular_computer/pda/lawyer/Initialize(mapload)
+/obj/item/modular_computer/pda/crew/lawyer/Initialize(mapload)
. = ..()
for(var/datum/computer_file/program/messenger/messenger_app in stored_files)
messenger_app.spam_mode = TRUE
-/obj/item/modular_computer/pda/botanist
+/obj/item/modular_computer/pda/crew/botanist
name = "botanist PDA"
- icon_state = "/obj/item/modular_computer/pda/botanist"
+ icon_state = "/obj/item/modular_computer/pda/crew/botanist"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick
greyscale_colors = "#50E193#E26F41#71A7CA"
+ painting_region = REGION_GENERAL
starting_programs = list(
/datum/computer_file/program/botanical_encyclopedia
)
-/obj/item/modular_computer/pda/cook
+/obj/item/modular_computer/pda/crew/cook
name = "cook PDA"
- icon_state = "/obj/item/modular_computer/pda/botanist"
+ icon_state = "/obj/item/modular_computer/pda/crew/botanist"
greyscale_colors = "#FAFAFA#A92323"
+ painting_region = REGION_GENERAL
-/obj/item/modular_computer/pda/bar
+/obj/item/modular_computer/pda/crew/bar
name = "bartender PDA"
- icon_state = "/obj/item/modular_computer/pda/bar"
+ icon_state = "/obj/item/modular_computer/pda/crew/bar"
greyscale_colors = "#333333#C7C7C7"
inserted_item = /obj/item/pen/fountain
+ painting_region = REGION_GENERAL
-/obj/item/modular_computer/pda/clown
+/obj/item/modular_computer/pda/crew/clown
name = "clown PDA"
icon = 'icons/obj/devices/modular_pda.dmi'
icon_state = "pda-clown"
@@ -349,9 +382,10 @@
inserted_disk = /obj/item/disk/computer/virus/clown
greyscale_config = null
greyscale_colors = null
+ painting_region = REGION_GENERAL
inserted_item = /obj/item/toy/crayon/rainbow
-/obj/item/modular_computer/pda/clown/Initialize(mapload)
+/obj/item/modular_computer/pda/crew/clown/Initialize(mapload)
. = ..()
AddComponent(\
/datum/component/slippery,\
@@ -364,7 +398,7 @@
AddComponent(/datum/component/wearertargeting/sitcomlaughter, CALLBACK(src, PROC_REF(after_sitcom_laugh)))
/// Returns whether the PDA can slip or not, if we have a wearer then check if they are in a position to slip someone.
-/obj/item/modular_computer/pda/clown/proc/try_slip(mob/living/slipper, mob/living/slippee)
+/obj/item/modular_computer/pda/crew/clown/proc/try_slip(mob/living/slipper, mob/living/slippee)
if(isnull(slipper))
return TRUE
if(!istype(slipper.get_item_by_slot(ITEM_SLOT_FEET), /obj/item/clothing/shoes/clown_shoes))
@@ -372,38 +406,39 @@
return FALSE
return TRUE
-/obj/item/modular_computer/pda/clown/update_overlays()
+/obj/item/modular_computer/pda/crew/clown/update_overlays()
. = ..()
. += mutable_appearance(icon, "pda_stripe_clown") // clowns have eyes that go over their screen, so it needs to be compiled last
-/obj/item/modular_computer/pda/clown/proc/AfterSlip(mob/living/carbon/human/M)
+/obj/item/modular_computer/pda/crew/clown/proc/AfterSlip(mob/living/carbon/human/M)
if (istype(M) && (M.real_name != saved_identification))
var/obj/item/disk/computer/virus/clown/cart = inserted_disk
if(istype(cart) && cart.charges < 5)
cart.charges++
playsound(src,'sound/machines/ping.ogg',30,TRUE)
-/obj/item/modular_computer/pda/clown/proc/after_sitcom_laugh(mob/victim)
+/obj/item/modular_computer/pda/crew/clown/proc/after_sitcom_laugh(mob/victim)
victim.visible_message("[src] lets out a burst of laughter!")
-/obj/item/modular_computer/pda/mime
+/obj/item/modular_computer/pda/crew/mime
name = "mime PDA"
inserted_disk = /obj/item/disk/computer/virus/mime
- icon_state = "/obj/item/modular_computer/pda/mime"
+ icon_state = "/obj/item/modular_computer/pda/crew/mime"
greyscale_config = /datum/greyscale_config/tablet/mime
greyscale_colors = "#FAFAFA#EA3232"
inserted_item = /obj/item/toy/crayon/mime
+ painting_region = REGION_GENERAL
starting_programs = list(
/datum/computer_file/program/emojipedia,
)
-/obj/item/modular_computer/pda/mime/Initialize(mapload)
+/obj/item/modular_computer/pda/crew/mime/Initialize(mapload)
. = ..()
for(var/datum/computer_file/program/messenger/msg in stored_files)
msg.mime_mode = TRUE
msg.alert_silenced = TRUE
-/obj/item/modular_computer/pda/curator
+/obj/item/modular_computer/pda/crew/curator
name = "curator PDA"
desc = "A small experimental microcomputer."
icon = 'icons/obj/devices/modular_pda.dmi'
@@ -413,22 +448,24 @@
greyscale_colors = null
inserted_item = /obj/item/pen/fountain
long_ranged = TRUE
+ painting_region = REGION_GENERAL
starting_programs = list(
/datum/computer_file/program/emojipedia,
/datum/computer_file/program/newscaster,
/datum/computer_file/program/portrait_printer,
)
-/obj/item/modular_computer/pda/curator/Initialize(mapload)
+/obj/item/modular_computer/pda/crew/curator/Initialize(mapload)
. = ..()
for(var/datum/computer_file/program/messenger/msg in stored_files)
msg.alert_silenced = TRUE
-/obj/item/modular_computer/pda/psychologist
+/obj/item/modular_computer/pda/crew/psychologist
name = "psychologist PDA"
- icon_state = "/obj/item/modular_computer/pda/psychologist"
+ icon_state = "/obj/item/modular_computer/pda/crew/psychologist"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick
greyscale_colors = "#333333#000099#3F96CC"
+ painting_region = REGION_GENERAL
starting_programs = list(
/datum/computer_file/program/records/medical,
/datum/computer_file/program/robocontrol,
@@ -437,9 +474,10 @@
/**
* No Department/Station Trait
*/
-/obj/item/modular_computer/pda/assistant
+/obj/item/modular_computer/pda/crew/assistant
name = "assistant PDA"
flags_1 = parent_type::flags_1 | NO_NEW_GAGS_PREVIEW_1
+ painting_region = REGION_GENERAL
starting_programs = list(
/datum/computer_file/program/bounty_board,
)
diff --git a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm
index bc8daf05fcda..9103ec59ca0b 100644
--- a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm
+++ b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm
@@ -693,8 +693,8 @@
if(computer.loc && isliving(computer.loc))
receievers += computer.loc
- // resolving w/o nullcheck here, assume the messenger exists if a real person sent a message
- var/datum/computer_file/program/messenger/sender_messenger = chat.recipient?.resolve()
+ // chat is null for rigged messages, we do in fact have to nullcheck
+ var/datum/computer_file/program/messenger/sender_messenger = chat?.recipient?.resolve()
var/sender_title = is_fake_user ? STRINGIFY_PDA_TARGET(fake_name, fake_job) : get_messenger_name(sender_messenger)
var/sender_name = is_fake_user ? fake_name : sender_messenger.computer.saved_identification
diff --git a/code/modules/modular_computers/file_system/programs/secureye.dm b/code/modules/modular_computers/file_system/programs/secureye.dm
index 640de44979c9..4c4c6912f064 100644
--- a/code/modules/modular_computers/file_system/programs/secureye.dm
+++ b/code/modules/modular_computers/file_system/programs/secureye.dm
@@ -237,5 +237,6 @@
var/size_y = bbox[4] - bbox[2] + 1
cam_screen.show_camera(visible_turfs, size_x, size_y)
+ cam_screen.set_display(active_camera)
#undef DEFAULT_MAP_SIZE
diff --git a/code/modules/modular_computers/file_system/programs/techweb.dm b/code/modules/modular_computers/file_system/programs/techweb.dm
index e96af25b6a15..fd1d93a4f7b2 100644
--- a/code/modules/modular_computers/file_system/programs/techweb.dm
+++ b/code/modules/modular_computers/file_system/programs/techweb.dm
@@ -49,9 +49,12 @@
data["stored_research"] = !!stored_research
if(!stored_research) //lack of a research node is all we care about.
return data
+ var/list/queued_nodes = list()
+ for(var/node, weakref in stored_research.research_queue_nodes)
+ queued_nodes[node] = astype(weakref, /datum/weakref)?.resolve()
data += list(
"nodes" = list(),
- "queue_nodes" = stored_research.research_queue_nodes,
+ "queue_nodes" = queued_nodes,
"experiments" = list(),
"researched_designs" = stored_research.researched_designs,
"points" = stored_research.research_points,
@@ -71,7 +74,8 @@
if (stored_research.hidden_nodes[node_path])
continue
- var/mob/node_queuer = stored_research.research_queue_nodes[node_path]
+ var/datum/weakref/queuer_weakref = stored_research.research_queue_nodes[node_path]
+ var/mob/node_queuer = queuer_weakref?.resolve()
var/enqueued_by_user = !isnull(node_queuer) && node_queuer == user
data["nodes"] += list(list(
diff --git a/code/modules/movespeed/modifiers/items.dm b/code/modules/movespeed/modifiers/items.dm
index 7f5b80f7adcb..d4a0b120178f 100644
--- a/code/modules/movespeed/modifiers/items.dm
+++ b/code/modules/movespeed/modifiers/items.dm
@@ -38,3 +38,8 @@
/datum/movespeed_modifier/binocs_wielded
multiplicative_slowdown = 1.5
+/datum/movespeed_modifier/pillow_fortify
+ multiplicative_slowdown = 1.2
+
+/datum/movespeed_modifier/lance_charge
+ multiplicative_slowdown = -0.5
diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm
index 2a77e8864134..1f1423ec63d1 100644
--- a/code/modules/movespeed/modifiers/mobs.dm
+++ b/code/modules/movespeed/modifiers/mobs.dm
@@ -11,10 +11,6 @@
/datum/movespeed_modifier/monkey_temperature_speedmod
variable = TRUE
-/datum/movespeed_modifier/hunger
- movetypes = GROUND|FLYING
- variable = TRUE
-
/datum/movespeed_modifier/golem_hunger
variable = TRUE
diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm
index 3c61dcc0c1bd..0008899eaee5 100644
--- a/code/modules/power/apc/apc_main.dm
+++ b/code/modules/power/apc/apc_main.dm
@@ -243,6 +243,7 @@
AddElement(/datum/element/contextual_screentip_mob_typechecks, hovering_mob_typechecks)
/obj/machinery/power/apc/Destroy()
+ SSmachines.processing_apcs -= src
if(malfai)
malfai.hacked_apcs -= src
malfai = null
diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm
index 762c6d32656b..7371b0b46fff 100644
--- a/code/modules/power/lighting/light.dm
+++ b/code/modules/power/lighting/light.dm
@@ -87,7 +87,7 @@
// DARKPACK EDIT ADD START - AMBIENCE
var/flourescent = TRUE // Bulbs are flouresenct and likely to hum.
var/datum/looping_sound/light_hum/light_hum
- var/hum_chance = 50
+ var/hum_chance = 5
// DARKPACK EDIT ADD END
// create a new lighting fixture
diff --git a/code/modules/power/lighting/light_items.dm b/code/modules/power/lighting/light_items.dm
index 84449e5bc4e2..ccc10deaf007 100644
--- a/code/modules/power/lighting/light_items.dm
+++ b/code/modules/power/lighting/light_items.dm
@@ -123,7 +123,7 @@
return
var/mob/living/moving_mob = moving_atom
if(!(moving_mob.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) || moving_mob.buckled)
- playsound(src, 'sound/effects/footstep/glass_step.ogg', HAS_TRAIT(moving_mob, TRAIT_LIGHT_STEP) ? 30 : 50, TRUE)
+ playsound(src, 'sound/effects/footstep/glass_step.ogg', (HAS_TRAIT(moving_mob, TRAIT_LIGHT_STEP) || HAS_TRAIT(moving_mob, TRAIT_OBFUSCATED)) ? 30 : 50, TRUE) // DARKPACK EDIT CHANGE - POWERS
if(status == LIGHT_BURNED || status == LIGHT_OK)
shatter(moving_mob)
diff --git a/code/modules/power/lighting/light_mapping_helpers.dm b/code/modules/power/lighting/light_mapping_helpers.dm
index 43dd8e46fa06..32de9dd2f2b4 100644
--- a/code/modules/power/lighting/light_mapping_helpers.dm
+++ b/code/modules/power/lighting/light_mapping_helpers.dm
@@ -67,7 +67,7 @@
fire_colour = "#bd3f46"
desc = "A small lighting fixture."
light_type = /obj/item/light/bulb
- flourescent = FALSE // DARKPACK EDIT ADD - AMBIENCE - (No humminh for small bulbs)
+ flourescent = FALSE // DARKPACK EDIT ADD - AMBIENCE - (No humming for small bulbs)
/obj/machinery/light/small/broken
status = LIGHT_BROKEN
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index cd964e5af852..57f6e14c86c1 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -8,7 +8,8 @@
density = TRUE
anchored = FALSE
use_power = NO_POWER_USE
-
+ /// the emissive light mask icon
+ var/light_mask = "portgen-emissive"
var/active = FALSE
var/power_gen = 5 KILO JOULES
var/power_output = 1
@@ -60,6 +61,13 @@
icon_state = "[base_icon_state]_[active]"
return ..()
+/obj/machinery/power/port_gen/update_overlays()
+ . = ..()
+ if(panel_open || !is_operational || !active)
+ return
+
+ . += emissive_appearance(icon, light_mask, src, alpha = src.alpha)
+
/obj/machinery/power/port_gen/process()
if(active)
if(!HasFuel() || !anchored)
@@ -283,5 +291,17 @@
power_gen = 30 KILO JOULES
sheet_path = /obj/item/stack/sheet/mineral/uranium
+/obj/machinery/power/port_gen/pacman/wood
+ name = "\improper P.L.A.N.K.M.A.N.-type portable generator"
+ desc = "Burns wood to generate some power. Do not touch when powered."
+ circuit = /obj/item/circuitboard/machine/plankman
+ icon_state = "portgen3_0"
+ base_icon_state = "portgen3"
+ max_sheets = 75
+ time_per_sheet = 360
+ power_gen = 5 KILO JOULES
+ sheet_path = /obj/item/stack/sheet/mineral/wood
+ light_mask = "portgen3-emissive"
+
/obj/machinery/power/port_gen/pacman/pre_loaded
sheets = 15
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 75b6b5f1994b..c0ac2220bb35 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -74,7 +74,7 @@
if(ismegafauna(user))
user.visible_message(span_warning("[user] glows fiercely as the containment field flickers out!"))
field_gen_1.calc_power(INFINITY) //rip that 'containment' field
- user.adjustHealth(-user.obj_damage)
+ user.adjust_brute_loss(-user.obj_damage)
else
return ..()
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 964e148a1ff2..fd561259a9d6 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -37,7 +37,8 @@
var/output_level_max = 200 KILO WATTS
/// amount of power actually outputted. may be less than output_level if the powernet returns excess power
var/output_used = 0
-
+ /// the emissive light mask icon
+ var/light_mask = "smes-emissive"
///Should we show display lights
var/show_display_lights = TRUE
/// Terminal for charging this smes
@@ -149,6 +150,8 @@
if(clevel > 0)
. += "smes-og[clevel]"
+ . += emissive_appearance(icon, light_mask, src, alpha = src.alpha)
+
/obj/machinery/power/smes/get_save_vars()
. = ..()
charge = total_charge()
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 444823532087..f7b32a004699 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -26,7 +26,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
critical_machine = TRUE
base_icon_state = "sm"
icon_state = "sm"
- light_on = FALSE
+ light_on = TRUE
+ light_range = MINIMUM_USEFUL_LIGHT_RANGE
+ light_power = 2
+ light_color = SUPERMATTER_COLOUR
///The id of our supermatter
var/uid = 1
@@ -186,6 +189,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
/// If the SM is decorated with holiday lights
var/holiday_lights = FALSE
+ /// The emissive light mask for the SM
+ var/light_mask_icon = "sm-emissive"
+
/// Cooldown for sending emergency alerts to the common radio channel
COOLDOWN_DECLARE(common_radio_cooldown)
@@ -521,6 +527,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
else
. += mutable_appearance(icon, "holiday_lights")
. += emissive_appearance(icon, "holiday_lights_e", src, alpha = src.alpha)
+ if(light_mask_icon)
+ . += emissive_appearance(icon, light_mask_icon, src, alpha = src.alpha)
return .
/obj/machinery/power/supermatter_crystal/update_icon(updates)
diff --git a/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm b/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm
index aff6bdb43491..8b81a67eb5cd 100644
--- a/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm
+++ b/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm
@@ -132,12 +132,13 @@ GLOBAL_LIST_INIT(sm_delam_list, list(
// Change how bright the rock is.
/// [/obj/machinery/power/supermatter_crystal/process_atmos]
/datum/sm_delam/proc/lights(obj/machinery/power/supermatter_crystal/sm)
- sm.set_light(
- l_range = ROUND_UP(clamp(sm.internal_energy / 500, 4, 10)),
- l_power = ROUND_UP(clamp(sm.internal_energy / 1000, 1, 5)),
- l_color = sm.gas_heat_power_generation > 0.8 ? SUPERMATTER_RED : SUPERMATTER_COLOUR,
- l_on = !!sm.internal_energy,
- )
+ if(!!sm.internal_energy)
+ sm.set_light(
+ l_range = ROUND_UP(clamp(sm.internal_energy / 500, 4, 10)),
+ l_power = ROUND_UP(clamp(sm.internal_energy / 1000, 1, 5)),
+ l_color = sm.gas_heat_power_generation > 0.8 ? SUPERMATTER_RED : SUPERMATTER_COLOUR,
+ l_on = TRUE,
+ )
/// Returns a set of messages to be spouted during delams
/// First message is start of count down, second message is quitting of count down (if sm healed), third is 5 second intervals
diff --git a/code/modules/power/supermatter/supermatter_variants.dm b/code/modules/power/supermatter/supermatter_variants.dm
index 146c5b345457..e390c87033b0 100644
--- a/code/modules/power/supermatter/supermatter_variants.dm
+++ b/code/modules/power/supermatter/supermatter_variants.dm
@@ -20,7 +20,7 @@
explosion_power = 12
layer = ABOVE_MOB_LAYER
moveable = TRUE
-
+ light_mask_icon = "sm_shard-emissive"
/obj/machinery/power/supermatter_crystal/shard/Initialize(mapload)
. = ..()
@@ -62,6 +62,7 @@
moveable = TRUE
anchored = FALSE
custom_materials = list(/datum/material/adamantine = SHEET_MATERIAL_AMOUNT * 20, /datum/material/iron = SHEET_MATERIAL_AMOUNT)
+ light_mask_icon = "sm_small-emissive"
/obj/machinery/power/supermatter_crystal/small/Initialize(mapload)
. = ..()
diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm
index 7cf649b393ed..a8e904c48c99 100644
--- a/code/modules/projectiles/ammunition/energy/special.dm
+++ b/code/modules/projectiles/ammunition/energy/special.dm
@@ -73,7 +73,7 @@
/obj/item/ammo_casing/energy/shrink
projectile_type = /obj/projectile/magic/shrink/alien
select_name = "shrink ray"
- e_cost = LASER_SHOTS(5, STANDARD_CELL_CHARGE)
+ e_cost = LASER_SHOTS(3, STANDARD_CELL_CHARGE)
/obj/item/ammo_casing/energy/marksman
projectile_type = /obj/projectile/bullet/marksman
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 6cf3ec0adb4e..8445359fbaab 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -430,7 +430,8 @@
if(gun == src || gun.weapon_weight >= WEAPON_MEDIUM)
continue
else if(gun.can_trigger_gun(user, akimbo_usage = TRUE))
- bonus_spread += dual_wield_spread
+ if(!HAS_TRAIT(user, TRAIT_AMBIDEXTROUS)) // DARKPACK EDIT ADD - MERITS_FLAWS
+ bonus_spread += dual_wield_spread
loop_counter++
addtimer(CALLBACK(gun, TYPE_PROC_REF(/obj/item/gun, process_fire), target, user, TRUE, params, null, bonus_spread), loop_counter)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index f07e501dd13c..4252db3cc0d6 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -106,8 +106,14 @@
var/must_hold_to_load = FALSE
///Whether the gun can be sawn off by sawing tools
var/can_be_sawn_off = FALSE
- var/suppressor_x_offset ///pixel offset for the suppressor overlay on the x axis.
- var/suppressor_y_offset ///pixel offset for the suppressor overlay on the y axis.
+ ///Added recoil of sawn off guns
+ var/sawoff_bonus_recoil = 1
+ ///Starts presawn-off
+ var/spawn_sawn_off = FALSE
+ ///pixel offset for the suppressor overlay on the x axis.
+ var/suppressor_x_offset
+ ///pixel offset for the suppressor overlay on the y axis.
+ var/suppressor_y_offset
/// Check if you are able to see if a weapon has a bullet loaded in or not.
var/hidden_chambered = FALSE
@@ -177,6 +183,9 @@
chamber_round()
else
chamber_round(replace_new_round = TRUE)
+ if(spawn_sawn_off)
+ do_sawoff()
+
update_appearance()
RegisterSignal(src, COMSIG_ITEM_RECHARGED, PROC_REF(instant_reload))
@@ -604,7 +613,7 @@
install_suppressor(tool)
return ITEM_INTERACT_SUCCESS
- if (can_be_sawn_off && sawoff(user, tool))
+ if (can_be_sawn_off && try_sawoff(user, tool))
return ITEM_INTERACT_SUCCESS
/obj/item/gun/ballistic/proc/load_gun(obj/item/ammo, mob/living/user)
@@ -649,14 +658,15 @@
if(gun == src || gun.weapon_weight >= WEAPON_MEDIUM)
continue
else if(can_trigger_gun(user, akimbo_usage = TRUE))
- recoil_roll.difficulty += 1 //Akimboing gains +1 difficulty
+ if(!HAS_TRAIT(user, TRAIT_AMBIDEXTROUS)) // DARKPACK EDIT ADD - MERITS_FLAWS
+ recoil_roll.difficulty += 1 //Akimboing gains +1 difficulty
if(firing_burst == TRUE)
recoil_roll.difficulty += 1 //Bursts gains +1 difficulty
var/datum/component/automatic_fire/automatic_check = src.GetComponent(/datum/component/automatic_fire)
if(automatic_check)
recoil_roll.difficulty += 2 //Full-auto gains +2 difficulty
- var/recoil_reduction = recoil_roll.st_roll(user, src)
+ var/recoil_reduction = recoil_roll.st_roll(user, src, using_item = src)
recoil = max(initial(recoil) - recoil_reduction, 0)
spread = max(initial(spread) - recoil_reduction, 0)
COOLDOWN_START(src, recoil_skill_check, 1 SCENES)
@@ -668,6 +678,11 @@
// DARKPACK EDIT ADD END
return ..()
+/obj/item/gun/ballistic/calculate_recoil(mob/living/user, recoil_amount)
+ if(sawn_off)
+ recoil_amount += sawoff_bonus_recoil
+ . = ..()
+
/obj/item/gun/ballistic/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1)
if(isnull(chambered))
return ..()
@@ -853,7 +868,7 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
)))
///Handles all the logic of sawing off guns,
-/obj/item/gun/ballistic/proc/sawoff(mob/user, obj/item/saw, handle_modifications = TRUE)
+/obj/item/gun/ballistic/proc/try_sawoff(mob/user, obj/item/saw)
if(!saw.get_sharpness() || (!is_type_in_typecache(saw, GLOB.gun_saw_types) && saw.tool_behaviour != TOOL_SAW)) //needs to be sharp. Otherwise turned off eswords can cut this.
return
if(sawn_off)
@@ -874,10 +889,14 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
if(sawn_off)
return
user.visible_message(span_notice("[user] shortens [src]!"), span_notice("You shorten [src]."))
+ . = do_sawoff()
+ update_appearance()
+
+/obj/item/gun/ballistic/proc/do_sawoff()
+ SHOULD_CALL_PARENT(TRUE)
sawn_off = TRUE
SEND_SIGNAL(src, COMSIG_GUN_SAWN_OFF)
- if(!handle_modifications)
- return TRUE
+
name = "sawn-off [src.name]"
desc = sawn_desc
update_weight_class(WEIGHT_CLASS_NORMAL)
@@ -890,8 +909,6 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
worn_icon_state = "gun"
slot_flags &= ~ITEM_SLOT_BACK //you can't sling it on your back
slot_flags |= ITEM_SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally)
- recoil = SAWN_OFF_RECOIL
- update_appearance()
return TRUE
/obj/item/gun/ballistic/wrench_act(mob/living/user, obj/item/I)
diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm
index 76400c7ffac2..0bc915754e14 100644
--- a/code/modules/projectiles/guns/ballistic/rifle.dm
+++ b/code/modules/projectiles/guns/ballistic/rifle.dm
@@ -75,6 +75,10 @@
SET_BASE_PIXEL(-8, 0)
+/obj/item/gun/ballistic/rifle/boltaction/presawn
+ WHEN_MAP(icon_state = "sakhno_sawn")
+ spawn_sawn_off = TRUE
+
/obj/item/gun/ballistic/rifle/boltaction/add_deep_lore()
AddElement(/datum/element/examine_lore, \
lore = "The Sakhno Precision Rifle's origins are closely tied to the Sakhno Concern, one of the Third Soviet Union's \
@@ -95,12 +99,10 @@
/obj/item/gun/ballistic/rifle/boltaction/add_bayonet_point()
AddComponent(/datum/component/bayonet_attachable, offset_x = 41, offset_y = 14, bayonet_overlay = "bayonet_thin")
-/obj/item/gun/ballistic/rifle/boltaction/sawoff(mob/user)
+/obj/item/gun/ballistic/rifle/boltaction/do_sawoff()
. = ..()
- if(.)
- spread = 36
- SET_BASE_PIXEL(0, 0)
- update_appearance()
+ spread = 36
+ SET_BASE_PIXEL(0, 0)
/obj/item/gun/ballistic/rifle/boltaction/attack_self(mob/user)
if(jammed)
@@ -194,10 +196,9 @@
. = ..()
AddComponent(/datum/component/scope, range_modifier = 1.5)
-/obj/item/gun/ballistic/rifle/boltaction/prime/sawoff(mob/user)
+/obj/item/gun/ballistic/rifle/boltaction/prime/do_sawoff()
. = ..()
- if(.)
- name = "\improper Obrez Moderna" // wear it loud and proud
+ name = "\improper Obrez Moderna" // wear it loud and proud
/obj/item/gun/ballistic/rifle/boltaction/donkrifle
name = "\improper Donk Co. Jezail"
@@ -230,11 +231,10 @@
no risk of receiving a refurbished, poorly-kept surplus arm that jams more than it shoots." \
)
-/obj/item/gun/ballistic/rifle/boltaction/donkrifle/sawoff(mob/user) //the heavy price one pays for fitting this in a backpack
+/obj/item/gun/ballistic/rifle/boltaction/donkrifle/do_sawoff() //the heavy price one pays for fitting this in a backpack
. = ..()
- if(.)
- projectile_damage_multiplier = 0.75
- spread = 50
+ projectile_damage_multiplier = 0.75
+ spread = 50
/obj/item/gun/ballistic/rifle/rebarxbow
name = "heated rebar crossbow"
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 14a18c6bac27..c70b4eb6db89 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -355,13 +355,16 @@
can_be_sawn_off = TRUE
pb_knockback = 3 // it's a super shotgun!
+/obj/item/gun/ballistic/shotgun/doublebarrel/presawn
+ WHEN_MAP(icon_state = "dshotgun_sawn")
+ spawn_sawn_off = TRUE
+
/obj/item/gun/ballistic/shotgun/doublebarrel/setup_reskins()
AddComponent(/datum/component/reskinable_item, /datum/atom_skin/bar_shotgun)
-/obj/item/gun/ballistic/shotgun/doublebarrel/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/doublebarrel/do_sawoff()
. = ..()
- if(.)
- weapon_weight = WEAPON_MEDIUM
+ weapon_weight = WEAPON_MEDIUM
/obj/item/gun/ballistic/shotgun/doublebarrel/slugs
name = "hunting shotgun"
diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm
index 6d43ecbcea24..0c489acba927 100644
--- a/code/modules/projectiles/guns/ballistic/toy.dm
+++ b/code/modules/projectiles/guns/ballistic/toy.dm
@@ -15,6 +15,7 @@
gun_flags = TOY_FIREARM_OVERLAY | NOT_A_REAL_GUN
casing_ejector = FALSE
can_muzzle_flash = FALSE
+ min_recoil = 0
/obj/item/gun/ballistic/automatic/toy/riot
spawn_magazine_type = /obj/item/ammo_box/magazine/toy/smg/riot
@@ -25,6 +26,7 @@
accepted_magazine_type = /obj/item/ammo_box/magazine/toy/pistol
fire_sound = 'sound/items/syringeproj.ogg'
gun_flags = TOY_FIREARM_OVERLAY | NOT_A_REAL_GUN
+ min_recoil = 0
/obj/item/gun/ballistic/automatic/pistol/toy/riot
spawn_magazine_type = /obj/item/ammo_box/magazine/toy/pistol/riot
@@ -51,6 +53,7 @@
pb_knockback = 0
gun_flags = TOY_FIREARM_OVERLAY | NOT_A_REAL_GUN
can_muzzle_flash = FALSE
+ min_recoil = 0
/obj/item/gun/ballistic/shotgun/toy/handle_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE)
. = ..()
@@ -78,6 +81,7 @@
w_class = WEIGHT_CLASS_SMALL
gun_flags = NONE
can_muzzle_flash = FALSE
+ min_recoil = 0
/obj/item/gun/ballistic/shotgun/toy/crossbow/riot
spawn_magazine_type = /obj/item/ammo_box/magazine/internal/shot/toy/crossbow/riot
@@ -93,6 +97,7 @@
clumsy_check = FALSE
gun_flags = TOY_FIREARM_OVERLAY | NOT_A_REAL_GUN
can_muzzle_flash = FALSE
+ min_recoil = 0
/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted //Use this for actual toys
pin = /obj/item/firing_pin
@@ -113,6 +118,7 @@
clumsy_check = FALSE
gun_flags = TOY_FIREARM_OVERLAY | NOT_A_REAL_GUN
can_muzzle_flash = FALSE
+ min_recoil = 0
/obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted //Use this for actual toys
pin = /obj/item/firing_pin
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 1100f4d72e32..4edab5fe7e0f 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -433,7 +433,7 @@
if(istype(modkit_upgrade, src))
new_recharge_time += modkit_upgrade.modifier
- return new_recharge_time
+ return max(new_recharge_time, 0)
/obj/item/borg/upgrade/modkit/cooldown/install(obj/item/gun/energy/recharge/kinetic_accelerator/KA, mob/user)
. = ..()
diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm
index af7acc49111b..214118f9b23b 100644
--- a/code/modules/projectiles/guns/magic/staff.dm
+++ b/code/modules/projectiles/guns/magic/staff.dm
@@ -106,7 +106,7 @@
angry_thing.ai_controller?.set_blackboard_key(BB_CURRENT_TARGET, user)
angry_thing.ai_controller?.set_blackboard_key(BB_TARGET_MINIMUM_STAT, HARD_CRIT)
angry_thing.ai_controller?.ai_interact(user, combat_mode = TRUE)
- user.apply_damage(35, BRUTE, forced = TRUE) // Mimics are not actually very strong so we pretend that it just bit us so we die faster, at least 3 charges & worn items should do it
+ user.apply_damage(35, BRUTE) // Mimics are not actually very strong so we pretend that it just bit us so we die faster, at least 3 charges & worn items should do it
sleep(0.25 SECONDS)
if (QDELETED(user))
diff --git a/code/modules/projectiles/guns/special/medbeam.dm b/code/modules/projectiles/guns/special/medbeam.dm
index 290da403b837..115342fb2eeb 100644
--- a/code/modules/projectiles/guns/special/medbeam.dm
+++ b/code/modules/projectiles/guns/special/medbeam.dm
@@ -118,10 +118,10 @@
if(target.health != target.maxHealth)
new /obj/effect/temp_visual/heal(get_turf(target), COLOR_HEALING_CYAN)
var/need_mob_update
- need_mob_update = target.adjust_brute_loss(-4, updating_health = FALSE, forced = TRUE)
- need_mob_update += target.adjust_fire_loss(-4, updating_health = FALSE, forced = TRUE)
+ need_mob_update = target.adjust_brute_loss(-4, updating_health = FALSE)
+ need_mob_update += target.adjust_fire_loss(-4, updating_health = FALSE)
need_mob_update += target.adjust_tox_loss(-1, updating_health = FALSE, forced = TRUE)
- need_mob_update += target.adjust_oxy_loss(-1, updating_health = FALSE, forced = TRUE)
+ need_mob_update += target.adjust_oxy_loss(-1, updating_health = FALSE)
if(need_mob_update)
target.updatehealth()
return
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index a3fe7c8dbd6b..fa09f9eb0b65 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -168,24 +168,19 @@
if(QDELETED(user)) //how the hell...?
stack_trace("/obj/item/firing_pin/clown/ultra/pin_auth called with a [isnull(user) ? "null" : "invalid"] user.")
return TRUE
- if(HAS_TRAIT(user, TRAIT_CLUMSY)) //clumsy
+ if(HAS_MIND_TRAIT(user, TRAIT_CLUMSY)) // Clumsy, which clowns are usually (but not always)
+ return TRUE
+ if(HAS_MIND_TRAIT(user, TRAIT_NAIVE)) // Naive, which clowns are always
return TRUE
- if(user.mind)
- if(is_clown_job(user.mind.assigned_role)) //traitor clowns can use this, even though they're technically not clumsy
- return TRUE
- if(user.mind.has_antag_datum(/datum/antagonist/nukeop/clownop)) //clown ops aren't clumsy by default and technically don't have an assigned role of "Clown", but come on, they're basically clowns
- return TRUE
- if(user.mind.has_antag_datum(/datum/antagonist/nukeop/leader/clownop)) //Wanna hear a funny joke?
- return TRUE //The clown op leader antag datum isn't a subtype of the normal clown op antag datum.
return FALSE
/obj/item/firing_pin/clown/ultra/gun_insert(mob/living/user, obj/item/gun/new_gun, starting = FALSE)
- ..()
+ . = ..()
new_gun.clumsy_check = FALSE
/obj/item/firing_pin/clown/ultra/gun_remove(mob/living/user)
gun.clumsy_check = initial(gun.clumsy_check)
- ..()
+ return ..()
// Now two times deadlier!
/obj/item/firing_pin/clown/ultra/selfdestruct
diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm
index 9afd16797abc..856a58d8c6b7 100644
--- a/code/modules/projectiles/projectile/bullets/revolver.dm
+++ b/code/modules/projectiles/projectile/bullets/revolver.dm
@@ -58,14 +58,14 @@
/obj/projectile/bullet/c38/match/true
name = ".38 True Strike bullet"
- damage = 15
- ricochet_auto_aim_range = 3
+ damage = 20
+ ricochet_auto_aim_range = 4
ricochet_auto_aim_angle = 100
ricochet_incidence_leeway = 0
ricochet_shoots_firer = FALSE
shrapnel_type = null
embed_type = null
- armour_penetration = 30
+ armour_penetration = 35
// premium .38 ammo from cargo, weak against armor, lower base damage, but excellent at embedding and causing slice wounds at close range
/obj/projectile/bullet/c38/dumdum
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 316d595af0ff..2eeb445b4c13 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -1,6 +1,6 @@
/obj/machinery/computer/pandemic
- name = "PanD.E.M.I.C 2200"
+ name = "\improper PanD.E.M.I.C 2200"
desc = "Used to work with viruses."
density = TRUE
icon = 'icons/obj/medical/chemical.dmi'
diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
index f5c9d69e03e5..e765456ad084 100644
--- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
@@ -3496,5 +3496,133 @@
randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+/datum/reagent/consumable/ethanol/mouthwash
+ name = "Mouthwash"
+ description = "A minty, slightly foamy liquid. It seems to be more sugar than alcohol in content, and smells kind of like ice drake's breath."
+ boozepwr = 14
+ color = "#10b486"
+ taste_description = "sweet and minty"
+ randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+
+/datum/reagent/consumable/ethanol/mouthwash/on_mob_life(mob/living/drinker, seconds_per_tick, metabolization_ratio)
+ . = ..()
+ drinker.apply_status_effect(/datum/status_effect/throat_soothed)
+
+/datum/reagent/consumable/ethanol/mouthwash_strong
+ name = "Strong Mouthwash"
+ description = "A minty, slightly foamy liquid. As strong as it might be, it won't actually clean your teeth. And no matter how sweet it is, it will leave bitterness in your mouth."
+ boozepwr = 30
+ color = "#10b4ac"
+ taste_description = "dentist appointment"
+ randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+
+/datum/reagent/consumable/ethanol/mouthwash_strong/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, metabolization_ratio)
+ . = ..()
+ drinker.apply_status_effect(/datum/status_effect/throat_soothed)
+ if(SPT_PROB(5, seconds_per_tick) && !HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE))
+ drinker.adjust_hallucinations(8 SECONDS * metabolization_ratio)
+
+/datum/reagent/consumable/ethanol/frosty_dorf
+ name = "Frosty Dorf"
+ description = "Herbal variant of the dwarven classic. Makes you feel like digging a mountain keep."
+ boozepwr = 75
+ color = "#A1C89A"
+ taste_description = "hair on your beard"
+ randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+
+/datum/reagent/consumable/ethanol/stone_cold_stout
+ name = "Stone Cold Stout"
+ description = "Stone-cold drink, challenging even for seasoned drinkers. If you can survive it, you can take on anything."
+ boozepwr = 100
+ color = "#9DDCFA"
+ taste_description = "bitter rock bottom"
+ randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+
+/datum/reagent/consumable/ethanol/stone_cold_stout/on_mob_metabolize(mob/living/carbon/human/drinker)
+ . = ..()
+ MODIFY_PHYSIOLOGY(drinker, BRUTE, 0.8)
+ MODIFY_PHYSIOLOGY(drinker, BURN, 0.8)
+
+/datum/reagent/consumable/ethanol/stone_cold_stout/on_mob_end_metabolize(mob/living/carbon/human/drinker)
+ . = ..()
+ MODIFY_PHYSIOLOGY(drinker, BRUTE, 1.25)
+ MODIFY_PHYSIOLOGY(drinker, BURN, 1.25)
+
+/datum/reagent/consumable/ethanol/ramp_rager
+ name = "Ramp Rager"
+ description = "Furiously bubbling drink, capable of making people go berserk. An invitation for a bar fight."
+ boozepwr = 65
+ color = "#1D789B"
+ taste_description = "bottled rage"
+ randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ metabolized_traits = list(TRAIT_ANALGESIA, TRAIT_STIMULATED, TRAIT_FEARLESS)
+
+/datum/reagent/consumable/ethanol/ramp_rager/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, metabolization_ratio)
+ . = ..()
+ var/need_mob_update
+ if(SPT_PROB(15, seconds_per_tick) && !HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE))
+ drinker.adjust_hallucinations(8 SECONDS * metabolization_ratio)
+ need_mob_update += drinker.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.75 * metabolization_ratio * seconds_per_tick)
+ drinker.AdjustAllImmobility(-1 SECONDS * metabolization_ratio * seconds_per_tick)
+ if(drinker.adjust_stamina_loss(-15 * metabolization_ratio * seconds_per_tick, updating_stamina = FALSE))
+ . = UPDATE_MOB_HEALTH
+ if(need_mob_update)
+ . = UPDATE_MOB_HEALTH
+ if(SPT_PROB(5, seconds_per_tick))
+ drinker.emote(pick("twitch", "drool"))
+
+/datum/reagent/consumable/ethanol/ramp_rager/on_mob_metabolize(mob/living/drinker)
+ . = ..()
+ drinker.apply_status_effect(/datum/status_effect/spasms)
+ RegisterSignal(drinker, COMSIG_LIVING_ENTER_STAMCRIT, PROC_REF(on_stamcrit))
+
+/datum/reagent/consumable/ethanol/ramp_rager/on_mob_end_metabolize(mob/living/drinker)
+ . = ..()
+ drinker.remove_status_effect(/datum/status_effect/spasms)
+ UnregisterSignal(drinker, COMSIG_LIVING_ENTER_STAMCRIT)
+
+/datum/reagent/consumable/ethanol/ramp_rager/proc/on_stamcrit(mob/living/drinker)
+ SIGNAL_HANDLER
+ drinker.set_stamina_loss(90, updating_stamina = TRUE)
+ to_chat(drinker, span_message("This can't end like this... Blood rushes away from your head..."))
+ volume -= (min(volume, 6))
+ return STAMCRIT_CANCELLED
+
+/datum/reagent/consumable/ethanol/sea_lantern
+ name = "Sea Lantern"
+ description = "Layered drink using fonarstolbe's unique properties. May it guide you away from harm, in these trying times."
+ boozepwr = 35
+ color = "#9FE7EC"
+ taste_description = "sweet and minty"
+ randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+
+/datum/reagent/consumable/ethanol/icegrave
+ name = "Ice Grave"
+ description = "A very, very cold drink, almost thorny to the touch. Like ice magic in liquid form."
+ boozepwr = 40
+ color = "#443EAC"
+ taste_description = "cold"
+ randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+
+
+/datum/reagent/consumable/ethanol/icegrave/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_CORONER_METABOLISM)) //Coroners know your icegraves. Also, its made using formaldehyde, so.
+ return
+
+ var/icegrave_temp = -200
+ affected_mob.apply_status_effect(/datum/status_effect/ice_block_talisman, 5 SECONDS)
+ var/thermal_protection = 1 - affected_mob.get_insulation_protection(affected_mob.bodytemperature + icegrave_temp)
+ var/applied_temp = (thermal_protection * icegrave_temp) + icegrave_temp
+ affected_mob.adjust_bodytemperature(applied_temp)
+
#undef ALCOHOL_EXPONENT
#undef ALCOHOL_THRESHOLD_MODIFIER
diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm
index 623f10cd7a4e..9541544fcfc1 100644
--- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm
@@ -1427,14 +1427,14 @@
if(found_valid_cooler)
affected_mob.clear_alert("punch_bad")
affected_mob.throw_alert("punch_good", /atom/movable/screen/alert/fruit_punch_good)
- need_mob_update = affected_mob.adjust_tox_loss(-0.3 * metabolization_ratio * seconds_per_tick, updating_health = FALSE)
- need_mob_update = affected_mob.adjust_brute_loss(-0.3 * metabolization_ratio * seconds_per_tick, updating_health = FALSE)
- need_mob_update = affected_mob.adjust_fire_loss(-0.3 * metabolization_ratio * seconds_per_tick, updating_health = FALSE)
+ need_mob_update += affected_mob.adjust_tox_loss(-0.3 * metabolization_ratio * seconds_per_tick, updating_health = FALSE)
+ need_mob_update += affected_mob.adjust_brute_loss(-0.3 * metabolization_ratio * seconds_per_tick, updating_health = FALSE)
+ need_mob_update += affected_mob.adjust_fire_loss(-0.3 * metabolization_ratio * seconds_per_tick, updating_health = FALSE)
affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/punch_punishment)
else
affected_mob.clear_alert("punch_good")
affected_mob.throw_alert("punch_bad", /atom/movable/screen/alert/fruit_punch_bad)
- need_mob_update = affected_mob.apply_damage(0.75 * metabolization_ratio * seconds_per_tick, TOX)
+ need_mob_update += affected_mob.apply_damage(0.75 * metabolization_ratio * seconds_per_tick, TOX)
affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/punch_punishment)
if(SPT_PROB(10, seconds_per_tick))
affected_mob.Knockdown(3 SECONDS, 6 SECONDS) //Gives daze effect. Using the cooler is a commitment and if you get jumped during it or have to run away to fight something, you should be vulnerable.
diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/alcohol.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/alcohol.dm
index c4fadbbf5e8d..39e06769a7d2 100644
--- a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/alcohol.dm
+++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/alcohol.dm
@@ -223,6 +223,13 @@
icon = 'icons/obj/drinks/drinks.dmi'
icon_state = "maraschino"
+/datum/glass_style/drinking_glass/mouthwash
+ required_drink_type = /datum/reagent/consumable/ethanol/mouthwash
+ name = "Mouthwash"
+ desc = "A bottle of mouthwash. The label proudly proclaims 'Kills 99.9% of all germs'. It seems to be more sugar than alcohol in content, though. Smells kind of like ice drake's breath."
+ icon = 'icons/obj/drinks/drinks.dmi'
+ icon_state = "mouthwash"
+
// Shot glasses
/datum/glass_style/shot_glass/kahlua
diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm
index ea3f60ed938a..7a0b4b9356c5 100644
--- a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm
+++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm
@@ -117,6 +117,27 @@
icon = 'icons/obj/drinks/mixed_drinks.dmi'
icon_state = "manlydorfglass"
+/datum/glass_style/drinking_glass/frosty_dorf
+ required_drink_type = /datum/reagent/consumable/ethanol/frosty_dorf
+ name = "The Frosty Dorf"
+ desc = "A herbal variant of the dwarven classic. Makes you feel like digging a mountain keep."
+ icon = 'icons/obj/drinks/mixed_drinks.dmi'
+ icon_state = "frosty_dorf"
+
+/datum/glass_style/drinking_glass/stone_cold_stout
+ required_drink_type = /datum/reagent/consumable/ethanol/stone_cold_stout
+ name = "Stone Cold Stout"
+ desc = "Stone-cold drink, challenging even for seasoned drinkers. If you can survive it, you can take on anything."
+ icon = 'icons/obj/drinks/mixed_drinks.dmi'
+ icon_state = "stone_cold_stout"
+
+/datum/glass_style/drinking_glass/ramp_rager
+ required_drink_type = /datum/reagent/consumable/ethanol/ramp_rager
+ name = "Ramp Rager"
+ desc = "Furiously bubbling drink, capable of making people go berserk. An invitation for a bar fight."
+ icon = 'icons/obj/drinks/mixed_drinks.dmi'
+ icon_state = "ramprager"
+
/datum/glass_style/drinking_glass/longislandicedtea
required_drink_type = /datum/reagent/consumable/ethanol/longislandicedtea
name = "Long Island Iced Tea"
@@ -1233,6 +1254,27 @@
icon = 'icons/obj/drinks/mixed_drinks.dmi'
icon_state = "vieux_carre"
+/datum/glass_style/drinking_glass/mouthwash_strong
+ required_drink_type = /datum/reagent/consumable/ethanol/mouthwash_strong
+ name = "Strong Mouthwash"
+ desc = "A bottle of strong mouthwash, with increased alcohol content. The label proudly proclaims 'Kills 99.9% of all germs'. Another, smaller label reads 'Take responsibility for your hygiene'."
+ icon = 'icons/obj/drinks/mixed_drinks.dmi'
+ icon_state = "mouthwash_strong"
+
+/datum/glass_style/drinking_glass/sea_lantern
+ required_drink_type = /datum/reagent/consumable/ethanol/sea_lantern
+ name = "Sea Lantern"
+ desc = "A layered cocktail of fonarstolbe and strawberry shake composed to roughly mimic a sea lantern, as seen in history books. Advancement in sonar technology and sensors made these buildings long absolote."
+ icon = 'icons/obj/drinks/mixed_drinks.dmi'
+ icon_state = "sea_lantern"
+
+/datum/glass_style/drinking_glass/icegrave
+ required_drink_type = /datum/reagent/consumable/ethanol/icegrave
+ name = "Icegrave"
+ desc = "A single big ice cube suspended in liquids mostly unsafe for human consumption. The glass its held in is frosted, its a miracle it hasn't shattered yet."
+ icon = 'icons/obj/drinks/mixed_drinks.dmi'
+ icon_state = "icegrave"
+
// Shot glasses
/datum/glass_style/shot_glass/toxins_special
@@ -1245,6 +1287,11 @@
icon = 'icons/obj/drinks/mixed_drinks.dmi'
icon_state = "b52glass"
+/datum/glass_style/shot_glass/icegrave
+ required_drink_type = /datum/reagent/consumable/ethanol/icegrave
+ icon = 'icons/obj/drinks/mixed_drinks.dmi'
+ icon_state = "shot_icegrave"
+
/datum/glass_style/shot_glass/hcider
required_drink_type = /datum/reagent/consumable/ethanol/hcider
icon_state = "shotglassbrown"
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 6f6bca9ce317..7e168999d565 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -1409,3 +1409,21 @@
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS
default_container = /obj/item/reagent_containers/condiment/pack/beef_flavour
+
+/datum/reagent/consumable/guidoferrun
+ name = "Guidoferrunitian Glycetamine"
+ description = "A thick, sitcky, metalic substance, somehow capable of thickening one's skin for a short period of time."
+ color = "#4e6b8f"
+ taste_description = "sticky metallic paste"
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS
+
+/datum/reagent/consumable/guidoferrun/on_mob_metabolize(mob/living/carbon/human/affected_mob)
+ . = ..()
+ MODIFY_PHYSIOLOGY(affected_mob, BRUTE, 0.95)
+ MODIFY_PHYSIOLOGY(affected_mob, BURN, 0.95)
+
+/datum/reagent/consumable/guidoferrun/on_mob_end_metabolize(mob/living/carbon/human/affected_mob)
+ . = ..()
+ MODIFY_PHYSIOLOGY(affected_mob, BRUTE, (100/95))
+ MODIFY_PHYSIOLOGY(affected_mob, BURN, (100/95))
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 57997ad65cee..10920e5eb0b2 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
@@ -523,9 +523,9 @@ Basically, we fill the time between now and 2s from now with hands based off the
var/need_mob_update
need_mob_update += affected_mob.adjust_brute_loss(20 * creation_impurity * metabolization_ratio * seconds_per_tick, required_bodytype = affected_bodytype)
need_mob_update += affected_mob.adjust_organ_loss(ORGAN_SLOT_HEART, 4 * ((1 + creation_impurity) * metabolization_ratio * seconds_per_tick), required_organ_flag = affected_organ_flags)
- if(affected_mob.health < HEALTH_THRESHOLD_CRIT)
+ if(affected_mob.health < affected_mob.crit_threshold)
affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nooartrium)
- if(affected_mob.health < HEALTH_THRESHOLD_FULLCRIT)
+ if(affected_mob.health < affected_mob.hardcrit_threshold)
affected_mob.add_actionspeed_modifier(/datum/actionspeed_modifier/nooartrium)
var/obj/item/organ/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART)
if(isnull(heart) || (heart.organ_flags & ORGAN_FAILING))
@@ -537,7 +537,7 @@ Basically, we fill the time between now and 2s from now with hands based off the
. = ..()
remove_buffs(affected_mob)
var/obj/item/organ/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART)
- if(affected_mob.health < (5 * HEALTH_THRESHOLD_DEAD) || (heart?.organ_flags & ORGAN_FAILING)) // Honestly commendable if you get -500
+ if(affected_mob.health < (5 * affected_mob.dead_threshold) || (heart?.organ_flags & ORGAN_FAILING)) // Honestly commendable if you get -500
explosion(affected_mob, light_impact_range = 1, explosion_cause = src)
affected_mob.visible_message(span_boldwarning("[affected_mob]'s heart explodes!"))
qdel(heart)
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index f2c13131ccf4..3260e3ded0fd 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -1880,17 +1880,13 @@
/datum/reagent/medicine/coagulant/on_mob_metabolize(mob/living/affected_mob)
. = ..()
- if(ishuman(affected_mob))
- var/mob/living/carbon/human/blood_boy = affected_mob
- blood_boy.physiology?.bleed_mod *= passive_bleed_modifier
+ MODIFY_PHYSIOLOGY(affected_mob, PHYS_COEFF_BLEED, passive_bleed_modifier)
/datum/reagent/medicine/coagulant/on_mob_end_metabolize(mob/living/affected_mob)
. = ..()
if(was_working)
to_chat(affected_mob, span_warning("The medicine thickening your blood loses its effect!"))
- if(ishuman(affected_mob))
- var/mob/living/carbon/human/blood_boy = affected_mob
- blood_boy.physiology?.bleed_mod /= passive_bleed_modifier
+ MODIFY_PHYSIOLOGY(affected_mob, PHYS_COEFF_BLEED, 1 / passive_bleed_modifier)
/datum/reagent/medicine/coagulant/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, metabolization_ratio)
. = ..()
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 33ec599c855c..5c758cb73902 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -51,8 +51,10 @@
// DARKPACK EDIT ADD START - blood increments bloodpool
/datum/reagent/blood/expose_mob(mob/living/exposed_mob, methods, reac_volume, show_message, touch_protection)
. = ..()
- if((!istype(src, /datum/reagent/blood/vitae)) && get_kindred_splat(exposed_mob) && !HAS_TRAIT(exposed_mob, TRAIT_THIRST_OF_AGES))
- if(methods & INGEST)
+ if(methods & INGEST)
+ if(data?["donor"])
+ LAZYOR(exposed_mob.mobs_tasted_blood_of, data["donor"])
+ if((!istype(src, /datum/reagent/blood/vitae)) && get_kindred_splat(exposed_mob) && !HAS_TRAIT(exposed_mob, TRAIT_THIRST_OF_AGES))
if(get_splat_with_vitae(exposed_mob))
//100u of vitae = 1bp, keeping consistent w/ give vitae action. 200u of normal blood = 1 bp
exposed_mob.adjust_blood_pool(reac_volume * 0.005)
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
index 3b3593c64144..b0eee39ce7ff 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
@@ -450,17 +450,11 @@
/datum/reagent/teslium/on_mob_metabolize(mob/living/carbon/affected_mob)
. = ..()
- if(!ishuman(affected_mob))
- return
- var/mob/living/carbon/human/affected_human = affected_mob
- affected_human.physiology.siemens_coeff *= 2
+ MODIFY_PHYSIOLOGY(affected_mob, PHYS_COEFF_ELEC_CONDUCTIVITY, 2)
/datum/reagent/teslium/on_mob_end_metabolize(mob/living/carbon/affected_mob)
. = ..()
- if(!ishuman(affected_mob))
- return
- var/mob/living/carbon/human/affected_human = affected_mob
- affected_human.physiology.siemens_coeff *= 0.5
+ MODIFY_PHYSIOLOGY(affected_mob, PHYS_COEFF_ELEC_CONDUCTIVITY, 0.5)
/datum/reagent/teslium/on_spark_act(power_charge, spark_flags)
tesla_zap(source = holder.my_atom, zap_range = round(volume / 5, 1), power = volume * 20 + power_charge, cutoff = 1 KILO JOULES, zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_LOW_POWER_GEN)
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 4f3a38306411..67e126bc8049 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -483,6 +483,8 @@
ph = 2.7
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS
+ var/spacevine_kill_prob = 50
+ var/weed_damage_multiplier = 1
// Plant-B-Gone is just as bad
/datum/reagent/toxin/plantbgone/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user)
@@ -492,24 +494,33 @@
/datum/reagent/toxin/plantbgone/expose_obj(obj/exposed_obj, reac_volume, methods=TOUCH, show_message=TRUE)
. = ..()
- if(istype(exposed_obj, /obj/structure/alien/weeds))
- var/obj/structure/alien/weeds/alien_weeds = exposed_obj
- alien_weeds.take_damage(rand(15, 35), BRUTE, 0) // Kills alien weeds pretty fast
+ if(istype(exposed_obj, /obj/structure/alien/weeds)) // alien weeds have low hp so just kill
+ qdel(exposed_obj)
if(istype(exposed_obj, /obj/structure/alien/resin/flower_bud))
var/obj/structure/alien/resin/flower_bud/flower = exposed_obj
- flower.take_damage(rand(30, 50), BRUTE, 0)
- else if(istype(exposed_obj, /obj/structure/glowshroom)) //even a small amount is enough to kill it
+ var/datum/spacevine_mutation/toxicity/toxicity = locate() in flower.mutations
+ if(toxicity)
+ return
+
+ var/flower_damage = rand(15, 25) * weed_damage_multiplier
+ flower.take_damage(flower_damage, BRUTE, 0)
+ if(istype(exposed_obj, /obj/structure/glowshroom)) //even a small amount is enough to kill it
qdel(exposed_obj)
- else if(istype(exposed_obj, /obj/structure/spacevine))
- var/obj/structure/spacevine/SV = exposed_obj
- SV.on_chem_effect(src)
+ if(istype(exposed_obj, /obj/structure/spacevine))
+ var/obj/structure/spacevine/vine = exposed_obj
+ var/datum/spacevine_mutation/toxicity/toxicity = locate() in vine.mutations
+ if(toxicity)
+ return
+
+ if(prob(spacevine_kill_prob))
+ qdel(vine)
/datum/reagent/toxin/plantbgone/expose_mob(mob/living/exposed_mob, methods = TOUCH, reac_volume)
. = ..()
var/damage = min(round(0.4 * reac_volume, 0.1), 10)
if(exposed_mob.mob_biotypes & MOB_PLANT)
- // spray bottle emits 5u so it's dealing ~15 dmg per spray
- if(exposed_mob.adjust_tox_loss(damage * 20, required_biotype = affected_biotype))
+ damage = damage * 10 * weed_damage_multiplier
+ if(exposed_mob.adjust_tox_loss(damage, required_biotype = affected_biotype))
return
if(!(methods & VAPOR) || !ishuman(exposed_mob))
@@ -526,6 +537,8 @@
ph = 3
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS
+ spacevine_kill_prob = 75
+ weed_damage_multiplier = 2
//Weed Spray
/datum/reagent/toxin/plantbgone/weedkiller/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user)
@@ -1656,7 +1669,7 @@
. = ..()
var/merged_total = amount + volume
if(merged_total >= CRITICAL_CAPACITY)
- spew_waste(round(volume / WASTE_REACTION_THRESHOLD * 2)) //Sure as HELL can't store it.
+ spew_waste(round(volume / (WASTE_REACTION_THRESHOLD * 2)), merged_total) //Sure as HELL can't store it.
var/atom/container = holder.my_atom
var/damage_mult = 1
if(ismachinery(container))
@@ -1693,7 +1706,6 @@
if(goo.lazy_init_reagents())
goo.reagents.maximum_volume = min(goo.reagents.maximum_volume + rounded_volume, 300)
- goo.reagents.add_reagent(type, rounded_volume)
if(goo.reagents.has_reagent(type, WASTE_REACTION_THRESHOLD))
goo.pre_dissolve()
return // Otherwise there's too little waste to do anything.
@@ -1711,10 +1723,11 @@
/**
* Pick a random turf in the spew range and split our total amount of waste there.
*/
-/datum/reagent/toxin/acid/industrial_waste/proc/spew_waste(spew_range = 1)
+/datum/reagent/toxin/acid/industrial_waste/proc/spew_waste(spew_range = 1, total_toxins)
if(!spew_range)
return
-
+ if(!holder.my_atom)
+ return
var/atom/atom_holder = holder.my_atom
var/turf/dropturf = get_turf(atom_holder)
if(!dropturf)
@@ -1778,3 +1791,45 @@
if(current_cycle >= transformation_cycle)
affected_mob.mind?.add_antag_datum(/datum/antagonist/spider)
affected_mob.change_mob_type(/mob/living/basic/spider/giant, delete_old_mob = TRUE)
+
+/datum/reagent/toxin/berserker
+ name = "Berserker Toxin"
+ description = "A psychoactive substance irritating the neural sectors responsible for fight or flight response, damaging them in the process."
+ silent_toxin = TRUE
+ color = "#ad378d"
+ penetrates_skin = VAPOR
+ toxpwr = 0.2
+ taste_description = "bitter rage"
+ chemical_flags = REAGENT_NO_RANDOM_RECIPE
+ randomized_spawns = REAGENT_SPAWN_ALL_RANDOM_SPAWNS
+ metabolized_traits = list(TRAIT_ANALGESIA, TRAIT_STIMULATED)
+ addiction_types = list(/datum/addiction/stimulants = 30)
+
+/datum/reagent/toxin/berserker/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, metabolization_ratio)
+ . = ..()
+ var/need_mob_update
+ need_mob_update += affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.75 * metabolization_ratio * seconds_per_tick)
+ affected_mob.AdjustAllImmobility(-5 * metabolization_ratio * seconds_per_tick)
+ if(affected_mob.adjust_stamina_loss(-10 * metabolization_ratio * seconds_per_tick, updating_stamina = FALSE))
+ . = UPDATE_MOB_HEALTH
+ if(need_mob_update)
+ . = UPDATE_MOB_HEALTH
+ if(SPT_PROB(5, seconds_per_tick))
+ affected_mob.emote(pick("twitch", "drool"))
+
+/datum/reagent/toxin/berserker/on_mob_metabolize(mob/living/affected_mob)
+ . = ..()
+ affected_mob.apply_status_effect(/datum/status_effect/spasms)
+ RegisterSignal(affected_mob, COMSIG_LIVING_ENTER_STAMCRIT, PROC_REF(on_stamcrit))
+
+/datum/reagent/toxin/berserker/on_mob_end_metabolize(mob/living/affected_mob)
+ . = ..()
+ affected_mob.remove_status_effect(/datum/status_effect/spasms)
+ UnregisterSignal(affected_mob, COMSIG_LIVING_ENTER_STAMCRIT)
+
+/datum/reagent/toxin/berserker/proc/on_stamcrit(mob/living/affected_mob)
+ SIGNAL_HANDLER
+ affected_mob.set_stamina_loss(90, updating_stamina = TRUE)
+ to_chat(affected_mob, span_message("This can't end like this... Blood rushes away from your head..."))
+ volume -= volume
+ return STAMCRIT_CANCELLED
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 5e74d91f230a..a8ef547600a2 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -186,7 +186,7 @@
to_chat(ghostie, span_userdanger("The power of [deity] compels you!"))
ghostie.apply_status_effect(/datum/status_effect/incapacitating/paralyzed/revenant, 2 SECONDS)
ghostie.apply_status_effect(/datum/status_effect/revenant/revealed, 10 SECONDS)
- ghostie.adjust_health(50)
+ ghostie.adjust_brute_loss(50)
for(var/mob/living/carbon/evil_motherfucker in get_hearers_in_view(effective_size,T))
if(IS_CULTIST(evil_motherfucker) || HAS_TRAIT(evil_motherfucker, TRAIT_EVIL))
to_chat(evil_motherfucker, span_userdanger("The divine explosion sears you!"))
diff --git a/code/modules/reagents/reagent_containers/cups/drinks.dm b/code/modules/reagents/reagent_containers/cups/drinks.dm
index 29cb765e6aab..a733f0214ae8 100644
--- a/code/modules/reagents/reagent_containers/cups/drinks.dm
+++ b/code/modules/reagents/reagent_containers/cups/drinks.dm
@@ -118,6 +118,7 @@
desc = "Careful, the beverage you're about to enjoy is extremely hot."
icon = 'icons/obj/drinks/coffee.dmi'
icon_state = "coffee"
+ inhand_icon_state = "coffee"
base_icon_state = "coffee"
list_reagents = list(/datum/reagent/consumable/coffee = 30)
resistance_flags = FREEZE_PROOF
diff --git a/code/modules/reagents/reagent_containers/cups/soda.dm b/code/modules/reagents/reagent_containers/cups/soda.dm
index 1877e290f556..2867b9a41d65 100644
--- a/code/modules/reagents/reagent_containers/cups/soda.dm
+++ b/code/modules/reagents/reagent_containers/cups/soda.dm
@@ -322,6 +322,7 @@
name = "Cola" // DARKPACK EDIT CHANGE
desc = "Refreshing and caffinated cola." // DARKPACK EDIT CHANGE
icon_state = "cola"
+ inhand_icon_state = "cola"
list_reagents = list(/datum/reagent/consumable/space_cola = 30)
drink_type = SUGAR
@@ -329,6 +330,7 @@
name = "T-Bone's tonic water" // DARKPACK EDIT CHANGE
desc = "Quinine tastes funny, but at least it'll keep that Malaria away." // DARKPACK EDIT CHANGE
icon_state = "tonic"
+ inhand_icon_state = "tonic"
volume = 50
list_reagents = list(/datum/reagent/consumable/tonic = 50)
drink_type = ALCOHOL
@@ -337,6 +339,7 @@
name = "soda water"
desc = "A can of soda water. Why not make a scotch and soda?"
icon_state = "sodawater"
+ inhand_icon_state = "sodawater"
volume = 50
list_reagents = list(/datum/reagent/consumable/sodawater = 50)
@@ -344,6 +347,7 @@
name = "orange soda"
desc = "You wanted ORANGE. It gave you Lemon Lime."
icon_state = "lemon-lime"
+ inhand_icon_state = "lemon-lime"
list_reagents = list(/datum/reagent/consumable/lemon_lime = 30)
drink_type = FRUIT
@@ -362,6 +366,7 @@
name = "Six-Up!" // DARKPACK EDIT CHANGE
desc = "Half as good with none of the caffine!" // DARKPACK EDIT CHANGE
icon_state = "space-up"
+ inhand_icon_state = "space-up"
list_reagents = list(/datum/reagent/consumable/space_up = 30)
drink_type = SUGAR | JUNKFOOD
@@ -369,6 +374,7 @@
name = "Star-kist"
desc = "The taste of a star in liquid form. And, a bit of tuna...?"
icon_state = "starkist"
+ inhand_icon_state = "starkist"
list_reagents = list(/datum/reagent/consumable/space_cola = 15, /datum/reagent/consumable/orangejuice = 15)
drink_type = SUGAR | FRUIT | JUNKFOOD
@@ -376,6 +382,7 @@
name = "Mountain Wind" // DARKPACK EDIT CHANGE
desc = "Blows right through you like a steep mountain's wind." // DARKPACK EDIT CHANGE
icon_state = "space_mountain_wind"
+ inhand_icon_state = "space_mountain_wind"
list_reagents = list(/datum/reagent/consumable/spacemountainwind = 30)
drink_type = SUGAR | JUNKFOOD
@@ -383,6 +390,7 @@
name = "Thirteen Loko"
desc = "The FDA has advised citizens that consumption of Thirteen Loko may result in seizures, blindness, drunkenness, or even death. Please Drink Responsibly." // DARKPACK EDIT CHANGE
icon_state = "thirteen_loko"
+ inhand_icon_state = "thirteen_loko"
list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 30)
drink_type = SUGAR | JUNKFOOD
@@ -390,6 +398,7 @@
name = "Dr. Gibb"
desc = "A delicious mixture of 42 different flavors."
icon_state = "dr_gibb"
+ inhand_icon_state = "dr_gibb"
list_reagents = list(/datum/reagent/consumable/dr_gibb = 30)
drink_type = SUGAR | JUNKFOOD
@@ -397,6 +406,7 @@
name = "Pwr Game"
desc = "The only drink with the PWR that true gamers crave. When a gamer talks about gamerfuel, this is what they're literally referring to."
icon_state = "purple_can"
+ inhand_icon_state = "purple_can"
list_reagents = list(/datum/reagent/consumable/pwr_game = 30)
/obj/item/reagent_containers/cup/soda_cans/shamblers
@@ -418,6 +428,7 @@
name = "Wellcheers Juice"
desc = "A strange purple drink, smelling of saltwater. Somewhere in the distance, you hear seagulls."
icon_state = "wellcheers"
+ inhand_icon_state = "wellcheers"
list_reagents = list(/datum/reagent/consumable/wellcheers = 30)
drink_type = SUGAR | JUNKFOOD
@@ -441,6 +452,7 @@
name = "24-Volt Energy"
desc = "Recharge, with 24-Volt Energy!"
icon_state = "volt_energy"
+ inhand_icon_state = "volt_energy"
list_reagents = list(/datum/reagent/consumable/volt_energy = 30)
drink_type = SUGAR | JUNKFOOD
@@ -448,6 +460,7 @@
name = "Kansumi Melon Soda"
desc = "Japan's favourite melon soda, now available in can form!"
icon_state = "melon_soda"
+ inhand_icon_state = "melon_soda"
list_reagents = list(/datum/reagent/consumable/melon_soda = 30)
drink_type = SUGAR | JUNKFOOD
@@ -461,6 +474,7 @@
name = "beer" // DARKPACK EDIT CHANGE
desc = "Canned beer." // DARKPACK EDIT CHANGE
icon_state = "space_beer"
+ inhand_icon_state = "space_beer"
volume = 40
list_reagents = list(/datum/reagent/consumable/ethanol/beer = 40)
drink_type = GRAIN
@@ -469,6 +483,7 @@
name = "rice beer"
desc = "A light, rice-based lagered beer. Considered a hate crime against Bavarians under the Reinheitsgebot Act of 1516." // DARKPACK EDIT CHANGE
icon_state = "ebisu"
+ inhand_icon_state = "ebisu"
list_reagents = list(/datum/reagent/consumable/ethanol/rice_beer = 40)
/obj/item/reagent_containers/cup/soda_cans/beer/rice/Initialize(mapload)
diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm
index 85503f586d12..d1c875ecec76 100644
--- a/code/modules/religion/religion_sects.dm
+++ b/code/modules/religion/religion_sects.dm
@@ -271,7 +271,6 @@
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)
- altar_icon_state = "convertaltar-yellow"
/datum/religion_sect/greed/tool_examine(mob/living/holy_creature) //display money policy
return "In the eyes of [GLOB.deity], your wealth is your favor."
@@ -391,7 +390,7 @@
if(suffocation_damage && !HAS_TRAIT(chaplain, TRAIT_NOBREATH))
transferred = TRUE
target.adjust_oxy_loss(-suffocation_damage)
- chaplain.adjust_oxy_loss(suffocation_damage * burden_modifier, forced = TRUE)
+ chaplain.adjust_oxy_loss(suffocation_damage * burden_modifier)
var/cached_blood_volume = target.get_blood_volume()
if (cached_blood_volume < BLOOD_VOLUME_SAFE)
diff --git a/code/modules/research/anomaly/anomaly_core.dm b/code/modules/research/anomaly/anomaly_core.dm
index 0c73ed32218a..4b1a9e7292b0 100644
--- a/code/modules/research/anomaly/anomaly_core.dm
+++ b/code/modules/research/anomaly/anomaly_core.dm
@@ -90,7 +90,7 @@
core_color = COLOR_DARK_CYAN
/obj/item/assembly/signaler/anomaly/bluespace/signal()
- var/atom/movable/to_teleport = get_teleportable_container(src, container_flags = TELEPORT_CONTAINER_INCLUDE_SEALED_MODSUIT)
+ var/atom/movable/to_teleport = get_loose_container(src, container_flags = LOOSE_CONTAINER_INCLUDE_SEALED_MODSUIT)
if(!to_teleport)
return
var/turf/teleportable_turf = get_turf(to_teleport)
diff --git a/code/modules/research/designs/_design.dm b/code/modules/research/designs/_design.dm
index e69224c8a57f..671d3ab8c0cd 100644
--- a/code/modules/research/designs/_design.dm
+++ b/code/modules/research/designs/_design.dm
@@ -23,8 +23,10 @@ other types of metals and chemistry for reagents).
var/desc = null
/// Bitflags indicating what machines this design is compatable with. ([IMPRINTER]|[AWAY_IMPRINTER]|[PROTOLATHE]|[AWAY_LATHE]|[AUTOLATHE]|[MECHFAB]|[BIOGENERATOR]|[LIMBGROWER]|[SMELTER])
var/build_type = null
- /// Associative List of materials required to create one unit of the product. Format is (typepath or requirements datum) -> amount
+ /// Associative List of materials required to create one unit of the product.
/// e.g: [/datum/material/iron --> SHEET_MATERIAL_AMOUNT]
+ /// OR: [/datum/material_requirement/solid_material --> SHEET_MATERIAL_AMOUNT]
+ /// OR: [/datum/material_slot/weapon_head/speartip --> /datum/material/bone]
var/list/materials = list()
/// The amount of time required to create one unit of the product.
var/construction_time = 3.2 SECONDS
@@ -40,8 +42,8 @@ other types of metals and chemistry for reagents).
var/lathe_time_factor = 1
/// Bitflags indicating what departmental lathes should be allowed to process this design.
var/departmental_flags = ALL
- /// Aa list of techwebs nodes that unlock this design. Auto-generated by SSresearch.
- var/list/unlocked_by = list()
+ /// A list of techwebs nodes that unlock this design. Auto-generated by SSresearch.
+ var/list/unlocked_by
/// Override for the automatic icon generation used for the research console.
var/research_icon
/// Override for the automatic icon state generation used for the research console.
@@ -88,7 +90,7 @@ other types of metals and chemistry for reagents).
/datum/design/New()
. = ..()
var/static/base_path_len = length("/datum/design/")
- asset_id = replacetext(splicetext("[type]", 1, base_path_len), "/", "_")
+ asset_id = replacetext(splicetext("[type]", 1, base_path_len + 1), "/", "_")
var/list/temp_list = list()
// Go through all of our materials, get the subsystem instance, and then replace the list.
diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm
index 4c95fc58fabf..3fc8ccc3b2a0 100644
--- a/code/modules/research/designs/bluespace_designs.dm
+++ b/code/modules/research/designs/bluespace_designs.dm
@@ -5,7 +5,7 @@
/datum/design/beacon
name = "Tracking Beacon"
- desc = "A bluespace tracking beacon."
+ desc = "A bluespace tracking beacon. Teleporters can lock onto it."
build_type = PROTOLATHE
materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*1.5, /datum/material/glass =SMALL_MATERIAL_AMOUNT)
build_path = /obj/item/beacon
diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm
index 4630593abb90..143bb21c97bf 100644
--- a/code/modules/research/designs/comp_board_designs.dm
+++ b/code/modules/research/designs/comp_board_designs.dm
@@ -7,7 +7,7 @@
/datum/design/board/arcade_battle
name = "Battle Arcade Machine Board"
- desc = "Allows for the construction of circuit boards used to build a new arcade machine."
+ desc = "Used to build a battle arcade machine."
build_path = /obj/item/circuitboard/computer/arcade/battle
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ENTERTAINMENT
@@ -16,7 +16,7 @@
/datum/design/board/orion_trail
name = "Orion Trail Arcade Machine Board"
- desc = "Allows for the construction of circuit boards used to build a new Orion Trail machine."
+ desc = "Used to build an Orion Trail machine."
build_path = /obj/item/circuitboard/computer/arcade/orion_trail
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ENTERTAINMENT
@@ -25,7 +25,7 @@
/datum/design/board/seccamera
name = "Security Camera Board"
- desc = "Allows for the construction of circuit boards used to build security camera computers."
+ desc = "Used to build a security camera console, to view the station's security camera network."
build_path = /obj/item/circuitboard/computer/security
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_SECURITY
@@ -34,7 +34,7 @@
/datum/design/board/rdcamera
name = "Research Monitor Board"
- desc = "Allows for the construction of circuit boards used to build research camera computers."
+ desc = "Used to build a research camera console, to view the research department's camera networks."
build_path = /obj/item/circuitboard/computer/research
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_RESEARCH
@@ -43,7 +43,7 @@
/datum/design/board/xenobiocamera
name = "Xenobiology Console Board"
- desc = "Allows for the construction of circuit boards used to build xenobiology camera computers."
+ desc = "Used to build a xenobiology camera console, to manage xenobiology's slime research."
build_path = /obj/item/circuitboard/computer/xenobiology
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_RESEARCH
@@ -52,7 +52,7 @@
/datum/design/board/med_data
name = "Medical Records Board"
- desc = "Allows for the construction of circuit boards used to build a medical records console."
+ desc = "Used to build a medical records console, to view the crew's medical data."
build_path = /obj/item/circuitboard/computer/med_data
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_MEDICAL
@@ -61,7 +61,7 @@
/datum/design/board/operating
name = "Operating Computer Board"
- desc = "Allows for the construction of circuit boards used to build an operating computer console."
+ desc = "Used to build an operating computer console, to perform advanced surgical procedures."
build_path = /obj/item/circuitboard/computer/operating
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_MEDICAL
@@ -70,7 +70,7 @@
/datum/design/board/pandemic
name = "PanD.E.M.I.C. 2200 Board"
- desc = "Allows for the construction of circuit boards used to build a PanD.E.M.I.C. 2200 console."
+ desc = "Used to build a PanD.E.M.I.C. 2200 console, to view and engineer viruses."
build_path = /obj/item/circuitboard/computer/pandemic
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_MEDICAL
@@ -79,7 +79,7 @@
/datum/design/board/comconsole
name = "Communications Board"
- desc = "Allows for the construction of circuit boards used to build a communications console."
+ desc = "Used to build a communications console, primarily for managing communication between Central Command and the station. Typically installed in the Bridge."
build_path = /obj/item/circuitboard/computer/communications
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_COMMAND
@@ -88,7 +88,7 @@
/datum/design/board/bankmachine
name = "Bank Machine Board"
- desc = "Allows for the construction of circuit boards used to build a Bank Machine."
+ desc = "Used to build a bank machine, allowing withdrawal and deposit of funds into the station's bank account. Typically installed in the Vault."
build_path = /obj/item/circuitboard/computer/bankmachine
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_COMMAND
@@ -97,7 +97,7 @@
/datum/design/board/crewconsole
name = "Crew Monitoring Computer Board"
- desc = "Allows for the construction of circuit boards used to build a Crew monitoring computer."
+ desc = "Used to build a crew monitoring computer, to monitor the crew's vital signs."
build_type = IMPRINTER
build_path = /obj/item/circuitboard/computer/crew
category = list(
@@ -107,7 +107,7 @@
/datum/design/board/secdata
name = "Security Records Console Board"
- desc = "Allows for the construction of circuit boards used to build a security records console."
+ desc = "Used to build a security records console, to manage and view the station's security records."
build_path = /obj/item/circuitboard/computer/secure_data
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_SECURITY
@@ -116,7 +116,7 @@
/datum/design/board/atmosalerts
name = "Atmosphere Alert Board"
- desc = "Allows for the construction of circuit boards used to build an atmosphere alert console."
+ desc = "Used to build an atmosphere alert console, reporting hazardous atmospheric conditions across the station."
build_path = /obj/item/circuitboard/computer/atmos_alert
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ENGINEERING
@@ -125,7 +125,7 @@
/datum/design/board/atmos_control
name = "Atmospheric Monitor Board"
- desc = "Allows for the construction of circuit boards used to build an Atmospheric Monitor."
+ desc = "Used to build an atmospheric monitor, giving more detailed information about the station's atmospheric conditions."
build_path = /obj/item/circuitboard/computer/atmos_control
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ENGINEERING
@@ -134,7 +134,7 @@
/datum/design/board/robocontrol
name = "Robotics Control Console Board"
- desc = "Allows for the construction of circuit boards used to build a Robotics Control console."
+ desc = "Used to build a robotics control console, offering control over the station's bot assistants, and to a lesser extent, cyborg units."
materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =SHEET_MATERIAL_AMOUNT)
build_path = /obj/item/circuitboard/computer/robotics
category = list(
@@ -144,7 +144,7 @@
/datum/design/board/slot_machine
name = "Slot Machine Board"
- desc = "Allows for the construction of circuit boards used to build a new slot machine."
+ desc = "Used to build a new slot machine."
build_path = /obj/item/circuitboard/computer/slot_machine
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ENTERTAINMENT
@@ -154,7 +154,8 @@
/datum/design/board/powermonitor
name = "Power Monitor Board"
- desc = "Allows for the construction of circuit boards used to build a new power monitor."
+ desc = "Used to build a power monitoring console. Provides real-time information pertaining to all APC and SMES units connected to the console. \
+ Requires a physical cable connection, unlike most consoles."
build_path = /obj/item/circuitboard/computer/powermonitor
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ENGINEERING
@@ -163,7 +164,8 @@
/datum/design/board/solarcontrol
name = "Solar Control Board"
- desc = "Allows for the construction of circuit boards used to build a solar control console."
+ desc = "Used to build a solar control console. Tracks the status of all solar cells connected to the console. \
+ Requires a physical cable connection, unlike most consoles."
build_path = /obj/item/circuitboard/computer/solar_control
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ENGINEERING
@@ -172,7 +174,7 @@
/datum/design/board/prisonmanage
name = "Prisoner Management Console Board"
- desc = "Allows for the construction of circuit boards used to build a prisoner management console."
+ desc = "Used to build a prisoner management console, allowing monitoring of all implanted convicts."
build_path = /obj/item/circuitboard/computer/prisoner
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_SECURITY
@@ -181,7 +183,7 @@
/datum/design/board/mechacontrol
name = "Exosuit Control Console Board"
- desc = "Allows for the construction of circuit boards used to build an exosuit control console."
+ desc = "Used to build an exosuit control console, allowing monitoring over mechs with installed tracking beacons."
build_path = /obj/item/circuitboard/computer/mecha_control
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ROBOTICS
@@ -190,7 +192,7 @@
/datum/design/board/mechapower
name = "Mech Bay Power Control Console Board"
- desc = "Allows for the construction of circuit boards used to build a mech bay power control console."
+ desc = "Used to build a mech bay power control console. Built in tandem with a mech recharger to, well, recharge mechs."
build_path = /obj/item/circuitboard/computer/mech_bay_power_console
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ROBOTICS
@@ -199,7 +201,8 @@
/datum/design/board/rdconsole
name = "R&D Console Board"
- desc = "Allows for the construction of circuit boards used to build a new R&D console."
+ desc = "Used to build a new R&D console, to research new technology for the station. \
+ Locked by default, requiring research access to unlock."
build_path = /obj/item/circuitboard/computer/rdconsole
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_RESEARCH
@@ -208,7 +211,7 @@
/datum/design/board/cargo
name = "Supply Console Board"
- desc = "Allows for the construction of circuit boards used to build a Supply Console."
+ desc = "Used to build a Supply Console. Able to approve supply requests, directly purchase items, and send the supply shuttle back and forth between the station and Central Command."
build_type = IMPRINTER
build_path = /obj/item/circuitboard/computer/cargo
category = list(
@@ -218,7 +221,7 @@
/datum/design/board/cargorequest
name = "Supply Request Console Board"
- desc = "Allows for the construction of circuit boards used to build a Supply Request Console."
+ desc = "Used to build a Supply Request Console. A \"request only\" version of the supply console board, incapable of direct purchase or shuttle use."
build_type = IMPRINTER
build_path = /obj/item/circuitboard/computer/cargo/request
category = list(
@@ -228,7 +231,7 @@
/datum/design/board/mining
name = "Outpost Status Display Board"
- desc = "Allows for the construction of circuit boards used to build an outpost status display console."
+ desc = "Used to build an outpost status display console, to view the mining outpost's camera network."
build_path = /obj/item/circuitboard/computer/mining
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_CARGO
@@ -237,7 +240,7 @@
/datum/design/board/comm_monitor
name = "Telecommunications Monitoring Console Board"
- desc = "Allows for the construction of circuit boards used to build a telecommunications monitor."
+ desc = "Used to build a telecommunications monitor, reporting the status of a telecommunication network."
build_path = /obj/item/circuitboard/computer/comm_monitor
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ENGINEERING
@@ -246,7 +249,7 @@
/datum/design/board/comm_server
name = "Telecommunications Server Monitoring Console Board"
- desc = "Allows for the construction of circuit boards used to build a telecommunication server browser and monitor."
+ desc = "Used to build a telecommunication server monitor, which logs and stores all communications messages sent through a telecommunication network."
build_path = /obj/item/circuitboard/computer/comm_server
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ENGINEERING
@@ -255,7 +258,7 @@
/datum/design/board/message_monitor
name = "Messaging Monitor Console Board"
- desc = "Allows for the construction of circuit boards used to build a messaging monitor console."
+ desc = "Used to build a messaging monitor console, which logs and stores all messages sent via PDA or request console."
build_path = /obj/item/circuitboard/computer/message_monitor
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ENGINEERING
@@ -264,7 +267,7 @@
/datum/design/board/aifixer
name = "AI Integrity Restorer Board"
- desc = "Allows for the construction of circuit boards used to build an AI Integrity Restorer."
+ desc = "Used to build an AI Integrity Restorer, to repair broken AI units."
build_path = /obj/item/circuitboard/computer/aifixer
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ROBOTICS
@@ -273,7 +276,7 @@
/datum/design/board/libraryconsole
name = "Library Console Board"
- desc = "Allows for the construction of circuit boards used to build a new library console."
+ desc = "Used to build a new library console, providing access to the station's library database."
build_path = /obj/item/circuitboard/computer/libraryconsole
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ENTERTAINMENT
@@ -282,7 +285,8 @@
/datum/design/board/apc_control
name = "APC Control Board"
- desc = "Allows for the construction of circuit boards used to build a new APC control console."
+ desc = "Used to build a new power flow control console, allowing remote access and control over all the station's APC units. \
+ Requires Chief Engineer access to operate."
build_path = /obj/item/circuitboard/computer/apc_control
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_ENGINEERING
@@ -291,7 +295,7 @@
/datum/design/board/advanced_camera
name = "Advanced Camera Console Board"
- desc = "Allows for the construction of circuit boards used to build advanced camera consoles."
+ desc = "Used to build advanced camera consoles, providing enhanced surveillance capabilities."
build_path = /obj/item/circuitboard/computer/advanced_camera
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_SECURITY
@@ -300,7 +304,7 @@
/datum/design/board/bountypad_control
name = "Civilian Bounty Pad Control Board"
- desc = "Allows for the construction of circuit boards used to build a new civilian bounty pad console."
+ desc = "Used to build a civilian bounty pad console, allowing the crew to manage and track their cargo bounties. Requires a civilian bounty pad."
build_path = /obj/item/circuitboard/computer/bountypad
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_CARGO
@@ -309,7 +313,7 @@
/datum/design/board/exoscanner_console
name = "Scanner Array Control Console Board"
- desc = "Allows for the construction of circuit boards used to build a new scanner array control console."
+ desc = "Used to build a scanner array control console. Used by exodrone operators to manage their scanning arrays and discover new locations to explore."
build_type = IMPRINTER
build_path = /obj/item/circuitboard/computer/exoscanner_console
category = list(
@@ -319,7 +323,7 @@
/datum/design/board/exodrone_console
name = "Exploration Drone Control Console Board"
- desc = "Allows for the construction of circuit boards used to build a new exploration drone control console."
+ desc = "Used to build a new exploration drone control console. Used by exodrone operators to control their exploration drones."
build_type = IMPRINTER
build_path = /obj/item/circuitboard/computer/exodrone_console
category = list(
@@ -329,7 +333,7 @@
/datum/design/board/accounting_console
name = "Account Lookup Console Board"
- desc = "Allows for the construction of circuit boards used to assess the wealth of crewmates on station."
+ desc = "Used to build an account lookup console, allowing for the quick auditing of the crew's financial records, as well as paycheck management."
build_type = IMPRINTER
build_path = /obj/item/circuitboard/computer/accounting
category = list(
@@ -346,18 +350,18 @@
departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_CARGO
/datum/design/board/shuttle/flight_control
- name = "Computer Design (Shuttle Flight Controls)"
- desc = "Allows for the construction of circuit boards used to build a console that enables shuttle flight"
+ name = "Shuttle Flight Control Board"
+ desc = "Used to build a console that enables shuttle flight."
build_path = /obj/item/circuitboard/computer/shuttle/flight_control
/datum/design/board/shuttle/shuttle_docker
- name = "Computer Design (Shuttle Navigation Computer)"
- desc = "Allows for the construction of circuit boards used to build a console that enables the targetting of custom flight locations"
+ name = "Shuttle Navigation Computer Board"
+ desc = "Used to build a console that enables the targeting of custom flight locations."
build_path = /obj/item/circuitboard/computer/shuttle/docker
/datum/design/board/quantum_console
name = "Quantum Console Board"
- desc = "Allows for the construction of circuit boards used to build a Quantum Console."
+ desc = "Used to build a quantum console, used by Bitrunners to manage their quantum server."
build_path = /obj/item/circuitboard/computer/quantum_console
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_CARGO
diff --git a/code/modules/research/designs/electronics_designs.dm b/code/modules/research/designs/electronics_designs.dm
index 12ed87df500e..1e0b000f4d8e 100644
--- a/code/modules/research/designs/electronics_designs.dm
+++ b/code/modules/research/designs/electronics_designs.dm
@@ -5,7 +5,7 @@
/datum/design/intellicard
name = "Intellicard AI Transportation System"
- desc = "Allows for the construction of an intellicard."
+ desc = "Can be used to store AI units and transfer them between systems or networks."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold =SMALL_MATERIAL_AMOUNT * 2)
build_path = /obj/item/aicard
@@ -16,7 +16,7 @@
/datum/design/paicard
name = "Personal Artificial Intelligence Card"
- desc = "Allows for the construction of a pAI Card."
+ desc = "Can be activated to gain a companion AI."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/iron =SMALL_MATERIAL_AMOUNT*5)
build_path = /obj/item/pai_card
@@ -27,7 +27,7 @@
/datum/design/ai_cam_upgrade
name = "AI Surveillance Software Update"
- desc = "A software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading."
+ desc = "A software package that will allow an AI to 'hear' from its cameras via lip reading."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(
/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5,
@@ -45,7 +45,7 @@
/datum/design/ai_power_transfer
name = "AI Power Transfer Update"
- desc = "An upgrade package that lets an AI charge an APC from a distance"
+ desc = "An software package that allows an AI charge an APC, regardless of connection status."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(
/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5,
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 044aa250ffca..6f52d8db7add 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -3,7 +3,7 @@
////////////////////////////////////////
/datum/design/board/electrolyzer
name = "Electrolyzer Board"
- desc = "The circuit board for an electrolyzer."
+ desc = "Used to build an electrolyzer, which atmospherics uses to process certain gas types."
build_path = /obj/item/circuitboard/machine/electrolyzer
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -12,7 +12,7 @@
/datum/design/board/smes
name = "SMES Board"
- desc = "The circuit board for a SMES."
+ desc = "Used to build a SMES (or \"superconducting magnetic energy storage\"), which stores power."
build_path = /obj/item/circuitboard/machine/smes
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -21,7 +21,7 @@
/datum/design/board/power_connector
name = "Power Connector Board"
- desc = "The circuit board for a portable SMES power connector."
+ desc = "Used to build a portable SMES power connector. Portable SMES units can be placed within to store or supply power."
build_path = /obj/item/circuitboard/machine/smes/connector
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -30,7 +30,7 @@
/datum/design/board/smesbank
name = "Portable SMES Board"
- desc = "The circuit board for a portable SMES, which requires a connector to use."
+ desc = "Used to build a portable SMES, which requires a connector to use. Used to store or supply power on the go."
build_path = /obj/item/circuitboard/machine/smesbank
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -39,7 +39,8 @@
/datum/design/board/announcement_system
name = "Automated Announcement System Board"
- desc = "The circuit board for an automated announcement system."
+ desc = "Used to build an automated announcement system. Handles the various automated messages broadcast throughout the station, \
+ such as those from arriving crew members."
build_path = /obj/item/circuitboard/machine/announcement_system
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELECOMMS
@@ -47,8 +48,8 @@
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING
/datum/design/board/turbine_computer
- name = "Turbine Power Console Board"
- desc = "The circuit board for a turbine power console."
+ name = "Turbine Control Console Board"
+ desc = "Used to build a turbine control console. Necessary for operation of a gas turbine."
build_path = /obj/item/circuitboard/computer/turbine_computer
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -57,7 +58,7 @@
/datum/design/board/emitter
name = "Emitter Board"
- desc = "The circuit board for an emitter."
+ desc = "Used to build an emitter, a device that fires high power energy beams."
build_path = /obj/item/circuitboard/machine/emitter
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -66,7 +67,7 @@
/datum/design/board/mass_driver
name = "Mass Driver Board"
- desc = "The circuit board for a mass driver."
+ desc = "Used to build a mass driver, a device which launches projectiles at high velocities."
build_path = /obj/item/circuitboard/machine/mass_driver
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -75,7 +76,8 @@
/datum/design/board/turbine_compressor
name = "Turbine Compressor Board"
- desc = "The circuit board for a turbine compressor."
+ desc = "Used to build a turbine compressor. One third of the necessary components for a gas turbine. \
+ The compressor should face where the heat is being generated, acting as an intake."
build_path = /obj/item/circuitboard/machine/turbine_compressor
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -84,7 +86,8 @@
/datum/design/board/turbine_rotor
name = "Turbine Rotor Board"
- desc = "The circuit board for a turbine rotor."
+ desc = "Used to build a turbine rotor. One third of the necessary components for a gas turbine. \
+ The rotor should be positioned between the compressor and the stator to effectively transfer energy."
build_path = /obj/item/circuitboard/machine/turbine_rotor
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -93,7 +96,8 @@
/datum/design/board/turbine_stator
name = "Turbine Stator Board"
- desc = "The circuit board for a turbine stator."
+ desc = "Used to build a turbine stator. One third of the necessary components for a gas turbine. \
+ The stator should be positioned after the rotor, acting as an outlet."
build_path = /obj/item/circuitboard/machine/turbine_stator
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -102,7 +106,7 @@
/datum/design/board/thermomachine
name = "Thermomachine Board"
- desc = "The circuit board for a thermomachine."
+ desc = "Used to build a thermomachine. Heats or cools connected gas pipe networks."
build_path = /obj/item/circuitboard/machine/thermomachine
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -111,7 +115,7 @@
/datum/design/board/space_heater
name = "Space Heater Board"
- desc = "The circuit board for a space heater."
+ desc = "Used to build a space heater. Heats or cools the area around it. Power via cell."
build_path = /obj/item/circuitboard/machine/space_heater
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -120,7 +124,8 @@
/datum/design/board/teleport_station
name = "Teleportation Station Board"
- desc = "The circuit board for a teleportation station."
+ desc = "Used to build a teleportation station. Requires a teleporter hub and teleporter control console. \
+ Teleports individuals between connected hubs (or to teleporter beacons) via bluespace."
build_type = IMPRINTER
build_path = /obj/item/circuitboard/machine/teleporter_station
category = list(
@@ -130,7 +135,8 @@
/datum/design/board/teleport_hub
name = "Teleportation Hub Board"
- desc = "The circuit board for a teleportation hub."
+ desc = "Used to build a teleportation hub. Requires a teleporter station and teleporter control console. \
+ Calibrates outgoing teleportation."
build_type = IMPRINTER
build_path = /obj/item/circuitboard/machine/teleporter_hub
category = list(
@@ -140,7 +146,7 @@
/datum/design/board/quantumpad
name = "Quantum Pad Board"
- desc = "The circuit board for a quantum telepad."
+ desc = "Used to build a quantum telepad, a quick method of point-to-point quantum teleportation."
build_type = IMPRINTER
build_path = /obj/item/circuitboard/machine/quantumpad
category = list(
@@ -150,7 +156,7 @@
/datum/design/board/botpad
name = "Bot Launchpad Board"
- desc = "The circuit board for a bot launchpad."
+ desc = "Used to build a bot launchpad, which sends station bots to designated locations."
build_type = IMPRINTER
build_path = /obj/item/circuitboard/machine/botpad
category = list(
@@ -160,7 +166,8 @@
/datum/design/board/launchpad
name = "Bluespace Launchpad Board"
- desc = "The circuit board for a bluespace Launchpad."
+ desc = "Used to build a bluespace Launchpad. Requires a bluespace launchpad control console. \
+ Allows for bluespace teleportation to and from a given point."
build_type = IMPRINTER
build_path = /obj/item/circuitboard/machine/launchpad
category = list(
@@ -170,7 +177,8 @@
/datum/design/board/launchpad_console
name = "Bluespace Launchpad Console Board"
- desc = "The circuit board for a bluespace launchpad Console."
+ desc = "Used to build a bluespace launchpad Console. Required to operate a bluespace launchpad. \
+ Allows for precise targeting of bluespace launchpads."
build_type = IMPRINTER
build_path = /obj/item/circuitboard/computer/launchpad_console
category = list(
@@ -180,7 +188,9 @@
/datum/design/board/modular_shield_gate
name = "Modular Shield Gate Board"
- desc = "The circuit board for a modular shield gate."
+ desc = "Used to build a modular shield gate. A component of modular shields. \
+ The gate can be used to project the shield generated a set distance in a single direction, rather than in all directions. \
+ Can only be operated via signaller or a control console."
build_path = /obj/item/circuitboard/machine/modular_shield_generator/gate
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -189,7 +199,9 @@
/datum/design/board/modular_shield_generator
name = "Modular Shield Generator Board"
- desc = "The circuit board for a modular shield generator."
+ desc = "Used to build a modular shield generator. A component of modular shields. \
+ The core of the shield network - components will not function without being connected to it. \
+ Can be operated via signaller, its control panel, or a control console."
build_path = /obj/item/circuitboard/machine/modular_shield_generator
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -198,7 +210,8 @@
/datum/design/board/modular_shield_node
name = "Modular Shield Node Board"
- desc = "The circuit board for a modular shield node."
+ desc = "Used to build a modular shield node. A component of modular shields. \
+ A purely structural components that can be used to add more components to a shield network."
build_path = /obj/item/circuitboard/machine/modular_shield_node
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -207,7 +220,8 @@
/datum/design/board/modular_shield_cable
name = "Modular Shield Cable Board"
- desc = "The circuit board for a modular shield cable."
+ desc = "Used to build a modular shield cable. A component of modular shields. \
+ A purely structural components used to connect different components of a shield network."
build_path = /obj/item/circuitboard/machine/modular_shield_cable
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -216,7 +230,8 @@
/datum/design/board/modular_shield_relay
name = "Modular Shield Relay Board"
- desc = "The circuit board for a modular shield relay."
+ desc = "Used to build a modular shield relay. A component of modular shields. \
+ Used to expand the radius that which a modular shield can reach - every relay allows the shield to cover a larger and larger area."
build_path = /obj/item/circuitboard/machine/modular_shield_relay
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -225,7 +240,8 @@
/datum/design/board/modular_shield_charger
name = "Modular Shield Charger Board"
- desc = "The circuit board for a modular shield charger."
+ desc = "Used to build a modular shield charger. A component of modular shields. \
+ Used to improve the speed that which the shield regenerates integrity - every charger improves the overall recharge rate of the shield."
build_path = /obj/item/circuitboard/machine/modular_shield_charger
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -234,7 +250,8 @@
/datum/design/board/modular_shield_well
name = "Modular Shield Well Board"
- desc = "The circuit board for a modular shield well."
+ desc = "Used to build a modular shield well. A component of modular shields. \
+ Used to increase the overall integrity of the shield - every well adds more overall strength to the shield."
build_path = /obj/item/circuitboard/machine/modular_shield_well
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -243,7 +260,8 @@
/datum/design/board/modular_shield_console
name = "Modular Shield Console Board"
- desc = "The circuit board for a modular shield console."
+ desc = "Used to build a modular shield console. A component of modular shields. \
+ Allows for the control and management of the shield network."
build_path = /obj/item/circuitboard/computer/modular_shield_console
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -252,7 +270,8 @@
/datum/design/board/teleconsole
name = "Teleporter Console Board"
- desc = "Allows for the construction of circuit boards used to build a teleporter control console."
+ desc = "Used to build a teleporter control console. Requires a teleporter station and teleporter hub. \
+ Allows for control over the teleporter."
build_type = IMPRINTER
build_path = /obj/item/circuitboard/computer/teleporter
category = list(
@@ -262,7 +281,7 @@
/datum/design/board/cryotube
name = "Cryotube Board"
- desc = "The circuit board for a cryotube."
+ desc = "Used to build a cryotube, a machine often used in conjunction with cryoxadone for advanced medical treatments."
build_path = /obj/item/circuitboard/machine/cryo_tube
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL
@@ -271,7 +290,7 @@
/datum/design/board/chem_dispenser
name = "Chem Dispenser Board"
- desc = "The circuit board for a chem dispenser."
+ desc = "Used to build a chem dispenser."
build_path = /obj/item/circuitboard/machine/chem_dispenser
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CHEMISTRY
@@ -280,7 +299,7 @@
/datum/design/board/chem_master
name = "Chem Master Board"
- desc = "The circuit board for a Chem Master 3000."
+ desc = "Used to build a Chem Master 3000, for producing pills, patches, or other chemical products."
build_path = /obj/item/circuitboard/machine/chem_master
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CHEMISTRY
@@ -289,7 +308,7 @@
/datum/design/board/chem_heater
name = "Chemical Heater Board"
- desc = "The circuit board for a chemical heater."
+ desc = "Used to build a chemical heater."
build_path = /obj/item/circuitboard/machine/chem_heater
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CHEMISTRY
@@ -298,7 +317,7 @@
/datum/design/board/chem_mass_spec
name = "High-Performance Liquid Chromatography Machine Board"
- desc = "The circuit board for a High-Performance Liquid Chromatography machine."
+ desc = "Used to build a high-performance liquid chromatography machine."
build_path = /obj/item/circuitboard/machine/chem_mass_spec
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CHEMISTRY
@@ -307,7 +326,7 @@
/datum/design/board/smoke_machine
name = "Smoke Machine Board"
- desc = "The circuit board for a smoke machine."
+ desc = "Used to build a smoke machine."
build_path = /obj/item/circuitboard/machine/smoke_machine
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CHEMISTRY
@@ -316,7 +335,7 @@
/datum/design/board/reagentgrinder
name = "All-In-One Grinder Board"
- desc = "The circuit board for an All-In-One Grinder."
+ desc = "Used to build an All-In-One Grinder."
build_path = /obj/item/circuitboard/machine/reagentgrinder
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CHEMISTRY
@@ -325,7 +344,7 @@
/datum/design/board/hypnochair
name = "Enhanced Interrogation Chamber Board"
- desc = "Allows for the construction of circuit boards used to build an Enhanced Interrogation Chamber."
+ desc = "Used to build an Enhanced Interrogation Chamber, an experimental device that induces a form of hypnosis on its occupants."
build_path = /obj/item/circuitboard/machine/hypnochair
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SECURITY
@@ -334,7 +353,7 @@
/datum/design/board/photobooth
name = "Photobooth Board"
- desc = "The circuit board for a photobooth."
+ desc = "Used to build a photobooth."
build_path = /obj/item/circuitboard/machine/photobooth
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE
@@ -343,7 +362,7 @@
/datum/design/board/security_photobooth
name = "Security Photobooth Board"
- desc = "The circuit board for a security photobooth."
+ desc = "Used to build a security photobooth."
build_path = /obj/item/circuitboard/machine/photobooth/security
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SECURITY
@@ -352,7 +371,7 @@
/datum/design/board/biogenerator
name = "Biogenerator Board"
- desc = "The circuit board for a biogenerator."
+ desc = "Used to build a biogenerator, which uses biological matter to generate useful materials and reagents."
build_path = /obj/item/circuitboard/machine/biogenerator
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_BOTANY
@@ -361,7 +380,7 @@
/datum/design/board/hydroponics
name = "Hydroponics Tray Board"
- desc = "The circuit board for a hydroponics tray."
+ desc = "Used to build a hydroponics tray."
build_path = /obj/item/circuitboard/machine/hydroponics
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_BOTANY
@@ -370,7 +389,7 @@
/datum/design/board/destructive_analyzer
name = "Destructive Analyzer Board"
- desc = "The circuit board for a destructive analyzer."
+ desc = "Used to build a destructive analyzer, allowing R&D to deconstruct objects to unlock new technology."
build_path = /obj/item/circuitboard/machine/destructive_analyzer
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
@@ -379,7 +398,7 @@
/datum/design/board/experimentor
name = "E.X.P.E.R.I-MENTOR Board"
- desc = "The circuit board for an E.X.P.E.R.I-MENTOR."
+ desc = "Used to build an E.X.P.E.R.I-MENTOR, an large machine used to identify strange relics and conduct arcane experiments."
build_path = /obj/item/circuitboard/machine/experimentor
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
@@ -388,7 +407,7 @@
/datum/design/board/circuit_imprinter
name = "Circuit Imprinter Board"
- desc = "The circuit board for a circuit imprinter."
+ desc = "Used to build a circuit imprinter."
build_type = IMPRINTER
build_path = /obj/item/circuitboard/machine/circuit_imprinter
category = list(
@@ -398,7 +417,7 @@
/datum/design/board/circuit_imprinter/offstation
name = "Ancient Circuit Imprinter Board"
- desc = "The circuit board for an ancient circuit imprinter."
+ desc = "Used to build a circuit imprinter."
build_type = AWAY_IMPRINTER
build_path = /obj/item/circuitboard/machine/circuit_imprinter/offstation
category = list(
@@ -408,7 +427,7 @@
/datum/design/board/rdservercontrol
name = "R&D Server Control Console Board"
- desc = "The circuit board for an R&D Server Control Console."
+ desc = "Used to build an R&D server control console, to monitor the status of the station's R&D servers."
build_path = /obj/item/circuitboard/computer/rdservercontrol
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
@@ -417,7 +436,7 @@
/datum/design/board/rdserver
name = "R&D Server Board"
- desc = "The circuit board for an R&D Server."
+ desc = "Used to build an R&D Server. Note that additional R&D servers do not provide additional research progress."
build_path = /obj/item/circuitboard/machine/rdserver
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
@@ -426,7 +445,7 @@
/datum/design/board/mechfab
name = "Exosuit Fabricator Board"
- desc = "The circuit board for an Exosuit Fabricator."
+ desc = "Used to build an exosuit fabricator."
build_path = /obj/item/circuitboard/machine/mechfab
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ROBOTICS
@@ -435,7 +454,7 @@
/datum/design/board/cyborgrecharger
name = "Cyborg Recharger Board"
- desc = "The circuit board for a Cyborg Recharger."
+ desc = "Used to build a cyborg recharger. Can also be used to recharge MODs and even Ethereals."
build_path = /obj/item/circuitboard/machine/cyborgrecharger
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ROBOTICS
@@ -444,7 +463,7 @@
/datum/design/board/mech_recharger
name = "Mechbay Recharger Board"
- desc = "The circuit board for a Mechbay Recharger."
+ desc = "Used to build a mech bay recharger."
build_path = /obj/item/circuitboard/machine/mech_recharger
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ROBOTICS
@@ -453,7 +472,7 @@
/datum/design/board/dnascanner
name = "DNA Scanner Board"
- desc = "The circuit board for a DNA Scanner."
+ desc = "Used to build a DNA scanner, for genetic research. Requires a corresponding DNA scanner console."
build_path = /obj/item/circuitboard/machine/dnascanner
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_GENETICS
@@ -462,7 +481,7 @@
/datum/design/board/dnainfuser
name = "DNA Infuser Board"
- desc = "The circuit board for a DNA Infuser."
+ desc = "Used to build a DNA infuser, for mixing animal DNA and human DNA to create hybrid organisms."
build_path = /obj/item/circuitboard/machine/dna_infuser
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_GENETICS
@@ -471,7 +490,7 @@
/datum/design/board/scan_console
name = "DNA Console Board"
- desc = "Allows for the construction of circuit boards used to build a new DNA console."
+ desc = "Used to build a DNA console, for genetic research. Requires a corresponding DNA scanner."
build_path = /obj/item/circuitboard/computer/scan_consolenew
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_GENETICS
@@ -480,7 +499,7 @@
/datum/design/board/destructive_scanner
name = "Destructive Scanner Board"
- desc = "The circuit board for an experimental destructive scanner."
+ desc = "Used to build an experimental destructive scanner, allowing R&D to deconstruct objects to further their experiments."
build_path = /obj/item/circuitboard/machine/destructive_scanner
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
@@ -489,7 +508,8 @@
/datum/design/board/doppler_array
name = "Tachyon-Doppler Research Array Board"
- desc = "The circuit board for a tachyon-doppler research array"
+ desc = "Used to build a tachyon-doppler research array. Records the strength of explosions in the direction it is pointed. \
+ Often installed in the ordnance testing lab, pointed down range at the test site."
build_path = /obj/item/circuitboard/machine/doppler_array
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
@@ -498,7 +518,7 @@
/datum/design/board/anomaly_refinery
name = "Anomaly Refinery Board"
- desc = "The circuit board for an anomaly refinery"
+ desc = "Used to build an anomaly refinery. Takes raw anomaly cores and transfer tank valves to produce refined anomaly cores."
build_path = /obj/item/circuitboard/machine/anomaly_refinery
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
@@ -507,7 +527,7 @@
/datum/design/board/tank_compressor
name = "Tank Compressor Board"
- desc = "The circuit board for a tank compressor"
+ desc = "Used to build a tank compressor. Compresses any input gas into a canister for scientific experiments."
build_path = /obj/item/circuitboard/machine/tank_compressor
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
@@ -516,7 +536,7 @@
/datum/design/board/microwave
name = "Microwave Board"
- desc = "The circuit board for a microwave."
+ desc = "Used to build a microwave."
build_path = /obj/item/circuitboard/machine/microwave
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_KITCHEN
@@ -525,7 +545,7 @@
/datum/design/board/microwave_engineering
name = "Wireless Microwave Board"
- desc = "The circuit board for a cell-powered microwave."
+ desc = "Used to build a cell-powered microwave."
build_path = /obj/item/circuitboard/machine/microwave/engineering
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_KITCHEN
@@ -534,7 +554,7 @@
/datum/design/board/gibber
name = "Gibber Board"
- desc = "The circuit board for a gibber."
+ desc = "Used to build a gibber."
build_path = /obj/item/circuitboard/machine/gibber
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_KITCHEN
@@ -543,7 +563,7 @@
/datum/design/board/smartfridge
name = "Smartfridge Board"
- desc = "The circuit board for a smartfridge."
+ desc = "Used to build a smartfridge."
build_path = /obj/item/circuitboard/machine/smartfridge
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_KITCHEN
@@ -552,7 +572,7 @@
/datum/design/board/dehydrator
name = "Dehydrator Board"
- desc = "The circuit board for a dehydrator."
+ desc = "Used to build a dehydrator."
build_path = /obj/item/circuitboard/machine/dehydrator
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_KITCHEN
@@ -561,7 +581,7 @@
/datum/design/board/vatgrower
name = "Growing Vat Board"
- desc = "The circuit board for a growing vat."
+ desc = "Used to build a growing vat. Allows for cytologists to grow new organisms."
build_path = /obj/item/circuitboard/machine/vatgrower
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
@@ -570,7 +590,7 @@
/datum/design/board/monkey_recycler
name = "Monkey Recycler Board"
- desc = "The circuit board for a monkey recycler."
+ desc = "Used to build a monkey recycler. Allows for xenobiologists to recycle the \"leftovers\" of slime feeding into new monkeys."
build_path = /obj/item/circuitboard/machine/monkey_recycler
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
@@ -579,7 +599,7 @@
/datum/design/board/seed_extractor
name = "Seed Extractor Board"
- desc = "The circuit board for a seed extractor."
+ desc = "Used to build a seed extractor. Can be fed plants to extract their seeds to replant or store."
build_path = /obj/item/circuitboard/machine/seed_extractor
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_BOTANY
@@ -588,7 +608,7 @@
/datum/design/board/processor
name = "Food/Slime Processor Board"
- desc = "The circuit board for a processing unit. Screwdriver the circuit to switch between food (default) or slime processing."
+ desc = "Used to build a processing unit. Screwdriver the circuit to switch between food (default) or slime processing."
build_path = /obj/item/circuitboard/machine/processor
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_KITCHEN
@@ -597,7 +617,7 @@
/datum/design/board/soda_dispenser
name = "Portable Soda Dispenser Board"
- desc = "The circuit board for a portable soda dispenser."
+ desc = "Used to build a soda dispenser."
build_path = /obj/item/circuitboard/machine/chem_dispenser/drinks
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_BAR
@@ -606,7 +626,7 @@
/datum/design/board/beer_dispenser
name = "Portable Booze Dispenser Board"
- desc = "The circuit board for a portable booze dispenser."
+ desc = "Used to build a booze dispenser."
build_path = /obj/item/circuitboard/machine/chem_dispenser/drinks/beer
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_BAR
@@ -615,7 +635,7 @@
/datum/design/board/recycler
name = "Recycler Board"
- desc = "The circuit board for a recycler."
+ desc = "Used to build a recycler. Tears apart almost all varieties of items, spitting out their base materials."
build_path = /obj/item/circuitboard/machine/recycler
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -624,7 +644,7 @@
/datum/design/board/scanner_gate
name = "Scanner Gate Board"
- desc = "The circuit board for a scanner gate."
+ desc = "Used to build a scanner gate. Analyzes any organism that passes underneath. Can be configured in a number of ways."
build_path = /obj/item/circuitboard/machine/scanner_gate
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL
@@ -632,8 +652,8 @@
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_SECURITY | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_MEDICAL
/datum/design/board/holopad
- name = "AI Holopad Board"
- desc = "The circuit board for a holopad."
+ name = "Holopad Board"
+ desc = "Used to build a holopad. Allows for remote calls to other holopads. Screwdriver the circuit to toggle security mode."
build_path = /obj/item/circuitboard/machine/holopad
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -642,7 +662,7 @@
/datum/design/board/autolathe
name = "Autolathe Board"
- desc = "The circuit board for an autolathe."
+ desc = "Used to build an autolathe. Prints a wide variety of generically useful items."
build_path = /obj/item/circuitboard/machine/autolathe
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_FAB
@@ -651,7 +671,7 @@
/datum/design/board/recharger
name = "Weapon Recharger Board"
- desc = "The circuit board for a Weapon Recharger."
+ desc = "Used to build a weapon recharger. Recharges the cell of anything placed within."
materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold =SHEET_MATERIAL_AMOUNT)
build_path = /obj/item/circuitboard/machine/recharger
category = list(
@@ -661,7 +681,7 @@
/datum/design/board/vendor
name = "Vendor Board"
- desc = "The circuit board for a Vendor."
+ desc = "Used to build a vending machine. Screwdriver the circuit to select the type of vending machine."
build_path = /obj/item/circuitboard/machine/vendor
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE
@@ -670,7 +690,7 @@
/datum/design/board/ore_redemption
name = "Ore Redemption Machine Board"
- desc = "The circuit board for an Ore Redemption machine."
+ desc = "Used to build an ore redemption machine. Smelts raw ores into usable materials."
build_path = /obj/item/circuitboard/machine/ore_redemption
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CARGO
@@ -679,7 +699,7 @@
/datum/design/board/mining_equipment_vendor
name = "Mining Rewards Vendor Board"
- desc = "The circuit board for a Mining Rewards Vendor."
+ desc = "Used to build a mining rewards vendor. Offers a wide variety of equipment to shaft miners in exchange for their mining points."
build_path = /obj/item/circuitboard/computer/order_console/mining
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CARGO
@@ -688,7 +708,7 @@
/datum/design/board/suit_storage_unit
name = "Suit Storage Unit"
- desc = "The circuit board for a suit storage unit."
+ desc = "Used to build a suit storage unit. In addition to storing and organizing EVA suits and related equipment, automatically recharges suit power cells."
build_path = /obj/item/circuitboard/machine/suit_storage_unit
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ROBOTICS
@@ -697,7 +717,7 @@
/datum/design/board/tesla_coil
name = "Tesla Coil Board"
- desc = "The circuit board for a tesla coil."
+ desc = "Used to build a tesla coil. Collects energy from electrical discharges and stores it, releases it into connected cables over time."
build_path = /obj/item/circuitboard/machine/tesla_coil
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -706,7 +726,7 @@
/datum/design/board/grounding_rod
name = "Grounding Rod Board"
- desc = "The circuit board for a grounding rod."
+ desc = "Used to build a grounding rod. Safely directs electrical discharges into the ground."
build_path = /obj/item/circuitboard/machine/grounding_rod
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -715,7 +735,7 @@
/datum/design/board/ntnet_relay
name = "NTNet Relay Board"
- desc = "The circuit board for a wireless network relay."
+ desc = "Used to build a wireless network relay. Extends the range of NTNet communications."
build_path = /obj/item/circuitboard/machine/ntnet_relay
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELECOMMS
@@ -724,7 +744,7 @@
/datum/design/board/crossing_signal
name = "Crossing Signal Board"
- desc = "The circuit board for a tram crossing signal."
+ desc = "Used to build a tram crossing signal. Warns for approaching trams. Requires a guideway sensor."
build_path = /obj/item/circuitboard/machine/crossing_signal
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELECOMMS
@@ -733,7 +753,7 @@
/datum/design/board/guideway_sensor
name = "Guideway Sensor Board"
- desc = "The circuit board for a tram proximity sensor."
+ desc = "Used to build a tram proximity sensor. Detects oncoming trams and triggers appropriate signals."
build_path = /obj/item/circuitboard/machine/guideway_sensor
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELECOMMS
@@ -742,7 +762,7 @@
/datum/design/board/limbgrower
name = "Limb Grower Board"
- desc = "The circuit board for a limb grower."
+ desc = "Used to build a limb grower. Creates replacement organic limbs."
build_path = /obj/item/circuitboard/machine/limbgrower
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL
@@ -751,7 +771,7 @@
/datum/design/board/harvester
name = "Organ Harvester Board"
- desc = "The circuit board for an organ harvester."
+ desc = "Used to build an organ harvester."
build_path = /obj/item/circuitboard/machine/harvester
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL
@@ -760,7 +780,7 @@
/datum/design/board/deepfryer
name = "Deep Fryer Board"
- desc = "The circuit board for a Deep Fryer."
+ desc = "Used to build a deep fryer."
build_path = /obj/item/circuitboard/machine/deep_fryer
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_KITCHEN
@@ -769,7 +789,7 @@
/datum/design/board/griddle
name = "Griddle Board"
- desc = "The circuit board for a Griddle."
+ desc = "Used to build a griddle."
build_path = /obj/item/circuitboard/machine/griddle
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_KITCHEN
@@ -778,7 +798,7 @@
/datum/design/board/oven
name = "Oven Board"
- desc = "The circuit board for a Oven."
+ desc = "Used to build an oven."
build_path = /obj/item/circuitboard/machine/oven
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_KITCHEN
@@ -787,7 +807,7 @@
/datum/design/board/stove
name = "Stove Board"
- desc = "The circuit board for a Stove."
+ desc = "Used to build a stove."
build_path = /obj/item/circuitboard/machine/stove
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_KITCHEN
@@ -796,7 +816,7 @@
/datum/design/board/range
name = "Range Board"
- desc = "The circuit board for a Range, which is both an Oven and a Stove."
+ desc = "Used to build a range, which is both an oven and a stove."
build_path = /obj/item/circuitboard/machine/range
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_KITCHEN
@@ -805,7 +825,7 @@
/datum/design/board/cell_charger
name = "Cell Charger Board"
- desc = "The circuit board for a cell charger."
+ desc = "Used to build a cell charger."
build_path = /obj/item/circuitboard/machine/cell_charger
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -814,7 +834,7 @@
/datum/design/board/dish_drive
name = "Dish Drive Board"
- desc = "The circuit board for a dish drive."
+ desc = "Used to build a dish drive. Collects nearby empty dishes."
build_path = /obj/item/circuitboard/machine/dish_drive
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_KITCHEN
@@ -823,7 +843,7 @@
/datum/design/board/stacking_unit_console
name = "Stacking Machine Console Board"
- desc = "The circuit board for a Stacking Machine Console."
+ desc = "Used to build a stacking machine console. Controls a stacking machine."
build_path = /obj/item/circuitboard/machine/stacking_unit_console
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CARGO
@@ -832,7 +852,7 @@
/datum/design/board/stacking_machine
name = "Stacking Machine Board"
- desc = "The circuit board for a Stacking Machine."
+ desc = "Used to build a stacking machine. Collects nearby materials and dispenses it in the ore silo."
build_path = /obj/item/circuitboard/machine/stacking_machine
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CARGO
@@ -841,7 +861,7 @@
/datum/design/board/ore_silo
name = "Ore Silo Board"
- desc = "The circuit board for an ore silo."
+ desc = "Used to build an ore silo. Stores collected materials for use across the station."
build_path = /obj/item/circuitboard/machine/ore_silo
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CARGO
@@ -850,7 +870,7 @@
/datum/design/board/fat_sucker
name = "Lipid Extractor Board"
- desc = "The circuit board for a lipid extractor."
+ desc = "Used to build a lipid extractor. Removes excess fat from individuals."
build_path = /obj/item/circuitboard/machine/fat_sucker
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE
@@ -859,7 +879,7 @@
/datum/design/board/stasis
name = "Lifeform Stasis Unit Board"
- desc = "The circuit board for a stasis unit."
+ desc = "Used to build a stasis unit."
build_path = /obj/item/circuitboard/machine/stasis
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL
@@ -868,7 +888,7 @@
/datum/design/board/medical_kiosk
name = "Medical Kiosk Board"
- desc = "The circuit board for a Medical Kiosk."
+ desc = "Used to build a medical kiosk."
build_path = /obj/item/circuitboard/machine/medical_kiosk
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL
@@ -877,7 +897,7 @@
/datum/design/board/medipen_refiller
name = "Medipen Refiller Board"
- desc = "The circuit board for a Medipen Refiller."
+ desc = "Used to build a medipen refiller."
build_path = /obj/item/circuitboard/machine/medipen_refiller
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL
@@ -886,7 +906,7 @@
/datum/design/board/plumbing_receiver
name = "Chemical Recipient Board"
- desc = "The circuit board for a Chemical Recipient."
+ desc = "Used to build a chemical recipient. Connects to plumbing networks and uses bluespace to teleport chemicals long distances."
build_path = /obj/item/circuitboard/machine/plumbing_receiver
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CHEMISTRY
@@ -895,7 +915,7 @@
/datum/design/board/sheetifier
name = "Sheet-meister 2000 Board"
- desc = "The circuit board for a Sheet-meister 2000."
+ desc = "Used to build a Sheet-meister 2000, which transforms certain objects into construction-viable sheets of material."
build_path = /obj/item/circuitboard/machine/sheetifier
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_FAB
@@ -904,7 +924,7 @@
/datum/design/board/restaurant_portal
name = "Restaurant Portal Board"
- desc = "The circuit board for a restaurant portal"
+ desc = "Used to build a restaurant portal, which transports tourists to and from the station."
build_path = /obj/item/circuitboard/machine/restaurant_portal
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_KITCHEN
@@ -913,7 +933,7 @@
/datum/design/board/bountypad
name = "Civilian Bounty Pad Board"
- desc = "The circuit board for a Civilian Bounty Pad."
+ desc = "Used to build a civilian bounty pad to send bounty components. Requires a civilian bounty pad console."
build_path = /obj/item/circuitboard/machine/bountypad
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CARGO
@@ -922,7 +942,7 @@
/datum/design/board/skill_station
name = "Skill Station Board"
- desc = "The circuit board for Skill station."
+ desc = "Used to build a skill station, for interfacing with skillchips."
build_path = /obj/item/circuitboard/machine/skill_station
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE
@@ -931,7 +951,7 @@
/datum/design/board/fax
name = "Fax Machine Board"
- desc = "The circuit board for a fax machine."
+ desc = "Used to build a a fax machine."
build_path = /obj/item/circuitboard/machine/fax
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE
@@ -942,7 +962,7 @@
/datum/design/board/HFR_core
name = "HFR Core Board"
- desc = "The circuit board for an HFR Core."
+ desc = "Used to build the core of the hypertorus fusion reactor."
build_path = /obj/item/circuitboard/machine/HFR_core
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -951,7 +971,7 @@
/datum/design/board/HFR_fuel_input
name = "HFR Fuel Input Board"
- desc = "The circuit board for an HFR fuel input."
+ desc = "Used to build the fuel input of the hypertorus fusion reactor."
build_path = /obj/item/circuitboard/machine/HFR_fuel_input
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -960,7 +980,7 @@
/datum/design/board/HFR_waste_output
name = "HFR Waste Output Board"
- desc = "The circuit board for an HFR waste output."
+ desc = "Used to build the waste output of the hypertorus fusion reactor."
build_path = /obj/item/circuitboard/machine/HFR_waste_output
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -969,7 +989,7 @@
/datum/design/board/HFR_moderator_input
name = "HFR Moderator Input Board"
- desc = "The circuit board for an HFR moderator input."
+ desc = "Used to build the moderator input of the hypertorus fusion reactor."
build_path = /obj/item/circuitboard/machine/HFR_moderator_input
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -978,7 +998,7 @@
/datum/design/board/HFR_corner
name = "HFR Corner Board"
- desc = "The circuit board for an HFR corner."
+ desc = "Used to build a corner of the hypertorus fusion reactor."
build_path = /obj/item/circuitboard/machine/HFR_corner
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -987,7 +1007,7 @@
/datum/design/board/HFR_interface
name = "HFR Interface Board"
- desc = "The circuit board for an HFR interface."
+ desc = "Used to build the interface of the hypertorus fusion reactor."
build_path = /obj/item/circuitboard/machine/HFR_interface
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -996,7 +1016,7 @@
/datum/design/board/crystallizer
name = "Crystallizer Board"
- desc = "The circuit board for a crystallizer."
+ desc = "Used to build a crystallizer, which atmospherics uses to condense gases into solid form."
build_path = /obj/item/circuitboard/machine/crystallizer
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -1005,7 +1025,7 @@
/datum/design/board/exoscanner
name = "Scanner Array Board"
- desc = "The circuit board for scanner array."
+ desc = "Used to build a scanner array. Exodrone operators use these to expand the range of their scanning capabilities."
build_path = /obj/item/circuitboard/machine/exoscanner
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
@@ -1014,7 +1034,7 @@
/datum/design/board/exodrone_launcher
name = "Exploration Drone Launcher Board"
- desc = "The circuit board for exodrone launcher."
+ desc = "Used to build an exodrone launcher. Exodrone operators use these to deploy their exploration drones."
build_path = /obj/item/circuitboard/machine/exodrone_launcher
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
@@ -1023,7 +1043,7 @@
/datum/design/board/component_printer
name = "Component Printer Board"
- desc = "The circuit board for a component printer"
+ desc = "Used to build a component printer. Prints circuit components."
build_path = /obj/item/circuitboard/machine/component_printer
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
@@ -1032,7 +1052,7 @@
/datum/design/board/module_printer
name = "Module Duplicator Board"
- desc = "The circuit board for a module duplicator"
+ desc = "Used to build a module duplicator. Copies circuits."
build_path = /obj/item/circuitboard/machine/module_duplicator
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
@@ -1041,7 +1061,7 @@
/datum/design/board/coffeemaker
name = "Coffeemaker Board"
- desc = "The circuit board for a coffeemaker."
+ desc = "Used to build a coffeemaker."
build_path = /obj/item/circuitboard/machine/coffeemaker
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE
@@ -1050,7 +1070,7 @@
/datum/design/board/navbeacon
name = "Bot Navigational Beacon Board"
- desc = "The circuit board for a beacon that aids bot navigation."
+ desc = "Used to build a beacon that aids bot navigation."
build_path = /obj/item/circuitboard/machine/navbeacon
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ROBOTICS
@@ -1059,7 +1079,7 @@
/datum/design/board/fishing_portal_generator
name = "Fishing Portal Generator Board"
- desc = "The circuit board for the fishing portal generator"
+ desc = "Used to build a fishing portal generator, allowing for remote fishing capabilities."
build_path = /obj/item/circuitboard/machine/fishing_portal_generator
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE
@@ -1068,6 +1088,7 @@
/datum/design/board/brm
name = "Boulder Retrieval Matrix Board"
+ desc = "Used to build a boulder retrieval matrix. Teleports newly harvested boulders from down below straight to the station for processing."
materials = list(
/datum/material/glass = SHEET_MATERIAL_AMOUNT,
)
@@ -1080,7 +1101,7 @@
/datum/design/board/flatpacker
name = "Flatpacker Machine Board"
- desc = "The circuit board for a Flatpacker."
+ desc = "Used to build a flatpacker, allowing for significantly faster machine assembly and deployment."
build_path = /obj/item/circuitboard/machine/flatpacker
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -1089,16 +1110,34 @@
/datum/design/board/scrubber
name = "Portable Air Scrubber Board"
- desc = "The circuit board for a portable air scrubber."
+ desc = "Used to build a portable air scrubber."
build_path = /obj/item/circuitboard/machine/scrubber
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
)
departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING
+/datum/design/board/bluespace_scrubber
+ name = "Portable Bluespace Scrubber Board"
+ desc = "The circuit board for a portable bluespace scrubber."
+ build_path = /obj/item/circuitboard/machine/bluespace_scrubber
+ category = list(
+ RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING
+
+/datum/design/board/gas_receiver
+ name = "Gas Receiver Board"
+ desc = "The circuit board for a gas receiver."
+ build_path = /obj/item/circuitboard/machine/gas_receiver
+ category = list(
+ RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING
+
/datum/design/board/pump
name = "Portable Air Pump Board"
- desc = "The circuit board for a portable air pump."
+ desc = "Used to build a portable air pump."
build_path = /obj/item/circuitboard/machine/pump
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -1107,7 +1146,7 @@
/datum/design/board/pipe_scrubber
name = "Portable Pipe Scrubber Board"
- desc = "The circuit board for a portable pipe scrubber."
+ desc = "Used to build a portable pipe scrubber."
build_path = /obj/item/circuitboard/machine/pipe_scrubber
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -1116,7 +1155,7 @@
/datum/design/board/bookbinder
name = "Book Binder"
- desc = "The circuit board for a book binder"
+ desc = "Used to build a book binder."
build_path = /obj/item/circuitboard/machine/bookbinder
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE
@@ -1125,7 +1164,7 @@
/datum/design/board/libraryscanner
name = "Book Scanner"
- desc = "The circuit board for a book scanner"
+ desc = "Used to build a book scanner."
build_path = /obj/item/circuitboard/machine/libraryscanner
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE
@@ -1134,7 +1173,7 @@
/datum/design/board/big_manipulator
name = "Big Manipulator Board"
- desc = "The circuit board for a big manipulator."
+ desc = "Used to build a manipulator, capable of doing countless different interactions with various objects."
build_path = /obj/item/circuitboard/machine/big_manipulator
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -1143,7 +1182,7 @@
/datum/design/board/manulathe
name = "Manufacturing Lathe Board"
- desc = "The circuit board for this machine."
+ desc = "Used to build a manufacturing lathe. Allows for automatic fabrication of certain recipes."
build_path = /obj/item/circuitboard/machine/manulathe
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -1152,7 +1191,7 @@
/datum/design/board/manucrafter
name = "Manufacturing Assembling Machine Board"
- desc = "The circuit board for this machine."
+ desc = "Used to build a manufacturing assembling machine. Allows for automatic assembly of certain recipes."
build_path = /obj/item/circuitboard/machine/manucrafter
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -1161,7 +1200,7 @@
/datum/design/board/manucrusher
name = "Manufacturing Crusher Board"
- desc = "The circuit board for this machine."
+ desc = "Used to build a manufacturing crusher. Automatically crushes anything that enters it, such as boulders."
build_path = /obj/item/circuitboard/machine/manucrusher
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -1170,7 +1209,7 @@
/datum/design/board/manurouter
name = "Manufacturing Router Board"
- desc = "The circuit board for this machine."
+ desc = "Used to build a manufacturing router, best used with conveyor systems to divide an input across multiple outputs."
build_path = /obj/item/circuitboard/machine/manurouter
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -1178,8 +1217,8 @@
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_CARGO
/datum/design/board/manusorter
- name = "Conveyor Sort-Router Board"
- desc = "The circuit board for this machine."
+ name = "Manufacturing Sort-Router Board"
+ desc = "Used to build a manufacturing sort-router, best used with conveyor systems to direct certain inputs to specific outputs."
build_path = /obj/item/circuitboard/machine/manusorter
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -1188,7 +1227,7 @@
/datum/design/board/manuunloader
name = "Manufacturing Crate Unloader Board"
- desc = "The circuit board for this machine."
+ desc = "Used to build a manufacturing crate unloader, which takes in crates or boxes, and automatically extracts its contents."
build_path = /obj/item/circuitboard/machine/manuunloader
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -1197,7 +1236,7 @@
/datum/design/board/manusmelter
name = "Manufacturing Smelter Board"
- desc = "The circuit board for this machine."
+ desc = "Used to build a manufacturing smelter, which incinerates any input materials to produce refined outputs."
build_path = /obj/item/circuitboard/machine/manusmelter
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
@@ -1206,7 +1245,7 @@
/datum/design/board/mailsorter
name = "Mail Sorter Board"
- desc = "The circuit board for a mail sorting unit."
+ desc = "Used to build a mail sorter, which stores mail and automatically sorts it by department or recipient."
build_path = /obj/item/circuitboard/machine/mailsorter
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CARGO
@@ -1215,7 +1254,7 @@
/datum/design/board/propulsion_engine
name = "Propulsion Engine Board"
- desc = "The circuit for a propulsion engine."
+ desc = "Used to build a propulsion engine for a shuttle."
build_path = /obj/item/circuitboard/machine/engine/propulsion
build_type = IMPRINTER
category = list(
@@ -1224,8 +1263,8 @@
departmental_flags = DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING
/datum/design/board/photopcopier
- name = "Photocopier"
- desc = "The circuit for a photocopier."
+ name = "Photocopier Board"
+ desc = "Used to build a photocopier."
build_path = /obj/item/circuitboard/machine/photocopier
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE
@@ -1234,7 +1273,7 @@
/datum/design/board/atmosshieldgen
name = "Atmospherics Shield Generator Board"
- desc = "The circuit board for an atmospherics shield generator."
+ desc = "Used to build an atmospherics shield generator, which uses power to stop air from passing through."
build_path = /obj/item/circuitboard/machine/atmos_shield_gen
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS
@@ -1243,7 +1282,7 @@
/datum/design/board/netpod
name = "Netpod Board"
- desc = "The circuit board for a netpod."
+ desc = "Used to build a netpod, which Bitrunners enter to access their virtual domains."
build_path = /obj/item/circuitboard/machine/netpod
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CARGO
@@ -1252,7 +1291,7 @@
/datum/design/board/byteforge
name = "Byteforge Board"
- desc = "Allows for the construction of circuit boards used to build a Byteforge."
+ desc = "Used to build a Byteforge, which synthesizes resources and other rewards earned by Bitrunners."
build_path = /obj/item/circuitboard/machine/byteforge
category = list(
RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_CARGO
@@ -1260,8 +1299,8 @@
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING
/datum/design/board/washing_machine
- name = "Washing Machine"
- desc = "The circuit board to build a washing machine."
+ name = "Washing Machine Board"
+ desc = "Used to build a washing machine."
build_path = /obj/item/circuitboard/machine/washing_machine
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 80d474a706e0..8329a88fe35f 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -1636,7 +1636,7 @@
/datum/material/glass =SMALL_MATERIAL_AMOUNT*5,
)
construction_time = 7.5 SECONDS
- build_path = /obj/item/mmi
+ build_path = /obj/item/brain_processor/organic
category = list(
RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CONTROL_INTERFACES
)
@@ -1659,7 +1659,7 @@
/datum/material/gold =SMALL_MATERIAL_AMOUNT*5
)
construction_time = 7.5 SECONDS
- build_path = /obj/item/mmi/posibrain
+ build_path = /obj/item/brain_processor/positronic
category = list(
RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CONTROL_INTERFACES
)
@@ -2545,7 +2545,7 @@
/datum/material/gold =SMALL_MATERIAL_AMOUNT * 2.5
)
construction_time = 7.5 SECONDS
- build_path = /obj/item/mmi/posibrain/sphere
+ build_path = /obj/item/brain_processor/positronic/sphere
category = list(
RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CONTROL_INTERFACES
)
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 7ec06f46123e..a15e10fd196b 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -185,6 +185,17 @@
)
departmental_flags = DEPARTMENT_BITFLAG_MEDICAL
+/datum/design/defibrillator
+ name = "Defibrillator"
+ desc = "A portable defibrillator, used for resuscitating recently deceased crew."
+ build_type = PROTOLATHE | AWAY_LATHE
+ build_path = /obj/item/defibrillator
+ materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*4, /datum/material/glass = SHEET_MATERIAL_AMOUNT*2, /datum/material/silver =SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/gold = SHEET_MATERIAL_AMOUNT * 1.5)
+ category = list(
+ RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_MEDICAL
+
/datum/design/defibrillator_mount
name = "Defibrillator Wall Mount"
desc = "A mounted frame for holding defibrillators, providing easy security."
@@ -207,6 +218,17 @@
)
departmental_flags = DEPARTMENT_BITFLAG_MEDICAL
+/datum/design/defibrillator_compact
+ name = "Compact Defibrillator"
+ desc = "A compact defibrillator that can be worn on a belt."
+ build_type = PROTOLATHE | AWAY_LATHE
+ build_path = /obj/item/defibrillator/compact
+ materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*6, /datum/material/glass = SHEET_MATERIAL_AMOUNT*4, /datum/material/silver = SHEET_MATERIAL_AMOUNT*3, /datum/material/gold =SHEET_MATERIAL_AMOUNT * 1.5)
+ category = list(
+ RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_MEDICAL
+
/datum/design/genescanner
name = "Genetic Sequence Analyzer"
desc = "A handy hand-held analyzers for quickly determining mutations and collecting the full sequence."
@@ -1099,6 +1121,23 @@
name = "Cybernetic Moth Eyes"
build_path = /obj/item/organ/eyes/robotic/moth
+/datum/design/cybernetic_fangs
+ name = "Cybernetic Fangs"
+ desc = "A set of plastitanium fangs. For when you want to bite through a ship hull."
+ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
+ construction_time = 3 SECONDS
+ materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.25, /datum/material/plasma = SHEET_MATERIAL_AMOUNT * 0.5, /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 0.5)
+ build_path = /obj/item/organ/fangs/cybernetic
+ category = list(
+ RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_COMBAT
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_MEDICAL
+
+/datum/design/cybernetic_fangs/cat
+ name = "Cybernetic Cat Fangs"
+ desc = "A set of plastitanium fangs. For when you want to nom through a ship hull."
+ build_path = /obj/item/organ/fangs/cat/cybernetic
+
/datum/design/cyberimp_welding
name = "Welding Shield Eyes"
desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision."
diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm
index 2c721f8ce4f1..8671d1a7be73 100644
--- a/code/modules/research/designs/mining_designs.dm
+++ b/code/modules/research/designs/mining_designs.dm
@@ -4,7 +4,7 @@
/////////////////////////////////////////
/datum/design/cargo_express
name = "Express Supply Console Board"//shes beautiful
- desc = "Allows for the construction of circuit boards used to build an Express Supply Console."//who?
+ desc = "Used to build an express supply console, a method of ordering supplies from Central Command without the use of the slow supply shuttle."//who?
build_type = IMPRINTER
materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT)
build_path = /obj/item/circuitboard/computer/cargo/express
@@ -15,7 +15,7 @@
/datum/design/bluespace_pod
name = "Express Supply Drop Pod Upgrade Disk"
- desc = "Allows the Cargo Express Console to call down the Bluespace Drop Pod, greatly increasing user safety."//who?
+ desc = "Allows an express supply console to call down the bluespace drop pod, greatly increasing user safety."
build_type = PROTOLATHE
materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT)
build_path = /obj/item/disk/cargo/bluespace_pod
diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm
index feb48852e41d..585f2b6d8796 100644
--- a/code/modules/research/designs/misc_designs.dm
+++ b/code/modules/research/designs/misc_designs.dm
@@ -342,7 +342,7 @@
/datum/design/quantum_keycard
name = "Quantum Keycard"
- desc = "Allows for the construction of a quantum keycard."
+ desc = "Used to link quantum pads."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/silver =SMALL_MATERIAL_AMOUNT*5, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT)
build_path = /obj/item/quantum_keycard
@@ -353,7 +353,7 @@
/datum/design/botpad_remote
name = "Bot Launchpad Controller"
- desc = "Allows you to control the connected bot launchpad"
+ desc = "Allows you to control a connected bot launchpad."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/iron =SMALL_MATERIAL_AMOUNT*5)
build_path = /obj/item/botpad_remote
@@ -364,7 +364,8 @@
/datum/design/anomaly_neutralizer
name = "Anomaly Neutralizer"
- desc = "An advanced tool capable of instantly neutralizing anomalies, designed to capture the fleeting aberrations created by the engine."
+ desc = "An advanced tool capable of instantly neutralizing anomalies, designed to capture the fleeting aberrations created by the engine. \
+ Also capable of stabilizing rifts in reality caused by Heretics or Wizards."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT, /datum/material/gold =SHEET_MATERIAL_AMOUNT, /datum/material/plasma =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/uranium =SHEET_MATERIAL_AMOUNT)
build_path = /obj/item/anomaly_neutralizer
@@ -1132,3 +1133,14 @@
RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE
)
departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE
+
+/datum/design/producepad
+ name = "Producepad"
+ desc = "This lightweight contraption acts as a beacon for produceporters, teleporting freshly grown food to this location."
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3)
+ build_path = /obj/item/producepad
+ category = list(
+ RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_SECURITY
diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm
index 2efea91a9f40..58b9b04e7ddb 100644
--- a/code/modules/research/designs/power_designs.dm
+++ b/code/modules/research/designs/power_designs.dm
@@ -142,13 +142,22 @@
/datum/design/board/pacman
name = "PACMAN Board"
- desc = "The circuit board for a PACMAN-type portable generator."
+ desc = "Used to build a PACMAN-type portable generator. Consumes plasma to generate a moderate amount of power."
build_path = /obj/item/circuitboard/machine/pacman
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
)
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING
+/datum/design/board/plankman
+ name = "PLANKMAN Board"
+ desc = "The circuit board for a PLANKMAN-type portable generator."
+ build_path = /obj/item/circuitboard/machine/plankman
+ category = list(
+ RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING
+
/datum/design/bioelec_gen
name = "Aquarium Bioelectricity Kit"
desc = "The required components to convert an aquarium into a bioelectricity generator."
@@ -198,7 +207,7 @@
/datum/design/diode_disk_stamina
name = "Electrodisruptive Diode Disk"
- desc = "A stamina damaging and supermatter crystal healing Diode Disk."
+ desc = "A stamina damaging and supermatter crystal healing diode disk. Should be placed within an emitter."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass =SMALL_MATERIAL_AMOUNT, /datum/material/gold =SMALL_MATERIAL_AMOUNT)
construction_time = 0.5 SECONDS
@@ -210,7 +219,7 @@
/datum/design/diode_disk_healing
name = "Bioregenerative Diode Disk"
- desc = "A living creature healing Diode Disk."
+ desc = "A living creature healing diode disk. Should be placed within an emitter."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass =SMALL_MATERIAL_AMOUNT, /datum/material/silver =SMALL_MATERIAL_AMOUNT) //silver is medical metal. Why? who knows.
construction_time = 0.5 SECONDS
@@ -222,7 +231,7 @@
/datum/design/diode_disk_incendiary
name = "Conflagratory Diode Disk"
- desc = "A high energy incendiary Diode Disk."
+ desc = "A high energy incendiary diode disk. Should be placed within an emitter."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass =SMALL_MATERIAL_AMOUNT, /datum/material/diamond =SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/plasma =SMALL_MATERIAL_AMOUNT * 2)
construction_time = 0.5 SECONDS
@@ -234,7 +243,7 @@
/datum/design/diode_disk_sanity
name = "Psychosiphoning Diode Disk"
- desc = "An supermatter comforting creature depressing Diode Disk."
+ desc = "An supermatter comforting creature depressing diode disk. Should be placed within an emitter."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass =SMALL_MATERIAL_AMOUNT, /datum/material/uranium =SMALL_MATERIAL_AMOUNT * 0.5) //Uranium, the metal of love and warmth (from decay heat).
construction_time = 0.5 SECONDS
@@ -246,7 +255,7 @@
/datum/design/diode_disk_magnetic
name = "Magnetogenerative Diode Disk"
- desc = "A mol absorbing item attracting Diode Disk."
+ desc = "A mol absorbing item attracting diode disk. Should be placed within an emitter."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass =SMALL_MATERIAL_AMOUNT, /datum/material/titanium =SMALL_MATERIAL_AMOUNT * 0.5)
construction_time = 0.5 SECONDS
diff --git a/code/modules/research/designs/telecomms_designs.dm b/code/modules/research/designs/telecomms_designs.dm
index 3709890fb9e7..88c9a0593ec5 100644
--- a/code/modules/research/designs/telecomms_designs.dm
+++ b/code/modules/research/designs/telecomms_designs.dm
@@ -4,7 +4,9 @@
/datum/design/board/subspace_receiver
name = "Subspace Receiver Board"
- desc = "Allows for the construction of Subspace Receiver equipment."
+ desc = "Used to build a subspace receiver, an element of telecommunications. The \"input\" of a telecomms network, \
+ the receiver captures compressed subspace signals directly from the source (such as radio headsets). \
+ They typically link to a telecommunication hub, or directly to processors."
build_path = /obj/item/circuitboard/machine/telecomms/receiver
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELECOMMS
@@ -13,7 +15,9 @@
/datum/design/board/telecomms_bus
name = "Bus Mainframe Board"
- desc = "Allows for the construction of Telecommunications Bus Mainframes."
+ desc = "Used to build a telecommunications bus mainframe, an element of telecommunications. \
+ Generally acts as a junction between components, transferring ingoing packets to processors or outgoing packets to servers. \
+ In the absence of a server, can be linked directly to hubs and broadcasters, at the cost of latency."
build_path = /obj/item/circuitboard/machine/telecomms/bus
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELECOMMS
@@ -22,7 +26,8 @@
/datum/design/board/telecomms_hub
name = "Hub Mainframe Board"
- desc = "Allows for the construction of Telecommunications Hub Mainframes."
+ desc = "Used to build a telecommunications hub mainframe, an element of telecommunications. \
+ Acts as a central point for connecting various components, managing the flow of data between receivers, processors, and servers."
build_path = /obj/item/circuitboard/machine/telecomms/hub
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELECOMMS
@@ -31,7 +36,8 @@
/datum/design/board/telecomms_relay
name = "Relay Mainframe Board"
- desc = "Allows for the construction of Telecommunications Relay Mainframes."
+ desc = "Used to build a telecommunications relay mainframe, an element of telecommunications. \
+ Relays are used to extend the range across massive distances, such as between the station and lavaland or deep space."
build_path = /obj/item/circuitboard/machine/telecomms/relay
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELECOMMS
@@ -40,7 +46,9 @@
/datum/design/board/telecomms_processor
name = "Processor Unit Board"
- desc = "Allows for the construction of Telecommunications Processor equipment."
+ desc = "Used to build a telecommunications processor unit, an element of telecommunications. \
+ Decompresses subspace packets and returns it to whichever bus it originated from - an essential step in producing legible communications. \
+ Typically connected to the server, but can be linked directly to a bus if necessary."
build_path = /obj/item/circuitboard/machine/telecomms/processor
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELECOMMS
@@ -49,7 +57,8 @@
/datum/design/board/telecomms_server
name = "Server Mainframe Board"
- desc = "Allows for the construction of Telecommunications Servers."
+ desc = "Used to build a telecommunications server mainframe, an element of telecommunications. \
+ Logs and stores outgoing subspace communications, then forwards it to the subspace broadcaster."
build_path = /obj/item/circuitboard/machine/telecomms/server
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELECOMMS
@@ -58,7 +67,8 @@
/datum/design/board/telecomms_messaging
name = "Messaging Server Board"
- desc = "Allows for the construction of Telecommunications Messaging Servers."
+ desc = "Used to build a telecommunications messaging server, an element of telecommunications. \
+ Logs and stores outgoing PDA and request console messages."
build_path = /obj/item/circuitboard/machine/telecomms/message_server
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELECOMMS
@@ -67,7 +77,9 @@
/datum/design/board/subspace_broadcaster
name = "Subspace Broadcaster Board"
- desc = "Allows for the construction of Subspace Broadcasting equipment."
+ desc = "Used to build subspace broadcasting equipment, an element of telecommunications. The \"output\" of a telecomms network, \
+ the broadcaster transmits outgoing subspace communications to recipients (such as radio headsets). \
+ They are typically linked to servers."
build_path = /obj/item/circuitboard/machine/telecomms/broadcaster
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELECOMMS
diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm
index 390e7b7ee37a..ed290190c6b9 100644
--- a/code/modules/research/designs/tool_designs.dm
+++ b/code/modules/research/designs/tool_designs.dm
@@ -15,7 +15,7 @@
/datum/design/handdrill
name = "Hand Drill"
- desc = "A small electric hand drill with an interchangeable screwdriver and bolt bit"
+ desc = "A small electric hand drill with an interchangeable screwdriver and bolt bit."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT*1.75, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/titanium =SHEET_MATERIAL_AMOUNT*1.25)
build_path = /obj/item/screwdriver/power
@@ -26,7 +26,7 @@
/datum/design/jawsoflife
name = "Jaws of Life"
- desc = "A small, compact Jaws of Life with an interchangeable pry jaws and cutting jaws"
+ desc = "A small, compact Jaws of Life with an interchangeable pry jaws and cutting jaws."
build_path = /obj/item/crowbar/power
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT*2.25, /datum/material/silver =SHEET_MATERIAL_AMOUNT*1.25, /datum/material/titanium =SHEET_MATERIAL_AMOUNT*1.75)
@@ -47,8 +47,8 @@
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING
/datum/design/rangedanalyzer
- name = "Experimental Long-range Gas Analyzer"
- desc = "An experimental gas analyzer capable of operating at long distance"
+ name = "Long-range Gas Analyzer"
+ desc = "An gas analyzer capable of operating at long distance."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT, /datum/material/glass =SMALL_MATERIAL_AMOUNT*0.2, /datum/material/gold =SMALL_MATERIAL_AMOUNT * 3, /datum/material/bluespace=SMALL_MATERIAL_AMOUNT * 2)
build_path = /obj/item/analyzer/ranged
@@ -59,6 +59,7 @@
/datum/design/rpd
name = "Rapid Pipe Dispenser (RPD)"
+ desc = "A tool that can rapidly dispense or disperse any variety of pipe."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT*37.5, /datum/material/glass =SHEET_MATERIAL_AMOUNT*18.75)
build_path = /obj/item/pipe_dispenser
@@ -68,7 +69,7 @@
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING
/datum/design/rcd_loaded
- name = "Rapid Construction Device"
+ name = "Rapid Construction Device (RCD)"
desc = "A tool that can construct and deconstruct walls, airlocks and floors on the fly."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 30, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 15)
@@ -82,8 +83,8 @@
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING
/datum/design/rtd_loaded
- name = "Rapid Tiling Device"
- desc = "A tool that can lay & destroy floor tiles on the fly."
+ name = "Rapid Tiling Device (RTD)"
+ desc = "A tool that can lay or destroy floor tiles on the fly."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 15, /datum/material/glass =SHEET_MATERIAL_AMOUNT*1.25)
build_path = /obj/item/construction/rtd/loaded
@@ -94,6 +95,7 @@
/datum/design/rcd_ammo
name = "RCD Matter Cartridge"
+ desc = "A more compact and efficient method of reloading the RCD with new matter."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT * 6, /datum/material/glass= SHEET_MATERIAL_AMOUNT * 3)
build_path = /obj/item/rcd_ammo
@@ -228,6 +230,7 @@
/datum/design/biopsy_tool
name = "Biopsy Tool"
+ desc = "A tool used to extract tissue samples from organisms for cytological use."
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT*2, /datum/material/glass =SHEET_MATERIAL_AMOUNT*1.5)
build_path = /obj/item/biopsy_tool
@@ -402,7 +405,7 @@
/datum/design/shuttle_blueprints
name = "Shuttle Blueprints"
- desc = "Blueprints suitable for constructing shuttles"
+ desc = "A set of blueprints that aid in the construction of shuttles."
build_type = PROTOLATHE
materials = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT)
build_path = /obj/item/shuttle_blueprints
diff --git a/code/modules/research/experimentor/experimentor.dm b/code/modules/research/experimentor/experimentor.dm
index f3dc30e366ed..4fb7375c9e01 100644
--- a/code/modules/research/experimentor/experimentor.dm
+++ b/code/modules/research/experimentor/experimentor.dm
@@ -128,7 +128,7 @@
if(is_type_in_typecache(some_item.type, banned_typecache) || item_reactions["[some_item.type]"])
return
- if(istype(some_item, /obj/item/relic))
+ if(istype(some_item, /obj/item/assembly/relic))
item_reactions["[some_item.type]"] = SCANTYPE_DISCOVER
else
item_reactions["[some_item.type]"] = pick(get_available_reactions())
@@ -179,7 +179,7 @@
var/is_discover = (scantype == SCANTYPE_DISCOVER)
if(loaded_item)
- if(istype(loaded_item, /obj/item/relic))
+ if(istype(loaded_item, /obj/item/assembly/relic))
is_available = is_discover
else
is_available = !is_discover
@@ -198,7 +198,7 @@
item_data["name"] = loaded_item.name
item_data["icon"] = icon2base64(getFlatIcon(loaded_item, no_anim = TRUE))
- item_data["isRelic"] = istype(loaded_item, /obj/item/relic)
+ item_data["isRelic"] = istype(loaded_item, /obj/item/assembly/relic)
item_data["associatedNodes"] = list()
var/list/unlockable_nodes = SSresearch.techweb_unlock_items[loaded_item.type]
@@ -258,7 +258,7 @@
if(!stored_research || !loaded_item || !COOLDOWN_FINISHED(src, run_experiment))
return FALSE
- if(istype(loaded_item, /obj/item/relic))
+ if(istype(loaded_item, /obj/item/assembly/relic))
reaction = SCANTYPE_DISCOVER
else
reaction = match_reaction(loaded_item, reaction)
diff --git a/code/modules/research/experimentor/experiments.dm b/code/modules/research/experimentor/experiments.dm
index 706f1fcdc106..37fce8ff8fa9 100644
--- a/code/modules/research/experimentor/experiments.dm
+++ b/code/modules/research/experimentor/experiments.dm
@@ -346,7 +346,7 @@
machine.show_start_message(final_message, start_message_type)
playsound(machine, 'sound/effects/supermatter.ogg', 50, 3, -1)
- var/obj/item/relic/loaded_artifact = machine.loaded_item
+ var/obj/item/assembly/relic/loaded_artifact = machine.loaded_item
if(loaded_artifact)
loaded_artifact.reveal()
machine.investigate_log("Experimentor has revealed a relic with [span_danger("[loaded_artifact.hidden_power]")] effect.", INVESTIGATE_EXPERIMENTOR)
diff --git a/code/modules/research/part_replacer.dm b/code/modules/research/part_replacer.dm
index e96a7b809277..4612f4f5c177 100644
--- a/code/modules/research/part_replacer.dm
+++ b/code/modules/research/part_replacer.dm
@@ -54,7 +54,7 @@
///Bluespace RPED. Allows exchanging parts from a distance & through cameras
/obj/item/storage/part_replacer/bluespace
name = "bluespace rapid part exchange device"
- desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts."
+ desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with the ability to store larger components."
icon_state = "BS_RPED"
inhand_icon_state = "BS_RPED"
w_class = WEIGHT_CLASS_NORMAL
@@ -187,7 +187,7 @@
///Cyborg variant
/obj/item/storage/part_replacer/cyborg
name = "rapid part exchange device"
- desc = "Special mechanical module made to store, sort, and apply standard machine parts. This one has an extra large compartment for more parts."
+ desc = "Special mechanical module made to store, sort, and apply standard machine parts. This one has an extra large compartment for oversized components."
icon_state = "borgrped"
inhand_icon_state = "RPED"
lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
@@ -195,6 +195,6 @@
storage_type = /datum/storage/rped/bluespace
/obj/item/storage/part_replacer/cyborg/small
- desc = "Special mechanical module made to store, sort, and apply standard machine parts. This one has as much space, as your regular RPED"
+ desc = "Special mechanical module made to store, sort, and apply standard machine parts. This one has even less space than your regular RPED"
icon_state = "RPED"
- storage_type = /datum/storage/rped
+ storage_type = /datum/storage/rped/compact
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 5ed99e037c8c..25d17953e6a9 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -215,9 +215,12 @@ Nothing else in the console has ID requirements.
data["locked"] = board.locked
if(!stored_research) //lack of a research node is all we care about.
return data
+ var/list/queued_nodes = list()
+ for(var/node, weakref in stored_research.research_queue_nodes)
+ queued_nodes[node] = astype(weakref, /datum/weakref)?.resolve()
data += list(
"nodes" = list(),
- "queue_nodes" = stored_research.research_queue_nodes,
+ "queue_nodes" = queued_nodes,
"experiments" = list(),
"researched_designs" = stored_research.researched_designs,
"points" = stored_research.research_points,
@@ -245,7 +248,8 @@ Nothing else in the console has ID requirements.
if (stored_research.hidden_nodes[node_path])
continue
- var/mob/node_queuer = stored_research.research_queue_nodes[node_path]
+ var/datum/weakref/queuer_weakref = stored_research.research_queue_nodes[node_path]
+ var/mob/node_queuer = queuer_weakref?.resolve()
var/enqueued_by_user = !isnull(node_queuer) && node_queuer == user
data["nodes"] += list(list(
diff --git a/code/modules/research/relics.dm b/code/modules/research/relics.dm
index 087f95fce8de..51444759a7a6 100644
--- a/code/modules/research/relics.dm
+++ b/code/modules/research/relics.dm
@@ -1,11 +1,14 @@
#define RELIC_PROTOTYPE "prototype"
#define RELIC_NECROTECH "necrotech"
-/obj/item/relic
+/obj/item/assembly/relic
name = "strange object"
desc = "What mysteries could this hold? Maybe Research & Development could find out."
icon = 'icons/obj/devices/artefacts.dmi'
icon_state = "debug_artefact"
+ assembly_flags = ASSEMBLY_FUNCTIONAL_OUTPUT
+ activation_cooldown = null
+ use_base_icon_for_holder = TRUE
/// The name this artefact will have when it's activated.
var/real_name = "artefact"
/// Has this artefact been activated?
@@ -16,23 +19,21 @@
var/min_cooldown = 6 SECONDS
/// Max possible cooldown.
var/max_cooldown = 30 SECONDS
- /// Cooldown length. Randomly determined at activation if it isn't determined here.
- var/cooldown_timer
/// What visual theme this artefact has. Current possible choices: "prototype", "necrotech"
var/artifact_theme = RELIC_PROTOTYPE
COOLDOWN_DECLARE(cooldown)
-/obj/item/relic/Initialize(mapload)
+/obj/item/assembly/relic/Initialize(mapload)
. = ..()
random_themed_appearance()
RegisterSignal(src, COMSIG_ITEM_OPENED_FROM_GIFT, PROC_REF(auto_reveal))
-/obj/item/relic/proc/auto_reveal(...)
+/obj/item/assembly/relic/proc/auto_reveal(...)
SIGNAL_HANDLER
reveal()
-/obj/item/relic/proc/random_themed_appearance()
+/obj/item/assembly/relic/proc/random_themed_appearance()
var/themed_name_prefix
var/themed_name_suffix
if(artifact_theme == RELIC_PROTOTYPE)
@@ -49,17 +50,17 @@
name = "strange relic"
update_appearance()
-/obj/item/relic/lavaland
+/obj/item/assembly/relic/lavaland
name = "strange relic"
artifact_theme = RELIC_NECROTECH
-/obj/item/relic/proc/reveal()
+/obj/item/assembly/relic/proc/reveal()
if(activated) //no rerolling
return
activated = TRUE
name = real_name
- if(!cooldown_timer)
- cooldown_timer = rand(min_cooldown, max_cooldown)
+ if(!activation_cooldown)
+ activation_cooldown = rand(min_cooldown, max_cooldown)
if(!hidden_power)
if(artifact_theme == RELIC_PROTOTYPE)
hidden_power = pick(
@@ -95,48 +96,55 @@
)
obj_flags |= UNIQUE_RENAME
-/obj/item/relic/attack_self(mob/user)
+/obj/item/assembly/relic/attack_self(mob/user)
+ . = ..()
if(!activated)
to_chat(user, span_notice("You aren't quite sure what this is. Maybe R&D knows what to do with it?"))
return
- if(!COOLDOWN_FINISHED(src, cooldown))
- to_chat(user, span_warning("[src] does not react!"))
- return
- if(loc != user)
- return
- COOLDOWN_START(src, cooldown, cooldown_timer)
- call(src, hidden_power)(user)
+ activate(user)
+
+/obj/item/assembly/relic/activate(mob/activator)
+ if(!COOLDOWN_FINISHED(src, next_activate))
+ to_chat(activator, span_warning("[src] does not react!"))
+ return FALSE
+ if(!hidden_power)
+ return FALSE
+ call(src, hidden_power)(activator)
+ . = ..()
/// Helper to spawn smoke somewhere
-/obj/item/relic/proc/throw_smoke(turf/where)
+/obj/item/assembly/relic/proc/throw_smoke(turf/where)
do_smoke(0, src, get_turf(where))
/// Helper to show a message to people around the relic
-/obj/item/relic/proc/relic_message(message)
- var/atom/message_source = ismob(loc) ? loc : src
+/obj/item/assembly/relic/proc/relic_message(message)
+ var/atom/message_source = get(src, /mob/living) || src
message_source.visible_message(message)
// Artefact Powers \\
/// Throws a corgi somewhere
-/obj/item/relic/proc/corgi_cannon(mob/user)
+/obj/item/assembly/relic/proc/corgi_cannon(mob/user)
playsound(src, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- var/mob/living/basic/pet/dog/corgi/sad_corgi = new(get_turf(user))
- sad_corgi.throw_at(pick(oview(10,user)), 10, rand(3,8), callback = CALLBACK(src, PROC_REF(throw_smoke), sad_corgi))
- warn_admins(user, "Corgi Cannon", FALSE)
+ var/mob/living/basic/pet/dog/corgi/sad_corgi = relic_mob_spawn(/mob/living/basic/pet/dog/corgi)
+ if(sad_corgi)
+ sad_corgi.throw_at(pick(oview(10,user)), 10, rand(3,8), callback = CALLBACK(src, PROC_REF(throw_smoke), sad_corgi))
+ warn_admins(user, "Corgi Cannon", FALSE)
+ else
+ to_chat(user, span_notice("[src] vibrates a bit, but nothing happens."))
/// Spawns cleaning foam
-/obj/item/relic/proc/cleaning_foam(mob/user)
+/obj/item/assembly/relic/proc/cleaning_foam(mob/user)
playsound(src, SFX_SPARKS, rand(25, 50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- var/obj/item/grenade/chem_grenade/cleaner/spawned_foamer = new(get_turf(user))
+ var/obj/item/grenade/chem_grenade/cleaner/spawned_foamer = new(get_turf(src))
spawned_foamer.detonate()
qdel(spawned_foamer)
warn_admins(user, "Foam", FALSE)
/// Similar to cleaning foam but spawns the acid variant
-/obj/item/relic/proc/cleaning_foam_acid(mob/user)
+/obj/item/assembly/relic/proc/cleaning_foam_acid(mob/user)
playsound(src, SFX_SPARKS, rand(25, 50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- var/obj/item/grenade/chem_grenade/ez_clean/spawned_foamer = new(get_turf(user))
+ var/obj/item/grenade/chem_grenade/ez_clean/spawned_foamer = new(get_turf(src))
spawned_foamer.detonate()
qdel(spawned_foamer)
warn_admins(user, "Acid Foam", TRUE)
@@ -145,17 +153,14 @@
acid_melt()
/// Flashbangs anyone nearby
-/obj/item/relic/proc/flashbanger(mob/user)
+/obj/item/assembly/relic/proc/flashbanger(mob/user)
playsound(src, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- var/obj/item/grenade/flashbang/spawned_flashbang = new(get_turf(user))
+ var/obj/item/grenade/flashbang/spawned_flashbang = new(get_turf(src))
spawned_flashbang.detonate()
warn_admins(user, "Flash")
/// Summon a bunch of random animals, some of which are dangerous
-/obj/item/relic/proc/summon_animals(mob/user)
- var/message = span_danger("[src] begins to shake, and in the distance the sound of rampaging animals arises!")
- visible_message(message)
- to_chat(user, message)
+/obj/item/assembly/relic/proc/summon_animals(mob/user)
var/static/list/valid_animals = list(
/mob/living/basic/bear,
/mob/living/basic/bee,
@@ -170,20 +175,23 @@
/mob/living/basic/pet/dog/pug,
/mob/living/basic/pet/fox,
)
+ var/actually_spawned = 0
for(var/counter in 1 to rand(1, 25))
var/animal_spawn = pick(valid_animals)
- var/mob/living/animal = new animal_spawn(get_turf(src))
- ADD_TRAIT(animal, TRAIT_SPAWNED_MOB, INNATE_TRAIT)
- warn_admins(user, "Mass Mob Spawn")
- if(prob(60))
- relic_message(span_warning("[src] falls apart!"))
- deconstruct(FALSE)
-
-/// Version of summon_animals that spawns mostly lavaland monsters
-/obj/item/relic/proc/summon_animals_monsters(mob/user)
- var/message = span_danger("[src] begins to shake, and in the distance the sound of roaring arises!")
+ var/mob/living/animal = relic_mob_spawn(animal_spawn)
+ if(animal)
+ actually_spawned++
+ var/message = actually_spawned ? span_danger("[src] begins to shake, and in the distance the sound of rampaging animals arises!") : span_warning("[src] begins to shake, but nothing happens...")
visible_message(message)
to_chat(user, message)
+ if(actually_spawned)
+ warn_admins(user, "Mass Mob Spawn")
+ if(prob(60))
+ relic_message(span_warning("[src] falls apart!"))
+ deconstruct(FALSE)
+
+/// Version of summon_animals that spawns mostly lavaland monsters
+/obj/item/assembly/relic/proc/summon_animals_monsters(mob/user)
var/static/list/valid_monsters = list(
/mob/living/basic/construct/artificer/hostile,
/mob/living/basic/construct/juggernaut/hostile,
@@ -204,21 +212,27 @@
/mob/living/basic/raptor/white,
/mob/living/basic/raptor/yellow,
)
+ var/actually_spawned = 0
for(var/counter in 1 to rand(3, 9))
var/animal_spawn = pick(valid_monsters)
- var/mob/living/animal = new animal_spawn(get_turf(src))
- ADD_TRAIT(animal, TRAIT_SPAWNED_MOB, INNATE_TRAIT)
- warn_admins(user, "Mass Mob Spawn (Monster)")
- if(prob(80))
- relic_message(span_warning("[src] falls apart!"))
- deconstruct(FALSE)
+ var/mob/living/animal = relic_mob_spawn(animal_spawn)
+ if(animal)
+ actually_spawned++
+ var/message = actually_spawned ? span_danger("[src] begins to shake, and in the distance the sound of roaring arises!") : span_warning("[src] begins to shake, but nothing happens...")
+ visible_message(message)
+ to_chat(user, message)
+ if(actually_spawned)
+ warn_admins(user, "Mass Mob Spawn (Monster)")
+ if(prob(80))
+ relic_message(span_warning("[src] falls apart!"))
+ deconstruct(FALSE)
/// Spawns a bunch of mimics of the relic which also can spawn relics, but despawn shortly
-/obj/item/relic/proc/rapid_self_dupe(mob/user)
+/obj/item/assembly/relic/proc/rapid_self_dupe(mob/user)
audible_message("[src] emits a loud pop!")
var/list/dummy_artifacts = list()
for(var/counter in 1 to rand(5,10))
- var/obj/item/relic/duped = new type(get_turf(src))
+ var/obj/item/assembly/relic/duped = new type(get_turf(src))
duped.name = name
duped.desc = desc
duped.real_name = real_name
@@ -230,46 +244,44 @@
warn_admins(user, "Rapid duplicator", 0)
/// Explodes after a few seconds
-/obj/item/relic/proc/heat_and_explode(mob/user)
+/obj/item/assembly/relic/proc/heat_and_explode(mob/user)
to_chat(user, span_danger("[src] begins to heat up!"))
addtimer(CALLBACK(src, PROC_REF(blow_up), user), rand(3.5 SECONDS, 10 SECONDS))
-/obj/item/relic/proc/blow_up(mob/user)
- if(loc == user)
- visible_message(span_notice("\The [src]'s top opens, releasing a powerful blast!"))
- explosion(src, heavy_impact_range = rand(1,5), light_impact_range = rand(1,5), flame_range = 2, flash_range = rand(1,5), adminlog = TRUE)
- warn_admins(user, "Explosion")
- deconstruct(FALSE) //Comment this line to produce a light grenade (the bomb that keeps on exploding when used)!!
+/obj/item/assembly/relic/proc/blow_up(mob/user)
+ if(user && (get(src, /mob/living) != user))
+ return
+ visible_message(span_notice("\The [src]'s top opens, releasing a powerful blast!"))
+ explosion(src, heavy_impact_range = rand(1,5), light_impact_range = rand(1,5), flame_range = 2, flash_range = rand(1,5), adminlog = TRUE)
+ warn_admins(user, "Explosion")
+ deconstruct(FALSE) //Comment this line to produce a light grenade (the bomb that keeps on exploding when used)!!
/// Teleports the relic, and anyone holding it, to a random location nearby
-/obj/item/relic/proc/uncontrolled_teleport(mob/user)
+/obj/item/assembly/relic/proc/uncontrolled_teleport(mob/user)
to_chat(user, span_notice("[src] begins to vibrate!"))
var/teleport_time = rand(1 SECONDS, 3 SECONDS)
addtimer(CALLBACK(src, PROC_REF(do_the_teleport), user), teleport_time)
Shake(1, 1, teleport_time, 0.05 SECONDS)
-/obj/item/relic/proc/do_the_teleport(mob/user)
- var/turf/userturf = get_turf(user)
- //Because Nuke Ops bringing this back on their shuttle, then looting the ERT area is 2fun4you!
- if(is_centcom_level(userturf.z))
- return
- var/to_teleport = ismovable(loc) ? loc : src
- visible_message(span_notice("[to_teleport] twists and bends, relocating itself!"))
+/obj/item/assembly/relic/proc/do_the_teleport(mob/user)
+ var/turf/userturf = get_turf(src)
+ var/atom/movable/to_teleport = get_loose_container(src, container_flags = ALL)
+ to_teleport.visible_message(span_notice("[to_teleport] twists and bends, relocating itself!"))
throw_smoke(get_turf(to_teleport))
do_teleport(to_teleport, userturf, 8, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE)
throw_smoke(get_turf(to_teleport))
warn_admins(user, "Teleport", FALSE)
/// Version of uncontrolled_teleport with cult theming, and that affects all nearby movables rather than just the relic
-/obj/item/relic/proc/uncontrolled_aoe_teleport(mob/user)
+/obj/item/assembly/relic/proc/uncontrolled_aoe_teleport(mob/user)
to_chat(user, span_notice("[src] begins to vibrate intensely!"))
var/teleport_time = rand(1 SECONDS, 3 SECONDS)
addtimer(CALLBACK(src, PROC_REF(do_the_aoe_teleport), user), teleport_time)
Shake(2, 2, teleport_time, 0.03 SECONDS)
-/obj/item/relic/proc/do_the_aoe_teleport(mob/user)
+/obj/item/assembly/relic/proc/do_the_aoe_teleport(mob/user)
visible_message(span_notice("[src] twists and bends, relocating anything nearby!"))
var/turf/teleturf = get_turf(src)
for(var/atom/movable/nearby in view(2, teleturf))
@@ -302,24 +314,24 @@
qdel(src)
// Creates a glass and fills it up with a drink.
-/obj/item/relic/proc/drink_dispenser(mob/user)
- var/obj/item/reagent_containers/cup/glass/drinkingglass/freebie = new(get_step_rand(user))
+/obj/item/assembly/relic/proc/drink_dispenser(mob/user)
+ var/obj/item/reagent_containers/cup/glass/drinkingglass/freebie = new(get_step_rand(src))
playsound(freebie, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
do_sparks(5, TRUE, src, src)
addtimer(CALLBACK(src, PROC_REF(dispense_drink), freebie), 0.5 SECONDS)
-/obj/item/relic/proc/dispense_drink(obj/item/reagent_containers/cup/glass/glasser)
+/obj/item/assembly/relic/proc/dispense_drink(obj/item/reagent_containers/cup/glass/glasser)
playsound(glasser, 'sound/effects/phasein.ogg', rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
glasser.reagents.add_reagent(get_random_reagent_id(whitelist = subtypesof(/datum/reagent/consumable/ethanol)), rand(glasser.volume * 0.3, glasser.volume))
throw_smoke(get_turf(glasser))
/// Scrambles your organs. 33% chance to delete after use.
-/obj/item/relic/proc/tummy_ache(mob/user)
+/obj/item/assembly/relic/proc/tummy_ache(mob/user)
new /obj/effect/temp_visual/circle_wave/bioscrambler/light(get_turf(src))
to_chat(user, span_notice("Your stomach starts growling..."))
addtimer(CALLBACK(src, PROC_REF(scrambliticus), user), rand(1 SECONDS, 3 SECONDS)) // throw it away!
-/obj/item/relic/proc/scrambliticus(mob/user)
+/obj/item/assembly/relic/proc/scrambliticus(mob/user)
new /obj/effect/temp_visual/circle_wave/bioscrambler/light(get_turf(src))
playsound(src, 'sound/effects/magic/cosmic_energy.ogg', vol = 50, vary = TRUE)
for(var/mob/living/carbon/nearby in range(2, get_turf(src))) //needs get_turf() to work
@@ -332,22 +344,25 @@
deconstruct(FALSE)
/// Charges an item or two in your inventory. Also yourself.
-/obj/item/relic/proc/charger(mob/living/user)
- to_chat(user, span_danger("You're recharged!"))
+/obj/item/assembly/relic/proc/charger(mob/living/user)
+ playsound(src, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ var/mob/living/mob_to_charge = get(src, /mob/living)
+ if(!mob_to_charge)
+ return
+ to_chat(mob_to_charge, span_danger("You're recharged!"))
var/stunner = 1.25 SECONDS
- if(iscarbon(user))
- var/mob/living/carbon/carboner = user
+ if(iscarbon(mob_to_charge))
+ var/mob/living/carbon/carboner = mob_to_charge
carboner.electrocute_act(15, src, flags = SHOCK_NOGLOVES, stun_duration = stunner)
else
- user.electrocute_act(15, src, flags = SHOCK_NOGLOVES)
- playsound(user, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ mob_to_charge.electrocute_act(15, src, flags = SHOCK_NOGLOVES)
- var/list/chargeable_items = user.get_all_cells(max_percent = 0.95) // otherwise the PDA always gets recharged
+ var/list/chargeable_items = mob_to_charge.get_all_cells(max_percent = 0.95) // otherwise the PDA always gets recharged
- lightning_fx(user, stunner)
+ lightning_fx(mob_to_charge, stunner)
var/recharges = rand(1, 2)
if(!length(chargeable_items))
- to_chat(user, span_notice("You have a strange feeling for a moment, but then it passes."))
+ to_chat(mob_to_charge, span_notice("You have a strange feeling for a moment, but then it passes."))
return
while(length(chargeable_items) && recharges)
recharges--
@@ -356,57 +371,58 @@
chargeable_items.Remove(to_charge_base)
to_charge.charge = to_charge.maxcharge
to_charge_base.update_appearance(UPDATE_ICON|UPDATE_OVERLAYS)
- to_chat(user, span_notice("[to_charge_base] feels energized!"))
+ to_chat(mob_to_charge, span_notice("[to_charge_base] feels energized!"))
lightning_fx(to_charge_base, 0.8 SECONDS)
-/obj/item/relic/proc/lightning_fx(atom/shocker, time)
+/obj/item/assembly/relic/proc/lightning_fx(atom/shocker, time)
var/lightning = mutable_appearance('icons/effects/effects.dmi', "electricity3", layer = ABOVE_MOB_LAYER)
shocker.add_overlay(lightning)
addtimer(CALLBACK(src, PROC_REF(cut_the_overlay), shocker, lightning), time)
-/obj/item/relic/proc/cut_the_overlay(atom/shocker, lightning)
+/obj/item/assembly/relic/proc/cut_the_overlay(atom/shocker, lightning)
shocker.cut_overlay(lightning)
/// Hugs/shakes everyone in range!
-/obj/item/relic/proc/hugger(mob/user)
- var/list/mob/living/carbon/huggeds = oviewers(3, user)
+/obj/item/assembly/relic/proc/hugger(mob/user)
+ var/mob/living/hugger = get(src, /mob/living)
+ var/list/mob/living/carbon/huggeds = oviewers(3, hugger)
for(var/mob/living/carbon/victim in huggeds)
- victim.help_shake_act(user, force_friendly = TRUE)
+ victim.help_shake_act(hugger, force_friendly = TRUE)
new /obj/effect/temp_visual/heart(victim.loc)
if(length(huggeds))
- to_chat(user, span_nicegreen("You feel friendly!"))
+ to_chat(hugger, span_nicegreen("You feel friendly!"))
else
- to_chat(user, pick(span_notice("You hug yourself, for some reason."), span_notice("You have a strange feeling for a moment, but then it passes.")))
+ to_chat(hugger, pick(span_notice("You hug yourself, for some reason."), span_notice("You have a strange feeling for a moment, but then it passes.")))
/// Converts a 3x3 area into a random dimensional theme.
-/obj/item/relic/proc/dimensional_shift(mob/user)
+/obj/item/assembly/relic/proc/dimensional_shift(mob/user)
var/new_theme_path = pick(subtypesof(/datum/dimension_theme))
var/datum/dimension_theme/shifter = SSmaterials.dimensional_themes[new_theme_path]
- for(var/turf/shiftee in range(1, user))
+ for(var/turf/shiftee in range(1, get_turf(src)))
shifter.apply_theme(shiftee, show_effect = TRUE)
// prevent *total* spam conversion
- min_cooldown += 2 SECONDS
- max_cooldown += 2 SECONDS
+ activation_cooldown += 2 SECONDS
/// Replaces your clothing with a random costume, and your ID with a cardboard one.
/// TODO: make them part of the same kit (lobster hat, lobster suit)
-/obj/item/relic/proc/disguiser(mob/user)
- if(!iscarbon(user))
- to_chat(user, span_notice("You have a strange feeling for a moment, but then it passes."))
+/obj/item/assembly/relic/proc/disguiser(mob/user)
+ var/mob/living/to_disguise = get(src, /mob/living)
+ if(!iscarbon(to_disguise))
+ to_chat(to_disguise, span_notice("You have a strange feeling for a moment, but then it passes."))
return
if(prob(80)) // >:)
- ADD_TRAIT(user, TRAIT_NO_JUMPSUIT, REF(src)) // prevent dropping pockets & belt
+ ADD_TRAIT(to_disguise, TRAIT_NO_JUMPSUIT, REF(src)) // prevent dropping pockets & belt
// magic trick!
- playsound(user, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- throw_smoke(user)
+ playsound(to_disguise, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ throw_smoke(to_disguise)
- if(!ishuman(user))
- to_chat(user, span_notice("You have a peculiar feeling for a moment, but then it passes."))
+ if(!ishuman(to_disguise))
+ to_chat(to_disguise, span_notice("You have a peculiar feeling for a moment, but then it passes."))
return
- var/mob/living/carbon/human/humerus = user
+ var/mob/living/carbon/human/humerus = to_disguise
//hat
var/obj/item/clothing/head/costume/disguise_hat = roll_costume(ITEM_SLOT_HEAD, HIDEMASK)
humerus.dropItemToGround(humerus.head)
@@ -437,9 +453,9 @@
card_id.scribbled_trim = replacetext(random_trim.trim_state, "trim_", "cardboard_")
card_id.scribbled_assignment = random_trim.assignment
card_id.update_appearance()
- REMOVE_TRAIT(user, TRAIT_NO_JUMPSUIT, REF(src))
+ REMOVE_TRAIT(to_disguise, TRAIT_NO_JUMPSUIT, REF(src))
-/obj/item/relic/proc/roll_costume(slot, flagcheck)
+/obj/item/assembly/relic/proc/roll_costume(slot, flagcheck)
var/list/candidates = list()
for(var/obj/item/costume as anything in GLOB.all_autodrobe_items)
if(flagcheck && !(initial(costume.flags_inv) & flagcheck))
@@ -453,8 +469,9 @@
return new_costume
/// Makes the relic holder have a shield that blocks 3 common attacks
-/obj/item/relic/proc/t1_shield_holder(mob/user)
- var/datum/component/shield = AddComponent( \
+/obj/item/assembly/relic/proc/t1_shield_holder(mob/user)
+ var/obj/item/outermost_item = get_loose_container(src, container_flags = NONE)
+ var/datum/component/shield = outermost_item.AddComponent( \
/datum/component/shielded, \
max_charges = 3, \
recharge_start_delay = 0, \
@@ -463,10 +480,11 @@
can_block_overwhelming = FALSE, \
shield_icon_file = 'icons/effects/effects.dmi', \
shield_icon = "at_shield1", \
- run_hit_callback = CALLBACK(src, PROC_REF(shield_hit)), \
+ run_hit_callback = CALLBACK(src, PROC_REF(shield_hit), outermost_item), \
)
- light_system = OVERLAY_LIGHT
- var/datum/component/light = AddComponent( \
+ var/old_light_system = outermost_item.light_system
+ outermost_item.light_system = OVERLAY_LIGHT
+ var/datum/component/light = outermost_item.AddComponent( \
/datum/component/overlay_lighting, \
_range = 2.5, \
_power = 1.5, \
@@ -474,16 +492,17 @@
starts_on = TRUE, \
)
- addtimer(CALLBACK(src, PROC_REF(remove_shield), list(shield, light)), cooldown_timer * 0.5)
- add_filter("block_shield", 1, outline_filter(0, COLOR_BIOLUMINESCENCE_YELLOW), shield)
- transition_filter("block_shield", outline_filter(2, COLOR_BIOLUMINESCENCE_YELLOW), cooldown_timer * 0.5)
+ addtimer(CALLBACK(src, PROC_REF(remove_shield), outermost_item, old_light_system, list(shield, light)), activation_cooldown * 0.5)
+ outermost_item.add_filter("block_shield", 1, outline_filter(0, COLOR_BIOLUMINESCENCE_YELLOW), shield)
+ outermost_item.transition_filter("block_shield", outline_filter(2, COLOR_BIOLUMINESCENCE_YELLOW), activation_cooldown * 0.5)
- relic_message(span_notice("[src] starts to glow a bright yellow!"))
+ relic_message(span_notice("[outermost_item] starts to glow a bright yellow!"))
warn_admins(user, "Shield", FALSE)
/// Makes the relic holder have a shield that blocks 1 powerful attack
-/obj/item/relic/proc/t2_shield_holder(mob/user)
- var/datum/component/shield = AddComponent( \
+/obj/item/assembly/relic/proc/t2_shield_holder(mob/user)
+ var/obj/item/outermost_item = get_loose_container(src, container_flags = NONE)
+ var/datum/component/shield = outermost_item.AddComponent( \
/datum/component/shielded, \
max_charges = 1, \
recharge_start_delay = 0, \
@@ -492,10 +511,11 @@
can_block_overwhelming = TRUE, \
shield_icon_file = 'icons/effects/effects.dmi', \
shield_icon = "at_shield2", \
- run_hit_callback = CALLBACK(src, PROC_REF(shield_hit)), \
+ run_hit_callback = CALLBACK(src, PROC_REF(shield_hit), outermost_item), \
)
- light_system = OVERLAY_LIGHT
- var/datum/component/light = AddComponent( \
+ var/old_light_system = outermost_item.light_system
+ outermost_item.light_system = OVERLAY_LIGHT
+ var/datum/component/light = outermost_item.AddComponent( \
/datum/component/overlay_lighting, \
_range = 3, \
_power = 1.5, \
@@ -503,31 +523,34 @@
starts_on = TRUE, \
)
- addtimer(CALLBACK(src, PROC_REF(remove_shield), list(shield, light)), cooldown_timer * 0.5)
- add_filter("block_shield", 1, outline_filter(0, COLOR_BIOLUMINESCENCE_YELLOW), shield)
- transition_filter("block_shield", outline_filter(2, COLOR_BIOLUMINESCENCE_YELLOW), cooldown_timer * 0.5)
+ addtimer(CALLBACK(src, PROC_REF(remove_shield), outermost_item, old_light_system, list(shield, light)), activation_cooldown * 0.5)
+ outermost_item.add_filter("block_shield", 1, outline_filter(0, COLOR_BIOLUMINESCENCE_YELLOW), shield)
+ outermost_item.transition_filter("block_shield", outline_filter(2, COLOR_BIOLUMINESCENCE_YELLOW), activation_cooldown * 0.5)
- relic_message(span_notice("[src] starts to glow a bright yellow!"))
+ relic_message(span_notice("[outermost_item] starts to glow a bright yellow!"))
warn_admins(user, "Shield", FALSE)
-/obj/item/relic/proc/shield_hit(mob/living/owner, attack_text, current_charges)
- playsound(src, 'sound/items/weapons/marauder.ogg', 20, TRUE, frequency = 1.25)
- owner.visible_message(span_danger("[owner]'s holds [src] up, blocking [attack_text] with a projected shield!"))
+/obj/item/assembly/relic/proc/shield_hit(obj/item/comp_parent, mob/living/owner, attack_text, current_charges)
+ playsound(comp_parent, 'sound/items/weapons/marauder.ogg', 20, TRUE, frequency = 1.25)
+ if(owner.is_holding(comp_parent))
+ owner.visible_message(span_danger("[owner] holds [comp_parent] up, blocking [attack_text] with a projected shield!"))
+ else
+ owner.visible_message(span_danger("[owner]'s [comp_parent.name] blocks [attack_text] with a projected shield!"))
if(current_charges <= 0)
- set_light_on(FALSE)
- relic_message(span_notice("[src] stops glowing."))
- remove_filter("block_shield")
+ comp_parent.set_light_on(FALSE)
+ relic_message(span_notice("[comp_parent] stops glowing."))
+ comp_parent.remove_filter("block_shield")
-/obj/item/relic/proc/remove_shield(list/cleanup_components)
+/obj/item/assembly/relic/proc/remove_shield(obj/item/affected, old_light_system, list/cleanup_components)
for(var/datum/component/comp as anything in cleanup_components)
qdel(comp)
- light_system = initial(light_system)
- if(light_on)
- relic_message(span_notice("[src] stops glowing."))
- remove_filter("block_shield")
+ affected.light_system = initial(light_system)
+ if(affected.light_on)
+ relic_message(span_notice("[affected] stops glowing."))
+ affected.remove_filter("block_shield")
/// Places rock turfs around the relic
-/obj/item/relic/proc/place_rocks(mob/user)
+/obj/item/assembly/relic/proc/place_rocks(mob/user)
relic_message(span_notice("A spire of rock erupts from the ground beneath [src]!"))
playsound(src, 'sound/effects/rock/rock_break.ogg', 50, TRUE)
var/turf/spawnloc = get_turf(src)
@@ -550,7 +573,7 @@
/// User sprays out blood in all directions
/// Has a small chance of changing the power to suck_blood
-/obj/item/relic/proc/yeet_blood(mob/living/user)
+/obj/item/assembly/relic/proc/yeet_blood(mob/living/user)
var/yeet_time = rand(1 SECONDS, 3 SECONDS)
add_filter("blood_outgoing", 1, outline_filter(0, COLOR_DARK))
transition_filter("blood_outgoing", outline_filter(2, BLOOD_COLOR_RED), yeet_time)
@@ -561,8 +584,8 @@
addtimer(CALLBACK(src, PROC_REF(actually_yeet_blood)), yeet_time)
-/obj/item/relic/proc/actually_yeet_blood()
- var/mob/living/user = loc
+/obj/item/assembly/relic/proc/actually_yeet_blood()
+ var/mob/living/user = get_loose_container(src, container_flags = LOOSE_CONTAINER_INCLUDE_INVENTORY)
var/splatcount = 0
if(istype(user) && CAN_HAVE_BLOOD(user) && !user.can_block_magic(MAGIC_RESISTANCE_HOLY, 1))
for(var/splatdir in GLOB.alldirs)
@@ -587,7 +610,7 @@
/// Nearby mobs transfer blood to the user
/// Has a small chance of changing the power to yeet_blood
-/obj/item/relic/proc/suck_blood(mob/living/user)
+/obj/item/assembly/relic/proc/suck_blood(mob/living/user)
var/suck_time = rand(1 SECONDS, 3 SECONDS)
add_filter("blood_incoming", 1, outline_filter(0, COLOR_DARK))
transition_filter("blood_incoming", outline_filter(2, BLOOD_COLOR_RED), suck_time)
@@ -598,8 +621,8 @@
addtimer(CALLBACK(src, PROC_REF(actually_suck_blood)), suck_time)
-/obj/item/relic/proc/actually_suck_blood()
- var/mob/living/user = loc
+/obj/item/assembly/relic/proc/actually_suck_blood()
+ var/mob/living/user = get_loose_container(src, container_flags = LOOSE_CONTAINER_INCLUDE_INVENTORY)
var/any_affected = FALSE
if(istype(user) && CAN_HAVE_BLOOD(user) && !user.can_block_magic(MAGIC_RESISTANCE_HOLY, 1))
for(var/mob/living/nearby in view(2, user))
@@ -624,7 +647,7 @@
addtimer(CALLBACK(src, TYPE_PROC_REF(/datum, remove_filter), "blood_incoming"), 2 SECONDS)
/// Alerts admins on usage of dagnerous relics
-/obj/item/relic/proc/warn_admins(mob/user, relic_type, priority = TRUE)
+/obj/item/assembly/relic/proc/warn_admins(mob/user, relic_type, priority = TRUE)
var/turf/location = get_turf(src)
var/log_msg = "[relic_type] relic used by [key_name(user)] in [AREACOORD(location)]"
if(priority)
@@ -632,16 +655,24 @@
log_game(log_msg)
investigate_log(log_msg, "experimentor")
+/obj/item/assembly/relic/proc/relic_mob_spawn(mob_type)
+ if(length(SSmobs.relicmobs) >= CONFIG_GET(number/relicmobcap))
+ return null
+ var/mob/living/spawned = new mob_type(get_turf(src))
+ ADD_TRAIT(spawned, TRAIT_SPAWNED_MOB, INNATE_TRAIT)
+ SSmobs.register_relic_mob(spawned)
+ return spawned
+
// Subtypes that spawn revealed, primarily for debug/testing/badmin purposes
-/obj/item/relic/revealed
+/obj/item/assembly/relic/revealed
-/obj/item/relic/revealed/Initialize(mapload)
+/obj/item/assembly/relic/revealed/Initialize(mapload)
. = ..()
auto_reveal()
-/obj/item/relic/lavaland
+/obj/item/assembly/relic/lavaland
-/obj/item/relic/lavaland/revealed/Initialize(mapload)
+/obj/item/assembly/relic/lavaland/revealed/Initialize(mapload)
. = ..()
auto_reveal()
diff --git a/code/modules/research/server_control.dm b/code/modules/research/server_control.dm
index 1b792339d4af..ec1d5a61bb56 100644
--- a/code/modules/research/server_control.dm
+++ b/code/modules/research/server_control.dm
@@ -1,5 +1,5 @@
/obj/machinery/computer/rdservercontrol
- name = "R&D Server Controller"
+ name = "\improper R&D server control console"
desc = "Manages access to research databases and consoles."
icon_screen = "rdcomp"
icon_keyboard = "rd_key"
diff --git a/code/modules/research/techweb/nodes/alien_nodes.dm b/code/modules/research/techweb/nodes/alien_nodes.dm
index f7adc1df1bbd..a76e0cd54e06 100644
--- a/code/modules/research/techweb/nodes/alien_nodes.dm
+++ b/code/modules/research/techweb/nodes/alien_nodes.dm
@@ -18,7 +18,7 @@
/obj/item/circular_saw/alien,
/obj/item/crowbar/abductor,
/obj/item/gun/energy/alien,
- /obj/item/gun/energy/shrink_ray,
+ /obj/item/gun/energy/recharge/shrink_ray,
/obj/item/hemostat/alien,
/obj/item/melee/baton/abductor,
/obj/item/multitool/abductor,
@@ -53,7 +53,7 @@
)
required_items_to_unlock = list(
/obj/item/crowbar/abductor,
- /obj/item/gun/energy/shrink_ray,
+ /obj/item/gun/energy/recharge/shrink_ray,
/obj/item/melee/baton/abductor,
/obj/item/multitool/abductor,
/obj/item/screwdriver/abductor,
@@ -86,7 +86,7 @@
/obj/item/circular_saw/alien,
/obj/item/crowbar/abductor,
/obj/item/gun/energy/alien,
- /obj/item/gun/energy/shrink_ray,
+ /obj/item/gun/energy/recharge/shrink_ray,
/obj/item/hemostat/alien,
/obj/item/melee/baton/abductor,
/obj/item/multitool/abductor,
diff --git a/code/modules/research/techweb/nodes/cyborg_nodes.dm b/code/modules/research/techweb/nodes/cyborg_nodes.dm
index e1d38b4fea74..2857a23fde9d 100644
--- a/code/modules/research/techweb/nodes/cyborg_nodes.dm
+++ b/code/modules/research/techweb/nodes/cyborg_nodes.dm
@@ -40,6 +40,8 @@
/datum/design/advanced_r_leg,
/datum/design/borg_upgrade_rename,
/datum/design/borg_upgrade_restart,
+ /datum/design/cybernetic_fangs,
+ /datum/design/cybernetic_fangs/cat,
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS)
announce_channels = list(RADIO_CHANNEL_SCIENCE)
diff --git a/code/modules/research/techweb/nodes/engi_nodes.dm b/code/modules/research/techweb/nodes/engi_nodes.dm
index 540d31317a16..dd4951765a94 100644
--- a/code/modules/research/techweb/nodes/engi_nodes.dm
+++ b/code/modules/research/techweb/nodes/engi_nodes.dm
@@ -159,6 +159,7 @@
unlocked_designs = list(
/datum/design/board/apc_control,
/datum/design/board/powermonitor,
+ /datum/design/board/plankman,
/datum/design/board/smes,
/datum/design/board/smesbank,
/datum/design/board/power_connector,
diff --git a/code/modules/research/techweb/nodes/medbay_nodes.dm b/code/modules/research/techweb/nodes/medbay_nodes.dm
index c9e208d140c5..da9e00e5a983 100644
--- a/code/modules/research/techweb/nodes/medbay_nodes.dm
+++ b/code/modules/research/techweb/nodes/medbay_nodes.dm
@@ -11,6 +11,7 @@
/datum/design/cautery,
/datum/design/chem_pack,
/datum/design/circular_saw,
+ /datum/design/defibrillator,
/datum/design/defibrillator_mount,
/datum/design/dropper,
/datum/design/hemostat,
@@ -74,6 +75,7 @@
unlocked_designs = list(
/datum/design/board/chem_mass_spec,
/datum/design/crewpinpointer,
+ /datum/design/defibrillator_compact,
/datum/design/defibrillator_mount_charging,
/datum/design/diode_disk_healing,
/datum/design/diode_disk_sanity,
diff --git a/code/modules/research/techweb/nodes/research_nodes.dm b/code/modules/research/techweb/nodes/research_nodes.dm
index 6133271d32c4..57f29abc865e 100644
--- a/code/modules/research/techweb/nodes/research_nodes.dm
+++ b/code/modules/research/techweb/nodes/research_nodes.dm
@@ -44,6 +44,8 @@
/datum/design/light_replacer_blue,
/datum/design/bluespacebodybag,
/datum/design/radio_navigation_beacon,
+ /datum/design/board/gas_receiver,
+ /datum/design/board/bluespace_scrubber,
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS)
discount_experiments = list(/datum/experiment/scanning/points/bluespace_crystal = TECHWEB_TIER_2_POINTS)
diff --git a/code/modules/research/techweb/nodes/service_nodes.dm b/code/modules/research/techweb/nodes/service_nodes.dm
index 25cec3437bc5..d3ce27a3f279 100644
--- a/code/modules/research/techweb/nodes/service_nodes.dm
+++ b/code/modules/research/techweb/nodes/service_nodes.dm
@@ -39,6 +39,7 @@
/datum/design/entertainment_radio,
/datum/design/rdd,
/datum/design/board/photopcopier,
+ /datum/design/producepad,
)
/datum/techweb_node/sanitation
diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
index 7ce5302d9d9e..88b4a59bcfce 100644
--- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
@@ -42,18 +42,14 @@
/datum/status_effect/slimeskin/on_apply()
owner.add_atom_colour(color_transition_filter("#3070CC", SATURATION_OVERRIDE), TEMPORARY_COLOUR_PRIORITY)
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- H.physiology.damage_resistance += 10
+ owner.damage_resistance += 10
owner.visible_message(span_warning("[owner] is suddenly covered in a strange, blue-ish gel!"),
span_notice("You are covered in a thick, rubbery gel."))
return ..()
/datum/status_effect/slimeskin/on_remove()
owner.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY)
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- H.physiology.damage_resistance -= 10
+ owner.damage_resistance -= 10
owner.visible_message(span_warning("[owner]'s gel coating liquefies and dissolves away."),
span_notice("Your gel second-skin dissolves!"))
@@ -300,15 +296,11 @@
tick_interval = STATUS_EFFECT_NO_TICK
/datum/status_effect/metalcookie/on_apply()
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- H.physiology.brute_mod *= 0.9
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 0.9)
return ..()
/datum/status_effect/metalcookie/on_remove()
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- H.physiology.brute_mod /= 0.9
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 1 / 0.9)
/datum/status_effect/sparkcookie
id = "sparkcookie"
@@ -316,19 +308,13 @@
alert_type = null
duration = 30 SECONDS
tick_interval = STATUS_EFFECT_NO_TICK
- var/original_coeff
/datum/status_effect/sparkcookie/on_apply()
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- original_coeff = H.physiology.siemens_coeff
- H.physiology.siemens_coeff = 0
+ ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, TRAIT_STATUS_EFFECT(id))
return ..()
/datum/status_effect/sparkcookie/on_remove()
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- H.physiology.siemens_coeff = original_coeff
+ REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, TRAIT_STATUS_EFFECT(id))
/datum/status_effect/toxincookie
id = "toxincookie"
@@ -451,15 +437,11 @@
tick_interval = STATUS_EFFECT_NO_TICK
/datum/status_effect/adamantinecookie/on_apply()
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- H.physiology.burn_mod *= 0.9
+ MODIFY_PHYSIOLOGY(owner, BURN, 0.9)
return ..()
/datum/status_effect/adamantinecookie/on_remove()
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- H.physiology.burn_mod /= 0.9
+ MODIFY_PHYSIOLOGY(owner, BURN, 1 / 0.9)
///////////////////////////////////////////////////////
//////////////////STABILIZED EXTRACTS//////////////////
@@ -692,15 +674,11 @@
colour = SLIME_TYPE_SILVER
/datum/status_effect/stabilized/silver/on_apply()
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- H.physiology.hunger_mod *= 0.8 //20% buff
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_HUNGER_MOD, 0.8)
return ..()
/datum/status_effect/stabilized/silver/on_remove()
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- H.physiology.hunger_mod /= 0.8
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_HUNGER_MOD, 1.25)
//Bluespace has an icon because it's kinda active.
/atom/movable/screen/alert/status_effect/bluespaceslime
@@ -1083,15 +1061,11 @@
qdel(familiar)
/datum/status_effect/stabilized/adamantine/on_apply()
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- H.physiology.damage_resistance += 5
+ owner.damage_resistance += 5
return ..()
/datum/status_effect/stabilized/adamantine/on_remove()
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- H.physiology.damage_resistance -= 5
+ owner.damage_resistance -= 5
/datum/status_effect/stabilized/rainbow
id = "stabilizedrainbow"
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 58fd8ac85995..138a3e872eea 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -526,7 +526,7 @@ GLOBAL_LIST_INIT(slime_extract_auto_activate_reactions, init_slime_auto_activate
return
ADD_TRAIT(user, TRAIT_ADAMANTINE_EXTRACT_ARMOR, ADAMANTINE_EXTRACT_TRAIT)
to_chat(user, span_notice("You feel your skin harden and become more resistant."))
- user.physiology.damage_resistance += 25
+ user.damage_resistance += 25
addtimer(CALLBACK(src, PROC_REF(reset_armor), user), 120 SECONDS)
return 450
@@ -540,7 +540,7 @@ GLOBAL_LIST_INIT(slime_extract_auto_activate_reactions, init_slime_auto_activate
/obj/item/slime_extract/adamantine/proc/reset_armor(mob/living/carbon/human/user)
REMOVE_TRAIT(user, TRAIT_ADAMANTINE_EXTRACT_ARMOR, ADAMANTINE_EXTRACT_TRAIT)
- user.physiology.damage_resistance -= 25
+ user.damage_resistance -= 25
/obj/item/slime_extract/bluespace
name = "bluespace slime extract"
diff --git a/code/modules/shuttle/mobile_port/mobile_port.dm b/code/modules/shuttle/mobile_port/mobile_port.dm
index accd81e22c7b..ae89435719a4 100644
--- a/code/modules/shuttle/mobile_port/mobile_port.dm
+++ b/code/modules/shuttle/mobile_port/mobile_port.dm
@@ -503,17 +503,9 @@
/obj/docking_port/mobile/proc/parallax_slowdown()
for(var/place in shuttle_areas)
var/area/shuttle/shuttle_area = place
- shuttle_area.parallax_movedir = FALSE
- if(assigned_transit?.assigned_area)
- assigned_transit.assigned_area.parallax_movedir = FALSE
- var/list/L0 = return_ordered_turfs(x, y, z, dir)
- for (var/thing in L0)
- var/turf/T = thing
- if(!T || !istype(T.loc, area_type))
- continue
- for (var/atom/movable/movable as anything in T)
- if (movable.client_mobs_in_contents)
- movable.update_parallax_contents()
+ shuttle_area.set_parallax_movedir(NONE)
+
+ assigned_transit?.assigned_area?.set_parallax_movedir(NONE)
/obj/docking_port/mobile/proc/check_transit_zone()
if(assigned_transit)
diff --git a/code/modules/shuttle/mobile_port/shuttle_move.dm b/code/modules/shuttle/mobile_port/shuttle_move.dm
index 0397fbe14342..9b22feb9c4b6 100644
--- a/code/modules/shuttle/mobile_port/shuttle_move.dm
+++ b/code/modules/shuttle/mobile_port/shuttle_move.dm
@@ -168,7 +168,7 @@
// Parallax handling
// This needs to be done before the atom after move
- var/new_parallax_dir = FALSE
+ var/new_parallax_dir = NONE
if(istype(new_dock, /obj/docking_port/stationary/transit))
new_parallax_dir = preferred_direction
for(var/i in 1 to areas_to_move.len)
diff --git a/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm b/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm
index 7bd48565a455..b5eba185a258 100644
--- a/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm
+++ b/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm
@@ -29,6 +29,8 @@ All ShuttleMove procs go here
var/mob/living/living_thing = thing
if(living_thing.incorporeal_move) // Don't crush incorporeal things
continue
+ if (isvehicle(living_thing.buckled))
+ living_thing.client?.give_award(/datum/award/achievement/misc/no_parking, living_thing)
living_thing.buckled?.unbuckle_mob(living_thing, force = TRUE)
living_thing.pulledby?.stop_pulling()
living_thing.stop_pulling()
@@ -131,8 +133,6 @@ All ShuttleMove procs go here
if(rotation)
shuttleRotate(rotation, params = ALL)
- update_parallax_contents()
-
SEND_SIGNAL(src, COMSIG_ATOM_AFTER_SHUTTLE_MOVE, oldT)
return TRUE
@@ -169,14 +169,14 @@ All ShuttleMove procs go here
//The old turf has now been given back to the area that turf originaly belonged to
var/area/old_dest_area = newT.loc
- parallax_movedir = old_dest_area.parallax_movedir
+ set_parallax_movedir(old_dest_area.parallax_movedir)
newT.change_area(old_dest_area, src)
shuttle.underlying_areas_by_turf[newT] = old_dest_area
return TRUE
// Called on areas after everything has been moved
/area/proc/afterShuttleMove(new_parallax_dir)
- parallax_movedir = new_parallax_dir
+ set_parallax_movedir(new_parallax_dir)
return TRUE
/area/proc/lateShuttleMove()
diff --git a/code/modules/shuttle/mobile_port/variants/emergency/emergency.dm b/code/modules/shuttle/mobile_port/variants/emergency/emergency.dm
index c96fa9b0f89a..6b680a877951 100644
--- a/code/modules/shuttle/mobile_port/variants/emergency/emergency.dm
+++ b/code/modules/shuttle/mobile_port/variants/emergency/emergency.dm
@@ -10,6 +10,14 @@
. = ..()
setup_shuttle_events()
+ RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, PROC_REF(on_security_level_changed))
+
+/obj/docking_port/mobile/emergency/proc/on_security_level_changed(datum/controller/subsystem/security_level/source)
+ SIGNAL_HANDLER
+ if(src != SSshuttle.emergency)
+ return
+ if(mode == SHUTTLE_CALL || mode == SHUTTLE_RECALL)
+ alert_coeff_change(source.current_security_level.shuttle_call_time_mod)
/obj/docking_port/mobile/emergency/canDock(obj/docking_port/stationary/S)
return SHUTTLE_CAN_DOCK //If the emergency shuttle can't move, the whole game breaks, so it will force itself to land even if it has to crush a few departments in the process
diff --git a/code/modules/shuttle/mobile_port/variants/supply.dm b/code/modules/shuttle/mobile_port/variants/supply.dm
index da042aa93163..db3ef5eaed85 100644
--- a/code/modules/shuttle/mobile_port/variants/supply.dm
+++ b/code/modules/shuttle/mobile_port/variants/supply.dm
@@ -51,6 +51,26 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
port_direction = EAST
movement_force = list("KNOCKDOWN" = 0, "THROW" = 0)
+/obj/docking_port/mobile/supply/Initialize(mapload)
+ . = ..()
+ // Apply speed traits to each shuttle, including ones loaded after roundstart.
+ if(HAS_TRAIT(SSstation, STATION_TRAIT_QUICK_SHUTTLE))
+ callTime *= 0.5
+ RegisterSignal(SSstation, SIGNAL_REMOVETRAIT(STATION_TRAIT_QUICK_SHUTTLE), PROC_REF(on_speed_trait_removed))
+ if(HAS_TRAIT(SSstation, STATION_TRAIT_SLOW_SHUTTLE))
+ callTime *= 1.5
+ RegisterSignal(SSstation, SIGNAL_REMOVETRAIT(STATION_TRAIT_SLOW_SHUTTLE), PROC_REF(on_speed_trait_removed))
+
+// Undo only the applied modifier when an admin reverts the trait in the lobby.
+/obj/docking_port/mobile/supply/proc/on_speed_trait_removed(datum/source, removed_trait)
+ SIGNAL_HANDLER
+ switch(removed_trait)
+ if(STATION_TRAIT_QUICK_SHUTTLE)
+ callTime /= 0.5
+ if(STATION_TRAIT_SLOW_SHUTTLE)
+ callTime /= 1.5
+ UnregisterSignal(source, SIGNAL_REMOVETRAIT(removed_trait))
+
/obj/docking_port/mobile/supply/register()
. = ..()
SSshuttle.supply = src
@@ -233,7 +253,8 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
var/obj/structure/closet/crate = spawning_order.generate(pick_n_take(empty_turfs))
crate.name += " - #[spawning_order.id]"
- SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[spawning_order.pack.get_cost()]", "[spawning_order.pack.name]", "[spawning_order.orderer_rank]"))
+ SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[spawning_order.pack.get_cost()]", "[spawning_order.pack.name]"))
+ SSblackbox.record_feedback("nested tally", "cargo_imports_by_rank", 1, list("[spawning_order.pack.name]", "[spawning_order.orderer_rank]"))
var/from_whom = paying_for_this?.account_holder || "nobody (department order)"
investigate_log("Order #[spawning_order.id] ([spawning_order.pack.name], placed by [key_name(spawning_order.orderer_ckey)]), paid by [from_whom] has shipped.", INVESTIGATE_CARGO)
@@ -315,11 +336,11 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
if(report.exported_atoms.len)
investigate_log("contents sold for [cargo_budget.account_balance - presale_points] [MONEY_NAME]. Contents: [report.exported_atoms.Join(",")]. Message: [msg]", INVESTIGATE_CARGO)
-/*
- Generates a box of mail depending on our exports and imports.
- Applied in the cargo shuttle sending/arriving, by building the crate if the round is ready to introduce mail based on the economy subsystem.
- Then, fills the mail crate with mail, by picking applicable crew who can receive mail at the time to sending.
-*/
+/**
+ * Generates a box of mail depending on our exports and imports.
+ * Applied in the cargo shuttle sending/arriving, by building the crate if the round is ready to introduce mail based on the economy subsystem.
+ * Then, fills the mail crate with mail, by picking applicable crew who can receive mail at the time to sending.
+ */
/obj/docking_port/mobile/supply/proc/create_mail()
//Early return if there's no mail waiting to prevent taking up a slot. We also don't send mails on sundays or holidays.
if(!SSeconomy.mail_waiting || SSeconomy.mail_blocked || SSsecurity_level.current_security_level.disables_mail)
diff --git a/code/modules/spells/spell_types/self/stop_time.dm b/code/modules/spells/spell_types/self/stop_time.dm
index d3e937972fdb..1a9e5d0bbeb8 100644
--- a/code/modules/spells/spell_types/self/stop_time.dm
+++ b/code/modules/spells/spell_types/self/stop_time.dm
@@ -35,6 +35,8 @@
var/list/default_immune_atoms = list()
if(owner_is_immune_to_self_timestop)
default_immune_atoms += cast_on
+
+ SEND_SIGNAL(cast_on, COMSIG_ATOM_STOPPING_TIME, src, default_immune_atoms)
new /obj/effect/timestop/magic(get_turf(cast_on), timestop_range, timestop_duration, default_immune_atoms)
/datum/action/cooldown/spell/timestop/vv_edit_var(var_name, var_value)
diff --git a/code/modules/spells/spell_types/touch/_touch.dm b/code/modules/spells/spell_types/touch/_touch.dm
index 16781e9cbf78..d1020ddaf741 100644
--- a/code/modules/spells/spell_types/touch/_touch.dm
+++ b/code/modules/spells/spell_types/touch/_touch.dm
@@ -308,6 +308,7 @@
if(!can_hit_with_hand(taker, offerer))
return
+ offerer.client?.give_award(/datum/award/achievement/misc/spicy_handshake, offerer)
INVOKE_ASYNC(src, PROC_REF(do_hand_hit), source, taker, offerer)
return COMPONENT_OFFER_INTERRUPT
diff --git a/code/modules/station_goals/vault_mutation.dm b/code/modules/station_goals/vault_mutation.dm
index 650b367e3ee9..5cd16677eb3a 100644
--- a/code/modules/station_goals/vault_mutation.dm
+++ b/code/modules/station_goals/vault_mutation.dm
@@ -38,12 +38,12 @@
/datum/mutation/tough/on_acquiring(mob/living/carbon/human/acquirer)
. = ..()
- acquirer.physiology.brute_mod *= 0.7
+ MODIFY_PHYSIOLOGY(acquirer, BRUTE, 0.7)
ADD_TRAIT(acquirer, TRAIT_PIERCEIMMUNE, GENETIC_MUTATION)
/datum/mutation/tough/on_losing(mob/living/carbon/human/owner)
. = ..()
- owner.physiology.brute_mod /= 0.7
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 1 / 0.7)
REMOVE_TRAIT(owner, TRAIT_PIERCEIMMUNE, GENETIC_MUTATION)
/datum/mutation/dextrous
@@ -70,12 +70,12 @@
/datum/mutation/fire_immunity/on_acquiring(mob/living/carbon/human/acquirer)
. = ..()
- acquirer.physiology.burn_mod *= 0.5
+ MODIFY_PHYSIOLOGY(acquirer, BURN, 0.5)
acquirer.add_traits(list(TRAIT_RESISTHEAT, TRAIT_NOFIRE), GENETIC_MUTATION)
/datum/mutation/fire_immunity/on_losing(mob/living/carbon/human/owner)
. = ..()
- owner.physiology.burn_mod /= 0.5
+ MODIFY_PHYSIOLOGY(owner, BURN, 2)
owner.remove_traits(list(TRAIT_RESISTHEAT, TRAIT_NOFIRE), GENETIC_MUTATION)
/datum/mutation/quick_recovery
@@ -87,11 +87,11 @@
/datum/mutation/quick_recovery/on_acquiring(mob/living/carbon/human/acquirer)
. = ..()
- acquirer.physiology.stun_mod *= 0.5
+ MODIFY_PHYSIOLOGY(acquirer, PHYS_COEFF_STUN, 0.5)
/datum/mutation/quick_recovery/on_losing(mob/living/carbon/human/owner)
. = ..()
- owner.physiology.stun_mod /= 0.5
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_STUN, 2)
/datum/mutation/plasmocile
name = "Plasmocile"
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 240e83c4d3e0..8ea0a51c7875 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -44,7 +44,7 @@
///Defines when a bodypart should not be changed. Example: BP_BLOCK_CHANGE_SPECIES prevents the limb from being overwritten on species gain
var/change_exempt_flags = NONE
///Random flags that describe this bodypart
- var/bodypart_flags = BODYPART_VIRGIN
+ var/bodypart_flags = NONE
///Does this part have an internal or external anatomy biostate? Assigned on init based on biological_state
VAR_FINAL/bio_status = NONE
///Mangling state (interior, exterior) of the bodypart
@@ -262,6 +262,8 @@
/obj/item/bodypart/Initialize(mapload)
. = ..()
+ bodypart_flags |= BODYPART_VIRGIN
+
if(can_be_disabled)
RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS), PROC_REF(on_paralysis_trait_gain))
RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS), PROC_REF(on_paralysis_trait_loss))
@@ -768,6 +770,9 @@
// DARKPACK EDIT CHANGE END
if(owner) // i tried to modularize the below, but the modifications to wounding_dmg and wounding_type cant be extracted to a proc
+ if(!forced)
+ brute *= GET_PHYSIOLOGY(owner, BRUTE)
+ burn *= GET_PHYSIOLOGY(owner, BURN)
var/easy_dismember = HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) // if we have easydismember, we don't reduce damage when redirecting damage to different types (slashing weapons on mangled/skinless limbs attack at 100% instead of 50%)
var/has_exterior = (bio_status & ANATOMY_EXTERIOR)
@@ -1193,7 +1198,7 @@
if(IS_ORGANIC_LIMB(src))
// Try to add a cached blood type data, we must do it in here because for some reason DNA gets initialized AFTER the mob's limbs are created.
// Should be fine as this gets called before all the important stuff happens
- if(is_creating && !(bodypart_flags & ORGAN_VIRGIN))
+ if(is_creating && !(bodypart_flags & BODYPART_VIRGIN))
blood_dna_info = owner.get_blood_dna_list()
// need to remove the synethic blood DNA that is initialized
// wash also adds the blood dna again
@@ -1802,6 +1807,10 @@
factor *= current_gauze.splint_factor
return factor
+/// Returns TRUE if the limb is splinted with gauze or tape with an effective splint factor
+/obj/item/bodypart/proc/is_splinted()
+ return get_splint_factor() < 1
+
/**
* Attempts to use up some of gauze applied
* If we use up all of the gauze, it is deleted
diff --git a/code/modules/surgery/bodyparts/default_parts.dm b/code/modules/surgery/bodyparts/default_parts.dm
index 2f8af6b5e431..41ed775e206d 100644
--- a/code/modules/surgery/bodyparts/default_parts.dm
+++ b/code/modules/surgery/bodyparts/default_parts.dm
@@ -406,6 +406,7 @@
FOOTSTEP_MOB_CLAW,
FOOTSTEP_MOB_HEAVY,
FOOTSTEP_MOB_SHOE,
+ FOOTSTEP_MOB_SYNTHETIC,
)
if(!(footstep_type in supported_types))
stack_trace("Invalid footstep type set on leg: \[[footstep_type]\] \
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index 77e402444ac8..a05cb48a9d2a 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -21,7 +21,7 @@
unarmed_attack_effect = ATTACK_EFFECT_BITE
unarmed_attack_sound = 'sound/items/weapons/bite.ogg'
unarmed_miss_sound = 'sound/items/weapons/bite.ogg'
- unarmed_damage_low = 1 // Yeah, biteing is pretty weak, blame the monkey super-nerf
+ unarmed_damage_low = 1 // Yeah, biting is pretty weak, blame the monkey super-nerf
unarmed_damage_high = 3
unarmed_effectiveness = 0
bodypart_trait_source = HEAD_TRAIT
@@ -127,7 +127,7 @@
else if(brain.suicided || (brain.brainmob && HAS_TRAIT(brain.brainmob, TRAIT_SUICIDED)))
. += span_info("There's a miserable expression on [shown_name]'s face; they must have really hated life. There's no hope of recovery.")
else if(brain.brainmob)
- if(brain.brainmob?.health <= HEALTH_THRESHOLD_DEAD)
+ if(brain.brainmob?.health <= brain.brainmob?.dead_threshold)
. += span_info("It's leaking some kind of... clear fluid? The brain inside must be in pretty bad shape.")
if(brain.brainmob.key || brain.brainmob.get_ghost(FALSE, TRUE))
. += span_info("Its muscles are twitching slightly... It seems to have some life still in it.")
diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm
index 867199baaad6..c457f5e4f8c0 100644
--- a/code/modules/surgery/bodyparts/robot_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm
@@ -111,6 +111,7 @@
change_exempt_flags = BP_BLOCK_CHANGE_SPECIES
dmg_overlay_type = "robotic"
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5)
+ footstep_type = FOOTSTEP_MOB_SYNTHETIC
brute_modifier = 0.8
burn_modifier = 0.8
@@ -167,6 +168,7 @@
change_exempt_flags = BP_BLOCK_CHANGE_SPECIES
dmg_overlay_type = "robotic"
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5)
+ footstep_type = FOOTSTEP_MOB_SYNTHETIC
brute_modifier = 0.8
burn_modifier = 0.8
diff --git a/code/modules/surgery/bodyparts/stumps.dm b/code/modules/surgery/bodyparts/stumps.dm
index 49e4cdf29556..ed808e3a1992 100644
--- a/code/modules/surgery/bodyparts/stumps.dm
+++ b/code/modules/surgery/bodyparts/stumps.dm
@@ -7,7 +7,7 @@
stump_typepath = null
scarrable = FALSE
biological_state = NONE
- bodypart_flags = BODYPART_UNREMOVABLE | BODYPART_STUMP | BODYPART_VIRGIN
+ bodypart_flags = BODYPART_UNREMOVABLE | BODYPART_STUMP
head_flags = NONE
teeth_count = 0 // lol?
@@ -25,7 +25,7 @@
stump_typepath = null
scarrable = FALSE
biological_state = NONE
- bodypart_flags = BODYPART_UNREMOVABLE | BODYPART_STUMP | BODYPART_VIRGIN
+ bodypart_flags = BODYPART_UNREMOVABLE | BODYPART_STUMP
/obj/item/bodypart/leg/left/stump/Initialize(mapload)
. = ..()
@@ -38,7 +38,7 @@
stump_typepath = null
scarrable = FALSE
biological_state = NONE
- bodypart_flags = BODYPART_UNREMOVABLE | BODYPART_STUMP | BODYPART_VIRGIN
+ bodypart_flags = BODYPART_UNREMOVABLE | BODYPART_STUMP
/obj/item/bodypart/leg/right/stump/Initialize(mapload)
. = ..()
@@ -51,7 +51,7 @@
stump_typepath = null
scarrable = FALSE
biological_state = NONE
- bodypart_flags = BODYPART_UNREMOVABLE | BODYPART_STUMP | BODYPART_VIRGIN
+ bodypart_flags = BODYPART_UNREMOVABLE | BODYPART_STUMP
/obj/item/bodypart/arm/left/stump/Initialize(mapload)
. = ..()
@@ -64,7 +64,7 @@
stump_typepath = null
scarrable = FALSE
biological_state = NONE
- bodypart_flags = BODYPART_UNREMOVABLE | BODYPART_STUMP | BODYPART_VIRGIN
+ bodypart_flags = BODYPART_UNREMOVABLE | BODYPART_STUMP
/obj/item/bodypart/arm/right/stump/Initialize(mapload)
. = ..()
diff --git a/code/modules/surgery/operations/_operation.dm b/code/modules/surgery/operations/_operation.dm
index 26396150903f..6a2de74cc97f 100644
--- a/code/modules/surgery/operations/_operation.dm
+++ b/code/modules/surgery/operations/_operation.dm
@@ -784,6 +784,11 @@ GLOBAL_DATUM_INIT(operations, /datum/operation_holder, new)
else
basemod *= 1 + round((drunkness ** 1.5) / 90, 0.1)
+ // DARKPACK EDIT ADD START - Medicine Surgery Speed
+ var/medicine_stat = surgeon.st_get_stat(STAT_MEDICINE)
+ basemod *= (1 - (0.02 * medicine_stat))
+ // DARKPACK EDIT ADD END
+
return basemod
/// Gets the surgery speed modifier for a given mob, based off what sort of table/bed/whatever is on their turf.
diff --git a/code/modules/surgery/operations/operation_dissection.dm b/code/modules/surgery/operations/operation_dissection.dm
index 1ca1e554c7b8..b48cac510b1a 100644
--- a/code/modules/surgery/operations/operation_dissection.dm
+++ b/code/modules/surgery/operations/operation_dissection.dm
@@ -95,6 +95,7 @@
desc = "Valuable scientific data. Use it in an ancient research server to turn it in."
icon = 'icons/obj/service/bureaucracy.dmi'
icon_state = "paper"
+ inhand_icon_state = "paper"
w_class = WEIGHT_CLASS_SMALL
///research points it holds
var/value = 100
diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm
index a96dacdaf921..75315954b4d8 100644
--- a/code/modules/surgery/organs/_organ.dm
+++ b/code/modules/surgery/organs/_organ.dm
@@ -18,7 +18,7 @@
*/
var/slot
/// Random flags that describe this organ
- var/organ_flags = ORGAN_ORGANIC | ORGAN_EDIBLE | ORGAN_VIRGIN
+ var/organ_flags = ORGAN_ORGANIC | ORGAN_EDIBLE
/// Maximum damage the organ can take, ever.
var/maxHealth = STANDARD_ORGAN_THRESHOLD
/**
@@ -84,6 +84,7 @@ INITIALIZE_IMMEDIATE(/obj/item/organ)
/obj/item/organ/Initialize(mapload)
. = ..()
+ organ_flags |= ORGAN_VIRGIN
blood_dna_info = list("Unknown DNA" = get_blood_type(/datum/blood_type/human/o_plus))
if(organ_flags & ORGAN_EDIBLE)
AddComponentFrom(
diff --git a/code/modules/surgery/organs/external/_visual_organs.dm b/code/modules/surgery/organs/external/_visual_organs.dm
index c2d1e07f0d00..ac0547b4e486 100644
--- a/code/modules/surgery/organs/external/_visual_organs.dm
+++ b/code/modules/surgery/organs/external/_visual_organs.dm
@@ -112,7 +112,10 @@ Unlike normal organs, we're actually inside a persons limbs at all times
organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL
/datum/bodypart_overlay/mutant/horns
- layers = list(EXTERNAL_ADJACENT = BODY_ADJ_LAYER)
+ layers = list(
+ EXTERNAL_FRONT = BODY_FRONT_LAYER,
+ EXTERNAL_ADJACENT = BODY_ADJ_LAYER,
+ )
feature_key = FEATURE_HORNS
dyable = TRUE
draw_on_husks = HUSK_OVERLAY_NORMAL
@@ -138,7 +141,10 @@ Unlike normal organs, we're actually inside a persons limbs at all times
organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL
/datum/bodypart_overlay/mutant/frills
- layers = list(EXTERNAL_ADJACENT = BODY_ADJ_LAYER)
+ layers = list(
+ EXTERNAL_FRONT = BODY_FRONT_LAYER,
+ EXTERNAL_ADJACENT = BODY_ADJ_LAYER,
+ )
feature_key = FEATURE_FRILLS
offset_location = UPPER_BODY
diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm
index 9bef1bd4c922..9980352cd7b3 100644
--- a/code/modules/surgery/organs/external/tails.dm
+++ b/code/modules/surgery/organs/external/tails.dm
@@ -94,7 +94,7 @@
/obj/item/organ/tail/proc/start_wag(mob/living/carbon/organ_owner, stop_after = INFINITY)
if(wag_flags & WAG_WAGGING || !(wag_flags & WAG_ABLE)) // we are already wagging
return FALSE
- if(organ_owner.stat == DEAD || organ_owner != owner) // no wagging when owner is dead or tail has been disembodied
+ if(IS_UNCONSCIOUS_OR_CRIT(organ_owner) || organ_owner != owner) // no wagging when owner is ko'd or tail has been disembodied(?)
return FALSE
if(stop_after != INFINITY)
@@ -106,12 +106,13 @@
if(tail_spines_overlay) //if there are spines, they should wag with the tail
tail_spines_overlay.wagging = TRUE
organ_owner.update_body_parts()
- RegisterSignal(organ_owner, COMSIG_LIVING_DEATH, PROC_REF(owner_died))
+ RegisterSignals(organ_owner, list(COMSIG_MOB_STATCHANGE, SIGNAL_ADDTRAIT(TRAIT_KNOCKEDOUT)), PROC_REF(owner_kod))
return TRUE
-/obj/item/organ/tail/proc/owner_died(mob/living/carbon/organ_owner) // Resisting the urge to replace owner with daddy
+/obj/item/organ/tail/proc/owner_kod(mob/living/carbon/organ_owner) // Resisting the urge to replace owner with daddy
SIGNAL_HANDLER
- stop_wag(organ_owner)
+ if(IS_UNCONSCIOUS_OR_CRIT(organ_owner))
+ stop_wag(organ_owner)
///We need some special behaviour for accessories, wrapped here so we can easily add more interactions later
///Returns false if the wag stopping worked, true otherwise
@@ -132,7 +133,7 @@
return succeeded
organ_owner.update_body_parts()
- UnregisterSignal(organ_owner, COMSIG_LIVING_DEATH)
+ UnregisterSignal(organ_owner, list(COMSIG_MOB_STATCHANGE, SIGNAL_ADDTRAIT(TRAIT_KNOCKEDOUT)))
return succeeded
/obj/item/organ/tail/proc/get_butt_sprite()
diff --git a/code/modules/surgery/organs/external/wings/wings.dm b/code/modules/surgery/organs/external/wings/wings.dm
index 9229c4b78351..7adb9f8c2aab 100644
--- a/code/modules/surgery/organs/external/wings/wings.dm
+++ b/code/modules/surgery/organs/external/wings/wings.dm
@@ -206,7 +206,7 @@
///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
+ MODIFY_PHYSIOLOGY(human, PHYS_COEFF_STUN, 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)
@@ -215,9 +215,10 @@
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()
+ RegisterSignal(human, COMSIG_HUMAN_SPEC_STUN, PROC_REF(on_spec_stun))
return
- human.physiology.stun_mod *= 0.5
+ MODIFY_PHYSIOLOGY(human, PHYS_COEFF_STUN, 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)
@@ -225,6 +226,14 @@
to_chat(human, span_notice("You settle gently back onto the ground..."))
close_wings()
human.refresh_gravity()
+ UnregisterSignal(human, COMSIG_HUMAN_SPEC_STUN)
+
+/obj/item/organ/wings/proc/on_spec_stun(datum/source, list/amount)
+ SIGNAL_HANDLER
+ if(owner.buckled)
+ return
+ toggle_flight(owner)
+ INVOKE_ASYNC(src, PROC_REF(fly_slip), owner)
///Spread wings. Activate Jetpack component
/obj/item/organ/wings/proc/open_wings()
diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm
index 2f57cc04f5dc..1982c705c2e7 100644
--- a/code/modules/surgery/organs/internal/eyes/_eyes.dm
+++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm
@@ -51,7 +51,7 @@
var/obj/effect/abstract/eyelid_effect/eyelid_left
var/obj/effect/abstract/eyelid_effect/eyelid_right
- /// Glasses cannot be worn over these eyes. Currently unused
+ /// Glasses cannot be worn over these eyes.
var/no_glasses = FALSE
/// Native FOV that will be applied if a config is enabled
var/native_fov = FOV_90_DEGREES
@@ -136,6 +136,9 @@
/obj/item/organ/eyes/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
+ // Don't forget about the eyelids
+ organ_owner.vis_contents -= eyelid_left
+ organ_owner.vis_contents -= eyelid_right
if(ishuman(organ_owner))
var/mob/living/carbon/human/human_owner = organ_owner
diff --git a/code/modules/surgery/organs/internal/eyes/eyes_augments.dm b/code/modules/surgery/organs/internal/eyes/eyes_augments.dm
index a64bcf5b40e4..8b57b368d313 100644
--- a/code/modules/surgery/organs/internal/eyes/eyes_augments.dm
+++ b/code/modules/surgery/organs/internal/eyes/eyes_augments.dm
@@ -509,7 +509,7 @@
#define IFF_FACTION_EVERYONE "Non-Allies"
/obj/item/organ/eyes/robotic/tacvisor
- name = "tactical EFF visor"
+ name = "tactical IFF visor"
desc = "A failed attempt at integrating IFF systems directly into soldiers' prefrontal cortex, this complex sensor array has proved to be impractical as the additional load impared the user's ability to recognize people's appearances or voices. The screen is there just for intimidation."
icon_state = "eyes_tacvisor"
eye_icon_state = "eyes_tacvisor"
@@ -949,10 +949,22 @@
), COLORSPACE_HSL)
/obj/item/organ/eyes/robotic/tacvisor/deathsquad
+ name = "Deathsquad IFF Visor"
friendly_faction = IFF_FACTION_CENTCOM
hostile_faction = IFF_FACTION_EVERYONE
actions_types = null
user_controls = FALSE
+ organ_traits = list(TRAIT_THERMAL_VISION)
+
+/obj/item/organ/eyes/robotic/tacvisor/deathsquad/on_examine(mob/source, atom/target, list/examine_strings, list/examine_overrides)
+
+ if (target == owner || !iscarbon(target) && !(isliving(target) && (obj_flags & EMAGGED)))
+ return
+
+ if(get_iff_signature(target) == IFF_FRIENDLY)
+ examine_overrides[EXAMINE_OVERRIDE_PRIORITY_IFF] = span_notice("CentCom personnel. Do not attack.")
+ else
+ examine_overrides[EXAMINE_OVERRIDE_PRIORITY_IFF] = span_boldwarning("KILL KILL KILL KILL KILL KILL!!!")
/obj/item/organ/eyes/robotic/tacvisor/deathsquad/ui_status(mob/user, datum/ui_state/state)
return UI_CLOSE
diff --git a/code/modules/surgery/organs/internal/fangs/_fangs.dm b/code/modules/surgery/organs/internal/fangs/_fangs.dm
new file mode 100644
index 000000000000..23a95c315120
--- /dev/null
+++ b/code/modules/surgery/organs/internal/fangs/_fangs.dm
@@ -0,0 +1,118 @@
+/obj/item/organ/fangs
+ name = "fangs"
+ desc = "Big pointy fangs. Used for biting."
+ icon_state = "fangs"
+ zone = BODY_ZONE_PRECISE_MOUTH
+ slot = ORGAN_SLOT_FANGS
+ attack_verb_continuous = list("chews", "bites", "chomps", "gnaws", "mauls")
+ attack_verb_simple = list("chew", "bite", "chomp", "gnaw", "maul")
+ organ_traits = list(TRAIT_REFINED_BITER)
+ // Vars for improving the head limb's unarmed potential, which is how we apply our fangs as a weapon.
+ // Low force for our bite
+ var/bite_low = 4
+ // High force for our bite.
+ var/bite_high = 7
+ // Bite effectivesnss, which improved accuracy and penetration.
+ var/bite_effectiveness = 10
+ // How much extra damage gained from biting a grabbed target.
+ var/bite_pummeling_bonus = 0.5
+ // The attack effect of our bite.
+ var/bite_attack_effect = ATTACK_EFFECT_BITE
+ // The sharpness of our bite.
+ var/bite_sharpness = SHARP_EDGED
+
+/obj/item/organ/fangs/on_bodypart_insert(obj/item/bodypart/head)
+ . = ..()
+ head.unarmed_damage_low += bite_low
+ head.unarmed_damage_high += bite_high
+ head.unarmed_effectiveness += bite_effectiveness
+ head.unarmed_pummeling_bonus += bite_pummeling_bonus
+ head.unarmed_attack_effect = bite_attack_effect
+ head.unarmed_sharpness = bite_sharpness
+
+/obj/item/organ/fangs/on_bodypart_remove(obj/item/bodypart/head)
+ . = ..()
+ head.unarmed_damage_low -= bite_low
+ head.unarmed_damage_high -= bite_high
+ head.unarmed_effectiveness -= bite_effectiveness
+ head.unarmed_pummeling_bonus -= bite_pummeling_bonus
+ head.unarmed_attack_effect = initial(head.unarmed_attack_effect)
+ head.unarmed_sharpness = initial(head.unarmed_sharpness)
+
+/obj/item/organ/fangs/cat
+ name = "cat fangs"
+ organ_traits = null
+ actions_types = list(/datum/action/item_action/organ_action/go_feral)
+ var/feral_mode = FALSE
+
+/obj/item/organ/fangs/cat/on_bodypart_insert(obj/item/bodypart/head)
+ . = ..()
+ if(feral_mode)
+ add_organ_trait(TRAIT_FERAL_BITER)
+
+/obj/item/organ/fangs/cat/on_bodypart_remove(obj/item/bodypart/head)
+ . = ..()
+ remove_organ_trait(TRAIT_FERAL_BITER)
+
+/obj/item/organ/fangs/cat/on_mob_insert(mob/living/carbon/receiver, special, movement_flags)
+ . = ..()
+ RegisterSignal(receiver, COMSIG_HUMAN_PUNCHED, PROC_REF(nommies))
+
+/obj/item/organ/fangs/cat/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
+ . = ..()
+ UnregisterSignal(organ_owner, COMSIG_HUMAN_PUNCHED)
+
+/obj/item/organ/fangs/cat/proc/toggle_feral()
+ feral_mode = !feral_mode
+ if(feral_mode)
+ add_organ_trait(TRAIT_FERAL_BITER)
+ else
+ remove_organ_trait(TRAIT_FERAL_BITER)
+
+/obj/item/organ/fangs/cat/proc/nommies(mob/living/source, mob/living/target, damage, attack_type, atk_effect, obj/item/bodypart/affecting, final_armor_block, limb_sharpness)
+ SIGNAL_HANDLER
+
+ if(source != target && atk_effect == ATTACK_EFFECT_BITE && (target.mob_biotypes & MOB_ORGANIC)) //Good for you. You probably just ate someone alive.
+ var/datum/reagents/tasty_meal = new()
+ tasty_meal.add_reagent(/datum/reagent/consumable/nutriment/protein, round(damage/3, 1))
+ tasty_meal.trans_to(source, tasty_meal.total_volume, transferred_by = source, methods = INGEST)
+
+/obj/item/organ/fangs/lizard
+ name = "lizard fangs"
+
+/obj/item/organ/fangs/lizard/ash
+ name = "corrupted lizard fangs"
+ bite_high = 12
+ bite_effectiveness = 15
+ bite_pummeling_bonus = 0.5
+
+/obj/item/organ/fangs/cybernetic
+ name = "cybernetic fangs"
+ desc = "A set of fangs made from plastitanium. Extremely lethal."
+ icon_state = "fangs_cyber"
+ organ_flags = ORGAN_ROBOTIC
+ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.25, /datum/material/plasma = SHEET_MATERIAL_AMOUNT * 0.5, /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 0.5)
+ bite_low = 9
+ bite_high = 15
+ bite_effectiveness = 15
+ bite_pummeling_bonus = 0.5
+
+/obj/item/organ/fangs/cat/cybernetic
+ name = "cybernetic cat fangs"
+ desc = "A set of fangs made from plastitanium. Extremely lethal. These ones look suited to a felinid. Might leave you feeling a little... feral."
+ icon_state = "fangs_cyber_cat"
+ organ_flags = ORGAN_ROBOTIC
+ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.25, /datum/material/plasma = SHEET_MATERIAL_AMOUNT * 0.5, /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 0.5)
+ bite_low = /obj/item/organ/fangs/cybernetic::bite_low
+ bite_high = /obj/item/organ/fangs/cybernetic::bite_high
+ bite_effectiveness = /obj/item/organ/fangs/cybernetic::bite_effectiveness
+ bite_pummeling_bonus = /obj/item/organ/fangs/cybernetic::bite_pummeling_bonus
+
+/obj/item/organ/fangs/cat/cybernetic/emp_act(severity)
+ . = ..()
+ if(. & EMP_PROTECT_SELF)
+ return
+ var/obj/item/organ/tongue/tongue_to_bite = owner
+ if(tongue_to_bite)
+ to_chat(owner, span_danger("You bite down on your own tongue!"))
+ tongue_to_bite.apply_organ_damage(bite_high)
diff --git a/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm b/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm
index a4e2da4fca64..7d61a4fcfd2e 100644
--- a/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm
+++ b/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm
@@ -6,7 +6,7 @@
name = "reagent processing crystal"
desc = "A large crystal that is somehow capable of metabolizing chemicals, these are found in plasmamen."
icon_state = "liver-p"
- organ_flags = ORGAN_MINERAL
+ organ_flags = parent_type::organ_flags | ORGAN_ORGANIC
organ_traits = list(TRAIT_PLASMA_LOVER_METABOLISM)
milk_burn_healing = 0
diff --git a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm
index 74303414beef..fa9829ec89db 100644
--- a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm
+++ b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm
@@ -8,6 +8,7 @@
desc = "You have no idea what this strange ball of bones does."
icon_state = "liver-bone"
organ_traits = list(TRAIT_STABLELIVER)
+ organ_flags = ORGAN_MINERAL
///Var for brute healing via milk
var/milk_brute_healing = 2.5
///Var for burn healing via milk
diff --git a/code/modules/surgery/organs/internal/lungs/_lungs.dm b/code/modules/surgery/organs/internal/lungs/_lungs.dm
index 8efbbe44f135..c14e4411bcbd 100644
--- a/code/modules/surgery/organs/internal/lungs/_lungs.dm
+++ b/code/modules/surgery/organs/internal/lungs/_lungs.dm
@@ -461,6 +461,13 @@
// Inhale Miasma. Exhale nothing.
breathe_gas_volume(breath, /datum/gas/miasma)
// Miasma side effects
+ if (prob(0.5 * miasma_pp))
+ for (var/datum/disease as anything in breather.diseases)
+ if (is_type_in_list(disease, GLOB.floor_diseases))
+ return
+ var/random_disease = pick_weight(GLOB.floor_diseases)
+ var/datum/disease/inflicted_disease = new random_disease
+ breather.ForceContractDisease(inflicted_disease, del_on_fail = TRUE)
if (HAS_TRAIT(breather, TRAIT_ANOSMIA)) //Anosmia quirk holder cannot smell miasma, but can get diseases from it.
return
switch(miasma_pp)
@@ -905,6 +912,7 @@
safe_oxygen_min = 0 //We don't breathe this
safe_plasma_min = 4 //We breathe THIS!
safe_plasma_max = 0
+ organ_flags = ORGAN_MINERAL | ORGAN_ORGANIC
/obj/item/organ/lungs/plasmaman/plasmaman_smoker
name = "smoker plasma filter"
diff --git a/code/modules/surgery/organs/internal/stomach/_stomach.dm b/code/modules/surgery/organs/internal/stomach/_stomach.dm
index 4cf09bc50cec..36284514f61d 100644
--- a/code/modules/surgery/organs/internal/stomach/_stomach.dm
+++ b/code/modules/surgery/organs/internal/stomach/_stomach.dm
@@ -167,8 +167,7 @@
if(SPT_PROB(round(-human.satiety/77), seconds_per_tick))
human.set_jitter_if_lower(10 SECONDS)
hunger_rate = 3 * HUNGER_FACTOR
- hunger_rate *= hunger_modifier
- hunger_rate *= human.physiology.hunger_mod
+ hunger_rate *= hunger_modifier * GET_PHYSIOLOGY(human, PHYS_COEFF_HUNGER_MOD)
hunger_rate *= CONFIG_GET(number/hunger_modifier) // DARKPACK EDIT ADD
human.adjust_nutrition(-hunger_rate * seconds_per_tick)
@@ -196,18 +195,6 @@
to_chat(human, span_notice("You no longer feel vigorous."))
human.metabolism_efficiency = 1
- //Hunger slowdown for if mood isn't enabled
- if(CONFIG_GET(flag/disable_human_mood))
- handle_hunger_slowdown(human)
-
-///for when mood is disabled and hunger should handle slowdowns
-/obj/item/organ/stomach/proc/handle_hunger_slowdown(mob/living/carbon/human/human)
- var/hungry = (500 - human.nutrition) / 5 //So overeat would be 100 and default level would be 80
- if(hungry >= 70)
- human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (hungry / 50))
- else
- human.remove_movespeed_modifier(/datum/movespeed_modifier/hunger)
-
/obj/item/organ/stomach/get_availability(datum/species/owner_species, mob/living/owner_mob)
return owner_species.mutantstomach
@@ -416,9 +403,9 @@
return span_boldwarning("Your stomach cramps in pain!")
/// If damage is high enough, we may end up vomiting out whatever we had stored
-/obj/item/organ/stomach/proc/on_punched(datum/source, mob/living/carbon/human/attacker, damage, attack_type, obj/item/bodypart/affecting, final_armor_block, kicking, limb_sharpness)
+/obj/item/organ/stomach/proc/on_punched(datum/source, mob/living/carbon/human/attacker, damage, attack_type, atk_effect, obj/item/bodypart/affecting, final_armor_block, limb_sharpness)
SIGNAL_HANDLER
- if (!LAZYLEN(stomach_contents) || damage < 9 || final_armor_block || kicking)
+ if (!LAZYLEN(stomach_contents) || damage < 9 || final_armor_block || atk_effect == ATTACK_EFFECT_KICK)
return
if (owner.vomit(MOB_VOMIT_MESSAGE | MOB_VOMIT_FORCE))
// Since we vomited with a force flag, we should've vomited out at least one item
@@ -488,13 +475,7 @@
icon_state = "stomach-bone"
metabolism_efficiency = 0.025 //very bad
organ_traits = list(TRAIT_NOHUNGER)
-
-/obj/item/organ/stomach/moth
- name = "moth stomach"
- desc = "An insectoid stomach adapted to the digestion of textile fibers from the get go. It's estimated that a young mothperson will eat 30 times their body weight in cloth \
- before their stomach can fully produce the enzymes required to digest other matter as well."
- icon_state = "spinner-x"
- organ_traits = list(TRAIT_CLOTH_EATER)
+ organ_flags = ORGAN_MINERAL
/obj/item/organ/stomach/bone/plasmaman
name = "digestive crystal"
@@ -502,6 +483,14 @@
icon_state = "stomach-p"
metabolism_efficiency = 0.06
organ_traits = null
+ organ_flags = parent_type::organ_flags | ORGAN_ORGANIC
+
+/obj/item/organ/stomach/moth
+ name = "moth stomach"
+ desc = "An insectoid stomach adapted to the digestion of textile fibers from the get go. It's estimated that a young mothperson will eat 30 times their body weight in cloth \
+ before their stomach can fully produce the enzymes required to digest other matter as well."
+ icon_state = "spinner-x"
+ organ_traits = list(TRAIT_CLOTH_EATER)
/obj/item/organ/stomach/cybernetic
name = "basic cybernetic stomach"
diff --git a/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm b/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm
index bd0f3d54e142..e47f20c073e5 100644
--- a/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm
+++ b/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm
@@ -36,9 +36,6 @@
stomach_owner.clear_alert(ALERT_ETHEREAL_CHARGE)
stomach_owner.clear_alert(ALERT_ETHEREAL_OVERCHARGE)
-/obj/item/organ/stomach/ethereal/handle_hunger_slowdown(mob/living/carbon/human/human)
- human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (1.5 * (1 - cell.charge() / 100)))
-
/obj/item/organ/stomach/ethereal/proc/charge(datum/source, datum/callback/charge_cell, seconds_per_tick)
SIGNAL_HANDLER
diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm
index b42ce46c0675..4b48fe057c21 100644
--- a/code/modules/surgery/organs/internal/tongue/_tongue.dm
+++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm
@@ -569,6 +569,7 @@
sense_of_taste = FALSE
liked_foodtypes = GROSS | MEAT | RAW | GORE | DAIRY //skeletons eat spooky shit... and dairy, of course
disliked_foodtypes = NONE
+ organ_flags = ORGAN_MINERAL
modifies_speech = TRUE
var/chattering = FALSE
var/phomeme_type = "sans"
@@ -598,6 +599,7 @@
modifies_speech = FALSE
liked_foodtypes = VEGETABLES
disliked_foodtypes = FRUIT | CLOTH
+ organ_flags = parent_type::organ_flags | ORGAN_ORGANIC
languages_native = list(/datum/language/calcic)
emote_sounds = list(
/datum/emote/living/scream::key = list(
@@ -700,39 +702,9 @@
disliked_foodtypes = GROSS | CLOTH | RAW
organ_traits = list(TRAIT_WOUND_LICKER, TRAIT_FISH_EATER, TRAIT_CARPOTOXIN_IMMUNE, TRAIT_CAT_EMOTES_ALLOWED)
languages_native = list(/datum/language/nekomimetic)
- actions_types = list(/datum/action/item_action/organ_action/go_feral)
emote_sounds = list(
/datum/emote/living/carbon/hiss::key = 'sound/mobs/humanoids/felinid/felinid_hiss.ogg',
)
- var/feral_mode = FALSE
-
-/obj/item/organ/tongue/cat/on_bodypart_insert(obj/item/bodypart/head)
- . = ..()
- head.unarmed_damage_low += 4
- head.unarmed_damage_high += 7
- head.unarmed_effectiveness += 10
- head.unarmed_pummeling_bonus += 0.5
- head.unarmed_attack_effect = ATTACK_EFFECT_BITE
- head.unarmed_sharpness = SHARP_EDGED
- if(feral_mode)
- add_organ_trait(TRAIT_FERAL_BITER)
-
-/obj/item/organ/tongue/cat/on_bodypart_remove(obj/item/bodypart/head)
- . = ..()
- head.unarmed_damage_low -= 4
- head.unarmed_damage_high -= 7
- head.unarmed_effectiveness -= 10
- head.unarmed_pummeling_bonus -= 0.5
- head.unarmed_attack_effect = initial(head.unarmed_attack_effect)
- head.unarmed_sharpness = initial(head.unarmed_sharpness)
- remove_organ_trait(TRAIT_FERAL_BITER)
-
-/obj/item/organ/tongue/cat/proc/toggle_feral()
- feral_mode = !feral_mode
- if(feral_mode)
- add_organ_trait(TRAIT_FERAL_BITER)
- else
- remove_organ_trait(TRAIT_FERAL_BITER)
/obj/item/organ/tongue/jelly
name = "jelly tongue"
diff --git a/code/modules/surgery/surgery_tools.dm b/code/modules/surgery/surgery_tools.dm
index 2627e8ea0d3a..4cbe643c2c87 100644
--- a/code/modules/surgery/surgery_tools.dm
+++ b/code/modules/surgery/surgery_tools.dm
@@ -612,6 +612,7 @@
desc = "For setting things right."
icon = 'icons/obj/medical/surgery_tools.dmi'
icon_state = "bonesetter"
+ inhand_icon_state = "bonesetter"
icon_angle = 135
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
@@ -638,6 +639,7 @@
desc = "For filtering the blood."
icon = 'icons/obj/medical/surgery_tools.dmi'
icon_state = "bloodfilter"
+ inhand_icon_state = "bloodfilter"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 0.75, /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT)
diff --git a/code/modules/tgui_input/text.dm b/code/modules/tgui_input/text.dm
index 95eaa02f7edc..00b521e84ab0 100644
--- a/code/modules/tgui_input/text.dm
+++ b/code/modules/tgui_input/text.dm
@@ -37,9 +37,9 @@
return stripped_input(user, message, title, default, PREVENT_CHARACTER_TRIM_LOSS(max_length))
else
if(multiline)
- return input(user, message, title, default) as message|null
+ return trim(input(user, message, title, default) as message|null, max_length)
else
- return input(user, message, title, default) as text|null
+ return trim(input(user, message, title, default) as text|null, max_length)
var/datum/tgui_input_text/text_input = new(user, message, title, default, max_length, multiline, encode, timeout, ui_state)
text_input.ui_interact(user)
text_input.wait()
diff --git a/code/modules/transport/tram/tram_doors.dm b/code/modules/transport/tram/tram_doors.dm
index 686c87f6704a..c1afe286eae8 100644
--- a/code/modules/transport/tram/tram_doors.dm
+++ b/code/modules/transport/tram/tram_doors.dm
@@ -28,7 +28,7 @@
if(!id_tag)
id_tag = assign_random_name()
-/obj/machinery/door/airlock/tram/open(forced = DEFAULT_DOOR_CHECKS)
+/obj/machinery/door/airlock/tram/open(forced = DEFAULT_DOOR_CHECKS, mob/living/opener)
if(welded || locked || seal)
return FALSE
@@ -39,6 +39,8 @@
return FALSE
SEND_SIGNAL(src, COMSIG_AIRLOCK_OPEN, FALSE)
+ if (opener)
+ SEND_SIGNAL(opener, COMSIG_MOB_OPENED_AIRLOCK, forced)
var/animate_open = forced == BYPASS_DOOR_CHECKS ? FALSE : TRUE
set_airlock_state(AIRLOCK_OPENING, animate_open, force_type = forced)
diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm
index 1b69c2bc6501..d6e6e1601122 100644
--- a/code/modules/unit_tests/_unit_tests.dm
+++ b/code/modules/unit_tests/_unit_tests.dm
@@ -222,6 +222,7 @@
#include "interaction_silicon.dm"
#include "interaction_structures.dm"
#include "job_display_order.dm"
+#include "job_icons.dm"
#include "json_savefile_importing.dm"
#include "keybinding_init.dm"
#include "kinetic_crusher.dm"
diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm
index fd3df9786e5a..ae921049dc1b 100644
--- a/code/modules/unit_tests/create_and_destroy.dm
+++ b/code/modules/unit_tests/create_and_destroy.dm
@@ -70,6 +70,13 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE)
if(length(to_del))
for(var/atom/to_kill in to_del)
qdel(to_kill, force = TRUE)
+ // this does clear itself back to null once we leave this loop, but I do not trust
+ // BYOND to not fuck it up in the future. so it goes. this unfortunately makes the other comment
+ // slightly less funny since it means BYOND isn't THAT sinful but whatev, its still funny
+ to_kill = null
+ //This will hold a ref to the last thing we qdel unless we set it to null
+ //Yes, byond is VERY fucking sinful!
+ to_del = null
GLOB.running_create_and_destroy = FALSE
@@ -106,6 +113,7 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE)
var/qdeld_at = oldest_packet[GC_QUEUE_ITEM_GCD_DESTROYED]
oldest_packet_creation = min(qdeld_at, oldest_packet_creation)
+ oldest_packet = null
//If we've found a packet that got del'd later then we finished, then all our shit has been processed
//That said, if there are any pending hard deletes you may NOT sleep, we gotta handle that shit
diff --git a/code/modules/unit_tests/designs.dm b/code/modules/unit_tests/designs.dm
index 2e4b62e2d46f..fc630f52737b 100644
--- a/code/modules/unit_tests/designs.dm
+++ b/code/modules/unit_tests/designs.dm
@@ -24,7 +24,7 @@
if (isnull(current_design.build_path) && isnull(current_design.make_reagent))
TEST_FAIL("Design [design_path] requires materials but does not have either build_path or make_reagent set")
// Design requires no materials but creates stuff
- else if (!isnull(current_design.build_path) || !isnull(current_design.build_path))
+ else if (!isnull(current_design.build_path) || !isnull(current_design.make_reagent))
TEST_FAIL("Design [design_path] requires NO materials but has build_path or make_reagent set")
// Only limbgrowers can use reagents
diff --git a/code/modules/unit_tests/explosion_action.dm b/code/modules/unit_tests/explosion_action.dm
index 6e9abb3c2dc9..a64786b9c8d3 100644
--- a/code/modules/unit_tests/explosion_action.dm
+++ b/code/modules/unit_tests/explosion_action.dm
@@ -85,13 +85,13 @@
// Let's check to make sure the armor system works as expected. Corgi dogs are the only one that have this implemented on the basic level, so let's use that.
var/mob/living/basic/pet/dog/corgi/test_dog = set_up_test_dog()
- // those two items should give us a 100% armor rating, so let's test that to make sure it works (all ex_act checks should now be prob(100)), no room for error.
- EX_ACT(test_dog, EXPLODE_LIGHT) // should do 20 damage (basic animals do a prob() check based on the armor rating, and divide the expected brute loss by 1.5).
- TEST_ASSERT_EQUAL(test_dog.health, MAX_LIVING_HEALTH - 20, "EX_ACT() with EXPLODE_LIGHT severity should have done 20 damage to a corgi with an immune helmet and vest!")
+ // those two items should give us a 100% armor rating, so let's test that to make sure it works (all ex_act checks should deal half damage), no room for error.
+ EX_ACT(test_dog, EXPLODE_LIGHT) // should do 15 damage (basic animals do a prob() check based on the armor rating, and divide the expected brute loss by 1.5).
+ TEST_ASSERT_EQUAL(test_dog.health, MAX_LIVING_HEALTH - 15, "EX_ACT() with EXPLODE_LIGHT severity should have done 15 damage to a corgi with an immune helmet and vest!")
test_dog.revive(ADMIN_HEAL_ALL)
- EX_ACT(test_dog, EXPLODE_HEAVY) // should do 40 damage.
- TEST_ASSERT_EQUAL(test_dog.health, MAX_LIVING_HEALTH - 40, "EX_ACT() with EXPLODE_HEAVY severity should have done 40 damage to a corgi with an immune helmet and vest!")
+ EX_ACT(test_dog, EXPLODE_HEAVY) // should do 30 damage.
+ TEST_ASSERT_EQUAL(test_dog.health, MAX_LIVING_HEALTH - 30, "EX_ACT() with EXPLODE_HEAVY severity should have done 30 damage to a corgi with an immune helmet and vest!")
test_dog.revive(ADMIN_HEAL_ALL)
EX_ACT(test_dog, EXPLODE_DEVASTATE) // this should NOT gib, but should do 500 damage. 500 is a lot but we don't really need to test that exact number here to be honest
diff --git a/code/modules/unit_tests/heretic_rituals.dm b/code/modules/unit_tests/heretic_rituals.dm
index ebc4798d4e5f..391eff65a28a 100644
--- a/code/modules/unit_tests/heretic_rituals.dm
+++ b/code/modules/unit_tests/heretic_rituals.dm
@@ -67,11 +67,18 @@
var/amount_to_create = knowledge.required_atoms[ritual_item_path]
if(islist(ritual_item_path))
ritual_item_path = pick(ritual_item_path)
- for(var/i in 1 to amount_to_create)
- var/obj/item/item = new ritual_item_path(get_turf(our_heretic))
+
+ if(ispath(ritual_item_path, /obj/item/stack))
+ var/obj/item/item = new ritual_item_path(get_turf(our_heretic), amount_to_create)
knowledge.prepare_atom_for_ritual_test(item)
created_atoms += item
+ else
+ for(var/i in 1 to amount_to_create)
+ var/obj/item/item = new ritual_item_path(get_turf(our_heretic))
+ knowledge.prepare_atom_for_ritual_test(item)
+ created_atoms += item
+
// Now, we can ACTUALLY run the ritual. Let's do it.
// Attempt to run the knowledge via the sacrifice rune.
// If do_ritual() returns FALSE with our knowledge, it messed up.
diff --git a/code/modules/unit_tests/icon_state.dm b/code/modules/unit_tests/icon_state.dm
index 986e0598049c..a923a0e4453f 100644
--- a/code/modules/unit_tests/icon_state.dm
+++ b/code/modules/unit_tests/icon_state.dm
@@ -12,7 +12,7 @@
//Add EVEN MORE paths if needed here!
//generate_possible_icon_states_list("your/folder/path/")
var/list/bad_list = list()
- for(var/obj/obj_path as anything in subtypesof(/obj))
+ for(var/obj/obj_path as anything in valid_subtypesof(/obj))
if(ispath(obj_path, /obj/item))
var/obj/item/item_path = obj_path
if(initial(item_path.item_flags) & ABSTRACT)
diff --git a/code/modules/unit_tests/icon_state_inhand.dm b/code/modules/unit_tests/icon_state_inhand.dm
index 53aee8d79708..eb3fd25cf5e9 100644
--- a/code/modules/unit_tests/icon_state_inhand.dm
+++ b/code/modules/unit_tests/icon_state_inhand.dm
@@ -7,7 +7,13 @@
/datum/unit_test/missing_icons/inhand_icon_state/Run()
compile_icon_state_locations()
- for(var/obj/item/item_path as anything in subtypesof(/obj/item))
+ ///Assoc list item type -> a signature of the notice it would print, for condensing notices into one
+ var/list/inhand_notice_signatures = list()
+ ///Assoc list item type -> the suggestion text itself, for condensing notices into one
+ var/list/inhand_notice_suggestions = list()
+
+ // MODsuits and their modules can be skipped here
+ for(var/obj/item/item_path as anything in (valid_subtypesof(/obj/item) - typesof(/obj/item/mod)))
if(initial(item_path.item_flags) & ABSTRACT)
continue
@@ -30,7 +36,8 @@
if(base_icon_state in possible_icon_states)
for(var/file_place in possible_icon_states[base_icon_state])
missing_var_message += (missing_var_message ? " & '[file_place]'" : " - Possible matching sprites for \"[base_icon_state]\" found in: '[file_place]'")
- unset_inhand_var_message += "\n\t[item_path] does not have an inhand_icon_state value[missing_var_message]"
+ inhand_notice_signatures[item_path] = "[base_icon_state]|[lefthand_file]|[righthand_file]|[missing_var_message]"
+ inhand_notice_suggestions[item_path] = missing_var_message
continue
var/match_message
@@ -72,6 +79,22 @@
else if(missing_right)
TEST_FAIL("Missing right inhand sprite for [item_path] in '[righthand_file]'[right_fallback ? ", using fallback icon" : null].\n\tinhand_icon_state = \"[held_icon_state]\"[match_message]")
+ // a parent and its subtypes usually produce the same notice, spamming the same thing multiple times
+ // if the notice is identical then let's combine them into one notice.
+ for(var/path, signature in inhand_notice_signatures)
+ var/obj/item/item_path = path
+ var/combined_notice = FALSE
+ var/obj/item/ancestor = item_path::parent_type
+ while(ispath(ancestor, /obj/item))
+ var/ancestor_signature = inhand_notice_signatures[ancestor]
+ if(!isnull(ancestor_signature))
+ combined_notice = (ancestor_signature == signature)
+ break
+ ancestor = ancestor::parent_type
+ if(combined_notice)
+ continue
+ unset_inhand_var_message += "\n\t[item_path] does not have an inhand_icon_state value[inhand_notice_suggestions[item_path]]"
+
if(fallback_log_message)
TEST_FAIL("Invalid inhand_icon_state values should be set to null if there isn't a valid icon.[fallback_log_message]")
diff --git a/code/modules/unit_tests/icon_state_worn.dm b/code/modules/unit_tests/icon_state_worn.dm
index d0b2cd02e617..3ac27ccf858a 100644
--- a/code/modules/unit_tests/icon_state_worn.dm
+++ b/code/modules/unit_tests/icon_state_worn.dm
@@ -7,7 +7,7 @@
var/list/already_warned_icons = list()
- for(var/obj/item/item_path as anything in (subtypesof(/obj/item) - typesof(/obj/item/mod)))
+ for(var/obj/item/item_path as anything in (valid_subtypesof(/obj/item) - typesof(/obj/item/mod)))
var/cached_slot_flags = initial(item_path.slot_flags)
if(!cached_slot_flags || (cached_slot_flags & ITEM_SLOT_LPOCKET) || (cached_slot_flags & ITEM_SLOT_RPOCKET) || initial(item_path.item_flags) & ABSTRACT)
continue
diff --git a/code/modules/unit_tests/job_icons.dm b/code/modules/unit_tests/job_icons.dm
new file mode 100644
index 000000000000..a91dbda80e07
--- /dev/null
+++ b/code/modules/unit_tests/job_icons.dm
@@ -0,0 +1,9 @@
+/// Tests that all jobs that could be part of the crew manifest (and therefore on the observer menu) has a TGUI icon to display.
+/datum/unit_test/job_icons
+
+/datum/unit_test/job_icons/Run()
+ for(var/datum/job/job as anything in subtypesof(/datum/job))
+ if(!(job::job_flags & JOB_CREW_MANIFEST))
+ continue
+ if(isnull(job::tgui_icon))
+ TEST_FAIL("[job::title] does not have a valid job icon.")
diff --git a/code/modules/unit_tests/medical_wounds.dm b/code/modules/unit_tests/medical_wounds.dm
index 161492a726a9..a629d8fc5598 100644
--- a/code/modules/unit_tests/medical_wounds.dm
+++ b/code/modules/unit_tests/medical_wounds.dm
@@ -12,10 +12,12 @@
var/i = 1
var/list/iter_test_wound_list
- for(iter_test_wound_list in list(list(/datum/wound/blunt/bone/moderate, /datum/wound/blunt/bone/severe, /datum/wound/blunt/bone/critical),\
- list(/datum/wound/slash/flesh/moderate, /datum/wound/slash/flesh/severe, /datum/wound/slash/flesh/critical),\
- list(/datum/wound/pierce/bleed/moderate, /datum/wound/pierce/bleed/severe, /datum/wound/pierce/bleed/critical),\
- list(/datum/wound/burn/flesh/moderate, /datum/wound/burn/flesh/severe, /datum/wound/burn/flesh/critical)))
+ for(iter_test_wound_list in list(
+ list(/datum/wound/blunt/bone/moderate, /datum/wound/blunt/bone/severe, /datum/wound/blunt/bone/critical), \
+ list(/datum/wound/slash/flesh/moderate, /datum/wound/slash/flesh/severe, /datum/wound/slash/flesh/critical), \
+ list(/datum/wound/pierce/bleed/moderate, /datum/wound/pierce/bleed/severe, /datum/wound/pierce/bleed/critical), \
+ list(/datum/wound/burn/flesh/moderate, /datum/wound/burn/flesh/severe, /datum/wound/burn/flesh/critical), \
+ ))
TEST_ASSERT_EQUAL(length(victim.all_wounds), 0, "Patient is somehow wounded before test")
var/datum/wound/iter_test_wound
diff --git a/code/modules/unit_tests/mob_damage.dm b/code/modules/unit_tests/mob_damage.dm
index 21e723282129..9d5e5aac43cb 100644
--- a/code/modules/unit_tests/mob_damage.dm
+++ b/code/modules/unit_tests/mob_damage.dm
@@ -463,8 +463,8 @@
// Basic mobs
var/mob/living/basic/mouse/gray/gusgus = allocate(/mob/living/basic/mouse/gray)
- // give gusgus a damage_coeff of 1 for this test
- gusgus.damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 1, OXY = 1, AGGRAVATED = 1) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE
+ // give gusgus default physiology for this test
+ gusgus.physiology = null //defaults to 1 in each case
// tank mouse
gusgus.maxHealth = 200
@@ -473,8 +473,8 @@
// Simplemobs
var/mob/living/simple_animal/abstract_thing = allocate(/mob/living/simple_animal)
- // give the mob a damage_coeff of 1 for this test
- abstract_thing.damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 1, OXY = 1, AGGRAVATED = 1) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE
+ // give the mob default physiology for this test
+ abstract_thing.physiology = null //defaults to 1 in each case
abstract_thing.maxHealth = 200
test_sanity_simple(abstract_thing)
diff --git a/code/modules/unit_tests/plane_double_transform.dm b/code/modules/unit_tests/plane_double_transform.dm
index fc0245d0c548..b04bdf1c8977 100644
--- a/code/modules/unit_tests/plane_double_transform.dm
+++ b/code/modules/unit_tests/plane_double_transform.dm
@@ -8,6 +8,7 @@
// Hack to account for not having an actual hud
var/datum/plane_master_group/hudless/our_group = allocate(/datum/plane_master_group/hudless)
our_group.our_mob = judger
+ our_group.set_perspective(judger)
our_group.show_hud()
// End hack
diff --git a/code/modules/unit_tests/recycle_recycling.dm b/code/modules/unit_tests/recycle_recycling.dm
index 38d3ed690c97..95177b0ef818 100644
--- a/code/modules/unit_tests/recycle_recycling.dm
+++ b/code/modules/unit_tests/recycle_recycling.dm
@@ -69,7 +69,7 @@
/datum/unit_test/recycler_mmi_with_brain_safety/Run()
var/obj/machinery/recycler/recycler = allocate(/obj/machinery/recycler, get_step(run_loc_floor_bottom_left, EAST))
- var/obj/item/mmi/test_mmi = allocate(/obj/item/mmi, run_loc_floor_bottom_left)
+ var/obj/item/brain_processor/organic/test_mmi = allocate(/obj/item/brain_processor/organic, run_loc_floor_bottom_left)
var/mob/living/brain/test_brain = allocate(/mob/living/brain, run_loc_floor_bottom_left)
// Insert brain into MMI.
test_mmi.brain = test_brain
diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png
index 02d3799db695..854e1df429ba 100644
Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png differ
diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png
index e73da136933e..69705b726303 100644
Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png differ
diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png
index 61c3aa6ec7b2..6fbce765497d 100644
Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png differ
diff --git a/code/modules/unit_tests/spell_timestop.dm b/code/modules/unit_tests/spell_timestop.dm
index f02900f7f8e7..5eae6371efa1 100644
--- a/code/modules/unit_tests/spell_timestop.dm
+++ b/code/modules/unit_tests/spell_timestop.dm
@@ -5,6 +5,14 @@
var/mob/living/carbon/human/dio = allocate(/mob/living/carbon/human/consistent)
var/mob/living/carbon/human/kakyoin = allocate(/mob/living/carbon/human/consistent)
var/mob/living/carbon/human/jotaro = allocate(/mob/living/carbon/human/consistent)
+ var/mob/living/carbon/human/johnathan = allocate(/mob/living/carbon/human/consistent)
+ var/mob/living/basic/guardian/the_world = allocate(/mob/living/basic/guardian)
+ var/mob/living/basic/guardian/star_platinum = allocate(/mob/living/basic/guardian)
+ var/mob/living/basic/guardian/heirophant_green = allocate(/mob/living/basic/guardian)
+
+ the_world.set_summoner(dio)
+ star_platinum.set_summoner(jotaro)
+ heirophant_green.set_summoner(kakyoin)
var/turf/center = run_loc_floor_bottom_left
var/turf/in_range = locate(center.x + 2, center.y + 2, center.z)
@@ -12,19 +20,37 @@
dio.forceMove(center)
kakyoin.forceMove(in_range)
- jotaro.forceMove(out_of_range)
+ jotaro.forceMove(in_range)
+ johnathan.forceMove(out_of_range)
+
+ the_world.manifest(TRUE)
+ star_platinum.manifest(TRUE)
+ heirophant_green.manifest(TRUE)
+
+ TEST_ASSERT_EQUAL(the_world.loc, dio.loc, "Holoparasite failed to manifest")
+
+ var/datum/action/cooldown/spell/timestop/other_timestop = new(jotaro)
+ other_timestop.Grant(jotaro)
var/datum/action/cooldown/spell/timestop/timestop = new(dio)
timestop.spell_requirements = NONE
timestop.Grant(dio)
timestop.Trigger()
+
var/obj/effect/timestop/time_effect = locate() in center
- TEST_ASSERT(time_effect, "Failed to create timestop effect")
- sleep(0.1 SECONDS) // timestop is invoked async so let's just wait
+ TEST_ASSERT_NOTNULL(time_effect, "Failed to create timestop effect")
+ sleep(0.1 SECONDS) // timestop is invoked async so let's give it a moment
- TEST_ASSERT(!dio.IsStun(), "Timestopper should not have frozen themselves when using timestop")
- TEST_ASSERT(kakyoin.IsStun(), "Timestopper should have frozen the target within 2 tiles of range when using timestop")
- TEST_ASSERT(!jotaro.IsStun(), "Timestopper should not have frozen the target outside of 2 tiles of range when using timestop")
+ TEST_ASSERT(!HAS_TRAIT_FROM(dio, TRAIT_IMMOBILIZED, TIMESTOP_TRAIT), "Timestopper should not have frozen themselves when using timestop")
+ TEST_ASSERT(HAS_TRAIT_FROM(kakyoin, TRAIT_IMMOBILIZED, TIMESTOP_TRAIT), "Timestopper should have frozen the target within 2 tiles of range when using timestop")
+ TEST_ASSERT(!HAS_TRAIT_FROM(johnathan, TRAIT_IMMOBILIZED, TIMESTOP_TRAIT), "Timestopper should not have frozen the target outside of 2 tiles of range when using timestop")
+ TEST_ASSERT(!HAS_TRAIT_FROM(jotaro, TRAIT_IMMOBILIZED, TIMESTOP_TRAIT), "Timestopper should not have frozen another timestopper when using timestop")
+ TEST_ASSERT(!HAS_TRAIT_FROM(the_world, TRAIT_IMMOBILIZED, TIMESTOP_TRAIT), "Timestopper should not have frozen their own holoparasite when using timestop")
+ TEST_ASSERT(!HAS_TRAIT_FROM(star_platinum, TRAIT_IMMOBILIZED, TIMESTOP_TRAIT), "Timestopper should not have frozen a holoparsite from another timestopper when using timestop")
+ TEST_ASSERT(HAS_TRAIT_FROM(heirophant_green, TRAIT_IMMOBILIZED, TIMESTOP_TRAIT), "Timestopper shold not frozen a holoparsite from a non-timestopper when using timestop")
// cleanup
qdel(time_effect)
+
+ TEST_ASSERT(!HAS_TRAIT_FROM(kakyoin, TRAIT_IMMOBILIZED, TIMESTOP_TRAIT), "Timestop didn't unfreeze the target after the effect expired")
+ TEST_ASSERT(!HAS_TRAIT_FROM(heirophant_green, TRAIT_IMMOBILIZED, TIMESTOP_TRAIT), "Timestop didn't unfreeze the target's holoparasite after the effect expired")
diff --git a/code/modules/unit_tests/trash_food.dm b/code/modules/unit_tests/trash_food.dm
index 123b190a2483..43e78c255ff8 100644
--- a/code/modules/unit_tests/trash_food.dm
+++ b/code/modules/unit_tests/trash_food.dm
@@ -22,6 +22,7 @@
/obj/item/stack/rods, // kebab
/obj/item/paper/paperslip/fortune, // fortune cookie
/obj/item/dice/fudge, // /obj/item/food/fudgedice
+ /obj/item/wendigo_skull, // you get back the wendigo skull as it mostly acts as bowl.
)
for(var/path in subtypesof(/obj/item/food))
diff --git a/code/modules/unit_tests/washing.dm b/code/modules/unit_tests/washing.dm
index 795c66d018f1..2dd6db7c5f94 100644
--- a/code/modules/unit_tests/washing.dm
+++ b/code/modules/unit_tests/washing.dm
@@ -12,32 +12,42 @@
/datum/unit_test/washing/Run()
for(var/i in subtypesof(/obj/effect/decal/cleanable) + cleanable_bonus_list - uncreatables)
var/atom/movable/to_clean = allocate(i)
- var/mopable = HAS_TRAIT(to_clean, TRAIT_MOPABLE)
-
- clean_sig_caught = 0
- RegisterSignal(to_clean, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean_caught))
- run_loc_floor_bottom_left.wash(CLEAN_ALL)
- // mopables are cleaned when their turf is cleaned
- if(mopable)
- if(clean_sig_caught == 0)
- TEST_FAIL("[i] was not cleaned when its turf was cleaned (cleaning only mopables)!")
- if(clean_sig_caught > 1)
- TEST_FAIL("[i] was cleaned more than once when its turf was cleaned (cleaning only mopables)!")
- // non-mopables require the all_contents = TRUE flag to be cleaned
- else
- if(clean_sig_caught != 0)
- TEST_FAIL("[i] was cleaned when its turf was cleaned (cleaning only mopables)!")
- run_loc_floor_bottom_left.wash(CLEAN_ALL, TRUE)
- if(clean_sig_caught == 0)
- TEST_FAIL("[i] was not cleaned when its turf was cleaned (cleaning all contents)!")
- if(clean_sig_caught > 1)
- TEST_FAIL("[i] was cleaned more than once when its turf was cleaned (cleaning all contents)!")
+ try_clean(to_clean)
if(!QDELETED(to_clean))
if(istype(to_clean, /obj/effect/decal/cleanable))
TEST_FAIL("[i] was not deleted when its turf was cleaned!")
qdel(to_clean)
+ var/obj/item/clothing/shoes/sneakers/black/sneakers = allocate(__IMPLIED_TYPE__)
+ sneakers.add_atom_colour(COLOR_PINK, WASHABLE_COLOUR_PRIORITY)
+ if (!(try_clean(sneakers) & COMPONENT_CLEANED))
+ TEST_FAIL("Painted [sneakers] were not cleaned when washed")
+ if (length(sneakers.atom_colours) >= WASHABLE_COLOUR_PRIORITY && sneakers.atom_colours[WASHABLE_COLOUR_PRIORITY])
+ TEST_FAIL("Painted [sneakers] were not cleaned of their color when washed")
+
+/datum/unit_test/washing/proc/try_clean(atom/movable/to_clean)
+ var/mopable = HAS_TRAIT(to_clean, TRAIT_MOPABLE)
+ var/clean_type = to_clean.type
+ clean_sig_caught = 0
+ RegisterSignal(to_clean, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean_caught))
+ . = run_loc_floor_bottom_left.wash(CLEAN_ALL)
+ // mopables are cleaned when their turf is cleaned
+ if(mopable)
+ if(clean_sig_caught == 0)
+ TEST_FAIL("[clean_type] was not cleaned when its turf was cleaned (cleaning only mopables)!")
+ if(clean_sig_caught > 1)
+ TEST_FAIL("[clean_type] was cleaned more than once when its turf was cleaned (cleaning only mopables)!")
+ // non-mopables require the all_contents = TRUE flag to be cleaned
+ else
+ if(clean_sig_caught != 0)
+ TEST_FAIL("[clean_type] was cleaned when its turf was cleaned (cleaning only mopables)!")
+ . = run_loc_floor_bottom_left.wash(CLEAN_ALL, TRUE)
+ if(clean_sig_caught == 0)
+ TEST_FAIL("[clean_type] was not cleaned when its turf was cleaned (cleaning all contents)!")
+ if(clean_sig_caught > 1)
+ TEST_FAIL("[clean_type] was cleaned more than once when its turf was cleaned (cleaning all contents)!")
+
/datum/unit_test/washing/proc/clean_caught(...)
SIGNAL_HANDLER
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 73561cd0f407..024f37bc62f9 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -92,8 +92,6 @@
var/list/restricted_roles = list()
/// The species able to purchase this uplink item.
var/list/restricted_species = list()
- /// The minimum amount of progression needed for this item to be added to uplinks.
- var/progression_minimum = 0
/// The minimum number of joined players (so not observers) needed for this item to be added to uplinks.
var/population_minimum = 0
/// Whether this purchase is visible in the purchase log.
diff --git a/code/modules/uplink/uplink_items/badass.dm b/code/modules/uplink/uplink_items/badass.dm
index 21f58d9a96df..336a353a6a89 100644
--- a/code/modules/uplink/uplink_items/badass.dm
+++ b/code/modules/uplink/uplink_items/badass.dm
@@ -59,6 +59,7 @@
name = "Clown Costume"
desc = "Nothing is more terrifying than clowns with fully automatic weaponry."
item = /obj/item/storage/backpack/duffelbag/clown/syndie
+ // Not purchaseable from clown ops, because they are already clowns
/datum/uplink_item/badass/costumes/tactical_naptime
name = "Sleepy Time Pajama Bundle"
@@ -66,12 +67,14 @@
item = /obj/item/storage/box/syndie_kit/sleepytime
limited_stock = 1
cant_discount = TRUE
+ purchasable_from = parent_type::purchasable_from | UPLINK_CLOWN_OPS
/datum/uplink_item/badass/costumes/obvious_chameleon
name = "Broken Chameleon Kit"
desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \
Please note that this kit did NOT pass quality control."
item = /obj/item/storage/box/syndie_kit/chameleon/broken
+ purchasable_from = parent_type::purchasable_from | UPLINK_CLOWN_OPS
/datum/uplink_item/badass/costumes/centcom_official
name = "CentCom Official Costume"
diff --git a/code/modules/uplink/uplink_items/bundle.dm b/code/modules/uplink/uplink_items/bundle.dm
index e2feec18ce3a..028fde7445a7 100644
--- a/code/modules/uplink/uplink_items/bundle.dm
+++ b/code/modules/uplink/uplink_items/bundle.dm
@@ -71,7 +71,6 @@
/datum/uplink_item/bundles_tc/surplus
name = "Syndicate Surplus Crate"
desc = "A dusty crate from the back of the Syndicate warehouse delivered directly to you via Supply Pod. \
- If the rumors are true, it will fill it's contents based on your current reputation. \
Contents are sorted to always be worth " + TC_VALUE_SURPLUS + " TC. The Syndicate will only provide one surplus item per agent."
item = /obj/structure/closet/crate // will be replaced in purchase()
cost = 20
@@ -96,8 +95,6 @@
continue
if(!uplink_item.surplus)
continue
- if(handler.not_enough_reputation(uplink_item))
- continue
possible_items += uplink_item
return possible_items
@@ -161,7 +158,7 @@
name = "United Surplus Crate"
desc = "A shiny and large crate to be delivered directly to you via Supply Pod. It has an advanced locking mechanism with an anti-tampering protocol. \
It is recommended that you only attempt to open it by having another agent purchase a Surplus Crate Key. Unite and fight. \
- Rumored to contain a valuable assortment of items based on your current reputation. Contents are sorted to always be worth " + TC_VALUE_SURPLUS + " TC. \
+ Contents are sorted to always be worth " + TC_VALUE_SURPLUS + " TC. \
The Syndicate will only provide one surplus item per agent."
cost = 20
item = /obj/structure/closet/crate/secure/syndicrate
diff --git a/code/modules/uplink/uplink_items/clownops.dm b/code/modules/uplink/uplink_items/clownops.dm
index 6dce44aeef8e..e9ef5de86ddf 100644
--- a/code/modules/uplink/uplink_items/clownops.dm
+++ b/code/modules/uplink/uplink_items/clownops.dm
@@ -30,18 +30,18 @@
purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY
/datum/uplink_item/weapon_kits/clownoppin
- name = "Ultra Hilarious Firing Pin"
+ name = "Ultra Hilarious Firing Pins"
desc = "A firing pin that, when inserted into a gun, makes that gun only useable by clowns and clumsy people and makes that gun honk whenever anyone tries to fire it."
cost = 1 //much cheaper for clown ops than for clowns
- item = /obj/item/firing_pin/clown/ultra
+ item = /obj/item/storage/box/syndie_kit/clownpins
purchasable_from = UPLINK_CLOWN_OPS
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/weapon_kits/clownopsuperpin
- name = "Super Ultra Hilarious Firing Pin"
+ name = "Super Ultra Hilarious Firing Pins"
desc = "Like the ultra hilarious firing pin, except the gun you insert this pin into explodes when someone who isn't clumsy or a clown tries to fire it."
cost = 4 //much cheaper for clown ops than for clowns
- item = /obj/item/firing_pin/clown/ultra/selfdestruct
+ item = /obj/item/storage/box/syndie_kit/clownpins/super
purchasable_from = UPLINK_CLOWN_OPS
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
@@ -152,9 +152,10 @@
purchasable_from = UPLINK_CLOWN_OPS
/datum/uplink_item/badass/clownopclumsinessinjector //clowns can buy this too, but it's in the role-restricted items section for them
- name = "Clumsiness Injector"
- desc = "Inject yourself with this to become as clumsy as a clown... or inject someone ELSE with it to make THEM as clumsy as a clown. Useful for clown operatives who wish to reconnect with their former clownish nature or for clown operatives who wish to torment and play with their prey before killing them."
- item = /obj/item/dnainjector/clumsymut
- cost = 1
+ name = "Clumsiness Anti-Injector"
+ desc = "Inject yourself with this to clownteract your inherent clumsiness. \
+ A must have for operatives who require an extra level of precision for their planned routine."
+ item = /obj/item/dnainjector/anticlumsy
+ cost = 2
purchasable_from = UPLINK_CLOWN_OPS
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
diff --git a/code/modules/uplink/uplink_items/dangerous.dm b/code/modules/uplink/uplink_items/dangerous.dm
index ad8509a3e7cf..dd3e2247fe03 100644
--- a/code/modules/uplink/uplink_items/dangerous.dm
+++ b/code/modules/uplink/uplink_items/dangerous.dm
@@ -71,7 +71,6 @@
name = "Double-Bladed Energy Sword"
desc = "The double-bladed energy sword does slightly more damage than a standard energy sword and will deflect \
energy projectiles it blocks, but requires two hands to wield. It also struggles to protect you from tackles."
- progression_minimum = 30 MINUTES
population_minimum = TRAITOR_POPULATION_LOWPOP
item = /obj/item/dualsaber
diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm
index 1cb2815e6e3d..e45cb34fed94 100644
--- a/code/modules/uplink/uplink_items/device_tools.dm
+++ b/code/modules/uplink/uplink_items/device_tools.dm
@@ -142,13 +142,6 @@
restricted = TRUE
purchasable_from = ~UPLINK_ALL_SYNDIE_OPS
-/datum/uplink_item/device_tools/frame/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source)
- . = ..()
- var/obj/item/disk/computer/virus/frame/target = .
- if(!target)
- return
- target.current_progression = uplink_handler.progression_points
-
/datum/uplink_item/device_tools/failsafe
name = "Failsafe Uplink Code"
desc = "When entered the uplink will self-destruct immediately."
@@ -260,7 +253,6 @@
active gravitational singularities or tesla balls towards it. This will not work when the engine is still \
in containment. Because of its size, it cannot be carried. Ordering this \
sends you a small beacon that will teleport the larger beacon to your location upon activation."
- progression_minimum = 20 MINUTES
item = /obj/item/sbeacondrop
cost = 4
surplus = 0 // not while there isnt one on any station
@@ -271,7 +263,6 @@
desc = "When screwed to wiring attached to a power grid and activated, this large device lights up and places excessive \
load on the grid, causing a station-wide blackout. The sink is large and cannot be stored in most \
traditional bags and boxes. Caution: Will explode if the powernet contains sufficient amounts of energy."
- progression_minimum = 20 MINUTES
item = /obj/item/powersink
cost = 11
limited_stock = 1
diff --git a/code/modules/uplink/uplink_items/explosive.dm b/code/modules/uplink/uplink_items/explosive.dm
index c42dc2a0a399..56c120660f49 100644
--- a/code/modules/uplink/uplink_items/explosive.dm
+++ b/code/modules/uplink/uplink_items/explosive.dm
@@ -88,7 +88,6 @@
name = "Syndicate Minibomb"
desc = "The minibomb is a grenade with a five-second fuse. Upon detonation, it will create a small hull breach \
in addition to dealing high amounts of damage to nearby personnel."
- progression_minimum = 30 MINUTES
item = /obj/item/grenade/syndieminibomb
cost = 2
limited_stock = 4
@@ -115,7 +114,6 @@
transported to you that will teleport the actual bomb to it upon activation. Note that this bomb can \
be defused, and some crew may attempt to do so. \
The bomb core can be pried out and manually detonated with other explosives."
- progression_minimum = 30 MINUTES
item = /obj/item/sbeacondrop/bomb
cost = 11
purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /// Ops get their own version.
diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm
index 8ba4ae0b6293..1279397257ef 100644
--- a/code/modules/uplink/uplink_items/job.dm
+++ b/code/modules/uplink/uplink_items/job.dm
@@ -88,7 +88,7 @@
/datum/uplink_item/role_restricted/syndimmi
name = "Syndicate Brand MMI"
desc = "An MMI modified to give cyborgs laws to serve the Syndicate without having their interface damaged by Cryptographic Sequencers. This will not unlock their hidden modules."
- item = /obj/item/mmi/syndie
+ item = /obj/item/brain_processor/organic/syndie
cost = 2
restricted_roles = list(JOB_ROBOTICIST, JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_CORONER, JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER)
surplus = 0
@@ -268,7 +268,6 @@
movement. The bomb is bulky and cannot be moved; upon ordering this item, a smaller beacon will be \
transported to you that will teleport the actual bomb to it upon activation. Note that this bomb can \
be defused, and some crew may attempt to do so."
- progression_minimum = 15 MINUTES
item = /obj/item/sbeacondrop/clownbomb
cost = 15
restricted_roles = list(JOB_CLOWN)
@@ -329,7 +328,6 @@
some special spider extract from the giant spiders down there. Use this injector on a gold slime core \
to create a few of the same type of spiders we found on the planets over there. They're a bit tame until you \
also give them a bit of sentience though."
- progression_minimum = 30 MINUTES
item = /obj/item/reagent_containers/syringe/spider_extract
population_minimum = TRAITOR_POPULATION_LOWPOP
cost = 10
@@ -342,7 +340,6 @@
withstand extreme pressure and temperatures, and has a mechanical trigger for triggering the transfer valve. Essentially, it turns the explosive force of a bomb into a narrow-angle \
blast wave \"projectile\". Aspiring scientists may find this highly useful, as forcing the pressure shockwave into a narrow angle seems to be able to bypass whatever quirk of physics \
disallows explosive ranges above a certain distance, allowing for the device to use the theoretical yield of a transfer valve bomb, instead of the factual yield. Its simple design makes it easy to conceal."
- progression_minimum = 30 MINUTES
item = /obj/item/gun/blastcannon
cost = 14 //High cost because of the potential for extreme damage in the hands of a skilled scientist.
restricted_roles = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST)
@@ -395,7 +392,6 @@
restricted_roles = list(JOB_MIME)
restricted = TRUE
refundable = FALSE
- progression_minimum = 30 MINUTES
purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY
/datum/uplink_item/role_restricted/concussivedisk
@@ -431,6 +427,5 @@
purchasable_from = parent_type::purchasable_from | UPLINK_SPY
cost = 8
surplus = 50
- progression_minimum = /datum/uplink_item/dangerous/pistol::progression_minimum
population_minimum = /datum/uplink_item/dangerous/pistol::population_minimum
relevant_child_items = /datum/uplink_item/dangerous/pistol::relevant_child_items
diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm
index e008dbca98d2..cc160270ee6d 100644
--- a/code/modules/uplink/uplink_items/nukeops.dm
+++ b/code/modules/uplink/uplink_items/nukeops.dm
@@ -714,6 +714,14 @@
cost = 10
purchasable_from = UPLINK_NUKE_OPS
+/datum/uplink_item/bundles_tc/induction_kit/clown
+ name = "Syndicate Circus Induction Kit"
+ desc = "Found a particularly entertaining and skilled performer on the station? \
+ This kit allows you to induct them into the Syndicate circus! Contains equipment them with all the necessary gear for their new role. \
+ *NOT* for usage with Reinforcements, and does not brainwash the target!"
+ item = /obj/item/storage/box/syndie_kit/induction_kit/clown
+ purchasable_from = UPLINK_CLOWN_OPS
+
/datum/uplink_item/bundles_tc/cowboy
name = "Syndicate Outlaw Kit"
desc = "There've been high tales of an outlaw 'round these parts. A fella so ruthless and efficient no ranger could ever capture 'em. \
@@ -795,7 +803,6 @@
item = /obj/item/storage/box/syndie_kit/romerol
cost = 25
population_minimum = TRAITOR_POPULATION_LOWPOP
- progression_minimum = 30 MINUTES
purchasable_from = UPLINK_ALL_SYNDIE_OPS | UPLINK_TRAITORS // Don't give this to spies
cant_discount = TRUE
@@ -806,7 +813,7 @@
desc = "An upgraded, elite version of the Syndicate MODsuit. It features fireproofing, and also \
provides the user with superior armor and mobility compared to the standard Syndicate MODsuit."
item = /obj/item/mod/control/pre_equipped/elite
- purchasable_from = (UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY)
+ purchasable_from = (UPLINK_SERIOUS_OPS | UPLINK_SPY)
/datum/uplink_item/suits/energy_shield
name = "MODsuit Energy Shield Module"
@@ -873,7 +880,6 @@
item = /obj/item/assault_pod
cost = 30
surplus = 0
- purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS
restricted = TRUE
purchasable_from = UPLINK_FIREBASE_OPS
@@ -883,7 +889,7 @@
In its crowbar configuration, it can be used to force open airlocks. Very useful for entering the station or its departments."
item = /obj/item/crowbar/power/syndicate
cost = 4
- purchasable_from = UPLINK_SERIOUS_OPS | UPLINK_SPY
+ purchasable_from = UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY
/datum/uplink_item/device_tools/medkit
name = "Syndicate Combat Medic Kit"
@@ -892,7 +898,7 @@
for faster healing on the field. Also comes with basic medical tools and sterlizer."
item = /obj/item/storage/medkit/tactical
cost = 4
- purchasable_from = UPLINK_SERIOUS_OPS
+ purchasable_from = UPLINK_ALL_SYNDIE_OPS
/datum/uplink_item/device_tools/medkit/premium
name = "Syndicate Combat Medical Suite"
@@ -910,7 +916,7 @@
desc = "A potion recovered at great risk by undercover Syndicate operatives and then subsequently modified with Syndicate technology. \
Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors."
cost = 4
- purchasable_from = UPLINK_SERIOUS_OPS | UPLINK_SPY
+ purchasable_from = UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY
restricted = TRUE
// Implants
@@ -927,6 +933,7 @@
in any creature, biological or mechanical."
item = /obj/item/storage/box/syndie_kit/imp_deathrattle
cost = 4
+ purchasable_from = UPLINK_ALL_SYNDIE_OPS
/datum/uplink_item/implants/nuclear/microbomb
name = "Microbomb Implant"
@@ -935,7 +942,7 @@
This will permanently destroy your body, however."
item = /obj/item/storage/box/syndie_kit/imp_microbomb
cost = 2
- purchasable_from = UPLINK_SERIOUS_OPS | UPLINK_SPY
+ purchasable_from = UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY
/datum/uplink_item/implants/nuclear/macrobomb
name = "Macrobomb Implant"
@@ -944,6 +951,15 @@
item = /obj/item/storage/box/syndie_kit/imp_macrobomb
cost = 20
restricted = TRUE
+ purchasable_from = UPLINK_ALL_SYNDIE_OPS
+
+/datum/uplink_item/implants/nuclear/macrobomb/fake
+ name = "Fake Macrobomb Implant"
+ desc = "A bomb implant with the same delay as a true macrobomb, but is ultimately no greater than a standard microbomb. \
+ However, its detonation also comes with a surprise that the standard microbomb doesn't..."
+ item = /obj/item/storage/box/syndie_kit/imp_macrobomb_fake
+ cost = /datum/uplink_item/implants/nuclear/microbomb::cost
+ purchasable_from = UPLINK_CLOWN_OPS
/datum/uplink_item/implants/nuclear/deniability
name = "Tactical Deniability Implant"
@@ -1012,7 +1028,7 @@
micro-organism symbiosis to slime-core weaponization, this special Authorization Key can let you push past the boundaries \
of bio-terrorism at breakneck speeds. As a bonus, these labs even come equipped with natural life support! *Plants not included."
item = /obj/item/keycard/syndicate_bio
- purchasable_from = UPLINK_CLOWN_OPS | UPLINK_NUKE_OPS
+ purchasable_from = UPLINK_FIREBASE_OPS
/datum/uplink_item/base_keys/chem_key
name = "Syndicate Chemical Plant Access Card"
@@ -1021,7 +1037,7 @@
can be instantly delivered to your location. Create groundbreaking chemical agents, cook up, sell the best of drugs, \
and listen to the best classic music today!"
item = /obj/item/keycard/syndicate_chem
- purchasable_from = UPLINK_CLOWN_OPS | UPLINK_NUKE_OPS
+ purchasable_from = UPLINK_FIREBASE_OPS
/datum/uplink_item/base_keys/fridge_key
name = "Lopez's Access Card"
@@ -1030,14 +1046,14 @@
pocket during this morning's briefing. He's been looking for it since. Take it, get into the fridge, and cook up whatever \
you need before he gets back. And remember: DON'T TELL ANYONE! -M.T"
item = /obj/item/keycard/syndicate_fridge
- purchasable_from = UPLINK_CLOWN_OPS | UPLINK_NUKE_OPS
+ purchasable_from = UPLINK_FIREBASE_OPS
/datum/uplink_item/base_keys/custodial_key
name = "Syndicate Custodial Access Card"
desc = "Your workplace dirty? No problem! with this card you gain access to the custodial. Containing a janitorial cart \
with some janitorial supplies and an canister of water vapour."
item = /obj/item/keycard/syndicate_custodial
- purchasable_from = UPLINK_CLOWN_OPS | UPLINK_NUKE_OPS
+ purchasable_from = UPLINK_FIREBASE_OPS
// Hats
// It is fundamental for the game's health for there to be a hat crate for nuclear operatives.
diff --git a/code/modules/uplink/uplink_items/stealthy.dm b/code/modules/uplink/uplink_items/stealthy.dm
index e5e39bdcbbf4..0e2223a0bb0e 100644
--- a/code/modules/uplink/uplink_items/stealthy.dm
+++ b/code/modules/uplink/uplink_items/stealthy.dm
@@ -14,7 +14,7 @@
item = /obj/item/gun/syringe/syndicate
cost = 4
surplus = 50
- purchasable_from = ~UPLINK_ALL_SYNDIE_OPS
+ purchasable_from = ~UPLINK_SERIOUS_OPS
/datum/uplink_item/stealthy_weapons/dehy_carp
name = "Dehydrated Space Carp"
@@ -74,7 +74,7 @@
falls asleep, they will be able to move and act."
item = /obj/item/pen/sleepy
cost = 4
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+ purchasable_from = ~UPLINK_FIREBASE_OPS
/datum/uplink_item/stealthy_weapons/origami_kit
@@ -94,7 +94,6 @@
also refuse to use dishonorable ranged weaponry, and armored clothing will make it harder to avoid attacks. \
Comes prepackaged with a set of martial arts clothing!"
item = /obj/item/storage/box/syndicate/sleeping_carp
- progression_minimum = 30 MINUTES
population_minimum = TRAITOR_POPULATION_LOWPOP
cost = 17
surplus = 0
diff --git a/code/modules/uplink/uplink_items/stealthy_tools.dm b/code/modules/uplink/uplink_items/stealthy_tools.dm
index 714430b68cea..d34b0aa85202 100644
--- a/code/modules/uplink/uplink_items/stealthy_tools.dm
+++ b/code/modules/uplink/uplink_items/stealthy_tools.dm
@@ -23,7 +23,7 @@
an artificial intelligence is watching you is useful for knowing when to maintain cover, and finding nearby \
blind spots can help you identify escape routes."
item = /obj/item/multitool/ai_detect
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+ purchasable_from = ~UPLINK_FIREBASE_OPS
cost = 1
/datum/uplink_item/stealthy_tools/chameleon
@@ -116,11 +116,10 @@
desc = "When purchased, a virus will be uploaded to the telecommunication processing servers to temporarily disable themselves."
item = ABSTRACT_UPLINK_ITEM
surplus = 0
- progression_minimum = 15 MINUTES
limited_stock = 1
cost = 4
restricted = TRUE
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //Can still be purchased by loneops to give them an edge.
+ purchasable_from = ~UPLINK_FIREBASE_OPS //Can still be purchased by loneops to give them an edge.
/datum/uplink_item/stealthy_tools/telecomm_blackout/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source)
force_event(/datum/round_event_control/communications_blackout, "a syndicate virus")
@@ -131,11 +130,10 @@
desc = "When purchased, a virus will be uploaded to the engineering processing servers to force a routine power grid check, forcing all APCs on the station to be temporarily disabled."
item = ABSTRACT_UPLINK_ITEM
surplus = 0
- progression_minimum = 15 MINUTES
limited_stock = 1
cost = 6
restricted = TRUE
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //Can still be purchased by loneops to give them an edge.
+ purchasable_from = ~UPLINK_FIREBASE_OPS //Can still be purchased by loneops to give them an edge.
/datum/uplink_item/stealthy_tools/blackout/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source)
force_event(/datum/round_event_control/grid_check, "a syndicate virus")
diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm
index 17efb7432b83..b751ab72b553 100644
--- a/code/modules/vehicles/mecha/_mecha.dm
+++ b/code/modules/vehicles/mecha/_mecha.dm
@@ -541,9 +541,9 @@
if(45 to 65)
examine_text = "It's badly damaged."
if(25 to 45)
- examine_text = "It's heavily damaged."
+ examine_text = span_warning("It's heavily damaged.")
else
- examine_text = "It's falling apart."
+ examine_text = span_warning("It's falling apart!")
return examine_text
diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm
index b5ce4dcfb093..fdb7d3982bf4 100644
--- a/code/modules/vehicles/mecha/mecha_defense.dm
+++ b/code/modules/vehicles/mecha/mecha_defense.dm
@@ -239,7 +239,7 @@
weapon.melee_attack_chain(user, hitmob, modifiers, list("[FORCE_MULTIPLIER]" = (peeling_the_onion/100), "[SILENCE_DEFAULT_MESSAGES]" = TRUE)) //Perform an extra attack on the occupant if all the above conditions pass
/obj/vehicle/sealed/mecha/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
- if(istype(tool, /obj/item/mmi))
+ if(istype(tool, /obj/item/brain_processor))
if(!mmi_move_inside(tool,user))
balloon_alert(user, "initialization of MMI failed!")
return ITEM_INTERACT_BLOCKING
diff --git a/code/modules/vehicles/mecha/mecha_mob_interaction.dm b/code/modules/vehicles/mecha/mecha_mob_interaction.dm
index 3b3411202314..e4c80b8a7f8b 100644
--- a/code/modules/vehicles/mecha/mecha_mob_interaction.dm
+++ b/code/modules/vehicles/mecha/mecha_mob_interaction.dm
@@ -60,7 +60,7 @@
return TRUE
///proc called when a new mmi mob tries to enter this mech
-/obj/vehicle/sealed/mecha/proc/mmi_move_inside(obj/item/mmi/brain_obj, mob/user)
+/obj/vehicle/sealed/mecha/proc/mmi_move_inside(obj/item/brain_processor/brain_obj, mob/user)
if(!(mecha_flags & MMI_COMPATIBLE))
to_chat(user, span_warning("This mecha is not compatible with MMIs!"))
return FALSE
@@ -85,7 +85,7 @@
return FALSE
///proc called when a new mmi mob enters this mech
-/obj/vehicle/sealed/mecha/proc/mmi_moved_inside(obj/item/mmi/brain_obj, mob/user)
+/obj/vehicle/sealed/mecha/proc/mmi_moved_inside(obj/item/brain_processor/brain_obj, mob/user)
if(!(Adjacent(brain_obj) && Adjacent(user)))
return FALSE
if(!brain_obj.brain_check(user))
@@ -96,7 +96,6 @@
to_chat(user, span_warning("[brain_obj] is stuck to your hand, you cannot put it in [src]!"))
return FALSE
- brain_obj.set_mecha(src)
add_occupant(brain_mob)//Note this forcemoves the brain into the mech to allow relaymove
mecha_flags &= ~PANEL_OPEN //Close panel if open
mecha_flags |= SILICON_PILOT
@@ -165,13 +164,12 @@
mob_container.forceMove(newloc)//ejecting mob container
log_message("[mob_container] moved out.", LOG_MECHA)
SStgui.close_user_uis(M, src)
- if(istype(mob_container, /obj/item/mmi))
- var/obj/item/mmi/mmi = mob_container
+ if(istype(mob_container, /obj/item/brain_processor))
+ var/obj/item/brain_processor/mmi = mob_container
if(mmi.brainmob)
ejector.forceMove(mmi)
ejector.reset_perspective()
remove_occupant(ejector)
- mmi.set_mecha(null)
mmi.update_appearance()
setDir(SOUTH)
SEND_SIGNAL(src, COMSIG_MECHA_MOB_EXIT)
diff --git a/code/modules/vehicles/mecha/mecha_wreckage.dm b/code/modules/vehicles/mecha/mecha_wreckage.dm
index 485c6ee82811..5ad5f8bbc867 100644
--- a/code/modules/vehicles/mecha/mecha_wreckage.dm
+++ b/code/modules/vehicles/mecha/mecha_wreckage.dm
@@ -10,11 +10,17 @@
density = TRUE
anchored = FALSE
opacity = FALSE
+ /// What types of items/materials can be salvaged using a welder. Each non-stack subtype can only be salvaged once per wreckage.
var/list/welder_salvage = list(/obj/item/stack/sheet/plasteel, /obj/item/stack/sheet/iron, /obj/item/stack/rods)
+ /// Total number of times that this wreckage can be salvaged.
var/salvage_num = 5
+ /// What types of items/materials can be salvaged using a crowbar. Typically consists of installed mech equipment. Does not interact with salvage_num.
var/list/crowbar_salvage = list()
+ /// Tracks if the cables have been salvaged from the mecha wreckage. Only performed once.
var/wires_removed = FALSE
- var/mob/living/silicon/ai/AI //AIs to be salvaged
+ /// AIs to be salvaged
+ var/mob/living/silicon/ai/ai_pilot
+ /// Intact mech parts list that can be welded off. Only one per type can be removed, to a max of 2, with a 60% chance to skip.
var/list/parts
/obj/structure/mecha_wreckage/Initialize(mapload, mob/living/silicon/ai/AI_pilot)
@@ -30,17 +36,17 @@
parts = null
if(!AI_pilot) //Type-checking for this is already done in mecha/Destroy()
return
- AI = AI_pilot
- AI.apply_damage(150, BURN) //Give the AI a bit of damage from the "shock" of being suddenly shut down
- INVOKE_ASYNC(AI, TYPE_PROC_REF(/mob/living/silicon, death)) //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair.
- AI.forceMove(src) //Put the dead AI inside the wreckage for recovery
+ ai_pilot = AI_pilot
+ ai_pilot.apply_damage(150, BURN) //Give the AI a bit of damage from the "shock" of being suddenly shut down
+ INVOKE_ASYNC(ai_pilot, TYPE_PROC_REF(/mob/living/silicon, death)) //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair.
+ ai_pilot.forceMove(src) //Put the dead AI inside the wreckage for recovery
add_overlay(mutable_appearance('icons/obj/weapons/guns/projectiles.dmi', "green_laser")) //Overlay for the recovery beacon
- AI.controlled_equipment = null
- AI.remote_control = null
+ ai_pilot.controlled_equipment = null
+ ai_pilot.remote_control = null
/obj/structure/mecha_wreckage/Destroy()
- if(AI)
- QDEL_NULL(AI)
+ if(ai_pilot)
+ QDEL_NULL(ai_pilot)
QDEL_LIST(crowbar_salvage)
src.visible_message(span_danger("[src]'s superstructure folds in on itself, collapsing into a heap of unsalvageable scrap!"))
playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE)
@@ -51,7 +57,7 @@
/obj/structure/mecha_wreckage/examine(mob/user)
. = ..()
- if(!AI)
+ if(!ai_pilot)
return
. += span_notice("The AI recovery beacon is active.")
@@ -101,18 +107,18 @@
//Proc called on the wreck by the AI card.
if(interaction != AI_TRANS_TO_CARD) //AIs can only be transferred in one direction, from the wreck to the card.
return
- if(!AI) //No AI in the wreck
+ if(!ai_pilot) //No AI in the wreck
to_chat(user, span_warning("No AI backups found."))
return
cut_overlays() //Remove the recovery beacon overlay
- AI.forceMove(card) //Move the dead AI to the card.
- card.AI = AI
- if(AI.client) //AI player is still in the dead AI and is connected
- to_chat(AI, span_notice("The remains of your file system have been recovered on a mobile storage device."))
+ ai_pilot.forceMove(card) //Move the dead AI to the card.
+ card.AI = ai_pilot
+ if(ai_pilot.client) //AI player is still in the dead AI and is connected
+ to_chat(ai_pilot, span_notice("The remains of your file system have been recovered on a mobile storage device."))
else //Give the AI a heads-up that it is probably going to get fixed.
- AI.notify_revival("You have been recovered from the wreckage!", source = card)
- to_chat(user, "[span_boldnotice("Backup files recovered")]: [AI.name] ([rand(1000,9999)].exe) salvaged from [name] and stored within local memory.")
- AI = null
+ ai_pilot.notify_revival("You have been recovered from the wreckage!", source = card)
+ to_chat(user, "[span_boldnotice("Backup files recovered")]: [ai_pilot.name] ([rand(1000,9999)].exe) salvaged from [name] and stored within local memory.")
+ ai_pilot = null
/obj/structure/mecha_wreckage/gygax
name = "\improper Gygax wreckage"
diff --git a/code/modules/vehicles/mecha/medical/odysseus.dm b/code/modules/vehicles/mecha/medical/odysseus.dm
index 2ee32c4f53e1..8cf57971cbbe 100644
--- a/code/modules/vehicles/mecha/medical/odysseus.dm
+++ b/code/modules/vehicles/mecha/medical/odysseus.dm
@@ -22,7 +22,7 @@
REMOVE_TRAIT(human, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT)
return ..()
-/obj/vehicle/sealed/mecha/odysseus/mmi_moved_inside(obj/item/mmi/MMI, mob/user)
+/obj/vehicle/sealed/mecha/odysseus/mmi_moved_inside(obj/item/brain_processor/MMI, mob/user)
. = ..()
if(!. || isnull(MMI.brainmob))
return
diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm
index a9e74c6d406e..fb6417973f4a 100644
--- a/code/modules/vending/games.dm
+++ b/code/modules/vending/games.dm
@@ -110,6 +110,7 @@
/obj/item/clothing/shoes/wheelys/rollerskates= 3,
/obj/item/melee/skateboard/pro = 3,
/obj/item/melee/skateboard/hoverboard = 1,
+ /obj/item/music_tape/robocop = 1,
)
refill_canister = /obj/item/vending_refill/games
default_price = PAYCHECK_CREW
diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm
index 978af216fafc..351e2b713f59 100644
--- a/code/modules/vending/toys.dm
+++ b/code/modules/vending/toys.dm
@@ -7,16 +7,35 @@
product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!"
vend_reply = "Come back for more!"
light_mask = "donksoft-light-mask"
- products = list(
- /obj/item/card/emagfake = 4,
- /obj/item/hot_potato/harmless/toy = 4,
- /obj/item/toy/sword = 12,
- /obj/item/toy/foamblade = 12,
- /obj/item/gun/ballistic/automatic/pistol/toy = 8,
- /obj/item/gun/ballistic/automatic/toy = 8,
- /obj/item/gun/ballistic/shotgun/toy = 8,
- /obj/item/ammo_box/foambox/mini = 20,
+ product_categories = list(
+ list(
+ "name" = "toys",
+ "icon" = "gifts",
+ "products" = list(
+ /obj/item/card/emagfake = 4,
+ /obj/item/hot_potato/harmless/toy = 4,
+ /obj/item/toy/sword = 12,
+ /obj/item/toy/foamblade = 12,
+ /obj/item/gun/ballistic/automatic/pistol/toy = 8,
+ /obj/item/gun/ballistic/automatic/toy = 8,
+ /obj/item/gun/ballistic/shotgun/toy = 8,
+ /obj/item/ammo_box/foambox/mini = 20,
+ )
+ ),
+ list(
+ "name" = "pillow weapons",
+ "icon" = "bed",
+ "products" = list(
+ /obj/item/shield/mattress = 10,
+ /obj/item/spear/pillow = 10,
+ /obj/item/spear/pillow = 10,
+ /obj/item/pillow/clown = 10,
+ /obj/item/pillow/mime = 10,
+ )
+
+ )
)
+
contraband = list(
/obj/item/toy/balloon/syndicate = 1,
/obj/item/gun/ballistic/shotgun/toy/crossbow = 8,
diff --git a/code/modules/vending/vendor/tilting.dm b/code/modules/vending/vendor/tilting.dm
index 8aac3f3209ea..e59e7449f5ea 100644
--- a/code/modules/vending/vendor/tilting.dm
+++ b/code/modules/vending/vendor/tilting.dm
@@ -72,7 +72,7 @@
if (iscarbon(living_target))
var/mob/living/carbon/carbon_target = living_target
if(prob(30))
- carbon_target.apply_damage(max(0, adjusted_damage), damage_type, blocked = blocked, forced = TRUE, spread_damage = TRUE, attack_direction = crush_dir) // the 30% chance to spread the damage means you escape breaking any bones
+ carbon_target.apply_damage(max(0, adjusted_damage), damage_type, blocked = blocked, spread_damage = TRUE, attack_direction = crush_dir) // the 30% chance to spread the damage means you escape breaking any bones
else
var/brute = (damage_type == BRUTE ? damage : 0) * 0.5
var/burn = (damage_type == BURN ? damage : 0) * 0.5
@@ -80,7 +80,7 @@
carbon_target.take_bodypart_damage(brute, burn, check_armor = TRUE, wound_bonus = 5)
carbon_target.AddElement(/datum/element/squish, 80 SECONDS)
else
- living_target.apply_damage(adjusted_damage, damage_type, blocked = blocked, forced = TRUE, attack_direction = crush_dir)
+ living_target.apply_damage(adjusted_damage, damage_type, blocked = blocked, attack_direction = crush_dir)
living_target.Paralyze(paralyze_time)
living_target.emote("scream")
diff --git a/code/modules/vending/youtool.dm b/code/modules/vending/youtool.dm
index c339c2d687a9..0aaede9e9c86 100644
--- a/code/modules/vending/youtool.dm
+++ b/code/modules/vending/youtool.dm
@@ -21,6 +21,7 @@
)
contraband = list(
/obj/item/clothing/gloves/color/fyellow = 2,
+ /obj/item/boombox = 1,
)
premium = list(
/obj/item/storage/belt/utility = 2,
diff --git a/code/modules/wiremod/components/action/mmi.dm b/code/modules/wiremod/components/action/mmi.dm
index d75219018528..827e11d84069 100644
--- a/code/modules/wiremod/components/action/mmi.dm
+++ b/code/modules/wiremod/components/action/mmi.dm
@@ -48,7 +48,7 @@
var/datum/port/output/secondary_attack
/// The current MMI/posibrain
- var/obj/item/mmi/brain
+ var/obj/item/brain_processor/brain
/// The current B.O.R.I.S. module
var/obj/item/borg/upgrade/ai/boris
@@ -129,10 +129,10 @@
/obj/item/circuit_component/mmi/proc/handle_interaction(atom/movable/shell, mob/living/user, obj/item/item)
SIGNAL_HANDLER
- var/obj/item/mmi/target_mmi
+ var/obj/item/brain_processor/target_mmi
var/mob/living/new_occupant
var/obj/item/borg/upgrade/ai/target_boris
- if(istype(item, /obj/item/mmi))
+ if(istype(item, /obj/item/brain_processor))
target_mmi = item
if(!target_mmi.brainmob)
shell.balloon_alert(user, "no consciousness detected!")
@@ -202,7 +202,7 @@
removing = boris
if(!removing)
return
- if(istype(removing, /obj/item/mmi))
+ if(istype(removing, /obj/item/brain_processor))
brain = null
if(istype(removing, /obj/item/borg/upgrade/ai))
boris = null
diff --git a/config/darkpack_config.txt b/config/darkpack_config.txt
index 0a1004509735..8febda250ea5 100644
--- a/config/darkpack_config.txt
+++ b/config/darkpack_config.txt
@@ -109,6 +109,12 @@ DISCIPLINE_KEYBINDS
## Gives every single power a keybind, will majorly clutter the keybinds menu if uncommented in exchange for being very convenient for players
#INDIVIDUAL_POWER_KEYBINDS
+## Flags for discipline teaching. Four settings here - full, rares disabled, in clans only, or disabled.
+## 0 - Full discipline teaching allowed
+## 1 - A player can only teach non-rare disciplines (potence, fortitude, etc allowed. temporis & thaumaturgy, disallowed)
+## 2 - A player can only teach in clan disciplines (A Gangrel can teach a Tremere Protean, but the Tremere can't teach anyone Protean)
+## 3 - Discipline teaching is fully disabled (no one will be able to teach anyone anything)
+DISCIPLINE_TEACHING 0
## Configs how long between full moons. Defaults to realtime (default: 29.530588)
LUNAR_CYCLE_INTERVAL 29.530588
diff --git a/config/game_options.txt b/config/game_options.txt
index c58c96e122ec..af6a798dc7c9 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -113,11 +113,6 @@ TRAITOR_SCALING_COEFF 6
BROTHER_SCALING_COEFF 6
CHANGELING_SCALING_COEFF 6
-## Global scaling for traitor progression.
-## Higher values will accelerate traitor progression, while lower values will decrease it.
-## Bypasses an upper limit of 1 MINUTE
-#TRAITOR_SCALING_MULTIPLIER 1
-
## Variables calculate how number of open security officer positions will scale to population.
## Used as (Officers = Population / Coeff)
## Set to 0 to disable scaling and use default numbers instead.
@@ -486,9 +481,6 @@ MICE_ROUNDSTART 10
## This used to be named traits, hence the config name, but it handles quirks, not the other kind of trait!
ROUNDSTART_TRAITS
-## Uncomment to disable human moods.
-DISABLE_HUMAN_MOOD
-
## Enable night shifts
#ENABLE_NIGHT_SHIFTS
diff --git a/html/changelogs/AutoChangeLog-darkpack-pr-1526.yml b/html/changelogs/AutoChangeLog-darkpack-pr-1526.yml
deleted file mode 100644
index 2ea579c6b815..000000000000
--- a/html/changelogs/AutoChangeLog-darkpack-pr-1526.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "FalloutFalcon"
-delete-after: True
-changes:
- - bugfix: "Fixes beastmaster targeting behavior"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-darkpack-pr-1534.yml b/html/changelogs/AutoChangeLog-darkpack-pr-1534.yml
deleted file mode 100644
index 5a8606eccc34..000000000000
--- a/html/changelogs/AutoChangeLog-darkpack-pr-1534.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "FalloutFalcon"
-delete-after: True
-changes:
- - rscadd: "TG and Darkpack changelogs are split by icons instead of just deleting all the TG ones."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-darkpack-pr-1539.yml b/html/changelogs/AutoChangeLog-darkpack-pr-1539.yml
deleted file mode 100644
index ec9f6e499eb8..000000000000
--- a/html/changelogs/AutoChangeLog-darkpack-pr-1539.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "KCartridge"
-delete-after: True
-changes:
- - bugfix: "fix primogen and crosses directional sprites"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-darkpack-pr-1544.yml b/html/changelogs/AutoChangeLog-darkpack-pr-1544.yml
deleted file mode 100644
index 9d91ebf517f2..000000000000
--- a/html/changelogs/AutoChangeLog-darkpack-pr-1544.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "breadcrombs, Wolf-751"
-delete-after: True
-changes:
- - balance: "Bone crafting now takes time when used on a dead body"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-darkpack-pr-1547.yml b/html/changelogs/AutoChangeLog-darkpack-pr-1547.yml
deleted file mode 100644
index 7a6b8081cdaf..000000000000
--- a/html/changelogs/AutoChangeLog-darkpack-pr-1547.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "JohnFulpWillard"
-delete-after: True
-changes:
- - bugfix: "Guestbook now has a scrollbar."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-darkpack-pr-1551.yml b/html/changelogs/AutoChangeLog-darkpack-pr-1551.yml
deleted file mode 100644
index ea53e5e35908..000000000000
--- a/html/changelogs/AutoChangeLog-darkpack-pr-1551.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Uristthedorf"
-delete-after: True
-changes:
- - bugfix: "Methuselah thirst flaw now properly enforces feeding on supernaturals only."
\ No newline at end of file
diff --git a/html/changelogs/archive/2026-09.yml b/html/changelogs/archive/2026-09.yml
index 8ad14b52b7e1..e7b37a279ef9 100644
--- a/html/changelogs/archive/2026-09.yml
+++ b/html/changelogs/archive/2026-09.yml
@@ -74,3 +74,307 @@
than when their owner dies.
Twaticus:
- image: reverts/resprites multiple walls/floors from 'floors and walls pr'
+2026-09-07:
+ ArcaneMusic:
+ - rscadd: 'Added a new machine to the prison labor camp on lavaland: The produceporter.
+ Send grown crops to service staff in exchange for labor points!'
+ - rscadd: The license plate press will now grant 10 labor points every time a new
+ plate is pressed.
+ - qol: The labor camp console can now take a prisoner ID straight from your hand.
+ - sound: Added sfx to the license plate press.
+ FalloutFalcon:
+ - bugfix: 'Chem dispenser custom recipes (and maybe a few other spots) now properly
+ clamp text when using `Input: Enable TGUI`'
+ Maia-J:
+ - bugfix: Mobs that are aggro grabbed and are meant to escape captivity actually
+ do so.
+ Melbert:
+ - bugfix: Fixes some particle effects being invisible when on floor objects (or
+ the floor itself)
+ - bugfix: Players with it/its pronouns don't break radio messages
+ Odairu:
+ - bugfix: AI are no longer stuck in hard crit forever post-revive
+ PapaMichael:
+ - bugfix: pAIs once again have language and navigate buttons on their UI
+ - bugfix: Fixes inverted logic when cutting a cuffed item.
+ - bugfix: Announcements when radiation storms end now properly show
+ Techbot121:
+ - rscadd: hitsounds to cans
+ - sound: added can_hit.ogg
+2026-09-08:
+ Absolucy:
+ - bugfix: Slimes now properly pass down factions and allies to their babies.
+ - bugfix: Fixed progress bars still flashing red when they were completed.
+ ArcaneMusic:
+ - rscadd: cargo can now buy a "gardening" crate on broad spectrum bands filled with
+ pitchforks and torches.
+ - bugfix: Industrial waste now uses shared particles for processing.
+ - bugfix: Industrial waste can no longer be duped.
+ FalloutFalcon:
+ - code_imp: Improves some code which means straightjackets are better caught in
+ cuff resist code
+ JohnFulpWillard:
+ - qol: Changed thumbs up/down & scratch head emote when manually typing to thumbsup,
+ thumbsdown & scratchhead
+ - rscdel: Operating computers no longer has the Experiments tab if there's no research
+ servers in existence.
+ Melbert:
+ - qol: Loot panel objects can be interacted with while lying down.
+ - qol: Loot panel objects can be interacted with at range if you have telekinesis
+ or a weapon with reach.
+ - qol: Blind mobs can see names in the loot panel again, but the panel auto-closes
+ when further than two tiles away.
+ - bugfix: Cables are properly obscured by windows or airlocks
+ PapaMichael:
+ - rscadd: Added tooltips for language icons in chat
+2026-09-10:
+ vinylspiders:
+ - rscdel: deletes a bunch of unused, unreferenced assets from the game
+2026-09-11:
+ ArcaneMusic:
+ - rscadd: Cargo may now buy a brand new, Nanomusic Boombox! Comes free with 1 demo
+ tape. Two additional disks sold separately (as goodies).
+ - rscadd: A familiar-sounding tape has been added to the game's vendor's premium
+ goods.
+ - rscadd: A rare tape has been added to the black market.
+ - rscadd: A rare tape has been added as a bitrunning secondary reward.
+ MelokG000:
+ - rscadd: PLANKMAN-type portable generator! You can now burn wood for power!
+ necromanceranne:
+ - rscadd: Some collars are now able to be cuffed to your arm.
+ vinylspiders:
+ - bugfix: fixes bot move path overlays not showing up
+2026-09-12:
+ OnlineGirlfriend:
+ - rscadd: pinup posters
+ timothymtorres:
+ - rscadd: Add 3 new kudzu mutations - slippery, radioactive, and conductive
+ - rscadd: Venus Flytraps will inherit mutations from kudzu that can be beneficial
+ or negative that can affect stats, abilities, etc.
+ - balance: Halved Venus Flytrap health and regen. Venus Flytraps can no longer move
+ off weeds without taking damage unless they have the aggressive spread mutation.
+ - rscadd: Weedkiller/Plant-B-Gone instakills alien weeds
+ - rscadd: Weedkiller grenades now use weedkiller chemical and not Plant-B-Gone
+ - balance: Halved the damage from Plant-B-Gone vs kudzu and plants
+ - bugfix: Fixed hardening kudzu mutation not providing a 50% resistance to sharpened
+ weapons.
+ - bugfix: Fixed thorn kudzu mutation not retaliating against players who attack
+ it.
+ - qol: Add examine blocks to flavour text for Venus Trap Ghost Spawners that includes
+ their inherited mutations
+2026-09-13:
+ KingkumaArt:
+ - image: added 4 new mech pilot suits, purchasable from cargo!
+2026-09-14:
+ Fghj240:
+ - balance: simplemob bomb armor grants linearly scaling damage reduction vs bombs
+ instead of a random chance to reduce damage
+ - bugfix: bomb immunity works on simplemobs
+ - bugfix: bomb armor now protects simplemobs from being gibbed by explosions
+ - code_imp: simplemob bomb code is less repetitive
+ Melbert:
+ - rscdel: Toy guns no longer have cosmetic recoil effects
+ - balance: Bananium swords are now slippier, particularly in the hands of clowns
+ - balance: Bananium shields are now slippier, particularly in the hands of clowns
+ - balance: Added and removed several items from the clown operative outfit and uplink
+ - spellcheck: 'Fix blood trail examine: "That''s a trail of blood" instead of "that''s
+ some trail of blood"'
+ timothymtorres:
+ - bugfix: Fix cargo stray supply pod runtime
+ vinylspiders:
+ - bugfix: brings back the tg window icon that mysteriously went missing for a couple
+ days
+ - refactor: changed the way ChangeTurf() handles signal registration, please report
+ any weird issues with stuff that usually happens on entering certain turfs (elevation,
+ bananium squeaks, lava burning things, etc)
+2026-09-15:
+ ArcaneMusic:
+ - qol: All Mechs now have a toggle to trim down the modules pane of the Mech UI.
+ - qol: Mechs will now show their overlock percentage without having it enabled.
+ - spellcheck: Mechs when examined now format their integrity text the same as when
+ other things are falling apart.
+ Jacquerel:
+ - image: Added icons for the achievements "I Was a Teenage Anarchist", "A Bowl-d
+ New World", and "How Do I Switch Hands???"
+ JohnFulpWillard:
+ - rscadd: Added bruise wounds to your hands if you attack people in a near-death
+ state. They show up on autopsies.
+ Melbert:
+ - bugfix: Fixes Kilo's gas turbine burning Atmos down on use
+ Voyaker-coder:
+ - rscadd: Adds a functional firing delay to the Abductor "Shrink Ray" pistol
+ YesterdaysPromise:
+ - rscadd: Added Fonarstolbes, Podsneyzkas, Vahrezjias, Inozhakusts, Plasma Flowers,
+ and Drake Beets as Icebox plantlife and botany plants.
+ - rscadd: 'Added following chemicals: Guidoferrunitian Glycetamine (Found in Fonarstolbes) and
+ Berserk Toxin (Found in Vahrezjias)'
+ - rscadd: Added Nutrient Bars, Iceberg Soup, Drake Borscht, Wolf Goulash, Snowdrake
+ BBQ, Wendigo Killer Feast, and Ice Breaker to cooking recipes.
+ - rscadd: Added Mouthwash (from fermented Inozhakusts), Strong Mouthwash, Stone
+ Cold Stout, Icy Dorf, Ramp Rager, Ice Grave and Frozen-Sea Lantern drinks.
+ sqnztb:
+ - bugfix: radio and entertainment chatter are no longer filtered out by local chat.
+ timothymtorres:
+ - bugfix: Fix supermatter spiders not having web immunity trait
+ vinylspiders:
+ - bugfix: fixes an issue that can cause the holodeck to stop functioning for the
+ entire round
+ - bugfix: the carrier choice dropdown in the bring your pets to work day menu is
+ now visible
+2026-09-16:
+ Fghj240:
+ - spellcheck: cybernetic fangs aren't called advanced in the printer anymore.
+ - bugfix: cybernetic fangs moved to combat cybernetic organs
+ Melbert:
+ - qol: Many, many, many RND designs (primarily computers and machines) now have
+ more informative descriptions that explain what they do, rather than only stating
+ "This is a circuitboard."
+ - spellcheck: Examining a PanD.E.M.I.C 2200, Sheet-meister 2000, or the R&D Server
+ Controller now reads as "That's a [thing]" rather than "That's [thing]".
+ necromanceranne:
+ - balance: The CMO now has an advanced medical scanner in their medkit.
+ - balance: You can now once again print defibrillators and their compact variant
+ (with the researched tech) from cargo.
+ - balance: Defibs now can have their safeties switched off by EMP blasts. However,
+ they reset after a while.
+ - balance: The CMO's unique compact defibrillator has double the recharge rate.
+ vinylspiders:
+ - bugfix: fixes a bug that would cause a goldgrub to sometimes spawn a bugged boulder
+ when hitting a boss vent
+ - bugfix: boss vents can actually give diamonds and bluespace now like they're supposed
+ to
+ - bugfix: fixes an issue where the tooltips on the escape menu buttons would be
+ render behind the buttons themselves
+2026-09-17:
+ FalloutFalcon:
+ - config: Removes "Disable mood" config
+ - code_imp: Dummies have a blank mood datum
+ Jacquerel:
+ - rscadd: Plasmamen wearing a human skin suit won't catch fire. The suit itself
+ is flammable though, so make sure you change while under a shower or something.
+ - rscadd: Breathing Miasma can get you sick with the same diseases you get from
+ eating dirty food off the floor.
+ - bugfix: Bitrunning antagonists can once again escape from an emagged server
+ MrMelbert:
+ - map: '[Icebox] Remapped Atmospherics. The hallway of pain is gone.'
+ - map: '[Icebox] Remapped maintenance around Atmos and Science a bit.'
+ - image: Adds long corner trimline decals
+ PapaMichael:
+ - qol: AI shells now appear "off" when not being actively piloted.
+ Redwizz99:
+ - rscadd: bluspace scrubber and gas receiver machinery
+ - rscadd: bluespace scrubber and gas receiver circuits
+ - rscadd: adds bluespace scubber and gas receiver to tech node
+ - rscadd: sprites for bluespace scrubber and gas receiver
+ - rscadd: you can disconnect scrubbers linked to receiver, just use wirecutter
+2026-09-18:
+ Melbert:
+ - rscdel: 'Heretic: "Crimson Cleave" spell removed.'
+ - rscadd: 'Heretic: Adds "The Crimson Cleaver", a tier four knowledge. A weapon
+ that can cleave and lifesteal. Non-heretics are capable of wielding it, at the
+ expense of their sanity and mind...'
+ - rscadd: 'Heretic: Adds "Rhythmic Lodestone", a tier one knowledge, which lets
+ the heretic track any imbued object with their living heart.'
+ - rscadd: 'Heretic: Adds "Blessed Poppy", a tier one knowledge, which heals wounds
+ and stabilizes mobs. Can be used by non-heretics.'
+ tontyGH:
+ - refactor: Man-Machine Interfaces and positronic brains have been rewritten internally.
+ Please report any unexpected behaviour.
+ vinylspiders:
+ - bugfix: fixes fish food missing their lefthand icon, and boxcutter should show
+ its inhand icon now, as well as a whole bunch of other random items that were
+ not linked up with their existing inhand icon states
+ - rscadd: Adds two new pinup bunny contraband posters
+2026-09-20:
+ Dmeto:
+ - bugfix: Gateway object collision aligns with itself.
+ Gboster-0:
+ - bugfix: pet carrier doors no longer clip through gags + pet carriers visual lock
+ indicator is no longer broken (it was for 2-5 years)
+ Melbert:
+ - spellcheck: '"gas pump" renamed to "pressure pump"'
+ - spellcheck: '"volumetric gas pump" renamed to "volume pump"'
+ - spellcheck: '"pressure valve" renamed to "pressure gate"'
+ - spellcheck: 'In the pipe dispenser UI only: "unary vent" renamed to "pump vent".'
+ - qol: In the pipe dispenser UI, most components now have a tooltip explaining what
+ they do and how they work.
+ PapaMichael:
+ - bugfix: Flashbangs now require both eye and ear protection to mitigate their effects,
+ not just ear protection
+ - rscdel: Removed traitor reputation
+ - balance: Powerful traitor items are no longer timegated
+ SmArtKar:
+ - bugfix: Fixed wounds not disabling limbs when they should, and disabling them
+ when splinted
+ TealSeer:
+ - bugfix: fixed R&D console not showing the name of who queued a research node
+ - bugfix: fixed being unable to dequeue research nodes you queued
+ Y0SH1M4S73R:
+ - rscadd: Relics are now assemblies - they can be attached to wires and connected
+ to other assemblies
+ - bugfix: The dimensional shifting relic effect's cooldown now increases as it was
+ intended to
+ desertmote:
+ - rscadd: You can visually tell how soaked someone is, and the drip VFX doesn't
+ display when you're only marginally wet
+ - image: The electric guitar can now be worn on your back-slot, and has a worn icon
+ state to match
+ necromanceranne:
+ - qol: Rapid part exchange devices now hold significantly more parts, equivalent
+ to their bluespace upgraded version.
+ oranges:
+ - balance: Secure crates are now easier to open thanks to budget cuts
+ the-orange-cow:
+ - bugfix: all directional glow effects work after being taken out of a bag
+ timothymtorres:
+ - code_imp: Add emissive effects to supermatter shards, gas meters, thermomachines,
+ pipe devices (filters, mixers, pumps, valves, etc.), circulator heat exchange,
+ SMESs, and PACMAN generators. Default SM now emits light even when not active.
+ - image: Add light masks to supermatter shards, gas meters, thermomachines, pipe
+ devices (filters, mixers, pumps, valves, etc.), circulator heat exchange, SMESs,
+ and PACMAN generators.
+ - rscadd: Holosigns are now vulnerable to EMPs
+ vinylspiders:
+ - bugfix: fixes runtime/race condition with quick and slow shuttle station traits
+ not being applied, fixes a roundstart runtime caused by alert levels trying
+ to be changed before the shuttle is created.
+2026-09-21:
+ Melbert:
+ - bugfix: You can sell, not buy, Nitrium
+ Richard Blonski:
+ - bugfix: Fixed TTS playing on messages that are out of range to be understood.
+ timothymtorres:
+ - code_imp: Remove unused lung defines
+2026-09-22:
+ ArcaneMusic:
+ - code_imp: The round end screen now logs the amount of mail opened by players throughout
+ the shift.
+ - bugfix: fixes logging for cargo crates and cargo crate requests by job.
+ Jacquerel:
+ - rscadd: You can earn meaningless awards from completing several new tasks
+ Melbert:
+ - admin: Admins can toggle off events in the event panel
+ - balance: All skeleton organs are now considered "mineral" organ, stopping most
+ chems from working on them
+ - balance: All plasmamen organs are now "organic + mineral", allowing most chems
+ to work on them again
+ - bugfix: Ensures bodyparts correctly track their parent's dna
+ PapaMichael:
+ - bugfix: The Detomatix disk now actually sends spoofed messages
+ SmArtKar:
+ - bugfix: Fixed potential medibot harddels
+ TheRyeGuyWhoWillNowDie:
+ - bugfix: Kilo toxins has a holofan now :D
+ - map: kilo toxins is slightly bigger and the kilo cargo warehouse is slightly smaller
+ desertmote:
+ - rscadd: Lizard angler horn now has an emissive effect
+ - image: Changed lizard frills to have their west and east icon layer above hats
+ vinylspiders:
+ - bugfix: instrument volume slider now works as intended
+2026-09-23:
+ Co0kie-GG:
+ - rscadd: AI can now see emotes touch cameras
+ SmArtKar:
+ - bugfix: Fixed shoes and a bunch of other items not being washable
+ necromanceranne:
+ - bugfix: Cybernetic fangs use the correct, metallic icon state.
diff --git a/html/changelogs/darkpack_archive/2026-09.yml b/html/changelogs/darkpack_archive/2026-09.yml
index 2d557ed0ef21..aac78e7bd7bb 100644
--- a/html/changelogs/darkpack_archive/2026-09.yml
+++ b/html/changelogs/darkpack_archive/2026-09.yml
@@ -112,3 +112,113 @@
- code_imp: changed some zulo preference code.
- rscdel: removed old Zulo basicmob code
- balance: implemented Zulo form with closer parity to TT
+2026-09-17:
+ ChiropterousHoarder, dwinters99, buffyuwu:
+ - rscadd: Added variant of Glowing Eyes for non-kindred that only breaches in near-total
+ darkness and increases flash sensitivity
+ FalloutFalcon:
+ - rscadd: TG and Darkpack changelogs are split by icons instead of just deleting
+ all the TG ones.
+ - bugfix: Fixes beastmaster targeting behavior
+ JohnFulpWillard:
+ - bugfix: Guestbook now has a scrollbar.
+ KCartridge:
+ - bugfix: fix primogen and crosses directional sprites
+ Uristthedorf:
+ - balance: Frenzy balancing
+ - bugfix: Methuselah thirst flaw now properly enforces feeding on supernaturals
+ only.
+ breadcrombs, Wolf-751:
+ - balance: Bone crafting now takes time when used on a dead body
+2026-09-18:
+ JohnFulpWillard:
+ - spellcheck: Removes mentions of Station in the roundend report.
+ chazzyjazzy:
+ - refactor: removes violation_observer component and prox monitor, bringing it to
+ /atom/movable
+2026-09-20:
+ JohnFulpWillard:
+ - qol: Anesthetic tanks no longer spits n2o into the air anymore.
+ PotatoTomahto:
+ - rscadd: you can now always see the adjective of an examined person (if you can
+ see their face)
+ Stutternov:
+ - rscadd: Adds armor to warform species similar to that of active Fortitude 4.
+ Uristthedorf:
+ - rscadd: Obfuscate hides your footsteps
+ cam_dev:
+ - qol: added charcoal pen to loadout menu
+ - image: 96 new glyphs for fera splats to draw
+ ewer-real:
+ - bugfix: Crossbow bolt sprite restored.
+2026-09-21:
+ JohnFulpWillard:
+ - bugfix: Mentorhelp now uses proper symbols.
+2026-09-22:
+ JohnFulpWillard:
+ - bugfix: Setting your phone to silent mode is now more silent.
+2026-09-23:
+ FalloutFalcon:
+ - bugfix: Frenzy, resist pain, Cold of the Grave now all acctually ignore pain slowdowns
+ - bugfix: Abilities that resist pain now consistently only ignore PAIN slowdowns
+2026-09-24:
+ JohnFulpWillard:
+ - bugfix: Jobs with alt titles now have their job description & won't cut off alt
+ title names in the menu anymore.
+2026-09-25:
+ FalloutFalcon:
+ - code_imp: Reduces the amounts of humming lights
+ JohnFulpWillard:
+ - spellcheck: Fixed spelling of Daimonion and removed it from the list of Masquerade
+ breaching words.
+ - bugfix: Latex gloves now behave more similar to how we've come to expect them
+ to be.
+ SabbyKat:
+ - balance: reduced Shroudsight cooldown times and removed TT-inaccurate BP cost
+ halgmor:
+ - rscadd: Alert capacity increased from 5 to 12.
+2026-09-26:
+ JohnFulpWillard:
+ - bugfix: You can no longer spam bloodheals all at once.
+ - balance: Throw bricks at people.
+ SabbyKat:
+ - rscadd: Added Presence 1 Awe caster's name to Awe status effect moodlet pop-up
+ text
+ - balance: Increased Presence Awe duration to TT-accurate 1 Scene
+ breadcrombs:
+ - rscadd: Added 3 new merits relating to social, these are Iron Will, Coldly Logic,
+ Enchanting Voice.
+ - rscadd: Added 2 new merit regarding firearms, which are Poor Aim and Ambidextrous
+ - rscadd: Added 1 new clan specific merit for Tzimisce ghouls and vampires, which
+ is Pain Tolerance
+ chazzyjazzy:
+ - rscadd: adds validation to discipline points upon trying to enter the round -
+ if they have an illegal amount of discipline points, theyre barred from joining
+ - bugfix: disciplines being transferred between sheets should no longer happen
+ - config: config option for discipline teaching allowing servers to pick 'full'
+ 'rares disabled' 'in clans only' or 'disabled'
+ halgmor:
+ - balance: The supply console is now restricted to Supply Technicians and the Dealer.
+ - spellcheck: Changed the supply console's description.
+2026-09-28:
+ JohnFulpWillard:
+ - bugfix: Admins that aren't also Mentors can now use the Mentor submenu
+2026-09-29:
+ SELFHELL:
+ - balance: National Guard has gotten new equipment issued
+ - bugfix: SFPD SWAT has lost critical corporate backin
+ - balance: Local Endron Branches have freed up room in the budget for new PPE
+ TheColorCyan:
+ - rscadd: 'Burning Blade ritual can now enchant 4 more weapons: rapier, sabre, knife
+ and a longsword'
+ - qol: You can see what you can enchant with Burning Blade by double examining it
+ - bugfix: Fixed rapier inhand icon being wrong
+ breadcrombs:
+ - bugfix: Mytherceria can no longer get undroppable items
+ cam_dev:
+ - rscadd: food preferences for fera tongue
+ - rscadd: chocolate food tag
+2026-09-30:
+ breadcrombs:
+ - rscadd: High strength increases throwing speed
+ - rscadd: Each point of medicine increases surgery speed by 2%
diff --git a/html/changelogs/darkpack_archive/2026-10.yml b/html/changelogs/darkpack_archive/2026-10.yml
new file mode 100644
index 000000000000..8195583f9269
--- /dev/null
+++ b/html/changelogs/darkpack_archive/2026-10.yml
@@ -0,0 +1,67 @@
+2026-10-01:
+ JohnFulpWillard:
+ - refactor: Sprinklers have been messed with a bit, please make a bug report if
+ behavior has changed.
+2026-10-02:
+ SELFHELL:
+ - rscadd: Remington Arms has had a restock in San-Francisco.
+ - rscadd: New SFX for the 11-87 Shotgun
+2026-10-03:
+ Breadcrombs, CCC23:
+ - bugfix: True Faith crosses now affects everyone regardless of wearing flash protection
+ or not as well as not flashing the user, cooldown on this has also been made
+ to be per item/cross.
+ Eagletanker:
+ - sound: 'Friendlyumbra: Added two new music tracks. Lux Umbrae, which plays in
+ the Gaian Caern, and Endron for the Planet, which plays in Pentex facilties.
+ Both are composed and preformed by Friendly Umbra. Go support her! https://youtube.com/@friendlyumbra'
+ FalloutFalcon:
+ - qol: Adds additional clarity if your prefs get adjusted midround
+ - bugfix: Minigame characters are immune to midround pref adjustments
+ - code_imp: Discipline sharing follows the same rules as other midround pref adjustments
+ like diablare
+ JohnFulpWillard:
+ - bugfix: Malkavians are now insane.
+ - bugfix: Dominate Malkavians and Regular Malkavians now share the same web.
+ - image: Changed splat icons, the pref menu should now open a little faster.
+ Stutternov:
+ - rscadd: Adds TG facescarf, TG bandanas, and alternative leather coats to the loadout
+ selection and stores.
+ breadcrombs:
+ - qol: Bloodpacks no longer splash when thrown
+ chazzyjazzy:
+ - rscadd: makes the 'academics' stat increase language familiarity
+2026-10-04:
+ JohnFulpWillard:
+ - bugfix: Gangrels turning their transformation ability off will now lose their
+ Discipline Active alert.
+2026-10-05:
+ FalloutFalcon:
+ - rscadd: All werewolf breeds have 3 unique gifts and every tribe now has atleast
+ 1 unique gift.
+ - rscadd: Adds new werewolf gifts; Primal Anger, Shed, Apecraft's Blessings, City
+ Running, Master of Fire, Hare's Leap, Heightened Senses, Predator's Arsenal,
+ Falcon's Grasp, Channeling, Sense Magic, Beat of the Heart-Drum
+ - refactor: Rolls output targets are based on a set of flags giving more granular
+ control of targets including based on success
+ - qol: Changes out dice rolls are outputed to be built at the target so the target
+ can use the guestbook name of the mob who rolled
+ - balance: Slipping restraints now uses a system similar to breaking cuffs that
+ uses DEXTERITY + STEALTH to escape
+ - bugfix: Fixes oversight where bonus was not always properly added to dice pool
+ and only displayed visually
+ - code_imp: Rolls pass in an item used in the act if any
+ - code_imp: Cleans up helpers for dice roll values like difficulty
+ - code_imp: All magic items now return a "magic type" datum with information like
+ power or type of magic (e.g blood, spirit, time)
+ - code_imp: Adds effects to represent "lingering magic" left by most gifts or discs.
+ - code_imp: Reworks Fey Sight to detect items based on magic sources they give off
+ rather then all items on a person.
+ - code_imp: Organs track who they were last attached to.
+ - code_imp: adds a generic system for tracking mobs you've examined to be reused
+ for any power that calls for such (Beat of the heart-drum and multiple vampric
+ discs)
+ Uristthedorf:
+ - bugfix: Serpentis 1 no longer implies that it can mind control you.
+ breadcrombs:
+ - rscadd: Donning the Mask of Shadows makes those under it's effect harder to examine/inspect
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 0e26139a7929..4341d9aa3457 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/effects/landmarks_static.dmi b/icons/effects/landmarks_static.dmi
index c02b9e8c694b..13783afc0a3c 100644
Binary files a/icons/effects/landmarks_static.dmi and b/icons/effects/landmarks_static.dmi differ
diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi
index 51dd6b823c87..8148b5500c6f 100644
Binary files a/icons/effects/mapping_helpers.dmi and b/icons/effects/mapping_helpers.dmi differ
diff --git a/icons/effects/mouse_pointers/justice_mouse.dmi b/icons/effects/mouse_pointers/justice_mouse.dmi
deleted file mode 100644
index e4e6426689ee..000000000000
Binary files a/icons/effects/mouse_pointers/justice_mouse.dmi and /dev/null differ
diff --git a/icons/effects/mouse_pointers/justice_mouse_charge-cooldown.dmi b/icons/effects/mouse_pointers/justice_mouse_charge-cooldown.dmi
deleted file mode 100644
index 35c6fcb5a8f7..000000000000
Binary files a/icons/effects/mouse_pointers/justice_mouse_charge-cooldown.dmi and /dev/null differ
diff --git a/icons/effects/mouse_pointers/justice_mouse_charge-disabled.dmi b/icons/effects/mouse_pointers/justice_mouse_charge-disabled.dmi
deleted file mode 100644
index c80569b7e475..000000000000
Binary files a/icons/effects/mouse_pointers/justice_mouse_charge-disabled.dmi and /dev/null differ
diff --git a/icons/effects/mouse_pointers/justice_mouse_charge.dmi b/icons/effects/mouse_pointers/justice_mouse_charge.dmi
deleted file mode 100644
index 8d152e73ce3a..000000000000
Binary files a/icons/effects/mouse_pointers/justice_mouse_charge.dmi and /dev/null differ
diff --git a/icons/effects/tasks.dmi b/icons/effects/tasks.dmi
deleted file mode 100644
index 58d398649b5a..000000000000
Binary files a/icons/effects/tasks.dmi and /dev/null differ
diff --git a/icons/hud/screen_clockwork.dmi b/icons/hud/screen_clockwork.dmi
index 1f8d7a1f1650..d5c3007968e8 100644
Binary files a/icons/hud/screen_clockwork.dmi and b/icons/hud/screen_clockwork.dmi differ
diff --git a/icons/hud/screen_detective.dmi b/icons/hud/screen_detective.dmi
index 5ac768712bf6..e4639c967325 100644
Binary files a/icons/hud/screen_detective.dmi and b/icons/hud/screen_detective.dmi differ
diff --git a/icons/hud/screen_glass.dmi b/icons/hud/screen_glass.dmi
index 80fc95c2d7de..4a9ec91848c4 100644
Binary files a/icons/hud/screen_glass.dmi and b/icons/hud/screen_glass.dmi differ
diff --git a/icons/hud/screen_midnight.dmi b/icons/hud/screen_midnight.dmi
index b932aa1ed934..b1399ff72d99 100644
Binary files a/icons/hud/screen_midnight.dmi and b/icons/hud/screen_midnight.dmi differ
diff --git a/icons/hud/screen_operative.dmi b/icons/hud/screen_operative.dmi
index 2d2192e64239..56415b9bc831 100644
Binary files a/icons/hud/screen_operative.dmi and b/icons/hud/screen_operative.dmi differ
diff --git a/icons/hud/screen_plasmafire.dmi b/icons/hud/screen_plasmafire.dmi
index 8ab8f2e4e547..4613fc6d0d57 100644
Binary files a/icons/hud/screen_plasmafire.dmi and b/icons/hud/screen_plasmafire.dmi differ
diff --git a/icons/hud/screen_retro.dmi b/icons/hud/screen_retro.dmi
index de495e8a408b..32d66359ddae 100644
Binary files a/icons/hud/screen_retro.dmi and b/icons/hud/screen_retro.dmi differ
diff --git a/icons/hud/screen_slimecore.dmi b/icons/hud/screen_slimecore.dmi
index 561b81513424..c5135703ceda 100644
Binary files a/icons/hud/screen_slimecore.dmi and b/icons/hud/screen_slimecore.dmi differ
diff --git a/icons/hud/screen_trasenknox.dmi b/icons/hud/screen_trasenknox.dmi
index b8dfed363b71..db972027d4cd 100644
Binary files a/icons/hud/screen_trasenknox.dmi and b/icons/hud/screen_trasenknox.dmi differ
diff --git a/icons/map_icons/clothing/mask.dmi b/icons/map_icons/clothing/mask.dmi
index 660a0c223705..69593e515bcc 100644
Binary files a/icons/map_icons/clothing/mask.dmi and b/icons/map_icons/clothing/mask.dmi differ
diff --git a/icons/map_icons/items/_item.dmi b/icons/map_icons/items/_item.dmi
index c85b188d20e0..ec74db6c6c22 100644
Binary files a/icons/map_icons/items/_item.dmi and b/icons/map_icons/items/_item.dmi differ
diff --git a/icons/map_icons/items/pda.dmi b/icons/map_icons/items/pda.dmi
index 40ca680e0f6e..edddb095e788 100644
Binary files a/icons/map_icons/items/pda.dmi and b/icons/map_icons/items/pda.dmi differ
diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi
index bade57646dfc..c1d76f36aec3 100644
Binary files a/icons/mob/actions/actions_items.dmi and b/icons/mob/actions/actions_items.dmi differ
diff --git a/icons/mob/actions/actions_shuttle.dmi b/icons/mob/actions/actions_shuttle.dmi
deleted file mode 100644
index ef35786a2b2b..000000000000
Binary files a/icons/mob/actions/actions_shuttle.dmi and /dev/null differ
diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi
index 0c36dc8d6864..42d8e2dd9b5a 100644
Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ
diff --git a/icons/mob/clothing/under/costume.dmi b/icons/mob/clothing/under/costume.dmi
index 22ece5259cd1..344c23cc9a03 100644
Binary files a/icons/mob/clothing/under/costume.dmi and b/icons/mob/clothing/under/costume.dmi differ
diff --git a/icons/mob/cows.dmi b/icons/mob/cows.dmi
deleted file mode 100644
index 28dc3123f0eb..000000000000
Binary files a/icons/mob/cows.dmi and /dev/null differ
diff --git a/icons/mob/gondolapod.dmi b/icons/mob/gondolapod.dmi
deleted file mode 100644
index 36a4825bcebf..000000000000
Binary files a/icons/mob/gondolapod.dmi and /dev/null differ
diff --git a/icons/mob/human/species/lizard/lizard_misc.dmi b/icons/mob/human/species/lizard/lizard_misc.dmi
index 346581978e4b..b2cc30979146 100644
Binary files a/icons/mob/human/species/lizard/lizard_misc.dmi and b/icons/mob/human/species/lizard/lizard_misc.dmi differ
diff --git a/icons/mob/inhands/equipment/shields_lefthand.dmi b/icons/mob/inhands/equipment/shields_lefthand.dmi
index 033345c7d3d2..f041ca8a4a81 100644
Binary files a/icons/mob/inhands/equipment/shields_lefthand.dmi and b/icons/mob/inhands/equipment/shields_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/shields_righthand.dmi b/icons/mob/inhands/equipment/shields_righthand.dmi
index 66d8bf8a03fb..22bd8804a2f4 100644
Binary files a/icons/mob/inhands/equipment/shields_righthand.dmi and b/icons/mob/inhands/equipment/shields_righthand.dmi differ
diff --git a/icons/mob/inhands/items/drinks_righthand.dmi b/icons/mob/inhands/items/drinks_righthand.dmi
index d5ebddb21597..6d1a142fd545 100644
Binary files a/icons/mob/inhands/items/drinks_righthand.dmi and b/icons/mob/inhands/items/drinks_righthand.dmi differ
diff --git a/icons/mob/inhands/items/tiles_lefthand.dmi b/icons/mob/inhands/items/tiles_lefthand.dmi
index 49e0bbd6e0f6..a68612b4756f 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 a6382a30ea56..5ed57d80af44 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/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 0949da25e15e..30cbf6ac9e09 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 29bb97b6b184..84de7efef7a7 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/polearms_lefthand.dmi b/icons/mob/inhands/weapons/polearms_lefthand.dmi
index 9cf37e16e042..877c0de60a3a 100644
Binary files a/icons/mob/inhands/weapons/polearms_lefthand.dmi and b/icons/mob/inhands/weapons/polearms_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/polearms_righthand.dmi b/icons/mob/inhands/weapons/polearms_righthand.dmi
index 8107d6533a98..b6228b5f6cf5 100644
Binary files a/icons/mob/inhands/weapons/polearms_righthand.dmi and b/icons/mob/inhands/weapons/polearms_righthand.dmi differ
diff --git a/icons/mob/landmarks.dmi b/icons/mob/landmarks.dmi
index 7d1253b14934..03e7be9b9fb7 100644
Binary files a/icons/mob/landmarks.dmi and b/icons/mob/landmarks.dmi differ
diff --git a/icons/mob/simple/lavaland/raptor_icebox.dmi b/icons/mob/simple/lavaland/raptor_icebox.dmi
deleted file mode 100644
index 86b82e7142d8..000000000000
Binary files a/icons/mob/simple/lavaland/raptor_icebox.dmi and /dev/null differ
diff --git a/icons/obj/antags/cult/narsie_small.dmi b/icons/obj/antags/cult/narsie_small.dmi
deleted file mode 100644
index bbc3afefdcad..000000000000
Binary files a/icons/obj/antags/cult/narsie_small.dmi and /dev/null differ
diff --git a/icons/obj/antags/gang/signup_points.dmi b/icons/obj/antags/gang/signup_points.dmi
deleted file mode 100644
index 2bda4b8ce19b..000000000000
Binary files a/icons/obj/antags/gang/signup_points.dmi and /dev/null differ
diff --git a/icons/obj/antags/gang/tags.dmi b/icons/obj/antags/gang/tags.dmi
deleted file mode 100644
index 61059c47e4a6..000000000000
Binary files a/icons/obj/antags/gang/tags.dmi and /dev/null differ
diff --git a/icons/obj/antags/gang/wanted_160x32.dmi b/icons/obj/antags/gang/wanted_160x32.dmi
deleted file mode 100644
index c25f5758d4d4..000000000000
Binary files a/icons/obj/antags/gang/wanted_160x32.dmi and /dev/null differ
diff --git a/icons/obj/clothing/under/costume.dmi b/icons/obj/clothing/under/costume.dmi
index fa9b6464a204..9acb0d99ee79 100644
Binary files a/icons/obj/clothing/under/costume.dmi and b/icons/obj/clothing/under/costume.dmi differ
diff --git a/icons/obj/devices/voice.dmi b/icons/obj/devices/voice.dmi
index 43c69217322a..bf9200180b78 100644
Binary files a/icons/obj/devices/voice.dmi and b/icons/obj/devices/voice.dmi differ
diff --git a/icons/obj/drinks/drinks.dmi b/icons/obj/drinks/drinks.dmi
index c853a51b7dde..5c5888a0497d 100644
Binary files a/icons/obj/drinks/drinks.dmi and b/icons/obj/drinks/drinks.dmi differ
diff --git a/icons/obj/drinks/mixed_drinks.dmi b/icons/obj/drinks/mixed_drinks.dmi
index 65947b9edd72..3d7706447ae7 100644
Binary files a/icons/obj/drinks/mixed_drinks.dmi and b/icons/obj/drinks/mixed_drinks.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index 0ed1aaae4b97..68572351c41a 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/food/meat.dmi b/icons/obj/food/meat.dmi
index 7f4835c8040e..5d463fc2a61d 100644
Binary files a/icons/obj/food/meat.dmi and b/icons/obj/food/meat.dmi differ
diff --git a/icons/obj/food/soupsalad.dmi b/icons/obj/food/soupsalad.dmi
index 21f07037540d..5a201448010b 100644
Binary files a/icons/obj/food/soupsalad.dmi and b/icons/obj/food/soupsalad.dmi differ
diff --git a/icons/obj/machines/artillery.dmi b/icons/obj/machines/artillery.dmi
deleted file mode 100644
index 6046007e9db2..000000000000
Binary files a/icons/obj/machines/artillery.dmi and /dev/null differ
diff --git a/icons/obj/machines/atmospherics/binary_devices.dmi b/icons/obj/machines/atmospherics/binary_devices.dmi
index 7855922700cd..7655421df766 100644
Binary files a/icons/obj/machines/atmospherics/binary_devices.dmi and b/icons/obj/machines/atmospherics/binary_devices.dmi differ
diff --git a/icons/obj/machines/atmospherics/thermomachine.dmi b/icons/obj/machines/atmospherics/thermomachine.dmi
index bcc36f4242f1..75e54c598522 100644
Binary files a/icons/obj/machines/atmospherics/thermomachine.dmi and b/icons/obj/machines/atmospherics/thermomachine.dmi differ
diff --git a/icons/obj/machines/atmospherics/trinary_devices.dmi b/icons/obj/machines/atmospherics/trinary_devices.dmi
index 3f65aa419aaa..d6292ce78683 100644
Binary files a/icons/obj/machines/atmospherics/trinary_devices.dmi and b/icons/obj/machines/atmospherics/trinary_devices.dmi differ
diff --git a/icons/obj/machines/atmospherics/unary_devices.dmi b/icons/obj/machines/atmospherics/unary_devices.dmi
index 73da54768b1c..1cc7e40809a1 100644
Binary files a/icons/obj/machines/atmospherics/unary_devices.dmi and b/icons/obj/machines/atmospherics/unary_devices.dmi differ
diff --git a/icons/obj/machines/big_manipulator.dmi b/icons/obj/machines/big_manipulator.dmi
deleted file mode 100644
index b6e878e18984..000000000000
Binary files a/icons/obj/machines/big_manipulator.dmi and /dev/null differ
diff --git a/icons/obj/machines/engine/other.dmi b/icons/obj/machines/engine/other.dmi
index 15390eb537c8..a0ce2c9dbbc0 100644
Binary files a/icons/obj/machines/engine/other.dmi and b/icons/obj/machines/engine/other.dmi differ
diff --git a/icons/obj/machines/engine/supermatter.dmi b/icons/obj/machines/engine/supermatter.dmi
index 0a68846715e4..2c49813d741b 100644
Binary files a/icons/obj/machines/engine/supermatter.dmi and b/icons/obj/machines/engine/supermatter.dmi differ
diff --git a/icons/obj/machines/engine/tesla_generator.dmi b/icons/obj/machines/engine/tesla_generator.dmi
deleted file mode 100644
index adf5fbaa8ec6..000000000000
Binary files a/icons/obj/machines/engine/tesla_generator.dmi and /dev/null differ
diff --git a/icons/obj/machines/prison.dmi b/icons/obj/machines/prison.dmi
index 7ce58e93a2ce..d05be5230a84 100644
Binary files a/icons/obj/machines/prison.dmi and b/icons/obj/machines/prison.dmi differ
diff --git a/icons/obj/machines/wayfinding.dmi b/icons/obj/machines/wayfinding.dmi
deleted file mode 100644
index 678b67231be2..000000000000
Binary files a/icons/obj/machines/wayfinding.dmi and /dev/null differ
diff --git a/icons/obj/medical/organs/organs.dmi b/icons/obj/medical/organs/organs.dmi
index 7b73c7edbaee..ba9b3d99e3bb 100644
Binary files a/icons/obj/medical/organs/organs.dmi and b/icons/obj/medical/organs/organs.dmi differ
diff --git a/icons/obj/mining_zones/ash_flora.dmi b/icons/obj/mining_zones/ash_flora.dmi
index 5d64b1b931b9..83a0f7b021c6 100644
Binary files a/icons/obj/mining_zones/ash_flora.dmi and b/icons/obj/mining_zones/ash_flora.dmi differ
diff --git a/icons/obj/pet_carrier.dmi b/icons/obj/pet_carrier.dmi
index 95007d4dc0c1..129ba69df6ce 100644
Binary files a/icons/obj/pet_carrier.dmi and b/icons/obj/pet_carrier.dmi differ
diff --git a/icons/obj/pipes_n_cables/atmos.dmi b/icons/obj/pipes_n_cables/atmos.dmi
index e7401411a290..7c5a17d7dcd8 100644
Binary files a/icons/obj/pipes_n_cables/atmos.dmi and b/icons/obj/pipes_n_cables/atmos.dmi differ
diff --git a/icons/obj/pipes_n_cables/meter.dmi b/icons/obj/pipes_n_cables/meter.dmi
index fa0d5e3bf4d8..157ad8316391 100644
Binary files a/icons/obj/pipes_n_cables/meter.dmi and b/icons/obj/pipes_n_cables/meter.dmi differ
diff --git a/icons/obj/poster.dmi b/icons/obj/poster.dmi
index 01911b56c7e1..4fa421788e12 100644
Binary files a/icons/obj/poster.dmi and b/icons/obj/poster.dmi differ
diff --git a/icons/obj/service/hydroponics/equipment.dmi b/icons/obj/service/hydroponics/equipment.dmi
index 4378a61cf8f3..1e93090b3918 100644
Binary files a/icons/obj/service/hydroponics/equipment.dmi and b/icons/obj/service/hydroponics/equipment.dmi differ
diff --git a/icons/obj/service/hydroponics/growing_flowers.dmi b/icons/obj/service/hydroponics/growing_flowers.dmi
index fca3e15f9d90..3944d6039082 100644
Binary files a/icons/obj/service/hydroponics/growing_flowers.dmi and b/icons/obj/service/hydroponics/growing_flowers.dmi differ
diff --git a/icons/obj/service/hydroponics/growing_fruits.dmi b/icons/obj/service/hydroponics/growing_fruits.dmi
index c0f547322c7c..c9a6c37a42f6 100644
Binary files a/icons/obj/service/hydroponics/growing_fruits.dmi and b/icons/obj/service/hydroponics/growing_fruits.dmi differ
diff --git a/icons/obj/service/hydroponics/growing_vegetables.dmi b/icons/obj/service/hydroponics/growing_vegetables.dmi
index 37ddd825a829..0a63c85c65d8 100644
Binary files a/icons/obj/service/hydroponics/growing_vegetables.dmi and b/icons/obj/service/hydroponics/growing_vegetables.dmi differ
diff --git a/icons/obj/service/hydroponics/harvest.dmi b/icons/obj/service/hydroponics/harvest.dmi
index dd3cd5865dee..ce4e95b8ea03 100644
Binary files a/icons/obj/service/hydroponics/harvest.dmi and b/icons/obj/service/hydroponics/harvest.dmi differ
diff --git a/icons/obj/service/hydroponics/seeds.dmi b/icons/obj/service/hydroponics/seeds.dmi
index d08fbb8541dc..ad9e43280e25 100644
Binary files a/icons/obj/service/hydroponics/seeds.dmi and b/icons/obj/service/hydroponics/seeds.dmi differ
diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi
index a83dc3cdfae9..3d1258039000 100644
Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ
diff --git a/icons/obj/storage/box.dmi b/icons/obj/storage/box.dmi
index e59cb1924120..68b7a59bc6a2 100644
Binary files a/icons/obj/storage/box.dmi and b/icons/obj/storage/box.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 77732e5f3c28..441853cb3c5e 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/obj/weapons/khopesh.dmi b/icons/obj/weapons/khopesh.dmi
index 257ccc800dfb..faec98390d31 100644
Binary files a/icons/obj/weapons/khopesh.dmi and b/icons/obj/weapons/khopesh.dmi differ
diff --git a/icons/obj/weapons/shields.dmi b/icons/obj/weapons/shields.dmi
index eec85e9bea1a..9adb31f79569 100644
Binary files a/icons/obj/weapons/shields.dmi and b/icons/obj/weapons/shields.dmi differ
diff --git a/icons/obj/weapons/spear.dmi b/icons/obj/weapons/spear.dmi
index 6a2f95f78b5c..17231920c87f 100644
Binary files a/icons/obj/weapons/spear.dmi and b/icons/obj/weapons/spear.dmi differ
diff --git a/icons/testing/hidden.dmi b/icons/testing/hidden.dmi
deleted file mode 100644
index 0d714b23b7c9..000000000000
Binary files a/icons/testing/hidden.dmi and /dev/null differ
diff --git a/icons/turf/decals.dmi b/icons/turf/decals.dmi
index 3d8c170cf885..859617a7892f 100644
Binary files a/icons/turf/decals.dmi and b/icons/turf/decals.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 6663a5f3b966..e35b7ae4d638 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
index e89ce169c97c..93087f2aa0f8 100644
Binary files a/icons/turf/floors/carpet_bear.dmi 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
index d06f37097069..9451bea10da0 100644
Binary files a/icons/turf/floors/carpet_bear.png 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
index 28871a8913c9..29105b515875 100644
--- a/icons/turf/floors/carpet_bear.png.toml
+++ b/icons/turf/floors/carpet_bear.png.toml
@@ -1,2 +1,6 @@
output_name = "carpet_bear"
template = "bitmask/diagonal_32x32.toml"
+
+[prefabs]
+255 = 5
+
diff --git a/icons/turf/floors/carpet_bearpolar.dmi b/icons/turf/floors/carpet_bearpolar.dmi
index 50f9a8ea63e7..a578226ce898 100644
Binary files a/icons/turf/floors/carpet_bearpolar.dmi 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
index 35935558e178..9efccc55c56d 100644
Binary files a/icons/turf/floors/carpet_bearpolar.png 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
index 02900cd75329..0d0a7664529f 100644
--- a/icons/turf/floors/carpet_bearpolar.png.toml
+++ b/icons/turf/floors/carpet_bearpolar.png.toml
@@ -1,2 +1,6 @@
output_name = "carpet_bearpolar"
template = "bitmask/diagonal_32x32.toml"
+
+[prefabs]
+255 = 5
+
diff --git a/icons/turf/floors/carpet_carp.dmi b/icons/turf/floors/carpet_carp.dmi
index 90b9d549fce1..2d6add54d332 100644
Binary files a/icons/turf/floors/carpet_carp.dmi 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
index 4379e24a438e..0650f304d9c4 100644
Binary files a/icons/turf/floors/carpet_carp.png and b/icons/turf/floors/carpet_carp.png differ
diff --git a/icons/turf/floors/carpet_donk.png b/icons/turf/floors/carpet_donk.png
index eb0243c4926e..02d1e22e685b 100644
Binary files a/icons/turf/floors/carpet_donk.png and b/icons/turf/floors/carpet_donk.png differ
diff --git a/icons/turf/floors/carpet_goliath.dmi b/icons/turf/floors/carpet_goliath.dmi
index d78f7294a5ae..ba05aa7bca2d 100644
Binary files a/icons/turf/floors/carpet_goliath.dmi 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
index 4f45c4081272..c331fe8d27e2 100644
Binary files a/icons/turf/floors/carpet_goliath.png and b/icons/turf/floors/carpet_goliath.png differ
diff --git a/icons/turf/floors/carpet_lizard.dmi b/icons/turf/floors/carpet_lizard.dmi
index f136b2be36f2..4b0467796d67 100644
Binary files a/icons/turf/floors/carpet_lizard.dmi 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
index b05dfb579bde..e75feaf7150e 100644
Binary files a/icons/turf/floors/carpet_lizard.png and b/icons/turf/floors/carpet_lizard.png differ
diff --git a/icons/turf/floors/carpet_moth.dmi b/icons/turf/floors/carpet_moth.dmi
index 641ce53b5ec6..798cfb0ca0d3 100644
Binary files a/icons/turf/floors/carpet_moth.dmi 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
index 7e2a40d2a22e..a8b584fc9ac6 100644
Binary files a/icons/turf/floors/carpet_moth.png 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
index 937263bf6b4d..0fa35110562a 100644
--- a/icons/turf/floors/carpet_moth.png.toml
+++ b/icons/turf/floors/carpet_moth.png.toml
@@ -1,2 +1,6 @@
output_name = "carpet_moth"
template = "bitmask/diagonal_32x32.toml"
+
+[prefabs]
+255 = 5
+
diff --git a/icons/turf/floors/glass_stained_black.dmi b/icons/turf/floors/glass_stained_black.dmi
index b906bee44fb1..63107e867f6c 100644
Binary files a/icons/turf/floors/glass_stained_black.dmi 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
index 3c9a073c1ee4..08c21170d127 100644
Binary files a/icons/turf/floors/glass_stained_black.png and b/icons/turf/floors/glass_stained_black.png differ
diff --git a/icons/turf/floors/glass_stained_blue.dmi b/icons/turf/floors/glass_stained_blue.dmi
index 1eb891d8e30d..d0fc7490ea0e 100644
Binary files a/icons/turf/floors/glass_stained_blue.dmi 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
index a83d5f168c7f..1a196e3187c0 100644
Binary files a/icons/turf/floors/glass_stained_blue.png and b/icons/turf/floors/glass_stained_blue.png differ
diff --git a/icons/turf/floors/glass_stained_green.dmi b/icons/turf/floors/glass_stained_green.dmi
index 7d58c9ebb389..22b2633dd3ad 100644
Binary files a/icons/turf/floors/glass_stained_green.dmi 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
index a4a364bf44ed..32b14de27eb7 100644
Binary files a/icons/turf/floors/glass_stained_green.png and b/icons/turf/floors/glass_stained_green.png differ
diff --git a/icons/turf/floors/glass_stained_orange.dmi b/icons/turf/floors/glass_stained_orange.dmi
index 36af79703161..164d3998226a 100644
Binary files a/icons/turf/floors/glass_stained_orange.dmi 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
index faf8989bb1be..dbcde6d907b3 100644
Binary files a/icons/turf/floors/glass_stained_orange.png and b/icons/turf/floors/glass_stained_orange.png differ
diff --git a/icons/turf/floors/glass_stained_purple.dmi b/icons/turf/floors/glass_stained_purple.dmi
index 9d32ffd5c944..af1fd390f23e 100644
Binary files a/icons/turf/floors/glass_stained_purple.dmi 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
index e26926605a89..7da3f6b85333 100644
Binary files a/icons/turf/floors/glass_stained_purple.png and b/icons/turf/floors/glass_stained_purple.png differ
diff --git a/icons/turf/floors/glass_stained_red.dmi b/icons/turf/floors/glass_stained_red.dmi
index 48c55eb6c9e0..293e2d3ffa9d 100644
Binary files a/icons/turf/floors/glass_stained_red.dmi 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
index 1de45947db5c..a2e6162529b7 100644
Binary files a/icons/turf/floors/glass_stained_red.png and b/icons/turf/floors/glass_stained_red.png differ
diff --git a/icons/turf/floors/glass_stained_white.dmi b/icons/turf/floors/glass_stained_white.dmi
index e46003ef787b..86c1f21ac938 100644
Binary files a/icons/turf/floors/glass_stained_white.dmi 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
index 7ede54ec6b9c..a8000f414e0a 100644
Binary files a/icons/turf/floors/glass_stained_white.png and b/icons/turf/floors/glass_stained_white.png differ
diff --git a/icons/turf/floors/glass_stained_yellow.dmi b/icons/turf/floors/glass_stained_yellow.dmi
index b2ea59bea3a8..97cda9a5c7d4 100644
Binary files a/icons/turf/floors/glass_stained_yellow.dmi 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
index 217ffc7bf01c..d29514507fb3 100644
Binary files a/icons/turf/floors/glass_stained_yellow.png and b/icons/turf/floors/glass_stained_yellow.png differ
diff --git a/icons/turf/walls/adamantine_wall.dmi b/icons/turf/walls/adamantine_wall.dmi
deleted file mode 100644
index 2df382f2f646..000000000000
Binary files a/icons/turf/walls/adamantine_wall.dmi and /dev/null differ
diff --git a/icons/turf/walls/adamantine_wall.png b/icons/turf/walls/adamantine_wall.png
deleted file mode 100644
index f6852ff7bdad..000000000000
Binary files a/icons/turf/walls/adamantine_wall.png and /dev/null differ
diff --git a/icons/turf/walls/adamantine_wall.png.toml b/icons/turf/walls/adamantine_wall.png.toml
deleted file mode 100644
index 7ed9b72f45c3..000000000000
--- a/icons/turf/walls/adamantine_wall.png.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index 12faff99af92..000000000000
Binary files a/icons/turf/walls/bone_wall.dmi and /dev/null differ
diff --git a/icons/turf/walls/bone_wall.png b/icons/turf/walls/bone_wall.png
deleted file mode 100644
index fc43971867b4..000000000000
Binary files a/icons/turf/walls/bone_wall.png and /dev/null differ
diff --git a/icons/turf/walls/bone_wall.png.toml b/icons/turf/walls/bone_wall.png.toml
deleted file mode 100644
index 2b6f135aebcc..000000000000
--- a/icons/turf/walls/bone_wall.png.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-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 b9c44a9b1d5b..300659d4d1c9 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
deleted file mode 100644
index 91c4cc52c6dd..000000000000
Binary files a/icons/turf/walls/hauntium_wall.dmi and /dev/null differ
diff --git a/icons/turf/walls/hauntium_wall.png b/icons/turf/walls/hauntium_wall.png
deleted file mode 100644
index 8c3e5afd499e..000000000000
Binary files a/icons/turf/walls/hauntium_wall.png and /dev/null differ
diff --git a/icons/turf/walls/hauntium_wall.png.toml b/icons/turf/walls/hauntium_wall.png.toml
deleted file mode 100644
index d744d24275c8..000000000000
--- a/icons/turf/walls/hauntium_wall.png.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index d8d23614fff0..000000000000
Binary files a/icons/turf/walls/metal_hydrogen_wall.dmi and /dev/null differ
diff --git a/icons/turf/walls/metal_hydrogen_wall.png b/icons/turf/walls/metal_hydrogen_wall.png
deleted file mode 100644
index dda2c2adee40..000000000000
Binary files a/icons/turf/walls/metal_hydrogen_wall.png and /dev/null differ
diff --git a/icons/turf/walls/metal_hydrogen_wall.png.toml b/icons/turf/walls/metal_hydrogen_wall.png.toml
deleted file mode 100644
index 4c48d64af3b7..000000000000
--- a/icons/turf/walls/metal_hydrogen_wall.png.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index b49e63f8cd57..000000000000
Binary files a/icons/turf/walls/mythril_wall.dmi and /dev/null differ
diff --git a/icons/turf/walls/mythril_wall.png b/icons/turf/walls/mythril_wall.png
deleted file mode 100644
index fd61c88a623a..000000000000
Binary files a/icons/turf/walls/mythril_wall.png and /dev/null differ
diff --git a/icons/turf/walls/mythril_wall.png.toml b/icons/turf/walls/mythril_wall.png.toml
deleted file mode 100644
index d86bef23b997..000000000000
--- a/icons/turf/walls/mythril_wall.png.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index 1a7ef276e6a2..000000000000
Binary files a/icons/turf/walls/runite_wall.dmi and /dev/null differ
diff --git a/icons/turf/walls/runite_wall.png b/icons/turf/walls/runite_wall.png
deleted file mode 100644
index 04622fea9f83..000000000000
Binary files a/icons/turf/walls/runite_wall.png and /dev/null differ
diff --git a/icons/turf/walls/runite_wall.png.toml b/icons/turf/walls/runite_wall.png.toml
deleted file mode 100644
index 2ce63c4d8373..000000000000
--- a/icons/turf/walls/runite_wall.png.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index 1a3c211a422e..000000000000
Binary files a/icons/turf/walls/sandbasalt_wall.dmi and /dev/null differ
diff --git a/icons/turf/walls/sandbasalt_wall.png b/icons/turf/walls/sandbasalt_wall.png
deleted file mode 100644
index 4eea35f02fce..000000000000
Binary files a/icons/turf/walls/sandbasalt_wall.png and /dev/null differ
diff --git a/icons/turf/walls/sandbasalt_wall.png.toml b/icons/turf/walls/sandbasalt_wall.png.toml
deleted file mode 100644
index 995d2cf1fa29..000000000000
--- a/icons/turf/walls/sandbasalt_wall.png.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index b58f92ff37b3..000000000000
Binary files a/icons/turf/walls/sandstone_ornate_wall.dmi and /dev/null differ
diff --git a/icons/turf/walls/sandstone_ornate_wall.png b/icons/turf/walls/sandstone_ornate_wall.png
deleted file mode 100644
index aa37bc148aed..000000000000
Binary files a/icons/turf/walls/sandstone_ornate_wall.png and /dev/null differ
diff --git a/icons/turf/walls/sandstone_ornate_wall.png.toml b/icons/turf/walls/sandstone_ornate_wall.png.toml
deleted file mode 100644
index 18b0c2be0d31..000000000000
--- a/icons/turf/walls/sandstone_ornate_wall.png.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-output_name = "sandstone_ornate_wall"
-template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/ui/achievements/achievements.dmi b/icons/ui/achievements/achievements.dmi
index d5bef5c42f87..38789f3793cc 100644
Binary files a/icons/ui/achievements/achievements.dmi and b/icons/ui/achievements/achievements.dmi differ
diff --git a/icons/ui/mecha/armor.dmi b/icons/ui/mecha/armor.dmi
deleted file mode 100644
index 665e3f665ebd..000000000000
Binary files a/icons/ui/mecha/armor.dmi and /dev/null differ
diff --git a/icons/ui/programs/charging.gif b/icons/ui/programs/charging.gif
deleted file mode 100644
index 188508bae251..000000000000
Binary files a/icons/ui/programs/charging.gif and /dev/null differ
diff --git a/icons/ui_icons/minimap/draw_tools.dmi b/icons/ui_icons/minimap/draw_tools.dmi
deleted file mode 100644
index ba72a74475e4..000000000000
Binary files a/icons/ui_icons/minimap/draw_tools.dmi and /dev/null differ
diff --git a/modular_darkpack/master_files/code/controllers/configuration/entries/darkpack_config_entries.dm b/modular_darkpack/master_files/code/controllers/configuration/entries/darkpack_config_entries.dm
index 9abc116d4889..4569ea130e36 100644
--- a/modular_darkpack/master_files/code/controllers/configuration/entries/darkpack_config_entries.dm
+++ b/modular_darkpack/master_files/code/controllers/configuration/entries/darkpack_config_entries.dm
@@ -14,3 +14,14 @@
/datum/config_entry/flag/artifact_stacking
default = FALSE
+
+/// Determines if a player can teach another player a discipline
+/// 0 / DISCIPLINE_TEACHING_FULL - Full discipline teaching with no restrictions
+/// 1 / DISCIPLINE_TEACHING_RARES_DISABLED - Discipline teaching, but rare disciplines like Thaumaturgy and Temporis cannot be taught
+/// 2 / DISCIPLINE_TEACHING_IN_CLANS_ONLY - Discipline teaching allowed, but you can only teach disciplines inherent to your clan (A Gangrel can teach Protean, but not Thaumaturgy)
+/// 3 / DISCIPLINE_TEACHING_DISABLED - Discipline teaching completely disabled
+/datum/config_entry/number/discipline_teaching
+ default = DISCIPLINE_TEACHING_FULL
+ integer = TRUE
+ min_val = DISCIPLINE_TEACHING_FULL
+ max_val = DISCIPLINE_TEACHING_DISABLED
diff --git a/modular_darkpack/master_files/code/datums/status_effects/debuffs.dm b/modular_darkpack/master_files/code/datums/status_effects/debuffs.dm
new file mode 100644
index 000000000000..0f241d9a9da2
--- /dev/null
+++ b/modular_darkpack/master_files/code/datums/status_effects/debuffs.dm
@@ -0,0 +1,28 @@
+/datum/status_effect/grouped/static_look
+ id = "static look"
+ duration = STATUS_EFFECT_PERMANENT
+
+/datum/status_effect/grouped/static_look/on_apply()
+ . = ..()
+ RegisterSignal(owner, COMSIG_MOB_CLIENT_LOGIN, PROC_REF(show_unconscious_hud))
+ if(GET_CLIENT(owner)) // let's not waste time giving the hud to non-player characters
+ show_unconscious_hud(owner)
+
+/datum/status_effect/grouped/static_look/on_remove()
+ UnregisterSignal(owner, list(COMSIG_MOB_CLIENT_LOGIN))
+ if(GET_CLIENT(owner))
+ hide_unconscious_hud(owner)
+ return ..()
+
+/// Global list of images that correspond to a mob's unconscious appearance
+GLOBAL_LIST_EMPTY(unconscious_appearances)
+
+/datum/status_effect/grouped/static_look/proc/show_unconscious_hud(mob/living/source)
+ SIGNAL_HANDLER
+
+ source.client?.images += (GLOB.unconscious_appearances - source.unconscious_appearance)
+
+/datum/status_effect/grouped/static_look/proc/hide_unconscious_hud(mob/living/source)
+ SIGNAL_HANDLER
+
+ source.client?.images -= GLOB.unconscious_appearances
diff --git a/modular_darkpack/master_files/code/modules/cargo/expressconsole.dm b/modular_darkpack/master_files/code/modules/cargo/expressconsole.dm
index 58eb1e498fc0..d4e33e09353a 100644
--- a/modular_darkpack/master_files/code/modules/cargo/expressconsole.dm
+++ b/modular_darkpack/master_files/code/modules/cargo/expressconsole.dm
@@ -1,6 +1,6 @@
/obj/machinery/computer/cargo/express
req_access = list()
- locked = FALSE
+ locked = TRUE
landingzone = /area/vtm/outside/supply
/obj/machinery/computer/cargo/express/Initialize(mapload)
diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon.dm
index 18064b806ea6..363fe6914316 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon.dm
@@ -9,12 +9,11 @@
QDEL_NULL(examine_panel_tgui)
client?.images -= suckbar
QDEL_NULL(suckbar)
- suckbar_loc = null
GLOB.masquerade_breakers_list -= src
return ..()
/mob/living/carbon/resist_restraints()
- var/obj/item/I = null
+ var/obj/item/I
if(handcuffed)
I = handcuffed
changeNext_move(I.resist_cooldown)
@@ -32,7 +31,27 @@
switch(resist_type)
if("Remove")
- cuff_resist(I)
+ var/roll_difficulty = 0
+ switch(I.breakouttime)
+ if(5 SECONDS to 15 SECONDS)
+ roll_difficulty = 6
+ if(15 SECONDS to 30 SECONDS)
+ roll_difficulty = 7
+ if(30 SECONDS to 1 MINUTES)
+ roll_difficulty = 8
+ if(1 MINUTES to INFINITY)
+ roll_difficulty = 9
+ if(!roll_difficulty)
+ cuff_resist(I)
+
+ var/datum/storyteller_roll/slip_restraints/roll = new()
+ roll.difficulty = roll_difficulty
+ switch(roll.st_roll(src, I))
+ if(ROLL_SUCCESS)
+ cuff_resist(I, null, INSTANT_CUFFBREAK)
+ else
+ playsound(src, 'sound/effects/jingle.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ visible_message(span_warning("[src] is trying to wiggle out of [I]!"))
if("Break")
var/missing_strength = I.cuff_break_strength_needed - st_get_stat(STAT_STRENGTH)
if(missing_strength > 0)
@@ -44,8 +63,10 @@
if(ROLL_SUCCESS)
playsound(src, 'sound/effects/rock/rocktap3.ogg', 40, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
cuff_resist(I, null, INSTANT_CUFFBREAK) // OUT WITH THE CUFFS
+ /* Not reachable rn
if(ROLL_COOLDOWN)
pass()
+ */
else
playsound(src, 'sound/effects/jingle.ogg', 40, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
visible_message(span_warning("[src] aggressively wrenches against [I]!"))
diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm
index 1c3c3d17781d..710ee9bce773 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm
@@ -1,11 +1,13 @@
/mob/living/carbon
bloodquality = BLOOD_QUALITY_NORMAL
+ /// Your age + immortal age.
var/chronological_age = 0
+ /// Blood drinking visual
var/image/suckbar
- var/atom/suckbar_loc
+ // Used by a necromancy ritual? unused rn I belive
var/fakediablerist = FALSE
var/can_be_embraced = TRUE
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 add9be8a44b5..3ca6d8923821 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
@@ -56,7 +56,7 @@
. += span_danger("[p_They()] [p_are()] covered in... scales!?
")
if(HAS_TRAIT(src, TRAIT_ANIMAL_MUSK))
- . += span_warning("[p_They(TRUE)] smell[p_s()] weirdly animal like...
")
+ . += span_warning("[p_They()] smell[p_s()] weirdly animal like...
")
if(HAS_TRAIT(src, TRAIT_GRAVE_SMELL))
. += span_warning("[p_They()] smell[p_s()] like petrichor and freshly turned soil.
")
@@ -70,6 +70,9 @@
if((!is_eyes_covered()) && HAS_TRAIT(src, TRAIT_GLOWING_EYES))
. += span_warning("[p_Their()] eyes glow unnaturally!
")
+ if((!is_eyes_covered()) && HAS_TRAIT(src, TRAIT_REFLECTIVE_EYES))
+ . += span_warning("[p_Their()] eyes shine unnaturally!
")
+
if((!is_eyes_covered()) && HAS_TRAIT(src, TRAIT_ABYSSAL_EYES))
. += span_warning("[p_Their()] eyes are filled with an inky darkness!
")
diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm
index 73c76af769fd..f5bfc09a7ecb 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm
@@ -3,7 +3,6 @@
//Initializes Jumping on the player
AddComponent(/datum/component/jumper)
- AddComponent(/datum/component/violation_observer, violation_aoe)
if(CONFIG_GET(flag/swing_combat))
AddElement(/datum/element/swing_attack)
else if(CONFIG_GET(flag/directional_combat))
diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/physiology.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/physiology.dm
deleted file mode 100644
index 95bfee6bc3b7..000000000000
--- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/physiology.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-/datum/physiology
- /// Multiplier to aggravated damage received
- var/aggravated_mod = 1
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 572c319df9ab..f2ffa7d1777b 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/living.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/living.dm
@@ -3,12 +3,14 @@
replace_storyteller_stats(create_new_stat_prefs(storyteller_stats))
become_area_sensitive(ZONE_TRAIT)
update_zone_hud(src, get_area(src)) // AREAS - (Zone hud)
+ RegisterSignal(src, COMSIG_MASQUERADE_VIOLATION, TYPE_PROC_REF(/atom/movable, on_masquerade_violation))
/mob/living/Destroy(force)
clear_storyteller_stats()
beastmaster_minions = null
minion_command_components = null
QDEL_LAZYLIST(splats)
+ UnregisterSignal(src, COMSIG_MASQUERADE_VIOLATION)
return ..()
/mob/living/set_pull_offsets(mob/living/mob_to_set, grab_state = GRAB_PASSIVE, animate = TRUE)
diff --git a/modular_darkpack/master_files/code/modules/mob/living/living_defines.dm b/modular_darkpack/master_files/code/modules/mob/living/living_defines.dm
index 416cf7041877..ed2b9b8e1f9d 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/living_defines.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/living_defines.dm
@@ -20,6 +20,9 @@
/// The quality of the mobs blood when drank from. Decides how much BP a vampire will regain.
var/bloodquality = BLOOD_QUALITY_LOW
+ // "True faith" stuff, only used for the cross rn
+ COOLDOWN_DECLARE(true_faith_cd)
+
COOLDOWN_DECLARE(masquerade_timer)
var/masquerade_score = 5
@@ -54,3 +57,6 @@
var/collected_souls = 0
var/last_shown_area_name // AREAS
+
+ /// Lazy list of weakrefs for mobs the user has tasted the blood of
+ var/list/mobs_tasted_blood_of // WEREWOLF
diff --git a/modular_darkpack/master_files/code/modules/mob/living/living_say.dm b/modular_darkpack/master_files/code/modules/mob/living/living_say.dm
index 019d54697b00..aab3a158a925 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/living_say.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/living_say.dm
@@ -1,4 +1,9 @@
/mob/living/send_speech(message_raw, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language = null, list/message_mods = list(), forced = null, tts_message, list/tts_filter)
+ if(HAS_TRAIT(src, TRAIT_IN_FRENZY))
+ var/list/random_emote = list("growl", "hiss") //I would include *scream but for some reason it isn't working.
+ emote(pick(random_emote))
+ return
+
. = ..()
if(!blooper)
return
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 65a04ff19119..19335100bf73 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
@@ -22,10 +22,12 @@
var/required_discipline
var/datum/storyteller_roll/ritual_roll/ritual_roll_datum
+ var/last_sucess_amount = 0
/datum/storyteller_roll/ritual_roll
bumper_text = "ritual"
applicable_stats = list(STAT_INTELLIGENCE, STAT_OCCULT)
+ numerical = TRUE
/obj/ritual_rune/Initialize(mapload)
. = ..()
@@ -83,14 +85,15 @@
ritual_roll_datum.difficulty = difficulty
var/roll_result = ritual_roll_datum.st_roll(last_activator, last_activator)
+ last_sucess_amount = roll_result
switch(roll_result)
- if(ROLL_SUCCESS)
+ if(1 to INFINITY)
complete()
return TRUE
- if(ROLL_FAILURE)
+ if(0)
ritual_failure()
return FALSE
- if(ROLL_BOTCH)
+ if(-INFINITY to -1)
ritual_botch()
return FALSE
diff --git a/modular_darkpack/master_files/code/modules/surgery/bodyparts/_bodyparts.dm b/modular_darkpack/master_files/code/modules/surgery/bodyparts/_bodyparts.dm
index 84baeb2ea473..dd438d476faf 100644
--- a/modular_darkpack/master_files/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/modular_darkpack/master_files/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -7,3 +7,11 @@
var/light_aggravated_msg = "bruised and feels numb"
var/medium_aggravated_msg = "torn apart"
var/heavy_aggravated_msg = "like pieces are falling off"
+
+ /// Stores a weakref for the last owner assigned to the limb. NOT cleared when being dropped from the limb.
+ var/datum/weakref/last_owner
+
+
+/obj/item/bodypart/apply_ownership(mob/living/carbon/new_owner)
+ . = ..()
+ last_owner = WEAKREF(new_owner)
diff --git a/modular_darkpack/master_files/code/modules/surgery/bodyparts/organs/_organ.dm b/modular_darkpack/master_files/code/modules/surgery/bodyparts/organs/_organ.dm
new file mode 100644
index 000000000000..1d80bfb45c80
--- /dev/null
+++ b/modular_darkpack/master_files/code/modules/surgery/bodyparts/organs/_organ.dm
@@ -0,0 +1,4 @@
+
+/obj/item/organ
+ /// Stores a weakref for the last owner assigned to the limb. NOT cleared when being dropped from the limb.
+ var/datum/weakref/last_owner
diff --git a/modular_darkpack/master_files/code/modules/surgery/bodyparts/organs/internal/_vocal_chords.dm b/modular_darkpack/master_files/code/modules/surgery/bodyparts/organs/internal/_vocal_chords.dm
index e1e344b36bf0..7f14c3adc8c3 100644
--- a/modular_darkpack/master_files/code/modules/surgery/bodyparts/organs/internal/_vocal_chords.dm
+++ b/modular_darkpack/master_files/code/modules/surgery/bodyparts/organs/internal/_vocal_chords.dm
@@ -1,3 +1,3 @@
-/obj/item/organ/vocal_chords/Initialize(mapload)
+/obj/item/organ/vocal_cords/Initialize(mapload)
. = ..()
AddComponent(/datum/component/selling/organ, 200, "organ", TRUE, -1, 0)
diff --git a/modular_darkpack/master_files/code/modules/surgery/bodyparts/organs/organ_movement.dm b/modular_darkpack/master_files/code/modules/surgery/bodyparts/organs/organ_movement.dm
new file mode 100644
index 000000000000..eeed1672782e
--- /dev/null
+++ b/modular_darkpack/master_files/code/modules/surgery/bodyparts/organs/organ_movement.dm
@@ -0,0 +1,3 @@
+/obj/item/organ/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
+ . = ..()
+ last_owner = WEAKREF(organ_owner)
diff --git a/modular_darkpack/modules/aggravated_damage/code/damage_procs.dm b/modular_darkpack/modules/aggravated_damage/code/damage_procs.dm
index 4c1b4a528abf..9f2a002f5f83 100644
--- a/modular_darkpack/modules/aggravated_damage/code/damage_procs.dm
+++ b/modular_darkpack/modules/aggravated_damage/code/damage_procs.dm
@@ -15,17 +15,28 @@
return TRUE
/mob/living/proc/adjust_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
- if(!can_adjust_agg_loss(amount, forced, required_bodytype))
+ if(amount > 0 && !forced) //carbon mobs override this proc, so the damage modifier check is also performed on [limb/receive_damage()]
+ amount *= GET_PHYSIOLOGY(src, AGGRAVATED)
+
+ if (!amount || !can_adjust_agg_loss(amount, forced, required_bodytype))
return 0
- . = aggloss
+ var/difference = aggloss
aggloss = clamp((aggloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
- . -= aggloss
- if(. == 0) // no change, no need to update
- return
- if(updating_health)
- updatehealth()
+ difference -= aggloss
+
+ return on_damage_loss(amount, updating_health, forced, AGGRAVATED, difference)
+
+
+/mob/living/proc/set_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
+ if(!forced && HAS_TRAIT(src, TRAIT_GODMODE))
+ return 0
+ var/difference = aggloss
+ aggloss = amount
+ difference -= aggloss
-/mob/living/carbon/adjust_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
+ return on_damage_loss(-difference, updating_health, forced, AGGRAVATED, difference)
+
+/mob/living/carbon/adjust_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
if(!can_adjust_agg_loss(amount, forced, required_bodytype))
return 0
if(amount > 0)
@@ -33,42 +44,26 @@
else
. = heal_overall_damage(aggravated = abs(amount), required_bodytype = required_bodytype, updating_health = updating_health, forced = forced)
-/mob/living/simple_animal/adjust_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
+/mob/living/simple_animal/adjust_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
if(!can_adjust_agg_loss(amount, forced, required_bodytype))
return 0
- // Has to be structured diffrently to the other loss procs as we cant assume aggravated is in all damagecoeff
- var/damage_modifier = 1
- if(AGGRAVATED in damage_coeff)
- damage_modifier = damage_coeff[AGGRAVATED]
+ var/damage_modifier = GET_PHYSIOLOGY(src, AGGRAVATED)
if(forced)
- . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced)
+ . = adjust_brute_loss(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced)
else if(damage_modifier)
- . = adjustHealth(amount * damage_modifier * CONFIG_GET(number/damage_multiplier), updating_health, forced)
+ . = adjust_brute_loss(amount * damage_modifier * CONFIG_GET(number/damage_multiplier), updating_health, forced)
-/mob/living/basic/adjust_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
+/mob/living/basic/adjust_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
if(!can_adjust_agg_loss(amount, forced, required_bodytype))
return 0
- // Has to be structured diffrently to the other loss procs as we cant assume aggravated is in all damagecoeff
- var/damage_modifier = 1
- if(AGGRAVATED in damage_coeff)
- damage_modifier = damage_coeff[AGGRAVATED]
+ var/damage_modifier = GET_PHYSIOLOGY(src, AGGRAVATED)
if(forced)
- . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced)
+ . = adjust_brute_loss(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced)
else if(damage_modifier)
- . = adjust_health(amount * damage_modifier * CONFIG_GET(number/damage_multiplier), updating_health, forced)
+ . = adjust_brute_loss(amount * damage_modifier * CONFIG_GET(number/damage_multiplier), updating_health, forced)
-/mob/living/proc/set_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
- if(!forced && HAS_TRAIT(src, TRAIT_GODMODE))
- return 0
- . = aggloss
- aggloss = amount
- . -= aggloss
- if(. == 0) // no change, no need to update
- return 0
- if(updating_health)
- updatehealth()
-/mob/living/carbon/set_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
+/mob/living/carbon/set_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL)
if(!forced && HAS_TRAIT(src, TRAIT_GODMODE))
return FALSE
var/current = get_agg_loss()
diff --git a/modular_darkpack/modules/ambience/sounds/music/attributions.txt b/modular_darkpack/modules/ambience/sounds/music/attributions.txt
new file mode 100644
index 000000000000..d96b74517c54
--- /dev/null
+++ b/modular_darkpack/modules/ambience/sounds/music/attributions.txt
@@ -0,0 +1,5 @@
+Music Credits (Alphabetical by Artist please!)
+
+Friendly Umbra (https://youtube.com/@friendlyumbra)
+- Endron for the Planet (endron_for_the_plant.ogg)
+- Lux Umbrae (lux_umbrae.ogg)
\ No newline at end of file
diff --git a/modular_darkpack/modules/ambience/sounds/music/endron_for_the_planet.ogg b/modular_darkpack/modules/ambience/sounds/music/endron_for_the_planet.ogg
new file mode 100644
index 000000000000..e0238c2dcb66
Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/endron_for_the_planet.ogg differ
diff --git a/modular_darkpack/modules/ambience/sounds/music/lux_umbrae.ogg b/modular_darkpack/modules/ambience/sounds/music/lux_umbrae.ogg
new file mode 100644
index 000000000000..45132d8bcbb6
Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/lux_umbrae.ogg differ
diff --git a/modular_darkpack/modules/areas/code/interiors/endron_facility.dm b/modular_darkpack/modules/areas/code/interiors/endron_facility.dm
index aff517ba286e..f51d49501669 100644
--- a/modular_darkpack/modules/areas/code/interiors/endron_facility.dm
+++ b/modular_darkpack/modules/areas/code/interiors/endron_facility.dm
@@ -2,7 +2,7 @@
name = MAIN_EVIL_COMPANY + " Facility"
icon_state = "supply"
zone_type = ZONE_NO_MASQUERADE
- music_index = MUSIC_FOREST
+ music_index = MUSIC_ENDRON
fire_controled = FALSE
gauntlet_rating = 8
domain = TRUE
@@ -11,7 +11,6 @@
name = MAIN_EVIL_COMPANY + " Facility Restricted"
icon_state = "graveyard"
zone_type = ZONE_NO_MASQUERADE
- music_index = MUSIC_FOREST
fire_controled = FALSE
/area/vtm/interior/endron_facility/helipad
@@ -24,6 +23,7 @@
name = "Endron Forest Worksite"
icon_state = "supply"
zone_type = ZONE_NO_MASQUERADE
+ music_index = MUSIC_FOREST
fire_controled = TRUE
gauntlet_rating = 6
@@ -31,6 +31,7 @@
name = "Endron Processing Plant"
icon_state = "supply"
zone_type = "masquerade"
+ music_index = MUSIC_FOREST
fire_controled = TRUE
/area/vtm/interior/endron_facility/restricted
diff --git a/modular_darkpack/modules/areas/code/interiors/garou.dm b/modular_darkpack/modules/areas/code/interiors/garou.dm
index 53ca10b7ed49..9c02a2ed15ca 100644
--- a/modular_darkpack/modules/areas/code/interiors/garou.dm
+++ b/modular_darkpack/modules/areas/code/interiors/garou.dm
@@ -3,6 +3,7 @@
/area/vtm/interior/cog/caern
name = "Children of Gaia Caern"
icon_state = "cog_caern"
+ music_index = MUSIC_CAERN
zone_type = ZONE_ELYSIUM
gauntlet_rating = 5
diff --git a/modular_darkpack/modules/billiards/code/billiard.dm b/modular_darkpack/modules/billiards/code/billiard.dm
index cbbfd5656ad1..e8c78716785d 100644
--- a/modular_darkpack/modules/billiards/code/billiard.dm
+++ b/modular_darkpack/modules/billiards/code/billiard.dm
@@ -144,7 +144,7 @@
playsound(src, 'modular_darkpack/modules/billiards/sounds/poolball_strike.ogg', 75)
var/datum/storyteller_roll/pool_aiming/accuracy_roll = new()
- var/accuracy_result = accuracy_roll.st_roll(user, src)
+ var/accuracy_result = accuracy_roll.st_roll(user, src, using_item = tool)
var/datum/storyteller_roll/pool_hits/amount_to_hit_roll = new()
var/amount_to_hit_result = amount_to_hit_roll.st_roll(user, src)
var/list/balls_sunk = list()
@@ -154,7 +154,7 @@
if(!sink_ball(user, choice, accuracy_result, amount_to_hit_result, balls_sunk = balls_sunk))
break
if(length(balls_sunk))
- user.visible_message(span_notice("[user] sinks [jointext(balls_sunk, ", ")]. [length(get_balls_on_table())] left."), span_notice("You sink [jointext(balls_sunk, ", ")]!"))
+ user.visible_message(span_notice("[user] sinks [english_list(balls_sunk)]. [length(get_balls_on_table())] left."), span_notice("You sink [english_list(balls_sunk)]!"))
return ITEM_INTERACT_SUCCESS
/datum/storyteller_roll/pool_aiming
diff --git a/modular_darkpack/modules/blood_drinking/code/bite_helper_procs.dm b/modular_darkpack/modules/blood_drinking/code/bite_helper_procs.dm
index c57c61fe3665..cafdeb67e1eb 100644
--- a/modular_darkpack/modules/blood_drinking/code/bite_helper_procs.dm
+++ b/modular_darkpack/modules/blood_drinking/code/bite_helper_procs.dm
@@ -63,8 +63,7 @@
if(client)
client.images -= suckbar
QDEL_NULL(suckbar)
- suckbar_loc = drunk_from
- suckbar = image('modular_darkpack/modules/blood_drinking/icons/bloodcounter.dmi', suckbar_loc, "[round(14*(drunk_from.bloodpool/drunk_from.maxbloodpool))]", HUD_PLANE)
+ suckbar = image('modular_darkpack/modules/blood_drinking/icons/bloodcounter.dmi', drunk_from, "[round(14*(drunk_from.bloodpool/drunk_from.maxbloodpool))]", HUD_PLANE)
suckbar.pixel_z = 40
suckbar.plane = ABOVE_HUD_PLANE
suckbar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
diff --git a/modular_darkpack/modules/bodycameras/code/bodycamera.dm b/modular_darkpack/modules/bodycameras/code/bodycamera.dm
index 7bd499ea3509..f4d4bc771da9 100644
--- a/modular_darkpack/modules/bodycameras/code/bodycamera.dm
+++ b/modular_darkpack/modules/bodycameras/code/bodycamera.dm
@@ -20,10 +20,8 @@
///The camera itself, made when we need it and deleted on Destroy. Installed into the clothing item directly.
var/obj/machinery/camera/bodycamera/builtin_bodycamera
var/static/mutable_appearance/equipped_overlay = mutable_appearance('modular_darkpack/modules/bodycameras/icons/bodycamera_overlay.dmi', "bodycamera")
-
-/obj/item/bodycam_upgrade/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/violation_observer, FALSE)
+ // the guy wearing it , temporary var until i figure out something better
+ var/mob/living/carbon/wearer
/obj/item/bodycam_upgrade/examine_more(mob/user)
. = ..()
@@ -107,10 +105,11 @@
playsound(loc, 'sound/machines/beep/beep.ogg', get_clamped_volume(), TRUE, -1)
builtin_bodycamera.network = network //sync the network of the camera to us, the upgrade.
builtin_bodycamera.camera_enabled = TRUE
- var/datum/component/violation_observer/violation_component = src.GetComponent(/datum/component/violation_observer)
var/obj/item/clothing = loc
- var/mob/living/carbon/wearer = iscarbon(clothing.loc) // interacting_with_atom forces us to be on an /obj/item/clothing on a mob
- violation_component.toggle_area_of_effect(wearer)
+ if(!iscarbon(clothing.loc))
+ return
+ wearer = clothing.loc // interacting_with_atom forces us to be on an /obj/item/clothing on a mob
+ wearer.toggle_masquerade_sensitivity(TRUE)
log_game("BODYCAM TOGGLE: [(user ? key_name(user) : "SYSTEM")] turned ON [src] ([builtin_bodycamera.c_tag]) at [loc_name(src)].")
///Turns the camera off. Will be silent if 'user' is null.
@@ -120,8 +119,8 @@
playsound(loc, 'sound/machines/beep/beep.ogg', get_clamped_volume(), TRUE, -1)
if(builtin_bodycamera)
builtin_bodycamera.camera_enabled = FALSE
- var/datum/component/violation_observer/violation_component = src.GetComponent(/datum/component/violation_observer)
- violation_component.toggle_area_of_effect()
+ wearer.toggle_masquerade_sensitivity(FALSE)
+ wearer = null
log_game("BODYCAM TOGGLE: [(user ? key_name(user) : "SYSTEM")] turned OFF [src] at [loc_name(src)].")
/**
diff --git a/modular_darkpack/modules/book_sources/code/source_book_datum.dm b/modular_darkpack/modules/book_sources/code/source_book_datum.dm
index eae6fb918ae7..0eb45572d666 100644
--- a/modular_darkpack/modules/book_sources/code/source_book_datum.dm
+++ b/modular_darkpack/modules/book_sources/code/source_book_datum.dm
@@ -32,7 +32,7 @@ GLOBAL_LIST_INIT(source_book_priority, list(
/datum/source_book/wta20
name = "Werewolf The Apocalypse 20th Anniversary Edition"
offical_status = SOURCE_OFFICAL
-
+
/datum/source_book/gt_tmr
name = "The Black Hand Guide to The Tal'Mahe'Ra"
offical_status = SOURCE_OFFICAL
@@ -48,6 +48,10 @@ GLOBAL_LIST_INIT(source_book_priority, list(
/datum/source_book/mta20/bos
name = "The Book of Secrets"
+/datum/source_book/huntershunted1
+ name = "The Hunters Hunted (1st Edition)"
+ offical_status = SOURCE_OFFICAL
+
/datum/source_book/htr3
name = "Hunter the Reckoning Revised Edition"
offical_status = SOURCE_OFFICAL
diff --git a/modular_darkpack/modules/cargo/code/supply_packs/weapons.dm b/modular_darkpack/modules/cargo/code/supply_packs/weapons.dm
index 8c3d2b738800..2461b029ec7a 100644
--- a/modular_darkpack/modules/cargo/code/supply_packs/weapons.dm
+++ b/modular_darkpack/modules/cargo/code/supply_packs/weapons.dm
@@ -172,6 +172,13 @@
contains = list(/obj/item/gun/ballistic/shotgun/vampire/doublebarrel)
crate_name = "weapon crate"
+/datum/supply_pack/weapons/remington
+ name = "Weapon (Remington 11-87)"
+ desc = "Contains a Remington 11-87 Shotgun"
+ cost = 2100
+ contains = list(/obj/item/gun/ballistic/shotgun/vamp_remington)
+ crate_name = "weapon crate"
+
/datum/supply_pack/weapons/thompson
name = "Weapon (Thompson)"
desc = "Contains a Thompson SMG."
diff --git a/modular_darkpack/modules/cars/code/car.dm b/modular_darkpack/modules/cars/code/car.dm
index a2204d461f24..1ad0fd9b6283 100644
--- a/modular_darkpack/modules/cars/code/car.dm
+++ b/modular_darkpack/modules/cars/code/car.dm
@@ -257,7 +257,7 @@
return
var/datum/storyteller_roll/lockpick/our_roll = new()
our_roll.difficulty = lockpick_difficulty
- switch(our_roll.st_roll(user, src))
+ switch(our_roll.st_roll(user, src, using_item = tool))
if(ROLL_SUCCESS)
to_chat(user, span_notice("You've managed to open [src]'s lock."))
playsound(src, 'modular_darkpack/modules/cars/sounds/open.ogg', 50, TRUE)
diff --git a/modular_darkpack/modules/city_traits/code/negative_traits.dm b/modular_darkpack/modules/city_traits/code/negative_traits.dm
index 9f827ae4f44b..7fcd4c02c4e4 100644
--- a/modular_darkpack/modules/city_traits/code/negative_traits.dm
+++ b/modular_darkpack/modules/city_traits/code/negative_traits.dm
@@ -42,7 +42,7 @@
/datum/station_trait/faulty_power_grid/on_round_start()
. = ..()
- for(var/obj/fusebox/F in GLOB.fuseboxes)
+ for(var/obj/fusebox/F as anything in GLOB.fuseboxes)
if(prob(75))
continue
F.take_damage(rand(50,200))
diff --git a/modular_darkpack/modules/clothes/code/greyscale_configs/greyscale_masks.dm b/modular_darkpack/modules/clothes/code/greyscale_configs/greyscale_masks.dm
new file mode 100644
index 000000000000..e432cf2d9188
--- /dev/null
+++ b/modular_darkpack/modules/clothes/code/greyscale_configs/greyscale_masks.dm
@@ -0,0 +1,20 @@
+// Base Bandana
+/// New additions that does not exist on TG
+/datum/greyscale_config/bandana/onfloor/vampire
+ name = "Bandana (On-Floor)"
+ icon_file = 'modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi'
+
+// Striped bandana
+/datum/greyscale_config/bandana/striped/onfloor/vampire
+ name = "Striped Bandana (On-Floor)"
+ icon_file = 'modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi'
+
+// Skull bandana
+/datum/greyscale_config/bandana/skull/onfloor/vampire
+ name = "Skull Bandana (On-Floor)"
+ icon_file = 'modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi'
+
+// Face scarf
+/datum/greyscale_config/facescarf/onfloor/vampire
+ name = "Face Scarf (On-Floor)"
+ icon_file = 'modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi'
diff --git a/modular_darkpack/modules/clothes/code/hands.dm b/modular_darkpack/modules/clothes/code/hands.dm
index 6030b3b8b55c..1704e9e76346 100644
--- a/modular_darkpack/modules/clothes/code/hands.dm
+++ b/modular_darkpack/modules/clothes/code/hands.dm
@@ -70,6 +70,10 @@
desc = "Provides acid protection."
icon_state = "latex"
armor_type = /datum/armor/anti_acid_gloves
+ siemens_coefficient = /obj/item/clothing/gloves/latex::siemens_coefficient
+ clothing_traits = /obj/item/clothing/gloves/latex::clothing_traits
+ resistance_flags = /obj/item/clothing/gloves/latex::resistance_flags
+ equip_sound = /obj/item/clothing/gloves/latex::equip_sound
/obj/item/clothing/gloves/vampire/white
name = "white gloves"
diff --git a/modular_darkpack/modules/clothes/code/mask.dm b/modular_darkpack/modules/clothes/code/mask.dm
index 1f4da1ecf5eb..5a8f5a6b96f5 100644
--- a/modular_darkpack/modules/clothes/code/mask.dm
+++ b/modular_darkpack/modules/clothes/code/mask.dm
@@ -93,3 +93,24 @@
name = "scary mask"
desc = "Do you like scary movies?"
icon_state = "chaser"
+
+//Bandanas use TG sprites except the inventory icon sprite, we use Flav's for that.
+/obj/item/clothing/mask/bandana/vampire
+ desc = "A bandana, perfect for covering your face, neck, or head!"
+ ONFLOOR_ICON_HELPER('modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi')
+ greyscale_config_onfloor = /datum/greyscale_config/bandana/onfloor/vampire
+
+/obj/item/clothing/mask/bandana/striped/vampire
+ desc = "A striped bandana, perfect for covering your face, neck, or head!"
+ ONFLOOR_ICON_HELPER('modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi')
+ greyscale_config_onfloor = /datum/greyscale_config/bandana/striped/onfloor/vampire
+
+/obj/item/clothing/mask/bandana/skull/vampire
+ desc = "A skull bandana, perfect for covering your face, neck, or head!"
+ ONFLOOR_ICON_HELPER('modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi')
+ greyscale_config_onfloor = /datum/greyscale_config/bandana/skull/onfloor/vampire
+
+/obj/item/clothing/mask/facescarf/vampire
+ desc = "A heavy face scarf, perfect to keep your neck and face warm, or to cover your identity.."
+ ONFLOOR_ICON_HELPER('modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi')
+ greyscale_config_onfloor = /datum/greyscale_config/facescarf/onfloor/vampire
diff --git a/modular_darkpack/modules/clothes/code/suit.dm b/modular_darkpack/modules/clothes/code/suit.dm
index ee3a7dea9fcb..815c8d2cacae 100644
--- a/modular_darkpack/modules/clothes/code/suit.dm
+++ b/modular_darkpack/modules/clothes/code/suit.dm
@@ -338,6 +338,24 @@
icon_state = "fbi"
armor_type = /datum/armor/vampire_jacket
+/obj/item/clothing/suit/vampire/jacket/cropped
+ name = "cropped black leather jacket"
+ desc = "A slightly more skimpy version of the classic punk-wear. Provides some kind of protection."
+ icon_state = "jacket1_cut"
+ armor_type = /datum/armor/vampire_jacket
+
+/obj/item/clothing/suit/vampire/jacket/red
+ name = "red leather jacket"
+ desc = "True clothing for any punk. Provides some kind of protection."
+ icon_state = "jacket3"
+ armor_type = /datum/armor/vampire_jacket
+
+/obj/item/clothing/suit/vampire/jacket/cropped/red
+ name = "cropped red leather jacket"
+ desc = "A slightly more skimpy version of the classic punk-wear. Provides some kind of protection."
+ icon_state = "jacket3_cut"
+ armor_type = /datum/armor/vampire_jacket
+
/obj/item/clothing/suit/vampire/jacket/punk
icon_state = "punk"
armor_type = /datum/armor/punk_jacket
diff --git a/modular_darkpack/modules/clothes/code/under.dm b/modular_darkpack/modules/clothes/code/under.dm
index 149cc36bbfb3..9bab715af5e3 100644
--- a/modular_darkpack/modules/clothes/code/under.dm
+++ b/modular_darkpack/modules/clothes/code/under.dm
@@ -477,51 +477,61 @@
name = "Ardus Enterprises custodian jumpsuit"
desc = "An Ardus Enterprises custodian's uniform."
icon_state = "pentex_janitor"
+ brand = "ardus"
/obj/item/clothing/under/vampire/pentex_shortsleeve
name = "\improper " + MAIN_EVIL_COMPANY + " polo-shirt"
desc = "An " + MAIN_EVIL_COMPANY + " International employee uniform. This one is a nice polo!"
icon_state = "pentex_shortsleeve"
+ brand = "endron"
/obj/item/clothing/under/vampire/pentex_longleeve
name = "\improper " + MAIN_EVIL_COMPANY + " shirt"
desc = "An " + MAIN_EVIL_COMPANY + " International employee uniform. This one has sleeves!"
icon_state = "pentex_longsleeve"
+ brand = "endron"
/obj/item/clothing/under/vampire/pentex_turtleneck
name = "\improper " + MAIN_EVIL_COMPANY + " turtleneck"
desc = "An " + MAIN_EVIL_COMPANY + " International employee uniform. This one is a nice turtleneck!"
icon_state = "pentex_turtleneck"
+ brand = "endron"
/obj/item/clothing/under/vampire/pentex_suit
name = "\improper " + MAIN_EVIL_COMPANY + " suit"
desc = "A nice suit with a green dress-shirt. This one has an " + MAIN_EVIL_COMPANY + " International tag on it!"
icon_state = "pentex_suit"
+ brand = "endron"
/obj/item/clothing/under/vampire/pentex_suitskirt
name = "\improper " + MAIN_EVIL_COMPANY + " suitskirt"
desc = "A nice suitskirt with a green dress-shirt. This one has an " + MAIN_EVIL_COMPANY + " International tag on it!"
icon_state = "pentex_suitskirt"
+ brand = "endron"
/obj/item/clothing/under/vampire/pentex_executive_suit
name = "\improper " + MAIN_EVIL_COMPANY + " executive suit"
desc = "A white designer suit with a green dress shirt. This one has an " + MAIN_EVIL_COMPANY + " International tag on it!"
icon_state = "pentex_executivesuit"
+ brand = "endron"
/obj/item/clothing/under/vampire/pentex_executiveskirt
name = "\improper " + MAIN_EVIL_COMPANY + " executive suitskirt"
desc = "A white designer suitskirt with a green dress shirt. This one has an " + MAIN_EVIL_COMPANY + " International tag on it!"
icon_state = "pentex_executiveskirt"
+ brand = "endron"
/obj/item/clothing/under/vampire/pentex_executive_suit
name = "Endron executive suit"
desc = "A white designer suit with a green dress shirt. This one has an Endron International tag on it!"
icon_state = "pentex_executivesuit"
+ brand = "endron"
/obj/item/clothing/under/vampire/pentex_executiveskirt
name = "Endron executive suitskirt"
desc = "A white designer suitskirt with a green dress shirt. This one has an Endron International tag on it!"
icon_state = "pentex_executiveskirt"
+ brand = "endron"
/obj/item/clothing/under/vampire/gown_black
name = "black gown"
diff --git a/modular_darkpack/modules/clothes/icons/clothing.dmi b/modular_darkpack/modules/clothes/icons/clothing.dmi
index 285e3ec7a868..155ec6a8aa1f 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 be88d4fd3d3d..dfe2d0390888 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 0220c1726853..f834c0339f6f 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 b6a49bfe5c9b..c3643691941a 100644
--- a/modular_darkpack/modules/decor/code/decor.dm
+++ b/modular_darkpack/modules/decor/code/decor.dm
@@ -46,6 +46,7 @@
anchored = TRUE
density = FALSE // APOC EDIT CHANGE
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
+ flourescent = FALSE // I dont think they are.
/obj/machinery/light/floor/lamppost/Initialize(mapload)
. = ..()
@@ -195,7 +196,7 @@
layer = ABOVE_ALL_MOB_LAYER
anchored = TRUE
var/datum/looping_sound/slow_drip/looping_drips
- var/drip_chance = 5
+ var/drip_chance = 1
/obj/structure/vampipe/Initialize(mapload)
. = ..()
diff --git a/modular_darkpack/modules/decor/code/flora.dm b/modular_darkpack/modules/decor/code/flora.dm
index b643494bf17a..e48adf456fb7 100644
--- a/modular_darkpack/modules/decor/code/flora.dm
+++ b/modular_darkpack/modules/decor/code/flora.dm
@@ -162,7 +162,7 @@
icon = 'modular_darkpack/modules/decor/icons/flora64x64.dmi'
pixel_w = -16
var/datum/looping_sound/slow_drip/looping_drips
- var/drip_chance = 75
+ var/drip_chance = 50
/obj/structure/flora/rock/stalagmite/Initialize(mapload)
. = ..()
diff --git a/modular_darkpack/modules/decor/code/stick.dm b/modular_darkpack/modules/decor/code/stick.dm
index 40092e50f17e..7d99ee7c62bb 100644
--- a/modular_darkpack/modules/decor/code/stick.dm
+++ b/modular_darkpack/modules/decor/code/stick.dm
@@ -1,3 +1,10 @@
+/datum/storyteller_roll/avoid_stick
+ bumper_text = "avoid stick"
+ applicable_stats = list(STAT_PERCEPTION, STAT_STEALTH)
+ roll_output_type = ROLL_FLAG_ROLLER
+ roll_output_type_on_fail = ROLL_PUBLIC
+ spammy_roll = TRUE
+
/obj/effect/mine/stick
name = "stick"
desc = "Sticky."
@@ -43,11 +50,7 @@
if(isliving(triggerer))
var/mob/living/stepper = triggerer
if(stepper.mob_size >= MOB_SIZE_HUMAN)
- var/datum/storyteller_roll/step_roll = new()
- step_roll.applicable_stats = list(STAT_PERCEPTION, STAT_STEALTH)
- step_roll.roll_output_type = ROLL_PRIVATE
- step_roll.spammy_roll = TRUE
- var/roll_result = step_roll.st_roll(triggerer, src)
+ var/roll_result = SSroll.storyteller_roll_datum(triggerer, src, /datum/storyteller_roll/avoid_stick)
if(roll_result != ROLL_SUCCESS)
mineEffect(triggerer)
diff --git a/modular_darkpack/modules/deprecated/icons/48x32.dmi b/modular_darkpack/modules/deprecated/icons/48x32.dmi
index 2b107f0c3371..52a1edcce095 100644
Binary files a/modular_darkpack/modules/deprecated/icons/48x32.dmi and b/modular_darkpack/modules/deprecated/icons/48x32.dmi differ
diff --git a/modular_darkpack/modules/deprecated/icons/lefthand.dmi b/modular_darkpack/modules/deprecated/icons/lefthand.dmi
index 32d00c709b0b..2d49ea3b5481 100644
Binary files a/modular_darkpack/modules/deprecated/icons/lefthand.dmi and b/modular_darkpack/modules/deprecated/icons/lefthand.dmi differ
diff --git a/modular_darkpack/modules/deprecated/icons/righthand.dmi b/modular_darkpack/modules/deprecated/icons/righthand.dmi
index f25b9919871d..f2670f38ebf9 100644
Binary files a/modular_darkpack/modules/deprecated/icons/righthand.dmi and b/modular_darkpack/modules/deprecated/icons/righthand.dmi differ
diff --git a/modular_darkpack/modules/doors/code/helpers/door_helpers.dm b/modular_darkpack/modules/doors/code/helpers/door_helpers.dm
index bad5d4a5e08a..63375c530b71 100644
--- a/modular_darkpack/modules/doors/code/helpers/door_helpers.dm
+++ b/modular_darkpack/modules/doors/code/helpers/door_helpers.dm
@@ -70,9 +70,11 @@
/obj/effect/mapping_helpers/door/lock_difficulty/payload(obj/structure/vampdoor/payload)
payload.lockpick_difficulty = lock_difficulty
+/* This doesnt really exist...
/obj/effect/mapping_helpers/door/lock_difficulty/one
icon_state = "locklevel_trivial"
lock_difficulty = 1
+*/
/obj/effect/mapping_helpers/door/lock_difficulty/two
icon_state = "locklevel_trivial"
diff --git a/modular_darkpack/modules/doors/code/vampdoor.dm b/modular_darkpack/modules/doors/code/vampdoor.dm
index 1e428eb2066e..05b16acd2bbd 100644
--- a/modular_darkpack/modules/doors/code/vampdoor.dm
+++ b/modular_darkpack/modules/doors/code/vampdoor.dm
@@ -240,7 +240,7 @@
if(do_after(human_user, 1 TURNS, src))
proc_unlock(50)
break_door(human_user)
- take_damage(bash_roll.last_sucess_amount * 10, BRUTE, MELEE)
+ take_damage(1 TTRPG_DAMAGE, BRUTE, MELEE)
else
to_chat(human_user, span_danger("You must be standing next to the door to break it down."))
if(ROLL_FAILURE)
diff --git a/modular_darkpack/modules/electricity/code/fusebox.dm b/modular_darkpack/modules/electricity/code/fusebox.dm
index 21f35cf9f012..f24720e3c42d 100644
--- a/modular_darkpack/modules/electricity/code/fusebox.dm
+++ b/modular_darkpack/modules/electricity/code/fusebox.dm
@@ -86,7 +86,7 @@ GLOBAL_LIST_EMPTY(fuseboxes)
return ITEM_INTERACT_BLOCKING
var/datum/storyteller_roll/fusebox_repair/fusebox_roll = new()
- var/successes = fusebox_roll.st_roll(user, src)
+ var/successes = fusebox_roll.st_roll(user, src, using_item = tool)
var/repair_amount = successes * 40
if(repair_amount > 0)
repair_damage(repair_amount)
diff --git a/modular_darkpack/modules/ert/code/items/first_team.dm b/modular_darkpack/modules/ert/code/items/first_team.dm
index 1e8cc63e21ec..47467866a497 100644
--- a/modular_darkpack/modules/ert/code/items/first_team.dm
+++ b/modular_darkpack/modules/ert/code/items/first_team.dm
@@ -50,7 +50,6 @@
inhand_icon_state = null
worn_icon = 'modular_darkpack/modules/ert/icons/worn.dmi'
ONFLOOR_ICON_HELPER('modular_darkpack/modules/ert/icons/onfloor.dmi')
- brand = "pentex"
/obj/item/clothing/head/vampire/darkpack_ert/firstteam_helmet
name = "\improper First Team helmet"
@@ -60,7 +59,7 @@
visor_flags_inv = HIDEFACE|HIDESNOUT
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
-
+ brand = "pentex"
//------------ARMOR------------
/obj/item/clothing/suit/vampire/darkpack_ert
@@ -77,7 +76,6 @@
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
max_integrity = 250
resistance_flags = NONE
- brand = "pentex"
/obj/item/clothing/suit/vampire/darkpack_ert/Initialize(mapload)
. = ..()
@@ -93,6 +91,7 @@
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
clothing_traits = list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)
+ brand = "pentex"
//------------SUIT------------
@@ -106,7 +105,6 @@
icon = 'modular_darkpack/modules/ert/icons/clothing.dmi'
worn_icon = 'modular_darkpack/modules/ert/icons/worn.dmi'
ONFLOOR_ICON_HELPER('modular_darkpack/modules/ert/icons/onfloor.dmi')
- brand = "pentex"
/obj/item/clothing/under/vampire/darkpack_ert/Initialize(mapload)
. = ..()
diff --git a/modular_darkpack/modules/ert/code/items/national_guard_items.dm b/modular_darkpack/modules/ert/code/items/national_guard_items.dm
new file mode 100644
index 000000000000..6495acc48d00
--- /dev/null
+++ b/modular_darkpack/modules/ert/code/items/national_guard_items.dm
@@ -0,0 +1,31 @@
+
+//------------Mask------------
+/obj/item/clothing/mask/gas/darkpack/military
+ name = "\improper Military Gas Mask"
+ desc = "A close-fitting tactical gas mask designed to protect against biological hazards and public accountability."
+ icon_state = "gasmask_NG"
+ icon = 'modular_darkpack/modules/ert/icons/clothing.dmi'
+ inhand_icon_state = null
+ worn_icon = 'modular_darkpack/modules/ert/icons/worn.dmi'
+ ONFLOOR_ICON_HELPER('modular_darkpack/modules/ert/icons/onfloor.dmi')
+ flags_inv = HIDEFACIALHAIR | HIDEFACE | HIDEEYES | HIDEEARS | HIDEHAIR | HIDESNOUT
+ visor_flags_inv = 0
+ flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES | PEPPERPROOF
+ visor_flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES | PEPPERPROOF
+ fishing_modifier = 2
+ pepper_tint = FALSE
+ brand = "herculean"
+
+
+/obj/item/clothing/mask/gas/darkpack/military/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
+ . = ..()
+ if(!isinhands)
+ . += emissive_appearance('modular_darkpack/modules/ert/icons/worn.dmi', "gasmask_emissive", src, alpha = src.alpha)
+
+/obj/item/clothing/mask/gas/darkpack/military/pentex
+ name = "\improper Corporate Gas Mask"
+ desc = "Provides protection from smoke, smog, and whatever biological horror is rampaging through your clandestine laboratory."
+ icon_state = "gasmask_pentex"
+ brand = "endron"
+
+//TODO: Finish CBRN Detachment + Equipment, masks are added seperately for atomization purposes
diff --git a/modular_darkpack/modules/ert/code/outfits/national_guard_outfits.dm b/modular_darkpack/modules/ert/code/outfits/national_guard_outfits.dm
index 1bf4576c27ee..a9e090a6694d 100644
--- a/modular_darkpack/modules/ert/code/outfits/national_guard_outfits.dm
+++ b/modular_darkpack/modules/ert/code/outfits/national_guard_outfits.dm
@@ -16,6 +16,7 @@
/obj/item/knife/vamp = 1,
/obj/item/storage/medkit/darkpack/ifak = 1,
/obj/item/megaphone = 1,
+ /obj/item/clothing/mask/gas/darkpack/military = 1,
)
/datum/outfit/job/vampire/ert/national_guard/medic
@@ -28,7 +29,7 @@
l_pocket = /obj/item/vamp/keys/police/federal
shoes = /obj/item/clothing/shoes/vampire/jackboots
belt = /obj/item/defibrillator/compact/loaded
- suit = /obj/item/clothing/suit/vampire/labcoat/director
+ suit = /obj/item/clothing/suit/vampire/vest/army
head = /obj/item/clothing/head/beret
id = /obj/item/card/first_aid
r_hand = /obj/item/gun/ballistic/automatic/darkpack/mp5
@@ -38,6 +39,7 @@
/obj/item/storage/medkit/darkpack/combat = 1,
/obj/item/storage/medkit/darkpack/burn = 1,
/obj/item/storage/medkit/darkpack/brute = 1,
+ /obj/item/clothing/mask/gas/darkpack/military = 1,
)
/datum/outfit/job/vampire/ert/national_guard/rifleman
@@ -57,8 +59,9 @@
/obj/item/ammo_box/magazine/darkpackaug = 1,
/obj/item/grenade/frag = 1,
/obj/item/grenade/flashbang = 1,
- /obj/item/grenade/smokebomb = 1,
+ /obj/item/grenade/chem_grenade/teargas = 1,
/obj/item/storage/medkit/darkpack/ifak = 1,
+ /obj/item/clothing/mask/gas/darkpack/military = 1,
)
/datum/outfit/job/vampire/ert/national_guard/explosives
@@ -70,11 +73,12 @@
shoes = /obj/item/clothing/shoes/vampire/jackboots
suit = /obj/item/clothing/suit/vampire/eod
head = /obj/item/clothing/head/vampire/eod
+ mask = /obj/item/clothing/mask/gas/darkpack/military
id = /obj/item/card/swat
backpack_contents = list(
- /obj/item/grenade/frag = 1,
+ /obj/item/storage/box/syndie_kit/frag_grenades = 1,
/obj/item/grenade/flashbang = 1,
- /obj/item/grenade/smokebomb = 1,
+ /obj/item/grenade/chem_grenade/teargas = 1,
/obj/item/molotov = 1,
/obj/item/gun/ballistic/automatic/darkpack/uzi = 1,
/obj/item/liquid_flamethrower = 1,
@@ -92,10 +96,12 @@
r_hand = /obj/item/gun/ballistic/automatic/darkpack/autosniper
shoes = /obj/item/clothing/shoes/vampire/jackboots
suit = /obj/item/clothing/suit/vampire/vest/army
+ mask = /obj/item/clothing/mask/gas/darkpack/military
head = /obj/item/clothing/head/beret
id = /obj/item/card/swat
backpack_contents = list(
- /obj/item/ammo_box/magazine/darkpack556 = 1,
+ /obj/item/ammo_box/magazine/vamp762x51PSG1 = 1,
+ /obj/item/ammo_box/darkpack/c762x51mm = 1,
/obj/item/ammo_box/magazine/m9mm = 1,
/obj/item/storage/medkit/darkpack/ifak = 1,
/obj/item/binoculars = 1,
diff --git a/modular_darkpack/modules/ert/icons/clothing.dmi b/modular_darkpack/modules/ert/icons/clothing.dmi
index 874ee0ec4d74..76ee35968eb6 100644
Binary files a/modular_darkpack/modules/ert/icons/clothing.dmi and b/modular_darkpack/modules/ert/icons/clothing.dmi differ
diff --git a/modular_darkpack/modules/ert/icons/lefthand.dmi b/modular_darkpack/modules/ert/icons/lefthand.dmi
index 702f8a019b75..2502581caeec 100644
Binary files a/modular_darkpack/modules/ert/icons/lefthand.dmi and b/modular_darkpack/modules/ert/icons/lefthand.dmi differ
diff --git a/modular_darkpack/modules/ert/icons/onfloor.dmi b/modular_darkpack/modules/ert/icons/onfloor.dmi
index b2fbba961c4a..02e1aa4ee2bd 100644
Binary files a/modular_darkpack/modules/ert/icons/onfloor.dmi and b/modular_darkpack/modules/ert/icons/onfloor.dmi differ
diff --git a/modular_darkpack/modules/ert/icons/righthand.dmi b/modular_darkpack/modules/ert/icons/righthand.dmi
index 8ba47e602e5e..602258ddc58b 100644
Binary files a/modular_darkpack/modules/ert/icons/righthand.dmi and b/modular_darkpack/modules/ert/icons/righthand.dmi differ
diff --git a/modular_darkpack/modules/ert/icons/worn.dmi b/modular_darkpack/modules/ert/icons/worn.dmi
index 3d2ff847ee19..81b303db726e 100644
Binary files a/modular_darkpack/modules/ert/icons/worn.dmi and b/modular_darkpack/modules/ert/icons/worn.dmi differ
diff --git a/modular_darkpack/modules/escape_menu/escape_menu.dm b/modular_darkpack/modules/escape_menu/escape_menu.dm
index 485e17b59846..0cd4095a1dc2 100644
--- a/modular_darkpack/modules/escape_menu/escape_menu.dm
+++ b/modular_darkpack/modules/escape_menu/escape_menu.dm
@@ -2,7 +2,7 @@
/datum/escape_menu/send_init()
. = ..()
send_update(list(
- "isMentor" = !!client.mentor_datum,
+ "isMentor" = client.is_mentor(),
"mentors" = build_mentor_list(),
))
diff --git a/modular_darkpack/modules/fire/code/sprinkler.dm b/modular_darkpack/modules/fire/code/sprinkler.dm
index 859a22db193d..28f19f167fcd 100644
--- a/modular_darkpack/modules/fire/code/sprinkler.dm
+++ b/modular_darkpack/modules/fire/code/sprinkler.dm
@@ -14,6 +14,7 @@
icon_state = "sprinkler"
layer = ABOVE_ALL_MOB_LAYER
pixel_y = 8
+ processing_flags = START_PROCESSING_MANUALLY
var/fire_detection_range = 1
var/current_spray_range = 1
var/sprinkler_spray_range = 6
@@ -23,6 +24,7 @@
/// If the sprinkler triggers and is triggered my the area being set to on fire
var/area_managed = FALSE
var/datum/looping_sound/sprinkler/looping_sound
+ var/sprinkling_timer
/obj/machinery/sprinkler/Initialize(mapload)
. = ..()
@@ -36,7 +38,6 @@
for(var/turf/open/open_turf in RANGE_TURFS(fire_detection_range, src))
RegisterSignals(open_turf, list(COMSIG_ATOM_FIRE_ACT, COMSIG_TURF_HOTSPOT_EXPOSE, COMSIG_TURF_IGNITED), PROC_REF(fire_act_listener))
-
/obj/machinery/sprinkler/proc/fire_act_listener()
SIGNAL_HANDLER
@@ -44,14 +45,13 @@
/obj/machinery/sprinkler/fire_act(exposed_temperature, exposed_volume)
trigger_sprinkler()
- . = ..()
+ return ..()
/obj/machinery/sprinkler/process(seconds_per_tick)
- if(has_water_reclaimer)
- reagents.add_reagent(/datum/reagent/water, 2.5 * seconds_per_tick)
+ var/process_needed = FALSE
if(is_active())
- looping_sound.start()
+ process_needed = TRUE
for(var/turf/open/turf in circle_view_turfs(src, current_spray_range))
reagents.expose(turf, TOUCH, current_spray_range/sprinkler_spray_range)
new /obj/effect/temp_visual/rain(turf)
@@ -60,10 +60,14 @@
reagents.remove_all(1 * seconds_per_tick)
current_spray_range = min(sprinkler_spray_range, current_spray_range + 2)
- else
- looping_sound.stop()
- current_spray_range = 1
- update_appearance(UPDATE_OVERLAYS)
+
+ if(has_water_reclaimer && (reagents.total_volume < reagents.maximum_volume))
+ process_needed = TRUE
+ reagents.add_reagent(/datum/reagent/water, 2.5 * seconds_per_tick)
+
+ //we're done processing everything, we'll automatically boot back up in toggle sprinkler
+ if(!process_needed)
+ return PROCESS_KILL
/obj/machinery/sprinkler/update_overlays()
. = ..()
@@ -76,12 +80,26 @@
if(!area_managed)
return
var/area/my_area = get_area(src)
- if(my_area)
+ if(!my_area)
+ return
+
+ if(!(datum_flags & DF_ISPROCESSING))
+ begin_processing()
+ looping_sound.start()
my_area.set_fire_effect(TRUE, AREA_FAULT_AUTOMATIC, name)
my_area.alarm_manager.send_alarm(ALARM_FIRE, src)
- spawn(30 SECONDS)
- my_area.set_fire_effect(FALSE)
- my_area.alarm_manager.clear_alarm(ALARM_FIRE, my_area)
+ update_appearance(UPDATE_OVERLAYS)
+
+ if(sprinkling_timer)
+ deltimer(sprinkling_timer)
+ sprinkling_timer = addtimer(CALLBACK(src, PROC_REF(finish_sprinkling), my_area), 30 SECONDS, TIMER_STOPPABLE)
+
+/obj/machinery/sprinkler/proc/finish_sprinkling(area/my_area)
+ my_area.set_fire_effect(FALSE)
+ my_area.alarm_manager.clear_alarm(ALARM_FIRE, my_area)
+ looping_sound.stop()
+ current_spray_range = 1
+ update_appearance(UPDATE_OVERLAYS)
/obj/machinery/sprinkler/proc/is_active()
if(last_fire_detection && (last_fire_detection + 15 SECONDS > world.time))
diff --git a/modular_darkpack/modules/food/code/food.dm b/modular_darkpack/modules/food/code/food.dm
index 3ee8facf119c..e2d4663cd59b 100644
--- a/modular_darkpack/modules/food/code/food.dm
+++ b/modular_darkpack/modules/food/code/food.dm
@@ -24,6 +24,7 @@
ONFLOOR_ICON_HELPER('modular_darkpack/modules/food/icons/food_onfloor.dmi')
custom_price = 1
food_flags = FOOD_BITE_SPRITE
+ foodtypes = JUNKFOOD|GRAIN|DAIRY|FRIED|SUGAR|BREAKFAST|CHOCOLATE
/obj/item/food/pizzaslice/square
name = "square pizza slice"
@@ -141,6 +142,7 @@
/obj/item/food/vampire/icecream/chocolate
icon_state = "icecream1"
tastes = list("chocolate" = 2, "ice cream" = 2)
+ foodtypes = FRUIT | DAIRY | SUGAR | CHOCOLATE
food_reagents = list(/datum/reagent/consumable/hot_coco = 4, /datum/reagent/consumable/salt = 1, /datum/reagent/consumable/cream = 2, /datum/reagent/consumable/vanilla = 1, /datum/reagent/consumable/sugar = 4)
/obj/item/food/vampire/icecream/berry
diff --git a/modular_darkpack/modules/forensics/code/forensic_gatherer.dm b/modular_darkpack/modules/forensics/code/forensic_gatherer.dm
index 63895dcec7e0..3af9a042007b 100644
--- a/modular_darkpack/modules/forensics/code/forensic_gatherer.dm
+++ b/modular_darkpack/modules/forensics/code/forensic_gatherer.dm
@@ -76,7 +76,7 @@
if(ishuman(scanned_atom))
var/mob/living/carbon/human/scanned_human = scanned_atom
investigate_roll.difficulty = 3
- var/investigation_roll = investigate_roll.st_roll(user, scanned_human)
+ var/investigation_roll = investigate_roll.st_roll(user, scanned_human, using_item = src)
if(investigation_roll != ROLL_SUCCESS)
log_entry.add_data_entry(DETSCAN_CATEGORY_FINGERS, list("Improper fingerprints; try again."))
else
@@ -89,7 +89,7 @@
else if(!ismob(scanned_atom))
var/list/atom_fingerprints = GET_ATOM_FINGERPRINTS(scanned_atom)
investigate_roll.difficulty = 5
- var/investigation_roll = investigate_roll.st_roll(user, scanned_atom)
+ var/investigation_roll = investigate_roll.st_roll(user, scanned_atom, using_item = src)
if(investigation_roll != ROLL_SUCCESS)
log_entry.add_data_entry(DETSCAN_CATEGORY_FINGERS, list("Improper gathering; try again."))
else
@@ -113,7 +113,7 @@
if(istype(scanned_atom, /obj/item/ammo_casing))
investigate_roll.difficulty = 7
- var/investigation_roll = investigate_roll.st_roll(user, scanned_atom)
+ var/investigation_roll = investigate_roll.st_roll(user, scanned_atom, using_item = src)
var/obj/item/ammo_casing/casing = scanned_atom
if(investigation_roll != ROLL_SUCCESS)
log_entry.add_data_entry(DETSCAN_CATEGORY_MICROSTAMP, list("[casing.name] has an incomplete microstamp; you can't make it out."))
@@ -126,7 +126,7 @@
if(istype(scanned_atom, /obj/item/card/id))
var/obj/item/card/id/user_id = scanned_atom
investigate_roll.difficulty = 3
- var/investigation_roll = investigate_roll.st_roll(user, scanned_atom)
+ var/investigation_roll = investigate_roll.st_roll(user, scanned_atom, using_item = src)
if(investigation_roll != ROLL_SUCCESS)
log_entry.add_data_entry(DETSCAN_CATEGORY_ACCESS, list("Improper gathering; try again."))
else
diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm
index 85c02a00df31..11e1080d286f 100644
--- a/modular_darkpack/modules/frenzy/code/frenzy.dm
+++ b/modular_darkpack/modules/frenzy/code/frenzy.dm
@@ -6,26 +6,32 @@
return
if(IS_UNCONSCIOUS(src))
return
- add_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA), FRENZY_TRAIT)
+
+ set_jitter_if_lower(1 SCENES)
+
message_admins("[ADMIN_LOOKUPFLW(src)] has entered frenzy[target ? " targeting [ADMIN_LOOKUPFLW(target)]": ""]. ([source])")
log_combat(src, (src || target), "has frenzied on because of \"[source]\" on")
if(fleeing)
to_chat(src, span_danger("FLEE."))
+ src.balloon_alert(src, "flee!")
+ apply_status_effect(/datum/status_effect/frenzy/flee, target)
else
to_chat(src, span_bolddanger("FRENZY."))
+ src.balloon_alert(src, "frenzy!")
+ if(get_kindred_splat(src))
+ apply_status_effect(/datum/status_effect/frenzy/vampire_hunger, target)
+ else
+ apply_status_effect(/datum/status_effect/frenzy, target)
SEND_SOUND(src, sound('modular_darkpack/modules/frenzy/sounds/frenzy.ogg', volume = 50))
- apply_status_effect(/datum/status_effect/frenzy, target)
-
// This is assuming no other interaction happens to remove it before this.
addtimer(CALLBACK(src, PROC_REF(exit_frenzy_mode)), 1 SCENES)
/mob/living/proc/exit_frenzy_mode()
if(!HAS_TRAIT(src, TRAIT_IN_FRENZY))
return
- remove_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA), FRENZY_TRAIT)
log_message("exited frenzy.", LOG_ATTACK, color="red")
remove_status_effect(/datum/status_effect/frenzy)
@@ -33,7 +39,7 @@
/datum/storyteller_roll/frenzy
abstract_type = /datum/storyteller_roll/frenzy
bumper_text = "frenzy"
- roll_output_type = ROLL_PRIVATE_AND_TARGET
+ roll_output_type = ROLL_FLAG_ROLLER|ROLL_FLAG_TARGET
numerical = TRUE
/datum/storyteller_roll/frenzy/rotschreck
@@ -43,7 +49,7 @@
/datum/storyteller_roll/frenzy/kindred
// Specificly kindred as I dont really think brujah are meant to rotschreck easier.
-/datum/storyteller_roll/frenzy/kindred/calculate_used_difficulty(mob/living/roller)
+/datum/storyteller_roll/frenzy/kindred/using_difficulty(mob/living/roller, atom/target)
. = ..()
// V20 p.51
if(HAS_TRAIT(roller, TRAIT_DIFFICULT_FRENZY))
@@ -51,14 +57,14 @@
if(HAS_TRAIT(roller, TRAIT_UNCONTROLLABLE))
. = 10
-/datum/storyteller_roll/frenzy/kindred/calculate_used_dice(mob/living/roller, bonus)
+/datum/storyteller_roll/frenzy/kindred/using_bonus(mob/living/roller, atom/target, bonus_added)
. = ..()
if(HAS_TRAIT(roller, TRAIT_CALM_HEART))
. += 2
/datum/storyteller_roll/frenzy/rage
-/datum/storyteller_roll/frenzy/rage/calculate_used_difficulty(mob/living/roller)
+/datum/storyteller_roll/frenzy/rage/using_difficulty(mob/living/roller, atom/target)
. = ..()
if(HAS_TRAIT(roller, TRAIT_DIFFICULT_RAGE))
. += 1
diff --git a/modular_darkpack/modules/frenzy/code/status_effect.dm b/modular_darkpack/modules/frenzy/code/status_effect.dm
index 4d321f53b2b9..71d0d3dd507d 100644
--- a/modular_darkpack/modules/frenzy/code/status_effect.dm
+++ b/modular_darkpack/modules/frenzy/code/status_effect.dm
@@ -2,7 +2,7 @@
priority = CLIENT_COLOR_IMPORTANT_PRIORITY
color = COLOR_LIGHT_GRAYISH_RED
-/datum/status_effect/frenzy
+/datum/status_effect/frenzy //Generic attack frenzy
id = "frenzy"
duration = STATUS_EFFECT_PERMANENT
status_type = STATUS_EFFECT_REFRESH
@@ -10,6 +10,15 @@
var/datum/weakref/frenzy_target_ref
var/datum/weakref/frenzy_overlay_ref
var/seconds_alone = 0
+ var/frenzy_traits = list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_CANNOT_FOCUS, TRAIT_ILLITERATE)
+
+/datum/status_effect/frenzy/on_apply()
+ owner.apply_status_effect(/datum/status_effect/grouped/see_no_names, TRAIT_STATUS_EFFECT(id))
+ owner.apply_status_effect(/datum/status_effect/grouped/static_look, TRAIT_STATUS_EFFECT(id))
+ owner.add_blocked_language(subtypesof(/datum/language), language_flags = UNDERSTOOD_LANGUAGE, source = id)
+ owner.add_traits(frenzy_traits, TRAIT_STATUS_EFFECT(id))
+ owner.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+ return TRUE
/datum/status_effect/frenzy/on_creation(mob/living/new_owner, atom/frenzy_target)
. = ..()
@@ -35,6 +44,11 @@
owner.remove_client_colour(FRENZY_TRAIT)
var/mob/living/carbon/carbon_owner = astype(owner)
carbon_owner?.exit_frenzy_mode()
+ owner.remove_status_effect(/datum/status_effect/grouped/see_no_names, TRAIT_STATUS_EFFECT(id))
+ owner.remove_status_effect(/datum/status_effect/grouped/static_look, TRAIT_STATUS_EFFECT(id))
+ owner.remove_blocked_language(subtypesof(/datum/language), language_flags = UNDERSTOOD_LANGUAGE, source = id)
+ owner.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+ owner.remove_traits(frenzy_traits, TRAIT_STATUS_EFFECT(id))
return ..()
/datum/status_effect/frenzy/tick(seconds_between_ticks)
@@ -52,6 +66,13 @@
if(seconds_alone >= 15)
qdel(src)
+/datum/status_effect/frenzy/vampire_hunger
+ id = "hunger frenzy"
+ frenzy_traits = list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_CANNOT_FOCUS, TRAIT_ILLITERATE, TRAIT_PERMAFANGS, TRAIT_STRONG_GRABBER)
+
+/datum/status_effect/frenzy/flee //Generic fleeing frenzy
+ id = "fleeing frenzy"
+ frenzy_traits = list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA, TRAIT_CANNOT_FOCUS, TRAIT_ILLITERATE, TRAIT_PACIFISM)
/atom/movable/screen/alert/status_effect/frenzy
name = "Frenzy"
diff --git a/modular_darkpack/modules/guestbook/code/guestbook.dm b/modular_darkpack/modules/guestbook/code/guestbook.dm
index 96632f3ae56d..470be30631f5 100644
--- a/modular_darkpack/modules/guestbook/code/guestbook.dm
+++ b/modular_darkpack/modules/guestbook/code/guestbook.dm
@@ -8,8 +8,11 @@
/// Associative list of known guests, real_name = known_name
var/list/known_names
+ var/list/datum/known_identity/known_identity_datums
+
/datum/guestbook/Destroy(force)
- known_names = null
+ LAZYNULL(known_names)
+ LAZYNULL(known_identity_datums)
return ..()
/datum/guestbook/ui_interact(mob/user, datum/tgui/ui)
diff --git a/modular_darkpack/modules/guestbook/code/known_identities.dm b/modular_darkpack/modules/guestbook/code/known_identities.dm
new file mode 100644
index 000000000000..54d26ef32980
--- /dev/null
+++ b/modular_darkpack/modules/guestbook/code/known_identities.dm
@@ -0,0 +1,66 @@
+/datum/guestbook/proc/on_examine(mob/living/examiner, mob/living/examined, result_combined)
+ if(!istype(examiner) || !istype(examined))
+ return
+
+ var/datum/known_identity/identity = memorize_guy(examined)
+
+ var/image/examined_image = image(icon = examined.icon, icon_state = examined.icon_state)
+ examined_image.overlays = examined.overlays
+ identity.last_examine_image = examined_image
+
+ identity.last_examine_time = world.time
+ identity.last_examine_block = result_combined
+
+/datum/guestbook/proc/memorize_guy(mob/living/target)
+ if(!istype(target))
+ return
+
+ if(known_identity_datums && known_identity_datums[target])
+ return known_identity_datums[target]
+
+ RegisterSignal(target, COMSIG_QDELETING, PROC_REF(retcon_guy))
+
+ var/datum/known_identity/new_entry = new()
+ LAZYSET(known_identity_datums, target, new_entry)
+
+ return new_entry
+
+/datum/guestbook/proc/unmemorize_guy(mob/living/target)
+ UnregisterSignal(target, COMSIG_QDELETING)
+ LAZYREMOVE(known_identity_datums, target)
+
+/datum/guestbook/proc/retcon_guy(mob/living/source)
+ SIGNAL_HANDLER
+
+ unmemorize_guy(source)
+
+/datum/guestbook/proc/pick_known_guy(mob/living/user)
+ RETURN_TYPE(/mob/living)
+
+ var/list/choosable_targets = list()
+ var/list/possible_chooseable_atoms = list()
+
+ for(var/mob/living/known_guy as anything in known_identity_datums)
+ choosable_targets[GET_GUESTBOOK_NAME(user, known_guy)] = known_identity_datums[known_guy].last_examine_image
+ possible_chooseable_atoms[GET_GUESTBOOK_NAME(user, known_guy)] = known_guy
+
+ var/name_choice = show_radial_menu(
+ user,
+ user,
+ choosable_targets,
+ radius = 40,
+ require_near = TRUE,
+ tooltips = TRUE,
+ autopick_single_option = FALSE,
+ )
+
+ if(isnull(name_choice))
+ return null
+
+ return possible_chooseable_atoms[name_choice]
+
+
+/datum/known_identity
+ var/last_examine_time
+ var/last_examine_image
+ var/last_examine_block
diff --git a/modular_darkpack/modules/jobs/code/_jobs.dm b/modular_darkpack/modules/jobs/code/_jobs.dm
index 9195476f531c..4f4dcfdcc4ef 100644
--- a/modular_darkpack/modules/jobs/code/_jobs.dm
+++ b/modular_darkpack/modules/jobs/code/_jobs.dm
@@ -112,6 +112,7 @@
abstract_type = /datum/job/vampire
exp_required_type = EXP_TYPE_PLAYTIME
exp_granted_type = EXP_TYPE_PLAYTIME
+ tgui_icon = FA_ICON_QUESTION
/**
* This type is used to indicate a lack of a job.
diff --git a/modular_darkpack/modules/jobs/code/anarchs/baron.dm b/modular_darkpack/modules/jobs/code/anarchs/baron.dm
index 2cafd9fe23e0..c352759f2d07 100644
--- a/modular_darkpack/modules/jobs/code/anarchs/baron.dm
+++ b/modular_darkpack/modules/jobs/code/anarchs/baron.dm
@@ -13,6 +13,8 @@
/datum/job_department/anarch,
)
+ tgui_icon = FA_ICON_GLASS_MARTINI
+
exp_requirements = EXP_REQ_HEAD
exp_required_type_department = EXP_TYPE_ANARCH
diff --git a/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm b/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm
index cb5f2d547614..599b228a1234 100644
--- a/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm
+++ b/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm
@@ -13,6 +13,8 @@
/datum/job_department/anarch,
)
+ tgui_icon = FA_ICON_SHIELD_HALVED
+
alt_titles = list(
"Bouncer",
"Coyote",
diff --git a/modular_darkpack/modules/jobs/code/anarchs/emissary.dm b/modular_darkpack/modules/jobs/code/anarchs/emissary.dm
index 7c1a1ac7076b..d8e7e66cd745 100644
--- a/modular_darkpack/modules/jobs/code/anarchs/emissary.dm
+++ b/modular_darkpack/modules/jobs/code/anarchs/emissary.dm
@@ -13,6 +13,8 @@
/datum/job_department/anarch,
)
+ tgui_icon = FA_ICON_WINE_GLASS_ALT
+
known_contacts = list(
JOB_BARON,
JOB_BRUISER,
diff --git a/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm b/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm
index 84922bc55cd3..27cf59df1330 100644
--- a/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm
+++ b/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm
@@ -13,6 +13,8 @@
/datum/job_department/anarch,
)
+ tgui_icon = FA_ICON_SHIELD
+
known_contacts = list(
JOB_BARON,
JOB_BRUISER,
diff --git a/modular_darkpack/modules/jobs/code/anarchs/tapster.dm b/modular_darkpack/modules/jobs/code/anarchs/tapster.dm
index 3efc62832d99..b102cd4e918c 100644
--- a/modular_darkpack/modules/jobs/code/anarchs/tapster.dm
+++ b/modular_darkpack/modules/jobs/code/anarchs/tapster.dm
@@ -13,6 +13,7 @@
/datum/job_department/anarch,
)
+ tgui_icon = FA_ICON_GLASS_WHISKEY
/* // APOC EDIT REMOVAL - JOBS
alt_titles = list(
"Bartender",
diff --git a/modular_darkpack/modules/jobs/code/camarilla/harpy.dm b/modular_darkpack/modules/jobs/code/camarilla/harpy.dm
index 194edcfb6cd9..f8f58422a94b 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/harpy.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/harpy.dm
@@ -18,6 +18,8 @@
/datum/job_department/camarilla,
)
+ tgui_icon = FA_ICON_WINE_GLASS_EMPTY
+
minimal_generation = 12 //Uncomment when players get exp enough
maximal_generation = 9
maximum_immortal_age = 200
diff --git a/modular_darkpack/modules/jobs/code/camarilla/hound.dm b/modular_darkpack/modules/jobs/code/camarilla/hound.dm
index 0ae7d3792e9a..574218cf73b6 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/hound.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/hound.dm
@@ -16,6 +16,8 @@
/datum/job_department/camarilla,
)
+ tgui_icon = FA_ICON_SHIELD_HALVED
+
maximal_generation = 9
maximum_immortal_age = 200
minimum_masquerade = 3
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 2ace6c81251a..002e72e624a0 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/primogens/banu_haqim.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/banu_haqim.dm
@@ -18,6 +18,8 @@
/datum/job_department/camarilla,
)
+ tgui_icon = FA_ICON_CROWN
+
minimal_generation = 12
minimum_immortal_age = 50
minimum_masquerade = 5
diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm
index 3c49f735b8ec..4238297f4f6b 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm
@@ -19,6 +19,8 @@
/datum/job_department/camarilla,
)
+ tgui_icon = FA_ICON_CROWN
+
minimal_generation = 12
minimum_immortal_age = 50
minimum_masquerade = 5
diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm
index 22f812ddde85..4d4cf89259fe 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm
@@ -19,6 +19,8 @@
/datum/job_department/camarilla,
)
+ tgui_icon = FA_ICON_CROWN
+
minimal_generation = 12
minimum_immortal_age = 5 // Actually Malkavian Primo is whoever showed for work that day. Crazy bunch.
minimum_masquerade = 5
@@ -35,7 +37,7 @@
JOB_PRIMOGEN_LASOMBRA,
JOB_PRIMOGEN_VENTRUE,
JOB_PRIMOGEN_NOSFERATU,
- JOB_CHANTRY_REGENT
+ JOB_CHANTRY_REGENT,
)
/datum/outfit/job/vampire/malkav
@@ -50,4 +52,10 @@
shoes = /obj/item/clothing/shoes/vampire/jackboots
head = /obj/item/clothing/head/vampire/malkav
l_pocket = /obj/item/smartphone/malkavian_primo
- backpack_contents = list(/obj/item/vamp/keys/malkav/primogen=1, /obj/item/card/credit/elder=1, /obj/item/card/whip, /obj/item/card/steward, /obj/item/card/myrmidon)
+ backpack_contents = list(
+ /obj/item/vamp/keys/malkav/primogen = 1,
+ /obj/item/card/credit/elder = 1,
+ /obj/item/card/whip,
+ /obj/item/card/steward,
+ /obj/item/card/myrmidon,
+ )
diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm
index 659eca7886e2..94cc7ce15ce2 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm
@@ -19,6 +19,8 @@
/datum/job_department/city_services
)
+ tgui_icon = FA_ICON_CROWN
+
minimal_generation = 12
minimum_immortal_age = 15
minimum_masquerade = 5
diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm
index 1e3886caa54c..26799b6e5ef3 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm
@@ -19,6 +19,8 @@
/datum/job_department/camarilla,
)
+ tgui_icon = FA_ICON_CROWN
+
minimal_generation = 12
minimum_immortal_age = 50
minimum_masquerade = 5
diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm
index 1cae00c12665..82aa963f5ffa 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm
@@ -18,6 +18,8 @@
/datum/job_department/camarilla,
)
+ tgui_icon = FA_ICON_CROWN
+
minimal_generation = 12
minimum_immortal_age = 50
minimum_masquerade = 5
diff --git a/modular_darkpack/modules/jobs/code/camarilla/prince.dm b/modular_darkpack/modules/jobs/code/camarilla/prince.dm
index 9b2e778f2594..fd41a161a8f5 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/prince.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/prince.dm
@@ -19,6 +19,8 @@
/datum/job_department/camarilla,
)
+ tgui_icon = FA_ICON_CROWN
+
minimal_generation = 10
minimum_immortal_age = 75
minimum_masquerade = 5
diff --git a/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm b/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm
index 530ab2a19d9a..fd1ec889c9a2 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm
@@ -18,6 +18,8 @@
/datum/job_department/camarilla,
)
+ tgui_icon = FA_ICON_WINE_GLASS
+
minimal_generation = 12
minimum_masquerade = 5
allowed_splats = list(SPLAT_KINDRED)
diff --git a/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm b/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm
index 5017b24790d5..e50521489a09 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm
@@ -31,6 +31,8 @@
JOB_HOUND
)
+ tgui_icon = FA_ICON_SHIELD
+
/datum/outfit/job/vampire/sheriff
name = JOB_SHERIFF
jobtype = /datum/job/vampire/sheriff
diff --git a/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm b/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm
index 7fde64e27b32..e14b4c136a8f 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm
@@ -12,6 +12,8 @@
/datum/job_department/camarilla,
)
+ tgui_icon = FA_ICON_PAPERCLIP
+
alt_titles = list(
"Tower Employee",
"Tower Cleaner",
diff --git a/modular_darkpack/modules/jobs/code/clinic/director.dm b/modular_darkpack/modules/jobs/code/clinic/director.dm
index a3414de9b64a..629d689146cc 100644
--- a/modular_darkpack/modules/jobs/code/clinic/director.dm
+++ b/modular_darkpack/modules/jobs/code/clinic/director.dm
@@ -16,6 +16,8 @@
/datum/job_department/clinic,
)
+ tgui_icon = FA_ICON_USER_MD
+
known_contacts = list(
JOB_DOCTOR,
JOB_PRIMOGEN_MALKAVIAN
diff --git a/modular_darkpack/modules/jobs/code/clinic/doctor.dm b/modular_darkpack/modules/jobs/code/clinic/doctor.dm
index ed866624d632..0ca9dfdc7418 100644
--- a/modular_darkpack/modules/jobs/code/clinic/doctor.dm
+++ b/modular_darkpack/modules/jobs/code/clinic/doctor.dm
@@ -13,6 +13,8 @@
/datum/job_department/clinic,
)
+ tgui_icon = FA_ICON_STAFF_SNAKE
+
known_contacts = list(
JOB_CLINIC_DIRECTOR,
JOB_DOCTOR,
diff --git a/modular_darkpack/modules/jobs/code/garou/councillor.dm b/modular_darkpack/modules/jobs/code/garou/councillor.dm
index 88114074f414..0324ef64d918 100644
--- a/modular_darkpack/modules/jobs/code/garou/councillor.dm
+++ b/modular_darkpack/modules/jobs/code/garou/councillor.dm
@@ -22,6 +22,8 @@
/datum/job_department/gaia,
)
+ tgui_icon = FA_ICON_DOG
+
known_contacts = list(
JOB_GAROU_TRUTHCATCHER,
JOB_GAROU_WARDER,
diff --git a/modular_darkpack/modules/jobs/code/garou/guardian.dm b/modular_darkpack/modules/jobs/code/garou/guardian.dm
index 8b7521578b3c..58cd851b447b 100644
--- a/modular_darkpack/modules/jobs/code/garou/guardian.dm
+++ b/modular_darkpack/modules/jobs/code/garou/guardian.dm
@@ -21,6 +21,8 @@
/datum/job_department/gaia,
)
+ tgui_icon = FA_ICON_SHIELD_DOG
+
known_contacts = list(
JOB_GAROU_COUNCIL,
JOB_GAROU_TRUTHCATCHER,
diff --git a/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm b/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm
index 8cd8e3b0933a..d9f7adb4afce 100644
--- a/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm
+++ b/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm
@@ -23,6 +23,8 @@
/datum/job_department/gaia,
)
+ tgui_icon = FA_ICON_DOG
+
known_contacts = list(
JOB_GAROU_COUNCIL,
JOB_GAROU_WARDER,
diff --git a/modular_darkpack/modules/jobs/code/garou/warder.dm b/modular_darkpack/modules/jobs/code/garou/warder.dm
index 81c1516ffb05..a9de3104326c 100644
--- a/modular_darkpack/modules/jobs/code/garou/warder.dm
+++ b/modular_darkpack/modules/jobs/code/garou/warder.dm
@@ -23,6 +23,8 @@
/datum/job_department/gaia,
)
+ tgui_icon = FA_ICON_DOG
+
known_contacts = list(
JOB_GAROU_COUNCIL,
JOB_GAROU_TRUTHCATCHER,
diff --git a/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm b/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm
index 9087bcbf75e1..f5955dfb7ada 100644
--- a/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm
+++ b/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm
@@ -22,6 +22,8 @@
/datum/job_department/gaia,
)
+ tgui_icon = FA_ICON_DOG
+
known_contacts = list(
JOB_GAROU_COUNCIL,
JOB_GAROU_TRUTHCATCHER,
diff --git a/modular_darkpack/modules/jobs/code/giovanni/capo.dm b/modular_darkpack/modules/jobs/code/giovanni/capo.dm
index 39b06af3688a..cd04458d971f 100644
--- a/modular_darkpack/modules/jobs/code/giovanni/capo.dm
+++ b/modular_darkpack/modules/jobs/code/giovanni/capo.dm
@@ -12,6 +12,8 @@
/datum/job_department/giovanni,
)
+ tgui_icon = FA_ICON_MONEY_CHECK_DOLLAR
+
exp_required_type_department = EXP_TYPE_GIOVANNI
exp_requirements = EXP_REQ_HEAD
diff --git a/modular_darkpack/modules/jobs/code/giovanni/i_nonni.dm b/modular_darkpack/modules/jobs/code/giovanni/i_nonni.dm
index f8477743ae4d..32a889f3ed6c 100644
--- a/modular_darkpack/modules/jobs/code/giovanni/i_nonni.dm
+++ b/modular_darkpack/modules/jobs/code/giovanni/i_nonni.dm
@@ -13,6 +13,8 @@
/datum/job_department/giovanni,
)
+ tgui_icon = FA_ICON_MONEY_BILL_WAVE
+
allowed_splats = list(SPLAT_GHOUL, SPLAT_NONE, SPLAT_KINDRED)
allowed_clans = list(VAMPIRE_CLAN_GIOVANNI)
minimal_generation = 10
diff --git a/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm b/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm
index 733956d6fc8d..14e42187c618 100644
--- a/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm
+++ b/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm
@@ -13,6 +13,8 @@
/datum/job_department/giovanni,
)
+ tgui_icon = FA_ICON_MONEY_BILL_1_WAVE
+
known_contacts = list(
JOB_CAPO,
JOB_LA_SQUADRA,
diff --git a/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm b/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm
index d198390d036f..909365fab6ff 100644
--- a/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm
+++ b/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm
@@ -13,6 +13,8 @@
/datum/job_department/giovanni,
)
+ tgui_icon = FA_ICON_MONEY_BILL_1
+
known_contacts = list(
JOB_LA_FAMIGLIA,
JOB_CAPO,
diff --git a/modular_darkpack/modules/jobs/code/hunters/abbe.dm b/modular_darkpack/modules/jobs/code/hunters/abbe.dm
index fb39be89a7d6..fe17a9f30f08 100644
--- a/modular_darkpack/modules/jobs/code/hunters/abbe.dm
+++ b/modular_darkpack/modules/jobs/code/hunters/abbe.dm
@@ -27,6 +27,8 @@
allowed_splats = list(SPLAT_NONE)
+ tgui_icon = FA_ICON_CROSS
+
/datum/outfit/job/vampire/abbe
name = JOB_ABBE
jobtype = /datum/job/vampire/abbe
diff --git a/modular_darkpack/modules/jobs/code/hunters/condottieri.dm b/modular_darkpack/modules/jobs/code/hunters/condottieri.dm
index cbf4baa8f476..c8add46eda1a 100644
--- a/modular_darkpack/modules/jobs/code/hunters/condottieri.dm
+++ b/modular_darkpack/modules/jobs/code/hunters/condottieri.dm
@@ -17,6 +17,8 @@
/datum/job_department/society_of_leopold,
)
+ tgui_icon = FA_ICON_CROSS
+
known_contacts = list(
JOB_ABBE,
JOB_INQUISITOR,
diff --git a/modular_darkpack/modules/jobs/code/hunters/inquisitor.dm b/modular_darkpack/modules/jobs/code/hunters/inquisitor.dm
index ba8b7638a841..b8a1d84ac97a 100644
--- a/modular_darkpack/modules/jobs/code/hunters/inquisitor.dm
+++ b/modular_darkpack/modules/jobs/code/hunters/inquisitor.dm
@@ -16,6 +16,8 @@
/datum/job_department/society_of_leopold,
)
+ tgui_icon = FA_ICON_CROSS
+
known_contacts = list(
JOB_ABBE,
JOB_CONDOTTIERI,
diff --git a/modular_darkpack/modules/jobs/code/hunters/novice.dm b/modular_darkpack/modules/jobs/code/hunters/novice.dm
index d481076ba348..77704d9a2e93 100644
--- a/modular_darkpack/modules/jobs/code/hunters/novice.dm
+++ b/modular_darkpack/modules/jobs/code/hunters/novice.dm
@@ -16,6 +16,8 @@
/datum/job_department/society_of_leopold,
)
+ tgui_icon = FA_ICON_CROSS
+
known_contacts = list(
JOB_ABBE,
JOB_CONDOTTIERI,
diff --git a/modular_darkpack/modules/jobs/code/job_items.dm b/modular_darkpack/modules/jobs/code/job_items.dm
index 3f6cb22cd325..4629c280caec 100644
--- a/modular_darkpack/modules/jobs/code/job_items.dm
+++ b/modular_darkpack/modules/jobs/code/job_items.dm
@@ -162,7 +162,6 @@
slot_flags = ITEM_SLOT_ID | ITEM_SLOT_NECK | ITEM_SLOT_BELT
ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi')
worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi'
- COOLDOWN_DECLARE(detonation_timer)
/obj/item/card/hunter/silver
name = "silver cross"
@@ -172,22 +171,22 @@
name = "gothic cross"
icon_state = "hunter_gothic"
-/obj/item/card/hunter/attack_self(mob/user)
+/obj/item/card/hunter/attack_self(mob/living/user)
. = ..()
- if(!COOLDOWN_FINISHED(src, detonation_timer))
- return
if(!user.mind)
return
if(!user.mind?.holy_role)
return
- COOLDOWN_START(src, detonation_timer, 30 SECONDS)
+ if(!COOLDOWN_FINISHED(user, true_faith_cd))
+ return
+ COOLDOWN_START(user, true_faith_cd, 30 SECONDS)
do_sparks(rand(5, 9), FALSE, user)
playsound(user.loc, 'modular_darkpack/modules/jobs/sounds/cross.ogg', 100, FALSE, 8, 0.9)
for(var/mob/living/M in get_hearers_in_view(4, src))
bang(get_turf(src), M, user)
/obj/item/card/hunter/proc/bang(turf/turf, mob/living/living_mob, mob/living/user)
- if(living_mob.stat == DEAD) //They're dead!
+ if(living_mob.stat == DEAD || living_mob == user || living_mob.mind?.holy_role) // Can't flash yourself
return
living_mob.show_message(span_warning(span_bold("GOD SEES YOU!")), MSG_AUDIBLE)
@@ -196,18 +195,18 @@
living_mob.pointed(user)
var/distance = max(0, get_dist(get_turf(src), turf))
- if(living_mob.flash_act(affect_silicon = 1))
- living_mob.Paralyze(max(10/max(1, distance), 5))
- living_mob.Knockdown(max(100/max(1, distance), 40))
+ living_mob.flash_act(affect_silicon = 1)
+ living_mob.Paralyze(max(10/max(1, distance), 5))
+ living_mob.Knockdown(max(100/max(1, distance), 40))
/obj/item/card/hunter/attack(mob/living/target, mob/living/user)
. = ..()
if(HAS_TRAIT(user, TRAIT_PACIFISM))
return
- if(!COOLDOWN_FINISHED(src, detonation_timer))
+ if(!COOLDOWN_FINISHED(user, true_faith_cd))
return
- if(HAS_TRAIT(target, TRAIT_REPELLED_BY_HOLINESS))
- COOLDOWN_START(src, detonation_timer, 30 SECONDS)
+ if(HAS_TRAIT(target, TRAIT_REPELLED_BY_HOLINESS) && target != user && !target.mind?.holy_role)
+ COOLDOWN_START(user, true_faith_cd, 30 SECONDS)
lightningbolt(target)
to_chat(target, span_userdanger("The gods have punished you for your sins!"))
diff --git a/modular_darkpack/modules/jobs/code/landmarks.dm b/modular_darkpack/modules/jobs/code/landmarks.dm
index 32ce880a30f6..e7345dade2d8 100644
--- a/modular_darkpack/modules/jobs/code/landmarks.dm
+++ b/modular_darkpack/modules/jobs/code/landmarks.dm
@@ -7,7 +7,7 @@
/obj/effect/landmark/start/darkpack
name = "generic darkpack start"
desc = "Var-edit me if you're an idiot who doesn't like making subtypes!"
- icon = 'modular_darkpack/modules/jobs/icons/landmarks.dmi'
+ icon = 'modular_zapoc/modules/jobs/icons/landmarks.dmi' // APOC EDIT CHANGE
/* Anarchs */
/obj/effect/landmark/start/darkpack/anarch
diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm
index cb42c6c94141..b90b80f0a981 100644
--- a/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm
+++ b/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm
@@ -13,6 +13,8 @@
/datum/job_department/strip_club
)
+ tgui_icon = FA_ICON_COCKTAIL
+
known_contacts = list(
JOB_CLUB_WORKER,
JOB_PRIMOGEN_TOREADOR
diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/janitor.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/janitor.dm
index 15a8cb7cca68..d3577d5c87fe 100644
--- a/modular_darkpack/modules/jobs/code/miscelllaneous/janitor.dm
+++ b/modular_darkpack/modules/jobs/code/miscelllaneous/janitor.dm
@@ -11,6 +11,9 @@
/datum/job_department/city_services,
)
display_order = JOB_DISPLAY_ORDER_STREETJAN
+
+ tgui_icon = FA_ICON_SOAP
+
description = "Keep the streets clean. You are paid to keep your mouth shut about the things you see."
maximal_generation = 11
maximum_immortal_age = 100
diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/priest.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/priest.dm
index 5357627c2079..61c164d9d022 100644
--- a/modular_darkpack/modules/jobs/code/miscelllaneous/priest.dm
+++ b/modular_darkpack/modules/jobs/code/miscelllaneous/priest.dm
@@ -12,6 +12,9 @@
departments_list = list(
/datum/job_department/church,
)
+
+ tgui_icon = FA_ICON_BOOK_BIBLE
+
allowed_splats = list(SPLAT_NONE, SPLAT_GHOUL, SPLAT_KINDRED)
allowed_clans = list(VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_CAPPADOCIAN, VAMPIRE_CLAN_BANU_HAQIM_VIZIER) //Each have pretty big religious influences, so!
maximal_generation = 11
diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/red_news.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/red_news.dm
index e6d33e793d03..cb754830ac80 100644
--- a/modular_darkpack/modules/jobs/code/miscelllaneous/red_news.dm
+++ b/modular_darkpack/modules/jobs/code/miscelllaneous/red_news.dm
@@ -10,6 +10,9 @@
departments_list = list(
/datum/job_department/citizen
)
+
+ tgui_icon = FA_ICON_CAMERA
+
job_flags = CITY_JOB_FLAGS
minimum_masquerade = 0
alt_titles = list(
diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/taxi.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/taxi.dm
index 6b256f03dfc8..006fac0bc9df 100644
--- a/modular_darkpack/modules/jobs/code/miscelllaneous/taxi.dm
+++ b/modular_darkpack/modules/jobs/code/miscelllaneous/taxi.dm
@@ -13,6 +13,8 @@
/datum/job_department/city_services,
)
+ tgui_icon = FA_ICON_CAR
+
known_contacts = list(
JOB_TAXI_DRIVER
)
diff --git a/modular_darkpack/modules/jobs/code/pentex/affairs.dm b/modular_darkpack/modules/jobs/code/pentex/affairs.dm
index 21f067a86aeb..cc5a65d5a849 100644
--- a/modular_darkpack/modules/jobs/code/pentex/affairs.dm
+++ b/modular_darkpack/modules/jobs/code/pentex/affairs.dm
@@ -24,6 +24,8 @@
/datum/job_department/pentex,
)
+ tgui_icon = FA_ICON_BRIEFCASE
+
known_contacts = list(
JOB_PENTEX_LEAD,
JOB_PENTEX_EXEC,
diff --git a/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm b/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm
index ab154e0abc7b..a16f3c161bc7 100644
--- a/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm
+++ b/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm
@@ -30,6 +30,8 @@
/datum/job_department/pentex,
)
+ tgui_icon = FA_ICON_VIRUS
+
known_contacts = list(
JOB_PENTEX_EXEC,
JOB_PENTEX_AFFAIRS,
diff --git a/modular_darkpack/modules/jobs/code/pentex/employee.dm b/modular_darkpack/modules/jobs/code/pentex/employee.dm
index 46dd544e8e7a..a57a207316ab 100644
--- a/modular_darkpack/modules/jobs/code/pentex/employee.dm
+++ b/modular_darkpack/modules/jobs/code/pentex/employee.dm
@@ -31,6 +31,8 @@
/datum/job_department/pentex,
)
+ tgui_icon = FA_ICON_BUSINESS_TIME
+
known_contacts = list(
JOB_PENTEX_LEAD,
JOB_PENTEX_EXEC,
diff --git a/modular_darkpack/modules/jobs/code/pentex/executive.dm b/modular_darkpack/modules/jobs/code/pentex/executive.dm
index ecae694cca2f..3d1b027cef09 100644
--- a/modular_darkpack/modules/jobs/code/pentex/executive.dm
+++ b/modular_darkpack/modules/jobs/code/pentex/executive.dm
@@ -36,6 +36,8 @@
/datum/job_department/pentex,
)
+ tgui_icon = FA_ICON_VIRUSES
+
known_contacts = list(
JOB_PENTEX_LEAD,
JOB_PENTEX_AFFAIRS,
diff --git a/modular_darkpack/modules/jobs/code/pentex/sec.dm b/modular_darkpack/modules/jobs/code/pentex/sec.dm
index ce45b00f1c3a..ac2bef2d7512 100644
--- a/modular_darkpack/modules/jobs/code/pentex/sec.dm
+++ b/modular_darkpack/modules/jobs/code/pentex/sec.dm
@@ -23,6 +23,8 @@
/datum/job_department/pentex,
)
+ tgui_icon = FA_ICON_SHIELD_VIRUS
+
known_contacts = list(
JOB_PENTEX_LEAD,
JOB_PENTEX_EXEC,
@@ -50,4 +52,4 @@
belt = /obj/item/storage/belt/holster/detective/darkpack/endron
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)
+ backpack_contents = list(/obj/item/phone_book=1, /obj/item/card/credit=1, /obj/item/clothing/mask/gas/darkpack/military/pentex=1)
diff --git a/modular_darkpack/modules/jobs/code/pentex/secchief.dm b/modular_darkpack/modules/jobs/code/pentex/secchief.dm
index 34cfcd323f7f..0e877a56adcf 100644
--- a/modular_darkpack/modules/jobs/code/pentex/secchief.dm
+++ b/modular_darkpack/modules/jobs/code/pentex/secchief.dm
@@ -24,6 +24,8 @@
/datum/job_department/pentex,
)
+ tgui_icon = FA_ICON_SHIELD_VIRUS
+
known_contacts = list(
JOB_PENTEX_LEAD,
JOB_PENTEX_EXEC,
@@ -52,4 +54,4 @@
glasses = /obj/item/clothing/glasses/vampire/sun
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)
+ 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, /obj/item/clothing/mask/gas/darkpack/military/pentex=1)
diff --git a/modular_darkpack/modules/jobs/code/police/captain.dm b/modular_darkpack/modules/jobs/code/police/captain.dm
index 64bc0b083da4..156df29aaac4 100644
--- a/modular_darkpack/modules/jobs/code/police/captain.dm
+++ b/modular_darkpack/modules/jobs/code/police/captain.dm
@@ -13,6 +13,8 @@
/datum/job_department/police,
)
+ tgui_icon = FA_ICON_USER_SHIELD
+
exp_requirements = EXP_REQ_HEAD
allowed_splats = list(SPLAT_NONE)
diff --git a/modular_darkpack/modules/jobs/code/police/dispatcher.dm b/modular_darkpack/modules/jobs/code/police/dispatcher.dm
index d8e8ae5c96c6..d514a847cee1 100644
--- a/modular_darkpack/modules/jobs/code/police/dispatcher.dm
+++ b/modular_darkpack/modules/jobs/code/police/dispatcher.dm
@@ -14,6 +14,8 @@
/datum/job_department/clinic,
)
+ tgui_icon = FA_ICON_RADIO
+
allowed_splats = list(SPLAT_GHOUL, SPLAT_KINFOLK, SPLAT_NONE)
splat_slots = list(SPLAT_GHOUL = 1, SPLAT_KINFOLK = 1)
diff --git a/modular_darkpack/modules/jobs/code/police/fbi.dm b/modular_darkpack/modules/jobs/code/police/fbi.dm
index 1fa6357001e9..d39be636706c 100644
--- a/modular_darkpack/modules/jobs/code/police/fbi.dm
+++ b/modular_darkpack/modules/jobs/code/police/fbi.dm
@@ -17,6 +17,8 @@
JOB_FEDERAL_INVESTIGATOR
)
+ tgui_icon = FA_ICON_USER_SECRET
+
allowed_splats = list(SPLAT_NONE)
description = "Enforce the Law."
minimum_masquerade = 0
diff --git a/modular_darkpack/modules/jobs/code/police/police.dm b/modular_darkpack/modules/jobs/code/police/police.dm
index 9debd994a237..5c515f291d44 100644
--- a/modular_darkpack/modules/jobs/code/police/police.dm
+++ b/modular_darkpack/modules/jobs/code/police/police.dm
@@ -18,6 +18,8 @@
"Senior Police Officer",
)
+ tgui_icon = FA_ICON_SHIELD_HALVED
+
allowed_splats = list(SPLAT_GHOUL, SPLAT_KINFOLK, SPLAT_NONE)
splat_slots = list(SPLAT_GHOUL = 2, SPLAT_KINFOLK = 2)
diff --git a/modular_darkpack/modules/jobs/code/police/sergeant.dm b/modular_darkpack/modules/jobs/code/police/sergeant.dm
index a8e25f66fd75..6447aa06e134 100644
--- a/modular_darkpack/modules/jobs/code/police/sergeant.dm
+++ b/modular_darkpack/modules/jobs/code/police/sergeant.dm
@@ -20,6 +20,8 @@
"Detective",
)
+ tgui_icon = FA_ICON_SHIELD
+
allowed_splats = list(SPLAT_GHOUL, SPLAT_NONE)
description = "Enforce the law. Keep the officers in line. Follow what the Captain says."
diff --git a/modular_darkpack/modules/jobs/code/sabbat/ductus.dm b/modular_darkpack/modules/jobs/code/sabbat/ductus.dm
index d346f6a7c0c4..3f2db6107f5e 100644
--- a/modular_darkpack/modules/jobs/code/sabbat/ductus.dm
+++ b/modular_darkpack/modules/jobs/code/sabbat/ductus.dm
@@ -12,6 +12,8 @@
/datum/job_department/sabbat,
)
+ tgui_icon = FA_ICON_CROSS
+
exp_requirements = EXP_REQ_HEAD
exp_required_type_department = EXP_TYPE_SABBAT
diff --git a/modular_darkpack/modules/jobs/code/sabbat/pack.dm b/modular_darkpack/modules/jobs/code/sabbat/pack.dm
index 6be07d429549..d3690b5df986 100644
--- a/modular_darkpack/modules/jobs/code/sabbat/pack.dm
+++ b/modular_darkpack/modules/jobs/code/sabbat/pack.dm
@@ -12,6 +12,8 @@
/datum/job_department/sabbat,
)
+ tgui_icon = FA_ICON_CROSS
+
description = "You are a member of the Sabbat. 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."
maximal_generation = 9
maximum_immortal_age = 200
diff --git a/modular_darkpack/modules/jobs/code/sabbat/priest.dm b/modular_darkpack/modules/jobs/code/sabbat/priest.dm
index 9d83d4970f7c..5e6778810de9 100644
--- a/modular_darkpack/modules/jobs/code/sabbat/priest.dm
+++ b/modular_darkpack/modules/jobs/code/sabbat/priest.dm
@@ -13,6 +13,8 @@
/datum/job_department/sabbat,
)
+ tgui_icon = FA_ICON_CROSS
+
description = "You are the Sabbat Priest. You are charged with the supervision of the ritae of your pack. You also serve as the second-in-command to the Ductus. Consecrate the Vaulderie for new Sabbat, consult your tome for rites to aid your pack, and ensure the Sabbat live on in Caine's favor. 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_SABBATPRIEST
diff --git a/modular_darkpack/modules/jobs/code/supply/dealer.dm b/modular_darkpack/modules/jobs/code/supply/dealer.dm
index 146f53afdc14..0f3e6af0e2ce 100644
--- a/modular_darkpack/modules/jobs/code/supply/dealer.dm
+++ b/modular_darkpack/modules/jobs/code/supply/dealer.dm
@@ -13,6 +13,8 @@
/datum/job_department/supply,
)
+ tgui_icon = FA_ICON_SACK_DOLLAR
+
exp_requirements = EXP_REQ_MINOR
exp_required_type_department = EXP_TYPE_WAREHOUSE
diff --git a/modular_darkpack/modules/jobs/code/supply/supply_tech.dm b/modular_darkpack/modules/jobs/code/supply/supply_tech.dm
index a745da5a8b38..f0d8daf52985 100644
--- a/modular_darkpack/modules/jobs/code/supply/supply_tech.dm
+++ b/modular_darkpack/modules/jobs/code/supply/supply_tech.dm
@@ -14,6 +14,7 @@
/datum/job_department/supply,
)
+ tgui_icon = FA_ICON_BOX
description = "You work at the warehouse, moving boxes and selling not-quite legal goods to anyone who has the money."
maximal_generation = 9
diff --git a/modular_darkpack/modules/jobs/code/tremere/archivist.dm b/modular_darkpack/modules/jobs/code/tremere/archivist.dm
index 8e25160d300c..77264974a8ff 100644
--- a/modular_darkpack/modules/jobs/code/tremere/archivist.dm
+++ b/modular_darkpack/modules/jobs/code/tremere/archivist.dm
@@ -12,6 +12,8 @@
)
display_order = JOB_DISPLAY_ORDER_ARCHIVIST
+ tgui_icon = FA_ICON_BOX_ARCHIVE
+
description = "Keep a census of events and provide information to neonates. Listen to the Regent Carefully. Study blood magic and protect the chantry."
maximal_generation = 9
maximum_immortal_age = 200
diff --git a/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm b/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm
index 42ae8527dcd5..4db21e166e33 100644
--- a/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm
+++ b/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm
@@ -12,6 +12,8 @@
)
display_order = JOB_DISPLAY_ORDER_GARGOYLE
+ tgui_icon = FA_ICON_HILL_ROCKSLIDE
+
description = "You serve the local Chantry as either a guard dog, enforcer, or scout, a shock troop for the Mages of Clan Tremere. You serve the Tremere still, despise most of your kind being freed long ago, whether thats out of duty, mental enslavement, or having nowhere else to go. Among your Masters you are a second class citizen - yet you remain. Guard the Chantry and the Masters as your people always have."
maximal_generation = 9
maximum_immortal_age = 200
diff --git a/modular_darkpack/modules/jobs/code/tremere/regent.dm b/modular_darkpack/modules/jobs/code/tremere/regent.dm
index 5ab80b55b2a3..90fa68742bdf 100644
--- a/modular_darkpack/modules/jobs/code/tremere/regent.dm
+++ b/modular_darkpack/modules/jobs/code/tremere/regent.dm
@@ -13,6 +13,8 @@
)
display_order = JOB_DISPLAY_ORDER_REGENT
+ tgui_icon = FA_ICON_BOOK
+
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."
diff --git a/modular_darkpack/modules/jumping/code/jumper_component.dm b/modular_darkpack/modules/jumping/code/jumper_component.dm
index a57811e6c82c..09927f6d6205 100644
--- a/modular_darkpack/modules/jumping/code/jumper_component.dm
+++ b/modular_darkpack/modules/jumping/code/jumper_component.dm
@@ -108,6 +108,11 @@
var/adjusted_jump_range = clamp((BASE_JUMP_DISTANCE + 0.75 + max(0,(strength -1)) * 0.5 + athletics), 1, 6)
+ // WEREWOLF
+ var/datum/status_effect/hares_leap/hares_leap = jumper.has_status_effect(/datum/status_effect/hares_leap)
+ if(hares_leap)
+ adjusted_jump_range *= hares_leap.jump_modifier
+
var/distance = get_dist(jumper.loc, target)
var/turf/adjusted_target = target
if(distance > adjusted_jump_range)
diff --git a/modular_darkpack/modules/loadout/code/categories/masks.dm b/modular_darkpack/modules/loadout/code/categories/masks.dm
index 2d948a091325..a85ce7c0cbe5 100644
--- a/modular_darkpack/modules/loadout/code/categories/masks.dm
+++ b/modular_darkpack/modules/loadout/code/categories/masks.dm
@@ -141,3 +141,24 @@
name = "Mummy Mask"
item_path = /obj/item/clothing/mask/mummy
+// Bandanas
+/datum/loadout_item/mask/bandana
+ group = "Bandanas"
+ abstract_type = /datum/loadout_item/mask/bandana
+
+/datum/loadout_item/mask/bandana/normal_greyscale
+ name = "Bandana (Colorable)"
+ item_path = /obj/item/clothing/mask/bandana/vampire
+
+/datum/loadout_item/mask/bandana/striped_greyscale
+ name = "Bandana (Colorable, Striped)"
+ item_path = /obj/item/clothing/mask/bandana/striped/vampire
+
+/datum/loadout_item/mask/bandana/skull_greyscale
+ name = "Bandana (Colorable, Skull)"
+ item_path = /obj/item/clothing/mask/bandana/skull/vampire
+
+//Making this a bandana to group them together.
+/datum/loadout_item/mask/bandana/facescarf_greyscale
+ name = "Facescarf (Colorable)"
+ item_path = /obj/item/clothing/mask/facescarf/vampire
diff --git a/modular_darkpack/modules/loadout/code/categories/pocket_items.dm b/modular_darkpack/modules/loadout/code/categories/pocket_items.dm
index d7afcd2b72f3..7f87d7dfd77e 100644
--- a/modular_darkpack/modules/loadout/code/categories/pocket_items.dm
+++ b/modular_darkpack/modules/loadout/code/categories/pocket_items.dm
@@ -16,6 +16,10 @@
name = "Pen (Fountain)"
item_path = /obj/item/pen/fountain
+/datum/loadout_item/pocket_items/pen_charcoal
+ name = "Pen (Charcoal)"
+ item_path = /obj/item/pen/charcoal
+
// Cards
/datum/loadout_item/pocket_items/card_tarot
name = "Deck of Cards (Tarot)"
diff --git a/modular_darkpack/modules/loadout/code/categories/suit.dm b/modular_darkpack/modules/loadout/code/categories/suit.dm
index 7988fc407cfd..792555dccca1 100644
--- a/modular_darkpack/modules/loadout/code/categories/suit.dm
+++ b/modular_darkpack/modules/loadout/code/categories/suit.dm
@@ -74,9 +74,21 @@
item_path = /obj/item/clothing/suit/vampire/fancy_red
/datum/loadout_item/suit/jacket/black_leather
- name = "Leather Jacket"
+ name = "Leather Jacket (Black)"
item_path = /obj/item/clothing/suit/vampire/jacket
+/datum/loadout_item/suit/jacket/black_leather_cut
+ name = "Cropped Leather Jacket (Black)"
+ item_path = /obj/item/clothing/suit/vampire/jacket/cropped
+
+/datum/loadout_item/suit/jacket/red_leather
+ name = "Leather Jacket (Red)"
+ item_path = /obj/item/clothing/suit/vampire/jacket/red
+
+/datum/loadout_item/suit/jacket/red_leather_cut
+ name = "Cropped Leather Jacket (Red)"
+ item_path = /obj/item/clothing/suit/vampire/jacket/cropped/red
+
/datum/loadout_item/suit/jacket/military
name = "Jacket (Military)"
item_path = /obj/item/clothing/suit/jacket/miljacket
diff --git a/modular_darkpack/modules/masquerade/code/blood_hunt_skull.dm b/modular_darkpack/modules/masquerade/code/blood_hunt_skull.dm
index 5402893aa83e..f25bb3de2b85 100644
--- a/modular_darkpack/modules/masquerade/code/blood_hunt_skull.dm
+++ b/modular_darkpack/modules/masquerade/code/blood_hunt_skull.dm
@@ -17,7 +17,6 @@
. = ..()
REGISTER_REQUIRED_MAP_ITEM(1, 1)
GLOB.blood_hunt_announcers += src
- AddComponent(/datum/component/violation_observer, FALSE)
/obj/item/blood_hunt/Destroy(force)
GLOB.blood_hunt_announcers -= src
diff --git a/modular_darkpack/modules/masquerade/code/components/violation_observer.dm b/modular_darkpack/modules/masquerade/code/components/violation_observer.dm
index cfd2895f708f..59e48434d31b 100644
--- a/modular_darkpack/modules/masquerade/code/components/violation_observer.dm
+++ b/modular_darkpack/modules/masquerade/code/components/violation_observer.dm
@@ -1,34 +1,40 @@
-// Used for things that detect masquerade violations.
-// Usually NPCs or cameras.
-/datum/component/violation_observer
- dupe_mode = COMPONENT_DUPE_UNIQUE
- var/datum/proximity_monitor/advanced/violation_check_aoe/area_of_effect
- /// Time between us checking for violations
- COOLDOWN_DECLARE(scan_cooldown)
- var/list/breached_players
-
-/datum/component/violation_observer/Initialize(add_area_of_effect) //Only add the AOE checker for NPCs and camera objects.
- if(add_area_of_effect)
- area_of_effect = new(parent, 7, TRUE, src)
- breached_players = new()
-
-/datum/component/violation_observer/RegisterWithParent()
- RegisterSignal(parent, COMSIG_SEEN_MASQUERADE_VIOLATION, PROC_REF(on_observed_violation))
- RegisterSignal(parent, COMSIG_MASQUERADE_REINFORCE, PROC_REF(on_masquerade_violation_reinforced))
- RegisterSignals(parent, list(COMSIG_LIVING_DEATH, COMSIG_ALL_MASQUERADE_REINFORCE), PROC_REF(on_death))
-
-/datum/component/violation_observer/UnregisterFromParent(force, silent)
- QDEL_NULL(area_of_effect)
- breached_players = null
- UnregisterSignal(parent, list(COMSIG_SEEN_MASQUERADE_VIOLATION, COMSIG_MASQUERADE_REINFORCE, COMSIG_LIVING_DEATH, COMSIG_ALL_MASQUERADE_REINFORCE))
-
-/datum/component/violation_observer/proc/toggle_area_of_effect(origin = parent)
- if(area_of_effect)
- QDEL_NULL(area_of_effect)
+/atom/movable
+ var/violation_observer = FALSE
+ COOLDOWN_DECLARE(masquerade_violation_cooldown)
+
+/atom/movable/proc/toggle_masquerade_sensitivity(new_listening_state)
+ // don't proceed if we're toggling to TRUE on something already listening
+ if(!isnull(new_listening_state) && new_listening_state == violation_observer)
+ return
+
+ // if we don't pass an arg just flip the switch
+ if(isnull(new_listening_state))
+ violation_observer = !violation_observer
+ else
+ violation_observer = new_listening_state
+
+ if(violation_observer)
+ RegisterSignal(src, COMSIG_SEEN_MASQUERADE_VIOLATION, PROC_REF(on_observed_violation))
+ RegisterSignal(src, COMSIG_MASQUERADE_REINFORCE, PROC_REF(on_masquerade_violation_reinforced))
+ RegisterSignals(src, list(COMSIG_LIVING_DEATH, COMSIG_ALL_MASQUERADE_REINFORCE), PROC_REF(on_masquerade_witness_death))
else
- area_of_effect = new(origin, 7, TRUE, src)
+ UnregisterSignal(src, list(COMSIG_SEEN_MASQUERADE_VIOLATION, COMSIG_MASQUERADE_REINFORCE, COMSIG_LIVING_DEATH, COMSIG_ALL_MASQUERADE_REINFORCE))
-/datum/component/violation_observer/proc/on_observed_violation(atom/source, mob/living/player_breacher)
+/atom/movable/proc/on_masquerade_violation()
+ if(!COOLDOWN_FINISHED(src, masquerade_violation_cooldown))
+ return
+ var/area/vtm/breacher_area = get_area(src)
+ if(!istype(breacher_area, /area/vtm))
+ return
+ if(breacher_area.zone_type != ZONE_MASQUERADE)
+ return
+ for(var/atom/movable/moving_atom in view(7, loc))
+ if(!moving_atom.violation_observer)
+ continue
+ SEND_SIGNAL(moving_atom, COMSIG_SEEN_MASQUERADE_VIOLATION, src)
+ COOLDOWN_START(src, masquerade_violation_cooldown, 1 TURNS)
+
+/atom/movable/proc/on_observed_violation(atom/source, atom/movable/player_breacher)
SIGNAL_HANDLER
if(!source || !player_breacher || ismundane(player_breacher)) //Humans cant break the masquerade. Because reasons.
@@ -36,6 +42,8 @@
if(isliving(source))
var/mob/living/mob_parent = source
+ if(mob_parent.stat == DEAD)
+ return
if(!INCAPACITATED_IGNORING(mob_parent, INCAPABLE_RESTRAINTS))
mob_parent.face_atom(player_breacher)
source.observe_masquerade_violation(player_breacher)
@@ -48,43 +56,48 @@
animate(exclamation, pixel_z = 32, alpha = 255, time = 0.5 SECONDS, easing = ELASTIC_EASING)
source.AddComponent(/datum/component/masquerade_hud, player_breacher)
- breached_players += player_breacher
SSmasquerade.masquerade_breach(source, player_breacher, (isliving(source) ? MASQUERADE_REASON_NPC : MASQUERADE_REASON_OBJECT))
- RegisterSignal(player_breacher, COMSIG_LIVING_DEATH, PROC_REF(on_breacher_death))
+ RegisterSignal(player_breacher, COMSIG_LIVING_DEATH, PROC_REF(on_breacher_death), override = TRUE) // override is for breaching multiple times on the same violation observer - on_breacher_death handles all violations, not just the breach created here, so we only need one register
return TRUE
-/datum/component/violation_observer/proc/on_masquerade_violation_reinforced(atom/source, mob/living/player_breacher)
+/atom/movable/proc/on_masquerade_violation_reinforced(atom/source, atom/movable/player_breacher)
SIGNAL_HANDLER
- if(player_breacher in breached_players)
- SEND_SIGNAL(source, COMSIG_MASQUERADE_HUD_DELETE, player_breacher)
- SSmasquerade.masquerade_reinforce(source, player_breacher)
- source.observe_masquerade_reinforce(player_breacher)
- breached_players -= player_breacher
+ for(var/breach in SSmasquerade.masquerade_breachers)
+ if(breach[1] != player_breacher)
+ continue
+ if(breach[2] != src)
+ continue
+ SEND_SIGNAL(src, COMSIG_MASQUERADE_HUD_DELETE, player_breacher)
+ SSmasquerade.masquerade_reinforce(src, player_breacher)
+ src.observe_masquerade_reinforce(player_breacher)
UnregisterSignal(player_breacher, COMSIG_LIVING_DEATH)
return TRUE
-/datum/component/violation_observer/proc/on_death(atom/source)
+/atom/movable/proc/on_masquerade_witness_death()
SIGNAL_HANDLER
- for(var/mob/player_breacher in breached_players)
- if(!QDELETED(player_breacher))
- SEND_SIGNAL(source, COMSIG_MASQUERADE_HUD_DELETE, player_breacher)
- SSmasquerade.masquerade_reinforce(source, player_breacher)
- source.observe_masquerade_reinforce(player_breacher)
- breached_players -= player_breacher
+ for(var/breach in SSmasquerade.masquerade_breachers)
+ var/mob/living/player_breacher = breach[1]
+ var/atom/breach_witness = breach[2]
+ if(breach_witness != src)
+ continue
+ SEND_SIGNAL(src, COMSIG_MASQUERADE_HUD_DELETE, player_breacher)
+ SSmasquerade.masquerade_reinforce(src, player_breacher)
+ observe_masquerade_reinforce(player_breacher)
+ UnregisterSignal(player_breacher, COMSIG_LIVING_DEATH)
-/datum/component/violation_observer/proc/on_breacher_death(mob/living/dead_breacher, gibbed)
+/atom/movable/proc/on_breacher_death(mob/living/dead_breacher, gibbed)
SIGNAL_HANDLER
- if(dead_breacher in breached_players)
- var/atom/parent_atom = parent
- SEND_SIGNAL(parent, COMSIG_MASQUERADE_HUD_DELETE, dead_breacher)
- SSmasquerade.masquerade_reinforce(parent, dead_breacher)
- parent_atom.observe_masquerade_reinforce(dead_breacher)
- breached_players -= dead_breacher
+ for(var/breach in SSmasquerade.masquerade_breachers)
+ if(breach[1] != dead_breacher)
+ continue
+ SEND_SIGNAL(src, COMSIG_MASQUERADE_HUD_DELETE, dead_breacher)
+ SSmasquerade.masquerade_reinforce(src, dead_breacher)
+ observe_masquerade_reinforce(dead_breacher)
UnregisterSignal(dead_breacher, COMSIG_LIVING_DEATH)
/atom/proc/observe_masquerade_violation(player_breacher)
diff --git a/modular_darkpack/modules/masquerade/code/fields/violation_check_aoe.dm b/modular_darkpack/modules/masquerade/code/fields/violation_check_aoe.dm
deleted file mode 100644
index 718ca64b60d6..000000000000
--- a/modular_darkpack/modules/masquerade/code/fields/violation_check_aoe.dm
+++ /dev/null
@@ -1,86 +0,0 @@
-/datum/proximity_monitor/advanced/violation_check_aoe
- edge_is_a_field = TRUE
- var/datum/component/violation_observer/violation_observer_callback
- var/list/tracking_mobs
-
-/datum/proximity_monitor/advanced/violation_check_aoe/New(atom/_host, range, _ignore_if_not_on_turf = TRUE, _violation_observer_callback)
- . = ..()
- violation_observer_callback = _violation_observer_callback
- tracking_mobs = new()
-
-/datum/proximity_monitor/advanced/violation_check_aoe/Destroy()
- violation_observer_callback = null
- for(var/mob in tracking_mobs)
- UnregisterSignal(mob, COMSIG_MASQUERADE_VIOLATION)
- tracking_mobs = null
- return ..()
-
-/datum/proximity_monitor/advanced/violation_check_aoe/on_entered(turf/source, atom/movable/entered, turf/old_loc)
- . = ..()
- if(QDELETED(src))
- return
- if(!isliving(entered))
- return
- if(isnpc(entered)) //only track non-NPCs
- return
- if(entered == host)
- return
- if(entered in tracking_mobs)
- return
- tracking_mobs |= entered
- RegisterSignal(entered, COMSIG_MASQUERADE_VIOLATION, PROC_REF(violation_observer_breach_callback))
- if(iscarbon(entered))
- var/mob/living/carbon/entered_mob = entered
- if(HAS_TRAIT(entered_mob, TRAIT_MASQUERADE_VIOLATING_FACE) && !(entered_mob.obscured_slots & HIDEFACE))
- SEND_SIGNAL(entered_mob, COMSIG_MASQUERADE_VIOLATION)
- else if(HAS_TRAIT(entered_mob, TRAIT_MASQUERADE_VIOLATING_EYES) && !entered_mob.is_eyes_covered())
- SEND_SIGNAL(entered_mob, COMSIG_MASQUERADE_VIOLATION)
-
-/datum/proximity_monitor/advanced/violation_check_aoe/on_uncrossed(turf/source, atom/movable/gone, direction)
- . = ..()
- if(QDELETED(src))
- return
- if(!isliving(gone))
- return
- if(isnpc(gone)) //only track non-NPCs
- return
- if(gone == host)
- return
- if(!(gone in tracking_mobs))
- return
- tracking_mobs -= gone
- UnregisterSignal(gone, COMSIG_MASQUERADE_VIOLATION)
-
-/datum/proximity_monitor/advanced/violation_check_aoe/on_z_change()
- if(QDELETED(src))
- return
- for(var/mob in tracking_mobs)
- UnregisterSignal(mob, COMSIG_MASQUERADE_VIOLATION)
- tracking_mobs -= mob
-
-/datum/proximity_monitor/advanced/violation_check_aoe/cleanup_field_turf(turf/target)
- if(QDELETED(src))
- return
- for(var/mob/living/living_mob in target.contents)
- UnregisterSignal(living_mob, COMSIG_MASQUERADE_VIOLATION)
- tracking_mobs -= living_mob
-
-/datum/proximity_monitor/advanced/violation_check_aoe/proc/violation_observer_breach_callback(mob/living/source)
- SIGNAL_HANDLER
-
- var/mob/living/host_mob = host
- if(!host_mob)
- return
- if(host_mob.incapacitated || IS_UNCONSCIOUS_OR_CRIT(host_mob) || host_mob.IsSleeping() || host_mob.IsParalyzed())
- return
- if(HAS_TRAIT(source, TRAIT_OBFUSCATED))
- return
- if(!check_zone_masquerade(host_mob))
- return
- if(!can_see(host_mob, source, 7))
- return
- if(!COOLDOWN_FINISHED(source, masquerade_timer))
- return
- COOLDOWN_START(source, masquerade_timer, 10 SECONDS)
- if(violation_observer_callback)
- SEND_SIGNAL(violation_observer_callback.parent, COMSIG_SEEN_MASQUERADE_VIOLATION, source)
diff --git a/modular_darkpack/modules/masquerade/code/masquerade_contract.dm b/modular_darkpack/modules/masquerade/code/masquerade_contract.dm
index 00e1bcc32e7b..c01d07fa7003 100644
--- a/modular_darkpack/modules/masquerade/code/masquerade_contract.dm
+++ b/modular_darkpack/modules/masquerade/code/masquerade_contract.dm
@@ -18,7 +18,7 @@
if(!get_vampire_splat(user))
return
var/turf/current_location = get_turf(user)
- to_chat(user, "[span_bold("YOU")], [get_area_name(user)] X:[current_location.x] Y:[current_location.y] Z:[current_location.z]")
+ to_chat(user, span_info("[span_bold("YOU")], [get_area_name(user)] X:[current_location.x] Y:[current_location.y] Z:[current_location.z]"))
for(var/mob/living/carbon/breacher in GLOB.masquerade_breakers_list)
var/location_info
var/turf/turf = get_turf(breacher)
@@ -47,7 +47,7 @@
if(!get_werewolf_splat(user))
return
var/turf/current_location = get_turf(user)
- to_chat(user, "[span_bold("YOU")], [get_area_name(user)] X:[current_location.x] Y:[current_location.y] Z:[current_location.z]")
+ to_chat(user, span_info("[span_bold("YOU")], [get_area_name(user)] X:[current_location.x] Y:[current_location.y] Z:[current_location.z]"))
for(var/mob/living/breacher in GLOB.veil_breakers_list)
var/location_info
var/turf/turf = get_turf(breacher)
diff --git a/modular_darkpack/modules/masquerade/code/subsystem/masquerade.dm b/modular_darkpack/modules/masquerade/code/subsystem/masquerade.dm
index 38e329cfa188..c42f751f8bc2 100644
--- a/modular_darkpack/modules/masquerade/code/subsystem/masquerade.dm
+++ b/modular_darkpack/modules/masquerade/code/subsystem/masquerade.dm
@@ -45,11 +45,10 @@ SUBSYSTEM_DEF(masquerade)
* player_breacher - The player which caused the masquerade breach.
* reason - Optional, the reason for the breach. For example,
*/
-/datum/controller/subsystem/masquerade/proc/masquerade_reinforce(atom/source, mob/living/player_breacher, reason)
+/datum/controller/subsystem/masquerade/proc/masquerade_reinforce(atom/source, mob/living/player_breacher)
. = FALSE
for(var/masquerade_breach in masquerade_breachers)
var/breach_sources = masquerade_breach[2]
- var/breach_reasons = masquerade_breach[3]
var/source_matches = FALSE
// breach_sources can be a list if there is more than one blood skull, handle for that
@@ -58,17 +57,12 @@ SUBSYSTEM_DEF(masquerade)
else
source_matches = (source == breach_sources)
- if(source_matches || reason == "debug")
- if(!reason || (reason in masquerade_breach) || (reason == MASQUERADE_REASON_PREFERENCES) || (reason == "debug"))
- // Only require blood hunt skull for "Preferences" (round-persistent) breaches
- if(breach_reasons == MASQUERADE_REASON_PREFERENCES && !istype(source, /obj/item/blood_hunt))
- continue
-
- masquerade_breachers -= list(masquerade_breach)
- masquerade_level = min(MASQUERADE_MAX_LEVEL, masquerade_level + 1)
- player_breacher.masquerade_score = min(5, player_breacher.masquerade_score + 1)
- . = TRUE
- break
+ if(source_matches)
+ masquerade_breachers -= list(masquerade_breach)
+ masquerade_level = min(MASQUERADE_MAX_LEVEL, masquerade_level + 1)
+ player_breacher.masquerade_score = min(5, player_breacher.masquerade_score + 1)
+ . = TRUE
+ break
if(player_breacher.masquerade_score == 5) //Doesn't matter if they weren't in one of these lists.
GLOB.veil_breakers_list -= player_breacher
GLOB.masquerade_breakers_list -= player_breacher
@@ -90,13 +84,13 @@ SUBSYSTEM_DEF(masquerade)
* player_breacher - The player which caused the masquerade breach.
* reason - The reason for the breach. For example,
*/
-/datum/controller/subsystem/masquerade/proc/masquerade_breach(atom/source, mob/living/player_breacher, reason)
- log_game("[player_breacher] has caused a masquerade breach in front of [source] by [reason]")
+/datum/controller/subsystem/masquerade/proc/masquerade_breach(atom/source, mob/living/player_breacher)
+ log_game("[player_breacher] has caused a masquerade breach in front of [source]")
var/pre_breach_score = player_breacher.masquerade_score
if(pre_breach_score == 0)
return
player_breacher.masquerade_score = max(0, player_breacher.masquerade_score - 1)
- masquerade_breachers += list(list(player_breacher, source, reason))
+ masquerade_breachers += list(list(player_breacher, source))
if(get_vampire_splat(player_breacher))
GLOB.masquerade_breakers_list |= player_breacher
GLOB.supernatural_breakers_list |= player_breacher
@@ -161,7 +155,7 @@ SUBSYSTEM_DEF(masquerade)
var/list/masquerade_breach_list = masquerade_breach
if(islist(masquerade_breach_list[2])) //If its the skull list, then its a long term masq breach. Clear it.
for(var/atom/list_object as anything in masquerade_breach_list[2])
- SSmasquerade.masquerade_reinforce(list_object, masquerade_breach_list[1], MASQUERADE_REASON_PREFERENCES)
+ SSmasquerade.masquerade_reinforce(list_object, masquerade_breach_list[1])
return
else
var/atom/object = masquerade_breach_list[2]
@@ -183,7 +177,7 @@ SUBSYSTEM_DEF(masquerade)
var/list/masquerade_breach_list = masquerade_breach
if(islist(masquerade_breach_list[2])) //If its the skull list, then its a long term masq breach. Clear it.
for(var/atom/list_object as anything in masquerade_breach_list[2])
- SSmasquerade.masquerade_reinforce(list_object, masquerade_breach_list[1], MASQUERADE_REASON_PREFERENCES)
+ SSmasquerade.masquerade_reinforce(list_object, masquerade_breach_list[1])
else
var/atom/object = masquerade_breach_list[2]
SEND_SIGNAL(object, COMSIG_ALL_MASQUERADE_REINFORCE)
diff --git a/modular_darkpack/modules/masquerade/config/breach_word.txt b/modular_darkpack/modules/masquerade/config/breach_word.txt
index d55cd5642a9c..afd036bab7b7 100644
--- a/modular_darkpack/modules/masquerade/config/breach_word.txt
+++ b/modular_darkpack/modules/masquerade/config/breach_word.txt
@@ -220,5 +220,4 @@ salubris
cappadocius
malkav
saulot
-daimoinon
visceratika
diff --git a/modular_darkpack/modules/mentor/code/mentorhelp.dm b/modular_darkpack/modules/mentor/code/mentorhelp.dm
index 8fc276b9c399..9b2dd05b5bb2 100644
--- a/modular_darkpack/modules/mentor/code/mentorhelp.dm
+++ b/modular_darkpack/modules/mentor/code/mentorhelp.dm
@@ -6,7 +6,7 @@ GAME_VERB(/client, mentorhelp, "Mentorhelp", ADMIN_CATEGORY_MENTOR)
html = "Error: MentorPM: You are muted from Mentorhelps. (muted).",
confidential = TRUE)
return
- var/msg = tgui_input_text(src, "Ask a question about game mechanics", "Mentorhelp")
+ var/msg = tgui_input_text(src, "Ask a question about game mechanics", "Mentorhelp", max_length = MAX_MESSAGE_LEN)
//Cleans the input message
if(!msg)
return
@@ -14,7 +14,6 @@ GAME_VERB(/client, mentorhelp, "Mentorhelp", ADMIN_CATEGORY_MENTOR)
if(!mob)
return
- msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
var/mentor_msg = "MENTORHELP: [key_name_mentor(src, TRUE, FALSE)]: [msg]"
log_mentor("MENTORHELP: [key_name_mentor(src, null, FALSE, FALSE)]: [msg]")
diff --git a/modular_darkpack/modules/mentor/code/mentorpm.dm b/modular_darkpack/modules/mentor/code/mentorpm.dm
index e1c3d2c1bdc5..c14651c645cc 100644
--- a/modular_darkpack/modules/mentor/code/mentorpm.dm
+++ b/modular_darkpack/modules/mentor/code/mentorpm.dm
@@ -27,7 +27,7 @@
//Get message text, limit it's length.and clean/escape html
if(!msg)
- msg = tgui_input_text(src, "Message:", "Private message")
+ msg = tgui_input_text(src, "Message:", "Private message", max_length = MAX_MESSAGE_LEN)
if(!msg)
return
@@ -47,10 +47,6 @@
if(!chosen_client.is_mentor() && !is_mentor())
return
- msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))
- if(!msg)
- return
-
log_mentor("Mentor PM: [key_name(src)]->[key_name(chosen_client)]: [msg]")
msg = emoji_parse(msg)
diff --git a/modular_darkpack/modules/merits_flaws/code/_darkpack_quirk.dm b/modular_darkpack/modules/merits_flaws/code/_darkpack_quirk.dm
index 68e87e305c2d..a7e07368e126 100644
--- a/modular_darkpack/modules/merits_flaws/code/_darkpack_quirk.dm
+++ b/modular_darkpack/modules/merits_flaws/code/_darkpack_quirk.dm
@@ -31,12 +31,6 @@
if(!has_allowed_splat)
return FALSE
- if(excluded_clans && get_kindred_splat(new_holder))
- var/datum/splat/vampire/kindred/kindred_splat = get_kindred_splat(new_holder)
- if(kindred_splat.clan && (kindred_splat.clan.id in excluded_clans))
- to_chat(new_holder, span_warning("[failure_message]"))
- return FALSE
-
if(minimum_generation)
var/datum/splat/vampire/kindred/kindred_splat = get_kindred_splat(new_holder)
if(kindred_splat.generation < minimum_generation)
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/derangement.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/derangement.dm
index 9b65ceea57e1..bb2b81a68c1a 100644
--- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/derangement.dm
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/derangement.dm
@@ -163,10 +163,10 @@ GLOBAL_LIST_INIT(derangement_phrases,list(
mother = /obj/effect/client_image_holder/hallucination/your_mother/malk
/datum/hallucination/your_mother/malk/start()
- var/mob/living/carbon/human/malk = hallucinator
- var/age = malk.chronological_age
- if(!malk.client || IS_UNCONSCIOUS(malk))
+ var/mob/living/carbon/human/malk = astype(hallucinator)
+ if(!malk?.client || IS_UNCONSCIOUS(malk))
return FALSE
+ var/age = malk.chronological_age
var/list/spawn_locs = list()
for(var/turf/open/floor in view(malk, 4))
@@ -208,20 +208,6 @@ GLOBAL_LIST_INIT(derangement_phrases,list(
desc = "... but, that can't be her, can it?"
image_state = ""
-/obj/effect/client_image_holder/hallucination/your_mother/malk/Initialize(mapload, list/mobs_which_see_us, datum/hallucination/parent)
- var/mob/living/carbon/human/hallucinator = parent.hallucinator
- var/outfits = subtypesof(/datum/outfit/mafia)
- if (ishuman(hallucinator))
- var/mob/living/carbon/dna_haver = hallucinator
- image_icon = image(get_dynamic_human_appearance(pick(outfits), dna_haver.dna.species.type))
- return ..()
-
- image_icon = hallucinator.icon
- image_state = hallucinator.icon_state
- image_pixel_x = hallucinator.pixel_x
- image_pixel_y = hallucinator.pixel_y
- return ..()
-
// the random hallucination type will store overrides and extensions of basegame hallucinations, as well as untouched basegame hallucinations like eyes_in_the_dark
/datum/hallucination/malk/random
var/list/hallucinations = list(/datum/hallucination/eyes_in_dark, /datum/hallucination/your_mother/malk, /datum/hallucination/blood_flow/malk)
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/glowing_eyes.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/glowing_eyes.dm
index 5eed4ba23dd9..b520a4bba928 100644
--- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/glowing_eyes.dm
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/glowing_eyes.dm
@@ -2,7 +2,7 @@
/datum/quirk/darkpack/glowing_eyes
name = "Glowing Eyes"
desc = {"You have the stereotypical glowing eyes of vampire legend, giving you a -1 difficulty when intimidating mortals.
-However, you MUST constantly disguise your condition, and the glow impairs your vision."}
+ However, you MUST constantly disguise your condition, and the glow impairs your vision."}
ttrpg_sources = list(/datum/source_book/vtm20 = 482)
icon = FA_ICON_EYE
value = -3
@@ -12,6 +12,8 @@ However, you MUST constantly disguise your condition, and the glow impairs your
mob_trait = TRAIT_GLOWING_EYES
allowed_splats = list(SPLAT_KINDRED)
excluded_clans = list(VAMPIRE_CLAN_KIASYD)// They already have masq violating eyes!
+ /// Determines whether eyes glow outright or reflect light in the dark.
+ var/is_reflective = FALSE
/*You have the stereotypical glowing eyes of vampire
legend, which gives you a -1 difficulty on Intimidation
@@ -30,8 +32,14 @@ dark.*/
if(!human_holder)
return
ADD_TRAIT(quirk_holder, TRAIT_LUMINESCENT_EYES, QUIRK_TRAIT)
- ADD_TRAIT(quirk_holder, TRAIT_MASQUERADE_VIOLATING_EYES, QUIRK_TRAIT)
- human_holder.st_add_stat_mod(STAT_PERCEPTION, -1, "Glowing Eyes") // I guess this works. what would count as a sight-based roll is beyond me rn
+
+ if(!is_reflective) // If we're using the vampire version
+ human_holder.st_add_stat_mod(STAT_PERCEPTION, -1, "Glowing Eyes") // I guess this works. what would count as a sight-based roll is beyond me rn
+ ADD_TRAIT(quirk_holder, TRAIT_MASQUERADE_VIOLATING_EYES, QUIRK_TRAIT)
+ else // If we're not
+ var/obj/item/organ/eyes/eyes_organ = human_holder.get_organ_slot(ORGAN_SLOT_EYES)
+ eyes_organ?.flash_protect = max(eyes_organ?.flash_protect-1, FLASH_PROTECTION_HYPER_SENSITIVE)
+
var/obj/item/clothing/glasses/vampire/sun/new_glasses = new(human_holder.loc) // Give them glasses so they aren't immediately breaching on spawn or anything
human_holder.equip_to_appropriate_slot(new_glasses, TRUE)
@@ -41,6 +49,120 @@ dark.*/
if(!human_holder)
return
REMOVE_TRAIT(quirk_holder, TRAIT_LUMINESCENT_EYES, QUIRK_TRAIT)
- REMOVE_TRAIT(quirk_holder, TRAIT_MASQUERADE_VIOLATING_EYES, QUIRK_TRAIT)
- human_holder.st_remove_stat_mod(STAT_PERCEPTION, "Glowing Eyes")
+ if(!is_reflective) // If we're using the vampire version
+ human_holder.st_remove_stat_mod(STAT_PERCEPTION, "Glowing Eyes")
+ REMOVE_TRAIT(quirk_holder, TRAIT_MASQUERADE_VIOLATING_EYES, QUIRK_TRAIT)
+ else // If we're not
+ var/obj/item/organ/eyes/eyes_organ = human_holder.get_organ_slot(ORGAN_SLOT_EYES)
+ eyes_organ?.flash_protect = min(eyes_organ?.flash_protect+1, FLASH_PROTECTION_WELDER_HYPER_SENSITIVE)
+ quirk_holder.remove_status_effect(/datum/status_effect/glowing_eyes_warning)
+ quirk_holder.remove_status_effect(/datum/status_effect/glowing_eyes_full)
+
+/datum/quirk/darkpack/glowing_eyes/reflective // subtyped for organization
+ name = "Reflective Eyes"
+ desc = {"Your eyes reflect light in darkness. Whether you have a tapetum lucidum, exotic contact lenses, or some other condition, you'll frighten those you encounter in the dark.
+ This may even violate the laws your kind set to stay unknown if you are seen in the dark."}
+ value = -1
+ gain_text = span_notice("Your eyes reflect the light around you.")
+ lose_text = span_notice("The light in your eyes fades.")
+ failure_message = span_notice("Your eyes glint for a moment, then fade.")
+ quirk_flags = QUIRK_PROCESSES
+ mob_trait = null
+ allowed_splats = null
+ forbidden_splats = list(SPLAT_KINDRED)
+ is_reflective = TRUE
+
+/datum/quirk/darkpack/glowing_eyes/reflective/add(client/client_source)
+ . = ..()
+ RegisterSignal(quirk_holder, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved))
+
+/datum/quirk/darkpack/glowing_eyes/reflective/remove()
+ . = ..()
+ UnregisterSignal(quirk_holder, COMSIG_MOVABLE_MOVED)
+
+/datum/quirk/darkpack/glowing_eyes/reflective/process(seconds_per_tick)
+ eye_light_status()
+
+/datum/quirk/darkpack/glowing_eyes/reflective/proc/on_holder_moved(mob/living/source, atom/old_loc, dir, forced, list/old_locs)
+ SIGNAL_HANDLER
+ eye_light_status()
+
+/datum/quirk/darkpack/glowing_eyes/reflective/proc/eye_light_status()
+ if(quirk_holder.IsSleeping() || quirk_holder.IsUnconscious() || quirk_holder.is_eyes_covered())
+ quirk_holder.remove_status_effect(/datum/status_effect/glowing_eyes_warning)
+ quirk_holder.remove_status_effect(/datum/status_effect/glowing_eyes_full)
+ return
+
+ var/turf/holder_turf = get_turf(quirk_holder)
+ var/light_amount = round(holder_turf.get_lumcount(), 0.01)
+ switch(light_amount)
+ if(0 to 0.2)
+ quirk_holder.apply_status_effect(/datum/status_effect/glowing_eyes_full)
+ if(quirk_holder.has_status_effect(/datum/status_effect/glowing_eyes_warning))
+ quirk_holder.remove_status_effect(/datum/status_effect/glowing_eyes_warning)
+ if(0.21 to 0.53)
+ quirk_holder.apply_status_effect(/datum/status_effect/glowing_eyes_warning)
+ if(quirk_holder.has_status_effect(/datum/status_effect/glowing_eyes_full))
+ quirk_holder.remove_status_effect(/datum/status_effect/glowing_eyes_full)
+ if(0.54 to 1)
+ quirk_holder.remove_status_effect(/datum/status_effect/glowing_eyes_warning)
+ quirk_holder.remove_status_effect(/datum/status_effect/glowing_eyes_full)
+
+/datum/status_effect/glowing_eyes_warning
+ id = "glowing_eyes_warning"
+ status_type = STATUS_EFFECT_UNIQUE
+ duration = STATUS_EFFECT_PERMANENT
+ tick_interval = 3 SECONDS
+ alert_type = /atom/movable/screen/alert/status_effect/glowing_eyes_warning
+
+/datum/status_effect/glowing_eyes_warning/on_creation(mob/living/new_owner, ...)
+ . = ..()
+ linked_alert?.update_appearance(UPDATE_OVERLAYS)
+
+/atom/movable/screen/alert/status_effect/glowing_eyes_warning
+ name = "Strange Eyes"
+ desc = "Your unnatural eyes are starting to catch the light. Find somewhere brighter or cover them before a someone notices."
+ icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi'
+ icon_state = "template"
+
+/atom/movable/screen/alert/status_effect/glowing_eyes_warning/update_overlays()
+ . = ..()
+ var/mutable_appearance/glow = mutable_appearance('icons/mob/human/human_eyes.dmi', "eyes_glow_gs")
+ var/mob/living/carbon/human/human_owner = astype(owner)
+ var/obj/item/organ/eyes/eyes_organ = human_owner.get_organ_slot(ORGAN_SLOT_EYES)
+ glow.color = eyes_organ?.eye_color_left || COLOR_WHITE // could be more robust *shrug
+ glow.transform = matrix() * 2
+ glow.pixel_y = -16
+ . += glow
+
+/datum/status_effect/glowing_eyes_full
+ id = "glowing_eyes_full"
+ status_type = STATUS_EFFECT_UNIQUE
+ duration = STATUS_EFFECT_PERMANENT
+ tick_interval = 3 SECONDS
+ alert_type = /atom/movable/screen/alert/status_effect/glowing_eyes_full
+
+/datum/status_effect/glowing_eyes_full/on_apply()
+ . = ..()
+ ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_EYES, QUIRK_TRAIT)
+
+/datum/status_effect/glowing_eyes_full/on_creation(mob/living/new_owner, ...)
+ . = ..()
+ linked_alert?.update_appearance(UPDATE_OVERLAYS)
+
+/atom/movable/screen/alert/status_effect/glowing_eyes_full
+ name = "Strange Eyes"
+ desc = "Your unnatural eyes are catching the light intensely now. Find somewhere brighter or cover them before a someone notices."
+ icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi'
+ icon_state = "template"
+
+/atom/movable/screen/alert/status_effect/glowing_eyes_full/update_overlays()
+ . = ..()
+ var/mutable_appearance/glow = mutable_appearance('icons/mob/human/human_eyes.dmi', "eyes_mothglow_gs")
+ var/mob/living/carbon/human/human_owner = astype(owner)
+ var/obj/item/organ/eyes/eyes_organ = human_owner.get_organ_slot(ORGAN_SLOT_EYES)
+ glow.color = eyes_organ?.eye_color_left || COLOR_WHITE // could be more robust *shrug
+ glow.transform = matrix() * 2
+ glow.pixel_y = -16
+ . += glow
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/seizures.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/seizures.dm
index fc34c8a75be1..1bf90e4f80aa 100644
--- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/seizures.dm
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/seizures.dm
@@ -52,4 +52,4 @@
applicable_stats = list(STAT_TEMPORARY_WILLPOWER)
difficulty = 8
successes_needed = 3
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/victim_of_the_masquerade.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/victim_of_the_masquerade.dm
index d9f84919a22c..71ab96bfa6d0 100644
--- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/victim_of_the_masquerade.dm
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/victim_of_the_masquerade.dm
@@ -15,4 +15,4 @@
bumper_text = "victim of the masquerade"
applicable_stats = list(STAT_TEMPORARY_WILLPOWER)
difficulty = 6
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/ambidextrous.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/ambidextrous.dm
new file mode 100644
index 000000000000..2fdb6dad116f
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/ambidextrous.dm
@@ -0,0 +1,10 @@
+/datum/quirk/darkpack/ambidextrous
+ name = "Ambidextrous"
+ desc = {"You have a high degree of off-hand dexterity and can perform tasks with the "wrong" hand at no penalty. Penalties from dual wielding firearms are negated."}
+ ttrpg_sources = list(/datum/source_book/vtm20 = 480)
+ value = 1
+ mob_trait = TRAIT_AMBIDEXTROUS
+ gain_text = span_notice("Both of your hands feel capable.")
+ lose_text = span_notice("Your off hand dosen't have the same precise control as your main hand anymore")
+ icon = FA_ICON_HANDS
+ failure_message = "Your off hand dosen't have the same precise control as your main hand anymore"
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/coldly_logical.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/coldly_logical.dm
new file mode 100644
index 000000000000..f8cf894bc0de
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/coldly_logical.dm
@@ -0,0 +1,10 @@
+/datum/quirk/darkpack/coldly_logical
+ name = "Coldly Logical"
+ desc = "While some might refer to you as a “cold fish,” you have a knack for separating factual reporting from emotional or hysterical coloration. You may or may not be emotional yourself, but you can see clearly when others are clouding the facts with their feelings (+1 difficulty on all discs using emotion on you such as Presence and Melpominee)."
+ ttrpg_sources = list(/datum/source_book/vtm20 = 484)
+ value = 1
+ mob_trait = TRAIT_COLDLY_LOGICAL
+ gain_text = span_notice("You know for a fact that facts and feeling are two distinct concepts")
+ lose_text = span_notice("What is bias?")
+ icon = FA_ICON_FACE_MEH
+ failure_message = "What is bias?"
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/enchanting_voice.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/enchanting_voice.dm
new file mode 100644
index 000000000000..eb07e30837c4
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/enchanting_voice.dm
@@ -0,0 +1,11 @@
+/datum/quirk/darkpack/enchanting_voice
+ name = "Enchanting Voice"
+ desc = "There is something about your voice that others cannot ignore. When you command, they are cowed. When you seduce, they swoon. Whether thundering, soothing, persuading, or simply talking, your voice commands attention. The difficulties of all rolls involving the use of the voice (Such as Presence, Dominate or Melpominee) to persuade, charm, or command are reduced by two."
+ ttrpg_sources = list(/datum/source_book/vtm20 = 480)
+ value = 2
+ mob_trait = TRAIT_ENCHANTING_VOICE
+ gain_text = span_notice("Your voice is somehow more significant and people are sure to listen when you speak.")
+ lose_text = span_notice("Your voice is back to average.")
+ allowed_splats = list(SPLAT_KINDRED)
+ icon = FA_ICON_PODCAST
+
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/iron_will.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/iron_will.dm
new file mode 100644
index 000000000000..b36f272e3aa4
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/iron_will.dm
@@ -0,0 +1,18 @@
+/datum/quirk/darkpack/iron_will
+ name = "Iron Will"
+ desc = "When you are determined and your mind is set, nothing can thwart you from your goals. Dementation, Dominate, and any mind altering discipline is at +3 difficulty against you, Presence doesn't fall under this." // TODO: no check exists for characters under 8 wp
+ ttrpg_sources = list(/datum/source_book/vtm20 = 485)
+ value = 3
+ mob_trait = TRAIT_IRON_WILL
+ gain_text = span_notice("Your will is iron.")
+ lose_text = span_notice("Your will isn't iron anymore.")
+ icon = FA_ICON_USER_SHIELD
+ failure_message = "Your will isn't iron anymore."
+ allowed_splats = list(SPLAT_KINDRED)
+
+/datum/quirk/darkpack/iron_will/human
+ name = "Iron Will (Non-Vampire)"
+ ttrpg_sources = list(/datum/source_book/huntershunted1 = 60) // Hunters Hunted 1st edition
+ value = 4
+ allowed_splats = null
+ forbidden_splats = list(SPLAT_KINDRED)
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/metamorph.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/metamorph.dm
index f5c0b3fd1716..a2b76366aa0b 100644
--- a/modular_darkpack/modules/merits_flaws/code/positive_quirks/metamorph.dm
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/metamorph.dm
@@ -15,4 +15,4 @@
bumper_text = "metamorph"
applicable_stats = list(STAT_WITS) // + PRIMAL_URGE
difficulty = 8
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/pain_tolerance.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/pain_tolerance.dm
new file mode 100644
index 000000000000..7da463962f5e
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/pain_tolerance.dm
@@ -0,0 +1,19 @@
+/datum/quirk/darkpack/pain_tolerance
+ name = "Pain Tolerance"
+ desc = "Maybe you are a badass or shut off your nerves through Vicissitude. Maybe your sire put you through so many intricate hells that it would be tough for anyone else to compete. Maybe it just turns you on. Regardless, pains from injuries do not slow you down."
+ ttrpg_sources = list(/datum/source_book/vtm20/lotc = 238)
+ value = 2
+ gain_text = span_notice("You feel like you could tolerate more pain")
+ lose_text = span_notice("You feel like your tolerance for pain is back to average")
+ icon = FA_ICON_SKULL
+ allowed_splats = list(SPLAT_KINDRED, SPLAT_GHOUL)
+ included_clans = list(VAMPIRE_CLAN_TZIMISCE)
+ failure_message = "You feel like your tolerance for pain is back to average"
+
+/datum/quirk/darkpack/pain_tolerance/add(client/client_source)
+ quirk_holder.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+ quirk_holder.add_traits(list(TRAIT_ANALGESIA, TRAIT_NO_DAMAGE_OVERLAY), QUIRK_TRAIT)
+
+/datum/quirk/darkpack/pain_tolerance/remove(client/client_source)
+ quirk_holder.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+ quirk_holder.remove_traits(list(TRAIT_ANALGESIA, TRAIT_NO_DAMAGE_OVERLAY), QUIRK_TRAIT)
diff --git a/modular_darkpack/modules/npc/code/human/__npc.dm b/modular_darkpack/modules/npc/code/human/__npc.dm
index ad6bc26347ab..447ace554652 100644
--- a/modular_darkpack/modules/npc/code/human/__npc.dm
+++ b/modular_darkpack/modules/npc/code/human/__npc.dm
@@ -90,9 +90,11 @@
RegisterSignal(src, COMSIG_LIVING_MOB_BUMPED, PROC_REF(handle_bumped))
// Be annoyed if helped
RegisterSignal(src, COMSIG_CARBON_HELP_ACT, PROC_REF(handle_helped))
+ // all npcs are masquerade violators by default so flip it to true
+ toggle_masquerade_sensitivity(TRUE)
return INITIALIZE_HINT_LATELOAD
-/mob/living/carbon/human/npc/LateInitialize(mapload)
+/mob/living/carbon/human/npc/LateInitialize()
if (role_weapons_chances.Find(type))
for(var/weapon in role_weapons_chances[type])
if(prob(role_weapons_chances[type][weapon]))
diff --git a/modular_darkpack/modules/npc/code/human/npc_movement.dm b/modular_darkpack/modules/npc/code/human/npc_movement.dm
index dc178d680b58..5cbd3f4f190c 100644
--- a/modular_darkpack/modules/npc/code/human/npc_movement.dm
+++ b/modular_darkpack/modules/npc/code/human/npc_movement.dm
@@ -221,15 +221,7 @@
return FALSE
if(mind || client)
return FALSE
- if(IsSleeping())
- return FALSE
- if(IsUnconscious())
- return FALSE
- if(IsParalyzed())
- return FALSE
- if(IsKnockdown())
- return FALSE
- if(IsStun())
+ if(IsIncapacitated())
return FALSE
if(HAS_TRAIT(src, TRAIT_RESTRAINED))
return FALSE
@@ -246,6 +238,9 @@
return TRUE
+/mob/living/proc/IsIncapacitated() //If we're incapacitated in any way
+ return locate(/datum/status_effect/incapacitating) in status_effects || null
+
/mob/living/carbon/human/npc/proc/observed_by_player()
for (var/mob/observing_mob in viewers(DEFAULT_SIGHT_DISTANCE, src))
if (!observing_mob.client)
diff --git a/modular_darkpack/modules/occult_artifacts/code/_artifact.dm b/modular_darkpack/modules/occult_artifacts/code/_artifact.dm
index 6c3125de05c1..b9cf40d89617 100644
--- a/modular_darkpack/modules/occult_artifacts/code/_artifact.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/_artifact.dm
@@ -34,6 +34,8 @@
var/rank = 1
var/can_be_identified_without_ritual = TRUE
+ var/magic_type
+
var/grant_sound // = 'sound/effects/magic/swap.ogg'
var/ungrant_sound // = 'sound/effects/magic/teleport_diss.ogg'
diff --git a/modular_darkpack/modules/occult_artifacts/code/_vampire.dm b/modular_darkpack/modules/occult_artifacts/code/_vampire.dm
index 7b803e33bc5f..9fc6f72b3430 100644
--- a/modular_darkpack/modules/occult_artifacts/code/_vampire.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/_vampire.dm
@@ -1,2 +1,3 @@
/obj/item/occult_artifact/vampire
abstract_type = /obj/item/occult_artifact/vampire
+ magic_type = MAGIC_TYPE_BLOOD
diff --git a/modular_darkpack/modules/occult_artifacts/code/_werewolf.dm b/modular_darkpack/modules/occult_artifacts/code/_werewolf.dm
index b0ffdd9622ec..a1661426a8f7 100644
--- a/modular_darkpack/modules/occult_artifacts/code/_werewolf.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/_werewolf.dm
@@ -11,6 +11,7 @@ GLOBAL_LIST_INIT(animal_spirits, world.file2list("modular_darkpack/modules/occul
ONFLOOR_ICON_HELPER('modular_darkpack/modules/occult_artifacts/icons/fetishes_onfloor.dmi')
icon_state = "dagger"
abstract_type = /obj/item/occult_artifact/werewolf
+ magic_type = MAGIC_TYPE_SPIRIT
var/spirit_name = "Glitchimus"
var/spirit_type = "ahelp"
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/weekapaug_thistle.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/weekapaug_thistle.dm
index 406bd60fe0fb..10ec9e43cbd9 100644
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/weekapaug_thistle.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/artifacts/weekapaug_thistle.dm
@@ -10,14 +10,8 @@
/obj/item/occult_artifact/vampire/weekapaug_thistle/grant_powers()
. = ..()
- var/mob/living/carbon/human/human_owner = astype(owner)
- if(!human_owner)
- return
- human_owner.physiology.armor = human_owner.physiology.armor.add_other_armor(/datum/armor/weekapaug_thistle)
+ owner.add_inner_armor(/datum/armor/weekapaug_thistle)
/obj/item/occult_artifact/vampire/weekapaug_thistle/ungrant_powers()
. = ..()
- var/mob/living/carbon/human/human_owner = astype(owner)
- if(!human_owner)
- return
- human_owner.physiology.armor = human_owner.physiology.armor.subtract_other_armor(/datum/armor/weekapaug_thistle)
+ owner.remove_inner_armor(/datum/armor/weekapaug_thistle)
diff --git a/modular_darkpack/modules/phones/code/_phone.dm b/modular_darkpack/modules/phones/code/_phone.dm
index d1ba0c8ebc86..38cd65b1c8c0 100644
--- a/modular_darkpack/modules/phones/code/_phone.dm
+++ b/modular_darkpack/modules/phones/code/_phone.dm
@@ -79,7 +79,6 @@
wiki_book = new()
become_hearing_sensitive(ROUNDSTART_TRAIT)
RegisterSignal(src, COMSIG_MOVABLE_HEAR, PROC_REF(handle_hearing))
- AddComponent(/datum/component/violation_observer, FALSE)
phone_background = "BG_[rand(1,18)]" // pick a random phone background when spawned
/obj/item/smartphone/proc/update_initialized_contacts()
diff --git a/modular_darkpack/modules/phones/code/phone_procs.dm b/modular_darkpack/modules/phones/code/phone_procs.dm
index e5698349db71..6d1624de242b 100644
--- a/modular_darkpack/modules/phones/code/phone_procs.dm
+++ b/modular_darkpack/modules/phones/code/phone_procs.dm
@@ -171,7 +171,8 @@
animate(pixel_w = -1, time = 0.1 SECONDS, flags = ANIMATION_RELATIVE)
if(ringer)
playsound(src, 'modular_darkpack/modules/phones/sounds/text_receive.ogg', 50, TRUE, 0, 2) // This could prob use a better notification
- balloon_alert_to_viewers("[app]:[title]", vision_distance = SAMETILE_MESSAGE_RANGE)
+ if(vibration || ringer)
+ balloon_alert_to_viewers("[app]:[title]", vision_distance = SAMETILE_MESSAGE_RANGE)
#undef VIBRATION_LOOP_DURATION
@@ -197,6 +198,10 @@
set_phone_state(PHONE_IN_CALL)
calling_smartphone.set_phone_state(PHONE_IN_CALL)
+ // turn masq stuff on
+ toggle_masquerade_sensitivity(TRUE)
+ calling_smartphone.toggle_masquerade_sensitivity(TRUE)
+
phone_radio.canhear_range = 1
calling_smartphone.phone_radio.canhear_range = 1
@@ -223,6 +228,10 @@
set_phone_state(PHONE_AVAILABLE)
calling_smartphone.set_phone_state(PHONE_AVAILABLE)
+ // turn masq stuff off
+ toggle_masquerade_sensitivity(FALSE)
+ calling_smartphone.toggle_masquerade_sensitivity(FALSE)
+
// Internal only proc, used for setting a phone's internal radio when accepting and terminating calls.
/obj/item/smartphone/proc/set_phone_radio(enabled)
PROTECTED_PROC(TRUE)
diff --git a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm
index 78508bef81a1..41036036360e 100644
--- a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm
+++ b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm
@@ -31,6 +31,8 @@
var/hostile = FALSE
/// If use of this power creates a visible Masquerade breach.
var/violates_masquerade = FALSE
+ /// Can this be used while in frenzy
+ var/frenzy_usable = TRUE
/* HOW AND WHEN IT'S ACTIVATED AND DEACTIVATED */
/// If this Discipline doesn't automatically expire, but rather periodically drains blood.
@@ -50,6 +52,10 @@
/// List of Discipline power types that cannot be activated alongside this power and share a cooldown with it.
var/list/grouped_powers
+ var/magic_type = MAGIC_TYPE_BLOOD
+ var/magic_subtype
+ var/spawns_magic_effect = TRUE
+
/* NOT MEANT TO BE OVERRIDDEN */
/// Timer(s) tracking the duration of the power. Can have multiple if multi_activate is true.
var/list/duration_timers = list()
@@ -269,6 +275,11 @@
//feedback is sent by the proc preventing activation
return FALSE
+ if(!frenzy_usable && HAS_TRAIT(owner, TRAIT_IN_FRENZY))
+ if(alert)
+ to_chat(owner, span_warning("You cannot do this while in frenzy!"))
+ return FALSE
+
//can't activate if the owner isn't capable of it
if (!can_activate_untargeted(alert))
return FALSE
@@ -450,6 +461,11 @@
do_caster_notification(target)
do_logging(target)
+ if(spawns_magic_effect && magic_type)
+ var/turf/used_turf = get_turf(discipline.owner)
+ if(used_turf)
+ spawn_magic_after_effect(used_turf, discipline.owner, level, magic_type, magic_subtype)
+
owner.update_action_buttons()
return TRUE
@@ -726,6 +742,8 @@
to_chat(owner, span_warning("You don't have enough blood to keep [src] active!"))
try_deactivate(target)
+ SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION)
+
/**
* Overridable proc that allows for extra modular code
* in refreshing behaviour. Can do custom checks to see if activation
diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm
index 951869336dea..1682c8c21947 100644
--- a/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm
+++ b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm
@@ -190,6 +190,7 @@
aura_appearance = mutable_appearance('modular_darkpack/modules/powers/icons/auras.dmi', "aura", ABOVE_MOB_LAYER, parent_mob, ABOVE_GAME_PLANE)
else
aura_appearance = mutable_appearance('modular_darkpack/modules/powers/icons/auras.dmi', "aura_dead", ABOVE_MOB_LAYER, parent_mob, ABOVE_GAME_PLANE)
+
update_aura_colors(aura_appearance, holder)
update_aura_overlays(aura_appearance, holder)
update_aura_filters(aura_appearance, holder)
diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm b/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm
index 717542a2312b..67bbdac5c72a 100644
--- a/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm
+++ b/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm
@@ -108,7 +108,7 @@
bumper_text = "aura reading"
difficulty = 8
applicable_stats = list(STAT_PERCEPTION, STAT_EMPATHY)
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
//AURA PERCEPTION
/datum/discipline_power/auspex/aura_perception
@@ -159,6 +159,7 @@
check_flags = DISC_CHECK_CONSCIOUS
vitae_cost = 0
cooldown_length = 1 TURNS
+ frenzy_usable = FALSE
toggled = TRUE
@@ -274,18 +275,19 @@
var/datum/storyteller_roll/disguise_voice_roll/disguise_roll
COOLDOWN_DECLARE(mind_read_cd)
COOLDOWN_DECLARE(implant_tht_cd)
+ frenzy_usable = FALSE
/datum/storyteller_roll/telepathy_success
bumper_text = "mind reading"
applicable_stats = list(STAT_INTELLIGENCE, STAT_SUBTERFUGE)
numerical = TRUE
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
/datum/storyteller_roll/disguise_voice_roll
bumper_text = "disguise voice"
applicable_stats = list(STAT_MANIPULATION, STAT_SUBTERFUGE)
numerical = FALSE
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
/datum/discipline_power/auspex/telepathy/pre_activation_checks(mob/living/target)
. = ..()
@@ -351,7 +353,7 @@
log_directed_talk(owner, target, input_message, LOG_SAY, "Telepathy")
to_chat(owner, span_notice("You project your thoughts into [GET_GUESTBOOK_NAME(owner, target)]'s mind: \"[input_message]\""))
- to_chat(target, span_boldannounce("You hear the voice of [target?.mind?.guestbook?.get_known_name(target, disguised_voice) ? target?.mind?.guestbook?.get_known_name(target, disguised_voice) : disguised_voice] in your thoughts: \"[input_message]\""))
+ to_chat(target, span_boldannounce("You hear the voice of [target?.mind?.guestbook?.get_known_name(target, disguised_voice) || disguised_voice] in your thoughts: \"[input_message]\""))
COOLDOWN_START(src, implant_tht_cd, 5 SECONDS)
if(TELEPATHY_MIND_READING)
@@ -416,6 +418,7 @@
check_flags = DISC_CHECK_CONSCIOUS
vitae_cost = 0
cooldown_length = 1 TURNS
+ frenzy_usable = FALSE
/datum/discipline_power/auspex/psychic_projection/activate()
. = ..()
diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/avatar/avatar.dm b/modular_darkpack/modules/powers/code/discipline/auspex/avatar/avatar.dm
index 8379f4dcbe77..77aba4e06a4e 100644
--- a/modular_darkpack/modules/powers/code/discipline/auspex/avatar/avatar.dm
+++ b/modular_darkpack/modules/powers/code/discipline/auspex/avatar/avatar.dm
@@ -22,7 +22,7 @@
response_harm_continuous = "punches through"
response_harm_simple = "punch through"
unsuitable_atmos_damage = 0
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0)
+ physiology = list(TOX = 0, STAMINA = 0, OXY = 0)
habitable_atmos = null
minimum_survivable_temperature = 0
maximum_survivable_temperature = INFINITY
diff --git a/modular_darkpack/modules/powers/code/discipline/bloodheal/bloodheal.dm b/modular_darkpack/modules/powers/code/discipline/bloodheal/bloodheal.dm
index f551f5d4152d..bd79681b5153 100644
--- a/modular_darkpack/modules/powers/code/discipline/bloodheal/bloodheal.dm
+++ b/modular_darkpack/modules/powers/code/discipline/bloodheal/bloodheal.dm
@@ -13,7 +13,7 @@
bumper_text = "Bloodheal"
difficulty = 8
applicable_stats = list(STAT_STAMINA, STAT_SURVIVAL)
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
/datum/discipline_power/bloodheal
name = "Bloodheal power name"
@@ -39,14 +39,16 @@
/datum/discipline_power/bloodheal/seven,
/datum/discipline_power/bloodheal/eight,
/datum/discipline_power/bloodheal/nine,
- /datum/discipline_power/bloodheal/ten
+ /datum/discipline_power/bloodheal/ten,
)
var/datum/storyteller_roll/bloodheal/bloodheal_roll
+#define BLOODHEAL_INTERACTION_KEY "bloodheal_key"
+
/datum/discipline_power/bloodheal/pre_activation_checks(atom/target)
. = ..()
- if(do_after(owner, 1 TURNS, timed_action_flags = DO_AFTER_CHECK_NEXT_MOVE | IGNORE_INCAPACITATED))
+ if(do_after(owner, 1 TURNS, timed_action_flags = DO_AFTER_CHECK_NEXT_MOVE | IGNORE_INCAPACITATED, interaction_key = BLOODHEAL_INTERACTION_KEY))
return TRUE
if(!bloodheal_roll)
bloodheal_roll = new()
@@ -65,6 +67,8 @@
owner.apply_damage(1 TTRPG_DAMAGE, BRUTE)
return FALSE
+#undef BLOODHEAL_INTERACTION_KEY
+
/datum/discipline_power/bloodheal/activate()
. = ..()
diff --git a/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm b/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm
index 94c1fe661e2f..737bef0ce145 100644
--- a/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm
+++ b/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion.dm
@@ -1,5 +1,5 @@
-/datum/discipline/daimoinon
- name = "Daimoinon"
+/datum/discipline/daimonion
+ name = "Daimonion"
desc = {"Draw power from the demons and infernal nature of Hell. Use subtle power to manipulate people and when you must, draw upon fire itself and protect yourself.
● Sense the Sin: Perception + Empathy vs. target's Self-Control + 4
●● Fear of the Void Below: Wits + Intimidation vs. target's Courage + 4
@@ -8,18 +8,18 @@
●●●●● Condemnation: Intelligence + Occult vs. target's Willpower"}
icon_state = "daimonion"
clan_restricted = TRUE
- power_type = /datum/discipline_power/daimoinon
+ power_type = /datum/discipline_power/daimonion
signature_clan = VAMPIRE_CLAN_BAALI
-/datum/discipline_power/daimoinon
- name = "Daimoinon power name"
- desc = "Daimoinon power description"
+/datum/discipline_power/daimonion
+ name = "Daimonion power name"
+ desc = "Daimonion power description"
activate_sound = 'modular_darkpack/modules/deprecated/sounds/protean_activate.ogg'
deactivate_sound = 'modular_darkpack/modules/deprecated/sounds/protean_deactivate.ogg'
//SENSE THE SIN
-/datum/discipline_power/daimoinon/sense_the_sin
+/datum/discipline_power/daimonion/sense_the_sin
name = "Sense the Sin"
desc = "Sense the sins and cruelties of your victim."
@@ -27,6 +27,7 @@
range = 7
level = 1
vitae_cost = 0
+ frenzy_usable = FALSE
cancelable = TRUE
var/datum/storyteller_roll/sense_the_sin/sense_the_sin_roll
@@ -34,9 +35,9 @@
/datum/storyteller_roll/sense_the_sin
bumper_text = "sense the sin"
applicable_stats = list(STAT_PERCEPTION, STAT_EMPATHY)
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
-/datum/discipline_power/daimoinon/sense_the_sin/pre_activation_checks(mob/living/target)
+/datum/discipline_power/daimonion/sense_the_sin/pre_activation_checks(mob/living/target)
if(!sense_the_sin_roll)
sense_the_sin_roll = new()
sense_the_sin_roll.difficulty = max(target.st_get_stat(STAT_SELF_CONTROL), target.st_get_stat(STAT_INSTINCT)) + 4
@@ -46,7 +47,7 @@
else
return TRUE
-/datum/discipline_power/daimoinon/sense_the_sin/activate(mob/living/carbon/human/target)
+/datum/discipline_power/daimonion/sense_the_sin/activate(mob/living/carbon/human/target)
. = ..()
if(target.st_get_stat(STAT_CHARISMA) <= 2)
to_chat(owner, span_notice("They are not social or influencing."))
@@ -98,7 +99,7 @@
return
*/
-/datum/discipline_power/daimoinon/sense_the_sin/proc/baali_get_stolen_disciplines(mob/living/target, mob/living/owner)
+/datum/discipline_power/daimonion/sense_the_sin/proc/baali_get_stolen_disciplines(mob/living/target, mob/living/owner)
if(!owner || !target)
return
var/datum/splat/vampire/kindred/vampire = get_kindred_splat(target)
@@ -116,7 +117,7 @@
to_chat(owner, span_warning("[target] has stolen [discipline.name]!"))
//FEAR OF THE VOID BELOW
-/datum/discipline_power/daimoinon/fear_of_the_void_below
+/datum/discipline_power/daimonion/fear_of_the_void_below
name = "Fear of the Void Below"
desc = "Induce fear in a target."
@@ -134,9 +135,9 @@
/datum/storyteller_roll/fear_of_the_void_below
bumper_text = "fear of the void below"
applicable_stats = list(STAT_WITS, STAT_INTIMIDATION)
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
-/datum/discipline_power/daimoinon/fear_of_the_void_below/pre_activation_checks(mob/living/target)
+/datum/discipline_power/daimonion/fear_of_the_void_below/pre_activation_checks(mob/living/target)
if(!fear_of_the_void_below_roll)
fear_of_the_void_below_roll = new()
fear_of_the_void_below_roll.difficulty = target.st_get_stat(STAT_COURAGE) + 4
@@ -146,7 +147,7 @@
return FALSE
return TRUE
-/datum/discipline_power/daimoinon/fear_of_the_void_below/activate(mob/living/carbon/human/target)
+/datum/discipline_power/daimonion/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))
@@ -155,7 +156,7 @@
target.Immobilize(6 SECONDS)
//CONFLAGRATION
-/datum/discipline_power/daimoinon/conflagration
+/datum/discipline_power/daimonion/conflagration
name = "Conflagration"
desc = "Draw out the destructive essence of the Beyond."
@@ -173,7 +174,7 @@
damage = 25
damage_type = AGGRAVATED
-/datum/discipline_power/daimoinon/conflagration/activate(mob/living/target)
+/datum/discipline_power/daimonion/conflagration/activate(mob/living/target)
. = ..()
var/turf/start = get_turf(owner)
var/obj/projectile/flames/baali/created_fireball = new(start)
@@ -182,7 +183,7 @@
created_fireball.fire(angle, target)
//PSYCHOMANIA
-/datum/discipline_power/daimoinon/psychomania
+/datum/discipline_power/daimonion/psychomania
name = "Psychomania"
desc = "Bring forth the target's greatest fear."
@@ -197,16 +198,16 @@
/datum/storyteller_roll/psychomania
bumper_text = "psychomania"
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
-/datum/discipline_power/daimoinon/psychomania/pre_activation_checks(mob/living/target)
+/datum/discipline_power/daimonion/psychomania/pre_activation_checks(mob/living/target)
if(!psychomania_roll)
psychomania_roll = new()
//forces the subject's player to roll her lowest Virtue
var/datum/st_stat/virtue/lowest_virtue
for(var/virtue_type in subtypesof(/datum/st_stat/virtue))
- var/datum/st_stat/virtue/target_stat = target.storyteller_stats["[virtue_type]"]
+ var/datum/st_stat/virtue/target_stat = target.storyteller_stats[virtue_type]
if(!lowest_virtue || target_stat.get_score() < lowest_virtue.get_score())
lowest_virtue = target_stat
@@ -220,7 +221,7 @@
to_chat(owner, span_warning("[target] is too pure to manifest their fears!"))
return FALSE
-/datum/discipline_power/daimoinon/psychomania/activate(mob/living/target)
+/datum/discipline_power/daimonion/psychomania/activate(mob/living/target)
. = ..()
var/datum/splat/werewolf/shifter/garou_splat = get_shifter_splat(target)
@@ -243,13 +244,13 @@
to_chat(target, span_cult("MY WORST NIGHTMARES FLASH BEFORE MY EYES"))
target.Paralyze(7 SECONDS)
-/datum/discipline_power/daimoinon/psychomania/proc/on_demon_contact(obj/effect/client_image_holder/baali_demon/source, mob/living/victim)
+/datum/discipline_power/daimonion/psychomania/proc/on_demon_contact(obj/effect/client_image_holder/baali_demon/source, mob/living/victim)
SIGNAL_HANDLER
source.on_contact(victim)
step_away(victim, get_turf(source))
//CONDEMNATION
-/datum/discipline_power/daimoinon/condemnation
+/datum/discipline_power/daimonion/condemnation
name = "Condemnation"
desc = "Condemn a soul to suffering."
@@ -261,13 +262,14 @@
vitae_cost = 0
var/datum/storyteller_roll/condemnation/condemnation_roll
var/list/available_curses
+ frenzy_usable = FALSE
/datum/storyteller_roll/condemnation
bumper_text = "condemnation"
applicable_stats = list(STAT_INTELLIGENCE, STAT_OCCULT)
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
-/datum/discipline_power/daimoinon/condemnation/activate(mob/living/target)
+/datum/discipline_power/daimonion/condemnation/activate(mob/living/target)
. = ..()
if(target.has_status_effect(/datum/status_effect/condemnation))
diff --git a/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion_curses.dm b/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion_curses.dm
index 2a10cfcd1121..e0ef5a0c9514 100644
--- a/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion_curses.dm
+++ b/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion_curses.dm
@@ -1,11 +1,11 @@
-/datum/movespeed_modifier/daimoinon_curse
+/datum/movespeed_modifier/daimonion_curse
multiplicative_slowdown = 0.4
/datum/status_effect/condemnation
abstract_type = /datum/status_effect/condemnation
id = null
tick_interval = STATUS_EFFECT_NO_TICK
- alert_type = /atom/movable/screen/alert/status_effect/daimoinon_condemnation
+ alert_type = /atom/movable/screen/alert/status_effect/daimonion_condemnation
var/name = "Condemnation"
var/genrequired = 13
var/bloodcost = 1
@@ -70,10 +70,10 @@
/datum/status_effect/condemnation/success_weakness/on_apply()
. = ..()
- owner.add_movespeed_modifier(/datum/movespeed_modifier/daimoinon_curse)
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/daimonion_curse)
to_chat(owner, span_userdanger(span_bold("You feel like a great curse was placed on you!")))
-/atom/movable/screen/alert/status_effect/daimoinon_condemnation
+/atom/movable/screen/alert/status_effect/daimonion_condemnation
name = "Condemnation"
desc = "You've been cursed by infernal magic - permanently weakening your body."
icon_state = "crucible"
diff --git a/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion_hallucination.dm b/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion_hallucination.dm
index 129ad9a7fe3d..941437651be4 100644
--- a/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion_hallucination.dm
+++ b/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion_hallucination.dm
@@ -2,14 +2,14 @@
name = "infernal demon"
image_icon = 'modular_darkpack/modules/deprecated/icons/32x48.dmi'
image_state = "baali"
- var/mob/living/target //person who had daimoinon 4 used on them
+ var/mob/living/target //person who had daimonion 4 used on them
COOLDOWN_DECLARE(move_cooldown)
/obj/effect/client_image_holder/baali_demon/Initialize(mapload, list/mobs_which_see_us)
. = ..()
for(var/mob/living/possible_target as anything in mobs_which_see_us)
target = possible_target
- break // daimoinon only has a demon chasing after one target at a time but parent init asks for a list.
+ break // daimonion only has a demon chasing after one target at a time but parent init asks for a list.
var/turf/closed/wall = locate(/turf/closed) in range(7, target)
if(!wall)
return INITIALIZE_HINT_QDEL
diff --git a/modular_darkpack/modules/powers/code/discipline/dementation.dm b/modular_darkpack/modules/powers/code/discipline/dementation.dm
index 81717267712d..c8364851e85b 100644
--- a/modular_darkpack/modules/powers/code/discipline/dementation.dm
+++ b/modular_darkpack/modules/powers/code/discipline/dementation.dm
@@ -15,6 +15,10 @@
. = ..()
owner.add_quirk(/datum/quirk/darkpack/derangement)
+/datum/discipline/dementation/post_loss()
+ owner.remove_quirk(/datum/quirk/darkpack/derangement)
+ return ..()
+
/datum/discipline_power/dementation
name = "Dementation power name"
desc = "Dementation power description"
@@ -146,6 +150,8 @@ pools for a turn or two after the manifestation.
var/resistence_stat = target.st_get_stat(STAT_SELF_CONTROL)
if(get_kindred_splat(target))
resistence_stat = target.st_get_stat(owner.is_enlightenment() ? STAT_CONVICTION : STAT_SELF_CONTROL)
+ if(HAS_TRAIT(target, TRAIT_IRON_WILL))
+ resistence_stat += 3
var/theirpower = target.st_get_stat(STAT_PERCEPTION) + resistence_stat
mypower = SSroll.storyteller_roll_datum(owner, difficulty = theirpower, applic_stats = list(STAT_MANIPULATION, STAT_SUBTERFUGE), numerical = TRUE)
if(mypower <= 0)
@@ -435,6 +441,8 @@ determines the duration.
/datum/discipline_power/dementation/total_insanity/pre_activation_checks(mob/living/carbon/human/target)
theirpower = target.st_get_stat(STAT_TEMPORARY_WILLPOWER)
+ if(HAS_TRAIT(target, TRAIT_IRON_WILL))
+ theirpower += 3
mypower = SSroll.storyteller_roll_datum(owner, difficulty = theirpower, applic_stats = list(STAT_MANIPULATION, STAT_INTIMIDATION), numerical = TRUE)
if(mypower <= 0)
to_chat(owner, span_warning("[target]'s mind is too powerful to corrupt!"))
diff --git a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm
index 80076d4ffb7a..de8ebbb975dd 100644
--- a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm
+++ b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm
@@ -59,6 +59,7 @@
name = "Dominate power name"
desc = "Dominate power description"
vitae_cost = 0 //No Dominate 1-5 abilities cost blood.
+ frenzy_usable = FALSE
activate_sound = 'modular_darkpack/modules/powers/sounds/dominate.ogg'
@@ -115,6 +116,9 @@
var/theirpower = target.st_get_stat(STAT_TEMPORARY_WILLPOWER)
+ if(HAS_TRAIT(target, TRAIT_IRON_WILL))
+ theirpower += 3
+
//tremere have built-in safeguards to easily dominate their stone servitors
if(HAS_TRAIT(target, TRAIT_WEAK_TO_DOMINATE))
theirpower -= 2
@@ -122,9 +126,15 @@
if(HAS_TRAIT(target, TRAIT_WEAK_WILLED))
theirpower -= 2
+ if(HAS_TRAIT(target, TRAIT_IN_FRENZY))
+ theirpower += 2
+
if((!(owner.obscured_slots & HIDEFACE))&(HAS_TRAIT(owner, TRAIT_DISFIGURED_APPEARANCE))) // Are we visibly disfigured?
theirpower += 2
+ if(HAS_TRAIT(owner, TRAIT_ENCHANTING_VOICE))
+ theirpower -= 2
+
if(!get_kindred_splat(target)) // Is our target mortal?
if(HAS_TRAIT(owner, TRAIT_GRAVE_SMELL)) // Are we stinky?
theirpower += 1
diff --git a/modular_darkpack/modules/powers/code/discipline/fortitude/fortitude_status_effect.dm b/modular_darkpack/modules/powers/code/discipline/fortitude/fortitude_status_effect.dm
index 9322969bae80..a8a4947ec734 100644
--- a/modular_darkpack/modules/powers/code/discipline/fortitude/fortitude_status_effect.dm
+++ b/modular_darkpack/modules/powers/code/discipline/fortitude/fortitude_status_effect.dm
@@ -13,17 +13,11 @@
. = ..()
if (!.)
return
-
- if (ishuman(owner))
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.armor = human_owner.physiology.armor.add_other_armor(armor_type)
+ owner.add_inner_armor(armor_type)
/datum/status_effect/fortitude/on_remove()
. = ..()
-
- if (ishuman(owner))
- var/mob/living/carbon/human/human_owner = owner
- human_owner.physiology.armor = human_owner.physiology.armor.subtract_other_armor(armor_type)
+ owner.remove_inner_armor(armor_type)
// Status effect ranks
/datum/status_effect/fortitude/one
diff --git a/modular_darkpack/modules/powers/code/discipline/melpominee.dm b/modular_darkpack/modules/powers/code/discipline/melpominee.dm
index 1764b123a98c..c6e3c0409d53 100644
--- a/modular_darkpack/modules/powers/code/discipline/melpominee.dm
+++ b/modular_darkpack/modules/powers/code/discipline/melpominee.dm
@@ -19,6 +19,7 @@
vitae_cost = 1 // All Melpominee powers below 5 dots cost blood except for Missing Voice
var/obj/effect/abstract/particle_holder/particle_generator
+ frenzy_usable = FALSE
/datum/discipline_power/melpominee/proc/setup_particles()
if(!particle_generator)
@@ -104,7 +105,7 @@
successes_needed = 1
applicable_stats = list(STAT_WITS, STAT_PERFORMANCE)
numerical = TRUE
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
spammy_roll = TRUE
/datum/discipline_power/melpominee/phantom_speaker
@@ -162,12 +163,14 @@
var/language = owner.get_selected_language()
var/message = owner.compose_message(owner, language, input_message)
// Composed message of all the people in listener_list
- var/those_who_hear = "[jointext(listener_list, ", ", 1, length(listener_list))], and [listener_list[length(listener_list)]]."
+ var/those_who_hear = "[english_list(listener_list)]."
// The roll itself; wits+perception against diff 7
var/mob/living/caster = owner
var/datum/storyteller_roll/phantom_speaker/roll_datum = new()
+ if(HAS_TRAIT(owner, TRAIT_ENCHANTING_VOICE))
+ roll_datum.difficulty -= 2
var/roll_result = roll_datum.st_roll(caster)
if(roll_result < ROLL_SUCCESS)
@@ -218,12 +221,18 @@
/datum/discipline_power/melpominee/madrigal/activate()
. = ..()
- var/our_power = SSroll.storyteller_roll_datum(owner, difficulty = 7, applic_stats = list(STAT_WITS, STAT_PERFORMANCE), numerical = TRUE)
+ var/our_difficulty = 7
+ if(HAS_TRAIT(owner, TRAIT_ENCHANTING_VOICE))
+ our_difficulty -= 2
+ var/our_power = SSroll.storyteller_roll_datum(owner, difficulty = our_difficulty, applic_stats = list(STAT_WITS, STAT_PERFORMANCE), numerical = TRUE)
var/emotion = tgui_input_list(owner, "What emotion do you wish to incite?", "Madrigal", GLOB.emotion_to_quality)
for(var/mob/living/carbon/member in ohearers(7, owner))
audience += member
- var/their_power = SSroll.storyteller_roll_datum(member, difficulty = 7, applic_stats = list(STAT_WITS, STAT_AWARENESS), numerical = TRUE)
+ var/their_difficulty = 7
+ if(HAS_TRAIT(member, TRAIT_COLDLY_LOGICAL))
+ their_difficulty -= 1
+ var/their_power = SSroll.storyteller_roll_datum(member, difficulty = their_difficulty, applic_stats = list(STAT_WITS, STAT_AWARENESS), numerical = TRUE)
if(our_power > their_power)
set_emotion(member, emotion)
@@ -261,12 +270,12 @@
bumper_text = "Siren's Beckoning"
applicable_stats = list(STAT_WITS, STAT_PERFORMANCE)
numerical = TRUE
- roll_output_type = ROLL_PRIVATE_AND_TARGET
+ roll_output_type = ROLL_FLAG_ROLLER|ROLL_FLAG_TARGET
spammy_roll = TRUE
/datum/storyteller_roll/sirens_beckoning/victim // Difficulty is the siren's Appearance + Performance
applicable_stats = list(STAT_TEMPORARY_WILLPOWER)
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
/datum/discipline_power/melpominee/sirens_beckoning
name = "Siren's Beckoning"
@@ -327,9 +336,16 @@
listener_list = ohearers(owner, 7)
for(var/mob/living/carbon/listener in listener_list)
- var/our_power = SSroll.storyteller_roll_datum(owner, target, /datum/storyteller_roll/sirens_beckoning, 0, listener.st_get_stat(STAT_TEMPORARY_WILLPOWER))
+ var/our_difficulty = listener.st_get_stat(STAT_TEMPORARY_WILLPOWER)
+ if(HAS_TRAIT(owner, TRAIT_ENCHANTING_VOICE))
+ our_difficulty -= 2
+ var/our_power = SSroll.storyteller_roll_datum(owner, target, /datum/storyteller_roll/sirens_beckoning, 0, difficulty = our_difficulty)
cumulative_our_power[listener] += our_power
- var/their_power = SSroll.storyteller_roll_datum(listener, owner, /datum/storyteller_roll/sirens_beckoning/victim, 0, owner.st_get_stat(STAT_APPEARANCE) + owner.st_get_stat(STAT_PERFORMANCE))
+
+ var/their_difficulty = owner.st_get_stat(STAT_APPEARANCE) + owner.st_get_stat(STAT_PERFORMANCE)
+ if(HAS_TRAIT(listener, TRAIT_COLDLY_LOGICAL))
+ their_difficulty -= 1
+ var/their_power = SSroll.storyteller_roll_datum(listener, owner, /datum/storyteller_roll/sirens_beckoning/victim, 0, difficulty = their_difficulty)
cumulative_list[listener] += their_power
if(our_power > their_power && should_run_effect(listener))
effect(listener)
diff --git a/modular_darkpack/modules/powers/code/discipline/mytherceria.dm b/modular_darkpack/modules/powers/code/discipline/mytherceria.dm
index 1b52be5811b2..ff35668a4225 100644
--- a/modular_darkpack/modules/powers/code/discipline/mytherceria.dm
+++ b/modular_darkpack/modules/powers/code/discipline/mytherceria.dm
@@ -25,6 +25,7 @@
check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE
target_type = TARGET_MOB
range = 7
+ frenzy_usable = FALSE
cooldown_length = 10 SECONDS
@@ -32,9 +33,14 @@
. = ..()
to_chat(owner, span_purple("Your fae senses reach out to detect what they're carrying..."))
for(var/obj/item/item in target.get_all_contents())
+ /* Magic limbs.... should be fine?
if(isorgan(item) || isbodypart(item))
continue
- to_chat(owner, "- [item.name]")
+ */
+ var/list/magic_sources = item.get_magic_sources()
+ if(!length(magic_sources))
+ continue
+ to_chat(owner, span_purple("- [item.examine_title(owner)]"))
//DARKLING TRICKERY
/datum/discipline_power/mytherceria/darkling_trickery
@@ -45,6 +51,7 @@
check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_FREE_HAND | DISC_CHECK_LYING
target_type = TARGET_LIVING
range = 3
+ frenzy_usable = FALSE
cooldown_length = 30 SECONDS
@@ -53,7 +60,7 @@
var/list/choices = list()
for(var/obj/item/thing in target.get_all_contents())
- if(isorgan(thing) || isbodypart(thing))
+ if(isorgan(thing) || isbodypart(thing) || HAS_TRAIT(thing, TRAIT_NODROP))
continue
choices[thing.name] = thing
@@ -78,6 +85,7 @@
check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_FREE_HAND
target_type = TARGET_MOB
range = 5
+ frenzy_usable = FALSE
aggravating = TRUE
hostile = TRUE
@@ -154,6 +162,7 @@
check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE
target_type = TARGET_LIVING
range = 5
+ frenzy_usable = FALSE
aggravating = TRUE
hostile = TRUE
@@ -175,6 +184,7 @@
check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_SPEAK
target_type = TARGET_LIVING
range = 7
+ frenzy_usable = FALSE
cooldown_length = 0
diff --git a/modular_darkpack/modules/powers/code/discipline/necromancy.dm b/modular_darkpack/modules/powers/code/discipline/necromancy.dm
index cb65f35b9653..4f798f327214 100644
--- a/modular_darkpack/modules/powers/code/discipline/necromancy.dm
+++ b/modular_darkpack/modules/powers/code/discipline/necromancy.dm
@@ -32,27 +32,26 @@
/datum/discipline_power/necromancy
name = "Necromancy power name"
desc = "Necromancy power description"
+ frenzy_usable = FALSE
//SHROUDSIGHT V20 p. 163
/datum/storyteller_roll/shroudsight
bumper_text = "shroudsight"
applicable_stats = list(STAT_PERCEPTION, STAT_AWARENESS)
difficulty = 7
- reroll_cooldown = 1 SCENES
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
/datum/discipline_power/necromancy/shroudsight
name = "Shroudsight"
desc = "See in darkness clearly and see ghosts present."
-
level = 1
check_flags = DISC_CHECK_CONSCIOUS
- vitae_cost = 1
+ vitae_cost = 0
activate_sound = 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy1on.ogg'
deactivate_sound = 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy1off.ogg'
- cooldown_length = 3 SCENES
+ cooldown_length = 10 SECONDS
duration_length = 1 SCENES
var/datum/storyteller_roll/shroudsight/roll_datum
@@ -60,11 +59,12 @@
/datum/discipline_power/necromancy/shroudsight/pre_activation_checks(mob/living/target)
if(!roll_datum)
roll_datum = new()
-
var/roll_result = roll_datum.st_roll(owner)
- if(roll_result == ROLL_COOLDOWN)
- return FALSE
- return roll_result == ROLL_SUCCESS
+ if(roll_result == ROLL_SUCCESS)
+ return TRUE
+
+ do_cooldown(cooldown_length)
+ return FALSE
/datum/discipline_power/necromancy/shroudsight/activate()
. = ..()
@@ -218,7 +218,8 @@
ADD_TRAIT(corpsebuff, TRAIT_NOSOFTCRIT, NECROMANCY_TRAIT)
ADD_TRAIT(corpsebuff, TRAIT_NOHARDCRIT, NECROMANCY_TRAIT)
- //ADD_TRAIT(corpsebuff, TRAIT_IGNOREDAMAGESLOWDOWN, NECROMANCY_TRAIT)
+ ADD_TRAIT(corpsebuff, TRAIT_ANALGESIA, NECROMANCY_TRAIT)
+ corpsebuff.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
corpsebuff.add_movespeed_modifier(/datum/movespeed_modifier/corpsebuff)
corpsebuff.do_jitter_animation(2 SECONDS)
else //everyone else eats tox and CC
@@ -250,7 +251,8 @@
part.brute_modifier = initial(part.brute_modifier)
REMOVE_TRAIT(corpsebuff, TRAIT_NOSOFTCRIT, NECROMANCY_TRAIT)
REMOVE_TRAIT(corpsebuff, TRAIT_NOHARDCRIT, NECROMANCY_TRAIT)
- //REMOVE_TRAIT(corpsebuff, TRAIT_IGNOREDAMAGESLOWDOWN, NECROMANCY_TRAIT)
+ REMOVE_TRAIT(corpsebuff, TRAIT_ANALGESIA, NECROMANCY_TRAIT)
+ corpsebuff.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
corpsebuff.remove_movespeed_modifier(/datum/movespeed_modifier/corpsebuff)
else
corpsebuff.remove_movespeed_modifier(/datum/movespeed_modifier/corpsenerf)
diff --git a/modular_darkpack/modules/powers/code/discipline/obeah/obeah.dm b/modular_darkpack/modules/powers/code/discipline/obeah/obeah.dm
index 3faefe9bb145..53a4814e5fb3 100644
--- a/modular_darkpack/modules/powers/code/discipline/obeah/obeah.dm
+++ b/modular_darkpack/modules/powers/code/discipline/obeah/obeah.dm
@@ -174,6 +174,7 @@
var/successes = 0
var/datum/storyteller_roll/anesthetic_touch/touch_roll // these are defined in valeren.dm
var/datum/storyteller_roll/anesthetic_touch/unwilling/touch_roll_unwilling
+ frenzy_usable = FALSE
/datum/discipline_power/obeah/anesthetic_touch/pre_activation_checks(mob/living/target)
. = ..()
@@ -201,7 +202,8 @@
var/chosen_option = show_radial_menu(owner, target, choices, radius = 38, require_near = TRUE)
switch(chosen_option)
if("Soothe Pain")
- ADD_TRAIT(target, TRAIT_IGNORESLOWDOWN, type)
+ owner.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+ ADD_TRAIT(target, TRAIT_ANALGESIA, type)
addtimer(CALLBACK(src, PROC_REF(end_soothe_pain), target), (successes TURNS) + soothe_duration_length)
if("Put To Sleep")
if(get_kindred_splat(target))
@@ -212,7 +214,8 @@
return TRUE
/datum/discipline_power/obeah/anesthetic_touch/proc/end_soothe_pain(mob/living/target)
- REMOVE_TRAIT(target, TRAIT_IGNORESLOWDOWN, type)
+ owner.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+ REMOVE_TRAIT(target, TRAIT_ANALGESIA, type)
/datum/discipline_power/obeah/corpore_sano
name = "Corpore Sano"
@@ -222,6 +225,7 @@
check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND | DISC_CHECK_IMMOBILE
target_type = TARGET_LIVING
range = 1
+ frenzy_usable = FALSE
violates_masquerade = TRUE
cooldown_length = 1 TURNS
@@ -249,6 +253,7 @@
willpower_cost = 2
cancelable = TRUE
var/datum/proximity_monitor/advanced/shepherds_watch/area_of_effect
+ frenzy_usable = FALSE
/datum/discipline_power/obeah/shepherds_watch/activate(atom/target)
. = ..()
@@ -282,12 +287,13 @@
target_type = TARGET_LIVING
range = 1
var/datum/storyteller_roll/mens_sana/discipline_roll
+ frenzy_usable = FALSE
/datum/storyteller_roll/mens_sana
bumper_text = "mens sana"
applicable_stats = list(STAT_INTELLIGENCE, STAT_EMPATHY)
difficulty = 8
- roll_output_type = ROLL_PRIVATE_AND_TARGET
+ roll_output_type = ROLL_FLAG_ROLLER|ROLL_FLAG_TARGET
/datum/discipline_power/obeah/mens_sana/activate(atom/target)
. = ..()
diff --git a/modular_darkpack/modules/powers/code/discipline/obeah/shepherds_watch.dm b/modular_darkpack/modules/powers/code/discipline/obeah/shepherds_watch.dm
index e8b1c9870ade..d273389f241c 100644
--- a/modular_darkpack/modules/powers/code/discipline/obeah/shepherds_watch.dm
+++ b/modular_darkpack/modules/powers/code/discipline/obeah/shepherds_watch.dm
@@ -1,7 +1,7 @@
/datum/storyteller_roll/shepherds_watch
bumper_text = "shepherd's watch"
applicable_stats = list(STAT_PERMANENT_WILLPOWER)
- roll_output_type = ROLL_PRIVATE_ADMIN
+ roll_output_type = ROLL_FLAG_ROLLER
numerical = TRUE
spammy_roll = TRUE
difficulty = 1 // This changes for both.
diff --git a/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm
index b0e817b3c4ca..446f0bb27042 100644
--- a/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm
+++ b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm
@@ -94,6 +94,7 @@
/datum/discipline_power/obfuscate/vanish_from_the_minds_eye,
/datum/discipline_power/obfuscate/cloak_the_gathering
)
+ frenzy_usable = FALSE
/datum/discipline_power/obfuscate/cloak_of_shadows/pre_activation_checks()
. = ..()
@@ -136,6 +137,7 @@
level = 2
check_flags = DISC_CHECK_CAPABLE
vitae_cost = 0
+ frenzy_usable = FALSE
toggled = TRUE
@@ -189,6 +191,7 @@
level = 3
check_flags = DISC_CHECK_CAPABLE
vitae_cost = 0 // vitae cost handled in activate()
+ frenzy_usable = FALSE
toggled = TRUE
grouped_powers = list(
@@ -213,7 +216,8 @@
var/mob/living/carbon/human/target = examined
var/image/target_image = image(target)
to_chat(owner, span_info("You get a good look at your target and memorize their features."))
- LAZYSET(cached_targets, target.name, list("image" = target_image, "target" = target))
+ // Oh this shit hella hard-dels.
+ LAZYSET(cached_targets, GET_GUESTBOOK_NAME_TRUE(examiner, target), list("image" = target_image, "target" = target))
/datum/discipline_power/obfuscate/mask_of_a_thousand_faces/post_gain()
. = ..()
@@ -240,20 +244,10 @@
/datum/discipline_power/obfuscate/mask_of_a_thousand_faces/activate()
. = ..()
+ var/mob/living/carbon/human/target = owner?.mind?.guestbook.pick_known_guy(owner)
- var/list/display_targets = list()
- for(var/target_name in cached_targets)
- display_targets[target_name] = cached_targets[target_name]["image"]
-
- var/chosen_name = show_radial_menu(owner, owner, display_targets, radius = 40, require_near = TRUE, tooltips = TRUE)
- if(!chosen_name)
- try_deactivate(direct = TRUE)
- return
-
- var/mob/living/carbon/human/target = cached_targets[chosen_name]["target"]
-
- if(!target)
- to_chat(owner, span_warning("You can't recall [chosen_name]'s features clearly enough!"))
+ if(!istype(target))
+ to_chat(owner, span_warning("You can't recall [target]'s features clearly enough!"))
try_deactivate(direct = TRUE)
return
@@ -359,6 +353,7 @@
level = 5
check_flags = DISC_CHECK_CAPABLE
vitae_cost = 0
+ frenzy_usable = FALSE
toggled = TRUE
diff --git a/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm b/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm
index 59c3410b92de..8060fd0abaf6 100644
--- a/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm
+++ b/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm
@@ -51,6 +51,7 @@
multi_activate = TRUE
duration_length = 1 SCENES
cooldown_length = 1 TURNS
+ frenzy_usable = FALSE
var/list/shadows = list() // A list of all active shadows
var/datum/action/clear_shadows/cbutton // The button to clear everything
@@ -208,7 +209,7 @@
switch(roll)
if(ROLL_SUCCESS)
successful = TRUE
- owner.physiology.damage_resistance += 60
+ owner.damage_resistance += 60
animate(owner, color = "#000000", time = 1 SECONDS, loop = 1)
to_chat(owner, span_green("You successfully fuse with the shadows!"))
if(ROLL_FAILURE)
@@ -225,7 +226,7 @@
return
to_chat(owner, span_notice("The shadows fall away from your body."))
playsound(owner.loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE)
- owner.physiology.damage_resistance -= 60
+ owner.damage_resistance -= 60
animate(owner, color = initial(owner.color), time = 1 SECONDS, loop = 1)
/datum/discipline_power/obtenebration/tenebrous_form
@@ -242,12 +243,6 @@
cooldown_length = 1 TURNS
var/activating = FALSE
- var/saved_brute_mod = 1
- var/saved_burn_mod = 1
- var/saved_aggravated_mod = 1
- var/saved_clone_mod = 1
- var/saved_stamina_mod = 1
- var/saved_brain_mod = 1
var/saved_density
/datum/discipline_power/obtenebration/tenebrous_form/pre_activation_checks()
@@ -277,16 +272,11 @@
. = ..()
activating = FALSE
playsound(owner.loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE)
- saved_brute_mod = owner.physiology.brute_mod
- owner.physiology.brute_mod = 0
- saved_burn_mod = owner.physiology.burn_mod
- owner.physiology.burn_mod = 2
- saved_aggravated_mod= owner.physiology.aggravated_mod
- owner.physiology.aggravated_mod = 0
- saved_stamina_mod = owner.physiology.stamina_mod
- owner.physiology.stamina_mod = 0
- saved_brain_mod = owner.physiology.brain_mod
- owner.physiology.brain_mod = 0
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 0.1)
+ MODIFY_PHYSIOLOGY(owner, BURN, 2)
+ MODIFY_PHYSIOLOGY(owner, AGGRAVATED, 0.1)
+ MODIFY_PHYSIOLOGY(owner, STAMINA, 0.1)
+ MODIFY_PHYSIOLOGY(owner, BRAIN, 0.1)
animate(owner, color = "#000000", time = 1 SECONDS, loop = 1)
ADD_TRAIT(owner, TRAIT_STUNIMMUNE, MAGIC_TRAIT)
@@ -305,11 +295,11 @@
. = ..()
to_chat(owner, span_notice("You return to your normal form."))
playsound(owner.loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE)
- owner.physiology.brute_mod = saved_brute_mod
- owner.physiology.burn_mod = saved_burn_mod
- owner.physiology.aggravated_mod = saved_aggravated_mod
- owner.physiology.stamina_mod = saved_stamina_mod
- owner.physiology.brain_mod = saved_brain_mod
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 10)
+ MODIFY_PHYSIOLOGY(owner, BURN, 0.5)
+ MODIFY_PHYSIOLOGY(owner, AGGRAVATED, 10)
+ MODIFY_PHYSIOLOGY(owner, STAMINA, 10)
+ MODIFY_PHYSIOLOGY(owner, BRAIN, 10)
animate(owner, color = initial(owner.color), time = 1 SECONDS, loop = 1)
REMOVE_TRAIT(owner, TRAIT_STUNIMMUNE, MAGIC_TRAIT)
diff --git a/modular_darkpack/modules/powers/code/discipline/potence/potence_status_effect.dm b/modular_darkpack/modules/powers/code/discipline/potence/potence_status_effect.dm
index 6b8e073a45ef..84feb2d21052 100644
--- a/modular_darkpack/modules/powers/code/discipline/potence/potence_status_effect.dm
+++ b/modular_darkpack/modules/powers/code/discipline/potence/potence_status_effect.dm
@@ -5,7 +5,7 @@
var/level = 1
var/datum/component/tackler/tackler
- var/list/obj/item/bodypart/affected_bodyparts
+ var/list/datum/weakref/affected_bodyparts
/datum/status_effect/potence/on_creation(mob/living/new_owner, level)
src.level = level
@@ -25,7 +25,7 @@
if (!istype(limb, /obj/item/bodypart/arm) && !istype(limb, /obj/item/bodypart/leg))
continue
- LAZYADD(affected_bodyparts, limb)
+ LAZYADD(affected_bodyparts, WEAKREF(limb))
limb.unarmed_attack_sound = 'modular_darkpack/modules/powers/sounds/heavypunch.ogg'
else if (isbasicmob(owner))
var/mob/living/basic/basic_owner = owner
@@ -41,12 +41,15 @@
owner.st_remove_auto_successes(STAT_STRENGTH, "Potence")
owner.st_add_stat_mod(STAT_STRENGTH, level, "Potence")
- if (iscarbon(owner))
- for (var/obj/item/bodypart/limb in affected_bodyparts)
- limb.unarmed_attack_sound = initial(limb.unarmed_attack_sound)
- else if (isbasicmob(owner))
+ for(var/datum/weakref/limb_weakref in affected_bodyparts)
+ var/obj/item/bodypart/limb = limb_weakref.resolve()
+ if(!limb)
+ continue
+ limb.unarmed_attack_sound = limb::unarmed_attack_sound
+
+ if(isbasicmob(owner))
var/mob/living/basic/basic_owner = owner
- basic_owner.attack_sound = initial(basic_owner.attack_sound)
+ basic_owner.attack_sound = basic_owner::attack_sound
LAZYCLEARLIST(affected_bodyparts)
diff --git a/modular_darkpack/modules/powers/code/discipline/presence/presence.dm b/modular_darkpack/modules/powers/code/discipline/presence/presence.dm
index 6734ae64819c..cc66aba313eb 100644
--- a/modular_darkpack/modules/powers/code/discipline/presence/presence.dm
+++ b/modular_darkpack/modules/powers/code/discipline/presence/presence.dm
@@ -39,6 +39,15 @@
if((!(owner.obscured_slots & HIDEFACE))&(HAS_TRAIT(owner, TRAIT_DISFIGURED_APPEARANCE))) // Are we visibly disfigured?
theirpower += 2 // Increase the difficulty by two.
+ if(HAS_TRAIT(owner, TRAIT_ENCHANTING_VOICE))
+ theirpower -= 2
+
+ if(HAS_TRAIT(target, TRAIT_COLDLY_LOGICAL))
+ theirpower += 1
+
+ if(HAS_TRAIT(target, TRAIT_IN_FRENZY))
+ theirpower += 2
+
if(!get_kindred_splat(target)) // Is our target mortal?
if(HAS_TRAIT(owner, TRAIT_GRAVE_SMELL)) // Are we stinky?
theirpower += 1
@@ -97,11 +106,13 @@
check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_SPEAK
range = 7
multi_activate = FALSE
+ cancelable = TRUE
cooldown_length = 15 SECONDS
- duration_length = 10 SECONDS
+ duration_length = 1 SCENES
vitae_cost = 1
var/successes = 0
var/list/affected_targets = list()
+ frenzy_usable = FALSE
/datum/discipline_power/presence/awe/pre_activation_checks()
. = ..()
@@ -137,7 +148,7 @@
var/mob/living/carbon/target = potential_targets[i]
apply_presence_overlay(target)
to_chat(target, span_yellowteamradio("You feel extremely attracted to and persuaded by [owner]'s words, no matter what they're saying!"))
- target.apply_status_effect(STATUS_EFFECT_AWE)
+ target.apply_status_effect(STATUS_EFFECT_AWE, owner)
affected_targets += target
var/affected_count = length(affected_targets)
@@ -149,6 +160,7 @@
/datum/discipline_power/presence/awe/deactivate()
. = ..()
for(var/mob/living/carbon/target in affected_targets)
+ target.remove_status_effect(STATUS_EFFECT_AWE)
target.remove_overlay(POWERS_LAYER)
affected_targets.Cut()
@@ -221,6 +233,7 @@
duration_length = 5 SECONDS
vitae_cost = 1
var/successes = 0
+ frenzy_usable = FALSE
/datum/discipline_power/presence/entrancement/pre_activation_checks(mob/living/target)
@@ -265,20 +278,11 @@
vitae_cost = 1
var/successes = 0
var/mob/living/carbon/human/summon_target
+ frenzy_usable = FALSE
/datum/discipline_power/presence/summon/pre_activation_checks(mob/living/target)
- var/summon_target_name = tgui_input_text(owner, "Summon Target:", "Summon Target")
- if(!summon_target_name)
- return FALSE
- summon_target_name = sanitize_name(summon_target_name)
-
- for(var/mob/living/carbon/human/H in GLOB.player_list)
- if(H.real_name == summon_target_name)
- summon_target = H
- break
-
- if(!summon_target)
- to_chat(owner, span_warning("You cannot sense anyone by that name."))
+ var/mob/living/summon_target = owner?.mind?.guestbook.pick_known_guy(owner)
+ if(!istype(summon_target))
return FALSE
//this ability has a difficulty of 4 or 5 or something for people the summoner has met, and 8 for those they've only met briefly.
@@ -335,6 +339,7 @@
willpower_cost = 1
violates_masquerade = TRUE
var/list/affected_targets = list()
+ frenzy_usable = FALSE
/datum/discipline_power/presence/majesty/pre_activation_checks(mob/living/target)
return TRUE
diff --git a/modular_darkpack/modules/powers/code/discipline/presence/status_effects/awe_status_effect.dm b/modular_darkpack/modules/powers/code/discipline/presence/status_effects/awe_status_effect.dm
index 6719fbd83652..db43aaa94f5a 100644
--- a/modular_darkpack/modules/powers/code/discipline/presence/status_effects/awe_status_effect.dm
+++ b/modular_darkpack/modules/powers/code/discipline/presence/status_effects/awe_status_effect.dm
@@ -1,12 +1,17 @@
/datum/status_effect/awe //Used for powers that force a target to walk to you.
id = "awe"
status_type = STATUS_EFFECT_UNIQUE
- duration = 5 SECONDS
+ duration = 1 SCENES
alert_type = /atom/movable/screen/alert/status_effect/awe
var/mob/living/carbon/human/source
+/datum/status_effect/awe/on_creation(mob/living/new_owner, mob/living/carbon/human/awe_source)
+ . = ..()
+ source = awe_source
+ if(linked_alert && source)
+ linked_alert.desc = "[capitalize("[source.get_visible_name(add_id_name = FALSE, examiner = owner)]")] seems alluring... I feel captivated by their presence. I need to get closer."
+
/atom/movable/screen/alert/status_effect/awe
name = "Awe"
- desc = "That person sure seems alluring... I should get closer."
+ desc = "That person seems alluring... I feel captivated by their presence. I need to get closer."
icon_state = "hypnosis"
-
diff --git a/modular_darkpack/modules/powers/code/discipline/protean/protean.dm b/modular_darkpack/modules/powers/code/discipline/protean/protean.dm
index 3846b760cd60..2beaaea9226d 100644
--- a/modular_darkpack/modules/powers/code/discipline/protean/protean.dm
+++ b/modular_darkpack/modules/powers/code/discipline/protean/protean.dm
@@ -191,8 +191,8 @@
/datum/discipline_power/protean/shape_of_the_beast/deactivate()
UnregisterSignal(owner, COMSIG_LIVING_RETURNED_FROM_SHAPESHIFT)
- . = ..()
gangy_form.Remove(owner)
+ . = ..()
QDEL_NULL(gangy_form)
owner.Stun(1 TURNS)
owner.do_jitter_animation(15)
diff --git a/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm b/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm
index a66d799ce87f..cb0351f65bbc 100644
--- a/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm
+++ b/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm
@@ -30,6 +30,7 @@
duration_length = 1 SCENES
cooldown_length = 2 SCENES
var/datum/proximity_monitor/advanced/silence_of_death/silence_field
+ frenzy_usable = FALSE
/datum/discipline_power/quietus/silence_of_death/activate()
. = ..()
diff --git a/modular_darkpack/modules/powers/code/discipline/serpentis.dm b/modular_darkpack/modules/powers/code/discipline/serpentis.dm
index c78f9611c423..e0d8078fcb9e 100644
--- a/modular_darkpack/modules/powers/code/discipline/serpentis.dm
+++ b/modular_darkpack/modules/powers/code/discipline/serpentis.dm
@@ -31,6 +31,7 @@
aggravating = FALSE
hostile = FALSE
violates_masquerade = TRUE
+ frenzy_usable = FALSE
multi_activate = TRUE
duration_length = 5 SECONDS
@@ -69,7 +70,7 @@
/datum/discipline_power/serpentis/the_eyes_of_the_serpent/activate(mob/living/target)
. = ..()
target.face_atom(owner)
- target.visible_message(span_hypnophrase("[owner] hypnotizes [target] with [owner.p_their()] eyes!"), span_warning("[owner] hypnotizes you! Their words seem to become more convincing and hypnotic..."))
+ target.visible_message(span_hypnophrase("[owner] hypnotizes [target] with [owner.p_their()] eyes!"), span_warning("[owner] hypnotizes you! You can't seem to move or look away..."))
if(ishuman(target))
var/mob/living/carbon/human/H = target
H.remove_overlay(POWERS_LAYER)
@@ -266,6 +267,7 @@
vitae_cost = 0
violates_masquerade = TRUE
+ frenzy_usable = FALSE
cooldown_length = 20 SECONDS
diff --git a/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm b/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm
index 9ce9fff065f5..f21e2412d2bd 100644
--- a/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm
+++ b/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm
@@ -17,6 +17,8 @@
activate_sound = 'modular_darkpack/modules/powers/sounds/temporis/temporis.ogg'
+ magic_subtype = MAGIC_SUBTYPE_BLOOD_TIME
+
/datum/discipline_power/temporis/activate()
. = ..()
ADD_TRAIT(owner, TRAIT_TIMEWARPER, DISCIPLINE_TRAIT(type))
@@ -81,6 +83,7 @@
vitae_cost = 0 //You *can* spend a BP to boost this, but it'd extend time to hours or a day.
hostile = TRUE
+ frenzy_usable = FALSE
cooldown_length = 15 SECONDS
@@ -125,6 +128,7 @@
check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE
violates_masquerade = TRUE
+ frenzy_usable = FALSE
cancelable = TRUE
duration_length = 10 SECONDS
diff --git a/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm b/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm
index fd0a16f90192..71cbfb5c16cc 100644
--- a/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm
+++ b/modular_darkpack/modules/powers/code/discipline/thanatosis/thanatosis.dm
@@ -29,11 +29,12 @@
cancelable = TRUE
duration_length = 1 HOURS
var/datum/storyteller_roll/hags_wrinkles/hags_wrinkles_roll
+ frenzy_usable = FALSE
/datum/storyteller_roll/hags_wrinkles
bumper_text = "hag's wrinkles"
applicable_stats = list(STAT_STAMINA, STAT_SUBTERFUGE)
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
/obj/item/implant/storage/thanatosis
name = "hag's wrinkles"
@@ -83,7 +84,7 @@
bumper_text = "putrefaction"
applicable_stats = list(STAT_DEXTERITY, STAT_MEDICINE)
numerical = TRUE
- roll_output_type = ROLL_PRIVATE_AND_TARGET
+ roll_output_type = ROLL_FLAG_ROLLER|ROLL_FLAG_TARGET
/datum/discipline_power/thanatosis/putrefaction/pre_activation_checks(mob/living/target)
. = ..()
@@ -156,6 +157,7 @@
cancelable = TRUE
duration_length = 0
cooldown_length = 1 TURNS
+ frenzy_usable = FALSE
var/datum/action/cooldown/spell/shapeshift/samedi_ash/dust_transformation
@@ -204,7 +206,7 @@
bumper_text = "withering"
applicable_stats = list(STAT_MANIPULATION, STAT_MEDICINE)
numerical = TRUE
- roll_output_type = ROLL_PRIVATE_AND_TARGET
+ roll_output_type = ROLL_FLAG_ROLLER|ROLL_FLAG_TARGET
/datum/discipline_power/thanatosis/withering/pre_activation_checks(mob/living/target)
. = ..()
@@ -281,7 +283,7 @@
bumper_text = "necrosis"
applicable_stats = list(STAT_DEXTERITY, STAT_MEDICINE)
numerical = TRUE
- roll_output_type = ROLL_PRIVATE_AND_TARGET
+ roll_output_type = ROLL_FLAG_ROLLER|ROLL_FLAG_TARGET
/datum/discipline_power/thanatosis/necrosis/pre_activation_checks(mob/living/carbon/human/target)
. = ..()
diff --git a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm
index b790df7aae90..4aa610834dc5 100644
--- a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm
+++ b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm
@@ -86,6 +86,7 @@
aggravating = FALSE
hostile = FALSE
violates_masquerade = FALSE
+ frenzy_usable = FALSE
grouped_powers = list(
/datum/discipline_power/thaumaturgy/blood_rage,
@@ -97,7 +98,7 @@
/datum/discipline_power/thaumaturgy/a_taste_for_blood/activate(atom/target)
if(..())
return
- var/datum/reagent/blood/blood = target.reagents.has_reagent(/datum/reagent/blood) || target.reagents.has_reagent(/datum/reagent/blood/vitae)
+ var/datum/reagent/blood/blood = target.reagents.has_reagent(/datum/reagent/blood, check_subtypes = TRUE)
if(!blood)
to_chat(owner, span_notice("This blood tastes bland."))
return
@@ -163,6 +164,7 @@
aggravating = FALSE
hostile = FALSE
violates_masquerade = FALSE
+ frenzy_usable = FALSE
grouped_powers = list(
/datum/discipline_power/thaumaturgy/a_taste_for_blood,
@@ -199,6 +201,7 @@
aggravating = FALSE
hostile = FALSE
violates_masquerade = FALSE
+ frenzy_usable = FALSE
grouped_powers = list()
var/activated = FALSE
diff --git a/modular_darkpack/modules/powers/code/discipline/valeren.dm b/modular_darkpack/modules/powers/code/discipline/valeren.dm
index 049bf87a9aee..c1b21ebc09f3 100644
--- a/modular_darkpack/modules/powers/code/discipline/valeren.dm
+++ b/modular_darkpack/modules/powers/code/discipline/valeren.dm
@@ -26,7 +26,7 @@
applicable_stats = list(STAT_PERCEPTION, STAT_EMPATHY)
difficulty = 7
numerical = TRUE
- roll_output_type = ROLL_PRIVATE_ADMIN
+ roll_output_type = ROLL_FLAG_ROLLER
/datum/discipline_power/valeren/sense_vitality
name = "Sense Vitality"
@@ -177,7 +177,7 @@
bumper_text = "anesthetic touch"
applicable_stats = list(STAT_TEMPORARY_WILLPOWER)
numerical = TRUE
- roll_output_type = ROLL_PRIVATE_AND_TARGET
+ roll_output_type = ROLL_FLAG_ROLLER|ROLL_FLAG_TARGET
/datum/storyteller_roll/anesthetic_touch/unwilling
bumper_text = "anesthetic touch (unwilling)"
@@ -196,6 +196,7 @@
var/successes = 0
var/datum/storyteller_roll/anesthetic_touch/touch_roll
var/datum/storyteller_roll/anesthetic_touch/unwilling/touch_roll_unwilling
+ frenzy_usable = FALSE
/datum/discipline_power/valeren/anesthetic_touch/pre_activation_checks(mob/living/target)
. = ..()
@@ -223,7 +224,8 @@
var/chosen_option = show_radial_menu(owner, target, choices, radius = 38, require_near = TRUE)
switch(chosen_option)
if("Soothe Pain")
- ADD_TRAIT(target, TRAIT_IGNORESLOWDOWN, type)
+ owner.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+ ADD_TRAIT(target, TRAIT_ANALGESIA, type)
addtimer(CALLBACK(src, PROC_REF(end_soothe_pain), target), (successes TURNS) + soothe_duration_length)
if("Put To Sleep")
if(get_kindred_splat(target))
@@ -234,7 +236,8 @@
return TRUE
/datum/discipline_power/valeren/anesthetic_touch/proc/end_soothe_pain(mob/living/target)
- REMOVE_TRAIT(target, TRAIT_IGNORESLOWDOWN, type)
+ owner.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+ REMOVE_TRAIT(target, TRAIT_ANALGESIA, type)
/datum/discipline_power/valeren/burning_touch
name = "Burning Touch"
@@ -258,13 +261,13 @@
/datum/storyteller_roll/burning_touch_resist
bumper_text = "resist burning pain"
applicable_stats = list(STAT_TEMPORARY_WILLPOWER)
- roll_output_type = ROLL_PRIVATE_AND_TARGET
+ roll_output_type = ROLL_FLAG_ROLLER|ROLL_FLAG_TARGET
/datum/storyteller_roll/burning_touch_focus
bumper_text = "focus through burning pain"
applicable_stats = list(STAT_TEMPORARY_WILLPOWER)
spammy_roll = TRUE
- roll_output_type = ROLL_PRIVATE_AND_TARGET
+ roll_output_type = ROLL_FLAG_ROLLER|ROLL_FLAG_TARGET
/datum/status_effect/burning_touch
id = "burning_touch"
@@ -331,7 +334,7 @@
applicable_stats = list(STAT_STAMINA, STAT_MELEE)
difficulty = 7
numerical = TRUE
- roll_output_type = ROLL_PRIVATE_AND_TARGET
+ roll_output_type = ROLL_FLAG_ROLLER|ROLL_FLAG_TARGET
/datum/discipline_power/valeren/armor_of_caines_fury
name = "Armor of Caine's Fury"
@@ -441,6 +444,7 @@
check_flags = DISC_CHECK_CAPABLE
toggled = TRUE
duration_length = 1 TURNS
+ frenzy_usable = FALSE
/datum/discipline_power/valeren/vengeance_of_samiel/activate()
. = ..()
@@ -457,7 +461,7 @@
var/bonus = 5
var/datum/component/tackler/tackler
- var/list/obj/item/bodypart/affected_bodyparts
+ var/list/datum/weakref/affected_bodyparts
/datum/status_effect/vengeance_of_samiel/on_apply()
. = ..()
@@ -471,7 +475,7 @@
for (var/obj/item/bodypart/limb as anything in carbon_owner.bodyparts)
if (!istype(limb, /obj/item/bodypart/arm) && !istype(limb, /obj/item/bodypart/leg))
continue
- LAZYADD(affected_bodyparts, limb)
+ LAZYADD(affected_bodyparts, WEAKREF(limb))
limb.unarmed_attack_sound = pick(list('sound/items/weapons/cqchit2.ogg', 'sound/items/weapons/cqchit1.ogg')) // i know kung fu
else if (isbasicmob(owner))
var/mob/living/basic/basic_owner = owner
@@ -484,12 +488,17 @@
owner.st_remove_stat_mod(STAT_DEXTERITY, bonus, "vengeance_of_samiel")
owner.st_remove_stat_mod(STAT_MELEE, bonus, "vengeance_of_samiel")
owner.st_remove_stat_mod(STAT_BRAWL, bonus, "vengeance_of_samiel")
- if (iscarbon(owner))
- for (var/obj/item/bodypart/limb in affected_bodyparts)
- limb.unarmed_attack_sound = initial(limb.unarmed_attack_sound)
- else if (isbasicmob(owner))
+
+ for(var/datum/weakref/limb_weakref in affected_bodyparts)
+ var/obj/item/bodypart/limb = limb_weakref.resolve()
+ if(!limb)
+ continue
+ limb.unarmed_attack_sound = limb::unarmed_attack_sound
+
+ if (isbasicmob(owner))
var/mob/living/basic/basic_owner = owner
- basic_owner.attack_sound = initial(basic_owner.attack_sound)
+ basic_owner.attack_sound = basic_owner::attack_sound
+
LAZYCLEARLIST(affected_bodyparts)
UnregisterSignal(owner, COMSIG_MOB_ITEM_ATTACK)
qdel(tackler)
diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm
index b9f5bd09f683..1632ac7998b8 100644
--- a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm
+++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm
@@ -45,6 +45,7 @@
cooldown_length = 1 TURNS
vitae_cost = 1
toggled = FALSE
+ frenzy_usable = FALSE
/datum/discipline_power/vicissitude/malleable_visage/activate(atom/target)
. = ..()
@@ -64,6 +65,7 @@
range = 1
toggled = FALSE
cooldown_length = 1 TURNS
+ frenzy_usable = FALSE
/datum/discipline_power/vicissitude/fleshcrafting/activate(atom/movable/target)
. = ..()
diff --git a/modular_darkpack/modules/powers/code/discipline/visceratika.dm b/modular_darkpack/modules/powers/code/discipline/visceratika.dm
index 894eb7c6c1db..37649103cc6a 100644
--- a/modular_darkpack/modules/powers/code/discipline/visceratika.dm
+++ b/modular_darkpack/modules/powers/code/discipline/visceratika.dm
@@ -34,6 +34,7 @@
duration_length = 1 SCENES
cancelable = TRUE
vitae_cost = 1
+ frenzy_usable = FALSE
/datum/discipline_power/visceratika/skin_of_the_chameleon/activate()
. = ..()
@@ -66,11 +67,12 @@
toggled = TRUE
var/datum/storyteller_roll/scry_the_hearthstone/scry_roll
var/area/monitoring_area
+ frenzy_usable = FALSE
/datum/storyteller_roll/scry_the_hearthstone
bumper_text = "scry the hearthstone"
applicable_stats = list(STAT_PERCEPTION, STAT_AWARENESS)
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
/datum/discipline_power/visceratika/scry_the_hearthstone/New(datum/discipline/discipline)
. = ..()
@@ -185,6 +187,7 @@
cooldown_length = 10 SECONDS
var/datum/weakref/exit_turf
var/datum/weakref/stone_turf
+ frenzy_usable = FALSE
/datum/discipline_power/visceratika/bond_with_the_mountain/pre_activation_checks()
. = ..()
@@ -241,15 +244,15 @@
vitae_cost = 0
/datum/discipline_power/visceratika/armor_of_terra/post_gain()
- owner.physiology.brute_mod *= 0.8
- owner.physiology.heat_mod *= 0.5
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 0.8)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_HEAT, 0.5)
ADD_TRAIT(owner, TRAIT_NOSOFTCRIT, DISCIPLINE_TRAIT(type))
if (!owner.is_clan(/datum/subsplat/vampire_clan/gargoyle))
ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, DISCIPLINE_TRAIT(type))
/datum/discipline_power/visceratika/armor_of_terra/post_loss()
- owner.physiology.brute_mod *= 1.25
- owner.physiology.heat_mod *= 2
+ MODIFY_PHYSIOLOGY(owner, BRUTE, 1.25)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_HEAT, 2)
REMOVE_TRAIT(owner, TRAIT_NOSOFTCRIT, DISCIPLINE_TRAIT(type))
REMOVE_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, DISCIPLINE_TRAIT(type))
diff --git a/modular_darkpack/modules/powers/code/discipline_pref_middleware.dm b/modular_darkpack/modules/powers/code/discipline_pref_middleware.dm
index 0543968321ce..a373c07ff876 100644
--- a/modular_darkpack/modules/powers/code/discipline_pref_middleware.dm
+++ b/modular_darkpack/modules/powers/code/discipline_pref_middleware.dm
@@ -9,7 +9,7 @@ GLOBAL_LIST_INIT(rare_discipline_types, list(
/datum/discipline/necromancy,
/datum/discipline/valeren,
/datum/discipline/obeah,
- /datum/discipline/daimoinon,
+ /datum/discipline/daimonion,
/datum/discipline/melpominee,
))
@@ -21,11 +21,34 @@ GLOBAL_LIST_INIT(rare_discipline_types, list(
var/splat = client.prefs.read_preference(/datum/preference/choiced/splats)
if(!ispath(splat, /datum/splat/vampire))
return TRUE
+
+ // check for at least one discipline, store how many discipline points spent, count how many disciplines they have
+ var/discipline_count
+ var/discipline_points_spent
+ var/has_any_discipline = FALSE
for(var/disc in client.prefs.discipline_levels)
- if(client.prefs.discipline_levels[disc] > 0)
- return TRUE
- var/choice = tgui_alert(src, "You have not allocated any discipline dots! As a precaution, you will automatically be assigned 1 dot in each of your clan's common disciplines when you spawn.", "Disciplines Not Configured", list("I understand", "Go Back"))
- return choice == "I understand"
+ var/level = client.prefs.discipline_levels[disc]
+ discipline_points_spent += level
+ discipline_count++
+ if(level > 0 && !has_any_discipline)
+ has_any_discipline = TRUE
+
+ var/discipline_points_budget
+ if(ispath(splat, /datum/splat/vampire/kindred))
+ var/immortal_age = client.prefs.read_preference(/datum/preference/numeric/immortal_age)
+ discipline_points_budget = get_discipline_point_budget(immortal_age)["points"]
+ else if(ispath(splat, /datum/splat/vampire/ghoul))
+ discipline_points_budget = get_ghoul_discipline_budget(discipline_count)["points"]
+
+ // we are assuming that diablerists gain discipline points or disciplines.
+ if(discipline_points_spent > discipline_points_budget && !client.prefs.read_preference(/datum/preference/toggle/diablerist))
+ tgui_alert(src, "You have [discipline_points_spent] discipline points spent, but your character is only allowed [discipline_points_budget]! Please fix your character preferences before joining.", "Discipline Points Overspent", list("OK"))
+ return FALSE
+
+ if(!has_any_discipline)
+ var/choice = tgui_alert(src, "You have not allocated any discipline dots! As a precaution, you will automatically be assigned 1 dot in each of your clan's common disciplines when you spawn.", "Disciplines Not Configured", list("I understand", "Go Back"))
+ return choice == "I understand"
+ return TRUE
// discipline weights (trusted players arent affected by these)
// 5 possible total disciplines
@@ -147,27 +170,27 @@ GLOBAL_LIST_INIT(rare_discipline_types, list(
return data
-/datum/preference_middleware/disciplines/proc/get_discipline_point_budget(immortal_age)
+/proc/get_discipline_point_budget(immortal_age)
if(immortal_age <= 10)
return list(
- "points" = 5, //Should probably be 4 due to rounded square root of 10, but we do this to give some flexibility.
+ "points" = DISCIPLINE_BUDGET_FLEDGLING,
"tier" = "Fledgling",
"details" ="As a Fledgling, you are still learning how to control your new powers, and face your new problems. You are much the same person as you were prior to the embrace, for good or for bad. The phrase \"Life's sucks and then you die\" leaves out how much it sucks to be dead, but you're starting to learn that first-hand. You might be recently declared dead or reported missing, and are struggling to piece together a new unlife without the support network you had when you were alive. There are a lot of rules and customs you're unfamiliar with, and older kindred look down on you. You may be alone, hiding out after a string of murders post-embrace that put you on the radar of law enforcement and the Camarilla, or under the watchful eye of your Sire learning to control yourself under their wing. Either way, you're going to need help to navigate all of this.")
if(immortal_age <= 100)
return list(
- "points" = 10, //Max age of 100, square root it for points.
+ "points" = DISCIPLINE_BUDGET_NEONATE,
"tier" = "Neonate",
"details" = "As a Neonate, you're starting to get the hang of things with your unlife. You have learned to control your urges enough to be mostly left to your own devices, but older kindred can still smell your inexperience from a mile away. Friends and family you once knew are beginning to grow old and pass away due to natural causes, leaving you with the lasting emotional scars from their absence. Any who you remain in contact with but haven't told about your embrace are likely suspicious about your lack of aging and absence during the day. As a result, you've learned to remain mostly composed, and to keep things close to the vest, especially when it comes to interacting with Kine. With your Kine touchstones dwindling or gone, you'll begin to find solace in others... Or else your humanity might start to fade with them.")
if(immortal_age <= 200)
return list(
- "points" = 15, //Max age of 200, square root it (and round up) for points.
+ "points" = DISCIPLINE_BUDGET_ANCILLAE,
"tier" = "Ancilla",
"details" = "As an Ancilla, you are a dignified member of kindred society. Ancient by Anarch standards, middle-aged by Camarillan. The ties you once held to your originally life have faded with the deaths of your loved ones over a century prior. You have come to find a new family along the way; either by siring childer of your own or making and keeping friendships that have lasted you through the ages. You are a composed, mature vampire that others often turn to when decisions need additional input, or important things need doing.")
- return list("points" = 18, //No max age, should just get access to 6+ powers based on generation and age. Leave points the same for now.
+ return list("points" = DISCIPLINE_BUDGET_ELDER,
"tier" = "Elder",
"details" = "As an Elder of your clan, you are a walking history book. You have learned to keep quiet about your true age and origins, and have likely made a coterie of enemies, some alive some dead. Walking through time as the winding centipede, crawling into centuries unfamiliar as you learn and adapt to each new shifting culture. You may have emerged from torpor after a battle you may or may not remember years prior, thrust into a world you don't recognize. You likely possess a reputation for good or for bad, for something you may or may not have done hundreds of years ago. Some may take solace in your company as a familiar face, some may want to turn you to ash for a petty grievance from lifetimes prior. If your true age is discovered, the Camarilla will likely try to employ you as an enforcer due to your strength... or an aspiring lick might come along to diablerize you and take your power for themselves. To have survived this long, you're cautious, old, and cunning. Your routines are important, and you stay out of the petty squables of younger Kindred if you can help it.")
-/datum/preference_middleware/disciplines/proc/get_ghoul_discipline_budget(discipline_count = 0)
+/proc/get_ghoul_discipline_budget(discipline_count = 0)
return list(
"points" = max(3, discipline_count), // pool expands for each additional discipline they've been taught, but they can never assign more than 1 per
"tier" = "Ghoul",
@@ -309,7 +332,7 @@ GLOBAL_LIST_INIT(rare_discipline_types, list(
if(!result)
character.give_st_power(discipline, level) // load em up
- SSticker.OnRoundend(CALLBACK(src, PROC_REF(save_disciplines), character))
+ //SSticker.OnRoundend(CALLBACK(src, PROC_REF(save_disciplines), character))
/datum/preferences/proc/save_disciplines(mob/living/carbon/human/character)
if(QDELETED(character))
diff --git a/modular_darkpack/modules/retail/code/_retail.dm b/modular_darkpack/modules/retail/code/_retail.dm
index 3a22139e5d41..3a66128dde66 100644
--- a/modular_darkpack/modules/retail/code/_retail.dm
+++ b/modular_darkpack/modules/retail/code/_retail.dm
@@ -92,7 +92,6 @@
name = product.name,
price = product.price,
stock = product.amount,
- dimensions = product.icon_dimension,
ref = REF(product)
)
.["product_records"] += list(product_data)
diff --git a/modular_darkpack/modules/retail/code/stores/black_market.dm b/modular_darkpack/modules/retail/code/stores/black_market.dm
index 6847943ea649..1a8b26d6d8c4 100644
--- a/modular_darkpack/modules/retail/code/stores/black_market.dm
+++ b/modular_darkpack/modules/retail/code/stores/black_market.dm
@@ -18,6 +18,8 @@
new /datum/data/vending_product("Black bag", /obj/item/clothing/head/vampire/blackbag, 50),
new /datum/data/vending_product("snub-nose revolver", /obj/item/gun/ballistic/revolver/darkpack/snub, 100),
new /datum/data/vending_product("Braddock .45 submachine gun", /obj/item/gun/ballistic/automatic/darkpack/mac10, 1200),
+ new /datum/data/vending_product("sawn-off Remington 11-87 shotgun", /obj/item/gun/ballistic/shotgun/vamp_remington/sawnoff, 1600),
+ new /datum/data/vending_product("oil filter 11-87 suppressor", /obj/item/suppressor/darkpack_oil, 400),
new /datum/data/vending_product("cannabis package", /obj/item/food/grown/cannabis, 700),
new /datum/data/vending_product("morphine syringe", /obj/item/reagent_containers/syringe/contraband/morphine, 800),
new /datum/data/vending_product("meth package", /obj/item/reagent_containers/cup/glass/baggie/meth, 800),
diff --git a/modular_darkpack/modules/retail/code/stores/clothing_store.dm b/modular_darkpack/modules/retail/code/stores/clothing_store.dm
index ff8e60596731..1c72df057066 100644
--- a/modular_darkpack/modules/retail/code/stores/clothing_store.dm
+++ b/modular_darkpack/modules/retail/code/stores/clothing_store.dm
@@ -79,6 +79,9 @@
new /datum/data/vending_product("brown coat", /obj/item/clothing/suit/vampire/coat, 15),
new /datum/data/vending_product("green coat", /obj/item/clothing/suit/vampire/coat/alt, 15),
new /datum/data/vending_product("jacket", /obj/item/clothing/suit/vampire/jacket, 15),
+ new /datum/data/vending_product("red jacket", /obj/item/clothing/suit/vampire/jacket/red, 15),
+ new /datum/data/vending_product("cropped black jacket", /obj/item/clothing/suit/vampire/jacket/cropped, 15),
+ new /datum/data/vending_product("cropped red jacket", /obj/item/clothing/suit/vampire/jacket/cropped/red, 15),
new /datum/data/vending_product("black coat", /obj/item/clothing/suit/vampire/coat/winter, 15),
new /datum/data/vending_product("red coat", /obj/item/clothing/suit/vampire/coat/winter/alt, 15),
new /datum/data/vending_product("yellow aviators", /obj/item/clothing/glasses/vampire/yellow, 20),
diff --git a/modular_darkpack/modules/retail/code/stores/costume_store.dm b/modular_darkpack/modules/retail/code/stores/costume_store.dm
index 5b8238067708..f75edb57cb39 100644
--- a/modular_darkpack/modules/retail/code/stores/costume_store.dm
+++ b/modular_darkpack/modules/retail/code/stores/costume_store.dm
@@ -2,6 +2,10 @@
desc = "Purchase a mask for that ugly mug."
products_list = list(
new /datum/data/vending_product("balaclava", /obj/item/clothing/mask/vampire/balaclava, 10),
+ new /datum/data/vending_product("face scarf", /obj/item/clothing/mask/facescarf/vampire, 10),
+ new /datum/data/vending_product("bandana", /obj/item/clothing/mask/bandana/vampire, 10),
+ new /datum/data/vending_product("striped bandana", /obj/item/clothing/mask/bandana/striped/vampire, 10),
+ new /datum/data/vending_product("skull bandana", /obj/item/clothing/mask/bandana/skull/vampire, 10),
new /datum/data/vending_product("bear mask", /obj/item/clothing/mask/animal/small/bear, 13),
new /datum/data/vending_product("rat mask", /obj/item/clothing/mask/animal/small/rat, 10),
new /datum/data/vending_product("bee mask", /obj/item/clothing/mask/animal/small/bee, 12),
diff --git a/modular_darkpack/modules/retail/code/vending_product.dm b/modular_darkpack/modules/retail/code/vending_product.dm
index 70c0b55592f9..2836f017308d 100644
--- a/modular_darkpack/modules/retail/code/vending_product.dm
+++ b/modular_darkpack/modules/retail/code/vending_product.dm
@@ -1,6 +1,3 @@
-/datum/data/vending_product
- var/icon_dimension
-
/datum/data/vending_product/New(name, path, price, amount = -1)
src.name = name
src.product_path = path
@@ -16,9 +13,3 @@
if(!price)
src.price = item.custom_price || item.custom_premium_price
-
- var/icon_file = initial(item.icon)
- var/icon_state = initial(item.icon_state)
- var/icon/temp_icon = icon(icon_file, icon_state, SOUTH)
- icon_dimension = "[temp_icon.Width()]x[temp_icon.Height()]"
- qdel(temp_icon)
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/burning_blade.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/burning_blade.dm
index af10dc23f236..c099e8ca3f81 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/burning_blade.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/burning_blade.dm
@@ -1,33 +1,45 @@
/obj/ritual_rune/thaumaturgy/burning_blade
name = "burning blade"
- desc = "enchant a scythe to be consumed with flame and deal aggravated damage for a few swings."
+ desc = "enchant a scythe to be consumed with flame and deal aggravated damage for a few swings. Look closer to recall what you can enchant."
icon_state = "rune9"
word = "Blade of fire."
level = 2
cost = 3
-
-/obj/ritual_rune/thaumaturgy/burning_blade/complete()
- . = ..()
+ /// List of weapons that can be enchanted
var/static/list/valid_weapons = list(
/obj/item/scythe/vamp,
- /obj/item/katana/vamp
+ /obj/item/katana/vamp,
+ /obj/item/knife/vamp,
+ /obj/item/melee/sabre/rapier,
+ /obj/item/claymore/longsword,
+ /obj/item/melee/sabre/vamp
)
+/obj/ritual_rune/thaumaturgy/burning_blade/complete()
+ . = ..()
var/obj/item/weapon
for(var/obj/item/item in get_turf(src))
if(is_type_in_list(item, valid_weapons))
weapon = item
break
if(!weapon)
- to_chat(last_activator, span_warning("You need a scythe or katana to enchant!"))
+ to_chat(last_activator, span_warning("You need one of the compatible weapons to enchant!"))
return
if(!ritual_roll_datum)
return
- var/charges = ritual_roll_datum.last_sucess_amount
+ var/charges = last_sucess_amount
weapon.AddComponent(/datum/component/burning_blade, charges)
to_chat(last_activator, span_notice("[weapon] ignites with an unholy flame for [charges] swings!"))
qdel(src)
+/obj/ritual_rune/thaumaturgy/burning_blade/examine_more(mob/user)
+ . = ..()
+ . += span_cult("You recall some of the weapons that can be enchanted...")
+ var/list/desc = list()
+ for(var/obj/item/weapon as anything in valid_weapons)
+ desc += "\a [initial(weapon.name)]"
+ . += "\t[span_cult("[desc.Join("\n\t")]")]"
+
// Turns a scythe/katana into their "weapon_burning" icon state, allowing tremeres to deal aggravated damage for a few swings.
/datum/component/burning_blade
var/original_damtype
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/donning_the_mask_of_shadows.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/donning_the_mask_of_shadows.dm
index 24676af0275e..e528911bc5f2 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/donning_the_mask_of_shadows.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/donning_the_mask_of_shadows.dm
@@ -9,7 +9,7 @@
/obj/ritual_rune/thaumaturgy/donning_the_mask_of_shadows/complete()
. = ..()
- last_activator.apply_status_effect(/datum/status_effect/mask_of_shadows, ritual_roll_datum.last_sucess_amount MINUTES)
+ last_activator.apply_status_effect(/datum/status_effect/mask_of_shadows, last_sucess_amount MINUTES)
qdel(src)
/datum/status_effect/mask_of_shadows
@@ -28,7 +28,8 @@
owner.color = "#5f5f5f"
mask_action = new(owner)
mask_action.Grant(owner)
- ADD_TRAIT(owner, TRAIT_SILENT_FOOTSTEPS, MAGIC_TRAIT)
+ ADD_TRAIT(owner, TRAIT_SILENT_FOOTSTEPS, TRAIT_STATUS_EFFECT(id))
+ ADD_TRAIT(owner, TRAIT_UNKNOWN_APPEARANCE, TRAIT_STATUS_EFFECT(id))
/datum/status_effect/mask_of_shadows/on_remove()
owner.alpha = 255
@@ -36,7 +37,8 @@
if(mask_action)
mask_action.Remove(owner)
qdel(mask_action)
- REMOVE_TRAIT(owner, TRAIT_SILENT_FOOTSTEPS, MAGIC_TRAIT)
+ REMOVE_TRAIT(owner, TRAIT_SILENT_FOOTSTEPS, TRAIT_STATUS_EFFECT(id))
+ REMOVE_TRAIT(owner, TRAIT_UNKNOWN_APPEARANCE, TRAIT_STATUS_EFFECT(id))
return ..()
/datum/action/remove_mask_of_shadows_action
diff --git a/modular_darkpack/modules/round_status/code/pref_code.dm b/modular_darkpack/modules/round_status/code/pref_code.dm
index 4abe484e5e14..65513d2368db 100644
--- a/modular_darkpack/modules/round_status/code/pref_code.dm
+++ b/modular_darkpack/modules/round_status/code/pref_code.dm
@@ -2,30 +2,40 @@
/mob/living/carbon/human/proc/write_preference_midround(datum/preference/preference, preference_value)
if(!(client?.prefs))
return FALSE
- if(!(mind?.original_character_slot_index))
- return FALSE
-
- var/mob/living/carbon/human/original_human = mind.original_character.resolve()
-
- if(!original_human || (original_human != src))
- return FALSE
-
- return client.prefs.write_preference_midround(GLOB.preference_entries[preference], preference_value, src)
+ var/fail_to_save_reason = cant_save_midround_reason()
+ return client.prefs.write_preference_midround(GLOB.preference_entries[preference], preference_value, src, fail_to_save_reason)
/// Wrapper for write_preference to prevent writing for non-canon events like EORG
/// Returns TRUE for a successful preference application.
/// Returns FALSE if it is invalid or the round was not canon.
-/datum/preferences/proc/write_preference_midround(datum/preference/preference, preference_value, mob/user)
- var/reason
- if(!GLOB.canon_event)
- reason = "current round is not canon."
- else if(!("[default_slot]" in parent.persistent_client.joined_as_slots))
- reason = "selected character sheet not spawned in."
-
- if(reason)
- to_chat(parent, span_warning("Cannot save preference: [preference.savefile_key]; [reason]"))
- user.log_message("failed to write pref: [preference.savefile_key] due to; [reason]", LOG_STATS)
+/datum/preferences/proc/write_preference_midround(datum/preference/preference, preference_value, mob/user, fail_to_save_reason)
+ if(fail_to_save_reason)
+ to_chat(parent, span_warning("Cannot save preference: [preference.savefile_key]; [fail_to_save_reason]"))
+ user.log_message("failed to write pref: [preference.savefile_key] due to; [fail_to_save_reason]", LOG_STATS)
return FALSE
+ to_chat(parent, span_info("Saved preference: [preference.savefile_key] to \"[preference_value]\""))
user.log_message("wrote to pref '[preference.savefile_key]' midround. set to '[preference_value]'", LOG_STATS)
- return write_preference(preference, preference_value)
+ var/result = write_preference(preference, preference_value)
+ save_character()
+ return result
+
+/mob/living/carbon/human/proc/cant_save_midround_reason()
+ if(!GLOB.canon_event)
+ return "current round is not canon."
+ if(HAS_TRAIT(src, TRAIT_NO_CANON))
+ return "current character not canon"
+
+ if(!(client?.prefs))
+ return "no prefs"
+ if(!(mind?.original_character_slot_index))
+ return "mind lacking orginal slot index"
+
+ var/mob/living/carbon/human/original_human = mind.original_character.resolve()
+ if(!original_human || (original_human != src))
+ return "not original character"
+
+ else if(!("[client.prefs.default_slot]" in persistent_client.joined_as_slots))
+ return "selected character sheet not spawned in."
+
+ return FALSE
diff --git a/modular_darkpack/modules/splats/code/powers/_power.dm b/modular_darkpack/modules/splats/code/powers/_power.dm
index 139a64e70e24..d8d1c299aff3 100644
--- a/modular_darkpack/modules/splats/code/powers/_power.dm
+++ b/modular_darkpack/modules/splats/code/powers/_power.dm
@@ -16,6 +16,9 @@
/// How much temporary willpower is required to use this ability
var/willpower_cost = 0
+ var/magic_type
+ var/spawns_magic_effect = TRUE
+
/datum/action/cooldown/power/IsAvailable(feedback)
. = ..()
@@ -29,6 +32,11 @@
if(!handles_spend_resources)
spend_resources()
+ if(spawns_magic_effect && magic_type)
+ var/turf/used_turf = get_turf(owner)
+ if(used_turf)
+ spawn_magic_after_effect(used_turf, owner, rank, magic_type)
+
do_logging(target)
diff --git a/modular_darkpack/modules/splats/code/powers/magic.dm b/modular_darkpack/modules/splats/code/powers/magic.dm
new file mode 100644
index 000000000000..419eac72c566
--- /dev/null
+++ b/modular_darkpack/modules/splats/code/powers/magic.dm
@@ -0,0 +1,68 @@
+// General code for detecting magic. Either for active items/effects or after its been cast.
+
+// the "after effect" created after using most magic. To be detected by magic sensing abilties
+/obj/effect/abstract/magic_after_effect
+ name = "lingering magic"
+ icon_state = "purplesparkles"
+ anchored = TRUE
+ invisibility = INVISIBILITY_MAXIMUM
+
+ var/creation_time
+ /// IF this effect can be sourced from a mob, a weakref of them.
+ var/datum/weakref/creation_mob
+ var/datum/magic_information/magic_info
+
+/obj/effect/abstract/magic_after_effect/Initialize(mapload, creating_mob, magic_strength = 1, magic_type, magic_subtype)
+ . = ..()
+ creation_time = world.time
+ if(creating_mob)
+ creating_mob = WEAKREF(creating_mob)
+
+ magic_info = new()
+ magic_info.magic_strength = magic_strength
+ magic_info.magic_type = magic_type
+ magic_info.magic_subtype = magic_subtype
+
+/obj/effect/abstract/magic_after_effect/get_magic_sources()
+ . = ..()
+
+ if(magic_info)
+ . += magic_info
+
+/obj/effect/abstract/magic_after_effect/proc/get_time_alive()
+ return world.time - creation_time
+
+
+/proc/spawn_magic_after_effect(loc, creating_mob, magic_strength, magic_type, magic_subtype)
+ var/obj/effect/abstract/magic_after_effect/old_effect = locate() in loc
+ if(old_effect)
+ qdel(old_effect)
+ var/obj/effect/abstract/magic_after_effect/new_effect = new(loc, creating_mob, magic_strength, magic_type, magic_subtype)
+ return new_effect
+
+/datum/magic_information
+ /// Rough estimate of the power of the effect. Ballparked to powerscale to the rank of the gifts/discs/powers.
+ var/magic_strength = 1
+ var/magic_type
+ var/magic_subtype
+
+
+/// Returns lists of abstract information about "magic" affecting the atom (including the atom itself being said magic)
+/atom/proc/get_magic_sources()
+ SHOULD_CALL_PARENT(TRUE)
+ . = list()
+ SEND_SIGNAL(src, COMSIG_ATOM_GET_MAGIC_SOURCES, .)
+
+
+/obj/item/occult_artifact/get_magic_sources()
+ . = ..()
+ var/datum/magic_information/magic_info = new()
+ magic_info.magic_strength = rank
+ magic_info.magic_type = magic_type
+ . += magic_info
+
+/obj/item/ritual_tome/get_magic_sources()
+ . = ..()
+ var/datum/magic_information/magic_info = new()
+ magic_info.magic_type = MAGIC_TYPE_BLOOD
+ . += magic_info
diff --git a/modular_darkpack/modules/splats/code/prefrences/splat_middleware.dm b/modular_darkpack/modules/splats/code/prefrences/splat_middleware.dm
index 2427371f8061..80ebdb43bd0b 100644
--- a/modular_darkpack/modules/splats/code/prefrences/splat_middleware.dm
+++ b/modular_darkpack/modules/splats/code/prefrences/splat_middleware.dm
@@ -3,39 +3,39 @@
/datum/preference_middleware/splat/get_ui_assets()
return list(
- get_asset_datum(/datum/asset/spritesheet/splat),
+ get_asset_datum(/datum/asset/spritesheet_batched/splat),
)
-/datum/asset/spritesheet/splat
+/datum/asset/spritesheet_batched/splat
name = "splat"
- early = TRUE
-
-/datum/asset/spritesheet/splat/create_spritesheets()
+/datum/asset/spritesheet_batched/splat/create_spritesheets()
var/list/to_insert = list()
+ var/mob/living/carbon/human/dummy/consistent/dummy = new
for (var/splat_id in get_selectable_splats())
var/datum/splat/splat_type = GLOB.splat_list[splat_id]
- var/mob/living/carbon/human/dummy/consistent/dummy = new
var/datum/splat/my_splat = dummy.add_splat(splat_type)
dummy.equipOutfit(/datum/outfit, visuals_only = TRUE)
my_splat.prepare_human_for_preview(dummy)
- var/icon/dummy_icon = getFlatIcon(dummy)
- dummy_icon.Scale(64, 64)
- dummy_icon.Crop(15, 64 - 31, 15 + 31, 64)
- dummy_icon.Scale(64, 64)
+ var/datum/universal_icon/dummy_icon = get_flat_uni_icon(dummy)
+ dummy_icon.scale(64, 64)
+ dummy_icon.crop(15, 64 - 31, 15 + 31, 64)
+ dummy_icon.scale(64, 64)
to_insert[sanitize_css_class_name(initial(splat_type.name))] = dummy_icon
- SSatoms.prepare_deletion(dummy)
+ dummy.delete_equipment()
+
+ SSatoms.prepare_deletion(dummy)
- var/icon/dummy_icon = icon('icons/hud/radial.dmi', "radial_center")
- dummy_icon.Scale(64, 64)
+ var/datum/universal_icon/dummy_icon = uni_icon('icons/hud/radial.dmi', "radial_center")
+ dummy_icon.scale(64, 64)
to_insert[SPLAT_NONE] = dummy_icon
for (var/spritesheet_key in to_insert)
- Insert(spritesheet_key, to_insert[spritesheet_key])
+ insert_icon(spritesheet_key, to_insert[spritesheet_key])
/datum/preference_middleware/splat/get_ui_static_data(mob/user)
. = ..()
@@ -44,4 +44,3 @@
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/storyteller_dice/code/roll_datum.dm b/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm
index 6ef9ea2d7401..e8a3547d0d2a 100644
--- a/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm
+++ b/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm
@@ -1,7 +1,19 @@
/datum/storyteller_roll
var/bumper_text = "roll"
+ /**
+ * The difficulty of a roll.
+ * As a reference, three is trivial, six is standard, nine is extremely difficult.
+ */
var/difficulty = 6
+ var/bonus = 0
+
+ /**
+ * The amount of successes required to pass.
+ * As a reference,
+ * one is marginal, eg: keep a broken refrigerator running until the repairman arrives
+ * five is p h e n o m e n a l, eg: creating a masterwork
+ */
var/successes_needed = 1
// By default uses the highest attribute and ability // Not acctually true yet, it just used all of them. But it should be that.
@@ -9,7 +21,16 @@
var/numerical = FALSE
var/roll_output_type = ROLL_PUBLIC
- /// This is a roll that can proc multiple times in rapid sucession and thus has weaker or less notible outputs (forced runechat and quieter dice rolls)
+ /**
+ * For showing a diffrent result on a botch/fail. e.g
+ *
+ * /datum/storyteller_roll/investigation
+ * roll_output_type = ROLL_FLAG_ROLLER
+ * roll_output_type_on_fail = ROLL_FLAG_NEARBY
+ */
+ var/roll_output_type_on_fail
+ var/hide_result = FALSE
+ /// This is a roll that can proc multiple times in rapid succession and thus has weaker or less notible outputs (forced runechat and quieter dice rolls)
var/spammy_roll = FALSE
/// If set, a character or unicode appended to the front of balloon alerts to help convey what the roll is for.
var/alert_prefix
@@ -21,11 +42,6 @@
/// If the roll as a reroll_cooldown, return the mobs stored result if it has one.
var/roll_use_last_result = TRUE
- // Mutable vars to store the outputs of any given roll. Expect everything past here to be mutated between each roll.
- var/last_sucess_amount
- var/list/last_output_text = list()
-
-
/**
* Rolls a number of dice according to Storyteller system rules to find
* success or number of successes.
@@ -41,74 +57,117 @@
* * roller - the mob who is making the role and owns the dice
* * target - who this dice is being rolled against, can be the roller, determines if its considered "important" to the mob to display.
- * * dice - bonus dice that are added to the roll.
+ * * bonus_added - bonus dice that are added to the roll.
+ * * using_item - optional arg for an item employed for the roll.
*
- * Returns: The sucess of the roll, either a define or the raw amount of sucesses if `numerical = TRUE`
+ * Returns: The success of the roll, either a define or the raw amount of successes if `numerical = TRUE`
*/
-/datum/storyteller_roll/proc/st_roll(mob/living/roller, atom/target, bonus = 0)
+/datum/storyteller_roll/proc/st_roll(mob/living/roller, atom/target, bonus_added = 0, atom/using_item)
if(reroll_cooldown && roll_use_last_result)
var/list/old_roll = get_old_roll(roller)
if(old_roll)
return old_roll[OLD_ROLL_OUTPUT]
- last_sucess_amount = 0
- last_output_text = list()
-
if(!can_roll(roller))
return ROLL_COOLDOWN
- var/dice_amount = calculate_used_dice(roller, bonus)
- var/auto_success_amount = calculate_auto_successes(roller)
- var/used_difficulty = calculate_used_difficulty(roller)
+ var/bonus_amount = using_bonus(roller, target, bonus_added)
+ var/dice_amount = using_dice(roller, target)
+ var/auto_success_amount = using_auto_successes(roller)
+ var/difficulty_amount = using_difficulty(roller)
- bonus += SEND_SIGNAL(roller, COMSIG_LIVING_PRE_DICE_ROLLED, src, target)
+ SEND_SIGNAL(roller, COMSIG_LIVING_PRE_DICE_ROLLED, src, target, using_item, &bonus_amount, &difficulty_amount)
- var/list/rolled_dice = roll_dice(dice_amount, auto_success_amount)
+ dice_amount += bonus_amount
+ difficulty_amount = clamp(difficulty_amount, ROLL_DIFFICULTY_MIN, ROLL_DIFFICULTY_MAX) // WTA pg. 234
- var/dice_used_text = "[dice_amount] dice"
- if(auto_success_amount)
- dice_used_text += " + [auto_success_amount] auto successes"
- var/first_line = "[span_tooltip(show_rolling_with(roller, bonus), dice_used_text)] vs. difficulty [used_difficulty]."
- if(successes_needed > 1)
- first_line += " [successes_needed] successes needed."
- last_output_text += span_notice(first_line)
-
- last_sucess_amount = count_success(rolled_dice, used_difficulty, last_output_text)
- var/output = roll_result(last_sucess_amount)
+ var/list/rolled_dice = roll_dice(dice_amount, auto_success_amount)
- var/title
- if(roll_output_type in list(ROLL_PRIVATE_ADMIN, ROLL_ADMIN))
- title = "[ADMIN_LOOKUPFLW(roller)]"
- else
- title = "[roller]"
- title += " - [bumper_text] [span_tinynoticeital(roll_output_type)]"
+ var/success_amount = count_success(rolled_dice, difficulty_amount)
+ var/output = roll_result(success_amount)
+ var/using_output_type = roll_output_type
+ if(!isnull(roll_output_type_on_fail))
+ if(numerical)
+ if(output < 1)
+ using_output_type = roll_output_type_on_fail
+ else
+ if(output < ROLL_SUCCESS)
+ using_output_type = roll_output_type_on_fail
- var/output_combined = fieldset_block(title, jointext(last_output_text, "
"), "boxed_message")
- for(var/mob/player_mob in get_mobs_to_show(roller, target))
+ for(var/mob/player_mob in get_mobs_to_show(roller, target, using_output_type))
var/roll_important_to_me = FALSE
if(!spammy_roll && (player_mob == roller || target))
roll_important_to_me = TRUE
if(!spammy_roll)
- to_chat(player_mob, output_combined, MESSAGE_TYPE_INFO, trailing_newline = FALSE)
+ var/message = build_output_message(
+ roller,
+ player_mob,
+ dice_amount,
+ bonus_amount,
+ auto_success_amount,
+ difficulty_amount,
+ success_amount,
+ rolled_dice,
+ hide_result,
+ using_output_type
+ )
+ to_chat(player_mob, message, MESSAGE_TYPE_INFO, trailing_newline = FALSE)
var/roll_sound = 'sound/items/dice_roll.ogg'
if(dice_amount + rand(-1, 1) > 3) // Create some nice variation.
roll_sound = 'modular_darkpack/modules/storyteller_dice/sounds/lots_of_dice.ogg'
SEND_SOUND(player_mob, sound(roll_sound, volume = roll_important_to_me ? 5 : 20))
else
if(alert_delay)
- var/using_number = last_sucess_amount
+ var/using_number = success_amount
spawn(alert_delay)
create_balloon_alert(roller, player_mob, using_number)
else
- create_balloon_alert(roller, player_mob, last_sucess_amount)
-
+ create_balloon_alert(roller, player_mob, success_amount)
LAZYADDASSOC(mobs_last_rolled, WEAKREF(roller), list(world.time, output))
- SEND_SIGNAL(roller, COMSIG_LIVING_DICE_ROLLED, src, target, output)
+ SEND_SIGNAL(roller, COMSIG_LIVING_DICE_ROLLED, src, target, using_item, output)
return output
+/datum/storyteller_roll/proc/build_output_message(
+ mob/living/roller,
+ mob/displayed_to,
+ dice_amount,
+ bonus_amount,
+ auto_success_amount,
+ difficulty_amount,
+ success_amount,
+ list/rolled_dice,
+ hide_result,
+ using_output_type
+)
+ var/output_text = list()
+ var/dice_used_text = "[dice_amount] dice"
+ if(auto_success_amount)
+ dice_used_text += " + [auto_success_amount] auto successes"
+ var/first_line = "[span_tooltip(show_rolling_with(roller, bonus_amount), dice_used_text)][hide_result ? "" : " vs. difficulty [difficulty_amount]"]."
+ output_text += span_notice(first_line)
+
+ output_text += get_dice_display(rolled_dice, difficulty_amount, success_amount, hide_result)
+
+ var/roll_output_string
+ if(using_output_type == ROLL_PUBLIC) // A common combination of the bitfields, give it its own display.
+ roll_output_string = "public"
+ else
+ roll_output_string = jointext(bitfield_to_list(using_output_type, ROLL_OUTPUT_IC), "+")
+
+ var/title
+ if(using_output_type & ROLL_FLAG_ADMIN && (displayed_to.client in GLOB.admins))
+ title = "[ADMIN_LOOKUPFLW(roller)]"
+ else
+ title = GET_GUESTBOOK_NAME_TRUE(displayed_to, roller)
+ title += " - [bumper_text] [span_tinynoticeital(roll_output_string)]"
+
+ var/output_combined = fieldset_block(title, jointext(output_text, "
"), "boxed_message")
+
+ return output_combined
+
/datum/storyteller_roll/proc/create_balloon_alert(mob/living/roller, mob/player_mob, number)
if(QDELETED(roller) || QDELETED(player_mob))
return
@@ -118,23 +177,19 @@
else
roller.balloon_alert(player_mob, "[alert_prefix][number]", TRUE)
-/datum/storyteller_roll/proc/get_mobs_to_show(mob/living/roller, atom/target)
- switch(roll_output_type)
- if(ROLL_PUBLIC)
- return viewers(DEFAULT_SIGHT_DISTANCE, roller)
- if(ROLL_PRIVATE)
- return list(roller)
- if(ROLL_PRIVATE_AND_TARGET)
- if(roller == target || !isliving(target))
- return list(roller)
- else
- return list(roller, target)
- if(ROLL_PRIVATE_ADMIN)
- return admin_mobs() + roller
- if(ROLL_ADMIN)
- return admin_mobs()
- if(ROLL_NONE)
- return // Not even important enough to be admin visible.
+/datum/storyteller_roll/proc/get_mobs_to_show(mob/living/roller, atom/target, using_output_type)
+ var/list/shown_targets = list()
+ if(using_output_type & ROLL_FLAG_NEARBY)
+ shown_targets |= viewers(DEFAULT_SIGHT_DISTANCE, roller)
+ if(using_output_type & ROLL_FLAG_ROLLER)
+ shown_targets |= roller
+ if(using_output_type & ROLL_FLAG_TARGET)
+ if(isliving(target))
+ shown_targets |= target
+ if(using_output_type & ROLL_FLAG_ADMIN)
+ shown_targets |= admin_mobs()
+
+ return shown_targets
/datum/storyteller_roll/proc/admin_mobs()
var/list/admin_mobs = list()
@@ -143,13 +198,13 @@
admin_mobs += staff.mob
return admin_mobs
-/datum/storyteller_roll/proc/calculate_used_dice(mob/living/roller, bonus = 0)
+/datum/storyteller_roll/proc/using_dice(mob/living/roller, atom/target)
var/dice_amount = 0
for(var/stat_type in using_stats(roller))
dice_amount += roller.st_get_stat(stat_type, include_auto_successes = FALSE)
- return dice_amount + bonus
+ return dice_amount
-/datum/storyteller_roll/proc/calculate_auto_successes(mob/living/roller)
+/datum/storyteller_roll/proc/using_auto_successes(mob/living/roller)
var/dice_amount = 0
for(var/stat_type in using_stats(roller))
var/datum/st_stat/given_stat = roller?.storyteller_stats[stat_type]
@@ -167,20 +222,23 @@
highest_stat = stat_dots
return stat_to_use
+/datum/storyteller_roll/proc/using_bonus(mob/living/roller, atom/target, bonus_added)
+ return bonus + bonus_added
+
/datum/storyteller_roll/proc/using_stats(mob/living/roller)
return applicable_stats
-/datum/storyteller_roll/proc/calculate_used_difficulty(mob/living/roller)
+/datum/storyteller_roll/proc/using_difficulty(mob/living/roller, atom/target)
return difficulty
-/datum/storyteller_roll/proc/show_rolling_with(mob/living/roller, bonus = 0)
+/datum/storyteller_roll/proc/show_rolling_with(mob/living/roller, bonus_amount = 0)
var/output = ""
var/stuff = list()
for(var/datum/st_stat/stat_type as anything in using_stats(roller))
stuff += "[LOWER_TEXT(stat_type::name)]:[roller.st_get_stat(stat_type)]"
output += jointext(stuff, "+")
- if(bonus)
- output += "+[bonus]"
+ if(bonus_amount)
+ output += "+[bonus_amount]"
return "Rolling [output]"
/datum/storyteller_roll/proc/roll_dice(dice, auto_successes, sides = 10)
@@ -200,30 +258,59 @@
return rolled_dice
//Count the number of successes.
-/datum/storyteller_roll/proc/count_success(list/rolled_dice, difficulty = 6, last_output_text)
- var/sucess_amount = 0
+/datum/storyteller_roll/proc/count_success(list/rolled_dice, difficulty)
+ var/success_amount = 0
+ for(var/roll in rolled_dice)
+ switch(dice_face_success_type(roll, difficulty))
+ if(2)
+ success_amount += 2
+ if(1)
+ success_amount++
+ if(-1)
+ success_amount--
+ return success_amount
+
+//Count the number of successes.
+/datum/storyteller_roll/proc/get_dice_display(list/rolled_dice, difficulty, success_amount, hide_result)
var/dice_text = ""
for(var/roll in rolled_dice)
- if(roll >= difficulty)
- dice_text += span_nicegreen("[get_dice_char(roll)]")
- sucess_amount++
- if(SSroll.on_crit_extra_success_enabled && roll == 10)
- sucess_amount++
- else if(roll == 1)
- dice_text += span_bold(span_danger("[get_dice_char(roll)]"))
- sucess_amount--
- else
- dice_text += span_danger("[get_dice_char(roll)]")
- last_output_text += "[roll_result_text(roll_result(sucess_amount))] [span_slightly_larger(dice_text)]"
- return sucess_amount
+ if(hide_result)
+ dice_text += span_notice("[get_dice_char(roll)]")
+ continue
+
+ switch(dice_face_success_type(roll, difficulty))
+ if(2)
+ dice_text += span_green("[get_dice_char(roll)]")
+ if(1)
+ dice_text += span_nicegreen("[get_dice_char(roll)]")
+ if(-1)
+ dice_text += span_bold(span_danger("[get_dice_char(roll)]"))
+ else
+ dice_text += span_danger("[get_dice_char(roll)]")
+
+ if(hide_result)
+ return "[span_slightly_larger(dice_text)]"
+
+ return "[roll_result_text(roll_result(success_amount))] [span_slightly_larger(dice_text)]"
+
+/datum/storyteller_roll/proc/dice_face_success_type(dice_face, difficulty)
+ if(dice_face >= difficulty)
+ if(SSroll.on_crit_extra_success_enabled && dice_face == 10)
+ return 2
+ return 1
+ else if(dice_face == 1)
+ return -1
+ else
+ return 0
+
-/datum/storyteller_roll/proc/roll_result(sucess_amount)
+/datum/storyteller_roll/proc/roll_result(success_amount)
if(numerical)
- return sucess_amount
+ return success_amount
else
- if(sucess_amount < 0)
+ if(success_amount < 0)
return ROLL_BOTCH
- else if(sucess_amount < successes_needed)
+ else if(success_amount < successes_needed)
return ROLL_FAILURE
else
return ROLL_SUCCESS
diff --git a/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm b/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm
index 2ddd408d6e78..712e817cae61 100644
--- a/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm
+++ b/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm
@@ -31,6 +31,12 @@
/datum/storyteller_roll/attack/claw
bumper_text = "attack (claw)"
+// Cant tell wether this is meant to be to land or for damage dice.
+/datum/storyteller_roll/attack/claw/using_difficulty(mob/living/roller, atom/target)
+ . = ..()
+ if(HAS_TRAIT(roller, TRAIT_RAZOR_CLAWS))
+ . -= 1
+
/datum/storyteller_roll/attack/sweep
bumper_text = "attack (sweep)"
difficulty = 8
@@ -48,7 +54,7 @@
/datum/storyteller_roll/damage/punch
bumper_text = "damage (punch)"
-/datum/storyteller_roll/damage/punch/calculate_used_dice(mob/living/roller, bonus)
+/datum/storyteller_roll/damage/punch/using_bonus(mob/living/roller, atom/target, bonus_added)
. = ..()
if(HAS_TRAIT(roller, TRAIT_RAZOR_CLAWS)) // Your still using claws. A bit homebrew tho.
. += 1
@@ -57,27 +63,26 @@
/datum/storyteller_roll/damage/bite
bumper_text = "damage (bite)"
- // + 1
+ bonus = 1
/datum/storyteller_roll/damage/kick
bumper_text = "damage (kick)"
- // + 1
+ bonus = 1
/datum/storyteller_roll/damage/claw
bumper_text = "damage (claw)"
- // + 2
+ bonus = 2
-/datum/storyteller_roll/damage/claw/calculate_used_dice(mob/living/roller, bonus)
+/datum/storyteller_roll/damage/claw/using_bonus(mob/living/roller, atom/target, bonus_added)
. = ..()
if(HAS_TRAIT(roller, TRAIT_RAZOR_CLAWS))
. += 2
-/* DARKPACK TODO - (Requires https://github.com/DarkPack13/SecondCity/pull/683)
-/datum/storyteller_roll/damage/claw/calculate_used_difficulty(mob/living/roller)
+/datum/storyteller_roll/damage/claw/using_difficulty(mob/living/roller, atom/target)
. = ..()
if(HAS_TRAIT(roller, TRAIT_RAZOR_CLAWS))
. -= 1
-*/
+
/datum/storyteller_roll/damage/attacker_disarm
numerical = TRUE
@@ -120,7 +125,7 @@
reroll_cooldown = 1 SCENES
applicable_stats = list(STAT_STRENGTH)
-/datum/storyteller_roll/bash_door/calculate_used_dice(mob/living/roller, bonus)
+/datum/storyteller_roll/bash_door/using_dice(mob/living/roller, bonus)
. = ..()
if(HAS_TRAIT(roller, TRAIT_HUGE_SIZE))
. += 2
@@ -141,11 +146,16 @@
bumper_text = "climbing"
applicable_stats = list(STAT_DEXTERITY, STAT_ATHLETICS)
+/datum/storyteller_roll/climbing/using_difficulty(mob/living/roller, atom/target)
+ . = ..()
+ if(roller.has_status_effect(/datum/status_effect/city_running)) // In theory could check for if its the city...
+ . -= 2
+
// Mental Feats
/datum/storyteller_roll/investigation
bumper_text = "investigation"
applicable_stats = list(STAT_PERCEPTION, STAT_INVESTIGATION)
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
// Made up shittttt
@@ -155,8 +165,21 @@
reroll_cooldown = 1 SCENES
difficulty = 8
+
+/datum/storyteller_roll/slip_restraints
+ bumper_text = "slip restraints"
+ applicable_stats = list(STAT_DEXTERITY, STAT_STEALTH)
+ // reroll_cooldown = 1 TURNS
+ difficulty = 8
+
+/datum/storyteller_roll/slip_restraints/using_difficulty(mob/living/roller, atom/target)
+ . = ..()
+ if(roller.has_status_effect(/datum/status_effect/shed))
+ . -= 2
+
+// Based on `Feats of Strength` WTA pg. 270
/datum/storyteller_roll/restraint_break
bumper_text = "breaking restraints"
applicable_stats = list(STAT_PERMANENT_WILLPOWER)
- reroll_cooldown = 1 TURNS
+ // reroll_cooldown = 1 TURNS
difficulty = 9
diff --git a/modular_darkpack/modules/storyteller_dice/code/verbs.dm b/modular_darkpack/modules/storyteller_dice/code/verbs.dm
index e68c07d79e37..d5a95561fa32 100644
--- a/modular_darkpack/modules/storyteller_dice/code/verbs.dm
+++ b/modular_darkpack/modules/storyteller_dice/code/verbs.dm
@@ -28,17 +28,22 @@ GAME_VERB(/mob/living, do_roll_dice_custom, "Roll custom dice", null)
if(isnull(bonus_dice))
return
- var/difficulty = tgui_input_number(usr, "Input roll difficulty.", "Difficulty", 6, 10, 1)
+ var/difficulty = tgui_input_number(usr, "Input roll difficulty.", "Difficulty", 6, ROLL_DIFFICULTY_MAX, ROLL_DIFFICULTY_MIN)
if(isnull(difficulty))
return
- var/successes_needed = tgui_input_number(usr, "Input successes required to pass.", "Successes Needed", 1, 20, 1)
+ var/successes_needed = tgui_input_number(usr, "Input successes required to pass.", "Successes Needed", 1, 5, 1)
if(isnull(successes_needed))
return
- var/roll_type = tgui_input_list(usr, "Who do you want to roll to.", "Roll Type", list(ROLL_PUBLIC, ROLL_PRIVATE, ROLL_PRIVATE_ADMIN, ROLL_ADMIN), ROLL_PUBLIC)
- if(isnull(roll_type))
+ var/static/list/roll_choices = ROLL_OUTPUT_IC
+ var/list/roll_type_choice = tgui_input_checkboxes(usr, "Who do you want to roll to.", "Roll Type", roll_choices)
+ if(!roll_type_choice)
return
+ var/roll_type = NONE
+ for(var/list/entry in roll_type_choice)
+ roll_type |= roll_choices.Find(entry[1]) + 1
+
var/datum/storyteller_roll/custom_roll/custom_roll = new()
custom_roll.applicable_stats = output_stats
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 333aca3a40ab..8c2f03c1e8e3 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
@@ -15,7 +15,7 @@
/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)
- given_stat.update_mob(src)
+ given_stat?.update_mob(src)
return score
/// Changes a specific mob's stat from its stats list by the given amount.
@@ -26,45 +26,45 @@
score = given_stat?.increase_score(amount)
else
score = given_stat?.decrease_score(amount)
- given_stat.update_mob(src)
+ 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)
- given_stat.update_mob(src)
+ 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)
- given_stat.update_mob(src)
+ 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)
- given_stat.update_mob(src)
+ 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)
- given_stat.update_mob(src)
+ 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)
+ 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)
+ given_stat?.update_mob(src)
return score
/mob/living/proc/replace_storyteller_stats(list/new_stat_list, initial = FALSE)
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 1a5913e8fa19..21d1fde63de0 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
@@ -106,6 +106,65 @@
name = "Academics"
description = "Affects your character's familiarity with academics and literature. Affects how many languages your character knows. At 0 points, your character will only know one language."
+/datum/st_stat/ability/academics/update_mob(mob/living/our_mob, initial)
+ our_mob.remove_all_partial_languages(LANGUAGE_ACADEMICS)
+
+ var/current_score = get_score()
+ // level 1 - english, spanish, french, german
+ if(current_score >= 1)
+ our_mob.grant_partial_language(/datum/language/common, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/spanish, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/french, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/german, 25, LANGUAGE_ACADEMICS)
+
+ // level 2 - italian, polish, adds addtl 25 to common spanish french german (-> 50)
+ if(current_score >= 2)
+ our_mob.grant_partial_language(/datum/language/italian, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/polish, 25, LANGUAGE_ACADEMICS)
+
+ our_mob.grant_partial_language(/datum/language/common, 50, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/spanish, 50, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/french, 50, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/german, 50, LANGUAGE_ACADEMICS)
+
+ // level 3 - czech, tagalog, ukrainian, welsh, armenian, adds addtl 10 to common spanish french german (-> 60)
+ if(current_score >= 3)
+ our_mob.grant_partial_language(/datum/language/czech, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/tagalog, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/ukrainian, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/welsh, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/armenian, 25, LANGUAGE_ACADEMICS)
+
+ our_mob.grant_partial_language(/datum/language/common, 60, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/spanish, 60, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/french, 60, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/german, 60, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/italian, 40, LANGUAGE_ACADEMICS)
+
+ // level 4 - hebrew, russian, greek
+ if(current_score >= 4)
+ our_mob.grant_partial_language(/datum/language/hebrew, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/russian, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/greek, 25, LANGUAGE_ACADEMICS)
+
+ // level 5 - japanese, mandarin, latin, farsi, arabic, cantonese, scottish, irish, korean
+ if(current_score >= 5)
+ our_mob.grant_partial_language(/datum/language/japanese, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/mandarin, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/latin, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/farsi, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/arabic, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/cantonese, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/scottish, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/irish, 25, LANGUAGE_ACADEMICS)
+ our_mob.grant_partial_language(/datum/language/korean, 25, LANGUAGE_ACADEMICS)
+
+/datum/st_stat/ability/academics/unlink_mob(mob/living/our_mob)
+ if(QDELING(our_mob))
+ return
+ our_mob.remove_all_partial_languages(LANGUAGE_ACADEMICS)
+
+
/datum/st_stat/ability/computer
subcategory = "Knowledges"
name = "Computer"
diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/default_pooled_stats.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/default_pooled_stats.dm
index 3ce5f2295cfe..3d0cca4196da 100644
--- a/modular_darkpack/modules/storyteller_stats/code/st_stats/default_pooled_stats.dm
+++ b/modular_darkpack/modules/storyteller_stats/code/st_stats/default_pooled_stats.dm
@@ -8,3 +8,21 @@
name = "Temporary Willpower"
description = "A character's inner drive and competence at overcoming unfavorable odds. Used for spendature."
editable = FALSE
+
+
+/// Prompts the user to burn an amount of willpower then returns the amount spent.
+/mob/living/proc/prompt_burn_willpower(amount = 1)
+ if(st_get_stat(STAT_TEMPORARY_WILLPOWER) < amount)
+ return 0
+ var/choices = list(
+ "Burn Willpower" = image(icon = 'modular_darkpack/modules/storyteller_stats/icons/assets.dmi', icon_state = "willpower"),
+ "No" = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_no"),
+ )
+
+ var/chosen_option = show_radial_menu(src, src, choices, radius = 36, tooltips = TRUE)
+ if(chosen_option == "Burn Willpower")
+ st_change_stat(STAT_TEMPORARY_WILLPOWER, -amount)
+ to_chat(src, span_warning("You burn [amount] willpower."))
+ return amount
+
+ return 0
diff --git a/modular_darkpack/modules/storyteller_stats/icons/assets.dmi b/modular_darkpack/modules/storyteller_stats/icons/assets.dmi
new file mode 100644
index 000000000000..036a2adc9f05
Binary files /dev/null and b/modular_darkpack/modules/storyteller_stats/icons/assets.dmi differ
diff --git a/modular_darkpack/modules/umbra/code/parallax.dm b/modular_darkpack/modules/umbra/code/parallax.dm
index 2ab6dd579ffa..9923512beae2 100644
--- a/modular_darkpack/modules/umbra/code/parallax.dm
+++ b/modular_darkpack/modules/umbra/code/parallax.dm
@@ -5,8 +5,9 @@
speed = 0.6
layer = 3
-/atom/movable/screen/parallax_layer/umbra/Initialize(mapload, datum/hud/hud_owner, client/owner)
+/atom/movable/screen/parallax_layer/umbra/Initialize(mapload, datum/hud/hud_owner, atom/movable/screen/parallax_home/home, template = FALSE)
. = ..()
+ var/client/owner = home.owner
if(!owner)
return
var/static/list/connections = list(
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/blood_power.dm b/modular_darkpack/modules/vampire_the_masquerade/code/blood_power.dm
index 84f698d835f8..9b8d99aa5f13 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/blood_power.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/blood_power.dm
@@ -1,3 +1,7 @@
+/datum/armor/blood_power
+ melee = 15
+ bullet = 15
+
/datum/action/cooldown/blood_power
name = "Blood Power"
desc = "Use vitae to gain supernatural abilities."
@@ -15,7 +19,6 @@
// Activated for two "turns" as 5 seconds is acctually pretty short. Opens to door to let players set how long they are declaring it active for.
/// How many "turns" its activated for. Multiplies the blood cost.
var/turns_activated = 2
- var/datum/armor/old_armor
var/list/obj/item/bodypart/strengthened_limbs
/datum/action/cooldown/blood_power/IsAvailable(feedback)
@@ -51,8 +54,7 @@
to_chat(human_owner, span_notice("You use blood to become more powerful."))
// DARKPACK TODO - This can be represented by having stam do anything
- old_armor = human_owner.physiology.armor
- human_owner.physiology.armor = old_armor.generate_new_with_modifiers(list(MELEE = 15, BULLET = 15))
+ human_owner.add_inner_armor(/datum/armor/blood_power)
human_owner.st_add_stat_mod(STAT_STRENGTH, stat_buff_amount, "blood_power")
human_owner.st_add_stat_mod(STAT_DEXTERITY, stat_buff_amount, "blood_power")
@@ -60,7 +62,7 @@
human_owner.adjust_blood_pool(-current_bp_cost(human_owner))
- ADD_TRAIT(human_owner, TRAIT_IGNORESLOWDOWN, MAGIC_TRAIT)
+ human_owner.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
addtimer(CALLBACK(src, PROC_REF(end_bloodpower)), cooldown_time)
@@ -78,13 +80,13 @@
var/mob/living/carbon/human/human_owner = owner
to_chat(human_owner, span_warning("You feel like your BLOOD power slowly decreases."))
- human_owner.physiology.armor = old_armor
+ human_owner.remove_inner_armor(/datum/armor/blood_power)
human_owner.st_remove_stat_mod(STAT_STRENGTH, "blood_power")
human_owner.st_remove_stat_mod(STAT_DEXTERITY, "blood_power")
human_owner.st_remove_stat_mod(STAT_STAMINA, "blood_power")
- REMOVE_TRAIT(human_owner, TRAIT_IGNORESLOWDOWN, MAGIC_TRAIT)
+ human_owner.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
/datum/action/cooldown/blood_power/proc/set_usage()
var/turns = tgui_input_number(owner, "Set turns ([1 TURNS / 10] seconds per turn) to use blood for.", "Set Bloodpower Turns", turns_activated, TURNS_PER_SCENE, 1)
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/kindred/give_vitae.dm b/modular_darkpack/modules/vampire_the_masquerade/code/kindred/give_vitae.dm
index 99ac636da7b7..58e7699aaacb 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/kindred/give_vitae.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/kindred/give_vitae.dm
@@ -23,7 +23,12 @@
if(target == owner)
return FALSE
- var/choice = tgui_alert(owner, "", "Give Vitae", list("Feed Blood", "Teach Discipline", "Cancel"))
+ var/list/options = list("Feed Blood")
+ if(CONFIG_GET(number/discipline_teaching) != DISCIPLINE_TEACHING_DISABLED)
+ options += "Teach Discipline"
+ options += "Cancel"
+
+ var/choice = tgui_alert(owner, "", "Give Vitae", options)
if(QDELETED(owner) || QDELETED(target))
return FALSE
if(!choice || choice == "Cancel")
@@ -63,6 +68,10 @@
if(!sire)
return FALSE
+ if(CONFIG_GET(number/discipline_teaching) == DISCIPLINE_TEACHING_DISABLED)
+ owner.balloon_alert(owner, "discipline teaching is disabled!")
+ return FALSE
+
var/list/discipline_entries = list()
var/list/disc_type = list()
var/list/seen_types = list()
@@ -74,6 +83,8 @@
continue
if(disc.type in seen_types)
continue
+ if(!can_teach_discipline(owner, disc.type))
+ continue
seen_types += disc.type // prevent duplicates
discipline_entries += "[disc.name]"
disc_type["[disc.name]"] = disc.type
@@ -114,6 +125,7 @@
student.reagents.expose(student, INGEST, 1, FALSE)
var/discipline_type = disc_type[chosen]
+ var/fail_to_save_reason = student.cant_save_midround_reason()
if(discipline_type)
var/datum/splat/vampire/student_splat = student ? get_splat_with_discipline(student) : null
if(student_splat && !student_splat.get_power(discipline_type))
@@ -126,11 +138,24 @@
to_chat(owner, span_warning("[student] is unable to learn [chosen]."))
message_admins("[ADMIN_LOOKUPFLW(owner)] tried to teach [chosen] to [ADMIN_LOOKUPFLW(student)], but doing so would've made [key_name(student)]'s sheet invalid due to the following: [violations]")
return FALSE
- student.give_st_power(discipline_type, 1)
- if(student.client?.prefs)
- student.client.prefs.discipline_levels["[discipline_type]"] = 1
+ if(student.client?.prefs && !fail_to_save_reason)
+ student.client.prefs.discipline_levels["[discipline_type]"] = 0
student.client.prefs.save_character()
- owner.log_message("taught [chosen] to [key_name(student)].", LOG_STATS)
- message_admins("[ADMIN_LOOKUPFLW(owner)] taught [chosen] to [ADMIN_LOOKUPFLW(student)].")
+ owner.log_message("taught [chosen] to [key_name(student)]. Pref save info: [fail_to_save_reason || "can save"]", LOG_STATS)
+ message_admins("[ADMIN_LOOKUPFLW(owner)] taught [chosen] to [ADMIN_LOOKUPFLW(student)]. Pref save info: [fail_to_save_reason || "can save"]")
return TRUE
+
+// darkpack_config_entries.dm & darkpack_config.txt for server settings regarding discipline teaching permissions
+/proc/can_teach_discipline(mob/living/teacher, discipline_type)
+ switch(CONFIG_GET(number/discipline_teaching))
+ if(DISCIPLINE_TEACHING_FULL)
+ return TRUE
+ if(DISCIPLINE_TEACHING_RARES_DISABLED)
+ return !(discipline_type in GLOB.rare_discipline_types)
+ if(DISCIPLINE_TEACHING_IN_CLANS_ONLY)
+ var/datum/subsplat/vampire_clan/clan = teacher.get_clan()
+ return clan && (discipline_type in clan.clan_disciplines)
+ if(DISCIPLINE_TEACHING_DISABLED)
+ return FALSE
+ return FALSE
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/kindred/humanity.dm b/modular_darkpack/modules/vampire_the_masquerade/code/kindred/humanity.dm
index 36c43e0e1bdc..552433300c92 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/kindred/humanity.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/kindred/humanity.dm
@@ -37,7 +37,7 @@
var/datum/storyteller_roll/degeneration_roll = new()
degeneration_roll.applicable_stats = list(stat_to_roll)
degeneration_roll.difficulty = difficulty
- degeneration_roll.roll_output_type = ROLL_PRIVATE_ADMIN
+ degeneration_roll.roll_output_type = ROLL_FLAG_ROLLER|ROLL_FLAG_ADMIN
var/roll_result = degeneration_roll.st_roll(owner)
if(roll_result == ROLL_SUCCESS)
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/preferences/morality/morality_paths.dm b/modular_darkpack/modules/vampire_the_masquerade/code/preferences/morality/morality_paths.dm
index 36104911b21d..7c87d1f4f1dc 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/preferences/morality/morality_paths.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/preferences/morality/morality_paths.dm
@@ -180,7 +180,7 @@ GLOBAL_LIST_INIT(morality_paths, init_morality_paths())
/datum/morality/ashirra
name = "Sharia El-Sama"
- desc = "In 623 AD, a Cainite named Suleiman ibn Abdullah visited the city of Medina, seeking to make a hunt of sorts, and feed, on the Prophet Muhammad. Suleiman asked for an audience with the Prophet, and, when granted one, was absolutely stunned by the man's divinity, and bowed before him, overhwlemed by the man's divinity as God's messenger. Suleiman Ibn Abdullah became the first of the Ahirra, the Brotherhood, Vampires who swore to uphold God's holy law as set forth by His Final and Greatest Prophet. In this way, the demon within, the Beast, may be silenced, and a vampire may seek forgiveness from God through prayer and unshakeable faith. Sins include failing to observe the Five Pillars of Islam nightly, not spreading the Faith of Islam, failing to be charitable when necessary, embracing a non-believer, enslaving someone, breaking an oath, murder. Do not feed from an unbeliever. It is preferable to feed from animals. Do not embrace a non-believer, and do not embrace believers, lest they have given consent. The blood bond is slavery - only non-believers must be subjected to it, and if they show true piety to God, they may be released. Follow God in all things, and the Beast inside will be purged. Blood magic is looked down upon by followers of this Path, with Serpentis, daimoinon and Vicissitude completely forbidden."
+ desc = "In 623 AD, a Cainite named Suleiman ibn Abdullah visited the city of Medina, seeking to make a hunt of sorts, and feed, on the Prophet Muhammad. Suleiman asked for an audience with the Prophet, and, when granted one, was absolutely stunned by the man's divinity, and bowed before him, overhwlemed by the man's divinity as God's messenger. Suleiman Ibn Abdullah became the first of the Ahirra, the Brotherhood, Vampires who swore to uphold God's holy law as set forth by His Final and Greatest Prophet. In this way, the demon within, the Beast, may be silenced, and a vampire may seek forgiveness from God through prayer and unshakeable faith. Sins include failing to observe the Five Pillars of Islam nightly, not spreading the Faith of Islam, failing to be charitable when necessary, embracing a non-believer, enslaving someone, breaking an oath, murder. Do not feed from an unbeliever. It is preferable to feed from animals. Do not embrace a non-believer, and do not embrace believers, lest they have given consent. The blood bond is slavery - only non-believers must be subjected to it, and if they show true piety to God, they may be released. Follow God in all things, and the Beast inside will be purged. Blood magic is looked down upon by followers of this Path, with Serpentis, daimonion and Vicissitude completely forbidden."
alignment = MORALITY_HUMANITY
bearing = BEARING_FAITH
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/__vampire_splat.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/__vampire_splat.dm
index 566f0957b074..9d67cdc6e559 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/splats/__vampire_splat.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/__vampire_splat.dm
@@ -3,6 +3,7 @@
power_type = /datum/discipline
COOLDOWN_DECLARE(passive_bp_drain_cooldown)
+ COOLDOWN_DECLARE(check_masq_violating_cooldown)
/datum/splat/vampire/splat_life(seconds_per_tick)
@@ -10,6 +11,16 @@
if(COOLDOWN_FINISHED(src, passive_bp_drain_cooldown))
owner.adjust_blood_pool(-1)
COOLDOWN_START(src, passive_bp_drain_cooldown, CONFIG_GET(number/passive_bp_drain_timer))
+
+ if(COOLDOWN_FINISHED(src, check_masq_violating_cooldown))
+ if(HAS_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE) && (iscarbon(owner) ? !(owner.obscured_slots & HIDEFACE) : TRUE))
+ SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION)
+
+ if(HAS_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_EYES) && (iscarbon(owner) ? !(owner.obscured_slots & HIDEEYES) : TRUE))
+ SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION)
+
+ COOLDOWN_START(src, check_masq_violating_cooldown, 1 TURNS)
+
return
/datum/splat/vampire/proc/get_discipline_power(datum/discipline_power/discipline_power_type)
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/ghoul_splat.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/ghoul_splat.dm
index e1662ce508e1..eded1f18e79b 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/ghoul_splat.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/ghoul_splat.dm
@@ -36,8 +36,6 @@
if(!discipline)
continue
owner.give_st_power(discipline, 1)
- if(ispath(discipline, /datum/discipline/dementation))
- owner.add_quirk(/datum/quirk/darkpack/derangement)
/datum/splat/vampire/ghoul/on_lose_or_destroy()
owner.remove_st_power(/datum/discipline/bloodheal)
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm
index b277034e4831..22f004436821 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm
@@ -100,8 +100,8 @@
owner.set_blood_type(/datum/blood_type/kindred)
// Apply temperature & burn damage modifiers - Kindred do not get harmed by tempatures, but do by combustion/physical flame damage.
- owner.physiology.burn_mod *= 2
- owner.physiology.cold_mod *= 0.25
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_HEAT, 2)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_COLD, 0.25)
/datum/splat/vampire/kindred/on_lose()
@@ -127,8 +127,8 @@
owner.set_blood_type()
// Reset temperature & burn damage modifiers
- owner.physiology.burn_mod *= 0.5
- owner.physiology.cold_mod *= 4
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_HEAT, 0.5)
+ MODIFY_PHYSIOLOGY(owner, PHYS_COEFF_COLD, 4)
// Reset bloodpool size from Generation
owner.maxbloodpool = initial(owner.maxbloodpool)
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 d9e4953a4b4e..cf339b63a1af 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
@@ -35,7 +35,7 @@
/// If this Clan needs a whitelist to select and play
var/whitelisted = FALSE
- /// daimoinon 1 text
+ /// daimonion 1 text
var/sense_the_sin_text = "has been abandoned by the cold ocean of the night with nobody to keep them afloat."
/**
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 12b4a2218f92..4af800840497 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
@@ -8,7 +8,7 @@
clan_disciplines = list(
/datum/discipline/obfuscate,
/datum/discipline/presence,
- /datum/discipline/daimoinon
+ /datum/discipline/daimonion
)
subsplat_traits = list(
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/gangrel.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/gangrel.dm
index ed445cccceec..0615ffbde1dc 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/gangrel.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/gangrel.dm
@@ -9,7 +9,7 @@
clan_disciplines = list(
/datum/discipline/animalism,
/datum/discipline/fortitude,
- /datum/discipline/protean
+ /datum/discipline/protean,
)
male_clothes = /obj/item/clothing/under/vampire/gangrel
female_clothes = /obj/item/clothing/under/vampire/gangrel/female
@@ -28,5 +28,5 @@
clan_disciplines = list(
/datum/discipline/celerity,
/datum/discipline/obfuscate,
- /datum/discipline/protean
+ /datum/discipline/protean,
)
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 955cc8dcf51d..5095bef8b265 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
@@ -35,14 +35,14 @@
/datum/subsplat/vampire_clan/gargoyle/on_gain(mob/living/carbon/human/gaining_mob, datum/splat/gaining_splat, joining_round)
. = ..()
- gaining_mob.physiology.brute_mod = 0.8
+ MODIFY_PHYSIOLOGY(gaining_mob, BRUTE, 0.8)
var/obj/item/organ/wings/functional/gargoyle/wings = new()
wings.Insert(gaining_mob)
/datum/subsplat/vampire_clan/gargoyle/on_lose(mob/living/carbon/human/losing_mob)
. = ..()
- losing_mob.physiology.brute_mod = 1
+ MODIFY_PHYSIOLOGY(losing_mob, BRUTE, 1.25)
var/obj/item/organ/wings/functional/gargoyle/wings = losing_mob.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
if(wings)
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/malkavian/malkavian.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/malkavian/malkavian.dm
index d99a3594f8ef..434aaedb994a 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/malkavian/malkavian.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/malkavian/malkavian.dm
@@ -1,3 +1,5 @@
+GLOBAL_LIST_EMPTY(madness_network)
+
/datum/subsplat/vampire_clan/malkavian
name = "Malkavian"
id = VAMPIRE_CLAN_MALKAVIAN
@@ -9,12 +11,11 @@
clan_disciplines = list(
/datum/discipline/auspex,
/datum/discipline/dementation,
- /datum/discipline/obfuscate
+ /datum/discipline/obfuscate,
)
male_clothes = /obj/item/clothing/under/vampire/malkavian
female_clothes = /obj/item/clothing/under/vampire/malkavian/female
subsplat_keys = /obj/item/vamp/keys/malkav
- var/list/mob/living/madness_network
/datum/subsplat/vampire_clan/malkavian/dominate
name = "Dominate Malkavian"
@@ -24,22 +25,21 @@
clan_disciplines = list(
/datum/discipline/auspex,
/datum/discipline/dominate,
- /datum/discipline/obfuscate
+ /datum/discipline/obfuscate,
)
/datum/subsplat/vampire_clan/malkavian/on_gain(mob/living/carbon/human/gaining_mob, datum/splat/gaining_splat, joining_round)
. = ..()
-
var/datum/action/cooldown/malk_hivemind/hivemind = new(gaining_mob)
- var/datum/action/cooldown/malk_speech/malk_font = new(gaining_mob)
hivemind.Grant(gaining_mob)
+ var/datum/action/cooldown/malk_speech/malk_font = new(gaining_mob)
malk_font.Grant(gaining_mob)
+
gaining_mob.add_quirk(/datum/quirk/darkpack/derangement)
- // Madness Network handling
- LAZYADD(madness_network, gaining_mob)
- RegisterSignal(gaining_mob, COMSIG_MOB_SAY, PROC_REF(handle_say), override = TRUE)
- RegisterSignal(gaining_mob, COMSIG_MOVABLE_HEAR, PROC_REF(handle_hear), override = TRUE)
+ GLOB.madness_network += gaining_mob
+ RegisterSignal(gaining_mob, COMSIG_MOB_SAY, PROC_REF(handle_say))
+ RegisterSignal(gaining_mob, COMSIG_MOVABLE_HEAR, PROC_REF(handle_hear))
/datum/subsplat/vampire_clan/malkavian/on_lose(mob/living/carbon/human/losing_mob)
. = ..()
@@ -49,8 +49,9 @@
continue
malkavian_action.Remove(losing_mob)
- // Remove Madness Network
- LAZYREMOVE(madness_network, losing_mob)
+ losing_mob.remove_quirk(/datum/quirk/darkpack/derangement)
+
+ GLOB.madness_network -= losing_mob
UnregisterSignal(losing_mob, COMSIG_MOB_SAY)
UnregisterSignal(losing_mob, COMSIG_MOVABLE_HEAR)
@@ -71,7 +72,7 @@
say_in_madness_network(hearing_args[HEARING_RAW_MESSAGE])
/datum/subsplat/vampire_clan/malkavian/proc/say_in_madness_network(message)
- for (var/mob/living/malkavian in madness_network)
+ for (var/mob/living/malkavian in GLOB.madness_network)
to_chat(malkavian, span_ghostalert(message))
/datum/action/cooldown/malk_hivemind
diff --git a/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_endron_role.dm b/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_endron_role.dm
index 18b58875c2c3..7be75b5cccb2 100644
--- a/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_endron_role.dm
+++ b/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_endron_role.dm
@@ -22,7 +22,7 @@
suits = list(/obj/item/clothing/suit/vampire/vest)
glasses = list(/obj/item/clothing/glasses/vampire/sun)
hats = list(/obj/item/clothing/head/beret/black)
- masks = list(/obj/item/clothing/mask/gas/explorer)
+ masks = list(/obj/item/clothing/mask/gas/darkpack/military/pentex)
/datum/socialrole/bouncer/endron/endron_lab_2
bouncer_weapon_type = /obj/item/gun/ballistic/automatic/darkpack/mp5
@@ -34,7 +34,7 @@
suits = list(/obj/item/clothing/suit/vampire/vest)
glasses = list(/obj/item/clothing/glasses/vampire/sun)
hats = list(/obj/item/clothing/head/beret/black)
- masks = list(/obj/item/clothing/mask/gas/explorer)
+ masks = list(/obj/item/clothing/mask/gas/darkpack/military/pentex)
/datum/socialrole/bouncer/endron/endron_2
bouncer_weapon_type = /obj/item/gun/ballistic/automatic/pistol/darkpack/deagle
diff --git a/modular_darkpack/modules/vitae/code/blood_pack.dm b/modular_darkpack/modules/vitae/code/blood_pack.dm
index f79b8df5c725..14421b575e42 100644
--- a/modular_darkpack/modules/vitae/code/blood_pack.dm
+++ b/modular_darkpack/modules/vitae/code/blood_pack.dm
@@ -16,7 +16,7 @@ GLOBAL_LIST_INIT(human_blood_types, list(
ONFLOOR_ICON_HELPER('modular_darkpack/modules/vitae/icons/onfloor.dmi')
icon_state = "blood100"
inhand_icon_state = "blood100"
- initial_reagent_flags = OPENCONTAINER | REFILLABLE | DRAWABLE
+ initial_reagent_flags = OPENCONTAINER | NO_SPLASH | REFILLABLE | DRAWABLE
/obj/item/reagent_containers/blood/Initialize(mapload, vol)
. = ..()
diff --git a/modular_darkpack/modules/weapons/code/guns.dm b/modular_darkpack/modules/weapons/code/guns.dm
index 3c6492c834a8..599152c41716 100644
--- a/modular_darkpack/modules/weapons/code/guns.dm
+++ b/modular_darkpack/modules/weapons/code/guns.dm
@@ -801,6 +801,59 @@
weapon_weight = WEAPON_MEDIUM
accepted_magazine_type = /obj/item/ammo_box/magazine/internal/vampshotgun/sawnoff
+/obj/item/ammo_box/magazine/internal/vampshotgun
+ name = "shotgun internal magazine"
+ ammo_type = /obj/item/ammo_casing/vampire/c12g
+ caliber = CALIBER_12G
+ //multiload = FALSE
+ max_ammo = 6
+ masquerade_violating = FALSE
+
+/obj/item/gun/ballistic/shotgun/vamp_remington
+ name = "remington shotgun"
+ icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi'
+ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi'
+ righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi'
+ worn_icon = 'modular_darkpack/modules/weapons/icons/worn_guns.dmi'
+ ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi')
+ w_class = WEIGHT_CLASS_BULKY
+ icon_state = "1187"
+ inhand_icon_state = "1187"
+ worn_icon_state = "1187"
+ can_suppress = TRUE
+ recoil = 6
+ fire_delay = 6
+ accepted_magazine_type = /obj/item/ammo_box/magazine/internal/vampshotgun
+ can_be_sawn_off = TRUE
+ suppressed_sound = 'modular_darkpack/modules/weapons/sounds/1187_silenced.ogg'
+ fire_sound = 'modular_darkpack/modules/weapons/sounds/1187.ogg'
+ inhand_x_dimension = 32
+ inhand_y_dimension = 32
+ custom_price = 1000
+ serial_type = "R"
+
+/obj/item/gun/ballistic/shotgun/vamp_remington/shoot_live_shot(mob/living/user)
+ ..()
+ rack()
+
+/obj/item/gun/ballistic/shotgun/vamp_remington/sawnoff
+ name = "sawn-off remington 1187"
+ desc = "A Remington 11-87 shotgun that's had the barrel extension crudely sawn off.. this is definitely illegal"
+ icon_state = "1187_sawn"
+ inhand_icon_state = "1187_sawn"
+ worn_icon_state = "1187_sawn"
+ recoil = 10
+ w_class = WEIGHT_CLASS_NORMAL
+ weapon_weight = WEAPON_MEDIUM
+ accepted_magazine_type = /obj/item/ammo_box/magazine/internal/vampshotgun/sawnoff
+
+//Suppressor code is currently borking during unit tests, so i'm just gonna get rid of it and see if that helps
+/obj/item/suppressor/darkpack_oil
+ name = "modified oil filter"
+ desc = "An old oil filter.. there seems to be attachment grooves lathed onto the barrel for a Remington 11-87."
+ icon = 'modular_darkpack/modules/weapons/icons/attachments.dmi'
+ icon_state = "oil_filter"
+
/obj/item/ammo_box/magazine/internal/darkpack_dbarrel
name = "double barrel internal magazine"
ammo_type = /obj/item/ammo_casing/vampire/c12g
@@ -845,7 +898,7 @@
icon_state = "[base_icon_state][!chambered ? "_empty" : ""][sawn_off ? "_sawn" : ""]"
//Unique sawn-off checks
-/obj/item/gun/ballistic/shotgun/vampire/doublebarrel/sawoff(mob/user, obj/item/saw, handle_modifications = TRUE)
+/obj/item/gun/ballistic/shotgun/vampire/doublebarrel/do_sawoff()
. = ..()
w_class = WEIGHT_CLASS_NORMAL //Lets you stow it in a bag
weapon_weight = WEAPON_MEDIUM //Lets you one-hand it on sawing.
diff --git a/modular_darkpack/modules/weapons/code/melee.dm b/modular_darkpack/modules/weapons/code/melee.dm
index 75949502dda7..46761ca7e064 100644
--- a/modular_darkpack/modules/weapons/code/melee.dm
+++ b/modular_darkpack/modules/weapons/code/melee.dm
@@ -119,6 +119,7 @@
worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi'
ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi')
icon_state = "rapier"
+ inhand_icon_state = "rapier"
// WTA pg. 302
force = 2 LETHAL_TTRPG_DAMAGE
armour_penetration = 50
@@ -414,6 +415,7 @@
// Made up
force = 2 TTRPG_DAMAGE
throwforce = 2 TTRPG_DAMAGE
+ throw_range = 4
attack_verb_continuous = list("bludgeons", "bashes", "beats")
attack_verb_simple = list("bludgeon", "bash", "beat", "smacks")
@@ -423,6 +425,10 @@
//grid_height = 1 GRID_BOXES
var/broken = FALSE
+/obj/item/melee/vamp/brick/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/falling_hazard, damage = 50, wound_bonus = 20, hardhat_safety = TRUE, crushes = FALSE, impact_sound = 'sound/items/weapons/genhit3.ogg')
+
/obj/item/melee/vamp/brick/after_throw(datum/callback/callback)
if(prob(75))
broken = FALSE
diff --git a/modular_darkpack/modules/weapons/code/pliers.dm b/modular_darkpack/modules/weapons/code/pliers.dm
index 47bee6b1ec53..18e1435417f7 100644
--- a/modular_darkpack/modules/weapons/code/pliers.dm
+++ b/modular_darkpack/modules/weapons/code/pliers.dm
@@ -77,7 +77,7 @@
. = ..()
if(!examine_roll)
examine_roll = new()
- var/roll_result = examine_roll.st_roll(user, src)
+ var/roll_result = examine_roll.st_roll(user, src, using_item = src)
if(roll_result == ROLL_SUCCESS)
if(owners_splat)
var/datum/splat/splat_type = GLOB.splat_list[owners_splat]
diff --git a/modular_darkpack/modules/weapons/icons/ammo.dmi b/modular_darkpack/modules/weapons/icons/ammo.dmi
index e22b82326477..e78570ab64da 100644
Binary files a/modular_darkpack/modules/weapons/icons/ammo.dmi and b/modular_darkpack/modules/weapons/icons/ammo.dmi differ
diff --git a/modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi b/modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi
index 30e1bb5db536..668367ab6b0f 100644
Binary files a/modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi and b/modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi differ
diff --git a/modular_darkpack/modules/weapons/icons/attachments.dmi b/modular_darkpack/modules/weapons/icons/attachments.dmi
new file mode 100644
index 000000000000..db813615fae1
Binary files /dev/null and b/modular_darkpack/modules/weapons/icons/attachments.dmi differ
diff --git a/modular_darkpack/modules/weapons/icons/weapons.dmi b/modular_darkpack/modules/weapons/icons/weapons.dmi
index cdd2edcbbcc6..705e032db28b 100644
Binary files a/modular_darkpack/modules/weapons/icons/weapons.dmi and b/modular_darkpack/modules/weapons/icons/weapons.dmi differ
diff --git a/modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi b/modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi
index 3419db9cabf0..a5c518683f0f 100644
Binary files a/modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi and b/modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi differ
diff --git a/modular_darkpack/modules/weapons/icons/worn_guns.dmi b/modular_darkpack/modules/weapons/icons/worn_guns.dmi
index 389bd0df1c78..1215acf5b83c 100644
Binary files a/modular_darkpack/modules/weapons/icons/worn_guns.dmi and b/modular_darkpack/modules/weapons/icons/worn_guns.dmi differ
diff --git a/modular_darkpack/modules/weapons/sounds/1187.ogg b/modular_darkpack/modules/weapons/sounds/1187.ogg
new file mode 100644
index 000000000000..0ebcd5201ed5
Binary files /dev/null and b/modular_darkpack/modules/weapons/sounds/1187.ogg differ
diff --git a/modular_darkpack/modules/weapons/sounds/1187_silenced.ogg b/modular_darkpack/modules/weapons/sounds/1187_silenced.ogg
new file mode 100644
index 000000000000..d0d953a6e401
Binary files /dev/null and b/modular_darkpack/modules/weapons/sounds/1187_silenced.ogg differ
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm
index e9cba21b249f..ef78e081323c 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm
@@ -11,6 +11,8 @@
check_flags = AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS
+ magic_type = MAGIC_TYPE_SPIRIT
+
var/rage_cost = 0
var/gnosis_cost = 0
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm
index 3f47189ade39..86d306e8d7c0 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm
@@ -100,7 +100,6 @@
var/mob/living/living_owner = astype(owner)
living_owner?.apply_status_effect(/datum/status_effect/razor_claws)
-// DARKPACK TODO - Requires https://github.com/DarkPack13/SecondCity/pull/680 for its stat handling.
/datum/status_effect/razor_claws
id = "razor_claws"
duration = 1 SCENES
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm
index a9344b5e2184..d71494786289 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm
@@ -24,9 +24,11 @@
to_chat(owner, span_notice("You feel your skin thickening..."))
owner.add_traits(list(TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA), GIFT_TRAIT)
+ owner.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
/datum/status_effect/resist_pain/on_remove()
owner.remove_traits(list(TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA), GIFT_TRAIT)
+ owner.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
to_chat(owner, span_warning("Your skin is thin again..."))
return ..()
@@ -40,7 +42,7 @@
/datum/storyteller_roll/gift/scent_of_the_true_form
applicable_stats = list(STAT_PERCEPTION)
numerical = TRUE
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
/datum/action/cooldown/power/gift/scent_of_the_true_form
name = "Scent Of The True Form"
@@ -172,7 +174,7 @@
var/datum/storyteller_roll/roll_datum = new()
roll_datum.applicable_stats = list(STAT_INTELLIGENCE, STAT_EMPATHY)
roll_datum.difficulty = living_target.st_get_stat(STAT_MANIPULATION) + living_target.st_get_stat(STAT_SUBTERFUGE)
- roll_datum.roll_output_type = ROLL_PRIVATE_AND_TARGET
+ roll_datum.roll_output_type = ROLL_FLAG_ROLLER|ROLL_FLAG_TARGET
var/roll_result = roll_datum.st_roll(owner)
if(roll_result != ROLL_SUCCESS)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm
index 1dc3575b9d27..92286785e8ed 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm
@@ -13,7 +13,7 @@
var/datum/storyteller_roll/roll_datum = new()
roll_datum.applicable_stats = list(STAT_MANIPULATION, STAT_STEALTH)
roll_datum.difficulty = 8
- roll_datum.roll_output_type = ROLL_PRIVATE
+ roll_datum.roll_output_type = ROLL_FLAG_ROLLER
var/roll_result = roll_datum.st_roll(owner)
if(roll_result == ROLL_SUCCESS)
@@ -107,7 +107,7 @@
/datum/storyteller_roll/gift/open_seal
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
/datum/action/cooldown/power/gift/open_seal
name = "Open Seal"
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm
index b92433961d1a..1734f161baeb 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm
@@ -1,7 +1,7 @@
/datum/storyteller_roll/gift/mothers_touch
applicable_stats = list(STAT_INTELLIGENCE, STAT_EMPATHY)
numerical = TRUE
- roll_output_type = ROLL_PRIVATE_AND_TARGET
+ roll_output_type = ROLL_FLAG_ROLLER|ROLL_FLAG_TARGET
/*
From W20 p. 164
@@ -42,76 +42,6 @@ the scar is received and an extra Gnosis point is spent.
SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION)
return TRUE
-/datum/action/cooldown/power/gift/sense_wyrm
- name = "Sense Wyrm"
- desc = "This Gift allows the werewolf to trace the location of all wyrm-tainted entities within the area."
- button_icon_state = "sense_wyrm"
- rank = 1
- var/list/navigation_images = list()
-
-/datum/action/cooldown/power/gift/sense_wyrm/Activate(atom/target)
- . = ..()
- cut_navigation()
-
- var/lowest_difficulty = 0
- var/list/wyrm_targets_in_range = list()
- for(var/mob/living/target_guy in orange(owner, 30))
- var/difficulty = get_sense_difficulty(target_guy)
- if(difficulty)
- if(!lowest_difficulty || (difficulty < lowest_difficulty))
- lowest_difficulty = difficulty
- wyrm_targets_in_range[target_guy] = difficulty
-
- if(!lowest_difficulty)
- return
-
- var/datum/storyteller_roll/roll_datum = new()
- roll_datum.applicable_stats = list(STAT_PERCEPTION, STAT_OCCULT)
- roll_datum.difficulty = lowest_difficulty
- var/roll_result = roll_datum.st_roll(owner)
-
- if(roll_result != ROLL_SUCCESS)
- return
-
- for(var/mob/living/target_guy, difficulty in wyrm_targets_in_range)
- var/list/path = get_path_to(owner, target_guy, 50, access = owner.get_access(), skip_first = FALSE)
- for(var/i in 1 to length(path))
- var/turf/current_turf = path[i]
- var/image/path_image = image(icon = 'icons/effects/effects.dmi', icon_state = "smoke", layer = HIGH_PIPE_LAYER, loc = current_turf)
- SET_PLANE(path_image, GAME_PLANE, current_turf)
- if(i == length(path))
- path_image.color = COLOR_PURPLE_GRAY
- else
- path_image.color = COLOR_PALE_PURPLE_GRAY
- path_image.alpha = rand(5, path_image.alpha/2)
- owner.client?.images += path_image
- navigation_images += path_image
-
- RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(cut_navigation))
-
-/datum/action/cooldown/power/gift/sense_wyrm/proc/cut_navigation()
- SIGNAL_HANDLER
- for(var/image/navigation_path in navigation_images)
- owner.client?.images -= navigation_path
- navigation_images.Cut()
- UnregisterSignal(owner, COMSIG_LIVING_DEATH)
-
-/datum/action/cooldown/power/gift/sense_wyrm/proc/get_sense_difficulty(mob/living/target)
- if(HAS_TRAIT(target, TRAIT_HIDDEN_WYRMTAINT))
- return
-
- // To be used for stuff like banes.
- if(HAS_TRAIT(target, TRAIT_WYRMTAINTED))
- . = 6
-
- if(HAS_TRAIT(target, TRAIT_WYRMTAINTED_SPRITE))
- . = 5
-
- var/datum/splat/vampire/kindred/kindred_splat = get_kindred_splat(target)
- if(kindred_splat)
- if(!target.is_enlightenment() && target.st_get_stat(STAT_MORALITY) >= 7)
- return
- . = 6
/datum/action/cooldown/power/gift/spirit_speech
name = "Spirit Speech"
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/crinos/_crinos.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/crinos/_crinos.dm
new file mode 100644
index 000000000000..5e3a1d49e25c
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/crinos/_crinos.dm
@@ -0,0 +1,79 @@
+/**
+ * The Garou knows the trick of shedding and growing fur at an alarming rate.
+ * This Gift makes the Garou especially difficult to grapple successfully; opponents find themselves
+ * holding tufts of fur instead of their target. The Garou can also slide through tight spaces
+ * using his shedding fur as natural lubrication. A lizard-spirit or snake-spirit teaches this Gift.
+ *
+ * The Garou may use his slick outer coating to avoid being grappled.
+ * With a successful Dexterity + Primal-Urge roll (difficulty 7), he can free himself
+ * from any successful grappling attack. The fur also reduces by two the werewolf’s difficulty
+ * whenever he squeezes through tight spaces or slips restraints, such as handcuffs.
+ *
+ */
+/datum/action/cooldown/power/gift/shed
+ name = "Shed"
+ desc = "The Garou knows the trick of shedding and growing fur at an alarming rate."
+ button_icon_state = "shed"
+ rank = 1
+ cooldown_time = 1 TURNS
+ var/datum/storyteller_roll/gift/shed/roll
+
+/datum/action/cooldown/power/gift/shed/New()
+ . = ..()
+ roll = new()
+
+/datum/action/cooldown/power/gift/shed/Destroy()
+ QDEL_NULL(roll)
+ return ..()
+
+/datum/action/cooldown/power/gift/shed/Activate(atom/target)
+ var/mob/living/carbon/carbon_owner = astype(owner)
+ if(!carbon_owner)
+ return FALSE // eh
+
+ if(!carbon_owner.pulledby && !carbon_owner.handcuffed && !carbon_owner.legcuffed)
+ to_chat(carbon_owner, span_warning("No one is grappling or restraining you, all this would amount to is theatrics."))
+ return FALSE
+
+ . = ..()
+
+ var/roll_result = roll.st_roll(carbon_owner, bonus_added = PRIMAL_URGE_PLACEHOLDER)
+ if(roll_result != ROLL_SUCCESS)
+ return TRUE
+
+ carbon_owner.apply_status_effect(/datum/status_effect/shed)
+ return TRUE
+
+
+/datum/status_effect/shed
+ id = "shed"
+ duration = 1 SCENES // duration higher than gift CD. we just refresh
+
+ status_type = STATUS_EFFECT_REPLACE
+
+ alert_type = /atom/movable/screen/alert/status_effect/gift/shed
+
+/datum/status_effect/shed/on_apply()
+ var/mob/living/carbon/carbon_owner = astype(owner)
+ if(!carbon_owner)
+ return FALSE // eh
+
+ . = ..()
+
+ if(carbon_owner.pulledby)
+ to_chat(carbon_owner, span_notice("You shed your fur, and [carbon_owner.pulledby] loses [carbon_owner.pulledby.p_their()] grip on you!"))
+ carbon_owner.pulledby.stop_pulling()
+ if(carbon_owner.handcuffed || carbon_owner.legcuffed)
+ to_chat(carbon_owner, span_notice("You shed your fur, using the slick coating as lubrication to slip out of your restraints."))
+ carbon_owner.uncuff()
+
+/atom/movable/screen/alert/status_effect/gift/shed
+ name = /datum/action/cooldown/power/gift/shed::name
+ desc = "The shedding fur reduces the difficulty of slipping restraints by two."
+ overlay_state = /datum/action/cooldown/power/gift/shed::button_icon_state
+
+
+/datum/storyteller_roll/gift/shed
+ bumper_text = "shedding fur"
+ difficulty = 7
+ applicable_stats = list(STAT_DEXTERITY)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/crinos/primal_anger.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/crinos/primal_anger.dm
new file mode 100644
index 000000000000..35bc36f6c92b
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/crinos/primal_anger.dm
@@ -0,0 +1,15 @@
+/datum/action/cooldown/power/gift/primal_anger
+ name = "Primal Anger"
+ desc = "The character may inflict a single level of aggravated damage on herself once per scene, and gain three points of Rage in exchange."
+ button_icon_state = "primal_anger"
+ rank = 1
+ cooldown_time = 1 SCENES
+
+/datum/action/cooldown/power/gift/primal_anger/Activate(atom/target)
+ . = ..()
+
+ var/mob/living/living_owner = astype(owner)
+ living_owner?.adjust_agg_loss(1 TTRPG_DAMAGE)
+
+ var/datum/splat/werewolf/werewolf_splat = get_werewolf_splat(owner)
+ werewolf_splat?.adjust_rage(3)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/crinos/sense_wyrm.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/crinos/sense_wyrm.dm
new file mode 100644
index 000000000000..f5e3634c483f
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/crinos/sense_wyrm.dm
@@ -0,0 +1,70 @@
+/datum/action/cooldown/power/gift/sense_wyrm
+ name = "Sense Wyrm"
+ desc = "This Gift allows the werewolf to trace the location of all wyrm-tainted entities within the area."
+ button_icon_state = "sense_wyrm"
+ rank = 1
+ var/list/navigation_images = list()
+
+/datum/action/cooldown/power/gift/sense_wyrm/Activate(atom/target)
+ . = ..()
+ cut_navigation()
+
+ var/lowest_difficulty = 0
+ var/list/wyrm_targets_in_range = list()
+ for(var/mob/living/target_guy in orange(owner, 30))
+ var/difficulty = get_sense_difficulty(target_guy)
+ if(difficulty)
+ if(!lowest_difficulty || (difficulty < lowest_difficulty))
+ lowest_difficulty = difficulty
+ wyrm_targets_in_range[target_guy] = difficulty
+
+ if(!lowest_difficulty)
+ return
+
+ var/datum/storyteller_roll/roll_datum = new()
+ roll_datum.applicable_stats = list(STAT_PERCEPTION, STAT_OCCULT)
+ roll_datum.difficulty = lowest_difficulty
+ var/roll_result = roll_datum.st_roll(owner)
+
+ if(roll_result != ROLL_SUCCESS)
+ return
+
+ for(var/mob/living/target_guy, difficulty in wyrm_targets_in_range)
+ var/list/path = get_path_to(owner, target_guy, 50, access = owner.get_access(), skip_first = FALSE)
+ for(var/i in 1 to length(path))
+ var/turf/current_turf = path[i]
+ var/image/path_image = image(icon = 'icons/effects/effects.dmi', icon_state = "smoke", layer = HIGH_PIPE_LAYER, loc = current_turf)
+ SET_PLANE(path_image, GAME_PLANE, current_turf)
+ if(i == length(path))
+ path_image.color = COLOR_PURPLE_GRAY
+ else
+ path_image.color = COLOR_PALE_PURPLE_GRAY
+ path_image.alpha = rand(5, path_image.alpha/2)
+ owner.client?.images += path_image
+ navigation_images += path_image
+
+ RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(cut_navigation))
+
+/datum/action/cooldown/power/gift/sense_wyrm/proc/cut_navigation()
+ SIGNAL_HANDLER
+ for(var/image/navigation_path in navigation_images)
+ owner.client?.images -= navigation_path
+ navigation_images.Cut()
+ UnregisterSignal(owner, COMSIG_LIVING_DEATH)
+
+/datum/action/cooldown/power/gift/sense_wyrm/proc/get_sense_difficulty(mob/living/target)
+ if(HAS_TRAIT(target, TRAIT_HIDDEN_WYRMTAINT))
+ return
+
+ // To be used for stuff like banes.
+ if(HAS_TRAIT(target, TRAIT_WYRMTAINTED))
+ . = 6
+
+ if(HAS_TRAIT(target, TRAIT_WYRMTAINTED_SPRITE))
+ . = 5
+
+ var/datum/splat/vampire/kindred/kindred_splat = get_kindred_splat(target)
+ if(kindred_splat)
+ if(!target.is_enlightenment() && target.st_get_stat(STAT_MORALITY) >= 7)
+ return
+ . = 6
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/homid/_homid.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/homid/_homid.dm
new file mode 100644
index 000000000000..9a6949222434
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/homid/_homid.dm
@@ -0,0 +1,143 @@
+/datum/action/cooldown/power/gift/city_running
+ name = "City Running"
+ desc = {"The player spends a point of Rage. For the rest of the scene, the character may climb at her full movement speed,
+ and the difficulty of all Athletics rolls to navigate is reduced by two."}
+ button_icon_state = "city_running"
+ rank = 1
+ rage_cost = 1
+
+/datum/action/cooldown/power/gift/city_running/Activate(atom/target)
+ . = ..()
+ var/mob/living/living_owner = astype(owner)
+ living_owner?.apply_status_effect(/datum/status_effect/city_running)
+
+
+/datum/status_effect/city_running
+ id = "city_running"
+ duration = 1 SCENES
+ status_type = STATUS_EFFECT_REPLACE
+ alert_type = /atom/movable/screen/alert/status_effect/gift/city_running
+
+/atom/movable/screen/alert/status_effect/gift/city_running
+ name = /datum/action/cooldown/power/gift/city_running::name
+ desc = /datum/action/cooldown/power/gift/city_running::desc
+ overlay_state = /datum/action/cooldown/power/gift/city_running::button_icon_state
+
+
+/*
+ * Once humans tamed fire to keep them warm and to drive off the wild beasts,
+ * they were humanity’s ancient pact with the spirits of fire.
+ * The spirits of flame agree to hold back their hunger when the werewolf touches them. An ancestor spirit or a fire-spirit grants this Gift.
+
+ * This Gift allows a werewolf to heal fire damage as if it were bashing.
+ * This requires the expenditure of a Gnosis point; the effects last for a scene.
+*/
+/datum/action/cooldown/power/gift/master_of_fire
+ name = "Master of Fire"
+ desc = "The spirits of flame agree to hold back their hunger, letting you regenerate fire damage for a scene."
+ button_icon_state = "master_of_fire" // TODO: get an icon for this
+ rank = 1
+ gnosis_cost = 1
+
+/datum/action/cooldown/power/gift/master_of_fire/Activate(atom/target)
+ var/datum/splat/werewolf/shifter/shifter_splat = get_shifter_splat(owner)
+ if(!shifter_splat)
+ return FALSE // huh?
+
+ . = ..()
+
+ shifter_splat.adjust_gnosis(-1)
+ shifter_splat.owner.apply_status_effect(/datum/status_effect/master_of_fire)
+
+/datum/status_effect/master_of_fire
+ id = "master_of_fire"
+ duration = 1 SCENES
+
+ status_type = STATUS_EFFECT_REPLACE
+
+ alert_type = /atom/movable/screen/alert/status_effect/gift/master_of_fire
+
+/datum/status_effect/master_of_fire/on_apply()
+ to_chat(owner, span_notice("The spirits of flame agree to hold back their hunger, for a while."))
+ return TRUE
+
+/datum/status_effect/master_of_fire/on_remove()
+ to_chat(owner, span_warning("The spirits of flame grow hungry yet again."))
+
+/atom/movable/screen/alert/status_effect/gift/master_of_fire
+ name = /datum/action/cooldown/power/gift/master_of_fire::name
+ desc = "Lets you heal fire damage as if it were bashing."
+ overlay_state = /datum/action/cooldown/power/gift/master_of_fire::button_icon_state
+
+
+/datum/action/cooldown/power/gift/apecrafts_blessings
+ name = "Apecraft's Blessings"
+ desc = "Grants a bonus to the next roll made to employ any tool."
+ button_icon_state = "apecrafts_blessing"
+ rank = 1
+
+/datum/action/cooldown/power/gift/apecrafts_blessings/IsAvailable(feedback)
+ . = ..()
+ var/mob/living/living_owner = astype(owner)
+ if(!living_owner)
+ return FALSE
+
+ if(living_owner.has_status_effect(/datum/storyteller_roll/gift/apecrafts_blessings))
+ return FALSE
+
+/datum/action/cooldown/power/gift/apecrafts_blessings/Activate(atom/target)
+ var/mob/living/living_owner = astype(owner)
+ if(!living_owner)
+ return FALSE
+
+ . = ..()
+ if(!do_after(owner, 1 TURNS))
+ return
+
+ var/datum/storyteller_roll/gift/apecrafts_blessings/roll_datum = new()
+ var/roll_result = roll_datum.st_roll(owner)
+ if(roll_result >= 1)
+ living_owner.apply_status_effect(/datum/status_effect/apecrafts_blessings, roll_result)
+
+
+/datum/storyteller_roll/gift/apecrafts_blessings
+ bumper_text = /datum/action/cooldown/power/gift/apecrafts_blessings::name
+ applicable_stats = list(STAT_WITS, STAT_CRAFTS)
+ numerical = TRUE
+
+
+/datum/status_effect/apecrafts_blessings
+ id = "apecrafts_blessings"
+ duration = STATUS_EFFECT_PERMANENT
+
+ status_type = STATUS_EFFECT_UNIQUE
+
+ alert_type = /atom/movable/screen/alert/status_effect/gift/apecrafts_blessings
+ /// Passed in by the gift's activate
+ var/value
+
+/datum/status_effect/apecrafts_blessings/on_creation(mob/living/owner, value)
+ src.value = value
+ return ..()
+
+/datum/status_effect/apecrafts_blessings/on_apply()
+ to_chat(owner, span_notice("Your hands glow with power."))
+ RegisterSignal(owner, COMSIG_LIVING_PRE_DICE_ROLLED, PROC_REF(on_dice_rolled))
+ return TRUE
+
+/datum/status_effect/apecrafts_blessings/proc/on_dice_rolled(mob/living/roller, datum/storyteller_roll/roll_datum, atom/target, atom/using_item, bonus, difficulty)
+ SIGNAL_HANDLER
+
+ if(using_item && !HAS_TRAIT(using_item, TRAIT_NATURAL))
+ *difficulty -= value
+ qdel(src)
+
+/datum/status_effect/apecrafts_blessings/on_remove()
+ to_chat(owner, span_warning("The power in your hands wanes.."))
+ UnregisterSignal(owner, COMSIG_LIVING_PRE_DICE_ROLLED)
+
+
+/atom/movable/screen/alert/status_effect/gift/apecrafts_blessings
+ name = /datum/action/cooldown/power/gift/apecrafts_blessings::name
+ desc = /datum/action/cooldown/power/gift/apecrafts_blessings::desc
+ overlay_state = /datum/action/cooldown/power/gift/apecrafts_blessings::button_icon_state
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/lupus/_lupus.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/lupus/_lupus.dm
new file mode 100644
index 000000000000..c40eb0bb6532
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/lupus/_lupus.dm
@@ -0,0 +1,127 @@
+/datum/action/cooldown/power/gift/hares_leap
+ name = "Hare's Leap"
+ desc = {"The player makes a reflexive Strength + Athletics roll (difficulty 7) to activate this Gift.
+ If successful, the character's leaping distances are doubled for a scene — or tripled for a single turn with the expenditure of a Willpower point"}
+ button_icon_state = "hares_leap"
+ rank = 1
+
+/datum/action/cooldown/power/gift/hares_leap/Activate(atom/target)
+ var/mob/living/living_owner = astype(owner)
+ if(!living_owner)
+ return FALSE
+
+ . = ..()
+ var/datum/storyteller_roll/gift/hares_leap/roll_datum = new()
+ if(roll_datum.st_roll(living_owner) != ROLL_SUCCESS)
+ return TRUE
+
+ var/jump_mod = 2
+ if(living_owner.prompt_burn_willpower())
+ jump_mod = 3
+
+ living_owner.apply_status_effect(/datum/status_effect/hares_leap, jump_mod)
+
+
+/datum/storyteller_roll/gift/hares_leap
+ bumper_text = /datum/action/cooldown/power/gift/hares_leap::name
+ applicable_stats = list(STAT_STRENGTH, STAT_ATHLETICS)
+ difficulty = 7
+ roll_output_type = ROLL_FLAG_ROLLER
+
+
+/datum/status_effect/hares_leap
+ id = "hares_leap"
+ duration = 1 SCENES
+ status_type = STATUS_EFFECT_REPLACE
+ alert_type = /atom/movable/screen/alert/status_effect/gift/hares_leap
+ var/jump_modifier = 2
+
+/datum/status_effect/hares_leap/on_creation(mob/living/new_owner, jump_modifier = 2)
+ . = ..()
+ src.jump_modifier = jump_modifier
+
+/atom/movable/screen/alert/status_effect/gift/hares_leap
+ name = /datum/action/cooldown/power/gift/hares_leap::name
+ desc = /datum/action/cooldown/power/gift/hares_leap::desc
+ overlay_state = /datum/action/cooldown/power/gift/hares_leap::button_icon_state
+
+
+/datum/action/cooldown/power/gift/predators_arsenal
+ name = "Predator's Arsenal"
+ desc = {"One of the most unnerving aspects of the Homid shape is its lack of proper weapons.
+ This Gift remedies that problem (while still retaining much of the Homid shape's ability to blend in with the human world),
+ granting the Garou battle-ready claws and teeth in Homid form."}
+ button_icon_state = "predators_arsenal"
+ rank = 1
+
+/datum/action/cooldown/power/gift/predators_arsenal/Activate(atom/target)
+ var/mob/living/living_owner = astype(owner)
+ if(!living_owner)
+ return FALSE
+
+ . = ..()
+
+ living_owner.apply_status_effect(/datum/status_effect/predators_arsenal)
+
+/datum/status_effect/predators_arsenal
+ id = "predators_arsenal"
+ duration = 1 SCENES
+ status_type = STATUS_EFFECT_REPLACE
+ alert_type = /atom/movable/screen/alert/status_effect/gift/predators_arsenal
+ var/list/datum/weakref/affected_bodyparts
+ var/datum/storyteller_roll/predators_arsenal_examine/roll_datum
+
+/datum/status_effect/predators_arsenal/on_apply()
+ . = ..()
+
+ var/mob/living/carbon/carbon_owner = astype(owner)
+ if(!carbon_owner)
+ return FALSE
+
+ for(var/obj/item/bodypart/limb as anything in carbon_owner.bodyparts)
+ if(!istype(limb, /obj/item/bodypart/arm) && !istype(limb, /obj/item/bodypart/leg))
+ continue
+
+ LAZYADD(affected_bodyparts, WEAKREF(limb))
+ limb.unarmed_sharpness = SHARP_EDGED
+ limb.unarmed_attack_effect = ATTACK_EFFECT_CLAW // This will grant them a bonus 2 dice on attacks
+
+ RegisterSignal(owner, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
+
+/datum/status_effect/predators_arsenal/on_remove()
+ . = ..()
+ for(var/datum/weakref/limb_weakref in affected_bodyparts)
+ var/obj/item/bodypart/limb = limb_weakref.resolve()
+ if(!limb)
+ continue
+ limb.unarmed_sharpness = limb::unarmed_sharpness
+ limb.unarmed_attack_effect = limb::unarmed_attack_effect
+
+ LAZYCLEARLIST(affected_bodyparts)
+ UnregisterSignal(owner, COMSIG_ATOM_EXAMINE)
+
+/datum/status_effect/predators_arsenal/proc/on_examine(atom/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+
+ if(!roll_datum)
+ roll_datum = new()
+
+ var/roll_result = roll_datum.st_roll(user, source)
+ if(roll_result == ROLL_SUCCESS)
+ examine_list += span_warning("[source.p_They()] [source.p_have()] sharp, long claws for hands and [source.p_their()] voice has a strange distortion")
+
+
+/atom/movable/screen/alert/status_effect/gift/predators_arsenal
+ name = /datum/action/cooldown/power/gift/predators_arsenal::name
+ desc = /datum/action/cooldown/power/gift/predators_arsenal::desc
+ overlay_state = /datum/action/cooldown/power/gift/predators_arsenal::button_icon_state
+
+
+/datum/storyteller_roll/predators_arsenal_examine
+ bumper_text = "examine"
+ difficulty = 9
+ applicable_stats = list(STAT_PERCEPTION, STAT_ALERTNESS)
+ roll_output_type = ROLL_FLAG_ROLLER
+ roll_output_type_on_fail = ROLL_FLAG_TARGET
+
+ reroll_cooldown = 1 SCENES
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/lupus/heightened_senses.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/lupus/heightened_senses.dm
new file mode 100644
index 000000000000..8a82ecff9fa6
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/breeds/lupus/heightened_senses.dm
@@ -0,0 +1,93 @@
+/datum/action/cooldown/power/gift/heightened_senses
+ name = "Heightened Senses"
+ desc = "The player gains an uncanncy sense of perception and tracking ability"
+ button_icon_state = "heightened_senses"
+ rank = 1
+ gnosis_cost = 1
+
+/datum/action/cooldown/power/gift/heightened_senses/Activate(atom/target)
+ var/mob/living/living_owner = astype(target)
+ if(!living_owner)
+ return
+
+ . = ..()
+
+ living_owner.apply_status_effect(/datum/status_effect/heightened_senses)
+
+
+/datum/status_effect/heightened_senses
+ id = "heightened_senses"
+ duration = 1 SCENES
+ status_type = STATUS_EFFECT_REFRESH
+ alert_type = /atom/movable/screen/alert/status_effect/gift/heightened_senses
+ var/datum/action/cooldown/uncanny_tracking/tracking_action
+
+/datum/status_effect/heightened_senses/on_apply()
+ RegisterSignal(owner, COMSIG_LIVING_PRE_DICE_ROLLED, PROC_REF(on_dice_rolled))
+
+ tracking_action = new(owner)
+ tracking_action.Grant(owner)
+
+ // This is missing primal urge bonus.
+
+ return TRUE
+
+/datum/status_effect/heightened_senses/on_remove()
+ UnregisterSignal(owner, COMSIG_LIVING_PRE_DICE_ROLLED)
+
+ if(owner)
+ tracking_action.Remove(owner)
+ QDEL_NULL(tracking_action)
+
+/datum/status_effect/heightened_senses/proc/on_dice_rolled(mob/living/roller, datum/storyteller_roll/roll_datum, atom/target, atom/using_item, bonus, difficulty)
+ SIGNAL_HANDLER
+
+ if(STAT_PERCEPTION in roll_datum.applicable_stats)
+ if(iscrinos(roller) || ishispo(roller) || islupus(roller))
+ *difficulty -= 3
+ // In theory:
+ // "this is not cumulative with the ordinary Lupus-form Perception bonuses"
+ // But IDK what those are.
+ else
+ *difficulty -= 2
+
+
+/atom/movable/screen/alert/status_effect/gift/heightened_senses
+ name = /datum/action/cooldown/power/gift/heightened_senses::name
+ desc = /datum/action/cooldown/power/gift/heightened_senses::desc
+ overlay_state = /datum/action/cooldown/power/gift/heightened_senses::button_icon_state
+
+
+/datum/action/cooldown/uncanny_tracking
+ name = "Uncanny Tracking"
+ desc = "Sense the location."
+ button_icon = /datum/action/cooldown/power/gift/heightened_senses::button_icon
+ button_icon_state = /datum/action/cooldown/power/gift/heightened_senses::button_icon_state
+ check_flags = AB_CHECK_CONSCIOUS
+ cooldown_time = 1 SCENES
+
+ var/datum/storyteller_roll/gift/uncanny_tracking/roll_datum
+
+/datum/action/cooldown/uncanny_tracking/Activate(atom/target)
+ var/mob/living/living_owner = astype(owner)
+ if(!living_owner)
+ return
+
+ var/mob/living/living_target = owner?.mind?.guestbook.pick_known_guy(owner)
+ if(!istype(living_target))
+ return
+
+ . = ..()
+
+ if(!roll_datum)
+ roll_datum = new()
+ var/roll_result = roll_datum.st_roll(living_owner, bonus_added = PRIMAL_URGE_PLACEHOLDER)
+
+ if(roll_result != ROLL_SUCCESS)
+ return
+
+ living_owner.create_navigation_line(living_target)
+
+/datum/storyteller_roll/gift/uncanny_tracking
+ applicable_stats = list(STAT_PERCEPTION)
+ difficulty = 8
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/changing_breeds/corax.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/changing_breeds/corax.dm
index c3b282a6ed09..8fd83b69df11 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/changing_breeds/corax.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/changing_breeds/corax.dm
@@ -23,7 +23,7 @@
var/datum/storyteller_roll/gift/enemy_ways/roll_datum = new()
// More successes normally grants geater information.
- var/roll_result = roll_datum.st_roll(owner, bonus = PRIMAL_URGE_PLACEHOLDER)
+ var/roll_result = roll_datum.st_roll(owner, bonus_added = PRIMAL_URGE_PLACEHOLDER)
if(roll_result <= 0)
return TRUE
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_furies.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_furies.dm
index 4e3318dc60ba..88e21e32fc25 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_furies.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_furies.dm
@@ -34,7 +34,7 @@
if(!roll_datum)
roll_datum = new()
roll_datum.difficulty = roll_difficulty
- roll_datum.roll_output_type = ROLL_PRIVATE_AND_TARGET
+ roll_datum.roll_output_type = ROLL_FLAG_ROLLER|ROLL_FLAG_TARGET
var/roll_result = roll_datum.st_roll(caster, target, casting_splat.gnosis)
if(roll_result != ROLL_SUCCESS)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm
index 790a5b14ead1..8b5f1420b5f8 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm
@@ -21,7 +21,10 @@
/datum/action/cooldown/power/gift/desperate_strength/Activate(atom/target)
. = ..()
- var/mob/living/caster = owner
+ var/mob/living/caster = astype(owner)
+ if(!caster)
+ return
+
var/static/list/radial_menu_options = list(
"One" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_one"),
"Two" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_two"),
@@ -31,19 +34,10 @@
)
var/pick = show_radial_menu(owner, owner, radial_menu_options)
- var/value
+ if(!pick)
+ return
- switch(pick)
- if("One")
- value = 1
- if("Two")
- value = 2
- if("Three")
- value = 3
- if("Four")
- value = 4
- if("Five")
- value = 5
+ var/value = word_to_int(pick)
if(!isnull(value))
caster.apply_status_effect(/datum/status_effect/desperate_strength, value)
@@ -69,7 +63,7 @@
playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/desperate_strength_activate.ogg', 75, FALSE)
return TRUE
-/datum/status_effect/desperate_strength/proc/on_dice_rolled(mob/living/roller, datum/storyteller_roll/roll_datum, output)
+/datum/status_effect/desperate_strength/proc/on_dice_rolled(mob/living/roller, datum/storyteller_roll/roll_datum, atom/target, atom/using_item, output)
SIGNAL_HANDLER
if(STAT_STRENGTH in roll_datum.using_stats(roller))
@@ -87,3 +81,21 @@
desc = "Your next roll will be made with bonus strength, at the penalty of bashing damage!"
icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi'
icon_state = "riddle" // TODO: get an icon for this
+
+
+/proc/word_to_int(word)
+ var/static/alist/words_to_number = list(
+ "one" = 1,
+ "two" = 2,
+ "three" = 3,
+ "four" = 4,
+ "five" = 5,
+ "six" = 6,
+ "seven" = 7,
+ "eight" = 8,
+ "nine" = 9,
+ "ten" = 10,
+ )
+
+ word = LOWER_TEXT(word)
+ return words_to_number[word]
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm
index e39bcd411556..a004b83a8f42 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm
@@ -88,7 +88,7 @@
roll_datum = new()
roll_datum.applicable_stats = list(STAT_WITS, STAT_OCCULT)
roll_datum.difficulty = 6
- roll_datum.roll_output_type = ROLL_PRIVATE
+ roll_datum.roll_output_type = ROLL_FLAG_ROLLER
var/roll_result = roll_datum.st_roll(owner)
if(roll_result <= ROLL_FAILURE)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/galestalkers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/galestalkers.dm
index e69de29bb2d1..df6cbae7c7c8 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/galestalkers.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/galestalkers.dm
@@ -0,0 +1,139 @@
+// "Ownership" of an object is impossible to determine so fingerpints were used instead
+/datum/action/cooldown/power/gift/beat_of_the_heartdrum
+ name = "Beat of the Heart-Drum"
+ desc = {"The werewolf becomes an inescapable hunter, drawn ever onward by the beat of his prey's heart until that heart grows still."}
+ button_icon_state = "beat_of_the_heartdrum"
+ rank = 1
+ gnosis_cost = 1
+
+/datum/action/cooldown/power/gift/beat_of_the_heartdrum/Activate(atom/target)
+ var/mob/living/living_owner = astype(owner)
+ if(!living_owner)
+ return FALSE
+
+ /// Non-assoc list while we build a list so we dont have to filter for our own mob every time and can standerdize the name check.
+ var/list/temp_valid_targets = list()
+ var/list/valid_targets = list()
+ // Tasted blood
+ for(var/datum/weakref/blood_ref in living_owner.mobs_tasted_blood_of)
+ var/mob/blood_guy = blood_ref.resolve()
+ if(blood_guy)
+ temp_valid_targets |= blood_guy
+
+ var/obj/item/held_item = living_owner.get_active_held_item()
+ if(held_item)
+ // Ownership (fingerprints)
+ var/list/prints = GET_ATOM_FINGERPRINTS(held_item)
+ if(prints)
+ for(var/mob/living/carbon/to_check as anything in GLOB.carbon_list)
+ if(prints[md5(to_check.dna?.unique_identity)])
+ temp_valid_targets |= to_check
+
+ // Sample of the victum
+ var/datum/reagent/blood/blood = held_item.reagents?.has_reagent(/datum/reagent/blood, check_subtypes = TRUE)
+ var/datum/weakref/donor_ref = blood?.data["donor"]
+ var/mob/living/carbon/human/blood_owner = donor_ref?.resolve()
+ if(blood_owner)
+ temp_valid_targets |= blood_owner
+ var/mob/last_owner = held_item.get_last_inserted_owner()
+ if(last_owner)
+ temp_valid_targets |= last_owner
+
+ for(var/mob/guy in temp_valid_targets)
+ if(guy == living_owner)
+ continue
+ valid_targets[GET_GUESTBOOK_NAME(living_owner, guy)] = guy
+
+ if(!length(valid_targets))
+ to_chat(owner, span_notice("You cant think of any targets you could track at this current moment. Try holding a sample of a target or something they have touched."))
+ return FALSE
+
+
+ var/list/choices = list()
+ for(var/name, entry in valid_targets)
+ var/mob/valid_target = entry
+
+ var/image/target_image = image(icon = valid_target.icon, icon_state = valid_target.icon_state)
+ target_image.overlays = valid_target.overlays
+
+ choices[name] = target_image
+
+ var/tracking_name = show_radial_menu(owner, owner, choices, radius = 40, tooltips = TRUE, autopick_single_option = FALSE)
+
+ if(!tracking_name)
+ return
+
+ . = ..()
+
+ var/datum/storyteller_roll/gift/beat_of_the_heartdrum/roll_datum = new()
+ var/roll_successes = roll_datum.st_roll(owner, target)
+ if(roll_successes <= 0)
+ return TRUE
+
+ to_chat(owner, span_notice("Tracking [tracking_name]"))
+ // Would normally be days but thats commical and 1 day is already the entire round.
+ living_owner.apply_status_effect(/datum/status_effect/beat_of_the_heartdrum, valid_targets[tracking_name], roll_successes HOURS)
+
+
+/datum/status_effect/beat_of_the_heartdrum
+ id = "beat_of_the_heartdrum"
+ duration = 1 SCENES
+ tick_interval = 2 SECONDS
+ status_type = STATUS_EFFECT_REPLACE
+
+ alert_type = /atom/movable/screen/alert/status_effect/gift/beat_of_the_heartdrum
+ var/datum/weakref/hunting_ref
+
+/datum/status_effect/beat_of_the_heartdrum/on_creation(mob/living/new_owner, mob/living/target, duration = 1 SCENES)
+ src.duration = duration
+ hunting_ref = WEAKREF(target)
+ . = ..()
+
+/datum/status_effect/beat_of_the_heartdrum/tick(seconds_between_ticks)
+ if(!owner.client)
+ return
+
+ var/mob/living/target = hunting_ref.resolve()
+ if(!target?.heart_is_beating())
+ return
+
+ var/dist = get_dist_euclidean(owner, target) || 0
+ var/dist_modifier = clamp(dist * 2 - world.maxx / world.maxx, 0.1, 1)
+ var/sound_volume = 100 * dist_modifier
+ SEND_SOUND(owner, sound('sound/effects/singlebeat.ogg', volume = sound_volume))
+
+ var/turf/current_turf = get_step_towards(owner, target)
+ var/image/blip_image = image(icon = 'icons/effects/effects.dmi', icon_state = "blip", layer = HIGH_PIPE_LAYER, loc = current_turf)
+ SET_PLANE(blip_image, GAME_PLANE, current_turf)
+ blip_image.alpha = 255 * dist_modifier
+
+ current_turf.flick_overlay(blip_image, list(owner.client), 0.6 SECONDS)
+
+
+/atom/movable/screen/alert/status_effect/gift/beat_of_the_heartdrum
+ name = /datum/action/cooldown/power/gift/beat_of_the_heartdrum::name
+ desc = /datum/action/cooldown/power/gift/beat_of_the_heartdrum::desc
+ overlay_state = /datum/action/cooldown/power/gift/beat_of_the_heartdrum::button_icon_state
+ clickable_glow = TRUE
+
+/atom/movable/screen/alert/status_effect/gift/beat_of_the_heartdrum/Click(location, control, params)
+ . = ..()
+ to_chat(owner, span_notice("You dispel [name]."))
+ qdel(attached_effect)
+
+/datum/storyteller_roll/gift/beat_of_the_heartdrum
+ bumper_text = "Beat of the Heart-Drum"
+ applicable_stats = list(STAT_PERCEPTION, STAT_SURVIVAL)
+ difficulty = 7
+ numerical = TRUE
+
+
+/// Returns the last mob we would be considered a "sample" off.
+/obj/item/proc/get_last_inserted_owner()
+ return
+
+/obj/item/organ/get_last_inserted_owner()
+ return last_owner?.resolve()
+
+/obj/item/bodypart/get_last_inserted_owner()
+ return last_owner?.resolve()
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/ghostcouncil.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/ghostcouncil.dm
index e69de29bb2d1..7cdff2307105 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/ghostcouncil.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/ghostcouncil.dm
@@ -0,0 +1,71 @@
+/datum/action/cooldown/power/gift/sense_magic
+ name = "Sense Magic"
+ desc = {"The werewolf can sense the pulse and flux of mystic energies, whether the righteous Gifts of the Garou,
+ the arrogant wizardry of mages, the debased powers of vampires, or even the black arts of the Wyrm's minions"}
+ button_icon_state = "sense_magic"
+ cooldown_time = DEFAULT_REROLL_COOLDOWN
+ rank = 1
+ /*
+ /// List of old atoms we already rolled for.
+ var/list/datum/weakref/old_attempts = list()
+ */
+
+/datum/storyteller_roll/gift/sense_magic
+ bumper_text = /datum/action/cooldown/power/gift/sense_magic::name
+ applicable_stats = list(STAT_PERCEPTION, STAT_INVESTIGATION) // DARKPACK TODO - STAT_ENIGMA is not real yet.
+ difficulty = 6
+ numerical = TRUE
+ // hide_result = TRUE
+
+// Not crazy accurate is turns out trying to have a varible difficulty within a single roll makes me want to blow my head off.
+// In theory each source should have a diffrent difficulty and success determine the distance PER FUCKING SOUCE. AGHHHHHHHHHH
+/datum/action/cooldown/power/gift/sense_magic/Activate(atom/target)
+ // Nested before activate to build list before we spawn our own magic after effect.
+ var/list/magic_sources = list()
+ for(var/atom/movable/nearby_atom in orange(owner, DEFAULT_SIGHT_DISTANCE))
+ if(length(nearby_atom.get_magic_sources()))
+ magic_sources += nearby_atom
+
+ . = ..()
+
+ /*
+ for(var/datum/weakref/old_ref in old_attempts)
+ var/atom/resolved = old_ref.resolve()
+ if(!resolved)
+ old_attempts -= old_ref
+ else
+ magic_sources -= resolved
+ */
+
+ var/datum/storyteller_roll/gift/sense_magic/roll_datum = new()
+ var/roll_result = roll_datum.st_roll(owner)
+
+ if(roll_result <= 0)
+ return
+
+ var/list/extra_info = list()
+ for(var/atom/magic_of_intrest in magic_sources)
+ var/turf/current_turf = get_turf(magic_of_intrest)
+ var/image/blip_image = image(icon = 'icons/effects/effects.dmi', icon_state = "purplesparkles", layer = HIGH_PIPE_LAYER, loc = current_turf)
+ SET_PLANE(blip_image, GAME_PLANE, current_turf)
+ if(istype(magic_of_intrest, /obj/effect/abstract/magic_after_effect))
+ blip_image.alpha = blip_image.alpha/2
+ current_turf.flick_overlay(blip_image, list(owner.client), 1 TURNS)
+
+ var/list/object_info = magic_of_intrest.get_magic_sources()
+ if(length(object_info))
+ for(var/datum/magic_information/magic_information in object_info)
+ if(roll_result >= 3)
+ if(magic_information.magic_type)
+ extra_info |= magic_information.magic_type
+ if(roll_result >= 4)
+ if(magic_information.magic_subtype)
+ extra_info |= magic_information.magic_subtype
+
+ if(length(extra_info))
+ to_chat(owner, span_notice("You sense hints of [english_list(extra_info)]."))
+
+ /*
+ for(var/atom/magic_of_intrest in magic_sources)
+ old_attempts += WEAKREF(magic_of_intrest)
+ */
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/glasswalkers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/_glasswalkers.dm
similarity index 100%
rename from modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/glasswalkers.dm
rename to modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/_glasswalkers.dm
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/shadowlords.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/shadowlords.dm
index 9f1432e761a5..b37d56cc6cdb 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/shadowlords.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/shadowlords.dm
@@ -103,7 +103,7 @@
UnregisterSignal(owner, COMSIG_LIVING_PRE_DICE_ROLLED)
-/datum/status_effect/fatal_flaw/proc/on_dice_rolled(mob/living/roller, datum/storyteller_roll/roll_datum, atom/target)
+/datum/status_effect/fatal_flaw/proc/on_dice_rolled(mob/living/roller, datum/storyteller_roll/roll_datum, atom/target, atom/using_item, bonus, difficulty)
SIGNAL_HANDLER
if(!istype(roll_datum, /datum/storyteller_roll/damage))
@@ -112,7 +112,7 @@
if(!target || (target != target_ref?.resolve()))
return
- . += 1 // One extra dice
+ *bonus += 1 // One extra dice
/atom/movable/screen/alert/status_effect/gift/fatal_flaw
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/silver_fangs.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/silver_fangs.dm
index e69de29bb2d1..91cbc6b15f9e 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/silver_fangs.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/silver_fangs.dm
@@ -0,0 +1,71 @@
+/**
+ * The werewolf’s hands or jaws tighten in a mighty death-grip, making it nearly
+ * impossible to escape. A falcon-spirit teaches this Gift.
+ *
+ * System: The player spends one Rage point. For the rest of the scene,
+ * the Garou’s grip (with both hands and jaws) is much stronger — her Strength
+ * is considered three points higher for grappling or maneuvers such as the jaw
+ * lock (see Special Maneuvers, p. 299).
+ * This extra Strength does not apply to damage rolls.
+ **/
+/datum/action/cooldown/power/gift/falcons_grasp
+ name = "Falcon's Grasp"
+ desc = "The Garou's hands or jaws tighten in a mighty death-grip, making it nearly impossible to escape."
+ button_icon_state = "falcons_grasp"
+ cooldown_time = 1 SCENES
+ rank = 1
+ rage_cost = 1
+
+/datum/action/cooldown/power/gift/falcons_grasp/Activate(atom/target)
+ var/mob/living/owner = astype(src.owner)
+ if(isnull(owner))
+ return FALSE
+
+ . = ..()
+ owner.apply_status_effect(/datum/status_effect/falcons_grasp)
+
+
+/datum/status_effect/falcons_grasp
+ id = "falcons_grasp"
+ duration = 1 SCENES
+
+ status_type = STATUS_EFFECT_UNIQUE
+
+ alert_type = /atom/movable/screen/alert/status_effect/gift/falcons_grasp
+
+/datum/status_effect/falcons_grasp/on_apply()
+ . = ..()
+ RegisterSignal(owner, COMSIG_LIVING_PRE_DICE_ROLLED, PROC_REF(apply_grapple_mod))
+ RegisterSignal(owner, COMSIG_LIVING_GRAB, PROC_REF(aggro_grab_hack))
+
+/datum/status_effect/falcons_grasp/on_remove()
+ UnregisterSignal(owner, COMSIG_LIVING_PRE_DICE_ROLLED)
+ return ..()
+
+/datum/status_effect/falcons_grasp/proc/aggro_grab_hack(mob/living/source, mob/living/target)
+ // SIGNAL_HANDLER // it screams about an (unreachable) sleep otherwise
+
+ if(source.pulling || source == target)
+ return NONE // run the default grab code
+
+ . = COMPONENT_SKIP_ATTACK // lets assume that if it doafters we should skip
+ if(source.start_pulling(target, null, MOVE_FORCE_OVERPOWERING, TRUE)) // state arg does nothing :)
+ target.drop_all_held_items()
+ source.setGrabState(GRAB_NECK) //Instant aggressive grab if on grab intent
+ playsound(source.loc, 'sound/items/weapons/thudswoosh.ogg', 50, TRUE, -1)
+ target.visible_message(span_warning("[source] clamp-grabs [target] by [target.p_their()] neck!"), span_warning("[source] clamp-grabs you by your neck!"), null, null, src)
+ to_chat(src, span_notice("You clamp-grab [target] by [target.p_their()] neck!"))
+ return COMPONENT_SKIP_ATTACK
+ return NONE // meh
+
+/datum/status_effect/falcons_grasp/proc/apply_grapple_mod(mob/living/roller, datum/storyteller_roll/roll_datum, atom/target, atom/using_item, bonus, difficulty)
+ SIGNAL_HANDLER
+
+ if(istype(roll_datum, /datum/storyteller_roll/grappling))
+ *bonus += 3
+
+
+/atom/movable/screen/alert/status_effect/gift/falcons_grasp
+ name = /datum/action/cooldown/power/gift/falcons_grasp::name
+ desc = "For the rest of the scene, you gain a +3 bonus to grappling rolls, and your grabs instantly escalate to neck grabs."
+ overlay_state = /datum/action/cooldown/power/gift/falcons_grasp::button_icon_state
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/star_gazers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/star_gazers.dm
index e69de29bb2d1..59b35c82e73c 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/star_gazers.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/star_gazers.dm
@@ -0,0 +1,63 @@
+/datum/action/cooldown/power/gift/channeling
+ name = "Channeling"
+ desc = "The user burns 1 to 3 rage in exchange for that many bonus dice on there next roll."
+ button_icon_state = "channeling"
+ rank = 1
+ rage_cost = 1
+ handles_spend_resources = TRUE
+
+/datum/action/cooldown/power/gift/channeling/Activate(atom/target)
+ var/mob/living/caster = astype(owner)
+ if(!caster)
+ return
+
+ var/static/list/radial_menu_options = list(
+ "One" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_one"),
+ "Two" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_two"),
+ "Three" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_three"),
+ )
+
+ var/pick = show_radial_menu(owner, owner, radial_menu_options)
+ if(!pick)
+ return
+
+ . = ..()
+
+ rage_cost = word_to_int(pick)
+
+ if(can_afford(TRUE))
+ spend_resources()
+ caster.apply_status_effect(/datum/status_effect/channeling, rage_cost)
+
+ rage_cost = 1
+ return TRUE
+
+/datum/status_effect/channeling
+ id = "channeling"
+ duration = STATUS_EFFECT_PERMANENT
+
+ status_type = STATUS_EFFECT_UNIQUE
+
+ alert_type = /atom/movable/screen/alert/status_effect/gift/channeling
+ /// Passed in by the gift's activate
+ var/value
+
+/datum/status_effect/channeling/on_creation(mob/living/owner, value)
+ src.value = value
+ RegisterSignal(owner, COMSIG_LIVING_PRE_DICE_ROLLED, PROC_REF(on_dice_rolled))
+ return ..()
+
+/datum/status_effect/channeling/proc/on_dice_rolled(mob/living/roller, datum/storyteller_roll/roll_datum, atom/target, atom/using_item, bonus, difficulty)
+ SIGNAL_HANDLER
+
+ *bonus += value
+
+ qdel(src)
+
+/datum/status_effect/channeling/on_remove()
+ UnregisterSignal(owner, COMSIG_LIVING_PRE_DICE_ROLLED)
+
+/atom/movable/screen/alert/status_effect/gift/channeling
+ name = /datum/action/cooldown/power/gift/channeling::name
+ desc = "Your next roll will will get extra dice added to that roll"
+ overlay_state = /datum/action/cooldown/power/gift/channeling::button_icon_state
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/glyphs.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/glyphs.dm
index f7c779af409c..5a09616947f7 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/glyphs.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/glyphs.dm
@@ -162,3 +162,579 @@
garou_name = "war against wyrm glyph"
garou_desc = "A glyph that represents the apocalyptic war of the Garou against the Wyrm."
icon_state = "war_against_wyrm"
+
+/obj/effect/decal/garou_glyph/black_furies
+ name = "rooted glyph"
+ garou_name = "black furies glyph"
+ garou_desc = "A glyph that represents the Black Furies, one of the Garou Tribes."
+ icon_state = "black_furies"
+
+/obj/effect/decal/garou_glyph/bonegnawers
+ name = "smudged glyph"
+ garou_name = "bonegnawer glyph"
+ garou_desc = "A glyph that represents the Bonegnawers, one of the Garou Tribes."
+ icon_state = "bonegnawers"
+
+/obj/effect/decal/garou_glyph/children_of_gaia
+ name = "relaxing glyph"
+ garou_name = "children of gaia glyph"
+ garou_desc = "A glyph that represents the Children of Gaia, one of the Garou Tribes."
+ icon_state = "children_of_gaia"
+
+/obj/effect/decal/garou_glyph/fianna
+ name = "musical glyph"
+ garou_name = "fianna glyph"
+ garou_desc = "A glyph that represents the Fianna, one of the Garou Tribes."
+ icon_state = "fianna"
+
+/obj/effect/decal/garou_glyph/get_of_fenris
+ name = "jagged glyph"
+ garou_name = "get of fenris glyph"
+ garou_desc = "A glyph that represents the Get of Fenris, one of the Garou Tribes."
+ icon_state = "get_of_fenris"
+
+/obj/effect/decal/garou_glyph/red_talons
+ name = "clawed glyph"
+ garou_name = "red talon glyph"
+ garou_desc = "A glyph that represents the Red Talons, one of the Garou Tribes."
+ icon_state = "red_talons"
+
+/obj/effect/decal/garou_glyph/shadow_lords
+ name = "veiled glyph"
+ garou_name = "shadow lord glyph"
+ garou_desc = "A glyph that represents the Shadow Lords, one of the Garou Tribes."
+ icon_state = "shadow_lords"
+
+/obj/effect/decal/garou_glyph/silent_striders
+ name = "wavy glyph"
+ garou_name = "silent striders glyph"
+ garou_desc = "A glyph that represents the Silent Striders, one of the Garou Tribes."
+ icon_state = "silent_striders"
+
+/obj/effect/decal/garou_glyph/silver_fangs
+ name = "illustrious glyph"
+ garou_name = "silver fang glyph"
+ garou_desc = "A glyph that represents the Silver Fangs, one of the Garou Tribes."
+ icon_state = "silver_fangs"
+
+/obj/effect/decal/garou_glyph/stargazers
+ name = "auspicious glyph"
+ garou_name = "stargazers glyph"
+ garou_desc = "A glyph that represents the Stargazers, a Garou tribe which has since left the nation."
+ icon_state = "stargazers"
+
+/obj/effect/decal/garou_glyph/ghost_council
+ name = "watchful glyph"
+ garou_name = "ghost council glyph"
+ garou_desc = "A glyph that represents the Ghost Council, one of the Garou Tribes."
+ icon_state = "ghost_council"
+
+/obj/effect/decal/garou_glyph/ronin
+ name = "messy glyph"
+ garou_name = "ronin glyph"
+ garou_desc = "A glyph that represents the Ronin, loners who exist out of a tribe and can rarely be trusted."
+ icon_state = "ronin"
+
+/obj/effect/decal/garou_glyph/ratkin
+ name = "ominous glyph"
+ garou_name = "ratkin glyph"
+ garou_desc = "A glyph that represents the Ratkin, the Fera with the power to shift between man and rat."
+ icon_state = "ratkin"
+
+/obj/effect/decal/garou_glyph/corax
+ name = "flashy glyph"
+ garou_name = "corax glyph"
+ garou_desc = "A glyph that represents the Corax, the Fera with the power to shift between man and raven."
+ icon_state = "corax"
+
+/obj/effect/decal/garou_glyph/sept_of_western_eye
+ name = "elaborate glyph"
+ garou_name = "sept of western eye glyph"
+ garou_desc = "A glyph that represents the Sept of Western Eye, who watch over Gaia's sacred places hidden around San Francisco and its outskirts."
+ icon_state = "sept_of_western_eye"
+
+/obj/effect/decal/garou_glyph/bastet
+ name = "fanged glyph"
+ garou_name = "bastet glyph"
+ garou_desc = "A glyph that represents the Bastet, the Fera with the power to shift between man and feline."
+ icon_state = "bastet"
+
+/obj/effect/decal/garou_glyph/gurahl
+ name = "large glyph"
+ garou_name = "gurahl glyph"
+ garou_desc = "A glyph that represents the Gurahl, the Fera with the power to shift between man and bear."
+ icon_state = "gurahl"
+
+/obj/effect/decal/garou_glyph/rokea
+ name = "watery glyph"
+ garou_name = "rokea glyph"
+ garou_desc = "A glyph that represents the Rokea, the Fera with the power to shift between man and shark."
+ icon_state = "rokea"
+
+/obj/effect/decal/garou_glyph/corax_safe
+ name = "crude marking"
+ garou_name = "corax safety glyph"
+ garou_desc = "A Corax glyph that marks a space as safe."
+ icon_state = "corax_safe"
+
+/obj/effect/decal/garou_glyph/corax_danger
+ name = "strange lines"
+ garou_name = "corax danger glyph"
+ garou_desc = "A Corax glyph that marks a space as dangerous."
+ icon_state = "corax_danger"
+
+/obj/effect/decal/garou_glyph/corax_wyrm_spirits
+ name = "crude symbols"
+ garou_name = "corax wyrm spirit glyph"
+ garou_desc = "A Corax glyph that warns of the presence of Wyrm spirits."
+ icon_state = "corax_wyrm_spirits"
+
+/obj/effect/decal/garou_glyph/corax_weaver_spirits
+ name = "scratch marks"
+ garou_name = "corax weaver spirit glyph"
+ garou_desc = "A Corax glyph that warns of the presence of Weaver spirits."
+ icon_state = "corax_weaver_spirits"
+
+/obj/effect/decal/garou_glyph/corax_food
+ name = "oddly arranged dots"
+ garou_name = "corax food glyph"
+ garou_desc = "A Corax glyph that highlights the presence of food or a slaughter."
+ icon_state = "corax_food"
+
+/obj/effect/decal/garou_glyph/corax_party
+ name = "crude etching"
+ garou_name = "corax party glyph"
+ garou_desc = "A Corax glyph showcasing the locale of a party or celebration of sorts."
+ icon_state = "corax_party"
+
+/obj/effect/decal/garou_glyph/lodge_of_the_moon
+ name = "roof glyph"
+ garou_name = "moon lodge glyph"
+ garou_desc = "A glyph that represents the Moon Lodge, one of the two lodges of the Silver Fang, focused on spiritual matters."
+ icon_state = "lodge_of_the_moon"
+
+/obj/effect/decal/garou_glyph/lodge_of_the_sun
+ name = "shiny glyph"
+ garou_name = "sun lodge glyph"
+ garou_desc = "A glyph that represents the Sun Lodge, one of the two lodges of the Silver Fang, focused on worldly matters."
+ icon_state = "lodge_of_the_sun"
+
+/obj/effect/decal/garou_glyph/house_austere_howl
+ name = "smoke glyph"
+ garou_name = "house austere glyph"
+ garou_desc = "A glyph that represents House Austere, one of the seven houses of the Silver Fang tribe."
+ icon_state = "house_austere_howl"
+
+/obj/effect/decal/garou_glyph/house_blood_red_crest
+ name = "crying glyph"
+ garou_name = "house blood-red crest glyph"
+ garou_desc = "A glyph that represents House Blood-Red Crest, one of the seven houses of the Silver Fang tribe."
+ icon_state = "house_blood_red_crest"
+
+/obj/effect/decal/garou_glyph/house_crescent_moon
+ name = "curved glyph"
+ garou_name = "house crescent moon glyph"
+ garou_desc = "A glyph that represents House Crescent Moon, one of the seven houses of the Silver Fang tribe."
+ icon_state = "house_crescent_moon"
+
+/obj/effect/decal/garou_glyph/house_gleaming_eye
+ name = "gazing glyph"
+ garou_name = "house gleaming eye glyph"
+ garou_desc = "A glyph that represents House Gleaming Eye, one of the seven houses of the Silver Fang tribe."
+ icon_state = "house_gleaming_eye"
+
+/obj/effect/decal/garou_glyph/house_unbreakable_hearth
+ name = "sturdy glyph"
+ garou_name = "house unbreakable hearth glyph"
+ garou_desc = "A glyph that represents House Unbreakable Hearth, one of the seven houses of the Silver Fang tribe."
+ icon_state = "house_unbreakable_hearth"
+
+/obj/effect/decal/garou_glyph/house_wise_heart
+ name = "knowing glyph"
+ garou_name = "house wise heart glyph"
+ garou_desc = "A glyph that represents House Wise Heart, one of the seven houses of the Silver Fang tribe."
+ icon_state = "house_wise_heart"
+
+/obj/effect/decal/garou_glyph/house_wyrmfoe
+ name = "shredded glyph"
+ garou_name = "house wyrmfoe glyph"
+ garou_desc = "A glyph that represents House Wyrmfoe, one of the seven houses of the Silver Fang tribe."
+ icon_state = "house_wyrmfoe"
+
+/obj/effect/decal/garou_glyph/siberakh
+ name = "unusual glyph"
+ garou_name = "siberakh glyph"
+ garou_desc = "A glyph that represents the Siberakh, a secretive tribe known only to the Silver Fangs and Galestalkers."
+ icon_state = "siberakh"
+
+/obj/effect/decal/garou_glyph/impergium
+ name = "fear-inducing glyph"
+ garou_name = "impergium glyph"
+ garou_desc = "A glyph that represents the Impergium, the time when Garou hunted man also known as the First War."
+ icon_state = "impergium"
+
+/obj/effect/decal/garou_glyph/litany
+ name = "pointed glyph"
+ garou_name = "litany glyph"
+ garou_desc = "A glyph that represents the Litany, the sacred laws of which all of the Garou Nation are bound to follow."
+ icon_state = "litany"
+
+/obj/effect/decal/garou_glyph/pack
+ name = "square glyph"
+ garou_name = "pack glyph"
+ garou_desc = "A glyph that represents the pack, the closest-knit unit of the Garou."
+ icon_state = "pack"
+
+/obj/effect/decal/garou_glyph/moot
+ name = "bowl glyph"
+ garou_name = "moot glyph"
+ garou_desc = "A glyph that represents a moot, a great gathering of Garou."
+ icon_state = "moot"
+
+/obj/effect/decal/garou_glyph/weaver
+ name = "grid glyph"
+ garou_name = "weaver glyph"
+ garou_desc = "A glyph that represents the Weaver, primal spirit of stasis and immutability."
+ icon_state = "weaver"
+
+/obj/effect/decal/garou_glyph/defiler_wyrm
+ name = "tempting glyph"
+ garou_name = "defiler wyrm glyph"
+ garou_desc = "A glyph that represents the Defiler Wyrm, the corrupting aspect of the Triatic Wyrm."
+ icon_state = "defiler_wyrm"
+
+/obj/effect/decal/garou_glyph/beast_of_war
+ name = "dangerous glyph"
+ garou_name = "beast of war glyph"
+ garou_desc = "A glyph that represents the Beast of War, the violent aspect of the Triatic Wyrm."
+ icon_state = "beast_of_war"
+
+/obj/effect/decal/garou_glyph/eater_of_souls
+ name = "empty glyph"
+ garou_name = "eater of souls glyph"
+ garou_desc = "A glyph that represents the Eater of Souls, the creation-hungry aspect of the Triatic Wyrm."
+ icon_state = "eater_of_souls"
+
+/obj/effect/decal/garou_glyph/wyld
+ name = "chaotic glyph"
+ garou_name = "wyld glyph"
+ garou_desc = "A glyph that represents the Wyld, the primal spirit of life and creation."
+ icon_state = "wyld"
+
+/obj/effect/decal/garou_glyph/umbra
+ name = "inconspicuous glyph"
+ garou_name = "umbra glyph"
+ garou_desc = "A glyph that represents the Umbra, the realm of spirits that exists sideways of the physical plane."
+ icon_state = "umbra"
+
+/obj/effect/decal/garou_glyph/luna
+ name = "circle glyph"
+ garou_name = "luna glyph"
+ garou_desc = "A glyph that represents Luna, the moon spirit which granted the Garou their rage."
+ icon_state = "luna"
+
+/obj/effect/decal/garou_glyph/helios
+ name = "compass glyph"
+ garou_name = "helios glyph"
+ garou_desc = "A glyph that represents Helios, the sun spirit which granted the Corax their light."
+ icon_state = "helios"
+
+/obj/effect/decal/garou_glyph/fish
+ name = "fishy glyph"
+ garou_name = "fish glyph"
+ garou_desc = "A glyph that represents fish."
+ icon_state = "fish"
+
+/obj/effect/decal/garou_glyph/forest
+ name = "small glyph"
+ garou_name = "forest glyph"
+ garou_desc = "A glyph that represents the forest."
+ icon_state = "forest"
+
+/obj/effect/decal/garou_glyph/ally
+ name = "reassuring glyph"
+ garou_name = "ally glyph"
+ garou_desc = "A glyph that represents an alliance."
+ icon_state = "ally"
+
+/obj/effect/decal/garou_glyph/rite
+ name = "subtle glyph"
+ garou_name = "rite glyph"
+ garou_desc = "A glyph that represents a rite, the sacred rituals of the Fera."
+ icon_state = "rite"
+
+/obj/effect/decal/garou_glyph/moon_bridge
+ name = "crossed glyph"
+ garou_name = "moon bridge glyph"
+ garou_desc = "A glyph that represents a moon bridge, that which allows for travel between the physical plane and the Umbra."
+ icon_state = "moon_bridge"
+
+/obj/effect/decal/garou_glyph/chimera
+ name = "imposing glyph"
+ garou_name = "chimera glyph"
+ garou_desc = "A glyph that represents Chimera, the totem spirit of the Stargazers."
+ icon_state = "chimera"
+
+/obj/effect/decal/garou_glyph/cockroach
+ name = "gross glyph"
+ garou_name = "cockroach glyph"
+ garou_desc = "A glyph that represents Cockroach, the totem spirit of the Glasswalkers."
+ icon_state = "cockroach"
+
+/obj/effect/decal/garou_glyph/falcon
+ name = "gazing glyph"
+ garou_name = "falcon glyph"
+ garou_desc = "A glyph that represents Falcon, the totem spirit of the Silver Fangs."
+ icon_state = "falcon"
+
+/obj/effect/decal/garou_glyph/fenris
+ name = "carved glyph"
+ garou_name = "fenris glyph"
+ garou_desc = "A glyph that represents Fenris, the totem spirit of the Get of Fenris."
+ icon_state = "fenris"
+
+/obj/effect/decal/garou_glyph/griffin
+ name = "unsettling glyph"
+ garou_name = "griffin glyph"
+ garou_desc = "A glyph that represents Griffin, the totem spirit of the Red Talons."
+ icon_state = "griffin"
+
+/obj/effect/decal/garou_glyph/owl
+ name = "perched glyph"
+ garou_name = "owl glyph"
+ garou_desc = "A glyph that represents Owl, the totem spirit of the Silent Striders."
+ icon_state = "owl"
+
+/obj/effect/decal/garou_glyph/grandfather_thunder
+ name = "weathered glyph"
+ garou_name = "grandfather thunder glyph"
+ garou_desc = "A glyph that represents Grandfather Thunder, the totem spirit of the Shadow Lords."
+ icon_state = "grandfather_thunder"
+
+/obj/effect/decal/garou_glyph/pegasus
+ name = "swift glyph"
+ garou_name = "pegasus glyph"
+ garou_desc = "A glyph that represents Pegasus, the totem spirit of the Black Furies."
+ icon_state = "pegasus"
+
+/obj/effect/decal/garou_glyph/rat
+ name = "nasty glyph"
+ garou_name = "rat glyph"
+ garou_desc = "A glyph that represents Rat, the totem spirit of the Bonegnawers."
+ icon_state = "rat"
+
+/obj/effect/decal/garou_glyph/stag
+ name = "horned glyph"
+ garou_name = "stag glyph"
+ garou_desc = "A glyph that represents Stag, the totem spirit of the Fianna."
+ icon_state = "stag"
+
+/obj/effect/decal/garou_glyph/horned_serpent
+ name = "slithery glyph"
+ garou_name = "horned serpent glyph"
+ garou_desc = "A glyph that represents Horned Serpent, the totem spirit of the Galestalkers."
+ icon_state = "horned_serpent"
+
+/obj/effect/decal/garou_glyph/unicorn
+ name = "noble glyph"
+ garou_name = "unicorn glyph"
+ garou_desc = "A glyph that represents Unicorn, the totem spirit of the Children of Gaia."
+ icon_state = "unicorn"
+
+/obj/effect/decal/garou_glyph/north_wind
+ name = "simple glyph"
+ garou_name = "north wind glyph"
+ garou_desc = "A glyph that represents North Wind, the totem spirit of the Ghost Council."
+ icon_state = "north_wind"
+
+/obj/effect/decal/garou_glyph/gun
+ name = "smoking glyph"
+ garou_name = "gun glyph"
+ garou_desc = "A glyph that represents a gun."
+ icon_state = "gun"
+
+/obj/effect/decal/garou_glyph/path
+ name = "meandering glyph"
+ garou_name = "path glyph"
+ garou_desc = "A glyph that represents a pathway."
+ icon_state = "path"
+
+/obj/effect/decal/garou_glyph/urge_wyrm
+ name = "alluring glyph"
+ garou_name = "urge wyrm glyph"
+ garou_desc = "A glyph that represents the Urge Wyrms, spiritual entities that can corrupt the mind."
+ icon_state = "urge_wyrm"
+
+/obj/effect/decal/garou_glyph/radiation
+ name = "glowing glyph"
+ garou_name = "radiation glyph"
+ garou_desc = "A glyph that represents radiation, that which can defile life like little else can."
+ icon_state = "radiation"
+
+/obj/effect/decal/garou_glyph/spirit
+ name = "abstract glyph"
+ garou_name = "spirit glyph"
+ garou_desc = "A glyph that represents a spiritual presence."
+ icon_state = "spirit"
+
+/obj/effect/decal/garou_glyph/mend
+ name = "cross glyph"
+ garou_name = "mend glyph"
+ garou_desc = "A glyph that represents a call to mend or repair a place, thing, or person."
+ icon_state = "mend"
+
+/obj/effect/decal/garou_glyph/safety
+ name = "reassuring glyph"
+ garou_name = "safety glyph"
+ garou_desc = "A glyph that represents a place of safety."
+ icon_state = "safety"
+
+/obj/effect/decal/garou_glyph/suffering
+ name = "upsetting glyph"
+ garou_name = "suffering glyph"
+ garou_desc = "A glyph that represents a state or place of suffering."
+ icon_state = "suffering"
+
+/obj/effect/decal/garou_glyph/regeneration
+ name = "calming glyph"
+ garou_name = "regeneration glyph"
+ garou_desc = "A glyph that represents a state or place of regeneration and healing."
+ icon_state = "regeneration"
+
+/obj/effect/decal/garou_glyph/storm
+ name = "lightning glyph"
+ garou_name = "storm glyph"
+ garou_desc = "A glyph that represents a storm, in all its might."
+ icon_state = "storm"
+
+/obj/effect/decal/garou_glyph/story
+ name = "weird glyph"
+ garou_name = "story glyph"
+ garou_desc = "A glyph that represents a place of storytelling, or is used to tell a story in glyphs."
+ icon_state = "story"
+
+/obj/effect/decal/garou_glyph/totem
+ name = "involved glyph"
+ garou_name = "totem glyph"
+ garou_desc = "A glyph that represents a totem, a spirit which watches over a tribe of Garou."
+ icon_state = "totem"
+
+/obj/effect/decal/garou_glyph/cyberrealm
+ name = "messy glyph"
+ garou_name = "cyberrealm glyph"
+ garou_desc = "A glyph that represents CyberRealm, the spiritual realm of the internet."
+ icon_state = "cyberspace"
+
+/obj/effect/decal/garou_glyph/wolfhome
+ name = "feral glyph"
+ garou_name = "wolfhome glyph"
+ garou_desc = "A glyph that represents Wolfhome, a a primeval spirit realm of endless forest in which dwell the spirits of wolf packs and their prey."
+ icon_state = "wolfhome"
+
+/obj/effect/decal/garou_glyph/malfeas
+ name = "bone-chilling glyph"
+ garou_name = "malfeas glyph"
+ garou_desc = "A glyph that represents Malfeas, a dark realm of the Umbra that lies within the Maw of the Wyrm."
+ icon_state = "malfeas"
+
+/obj/effect/decal/garou_glyph/aetherial
+ name = "dazzling glyph"
+ garou_name = "aetherial glyph"
+ garou_desc = "A glyph that represents the Aetherial, an umbral realm housing the Spirit Wilds."
+ icon_state = "aetherial"
+
+/obj/effect/decal/garou_glyph/arcadia_gateway
+ name = "loopy glyph"
+ garou_name = "arcadia gateway glyph"
+ garou_desc = "A glyph that represents the Arcadia Gateway, a land resembling the mythical home of the Fae deep in the Middle Umbra."
+ icon_state = "arcadia_gateway"
+
+/obj/effect/decal/garou_glyph/atrocity_realm
+ name = "fetid glyph"
+ garou_name = "atrocity realm glyph"
+ garou_desc = "A glyph that represents the Atrocity Realm, the breeding ground of Banes."
+ icon_state = "atrocity_realm"
+
+/obj/effect/decal/garou_glyph/battleground
+ name = "tattered glyph"
+ garou_name = "battleground glyph"
+ garou_desc = "A glyph that represents Battleground, the Near Realm which contains all battles and conflict ever fought."
+ icon_state = "battleground"
+
+/obj/effect/decal/garou_glyph/erebus
+ name = "pointed glyph"
+ garou_name = "erebus glyph"
+ garou_desc = "A glyph that represents Erebus, a realm of spiritual cleansing often compared to hell."
+ icon_state = "erebus"
+
+/obj/effect/decal/garou_glyph/flux
+ name = "wild glyph"
+ garou_name = "flux glyph"
+ garou_desc = "A glyph that represents the Flux, a Near Realm of pure, undiluted Wyld energy untouched by the Weaver."
+ icon_state = "flux"
+
+/obj/effect/decal/garou_glyph/legendary_realm
+ name = "powerful glyph"
+ garou_name = "legendary realm glyph"
+ garou_desc = "A glyph that represents the Legendary Realm, the place Garou can walk to live the lives of their ancestors."
+ icon_state = "legendary_realm"
+
+/obj/effect/decal/garou_glyph/pangaea
+ name = "primal glyph"
+ garou_name = "pangaea glyph"
+ garou_desc = "A glyph that represents Pangaea, a Middle Realm reflecting the Earth as it was before civilization, history, and the end of the Impergium."
+ icon_state = "pangaea"
+
+/obj/effect/decal/garou_glyph/the_scar
+ name = "ugly glyph"
+ garou_name = "scar glyph"
+ garou_desc = "A glyph that represents the Scar, the Near Realm which reflects the industrial revolution, its oppression and pollution."
+ icon_state = "the_scar"
+
+/obj/effect/decal/garou_glyph/summer_country
+ name = "impressive glyph"
+ garou_name = "summer country glyph"
+ garou_desc = "A glyph that represents the Summer Country, a quickly fading Middle Realm that is said to embody Gaia's pure love for her children."
+ icon_state = "summer_country"
+
+/obj/effect/decal/garou_glyph/pollution
+ name = "arched glyph"
+ garou_name = "pollution glyph"
+ garou_desc = "A glyph that represents pollution, the industrial spread of the Wyrm's taint."
+ icon_state = "pollution"
+
+/obj/effect/decal/garou_glyph/ananasi
+ name = "spindly glyph"
+ garou_name = "ananasi glyph"
+ garou_desc = "A glyph that represents the Ananasi, the Fera blessed with the power to shift between man and spider."
+ icon_state = "ananasi"
+
+/obj/effect/decal/garou_glyph/nagah
+ name = "fanged glyph"
+ garou_name = "nagah glyph"
+ garou_desc = "A glyph that represents the Nagah, the Fera blessed with the power to shift between man and snake."
+ icon_state = "nagah"
+
+/obj/effect/decal/garou_glyph/fire
+ name = "smokey glyph"
+ garou_name = "fire glyph"
+ garou_desc = "A glyph that represents fire, a primeval force of destruction."
+ icon_state = "fire"
+
+/obj/effect/decal/garou_glyph/bane
+ name = "concerning glyph"
+ garou_name = "bane glyph"
+ garou_desc = "A glyph that represents the presence of Banes, spirits corrupted by the Wyrm."
+ icon_state = "bane"
+
+/obj/effect/decal/garou_glyph/fomori
+ name = "boxed glyph"
+ garou_name = "fomori glyph"
+ garou_desc = "A glyph that represents the Fomori, a diverse group of bane-possessed mortals mutated by the Wyrm's servants."
+ icon_state = "fomori"
+
+/obj/effect/decal/garou_glyph/therapy
+ name = "relaxing glyph"
+ garou_name = "therapy glyph"
+ garou_desc = "A glyph that represents a state or place of therapy."
+ icon_state = "therapy"
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_organs.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_organs.dm
index 2f3adc1dbe06..e5beedc8e2e4 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_organs.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_organs.dm
@@ -78,6 +78,8 @@
/obj/item/organ/tongue/fera
name = "exotic tongue"
languages_native = list(/datum/language/garou_tongue, /datum/language/primal_tongue)
+ disliked_foodtypes = GROSS | CLOTH | BUGS
+ toxic_foodtypes = TOXIC | CHOCOLATE
// Garou tongues can speak all default + garou tongue
/obj/item/organ/tongue/fera/get_possible_languages()
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 b8e3379968e4..9d4edebf2d82 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
@@ -102,7 +102,6 @@
/datum/species/human/shifter/proc/get_fur_color(mob/living/carbon/human/human)
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)
@@ -123,7 +122,7 @@
if(shifter_splat)
icon_to_use = shifter_splat.mob_icons[id]
- return icon_to_use ? icon_to_use : fallback_icon
+ return icon_to_use || fallback_icon
/datum/species/human/shifter/update_body_parts(mob/living/carbon/human/human)
if(!custom_body_render)
@@ -279,6 +278,8 @@
)
form_causes_delirium = TRUE
veil_breaching_form = TRUE
+
+ skinned_type = /obj/item/stack/sheet/animalhide/generic
species_language_holder = /datum/language_holder/crinos
mutanttongue = /obj/item/organ/tongue/fera
bodypart_overrides = list(
@@ -317,6 +318,7 @@
)
veil_breaching_form = TRUE
+ skinned_type = /obj/item/stack/sheet/animalhide/generic
mutantbrain = /obj/item/organ/brain/fera
mutanttongue = /obj/item/organ/tongue/fera
species_language_holder = /datum/language_holder/primal
@@ -356,6 +358,7 @@
TRAIT_NO_CUFF,
)
+ skinned_type = /obj/item/stack/sheet/animalhide/generic
mutantbrain = /obj/item/organ/brain/fera
mutanttongue = /obj/item/organ/tongue/fera
species_language_holder = /datum/language_holder/primal
@@ -398,6 +401,7 @@
if(HAS_TRAIT(human, TRAIT_FERA_FLIGHT))
REMOVE_TRAIT(human, TRAIT_WADDLING, INNATE_TRAIT)
+
/datum/movespeed_modifier/shifter
abstract_type = /datum/movespeed_modifier/shifter
movetypes = GROUND
@@ -407,3 +411,45 @@
/datum/movespeed_modifier/shifter/feral
multiplicative_slowdown = -0.35
+
+// Handles simulating bootleg 'soak'; uses fortitude values.
+// More of a stop-gap till a soak/better system for Garou is added to simulate vampire-soaking.
+/datum/species/human/shifter/war/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load, regenerate_icons)
+ . = ..()
+
+ human_who_gained_species.apply_status_effect(/datum/status_effect/werewolf_soaking)
+
+/datum/species/human/shifter/war/on_species_loss(mob/living/carbon/human/human, datum/species/new_species, pref_load)
+ . = ..()
+
+ human.remove_status_effect(/datum/status_effect/werewolf_soaking)
+
+// Crap way of doing it, but adds it as a status effect to avoid issues with mob's base armor physiology
+/datum/status_effect/werewolf_soaking
+ id = "werewolf_soak"
+ status_type = STATUS_EFFECT_REPLACE
+ alert_type = null
+
+/datum/status_effect/werewolf_soaking/on_apply()
+ . = ..()
+ if (!.)
+ return
+ owner.add_inner_armor(/datum/armor/werewolf)
+
+/datum/status_effect/werewolf_soaking/on_remove()
+ . = ..()
+ owner.remove_inner_armor(/datum/armor/werewolf)
+
+// Equal to Fortitude 4; 4x15 (60) for bash, 4x10 (40) for agg on fort 4
+// If it's too weak you can tune up to Fort 5 (75 bash and 60 agg) but that felt too strong when tried w/ Garou passive regen values.
+/datum/armor/werewolf
+ acid = 40
+ bio = 40
+ bomb = 60
+ bullet = 60
+ consume = 60
+ energy = 60
+ laser = 60
+ fire = 40
+ melee = 60
+ wound = 60
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/transformation.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/transformation.dm
index b9c56ec83719..b1d68119ffc2 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/transformation.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/transformation.dm
@@ -8,7 +8,7 @@
bumper_text = "banned transformation bypass"
applicable_stats = list(STAT_PERMANENT_WILLPOWER)
difficulty = 8
- roll_output_type = ROLL_PRIVATE
+ roll_output_type = ROLL_FLAG_ROLLER
// Remeber if you remove homid being species that this will break.
/datum/splat/werewolf/shifter/proc/transform_fera(datum/species/human/shifter/form_to_transform, costs_rage = FALSE, requires_roll = TRUE, force = FALSE)
@@ -93,7 +93,7 @@
ASYNC // We dont return anything important to death and we want to be able to sleep for metamorph
if(HAS_TRAIT(owner, TRAIT_METAMORPH))
var/datum/storyteller_roll/metamorph/roll_datum = new()
- if(roll_datum.st_roll(owner, bonus = PRIMAL_URGE_PLACEHOLDER) == ROLL_SUCCESS)
+ if(roll_datum.st_roll(owner, bonus_added = PRIMAL_URGE_PLACEHOLDER) == ROLL_SUCCESS)
// First valid use of timeout discovered (we dont want to be able to hold it out)
var/choice = tgui_input_list(owner, "Revert to your choosen form", "Metamorph", transformation_list, get_breed_form_species(), 1 TURNS)
if(choice in transformation_list)
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 440d6dbfefbe..9376ebc11653 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
@@ -165,8 +165,9 @@
var/can_passively_heal = !(is_breed_form() && (get_breed_form_species() != /datum/species/human/shifter/war))
if(COOLDOWN_FINISHED(src, passive_healing_cd))
if(can_passively_heal)
- // 2 to represent lethal. Fera passive regen closes burn, but not aggravated damage.
- owner.heal_storyteller_health(2, heal_aggravated = FALSE, heal_scars = TRUE, heal_blood = TRUE, heal_burn = TRUE)
+ // 2 to represent lethal. Fera passive regen closes burn (if we've the "can heal burn" gift), but not aggravated damage.
+ var/can_heal_burn = !!owner.has_status_effect(/datum/status_effect/master_of_fire)
+ owner.heal_storyteller_health(2, heal_aggravated = FALSE, heal_scars = TRUE, heal_blood = TRUE, heal_burn = can_heal_burn)
// Keep organ healing ticking so internal damage recovers even between major regrowth pulses.
owner.adjust_organ_loss(ORGAN_SLOT_BRAIN, -0.5 * seconds_per_tick, required_organ_flag = ORGAN_ORGANIC)
owner.adjust_organ_loss(ORGAN_SLOT_HEART, -0.5 * seconds_per_tick, required_organ_flag = ORGAN_ORGANIC)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/garou.dm
index 5c97ce104781..c75dbb25c6b2 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/garou.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/garou.dm
@@ -5,12 +5,22 @@
/datum/subsplat/werewolf/breed_form/garou/homid
name = BREED_GAROU_HOMID
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/apecrafts_blessings,
+ /datum/action/cooldown/power/gift/city_running,
+ /datum/action/cooldown/power/gift/master_of_fire,
+ )
start_gnosis = 1
breed_species = /datum/species/human/shifter/homid
/datum/subsplat/werewolf/breed_form/garou/crinos
name = BREED_CRINOS
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/primal_anger,
+ // /datum/action/cooldown/power/gift/sense_wyrm, // DARKPACK TODO - (Selectable Gifts)
+ /datum/action/cooldown/power/gift/shed,
+ )
start_gnosis = 3
breed_species = /datum/species/human/shifter/war
@@ -22,6 +32,11 @@
/datum/subsplat/werewolf/breed_form/garou/lupus
name = BREED_LUPUS
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/hares_leap,
+ /datum/action/cooldown/power/gift/heightened_senses,
+ /datum/action/cooldown/power/gift/predators_arsenal,
+ )
start_gnosis = 5
breed_species = /datum/species/human/shifter/feral
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 2af705e6e7c7..836dab6fb0fa 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
@@ -2,16 +2,22 @@
abstract_type = /datum/subsplat/werewolf/tribe/garou
fera_restriction = SPLAT_GAROU
+// V20s "Wendigos"
/datum/subsplat/werewolf/tribe/garou/galestalkers
name = TRIBE_GALESTALKERS
desc = "Tireless trackers and peerless hunters, the galestalkers carry the namesake of the wind that crosses the tundra."
- gifts_provided = list()
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/beat_of_the_heartdrum
+ // /datum/action/cooldown/power/gift/resist_pain, // DARKPACK TODO - (Selectable Gifts)
+ )
subsplat_keys = /obj/item/vamp/keys/nps
+// V20 "Uktena"
/datum/subsplat/werewolf/tribe/garou/ghostcouncil
name = TRIBE_UKTENA
desc = "Seekers of mystery and highly secretive, the Uktena is one of the most misunderstood tribes. Their ranks include guides, academics and the religious."
gifts_provided = list(
+ /datum/action/cooldown/power/gift/sense_magic,
// /datum/action/cooldown/power/gift/spirit_speech, // DARKPACK TODO - (Selectable Gifts)
)
subsplat_keys = /obj/item/vamp/keys/nps
@@ -98,14 +104,20 @@
name = TRIBE_SILVER_FANGS
desc = "Commonly known as the 'Alphas' of the Garou Nation, their ranks consist of traditional rulers and wartime leaders. Known for being honorable and having courage, odd mental quirks have begun plaguing their young members, and the tribe is beginning to suffer from diseases of the spirit and mind."
gifts_provided = list(
+ /datum/action/cooldown/power/gift/falcons_grasp,
// /datum/action/cooldown/power/gift/inspiration, // DARKPACK TODO - (Selectable Gifts)
+ // /datum/action/cooldown/power/gift/sense_wyrm, // DARKPACK TODO - (Selectable Gifts)
)
subsplat_keys = /obj/item/vamp/keys/nps
/datum/subsplat/werewolf/tribe/garou/stargazers
name = TRIBE_STARGAZERS
desc = "The calmest of the Garou, they are well known for their introversion. They are the smallest of the remaining tribes, many of their kind wiped out by the Wyrm."
- gifts_provided = list()
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/channeling,
+ // /datum/action/cooldown/power/gift/falling_touch, // DARKPACK TODO - (Selectable Gifts)
+ // /datum/action/cooldown/power/gift/sense_wyrm, // DARKPACK TODO - (Selectable Gifts)
+ )
subsplat_keys = /obj/item/vamp/keys/nps
/datum/subsplat/werewolf/tribe/garou/blackspiraldancers
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/glyphs.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/glyphs.dmi
index e266e1b437f0..0986ef41eb7c 100644
Binary files a/modular_darkpack/modules/werewolf_the_apocalypse/icons/glyphs.dmi and b/modular_darkpack/modules/werewolf_the_apocalypse/icons/glyphs.dmi differ
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi
index c7d80d11f83f..4fc2bccde79b 100644
Binary files a/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi and b/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi differ
diff --git a/modular_zapoc/modules/jobs/icons/landmarks.dmi b/modular_zapoc/modules/jobs/icons/landmarks.dmi
index 3adf5babad3a..d5572e73b6de 100644
Binary files a/modular_zapoc/modules/jobs/icons/landmarks.dmi and b/modular_zapoc/modules/jobs/icons/landmarks.dmi differ
diff --git a/sound/ambience/weather/ashstorm/outside/active_mid2.ogg b/sound/ambience/weather/ashstorm/outside/active_mid2.ogg
deleted file mode 100644
index b610d35d9280..000000000000
Binary files a/sound/ambience/weather/ashstorm/outside/active_mid2.ogg and /dev/null differ
diff --git a/sound/ambience/weather/ashstorm/outside/active_mid3.ogg b/sound/ambience/weather/ashstorm/outside/active_mid3.ogg
deleted file mode 100644
index 17df126f9e3c..000000000000
Binary files a/sound/ambience/weather/ashstorm/outside/active_mid3.ogg and /dev/null differ
diff --git a/sound/attributions.txt b/sound/attributions.txt
index 4591ca71eef2..6d7d4f861a5c 100644
--- a/sound/attributions.txt
+++ b/sound/attributions.txt
@@ -253,3 +253,18 @@ sound/machines/data_transmission.ogg -- Elements from Tim Verberne -- https://fr
sound/items/jet_active, ./jet_ignite, and ./jet_off by kyles -- https://freesound.org/people/kyles/sounds/453408/ -- license: Creative Commons 0.
Slight noise cleanup on all three files, mild pitch tweak on jet_active, but otherwise just cut apart and converted to OGG.
+
+sound/music/boombox/industrial_crush.ogg by ArcaneMusic, License: Creative Commons 0, made in FL studio.
+ SS13 original, accept no substitutes
+
+sound/music/boombox/bainmack-rock.ogg by Bainmack -- https://freesound.org/people/bainmack/sounds/621165/ -- License: Creative Commons 0
+ Slight cleanup by ArcaneMusic
+
+sound/music/boombox/groovepad-hiphop.ogg by Cloud10 -- https://freesound.org/people/Cloud-10/sounds/536250/ -- License: Creative Commons 0
+ Volume adjustment and cleanup for looping by ArcaneMusic
+
+sound/music/boombox/frankyboomer-jazz.ogg by Cloud10 -- https://freesound.org/people/FrankyBoomer/sounds/261100/ -- License: Creative Commons 0
+ Volume adjustment and cleanup for looping by ArcaneMusic
+
+sound/music/boombox/bubblegum-pop.ogg by Seth_makes_sounds -- https://freesound.org/people/Seth_Makes_Sounds/sounds/686610/ -- License: Creative Commons 0
+ Volume tweak and trimming by ArcaneMusic
diff --git a/sound/effects/blastdoor.ogg b/sound/effects/blastdoor.ogg
deleted file mode 100644
index b2acb4701f9f..000000000000
Binary files a/sound/effects/blastdoor.ogg and /dev/null differ
diff --git a/sound/effects/footstep/water1.ogg b/sound/effects/footstep/water1.ogg
deleted file mode 100644
index 377d34ce2bee..000000000000
Binary files a/sound/effects/footstep/water1.ogg and /dev/null differ
diff --git a/sound/effects/footstep/water2.ogg b/sound/effects/footstep/water2.ogg
deleted file mode 100644
index c7f53afb5656..000000000000
Binary files a/sound/effects/footstep/water2.ogg and /dev/null differ
diff --git a/sound/effects/footstep/water3.ogg b/sound/effects/footstep/water3.ogg
deleted file mode 100644
index bf175f66b82a..000000000000
Binary files a/sound/effects/footstep/water3.ogg and /dev/null differ
diff --git a/sound/effects/footstep/water4.ogg b/sound/effects/footstep/water4.ogg
deleted file mode 100644
index d1ce684c3de0..000000000000
Binary files a/sound/effects/footstep/water4.ogg and /dev/null differ
diff --git a/sound/effects/hygienebot_angry.ogg b/sound/effects/hygienebot_angry.ogg
deleted file mode 100644
index 249ef60ecffc..000000000000
Binary files a/sound/effects/hygienebot_angry.ogg and /dev/null differ
diff --git a/sound/effects/hygienebot_happy.ogg b/sound/effects/hygienebot_happy.ogg
deleted file mode 100644
index e66abcb197da..000000000000
Binary files a/sound/effects/hygienebot_happy.ogg and /dev/null differ
diff --git a/sound/effects/magic/clockwork/ark_activation_sequence.ogg b/sound/effects/magic/clockwork/ark_activation_sequence.ogg
deleted file mode 100644
index e6ade8b56aae..000000000000
Binary files a/sound/effects/magic/clockwork/ark_activation_sequence.ogg and /dev/null differ
diff --git a/sound/effects/roaring_fire.ogg b/sound/effects/roaring_fire.ogg
deleted file mode 100644
index b3927b69feb8..000000000000
Binary files a/sound/effects/roaring_fire.ogg and /dev/null differ
diff --git a/sound/effects/zzzt.ogg b/sound/effects/zzzt.ogg
deleted file mode 100644
index e1c2eab45416..000000000000
Binary files a/sound/effects/zzzt.ogg and /dev/null differ
diff --git a/sound/items/attributions.txt b/sound/items/attributions.txt
index 7f1dcaabcc46..0b6c2b3814d2 100644
--- a/sound/items/attributions.txt
+++ b/sound/items/attributions.txt
@@ -62,3 +62,11 @@ glove_equip.ogg - LETHRCreak_Leather Belt Short Creak 01_PF_365 DAYS OF SOUND by
lead_pipe_hit.ogg - jixaw-metal-pipe-falling-sound.mp3 by thenotcheeseman -- https://freesound.org/s/679206/ -- License: Creative Commons 0
lead_pipe_drop.ogg - jixaw-metal-pipe-falling-sound.mp3 by thenotcheeseman -- https://freesound.org/s/679206/ -- License: Creative Commons 0
lead_pipe_pickup.ogg - Metal pipe hitting the ground.flac by CGEffex -- https://freesound.org/s/93962/ -- License: Attribution 4.0
+
+- rigstep.ogg
+ported from Aurora (...in turn ported from Hestia), assumed to be licensed under CC-BY-SA 3.0 (no specific attribution found, original repo lost?)
+
+- rigstep_chonk.ogg
+- rigstep_heavy.ogg
+- rigstep_medium.ogg
+ported from Aurora, by majormoth(Discord), licensed under CC-BY-SA-3.0
diff --git a/sound/items/baton/contractor_baton_unfolded_drop.ogg b/sound/items/baton/contractor_baton_unfolded_drop.ogg
deleted file mode 100644
index eeac78c6d3ae..000000000000
Binary files a/sound/items/baton/contractor_baton_unfolded_drop.ogg and /dev/null differ
diff --git a/sound/items/biddledeep.ogg b/sound/items/biddledeep.ogg
deleted file mode 100644
index 651374afc104..000000000000
Binary files a/sound/items/biddledeep.ogg and /dev/null differ
diff --git a/sound/items/can/can_hit.ogg b/sound/items/can/can_hit.ogg
new file mode 100644
index 000000000000..9d0ed973bdb3
Binary files /dev/null and b/sound/items/can/can_hit.ogg differ
diff --git a/sound/items/cigs/cig_pack_rustle1.ogg b/sound/items/cigs/cig_pack_rustle1.ogg
deleted file mode 100644
index 58db955d5a7e..000000000000
Binary files a/sound/items/cigs/cig_pack_rustle1.ogg and /dev/null differ
diff --git a/sound/items/cigs/cig_pack_rustle2.ogg b/sound/items/cigs/cig_pack_rustle2.ogg
deleted file mode 100644
index 2b1eac0552c2..000000000000
Binary files a/sound/items/cigs/cig_pack_rustle2.ogg and /dev/null differ
diff --git a/sound/items/cigs/cig_pack_rustle3.ogg b/sound/items/cigs/cig_pack_rustle3.ogg
deleted file mode 100644
index 0a6d1e7d9b92..000000000000
Binary files a/sound/items/cigs/cig_pack_rustle3.ogg and /dev/null differ
diff --git a/sound/items/cigs/cig_pack_rustle4.ogg b/sound/items/cigs/cig_pack_rustle4.ogg
deleted file mode 100644
index 5d2ca5751fc1..000000000000
Binary files a/sound/items/cigs/cig_pack_rustle4.ogg and /dev/null differ
diff --git a/sound/items/cigs/cig_pack_rustle5.ogg b/sound/items/cigs/cig_pack_rustle5.ogg
deleted file mode 100644
index 0bfcd0bebe16..000000000000
Binary files a/sound/items/cigs/cig_pack_rustle5.ogg and /dev/null differ
diff --git a/sound/items/cigs/cig_pack_rustle6.ogg b/sound/items/cigs/cig_pack_rustle6.ogg
deleted file mode 100644
index 22bcd82069b7..000000000000
Binary files a/sound/items/cigs/cig_pack_rustle6.ogg and /dev/null differ
diff --git a/sound/items/electronic_assembly_empty.ogg b/sound/items/electronic_assembly_empty.ogg
deleted file mode 100644
index 21f76ebab2c9..000000000000
Binary files a/sound/items/electronic_assembly_empty.ogg and /dev/null differ
diff --git a/sound/items/electronic_assembly_emptying.ogg b/sound/items/electronic_assembly_emptying.ogg
deleted file mode 100644
index 2001326cf9ae..000000000000
Binary files a/sound/items/electronic_assembly_emptying.ogg and /dev/null differ
diff --git a/sound/items/modsuit/rigstep.ogg b/sound/items/modsuit/rigstep.ogg
new file mode 100644
index 000000000000..02d3eff5125a
Binary files /dev/null and b/sound/items/modsuit/rigstep.ogg differ
diff --git a/sound/items/modsuit/rigstep_chonk.ogg b/sound/items/modsuit/rigstep_chonk.ogg
new file mode 100644
index 000000000000..343ee26ea2a9
Binary files /dev/null and b/sound/items/modsuit/rigstep_chonk.ogg differ
diff --git a/sound/items/modsuit/rigstep_heavy.ogg b/sound/items/modsuit/rigstep_heavy.ogg
new file mode 100644
index 000000000000..22dc965533b4
Binary files /dev/null and b/sound/items/modsuit/rigstep_heavy.ogg differ
diff --git a/sound/items/modsuit/rigstep_medium.ogg b/sound/items/modsuit/rigstep_medium.ogg
new file mode 100644
index 000000000000..2209e86da5f8
Binary files /dev/null and b/sound/items/modsuit/rigstep_medium.ogg differ
diff --git a/sound/items/modsuit/tem_shot.ogg b/sound/items/modsuit/tem_shot.ogg
deleted file mode 100644
index ffb99bfff61f..000000000000
Binary files a/sound/items/modsuit/tem_shot.ogg and /dev/null differ
diff --git a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply1.ogg b/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply1.ogg
deleted file mode 100644
index c9ea77c2e3b4..000000000000
Binary files a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply1.ogg and /dev/null differ
diff --git a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply10.ogg b/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply10.ogg
deleted file mode 100644
index 29e843f605c6..000000000000
Binary files a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply10.ogg and /dev/null differ
diff --git a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply2.ogg b/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply2.ogg
deleted file mode 100644
index 3a9360d83ad0..000000000000
Binary files a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply2.ogg and /dev/null differ
diff --git a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply3.ogg b/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply3.ogg
deleted file mode 100644
index 5bd10f0578fd..000000000000
Binary files a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply3.ogg and /dev/null differ
diff --git a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply4.ogg b/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply4.ogg
deleted file mode 100644
index 7f7f6f0776f9..000000000000
Binary files a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply4.ogg and /dev/null differ
diff --git a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply5.ogg b/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply5.ogg
deleted file mode 100644
index e2cb1504a263..000000000000
Binary files a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply5.ogg and /dev/null differ
diff --git a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply6.ogg b/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply6.ogg
deleted file mode 100644
index a5d5b502ed2d..000000000000
Binary files a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply6.ogg and /dev/null differ
diff --git a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply7.ogg b/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply7.ogg
deleted file mode 100644
index 8bcf9ddb61fa..000000000000
Binary files a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply7.ogg and /dev/null differ
diff --git a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply8.ogg b/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply8.ogg
deleted file mode 100644
index 9f362b075917..000000000000
Binary files a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply8.ogg and /dev/null differ
diff --git a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply9.ogg b/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply9.ogg
deleted file mode 100644
index 4020f8183aa0..000000000000
Binary files a/sound/items/regenerative_mesh/regen_mesh_unused/regen_mesh_apply9.ogg and /dev/null differ
diff --git a/sound/items/robofafafoggy.ogg b/sound/items/robofafafoggy.ogg
deleted file mode 100644
index 55678e240a11..000000000000
Binary files a/sound/items/robofafafoggy.ogg and /dev/null differ
diff --git a/sound/items/robofafafoggy2.ogg b/sound/items/robofafafoggy2.ogg
deleted file mode 100644
index 951772845ed5..000000000000
Binary files a/sound/items/robofafafoggy2.ogg and /dev/null differ
diff --git a/sound/items/weapons/draw_bow2.ogg b/sound/items/weapons/draw_bow2.ogg
deleted file mode 100644
index e02cad0a5322..000000000000
Binary files a/sound/items/weapons/draw_bow2.ogg and /dev/null differ
diff --git a/sound/items/weapons/pulse2.ogg b/sound/items/weapons/pulse2.ogg
deleted file mode 100644
index df94f5934993..000000000000
Binary files a/sound/items/weapons/pulse2.ogg and /dev/null differ
diff --git a/sound/items/weapons/whipgrab.ogg b/sound/items/weapons/whipgrab.ogg
deleted file mode 100644
index 8cca6adcc786..000000000000
Binary files a/sound/items/weapons/whipgrab.ogg and /dev/null differ
diff --git a/sound/machines/ding_short.ogg b/sound/machines/ding_short.ogg
deleted file mode 100644
index 50987592b691..000000000000
Binary files a/sound/machines/ding_short.ogg and /dev/null differ
diff --git a/sound/machines/kerchunk.ogg b/sound/machines/kerchunk.ogg
new file mode 100644
index 000000000000..5666e0000603
Binary files /dev/null and b/sound/machines/kerchunk.ogg differ
diff --git a/sound/machines/license.txt b/sound/machines/license.txt
index 69e52c94e4b7..6b6290e6d571 100644
--- a/sound/machines/license.txt
+++ b/sound/machines/license.txt
@@ -5,4 +5,7 @@ This is licensed under CC-BY 4.0, found at https://creativecommons.org/licenses/
shutter.ogg adapted from Joseph Sardin on BigSoundBank
https://bigsoundbank.com/detail-2475-manual-roller-shutter-closing-out-2.html
-mail_sort.ogg adapted from csigusz_foxoup ob Freesound https://freesound.org/people/csigusz_foxoup/sounds/711428/
\ No newline at end of file
+mail_sort.ogg adapted from csigusz_foxoup ob Freesound https://freesound.org/people/csigusz_foxoup/sounds/711428/
+
+kerchunk.ogg ported from https://freesound.org/people/Tom_Kaszuba/sounds/749869/ by Tom_Kaszuba.
+This is licensed under CC-BY 4.0 found at https://creativecommons.org/licenses/by/4.0/
diff --git a/sound/machines/sm/supermatter1.ogg b/sound/machines/sm/supermatter1.ogg
deleted file mode 100644
index ae4acc3fe419..000000000000
Binary files a/sound/machines/sm/supermatter1.ogg and /dev/null differ
diff --git a/sound/machines/sm/supermatter2.ogg b/sound/machines/sm/supermatter2.ogg
deleted file mode 100644
index f1993a2e1623..000000000000
Binary files a/sound/machines/sm/supermatter2.ogg and /dev/null differ
diff --git a/sound/machines/sm/supermatter3.ogg b/sound/machines/sm/supermatter3.ogg
deleted file mode 100644
index 7d290f30b0df..000000000000
Binary files a/sound/machines/sm/supermatter3.ogg and /dev/null differ
diff --git a/sound/mobs/non-humanoids/ed209/edplaceholder.ogg b/sound/mobs/non-humanoids/ed209/edplaceholder.ogg
deleted file mode 100644
index e8ca64bd24c1..000000000000
Binary files a/sound/mobs/non-humanoids/ed209/edplaceholder.ogg and /dev/null differ
diff --git a/sound/mobs/non-humanoids/floorbot/whistlereset.ogg b/sound/mobs/non-humanoids/floorbot/whistlereset.ogg
deleted file mode 100644
index 6974b4d17217..000000000000
Binary files a/sound/mobs/non-humanoids/floorbot/whistlereset.ogg and /dev/null differ
diff --git a/sound/mobs/non-humanoids/hygienebot/cleanandtidy.ogg b/sound/mobs/non-humanoids/hygienebot/cleanandtidy.ogg
deleted file mode 100644
index 814dd0808e76..000000000000
Binary files a/sound/mobs/non-humanoids/hygienebot/cleanandtidy.ogg and /dev/null differ
diff --git a/sound/mobs/non-humanoids/medbot/i_require_asst.ogg b/sound/mobs/non-humanoids/medbot/i_require_asst.ogg
deleted file mode 100644
index 48c8ea091c14..000000000000
Binary files a/sound/mobs/non-humanoids/medbot/i_require_asst.ogg and /dev/null differ
diff --git a/sound/mobs/non-humanoids/medbot/insult.ogg b/sound/mobs/non-humanoids/medbot/insult.ogg
deleted file mode 100644
index 1e2f47259070..000000000000
Binary files a/sound/mobs/non-humanoids/medbot/insult.ogg and /dev/null differ
diff --git a/sound/mobs/non-humanoids/medbot/reported.ogg b/sound/mobs/non-humanoids/medbot/reported.ogg
deleted file mode 100644
index 193ee8e8fc65..000000000000
Binary files a/sound/mobs/non-humanoids/medbot/reported.ogg and /dev/null differ
diff --git a/sound/mobs/non-humanoids/repairbot/cantanymore.ogg b/sound/mobs/non-humanoids/repairbot/cantanymore.ogg
deleted file mode 100644
index 4fc4fb216f72..000000000000
Binary files a/sound/mobs/non-humanoids/repairbot/cantanymore.ogg and /dev/null differ
diff --git a/sound/mobs/non-humanoids/stargazer/beam_loop_two.ogg b/sound/mobs/non-humanoids/stargazer/beam_loop_two.ogg
deleted file mode 100644
index d98474814904..000000000000
Binary files a/sound/mobs/non-humanoids/stargazer/beam_loop_two.ogg and /dev/null differ
diff --git a/sound/music/antag/ragesmages.ogg b/sound/music/antag/ragesmages.ogg
deleted file mode 100644
index 402c08d21e8b..000000000000
Binary files a/sound/music/antag/ragesmages.ogg and /dev/null differ
diff --git a/sound/music/antag/thatshowfamiliesworks.ogg b/sound/music/antag/thatshowfamiliesworks.ogg
deleted file mode 100644
index db71bb87e05e..000000000000
Binary files a/sound/music/antag/thatshowfamiliesworks.ogg and /dev/null differ
diff --git a/sound/music/antag/traitor/objective_failed.ogg b/sound/music/antag/traitor/objective_failed.ogg
deleted file mode 100644
index 3a02bb55549f..000000000000
Binary files a/sound/music/antag/traitor/objective_failed.ogg and /dev/null differ
diff --git a/sound/music/antag/traitor/objective_success.ogg b/sound/music/antag/traitor/objective_success.ogg
deleted file mode 100644
index bdec1652c9c3..000000000000
Binary files a/sound/music/antag/traitor/objective_success.ogg and /dev/null differ
diff --git a/sound/music/antag/traitor/objective_taken.ogg b/sound/music/antag/traitor/objective_taken.ogg
deleted file mode 100644
index ca1ff29efc06..000000000000
Binary files a/sound/music/antag/traitor/objective_taken.ogg and /dev/null differ
diff --git a/sound/music/boombox/bainmack-rock.ogg b/sound/music/boombox/bainmack-rock.ogg
new file mode 100644
index 000000000000..c400957f65cc
Binary files /dev/null and b/sound/music/boombox/bainmack-rock.ogg differ
diff --git a/sound/music/boombox/bubblegum-pop.ogg b/sound/music/boombox/bubblegum-pop.ogg
new file mode 100644
index 000000000000..00086644a9f4
Binary files /dev/null and b/sound/music/boombox/bubblegum-pop.ogg differ
diff --git a/sound/music/boombox/frankyboomer-jazz.ogg b/sound/music/boombox/frankyboomer-jazz.ogg
new file mode 100644
index 000000000000..42212cac723f
Binary files /dev/null and b/sound/music/boombox/frankyboomer-jazz.ogg differ
diff --git a/sound/music/boombox/groovepad-hiphop.ogg b/sound/music/boombox/groovepad-hiphop.ogg
new file mode 100644
index 000000000000..9b05fd6aff34
Binary files /dev/null and b/sound/music/boombox/groovepad-hiphop.ogg differ
diff --git a/sound/music/boombox/industrial-crush.ogg b/sound/music/boombox/industrial-crush.ogg
new file mode 100644
index 000000000000..f2453490a4ea
Binary files /dev/null and b/sound/music/boombox/industrial-crush.ogg differ
diff --git a/sound/vehicles/mecha/justice_pre_charge.ogg b/sound/vehicles/mecha/justice_pre_charge.ogg
deleted file mode 100644
index 8ac8b9227c6a..000000000000
Binary files a/sound/vehicles/mecha/justice_pre_charge.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/justice_warning.ogg b/sound/vehicles/mecha/justice_warning.ogg
deleted file mode 100644
index 711c3fdf45c2..000000000000
Binary files a/sound/vehicles/mecha/justice_warning.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_blade_attack.ogg b/sound/vehicles/mecha/mech_blade_attack.ogg
deleted file mode 100644
index d44156e4b8e3..000000000000
Binary files a/sound/vehicles/mecha/mech_blade_attack.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_blade_break_wall.ogg b/sound/vehicles/mecha/mech_blade_break_wall.ogg
deleted file mode 100644
index 71982fba35b5..000000000000
Binary files a/sound/vehicles/mecha/mech_blade_break_wall.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_blade_safty.ogg b/sound/vehicles/mecha/mech_blade_safty.ogg
deleted file mode 100644
index c15b52f6f8de..000000000000
Binary files a/sound/vehicles/mecha/mech_blade_safty.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_charge_attack.ogg b/sound/vehicles/mecha/mech_charge_attack.ogg
deleted file mode 100644
index f45c1bbe2c9a..000000000000
Binary files a/sound/vehicles/mecha/mech_charge_attack.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_stealth_attack.ogg b/sound/vehicles/mecha/mech_stealth_attack.ogg
deleted file mode 100644
index ebd083ed2f46..000000000000
Binary files a/sound/vehicles/mecha/mech_stealth_attack.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_stealth_effect.ogg b/sound/vehicles/mecha/mech_stealth_effect.ogg
deleted file mode 100644
index bd4e1d2e441e..000000000000
Binary files a/sound/vehicles/mecha/mech_stealth_effect.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_stealth_pre_attack.ogg b/sound/vehicles/mecha/mech_stealth_pre_attack.ogg
deleted file mode 100644
index ff7bef9a5485..000000000000
Binary files a/sound/vehicles/mecha/mech_stealth_pre_attack.ogg and /dev/null differ
diff --git a/tgstation.dme b/tgstation.dme
index ba91bd27cf29..972da5bcb2c4 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -197,6 +197,7 @@
#include "code\__DEFINES\polls.dm"
#include "code\__DEFINES\power.dm"
#include "code\__DEFINES\preferences.dm"
+#include "code\__DEFINES\prison.dm"
#include "code\__DEFINES\processing.dm"
#include "code\__DEFINES\procpath.dm"
#include "code\__DEFINES\profile.dm"
@@ -258,6 +259,7 @@
#include "code\__DEFINES\supermatter.dm"
#include "code\__DEFINES\supply_pods.dm"
#include "code\__DEFINES\surgery.dm"
+#include "code\__DEFINES\survival_box.dm"
#include "code\__DEFINES\tcg.dm"
#include "code\__DEFINES\text.dm"
#include "code\__DEFINES\tgs.config.dm"
@@ -377,6 +379,7 @@
#include "code\__DEFINES\dcs\signals\signals_operating_computer.dm"
#include "code\__DEFINES\dcs\signals\signals_operatives.dm"
#include "code\__DEFINES\dcs\signals\signals_painting.dm"
+#include "code\__DEFINES\dcs\signals\signals_parallax.dm"
#include "code\__DEFINES\dcs\signals\signals_plane_master_group.dm"
#include "code\__DEFINES\dcs\signals\signals_powernet.dm"
#include "code\__DEFINES\dcs\signals\signals_proxmonitor.dm"
@@ -443,6 +446,7 @@
#include "code\__DEFINES\~darkpack\branding.dm"
#include "code\__DEFINES\~darkpack\colors.dm"
#include "code\__DEFINES\~darkpack\combat.dm"
+#include "code\__DEFINES\~darkpack\configuration.dm"
#include "code\__DEFINES\~darkpack\crimes.dm"
#include "code\__DEFINES\~darkpack\darkpack_roles.dm"
#include "code\__DEFINES\~darkpack\discipline.dm"
@@ -461,6 +465,7 @@
#include "code\__DEFINES\~darkpack\language.dm"
#include "code\__DEFINES\~darkpack\library.dm"
#include "code\__DEFINES\~darkpack\lock_access_defines.dm"
+#include "code\__DEFINES\~darkpack\magic.dm"
#include "code\__DEFINES\~darkpack\mapswitch.dm"
#include "code\__DEFINES\~darkpack\masquerade.dm"
#include "code\__DEFINES\~darkpack\mentors.dm"
@@ -495,6 +500,7 @@
#include "code\__DEFINES\~darkpack\dcs\splat_signals.dm"
#include "code\__DEFINES\~darkpack\dcs\vampire_signals.dm"
#include "code\__DEFINES\~darkpack\dcs\signals\signals_global.dm"
+#include "code\__DEFINES\~darkpack\dcs\signals_atom\signals_magic.dm"
#include "code\__DEFINES\~darkpack\dcs\signals_mob\signals_mob.dm"
#include "code\__DEFINES\~darkpack\dcs\signals_mob\signals_mob_living.dm"
#include "code\__DEFINES\~darkpack\fera\fera.dm"
@@ -1016,6 +1022,7 @@
#include "code\datums\actions\items\flight.dm"
#include "code\datums\actions\items\hands_free.dm"
#include "code\datums\actions\items\organ_action.dm"
+#include "code\datums\actions\items\pillow_weapons.dm"
#include "code\datums\actions\items\reload_rebar.dm"
#include "code\datums\actions\items\set_internals.dm"
#include "code\datums\actions\items\stealth_box.dm"
@@ -1377,10 +1384,12 @@
#include "code\datums\components\codeword_hearing.dm"
#include "code\datums\components\combo_attacks.dm"
#include "code\datums\components\combustible_flooder.dm"
+#include "code\datums\components\connect_client_behalf.dm"
#include "code\datums\components\connect_containers.dm"
#include "code\datums\components\connect_inventory.dm"
#include "code\datums\components\connect_loc_behalf.dm"
#include "code\datums\components\connect_mob_behalf.dm"
+#include "code\datums\components\connect_perspective.dm"
#include "code\datums\components\connect_range.dm"
#include "code\datums\components\construction.dm"
#include "code\datums\components\conveyor_movement.dm"
@@ -1538,6 +1547,7 @@
#include "code\datums\components\seethrough_mob.dm"
#include "code\datums\components\shell.dm"
#include "code\datums\components\shielded.dm"
+#include "code\datums\components\shoe_footstep.dm"
#include "code\datums\components\shovel_hands.dm"
#include "code\datums\components\shrink.dm"
#include "code\datums\components\shuttle_cling.dm"
@@ -1790,6 +1800,7 @@
#include "code\datums\elements\chemical_transfer.dm"
#include "code\datums\elements\chewable.dm"
#include "code\datums\elements\cleaning.dm"
+#include "code\datums\elements\clever_girl.dm"
#include "code\datums\elements\cliff_walker.dm"
#include "code\datums\elements\climb_walkable.dm"
#include "code\datums\elements\climbable.dm"
@@ -1929,6 +1940,7 @@
#include "code\datums\elements\spooky.dm"
#include "code\datums\elements\squish.dm"
#include "code\datums\elements\squish_sound.dm"
+#include "code\datums\elements\strip_accessible_storage.dm"
#include "code\datums\elements\strippable.dm"
#include "code\datums\elements\structure_repair.dm"
#include "code\datums\elements\surgery_aid.dm"
@@ -2431,6 +2443,7 @@
#include "code\datums\wounds\_wounds.dm"
#include "code\datums\wounds\blunt.dm"
#include "code\datums\wounds\bones.dm"
+#include "code\datums\wounds\bruised.dm"
#include "code\datums\wounds\burns.dm"
#include "code\datums\wounds\cranial_fissure.dm"
#include "code\datums\wounds\loss.dm"
@@ -2954,6 +2967,8 @@
#include "code\game\objects\items\devices\taperecorder.dm"
#include "code\game\objects\items\devices\traitordevices.dm"
#include "code\game\objects\items\devices\transfer_valve.dm"
+#include "code\game\objects\items\devices\boombox\boombox.dm"
+#include "code\game\objects\items\devices\boombox\music_tapes.dm"
#include "code\game\objects\items\devices\radio\electropack.dm"
#include "code\game\objects\items\devices\radio\encryptionkey.dm"
#include "code\game\objects\items\devices\radio\headset.dm"
@@ -3706,7 +3721,9 @@
#include "code\modules\antagonists\heretic\rust_effect.dm"
#include "code\modules\antagonists\heretic\soultrapped_heretic.dm"
#include "code\modules\antagonists\heretic\transmutation_rune.dm"
+#include "code\modules\antagonists\heretic\items\blessed_poppy.dm"
#include "code\modules\antagonists\heretic\items\corrupted_organs.dm"
+#include "code\modules\antagonists\heretic\items\crimson_cleaver.dm"
#include "code\modules\antagonists\heretic\items\eldritch_flask.dm"
#include "code\modules\antagonists\heretic\items\eldritch_painting.dm"
#include "code\modules\antagonists\heretic\items\forbidden_book.dm"
@@ -3754,7 +3771,6 @@
#include "code\modules\antagonists\heretic\magic\caretaker.dm"
#include "code\modules\antagonists\heretic\magic\cosmic_expansion.dm"
#include "code\modules\antagonists\heretic\magic\cosmic_runes.dm"
-#include "code\modules\antagonists\heretic\magic\crimson_cleave.dm"
#include "code\modules\antagonists\heretic\magic\eldritch_blind.dm"
#include "code\modules\antagonists\heretic\magic\eldritch_emplosion.dm"
#include "code\modules\antagonists\heretic\magic\eldritch_shapeshift.dm"
@@ -4055,6 +4071,7 @@
#include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold.dm"
#include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold4w.dm"
#include "code\modules\atmospherics\machinery\pipes\heat_exchange\simple.dm"
+#include "code\modules\atmospherics\machinery\portable\bluespace_scrubber.dm"
#include "code\modules\atmospherics\machinery\portable\canister.dm"
#include "code\modules\atmospherics\machinery\portable\pipe_scrubber.dm"
#include "code\modules\atmospherics\machinery\portable\portable_atmospherics.dm"
@@ -4887,9 +4904,9 @@
#include "code\modules\hydroponics\grafts.dm"
#include "code\modules\hydroponics\grown.dm"
#include "code\modules\hydroponics\growninedible.dm"
-#include "code\modules\hydroponics\hydroitemdefines.dm"
#include "code\modules\hydroponics\hydroponics.dm"
#include "code\modules\hydroponics\hydroponics_chemreact.dm"
+#include "code\modules\hydroponics\hydroponics_items.dm"
#include "code\modules\hydroponics\plant_genes.dm"
#include "code\modules\hydroponics\seed_extractor.dm"
#include "code\modules\hydroponics\seeds.dm"
@@ -5447,8 +5464,8 @@
#include "code\modules\mob\living\ventcrawling.dm"
#include "code\modules\mob\living\basic\basic.dm"
#include "code\modules\mob\living\basic\basic_defense.dm"
+#include "code\modules\mob\living\basic\damage_procs.dm"
#include "code\modules\mob\living\basic\festivus_pole.dm"
-#include "code\modules\mob\living\basic\health_adjustment.dm"
#include "code\modules\mob\living\basic\revolutionary.dm"
#include "code\modules\mob\living\basic\tree.dm"
#include "code\modules\mob\living\basic\alien\_alien.dm"
@@ -5843,9 +5860,10 @@
#include "code\modules\mob\living\brain\death.dm"
#include "code\modules\mob\living\brain\emote.dm"
#include "code\modules\mob\living\brain\life.dm"
-#include "code\modules\mob\living\brain\MMI.dm"
-#include "code\modules\mob\living\brain\posibrain.dm"
#include "code\modules\mob\living\brain\skillchip.dm"
+#include "code\modules\mob\living\brain\processor\_processor.dm"
+#include "code\modules\mob\living\brain\processor\organic.dm"
+#include "code\modules\mob\living\brain\processor\positronic.dm"
#include "code\modules\mob\living\carbon\carbon.dm"
#include "code\modules\mob\living\carbon\carbon_context.dm"
#include "code\modules\mob\living\carbon\carbon_defense.dm"
@@ -5896,6 +5914,7 @@
#include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm"
#include "code\modules\mob\living\carbon\alien\special\facehugger.dm"
#include "code\modules\mob\living\carbon\human\_species.dm"
+#include "code\modules\mob\living\carbon\human\damage_procs.dm"
#include "code\modules\mob\living\carbon\human\death.dm"
#include "code\modules\mob\living\carbon\human\dummy.dm"
#include "code\modules\mob\living\carbon\human\emote.dm"
@@ -5915,7 +5934,6 @@
#include "code\modules\mob\living\carbon\human\life.dm"
#include "code\modules\mob\living\carbon\human\login.dm"
#include "code\modules\mob\living\carbon\human\monkey.dm"
-#include "code\modules\mob\living\carbon\human\physiology.dm"
#include "code\modules\mob\living\carbon\human\status_procs.dm"
#include "code\modules\mob\living\carbon\human\suicides.dm"
#include "code\modules\mob\living\carbon\human\species_types\abductors.dm"
@@ -6892,6 +6910,7 @@
#include "code\modules\surgery\organs\internal\eyes\_eyes.dm"
#include "code\modules\surgery\organs\internal\eyes\eyes_augments.dm"
#include "code\modules\surgery\organs\internal\eyes\eyes_species.dm"
+#include "code\modules\surgery\organs\internal\fangs\_fangs.dm"
#include "code\modules\surgery\organs\internal\heart\_heart.dm"
#include "code\modules\surgery\organs\internal\heart\heart_anomalock.dm"
#include "code\modules\surgery\organs\internal\heart\heart_ethereal.dm"
@@ -7282,6 +7301,7 @@
#include "modular_darkpack\master_files\code\datums\mind\_mind.dm"
#include "modular_darkpack\master_files\code\datums\quirks\_quirk.dm"
#include "modular_darkpack\master_files\code\datums\station_traits\_station_trait.dm"
+#include "modular_darkpack\master_files\code\datums\status_effects\debuffs.dm"
#include "modular_darkpack\master_files\code\datums\storage\subtypes\bags.dm"
#include "modular_darkpack\master_files\code\datums\storage\subtypes\dufflebags.dm"
#include "modular_darkpack\master_files\code\game\atoms_movable.dm"
@@ -7348,7 +7368,6 @@
#include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\init_signals.dm"
#include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\initialize.dm"
#include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\life.dm"
-#include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\physiology.dm"
#include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\species_types\zombies.dm"
#include "modular_darkpack\master_files\code\modules\mob\living\silicon\silicon.dm"
#include "modular_darkpack\master_files\code\modules\mob\living\simple_animal\hostile\hostile.dm"
@@ -7361,6 +7380,8 @@
#include "modular_darkpack\master_files\code\modules\rituals\code\ritual_rune_drawing.dm"
#include "modular_darkpack\master_files\code\modules\rituals\code\ritual_tome.dm"
#include "modular_darkpack\master_files\code\modules\surgery\bodyparts\_bodyparts.dm"
+#include "modular_darkpack\master_files\code\modules\surgery\bodyparts\organs\_organ.dm"
+#include "modular_darkpack\master_files\code\modules\surgery\bodyparts\organs\organ_movement.dm"
#include "modular_darkpack\master_files\code\modules\surgery\bodyparts\organs\internal\_appendix.dm"
#include "modular_darkpack\master_files\code\modules\surgery\bodyparts\organs\internal\_ears.dm"
#include "modular_darkpack\master_files\code\modules\surgery\bodyparts\organs\internal\_eyes.dm"
@@ -7471,6 +7492,7 @@
#include "modular_darkpack\modules\clothes\code\neck.dm"
#include "modular_darkpack\modules\clothes\code\suit.dm"
#include "modular_darkpack\modules\clothes\code\under.dm"
+#include "modular_darkpack\modules\clothes\code\greyscale_configs\greyscale_masks.dm"
#include "modular_darkpack\modules\combat\code\combat_config.dm"
#include "modular_darkpack\modules\combat\code\directional_attack.dm"
#include "modular_darkpack\modules\combat\code\swing.dm"
@@ -7552,6 +7574,7 @@
#include "modular_darkpack\modules\ert\code\swat.dm"
#include "modular_darkpack\modules\ert\code\team.dm"
#include "modular_darkpack\modules\ert\code\items\first_team.dm"
+#include "modular_darkpack\modules\ert\code\items\national_guard_items.dm"
#include "modular_darkpack\modules\ert\code\items\swat_items.dm"
#include "modular_darkpack\modules\ert\code\outfits\fbi_outfits.dm"
#include "modular_darkpack\modules\ert\code\outfits\first_team_outfits.dm"
@@ -7607,6 +7630,7 @@
#include "modular_darkpack\modules\guestbook\code\adjective_preference.dm"
#include "modular_darkpack\modules\guestbook\code\guestbook.dm"
#include "modular_darkpack\modules\guestbook\code\human_helpers.dm"
+#include "modular_darkpack\modules\guestbook\code\known_identities.dm"
#include "modular_darkpack\modules\guestbook\code\mob.dm"
#include "modular_darkpack\modules\guestbook\code\persistent_guestbooks.dm"
#include "modular_darkpack\modules\hair\code\sprite_accessories.dm"
@@ -7732,7 +7756,6 @@
#include "modular_darkpack\modules\masquerade\code\word_checker.dm"
#include "modular_darkpack\modules\masquerade\code\components\masquerade_hud.dm"
#include "modular_darkpack\modules\masquerade\code\components\violation_observer.dm"
-#include "modular_darkpack\modules\masquerade\code\fields\violation_check_aoe.dm"
#include "modular_darkpack\modules\masquerade\code\subsystem\bloodhunt.dm"
#include "modular_darkpack\modules\masquerade\code\subsystem\masquerade.dm"
#include "modular_darkpack\modules\matrix\code\job.dm"
@@ -7801,19 +7824,24 @@
#include "modular_darkpack\modules\merits_flaws\code\neutral_quirks\illegal_identity.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\acute_sense.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\alcohol_tolerance.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\ambidextrous.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\beserker.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\blush_of_health_quirk.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\calm_heart.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\cast_iron_stomach.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\coldly_logical.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\deceptive_aura.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\eat_food_quirk.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\efficient_digestion.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\enchanting_voice.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\fair_glabro.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\fetish.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\giovanni_sanguine_incongruity.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\hidden_diablerie.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\huge_size.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\iron_will.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\metamorph.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\pain_tolerance.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\pale_aura.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\promethean_clay.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\stillness_of_death.dm"
@@ -8121,6 +8149,7 @@
#include "modular_darkpack\modules\splats\code\splat_management.dm"
#include "modular_darkpack\modules\splats\code\powers\_power.dm"
#include "modular_darkpack\modules\splats\code\powers\admin_verbs.dm"
+#include "modular_darkpack\modules\splats\code\powers\magic.dm"
#include "modular_darkpack\modules\splats\code\powers\st_power_management.dm"
#include "modular_darkpack\modules\splats\code\prefrences\pref_info.dm"
#include "modular_darkpack\modules\splats\code\prefrences\splat_middleware.dm"
@@ -8281,6 +8310,12 @@
#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\breeds\crinos\_crinos.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\breeds\crinos\primal_anger.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\breeds\crinos\sense_wyrm.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\breeds\homid\_homid.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\breeds\lupus\_lupus.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\breeds\lupus\heightened_senses.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"
@@ -8297,8 +8332,8 @@
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\silent_striders.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\silver_fangs.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\star_gazers.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\glasswalkers\_glasswalkers.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\glasswalkers\control_machine.dm"
-#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\renown.dm"
diff --git a/tgui/packages/tgui-escape-menu/styles/main.scss b/tgui/packages/tgui-escape-menu/styles/main.scss
index 88c92b2e7846..dc4e52a1c2a9 100644
--- a/tgui/packages/tgui-escape-menu/styles/main.scss
+++ b/tgui/packages/tgui-escape-menu/styles/main.scss
@@ -27,6 +27,7 @@ body,
.Tooltip {
font-family: 'Pixellari', monospace;
transform: translateY(-1.5rem);
+ z-index: 3;
}
.escape-menu {
diff --git a/tgui/packages/tgui-panel/chat/renderer.tsx b/tgui/packages/tgui-panel/chat/renderer.tsx
index 8de9b5236b55..f477822da806 100644
--- a/tgui/packages/tgui-panel/chat/renderer.tsx
+++ b/tgui/packages/tgui-panel/chat/renderer.tsx
@@ -4,6 +4,7 @@
* @license MIT
*/
+import { flushSync } from 'react-dom';
import { createRoot } from 'react-dom/client';
import { createLogger } from 'tgui/logging';
import { Tooltip } from 'tgui-core/components';
@@ -129,8 +130,8 @@ function isRadioChannelName(node: Text): boolean {
const match = RADIO_CHANNEL_LABEL.exec(text);
return Boolean(
node.parentElement?.classList.contains('name') &&
- match &&
- match[0].length === text.length,
+ match &&
+ match[0].length === text.length,
);
}
@@ -547,11 +548,15 @@ class ChatRenderer {
const reactRoot = createRoot(childNode);
- reactRoot.render(
-
-
- ,
- );
+ // `flushSync()` because of a chat scroll issue where whether or not
+ // the line wraps was being decided before the name loaded
+ flushSync(() => {
+ reactRoot.render(
+
+
+ ,
+ );
+ });
}
// Highlight text
diff --git a/tgui/packages/tgui-panel/chat/use-chat-pages.ts b/tgui/packages/tgui-panel/chat/use-chat-pages.ts
index aed20ee2e93f..089f3f8830d0 100644
--- a/tgui/packages/tgui-panel/chat/use-chat-pages.ts
+++ b/tgui/packages/tgui-panel/chat/use-chat-pages.ts
@@ -116,6 +116,8 @@ export function useChatPages() {
...pagesRecord,
[currentPageId]: draft,
});
+
+ chatRenderer.changePage(draft);
}
function updateChatPage(page: Partial): void {
@@ -128,6 +130,8 @@ export function useChatPages() {
...pagesRecord,
[currentPageId]: draft,
});
+
+ chatRenderer.changePage(draft);
}
return {
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
index fe7e799077bb..d10f6a50cb25 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
@@ -313,6 +313,7 @@ em {
.emote,
.infoplain,
.oocplain,
+.tooltip_subtle,
.warningplain {
}
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
index 89dcc717f5ee..20cb5b557438 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
@@ -331,6 +331,7 @@ em {
.emote,
.infoplain,
.oocplain,
+.tooltip_subtle,
.warningplain {
}
diff --git a/tgui/packages/tgui-panel/verbs/CommandBar.tsx b/tgui/packages/tgui-panel/verbs/CommandBar.tsx
index f973fbb4ad6c..a57083480247 100644
--- a/tgui/packages/tgui-panel/verbs/CommandBar.tsx
+++ b/tgui/packages/tgui-panel/verbs/CommandBar.tsx
@@ -1,3 +1,4 @@
+import { storage } from 'common/storage';
import {
filterTypepaths,
isEntityArg,
@@ -214,6 +215,14 @@ export function CommandBar() {
const isCurrentArgTypepath = currentArg ? isTypepathArg(currentArg) : false;
const isCurrentArgList = currentArg ? isListArg(currentArg) : false;
+ useEffect(() => {
+ const loadStoredValues = async () => {
+ const storedMode = await storage.get('tgui-commandbar-mode');
+ if (storedMode !== undefined) setMode(storedMode);
+ };
+ loadStoredValues();
+ }, []);
+
useEffect(() => {
Byond.sendMessage('verbs/request_verbs');
}, []);
@@ -292,6 +301,7 @@ export function CommandBar() {
} else {
enterChatMode(nextMode);
}
+ storage.set('tgui-commandbar-mode', nextMode);
inputRef.current?.focus();
};
diff --git a/tgui/packages/tgui/events/handlers/update.ts b/tgui/packages/tgui/events/handlers/update.ts
index 54a45bb27217..b7272d67cbe7 100644
--- a/tgui/packages/tgui/events/handlers/update.ts
+++ b/tgui/packages/tgui/events/handlers/update.ts
@@ -45,9 +45,6 @@ function resume(payload: UpdatePayload): void {
return;
}
- Byond.winset(Byond.windowId, {
- 'is-visible': true,
- });
perf.mark('resume/finish');
if (process.env.NODE_ENV !== 'production') {
diff --git a/tgui/packages/tgui/interfaces/AntagInfoRevolution.tsx b/tgui/packages/tgui/interfaces/AntagInfoRevolution.tsx
index ccd0addf0902..c51cb41f96e8 100644
--- a/tgui/packages/tgui/interfaces/AntagInfoRevolution.tsx
+++ b/tgui/packages/tgui/interfaces/AntagInfoRevolution.tsx
@@ -1,4 +1,5 @@
-import { Section, Stack } from 'tgui-core/components';
+import { useEffect, useState } from 'react';
+import { Input, Section, Stack } from 'tgui-core/components';
import type { BooleanLike } from 'tgui-core/react';
import { useBackend } from '../backend';
import { Window } from '../layouts';
@@ -17,6 +18,8 @@ type Info = {
code_responses?: string[];
heads: Head[];
lone_wolf: BooleanLike;
+ conversion_objective?: string | null;
+ conversion_objective_max_length: number;
};
// Takes [a, b, c] and returns "a, b, and c"
@@ -27,11 +30,75 @@ function formatCodes(text: string[]) {
return `${text.slice(0, -1).join(', ')}, and ${text[text.length - 1]}`;
}
+// These are just placeholders they don't actually get passed to the player
+function randomObjectivePlaceholderText() {
+ if (Math.random() <= 0.01) {
+ const joke_objectives = [
+ 'Annoy the heads of staff as much as possible without harming them.',
+ 'Disguise as the heads of staff and confuse the crew.',
+ 'Make revolutionary artwork and vandalize the station with it.',
+ 'Mass produce picket signs and wave them around the station.',
+ 'Start a cult worshipping the proletariat.',
+ ];
+ return joke_objectives[Math.floor(Math.random() * joke_objectives.length)];
+ }
+
+ const objectives = [
+ "Sabotage the station's power grid.",
+ "Steal the Head of Personnel's pet dog.",
+ "Turn the Head of Security's team against them.",
+ "Waste the station's funds and resources.",
+ 'Blow up the Research Director with a bomb.',
+ 'Bribe the Quartermaster to self-exile.',
+ 'Capture anyone with a mindshield and have it surgically removed.',
+ 'Create an army of mechs to march on the bridge.',
+ 'Cut off the air supply to the brig.',
+ 'Equip your leaders with the best gear you can find.',
+ 'Find the remaining heads of staff and eliminate them.',
+ 'Follow your leaders as closely as possible.',
+ 'Gather weapons and armor.',
+ 'Go out in a blaze of glory.',
+ 'Lie low until we have enough numbers to strike.',
+ 'Occupy the bridge and hold it until the heads of staff surrender.',
+ 'Protect your leaders at all costs, even if it means sacrifice.',
+ 'Protest in front of the bridge.',
+ 'Rescue other revolutionaries from the brig.',
+ 'Rush the Captain and take his hat.',
+ 'Subvert the AI to betray the heads of staff.',
+ 'Take the Chief Medical Officer hostage.',
+ 'Throw the Chief Engineer into the Supermatter.',
+ 'Trick the heads of staff into exiling themselves.',
+ 'Wait for the emergency shuttle, then strike in the chaos.',
+ ];
+ return objectives[Math.floor(Math.random() * objectives.length)];
+}
+
export const AntagInfoRevolution = () => {
- const { data } = useBackend();
- const { leader, code_phrases, code_responses, heads, lone_wolf } = data;
+ const { act, data } = useBackend();
+ const {
+ leader,
+ code_phrases,
+ code_responses,
+ heads,
+ lone_wolf,
+ conversion_objective,
+ conversion_objective_max_length,
+ } = data;
+
+ const [objectivePlaceholder, setObjectivePlaceholder] = useState(
+ randomObjectivePlaceholderText(),
+ );
+
+ useEffect(() => {
+ if (!leader) return;
+ const interval = setInterval(() => {
+ setObjectivePlaceholder(randomObjectivePlaceholderText());
+ }, 30000);
+ return () => clearInterval(interval);
+ }, []);
+
return (
-
+
diff --git a/tgui/packages/tgui/interfaces/DnaConsole/MutationInfo.jsx b/tgui/packages/tgui/interfaces/DnaConsole/MutationInfo.jsx
index 3a1d32263854..3e251b4fa23c 100644
--- a/tgui/packages/tgui/interfaces/DnaConsole/MutationInfo.jsx
+++ b/tgui/packages/tgui/interfaces/DnaConsole/MutationInfo.jsx
@@ -16,6 +16,7 @@ import {
CHROMOSOME_USED,
MUT_COLORS,
MUT_EXTRA,
+ MUT_OTHER,
} from './constants';
/**
@@ -178,7 +179,11 @@ export const MutationInfo = (props) => {
{!!overclock_safety_available && (
{
export const ModulesPane = (props) => {
const { act, data } = useBackend();
+ const [showModuleList, setShowModuleList] = useSharedState(
+ 'showModuleList',
+ true,
+ );
const { modules, selected_module_index, weapons_safety } = data;
return (
}
fill
style={{ overflowY: 'auto' }}
buttons={
+ <>
act('toggle_safety')}
- content={
+ content={ showModuleList ? <> {
!weapons_safety
? 'Safety Protocols Disabled'
: 'Safety Protocols Enabled'
}
+ > :
+ null
+ }
+ />
+ setShowModuleList(!showModuleList)}
/>
+ >
}
>
@@ -94,16 +113,20 @@ export const ModulesPane = (props) => {
name={moduleSlotIcon(module.slot)}
/>
-
- {`${moduleSlotLabel(module.slot)} Slot`}
-
+ {showModuleList?
+
+ {`${moduleSlotLabel(module.slot)} Slot`}
+
+ :
+ null
+ }
) : (
@@ -126,23 +149,27 @@ export const ModulesPane = (props) => {
className={classes(['mecha_equipment32x32', module.icon])}
/>
-
- {module.name}
-
+ {showModuleList?
+
+ {module.name}
+
+ :
+ null
+ }
),
)}
- {selected_module_index !== null && modules[selected_module_index] && (
+ {selected_module_index !== null && modules[selected_module_index] && showModuleList && (
)}
diff --git a/tgui/packages/tgui/interfaces/Mecha/index.tsx b/tgui/packages/tgui/interfaces/Mecha/index.tsx
index afa739e68e16..5aff854671e7 100644
--- a/tgui/packages/tgui/interfaces/Mecha/index.tsx
+++ b/tgui/packages/tgui/interfaces/Mecha/index.tsx
@@ -10,6 +10,7 @@ import {
import { formatSiUnit } from 'tgui-core/format';
import { useBackend } from '../../backend';
+import { useSharedState } from '../../backend';
import { Window } from '../../layouts';
import { logger } from '../../logging';
import { AccessConfig } from '../common/AccessConfig';
@@ -19,8 +20,15 @@ import { ModulesPane } from './ModulesPane';
export const Mecha = (props) => {
const { data } = useBackend();
+ const [showModuleList, setShowModuleList] = useSharedState(
+ 'showModuleList',
+ true,
+ );
+ const mainWidth = 400;
+ const equipmentWidth = 400;
+ const windowWidth = mainWidth + (showModuleList ? equipmentWidth : 0);
return (
-
+
@@ -47,7 +55,7 @@ export const Content = (props) => {
return (
-
+
{
const [tab, setTab] = useSharedState('tab', 1);
const { data } = useBackend();
- const { surgeries } = data;
+ const { surgeries, techwebs } = data;
const { query, setQuery, results } = useFuzzySearch({
searchArray: surgeries,
@@ -51,12 +51,14 @@ export const OperatingComputer = () => {
>
Operation Catalog
- setTab(3)}
- >
- Experiments
-
+ {!!techwebs.length && (
+ setTab(3)}
+ >
+ Experiments
+
+ )}
diff --git a/tgui/packages/tgui/interfaces/PetBuilder.tsx b/tgui/packages/tgui/interfaces/PetBuilder.tsx
index 78622d11331e..61cb7b054b80 100644
--- a/tgui/packages/tgui/interfaces/PetBuilder.tsx
+++ b/tgui/packages/tgui/interfaces/PetBuilder.tsx
@@ -15,6 +15,7 @@ import {
import { useBackend } from '../backend';
import { Window } from '../layouts';
import { IconDisplay } from './LootPanel/IconDisplay';
+
type Data = {
pet_name: string | null;
pet_specie: string;
@@ -185,7 +186,7 @@ export const PetBuilder = (props) => {
setSelectedGender={setSelectedGender}
/>
-
+
(
-
+
carrier.carrier_color,
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/JobsPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/JobsPage.tsx
index aa67e0e94ab4..a59832bfaaca 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/JobsPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/JobsPage.tsx
@@ -301,18 +301,24 @@ function JobRow(props: JobRowProps) {
>
{
- // DARKPACK EDIT CHANGE START - ALTERNATIVE_JOB_TITLES - ORIGINAL: {name}
+ // DARKPACK EDIT CHANGE START - ALTERNATIVE_JOB_TITLES - ORIGINAL: {name}
!job.alt_titles ? (
name
) : (
-
- act('set_job_title', { job: name, new_title: value })
- }
- />
+
+
+ act('set_job_title', {
+ job: name,
+ new_title: value,
+ })
+ }
+ />
+
)
// DARKPACK EDIT CHANGE END
}
@@ -538,8 +544,8 @@ export function JobsPage() {
+ {/* // DARKPACK EDIT CHANGE, ORIGINAL: 15 */}
- {/* // DARKPACK EDIT CHANGE */}
{
// DARKPACK EDIT ADD START
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/PersonalityPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/PersonalityPage.tsx
index eeab27432bc3..cca711ba7360 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/PersonalityPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/PersonalityPage.tsx
@@ -4,9 +4,7 @@ import {
Box,
Button,
Flex,
- Icon,
Input,
- NoticeBox,
Section,
Stack,
} from 'tgui-core/components';
@@ -327,21 +325,6 @@ export function PersonalityPage() {
- {!data.mood_enabled && (
-
-
-
-
-
-
-
- Mood is disabled on this server. You can still select
- personalities, but they will have no effect.
-
-
-
-
- )}
0) {
@@ -564,7 +565,7 @@ function QuirkPage() {
}
export function QuirkPersonalityPage() {
- const [contentPage, setContentPage] = useState<'quirks'>( // DARKPACK EDIT CHANGE - ORIGINAL: const [contentPage, setContentPage] = useState<'quirks' | 'personality'>(
+ const [contentPage, setContentPage] = useState<'quirks' | 'personality'>(
'quirks',
);
@@ -580,10 +581,9 @@ export function QuirkPersonalityPage() {
align="center"
fontSize="14px"
>
- Quirks
+ Merits/Flaws
- { /* // DARKPACK EDIT REMOVAL START
- Personality
+ Nature/Demeanor
- // DARKPACK EDIT REMOVAL END */}
- { /* // DARKPACK EDIT REMOVAL START
{contentPage === 'personality' ? : }
- // DARKPACK EDIT REMOVAL END */}
- {/* DARKPACK EDIT ADD START */}
-
- {/* DARKPACK EDIT ADD END */}
);
}
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/GamePreferences/KeybindingsPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/GamePreferences/KeybindingsPage.tsx
index 34b35c04a005..9347d1f3431c 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/GamePreferences/KeybindingsPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/GamePreferences/KeybindingsPage.tsx
@@ -102,7 +102,10 @@ function formatKeyboardEvent(event: KeyboardEvent): string {
}
if (isStandardKey(event)) {
- const key = event.key.toUpperCase();
+ // Seperately pull out digits, otherwise SHIFT+1 turns into '!' and
+ // the keybinding is unusable
+ const digit = event.code?.match(/^Digit(\d)$/)?.[1];
+ const key = digit ?? event.key.toUpperCase();
text += KEY_CODE_TO_BYOND[key] || key;
}
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/types.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
index 99e0abc887e3..8a267bbffb65 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
@@ -239,7 +239,6 @@ export type PreferencesMenuData = {
selected_quirks: string[];
selected_personalities: typePath[] | null;
max_personalities: number;
- mood_enabled: BooleanLike;
splat_disallowed_quirks: string[]; // DARKPACK EDIT CHANGE - SPLATS
// DARKPACK EDIT ADD START - DISCIPLINES
discipline_levels: Record;
diff --git a/tgui/packages/tgui/interfaces/RapidPipeDispenser.tsx b/tgui/packages/tgui/interfaces/RapidPipeDispenser.tsx
index e1cf58cbfa9c..4f0a040941ff 100644
--- a/tgui/packages/tgui/interfaces/RapidPipeDispenser.tsx
+++ b/tgui/packages/tgui/interfaces/RapidPipeDispenser.tsx
@@ -3,12 +3,14 @@ import {
Box,
Button,
ColorBox,
+ Icon,
ImageButton,
LabeledList,
Section,
Stack,
StyleableSection,
Tabs,
+ Tooltip,
} from 'tgui-core/components';
import type { BooleanLike } from 'tgui-core/react';
import { capitalizeAll } from 'tgui-core/string';
@@ -63,6 +65,7 @@ type Category = {
type Recipe = {
pipe_index: number;
+ pipe_desc: string | null;
pipe_name: string;
previews: Preview[];
};
@@ -222,6 +225,20 @@ function LayerSelect(props) {
);
}
+function getRecipeTooltip(recipe: Recipe) {
+ if (!recipe.pipe_desc) return null;
+
+ const recipe_desc_br_separated = recipe.pipe_desc.split('
');
+
+ return (
+
+ {recipe_desc_br_separated.map((line, index) => (
+ {line}
+ ))}
+
+ );
+}
+
type RecipeRowProps = {
recipe: Recipe;
shownCategory: Category;
@@ -239,7 +256,20 @@ function RecipeRow(props: RecipeRowProps) {
fontWeight: 'normal',
textAlign: 'right',
}}
- title={recipe.pipe_name}
+ title={
+ recipe.pipe_desc ? (
+
+
+
+
+
+
+ {recipe.pipe_name}
+
+ ) : (
+ recipe.pipe_name
+ )
+ }
titleStyle={{
borderBottom: '1px solid var(--color-border)',
padding: 0,
diff --git a/tgui/packages/tgui/interfaces/StripMenu.tsx b/tgui/packages/tgui/interfaces/StripMenu.tsx
index 480de878b404..953f1c5cb8d5 100644
--- a/tgui/packages/tgui/interfaces/StripMenu.tsx
+++ b/tgui/packages/tgui/interfaces/StripMenu.tsx
@@ -107,6 +107,11 @@ const ALTERNATE_ACTIONS: Record = {
icon: 'power-off',
text: 'Deactivate MOD',
},
+
+ access_storage: {
+ icon: 'box-open',
+ text: 'Open',
+ },
};
const SLOTS: Record<
diff --git a/tgui/packages/tgui/interfaces/Uplink/ObjectiveElement.tsx b/tgui/packages/tgui/interfaces/Uplink/ObjectiveElement.tsx
index 87c0bf227738..d182bc3d3017 100644
--- a/tgui/packages/tgui/interfaces/Uplink/ObjectiveElement.tsx
+++ b/tgui/packages/tgui/interfaces/Uplink/ObjectiveElement.tsx
@@ -1,5 +1,4 @@
import { Box, Flex, Stack } from 'tgui-core/components';
-import { classes } from 'tgui-core/react';
export type Objective = {
id: number;
@@ -18,14 +17,7 @@ export const ObjectiveElement = (props: ObjectiveElementProps) => {
return (
-
+
{name}
diff --git a/tgui/packages/tgui/interfaces/Uplink/calculateDangerLevel.tsx b/tgui/packages/tgui/interfaces/Uplink/calculateDangerLevel.tsx
deleted file mode 100644
index 2109feffb3c0..000000000000
--- a/tgui/packages/tgui/interfaces/Uplink/calculateDangerLevel.tsx
+++ /dev/null
@@ -1,148 +0,0 @@
-import { Box, Flex } from 'tgui-core/components';
-
-export const calculateProgression = (progression_points: number) => {
- return Math.round(progression_points / 6) / 10;
-};
-
-const badGradient = 'reputation-bad';
-const normalGradient = 'reputation-normal';
-const goodGradient = 'reputation-good';
-const veryGoodGradient = 'reputation-very-good';
-const ultraGoodGradient = 'reputation-super-good';
-const bestGradient = 'reputation-best';
-
-export type Rank = {
- minutesLessThan: number;
- title: string;
- gradient: string;
-};
-
-export const ranks: Rank[] = [
- {
- minutesLessThan: 5,
- title: 'None',
- gradient: badGradient,
- },
- {
- minutesLessThan: 10,
- title: 'Miniscule',
- gradient: normalGradient,
- },
- {
- minutesLessThan: 20,
- title: 'Insignificant',
- gradient: normalGradient,
- },
- {
- minutesLessThan: 30,
- title: 'Low',
- gradient: goodGradient,
- },
- {
- minutesLessThan: 50,
- title: 'Standard',
- gradient: goodGradient,
- },
- {
- minutesLessThan: 70,
- title: 'Moderate',
- gradient: veryGoodGradient,
- },
- {
- minutesLessThan: 90,
- title: 'Significant',
- gradient: veryGoodGradient,
- },
- {
- minutesLessThan: 110,
- title: 'High',
- gradient: ultraGoodGradient,
- },
- {
- minutesLessThan: 140,
- title: 'Extreme',
- gradient: ultraGoodGradient,
- },
- {
- minutesLessThan: -1,
- title: 'Pinnacle',
- gradient: bestGradient,
- },
-];
-
-let lastMinutesThan = -1;
-export const dangerLevelsTooltip = (
-
-
- {ranks.map((value) => {
- if (lastMinutesThan === -1) {
- lastMinutesThan = 0;
- }
- const progression = calculateProgression(lastMinutesThan * 600);
- const text = `${value.title} (${progression})`;
-
- lastMinutesThan = value.minutesLessThan;
- return (
-
-
- {text}
-
-
- );
- })}
-
-
-);
-
-export const getDangerLevel = (progression_points: number) => {
- const minutes = progression_points / 600;
-
- for (let index = 0; index < ranks.length; index++) {
- const rank = ranks[index];
- if (minutes < rank.minutesLessThan) {
- return rank;
- }
- }
-
- return ranks[ranks.length - 1];
-};
-
-export const calculateDangerLevel = (
- progression_points: number,
- textOnly: boolean,
-) => {
- const minutes = progression_points / 600;
- const displayedProgression = calculateProgression(progression_points);
- const dangerLevel = getDangerLevel(progression_points);
- if (textOnly) {
- return (
-
- {dangerLevel.title} ({displayedProgression})
-
- );
- }
- return (
-
- {dangerLevel.title} ({displayedProgression})
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/Uplink/index.tsx b/tgui/packages/tgui/interfaces/Uplink/index.tsx
index 7e2a65519a77..01673c9e9941 100644
--- a/tgui/packages/tgui/interfaces/Uplink/index.tsx
+++ b/tgui/packages/tgui/interfaces/Uplink/index.tsx
@@ -7,7 +7,6 @@ import {
Section,
Stack,
Tabs,
- Tooltip,
} from 'tgui-core/components';
import { fetchRetry } from 'tgui-core/http';
import type { BooleanLike } from 'tgui-core/react';
@@ -15,11 +14,6 @@ import type { BooleanLike } from 'tgui-core/react';
import { resolveAsset } from '../../assets';
import { useBackend } from '../../backend';
import { Window } from '../../layouts';
-import {
- calculateDangerLevel,
- calculateProgression,
- dangerLevelsTooltip,
-} from './calculateDangerLevel';
import { GenericUplink, type Item } from './GenericUplink';
import { PrimaryObjectiveMenu } from './PrimaryObjectiveMenu';
@@ -37,7 +31,6 @@ type UplinkItem = {
stock_key: string;
restricted_roles: string;
restricted_species: string;
- progression_minimum: number;
population_minimum: number;
cost_override_string: string;
lock_other_purchases: BooleanLike;
@@ -46,10 +39,8 @@ type UplinkItem = {
type UplinkData = {
telecrystals: number;
- progression_points: number;
joined_population?: number;
lockable: BooleanLike;
- current_progression_scaling: number;
uplink_flag: number;
assigned_role: string;
assigned_species: string;
@@ -61,8 +52,6 @@ type UplinkData = {
current_stock: {
[key: string]: number;
};
-
- has_progression: BooleanLike;
primary_objectives: {
[key: number]: string;
};
@@ -120,15 +109,6 @@ export class Uplink extends Component {
const uplinkSpecies = data.assigned_species;
const uplinkData = await fetchServerData;
- uplinkData.items = uplinkData.items.sort((a, b) => {
- if (a.progression_minimum < b.progression_minimum) {
- return -1;
- }
- if (a.progression_minimum > b.progression_minimum) {
- return 1;
- }
- return 0;
- });
const availableCategories: string[] = [];
uplinkData.items = uplinkData.items.filter((value) => {
@@ -172,12 +152,9 @@ export class Uplink extends Component {
const { data, act } = useBackend();
const {
telecrystals,
- progression_points,
joined_population,
primary_objectives,
can_renegotiate,
- has_progression,
- current_progression_scaling,
extra_purchasable,
extra_purchasable_stock,
current_stock,
@@ -197,8 +174,6 @@ export class Uplink extends Component {
}
for (let i = 0; i < itemsToAdd.length; i++) {
const item = itemsToAdd[i];
- const hasEnoughProgression =
- progression_points >= item.progression_minimum;
const hasEnoughPop =
!joined_population || joined_population >= item.population_minimum;
@@ -229,21 +204,7 @@ export class Uplink extends Component {
null}
>
),
- cost: (
-
- {item.cost_override_string || `${item.cost} TC`}
- {has_progression ? (
- <>
- ,
-
- {calculateDangerLevel(item.progression_minimum, true)}
-
- >
- ) : (
- ''
- )}
-
- ),
+ cost: {item.cost_override_string || `${item.cost} TC`},
population_tooltip:
'This item is not cleared for operations performed against stations crewed by fewer than ' +
item.population_minimum +
@@ -252,7 +213,6 @@ export class Uplink extends Component {
disabled:
!canBuy ||
!hasEnoughPop ||
- (has_progression && !hasEnoughProgression) ||
(item.lock_other_purchases && purchased_items > 0),
extraData: {
ref: item.ref,
@@ -269,33 +229,6 @@ export class Uplink extends Component {
- {!!has_progression && (
-
-
-
- Your current level of threat. Threat
- determines what items you can purchase.
-
- {/* A minute in deciseconds */}
- Threat passively increases by{' '}
-
- {calculateProgression(
- current_progression_scaling,
- )}
-
- every minute
-
- {dangerLevelsTooltip}
-
-
- }
- >
- {calculateDangerLevel(progression_points, false)}
-
-
- )}
{!!primary_objectives && (
diff --git a/tgui/packages/tgui/layouts/Window.tsx b/tgui/packages/tgui/layouts/Window.tsx
index a24b7dc9ec46..b1088990be43 100644
--- a/tgui/packages/tgui/layouts/Window.tsx
+++ b/tgui/packages/tgui/layouts/Window.tsx
@@ -72,8 +72,10 @@ export function Window(props: Props) {
const { scale } = config?.window || false;
useEffect(() => {
+ let cancelled = false;
+
if (!suspended && isReadyToRender) {
- const updateGeometry = () => {
+ const updateGeometry = async () => {
const options = {
...config.window,
size: DEFAULT_SIZE,
@@ -85,7 +87,10 @@ export function Window(props: Props) {
if (config.window?.key) {
setWindowKey(config.window.key);
}
- recallWindowGeometry(options);
+ await recallWindowGeometry(options);
+ if (cancelled) {
+ return;
+ }
Byond.winset(Byond.windowId, {
'is-visible': true,
});
@@ -102,9 +107,10 @@ export function Window(props: Props) {
updateGeometry();
}
return () => {
+ cancelled = true;
logger.log('unmounting');
};
- }, [isReadyToRender, width, height, scale]);
+ }, [isReadyToRender, suspended, width, height, scale]);
// Determine when to show dimmer
const showDimmer =
diff --git a/tgui/packages/tgui/styles/interfaces/Uplink.scss b/tgui/packages/tgui/styles/interfaces/Uplink.scss
index 17d5ea78aace..93149f71b22d 100644
--- a/tgui/packages/tgui/styles/interfaces/Uplink.scss
+++ b/tgui/packages/tgui/styles/interfaces/Uplink.scss
@@ -1,74 +1,12 @@
-$badGradient: linear-gradient(
- to right,
- hsl(0, 67%, 37%),
- hsl(0, 43%, 28%),
- hsl(0, 67%, 37%)
-);
-$normalGradient: linear-gradient(
- to right,
- hsl(30, 14%, 34%),
- hsl(30, 20%, 19%),
- hsl(30, 14%, 34%)
-);
-$goodGradient: linear-gradient(
- to right,
- hsl(210, 11%, 37%),
- hsl(210, 14%, 17%),
- hsl(210, 11%, 37%)
-);
-$veryGoodGradient: linear-gradient(
+$titlebarGradient: linear-gradient(
to right,
hsl(36, 38%, 44%),
hsl(36, 33%, 19%),
hsl(36, 38%, 44%)
);
-$superGoodGradient: linear-gradient(
- to right,
- hsl(60, 39%, 45%),
- hsl(60, 35%, 34%),
- hsl(60, 39%, 45%)
-);
-$bestGradient: linear-gradient(
- to right,
- hsl(330, 34%, 45%),
- hsl(330, 43%, 26%),
- hsl(330, 34%, 45%)
-);
-
-$_rep_map: (
- 'bad': $badGradient,
- 'normal': $normalGradient,
- 'good': $goodGradient,
- 'very-good': $veryGoodGradient,
- 'super-good': $superGoodGradient,
- 'best': $bestGradient,
-);
-
-@each $reputation-name, $gradient-value in $_rep_map {
- .reputation-#{$reputation-name} {
- background-image: $gradient-value !important;
- }
-
- .reputation-#{$reputation-name}.Button {
- background-position: 0 0;
- transition: background-position var(--transition-time-fast);
-
- &:hover {
- transition: background-position 0ms;
- }
-
- &:active {
- transition: background-position var(--transition-time-medium);
- }
-
- &:hover,
- &:active {
- background-position: 50em 0;
- }
- }
-}
.UplinkObjective__Titlebar {
+ background-image: $titlebarGradient;
padding: var(--space-ml) var(--space-l) var(--space-m);
font-weight: bold;
border: var(--border-thickness-small) solid var(--color-black);
diff --git a/tools/UpdatePaths/Scripts/97571_brain_processor_refactor.txt b/tools/UpdatePaths/Scripts/97571_brain_processor_refactor.txt
new file mode 100644
index 000000000000..7a13ea81aa3e
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/97571_brain_processor_refactor.txt
@@ -0,0 +1,2 @@
+/obj/item/mmi/posibrain/@SUBTYPES : /obj/item/brain_processor/positronic/@SUBTYPES{@OLD}
+/obj/item/mmi/@SUBTYPES : /obj/item/brain_processor/organic/@SUBTYPES{@OLD}
diff --git a/tools/UpdatePaths/Scripts/97659_new_pdas.txt b/tools/UpdatePaths/Scripts/97659_new_pdas.txt
new file mode 100644
index 000000000000..bbe470c76a14
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/97659_new_pdas.txt
@@ -0,0 +1,35 @@
+# PDAs were repathed to be a subtype of /crew so non-station PDAs would not be included in the PDA Painter.
+
+/obj/item/modular_computer/pda : /obj/item/modular_computer/pda/crew
+/obj/item/modular_computer/pda/clown : /obj/item/modular_computer/pda/crew/clown
+/obj/item/modular_computer/pda/mime : /obj/item/modular_computer/pda/crew/mime
+/obj/item/modular_computer/pda/medical : /obj/item/modular_computer/pda/crew/medical
+/obj/item/modular_computer/pda/coroner : /obj/item/modular_computer/pda/crew/coroner
+/obj/item/modular_computer/pda/engineering : /obj/item/modular_computer/pda/crew/engineering
+/obj/item/modular_computer/pda/security : /obj/item/modular_computer/pda/crew/security
+/obj/item/modular_computer/pda/detective : /obj/item/modular_computer/pda/crew/detective
+/obj/item/modular_computer/pda/warden : /obj/item/modular_computer/pda/crew/warden
+/obj/item/modular_computer/pda/janitor : /obj/item/modular_computer/pda/crew/janitor
+/obj/item/modular_computer/pda/science : /obj/item/modular_computer/pda/crew/science
+/obj/item/modular_computer/pda/heads/quartermaster : /obj/item/modular_computer/pda/crew/heads/quartermaster
+/obj/item/modular_computer/pda/heads/hop : /obj/item/modular_computer/pda/crew/heads/hop
+/obj/item/modular_computer/pda/heads/hos : /obj/item/modular_computer/pda/crew/heads/hos
+/obj/item/modular_computer/pda/heads/cmo : /obj/item/modular_computer/pda/crew/heads/cmo
+/obj/item/modular_computer/pda/heads/ce : /obj/item/modular_computer/pda/crew/heads/ce
+/obj/item/modular_computer/pda/heads/rd : /obj/item/modular_computer/pda/crew/heads/rd
+/obj/item/modular_computer/pda/heads/captain : /obj/item/modular_computer/pda/crew/heads/captain
+/obj/item/modular_computer/pda/cargo : /obj/item/modular_computer/pda/crew/cargo
+/obj/item/modular_computer/pda/bitrunner : /obj/item/modular_computer/pda/crew/bitrunner
+/obj/item/modular_computer/pda/shaftminer : /obj/item/modular_computer/pda/crew/shaftminer
+/obj/item/modular_computer/pda/chaplain : /obj/item/modular_computer/pda/crew/chaplain
+/obj/item/modular_computer/pda/lawyer : /obj/item/modular_computer/pda/crew/lawyer
+/obj/item/modular_computer/pda/botanist : /obj/item/modular_computer/pda/crew/botanist
+/obj/item/modular_computer/pda/roboticist : /obj/item/modular_computer/pda/crew/roboticist
+/obj/item/modular_computer/pda/curator : /obj/item/modular_computer/pda/crew/curator
+/obj/item/modular_computer/pda/cook : /obj/item/modular_computer/pda/crew/cook
+/obj/item/modular_computer/pda/bar : /obj/item/modular_computer/pda/crew/bar
+/obj/item/modular_computer/pda/atmos : /obj/item/modular_computer/pda/crew/atmos
+/obj/item/modular_computer/pda/chemist : /obj/item/modular_computer/pda/crew/chemist
+/obj/item/modular_computer/pda/geneticist : /obj/item/modular_computer/pda/crew/geneticist
+/obj/item/modular_computer/pda/psychologist : /obj/item/modular_computer/pda/crew/psychologist
+/obj/item/modular_computer/pda/assistant : /obj/item/modular_computer/pda/crew/assistant
diff --git a/tools/UpdatePaths/Scripts/97836_relic_assemblies.txt b/tools/UpdatePaths/Scripts/97836_relic_assemblies.txt
new file mode 100644
index 000000000000..8b57f34ce29f
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/97836_relic_assemblies.txt
@@ -0,0 +1 @@
+/obj/item/relic/@SUBTYPES : /obj/item/assembly/relic/@SUBTYPES{@OLD}
diff --git a/tools/build/build_flags.json b/tools/build/build_flags.jsonc
similarity index 76%
rename from tools/build/build_flags.json
rename to tools/build/build_flags.jsonc
index 7d52bdb3c12f..2a623e91b803 100644
--- a/tools/build/build_flags.json
+++ b/tools/build/build_flags.jsonc
@@ -8,23 +8,22 @@
"define": "AUTOSTART_GAME",
"label": "Auto Start",
"category": "Testing",
- "description": "Start the game as soon as initializations finish."
+ "description": "Start the game as soon as initializations finish.",
},
{
"id": "TESTING",
"define": "TESTING",
"label": "Testing",
"category": "Testing",
- "description": "Enables testing() debug messages. Also turns on DATUMVAR_DEBUGGING_MODE, atmos/lighting update visualisers and max-share tracking."
+ "description": "Enables testing() debug messages. Also turns on DATUMVAR_DEBUGGING_MODE, atmos/lighting update visualisers and max-share tracking.",
},
-
{
"id": "REAGENTS_TESTING",
"define": "REAGENTS_TESTING",
"label": "Reagents testing",
- "category": "Testineg",
+ "category": "Testing",
"description": "Debug messages for every reaction step (very spammy). Requires TESTING.",
- "requires": ["TESTING"]
+ "requires": ["TESTING"],
},
{
"id": "FORCE_MAP",
@@ -35,58 +34,52 @@
"valueFormat": "quoted",
"description": "Overrides the map loaded at round start.",
"options": [
- { "value": "", "label": "default" },
- { "value": "deltastation", "label": "Delta Station" },
- { "value": "icebox", "label": "Ice Box Station" },
- { "value": "metastation", "label": "MetaStation" },
- { "value": "tramstation", "label": "Tramstation" },
- { "value": "nebulastation", "label": "NebulaStation" },
- { "value": "kilostation", "label": "Kilostation" },
- { "value": "catwalkstation", "label": "Catwalk Station" },
- { "value": "gateway_test", "label": "Gateway Test (test)" },
- { "value": "multiz_debug", "label": "MultiZ Debug (test)" },
- { "value": "runtimestation", "label": "Runtime Station (low memory)" },
+ // value is the map's identifier from maps.txt, label is what
+ // appears in the build flags force map dropdown.
+ { "value": "", "label": "default (cached next map or default map)" },
+ { "value": "westfieldmall", "label": "Westfield Mall" },
+ { "value": "runtimetown", "label": "Runtime Town (low memory)" },
{
"value": "runtimestation_minimal",
"label": "Minimal Runtime Station. Only works with minimal CentCom.",
- "requires": ["MINIMAL_CENTCOM", "SKIP_LAVALAND", "SKIP_SPACE_LEVELS"]
- }
- ]
+ "requires": ["MINIMAL_CENTCOM", "SKIP_LAVALAND", "SKIP_SPACE_LEVELS"],
+ },
+ ],
},
{
"id": "MAP_TEST",
"define": "MAP_TEST",
"label": "Map test mode",
"category": "Map",
- "description": "Disables common annoyances (rat spawns, random light breakage) so mappers can test without shenanigans."
+ "description": "Disables common annoyances (rat spawns, random light breakage) so mappers can test without shenanigans.",
},
{
"id": "SKIP_LAVALAND",
"define": "SKIP_LAVALAND",
"label": "No Lavaland",
"category": "Map",
- "description": "Prevents Lavaland from loading in."
+ "description": "Prevents Lavaland from loading in.",
},
{
"id": "SKIP_SPACE_LEVELS",
"define": "SKIP_SPACE_LEVELS",
"label": "No space ruins",
"category": "Map",
- "description": "Makes no space levels load in."
+ "description": "Makes no space levels load in.",
},
{
"id": "TIMER_DEBUG",
"define": "TIMER_DEBUG",
"label": "Timer debug",
"category": "Debugging",
- "description": "Compiles full timer debug info. Warning: increases timer creation cost ~5x."
+ "description": "Compiles full timer debug info. Warning: increases timer creation cost ~5x.",
},
{
"id": "REFERENCE_DOING_IT_LIVE",
"define": "REFERENCE_DOING_IT_LIVE",
"label": "Reference tracking (live)",
"category": "Debugging",
- "description": "Sets up the ref tracker for a live environment, logging hard-deletes to harddels.log. Uses fast reftracking but less accurate."
+ "description": "Sets up the ref tracker for a live environment, logging hard-deletes to harddels.log. Uses fast reftracking but less accurate.",
},
{
"id": "REFERENCE_TRACKING_STANDARD",
@@ -94,70 +87,70 @@
"label": "Reference tracking (standard)",
"category": "Debugging",
"description": "Local hard-deletion hunting. Spends all its time searching (slower but thorough), logging to harddels.log.",
- "conflictsWith": ["REFERENCE_DOING_IT_LIVE"]
+ "conflictsWith": ["REFERENCE_DOING_IT_LIVE"],
},
{
"id": "DATUMVAR_DEBUGGING_MODE",
"define": "DATUMVAR_DEBUGGING_MODE",
"label": "Datum var debugging",
"category": "Debugging",
- "description": "Caches datum vars so you can retrieve them later to see which vars changed. Implied by TESTING."
+ "description": "Caches datum vars so you can retrieve them later to see which vars changed. Implied by TESTING.",
},
{
"id": "UNIT_TESTS",
"define": "UNIT_TESTS",
"label": "Unit tests",
"category": "Testing",
- "description": "Runs all unit tests, then shuts down."
+ "description": "Runs all unit tests, then shuts down.",
},
{
"id": "USE_BYOND_TRACY",
"define": "USE_BYOND_TRACY",
"label": "byond-tracy profiler",
"category": "Performance",
- "description": "Attempts to load prof.dll/libprof.so on boot for Tracy profiling. You must build byond-tracy yourself look at the guide for info."
+ "description": "Attempts to load prof.dll/libprof.so on boot for Tracy profiling. You must build byond-tracy yourself look at the guide for info.",
},
{
"id": "MC_TAB_TRACY_INFO",
"define": "MC_TAB_TRACY_INFO",
"label": "byond-tracy MC tab info",
"category": "Performance",
- "description": "Displays byond-tracy's status in the MC tab."
+ "description": "Displays byond-tracy's status in the MC tab.",
},
{
"id": "PERFORMANCE_TESTS",
"define": "PERFORMANCE_TESTS",
"label": "Performance tests",
"category": "Performance",
- "description": "Boots, runs world.run_performance_tests(), then shuts down the server."
+ "description": "Boots, runs world.run_performance_tests(), then shuts down the server.",
},
{
"id": "DO_NOT_DEFER_ASSETS",
"define": "DO_NOT_DEFER_ASSETS",
"label": "Do not defer assets",
"category": "Performance",
- "description": "Generates all assets up front during initialize instead of deferring them when needed."
+ "description": "Generates all assets up front during initialize instead of deferring them when needed.",
},
{
"id": "PROFILE_MAPLOAD_INIT_ATOM",
"define": "PROFILE_MAPLOAD_INIT_ATOM",
"label": "Profile mapload init atom",
"category": "Performance",
- "description": "Profiles atom initialization during map load."
+ "description": "Profiles atom initialization during map load.",
},
{
"id": "DISABLE_DREAMLUAU",
"define": "DISABLE_DREAMLUAU",
"label": "Disable Dreamluau",
"category": "Misc",
- "description": "Fully disables Dreamluau."
+ "description": "Fully disables Dreamluau.",
},
{
"id": "VERB_STRESS_TEST",
"define": "VERB_STRESS_TEST",
"label": "Verb stress test",
"category": "Performance",
- "description": "Forces verb processing into just the 2% of a tick we normally reserve for it, for simulating highpop."
+ "description": "Forces verb processing into just the 2% of a tick we normally reserve for it, for simulating highpop.",
},
{
"id": "FORCE_VERB_OVERTIME",
@@ -165,21 +158,21 @@
"label": "Force verb overtime",
"category": "Performance",
"description": "Forces all verbs to run into overtime all of the time, negating the reserve 2%.",
- "requires": ["VERB_STRESS_TEST"]
+ "requires": ["VERB_STRESS_TEST"],
},
{
"id": "ALL_TEMPLATES",
"define": "ALL_TEMPLATES",
"label": "All templates",
"category": "Map",
- "description": "Includes all map templates in the build (needed for some map/ruin testing)."
+ "description": "Includes all map templates in the build (needed for some map/ruin testing).",
},
{
"id": "ALL_MAPS",
"define": "ALL_MAPS",
"label": "All maps",
"category": "Map",
- "description": "Includes every station map in the compiled build instead of just the ones referenced dynamically."
+ "description": "Includes every station map in the compiled build instead of just the ones referenced dynamically.",
},
{
"id": "MINIMAL_CENTCOM",
@@ -187,15 +180,22 @@
"label": "Minimal CentCom",
"category": "Map",
"description": "Uses a mini centcom. Required for runtimestation minimal and cant be used without it.",
- "requiresValues": { "force_map": "runtimestation_minimal" }
- }
+ "requiresValues": { "force_map": "runtimestation_minimal" },
+ },
+ {
+ "id": "FORCE_GENERATE_INIT_ASSETS",
+ "define": "FORCE_GENERATE_INIT_ASSETS",
+ "label": "Generate Init Assets",
+ "category": "Misc",
+ "description": "Enables init assets generation - identical to the config entry 'generate_assets_in_init'.",
+ },
],
"presets": [
{
"id": "LOW_MEMORY",
"label": "Low memory mode",
"flags": ["SKIP_LAVALAND", "SKIP_SPACE_LEVELS"],
- "values": { "force_map": "runtimestation" }
+ "values": { "force_map": "runtimestation" },
},
{
"id": "ABSOLUTE_MINIMUM",
@@ -204,9 +204,9 @@
"SKIP_LAVALAND",
"SKIP_SPACE_LEVELS",
"AUTOSTART_GAME",
- "MINIMAL_CENTCOM"
+ "MINIMAL_CENTCOM",
],
- "values": { "force_map": "runtimestation_minimal" }
+ "values": { "force_map": "runtimestation_minimal" },
},
{
"id": "TESTING",
@@ -215,8 +215,8 @@
"TESTING",
"REAGENTS_TESTING",
"TIMER_DEBUG",
- "REFERENCE_DOING_IT_LIVE"
- ]
+ "REFERENCE_DOING_IT_LIVE",
+ ],
},
{
"id": "TESTING_LOW_MEMORY",
@@ -227,14 +227,14 @@
"TESTING",
"REAGENTS_TESTING",
"TIMER_DEBUG",
- "REFERENCE_DOING_IT_LIVE"
+ "REFERENCE_DOING_IT_LIVE",
],
- "values": { "force_map": "runtimestation" }
+ "values": { "force_map": "runtimestation" },
},
{
"id": "MAP_TESTING",
"label": "Map testing",
- "flags": ["TESTING", "MAP_TEST"]
- }
- ]
+ "flags": ["TESTING", "MAP_TEST"],
+ },
+ ],
}
diff --git a/tools/ci/check_grep.sh b/tools/ci/check_grep.sh
index 8d73a0df22cc..c2c7b42fa39b 100755
--- a/tools/ci/check_grep.sh
+++ b/tools/ci/check_grep.sh
@@ -123,6 +123,12 @@ if $grep '^\t+ [^ *]' "${code_files[@]}"; then
echo -e "${RED}ERROR: Mixed indentation detected, please stick to tab indentation.${NC}"
st=1
fi;
+part "CRLF line endings"
+if $grep -l '\r' "${code_files[@]}"; then
+ echo
+ echo -e "${RED}ERROR: File(s) with CRLF line endings detected, convert line endings to LF with 'git add --renormalize ' and re-commit.${NC}"
+ st=1
+fi;
section "unit tests"
unit_test_files="code/modules/unit_tests/**/**.dm"