diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 5eab6b6db5b360..ef65853ce232ee 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -2684,6 +2684,7 @@
pixel_x = 24;
req_access = list("hos")
},
+/obj/item/storage/toolbox/guncase/skyrat/hos_revolver,
/turf/open/floor/wood,
/area/station/command/heads_quarters/hos)
"akf" = (
@@ -6392,6 +6393,7 @@
/area/station/medical/paramedic)
"awX" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"awY" = (
@@ -12684,7 +12686,7 @@
id = "barshutters";
name = "Bar Lockdown";
pixel_x = 28;
- req_access = list("bar")
+ req_one_access = list("bar")
},
/obj/item/radio/intercom{
pixel_y = 26
@@ -17240,23 +17242,21 @@
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"bls" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/station/hallway/primary/central)
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/curtain/cloth/fancy,
+/turf/open/floor/plating,
+/area/station/maintenance/department/science)
"blt" = (
/obj/machinery/door/firedoor,
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
"blu" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
+/obj/item/toy/plush/skyrat/igneous_synth{
+ desc = "Stinky Synth Snoodl!";
+ name = "Dalton Snoodle"
},
-/turf/open/floor/iron,
-/area/station/hallway/primary/central)
+/turf/open/space/basic,
+/area/space/nearstation)
"blv" = (
/obj/structure/table,
/obj/item/pai_card,
@@ -17552,24 +17552,12 @@
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"bmA" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/iron,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
/area/station/medical/medbay/lobby)
"bmB" = (
-/obj/structure/sign/poster/official/random/directional/south,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/light/directional/south,
-/turf/open/floor/iron,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
/area/station/hallway/primary/central)
"bmC" = (
/turf/open/floor/iron,
@@ -17843,6 +17831,7 @@
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"bnI" = (
@@ -18071,21 +18060,20 @@
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
"boO" = (
-/obj/structure/table/glass,
-/obj/item/stack/medical/gauze,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 6
},
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"boP" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron/dark,
-/area/station/hallway/primary/aft)
+/obj/structure/sink/kitchen/directional/south,
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"boQ" = (
-/obj/structure/closet/firecloset/full,
/obj/effect/turf_decal/delivery,
+/obj/structure/closet/emcloset,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/aft)
"boU" = (
@@ -18824,11 +18812,18 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
-/obj/structure/table,
/obj/item/book/manual/wiki/security_space_law{
pixel_x = 3;
pixel_y = 4
},
+/obj/structure/table,
+/obj/item/screwdriver{
+ pixel_y = 10
+ },
+/obj/machinery/recharger{
+ pixel_y = 4
+ },
+/obj/item/radio/off,
/turf/open/floor/iron,
/area/station/security/checkpoint/medical)
"brk" = (
@@ -19284,18 +19279,29 @@
dir = 8
},
/obj/structure/cable,
+/obj/effect/landmark/start/orderly,
/turf/open/floor/iron,
/area/station/security/checkpoint/medical)
"bsK" = (
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
"bsL" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/landmark/start/orderly,
/obj/structure/chair/office/light{
dir = 1
},
/obj/structure/cable,
+/obj/effect/landmark/start/orderly,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 8
+ },
+/obj/item/radio/intercom{
+ pixel_x = 28
+ },
+/obj/machinery/camera/directional/east{
+ c_tag = "Medbay Orderly Office";
+ name = "medbay camera";
+ network = list("ss13","medbay")
+ },
/turf/open/floor/iron,
/area/station/security/checkpoint/medical)
"bsN" = (
@@ -19305,12 +19311,6 @@
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 8
},
-/obj/machinery/button/door{
- id = "plumbing_shutters";
- name = "Plumbing Shutter Control";
- pixel_x = -25;
- req_access = list("chemistry")
- },
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
"bsR" = (
@@ -19624,15 +19624,18 @@
dir = 8
},
/obj/structure/cable,
+/obj/structure/filingcabinet,
/turf/open/floor/iron,
/area/station/security/checkpoint/medical)
"bul" = (
-/obj/structure/filingcabinet,
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/machinery/firealarm/directional/south,
+/obj/machinery/light/directional/south,
+/obj/structure/closet/secure_closet/security/med,
+/obj/machinery/airalarm/directional/east,
/turf/open/floor/iron,
/area/station/security/checkpoint/medical)
"bum" = (
@@ -19644,17 +19647,15 @@
/turf/open/floor/iron/white,
/area/station/command/heads_quarters/cmo)
"bun" = (
-/obj/structure/closet/secure_closet/security/med,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
+/obj/machinery/door/airlock/maintenance{
+ name = "Maintenance Access"
},
-/obj/effect/turf_decal/tile/red{
- dir = 4
+/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance,
+/obj/effect/mapping_helpers/airlock/unres{
+ dir = 8
},
-/obj/machinery/airalarm/directional/east,
-/turf/open/floor/iron,
-/area/station/security/checkpoint/medical)
+/turf/open/floor/plating,
+/area/station/maintenance/department/engine)
"bup" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -19859,6 +19860,9 @@
name = "Plumbing Shutter"
},
/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/medical/glass{
+ name = "Pharmacy"
+ },
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
"bvo" = (
@@ -22156,6 +22160,11 @@
/turf/open/floor/plating,
/area/station/medical/surgery)
"bFP" = (
+/obj/structure/rack,
+/obj/item/gun/ballistic/automatic/smartgun,
+/obj/item/ammo_box/magazine/smartgun,
+/obj/item/ammo_box/magazine/smartgun,
+/obj/item/ammo_box/magazine/smartgun_drum,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
"bFS" = (
@@ -30004,8 +30013,6 @@
/obj/effect/turf_decal/plaque{
icon_state = "L5"
},
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"cpK" = (
@@ -30042,8 +30049,6 @@
/obj/effect/turf_decal/plaque{
icon_state = "L6"
},
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"cpQ" = (
@@ -30140,13 +30145,13 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 8
},
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"cqh" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/purple,
-/turf/open/floor/iron,
-/area/station/hallway/primary/aft)
+/turf/open/floor/iron/kitchen/small,
+/area/station/maintenance/department/science)
"cqi" = (
/obj/effect/turf_decal/tile/purple/half,
/turf/open/floor/iron,
@@ -32273,9 +32278,13 @@
/turf/open/floor/engine/n2,
/area/station/engineering/atmos)
"cDB" = (
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/department/science)
+/obj/machinery/camera/preset/ordnance{
+ c_tag = "Bomb Testing Site 2";
+ dir = 8;
+ name = "Hardened Bomb-Test Camera2"
+ },
+/turf/open/space/basic,
+/area/space/nearstation)
"cDD" = (
/obj/item/stock_parts/power_store/cell/crank,
/obj/effect/decal/cleanable/blood/old,
@@ -33855,12 +33864,9 @@
/turf/open/floor/iron/white,
/area/station/science/auxlab)
"dOM" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 8
- },
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/security/checkpoint/medical)
+/obj/structure/mineral_door/wood,
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"dPx" = (
/obj/structure/table,
/turf/open/floor/plating,
@@ -34213,16 +34219,14 @@
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"eeF" = (
-/obj/structure/chair{
- dir = 8
- },
-/obj/structure/sign/poster/official/random/directional/south,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
+/obj/machinery/button/door{
+ id = "plumbing_shutters";
+ name = "Plumbing Shutter Control";
+ pixel_x = -25;
+ req_access = list("chemistry")
},
-/obj/machinery/light/directional/south,
-/turf/open/floor/iron,
-/area/station/hallway/primary/central)
+/turf/open/floor/iron/white,
+/area/station/medical/chemistry)
"efu" = (
/obj/structure/chair/stool,
/obj/effect/landmark/start/scientist,
@@ -34232,7 +34236,6 @@
/obj/machinery/door/airlock/maintenance{
name = "Mineral Room"
},
-/obj/effect/mapping_helpers/airlock/abandoned,
/turf/open/floor/plating,
/area/station/maintenance/department/science)
"efY" = (
@@ -35623,11 +35626,7 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
-/obj/structure/table,
-/obj/item/screwdriver{
- pixel_y = 10
- },
-/obj/item/radio/off,
+/obj/machinery/computer/records/medical,
/turf/open/floor/iron,
/area/station/security/checkpoint/medical)
"fgT" = (
@@ -35884,6 +35883,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible,
/turf/open/floor/plating,
/area/station/medical/cryo)
+"fpH" = (
+/obj/structure/table/wood,
+/obj/item/flashlight/flare/candle/infinite,
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"fpQ" = (
/obj/structure/training_machine,
/obj/item/target/syndicate,
@@ -36593,13 +36597,13 @@
/turf/open/floor/iron/white,
/area/station/science/ordnance/storage)
"fMs" = (
-/obj/machinery/camera/preset/ordnance{
- c_tag = "Bomb Testing Site2";
- dir = 8;
- name = "Hardened Bomb-Test Camera2"
+/obj/effect/turf_decal/trimline/blue/line{
+ dir = 4
},
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/white,
+/area/station/medical/medbay/lobby)
"fMB" = (
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 8
@@ -37587,6 +37591,10 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/department/crew_quarters/dorms)
+"gtW" = (
+/obj/machinery/shower/directional/east,
+/turf/open/floor/iron/kitchen/small,
+/area/station/maintenance/department/science)
"gue" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -37675,6 +37683,10 @@
/obj/effect/turf_decal/trimline/purple/filled/warning,
/turf/open/floor/iron/white,
/area/station/science/research)
+"gxc" = (
+/obj/structure/closet/secure_closet/freezer/fridge,
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"gxe" = (
/obj/machinery/door/airlock/hop{
name = "Head of Personnel's Office"
@@ -38721,15 +38733,9 @@
/turf/open/floor/iron,
/area/station/engineering/atmos/office)
"hjy" = (
-/obj/machinery/computer/records/medical,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/security/checkpoint/medical)
+/obj/structure/closet/cabinet,
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"hko" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/disposalpipe/segment{
@@ -38849,6 +38855,9 @@
/obj/effect/turf_decal/bot_blue,
/obj/structure/rack,
/obj/item/storage/toolbox/guncase/skyrat/carwo_large_case,
+/obj/item/storage/toolbox/guncase/skyrat/carwo_large_case,
+/obj/item/storage/toolbox/guncase/skyrat/carwo_large_case,
+/obj/item/storage/toolbox/guncase/skyrat/carwo_large_case,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
"hrf" = (
@@ -39569,6 +39578,12 @@
/obj/item/weldingtool,
/turf/open/floor/plating,
/area/station/maintenance/department/cargo)
+"hOV" = (
+/obj/effect/turf_decal/trimline/blue/filled/line,
+/obj/structure/table/glass,
+/obj/item/stack/medical/gauze,
+/turf/open/floor/iron/white,
+/area/station/medical/medbay/lobby)
"hOY" = (
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
@@ -40189,7 +40204,7 @@
/obj/effect/turf_decal/bot_blue,
/obj/structure/rack,
/obj/structure/cable,
-/obj/item/storage/toolbox/guncase/skyrat/carwo_large_case,
+/obj/item/storage/toolbox/guncase/skyrat/pistol/m45a5,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
"igC" = (
@@ -41171,9 +41186,8 @@
/turf/open/floor/plating,
/area/station/maintenance/department/security/brig)
"iTH" = (
-/obj/structure/table,
-/obj/item/stack/ore/iron,
-/turf/open/floor/plating,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/wood/large,
/area/station/maintenance/department/science)
"iTN" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
@@ -41249,6 +41263,11 @@
/obj/effect/spawner/random/bedsheet,
/turf/open/floor/plating,
/area/station/maintenance/department/security/brig)
+"iWK" = (
+/obj/effect/turf_decal/delivery,
+/obj/structure/closet/firecloset/full,
+/turf/open/floor/iron/dark,
+/area/station/hallway/primary/aft)
"iWV" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -42079,10 +42098,8 @@
/turf/open/floor/iron,
/area/station/commons/dorms/barracks)
"jDA" = (
-/obj/item/chair,
-/obj/item/storage/backpack/satchel/explorer,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
+/obj/item/flashlight/flare/candle,
+/turf/open/floor/wood/large,
/area/station/maintenance/department/science)
"jDE" = (
/obj/machinery/light/small/directional/north,
@@ -42385,9 +42402,8 @@
/turf/open/floor/catwalk_floor/iron,
/area/station/engineering/main)
"jQh" = (
-/obj/structure/ore_box,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
+/obj/structure/table/wood,
+/turf/open/floor/wood/large,
/area/station/maintenance/department/science)
"jQE" = (
/obj/structure/bed,
@@ -42817,19 +42833,6 @@
/obj/structure/lattice/catwalk,
/turf/open/space/basic,
/area/space/nearstation)
-"khJ" = (
-/obj/machinery/computer/crew,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/security/checkpoint/medical)
"kid" = (
/obj/machinery/airalarm/directional/north,
/obj/machinery/power/apc/auto_name/directional/east,
@@ -43409,22 +43412,9 @@
/turf/open/floor/wood,
/area/station/maintenance/department/engine)
"kEb" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/item/radio/intercom{
- pixel_x = 28
- },
-/obj/effect/landmark/start/orderly,
-/obj/structure/cable,
-/obj/machinery/camera/directional/east{
- c_tag = "Medbay Orderly Office";
- name = "medbay camera";
- network = list("ss13","medbay")
- },
-/turf/open/floor/iron,
-/area/station/security/checkpoint/medical)
+/obj/structure/bookcase/random/adult,
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"kEg" = (
/obj/machinery/nuclearbomb/beer,
/obj/structure/cable,
@@ -44904,6 +44894,10 @@
},
/turf/open/floor/iron/dark,
/area/station/science/research)
+"lHB" = (
+/obj/structure/bookcase/random/fiction,
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"lHQ" = (
/obj/structure/table/wood,
/obj/item/flashlight/lamp/green{
@@ -45014,6 +45008,12 @@
},
/turf/open/floor/iron,
/area/station/science/auxlab)
+"lJl" = (
+/obj/structure/chair/wood{
+ dir = 8
+ },
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"lJr" = (
/obj/machinery/firealarm/directional/east,
/obj/machinery/light/directional/east,
@@ -45589,6 +45589,11 @@
},
/turf/open/floor/iron/dark,
/area/station/commons/locker)
+"mfs" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/item/clothing/mask/gas/plaguedoctor,
+/turf/open/floor/plating,
+/area/station/maintenance/department/science)
"mfu" = (
/obj/machinery/door/window/right/directional/south{
name = "Containment Pen #8";
@@ -46403,10 +46408,8 @@
/turf/open/floor/iron/dark,
/area/station/service/chapel/monastery)
"mDh" = (
-/obj/structure/lattice,
-/obj/structure/grille/broken,
-/turf/open/space/basic,
-/area/space/nearstation)
+/turf/closed/wall/mineral/wood/nonmetal,
+/area/station/maintenance/department/science)
"mDn" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible,
/obj/machinery/meter/monitored/distro_loop,
@@ -47867,6 +47870,11 @@
/obj/machinery/light/directional/east,
/turf/open/floor/iron/white,
/area/station/commons/toilet/restrooms)
+"nHs" = (
+/obj/structure/table,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"nHD" = (
/obj/effect/mapping_helpers/burnt_floor,
/obj/structure/statue/petrified,
@@ -48196,6 +48204,7 @@
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/cable,
+/obj/effect/landmark/start/orderly,
/turf/open/floor/iron,
/area/station/security/checkpoint/medical)
"nSp" = (
@@ -48247,7 +48256,7 @@
dir = 8
},
/obj/machinery/computer/security/telescreen/normal/directional/south,
-/obj/effect/landmark/start/orderly,
+/obj/structure/closet/secure_closet/security/med,
/turf/open/floor/iron,
/area/station/security/checkpoint/medical)
"nUg" = (
@@ -50753,16 +50762,15 @@
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
"pGi" = (
-/obj/structure/table,
-/obj/machinery/recharger{
- pixel_y = 4
- },
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/machinery/computer/crew,
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/structure/cable,
/turf/open/floor/iron,
/area/station/security/checkpoint/medical)
"pGF" = (
@@ -51421,6 +51429,10 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/department/engine)
+"qan" = (
+/obj/structure/bed/double,
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"qap" = (
/obj/effect/turf_decal/stripes/corner{
dir = 4
@@ -51813,11 +51825,8 @@
/turf/open/floor/plating,
/area/station/cargo/bitrunning/den)
"qqj" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/iron,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
/area/station/hallway/primary/aft)
"qqA" = (
/obj/docking_port/stationary{
@@ -52325,14 +52334,11 @@
/turf/open/floor/iron/dark,
/area/station/security/prison)
"qHa" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
+/obj/structure/chair/comfy/brown{
+ dir = 1
},
-/obj/machinery/light/directional/south,
-/obj/structure/closet/secure_closet/security/med,
-/turf/open/floor/iron,
-/area/station/security/checkpoint/medical)
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"qHi" = (
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -54465,12 +54471,7 @@
/turf/open/floor/wood,
/area/station/service/lawoffice)
"sci" = (
-/obj/structure/table,
-/obj/machinery/light/small/directional/north,
-/obj/item/storage/bag/ore,
-/obj/item/pickaxe,
-/obj/effect/decal/cleanable/cobweb,
-/turf/open/floor/plating,
+/turf/open/floor/wood/large,
/area/station/maintenance/department/science)
"scp" = (
/obj/machinery/door/airlock/maintenance{
@@ -54995,6 +54996,14 @@
},
/turf/open/floor/iron,
/area/station/commons/dorms/barracks)
+"sxV" = (
+/obj/structure/table,
+/obj/machinery/microwave{
+ pixel_x = -3;
+ pixel_y = 6
+ },
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"syg" = (
/obj/structure/weightmachine/weightlifter,
/turf/open/floor/iron/dark/side{
@@ -55183,7 +55192,8 @@
/area/station/command/heads_quarters/hop)
"sEv" = (
/obj/structure/rack,
-/obj/item/storage/toolbox/guncase/skyrat/carwo_large_case,
+/obj/item/storage/toolbox/guncase/skyrat/pistol/pepperball,
+/obj/item/storage/toolbox/guncase/skyrat/pistol/pepperball,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
"sEN" = (
@@ -57530,6 +57540,8 @@
/obj/effect/spawner/random/contraband/armory,
/obj/item/gun/ballistic/rifle/boltaction,
/obj/effect/spawner/random/maintenance/three,
+/obj/item/melee/flyswatter,
+/obj/item/storage/toolbox/guncase/soviet/sakhno,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
"ulY" = (
@@ -57834,8 +57846,10 @@
/turf/open/floor/iron,
/area/station/engineering/atmos)
"uug" = (
-/obj/item/clothing/mask/gas/plaguedoctor,
-/turf/open/floor/plating,
+/obj/structure/chair/comfy/brown{
+ dir = 4
+ },
+/turf/open/floor/wood/large,
/area/station/maintenance/department/science)
"uuk" = (
/obj/structure/cable,
@@ -58527,6 +58541,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
+"uUv" = (
+/obj/structure/chair/wood{
+ dir = 4
+ },
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"uUN" = (
/obj/machinery/air_sensor/plasma_tank,
/turf/open/floor/engine/plasma,
@@ -59689,6 +59709,10 @@
},
/turf/open/floor/catwalk_floor/iron_dark,
/area/station/maintenance/department/engine)
+"vFd" = (
+/obj/structure/closet/secure_closet/armory2,
+/turf/open/floor/wood,
+/area/station/command/heads_quarters/hos)
"vFk" = (
/obj/structure/table/wood/fancy/royalblack,
/turf/open/floor/iron/dark,
@@ -59827,6 +59851,18 @@
/obj/effect/turf_decal/trimline/blue/filled/line,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
+"vLR" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/door/airlock/maintenance{
+ name = "Maintenance Access"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance,
+/obj/effect/mapping_helpers/airlock/unres{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/department/engine)
"vLU" = (
/obj/structure/bed,
/turf/open/floor/plating,
@@ -61106,6 +61142,12 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
+"wDz" = (
+/obj/structure/toilet{
+ dir = 8
+ },
+/turf/open/floor/iron/kitchen/small,
+/area/station/maintenance/department/science)
"wDA" = (
/obj/effect/turf_decal/trimline/yellow/filled/warning{
dir = 8
@@ -62100,15 +62142,9 @@
/turf/open/floor/iron/dark,
/area/station/service/library)
"xje" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Maintenance Access"
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance,
-/obj/effect/mapping_helpers/airlock/unres,
-/turf/open/floor/plating,
-/area/station/maintenance/department/engine)
+/obj/machinery/oven/range,
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"xjK" = (
/obj/item/radio/intercom{
pixel_x = -27
@@ -62576,6 +62612,11 @@
/obj/machinery/power/apc/auto_name/directional/north,
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/rd)
+"xyH" = (
+/obj/structure/sink/directional/south,
+/obj/item/flashlight/flare/candle,
+/turf/open/floor/iron/kitchen/small,
+/area/station/maintenance/department/science)
"xyI" = (
/obj/item/radio/intercom/directional/east,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -63070,6 +63111,11 @@
name = "medical camera";
network = list("ss13","medbay")
},
+/obj/machinery/button/door/directional/north{
+ id = "plumbing_shutters";
+ name = "Plumbing Shutter Control";
+ req_one_access = list("pharmacy","chemistry")
+ },
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
"xQy" = (
@@ -63246,6 +63292,10 @@
},
/turf/open/floor/iron,
/area/station/cargo/office)
+"xVA" = (
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/wood/large,
+/area/station/maintenance/department/science)
"xVD" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -91235,7 +91285,7 @@ anT
alM
amz
ank
-anT
+vFd
ajs
upU
aoz
@@ -93866,7 +93916,7 @@ bwV
mTf
ydL
bsK
-bsK
+eeF
bEy
bsK
bsK
@@ -95142,12 +95192,12 @@ bji
cQN
blq
ufo
-ufo
-vLM
-yat
-hjy
-dOM
-qHa
+bnF
+hOV
+bja
+bja
+bja
+bja
bpY
brq
bsK
@@ -95399,12 +95449,12 @@ cpT
cQN
blr
ntO
-ntO
+fMs
boO
-yat
-khJ
-kEb
-bun
+vLR
+axl
+bDi
+bDi
bpY
cIe
bsK
@@ -95654,14 +95704,14 @@ cpI
cpO
bjk
bje
-cQN
bmA
bmA
-cQN
-bja
-bja
-bja
-bja
+bmA
+bmA
+bva
+axl
+bDi
+bDi
bpY
qqX
bsK
@@ -95909,14 +95959,14 @@ bgt
bih
cpJ
cpP
-bih
-bih
-bls
-bih
-bih
+aDZ
bmB
-bva
-bDi
+aaa
+aaa
+aaa
+aaa
+bIZ
+axl
bDi
ccN
bpY
@@ -96167,12 +96217,12 @@ bih
bhO
bio
aDZ
-aDZ
-aDZ
-aDZ
-aDZ
-bih
-xje
+bmB
+aaa
+aaa
+aaa
+aaa
+bIZ
axl
bDi
bGM
@@ -96424,12 +96474,12 @@ bih
cpK
cpQ
aDZ
-aDZ
+bmB
blu
-aDZ
-aDZ
-eeF
-bBX
+aaa
+aaa
+aaa
+bIZ
pYw
bDi
bDi
@@ -96682,10 +96732,10 @@ cpL
cpR
bjl
bGa
-bKM
qqj
-cqh
-bKM
+qqj
+qqj
+qqj
bBX
pYw
bDi
@@ -96942,8 +96992,8 @@ bKM
blv
ktS
cqi
-boP
-bBX
+bGe
+bun
pYw
pYw
pYw
@@ -97456,7 +97506,7 @@ bBo
blx
bmC
bnI
-drY
+iWK
qgC
brr
bsR
@@ -97713,7 +97763,7 @@ bkm
bly
bmD
bJI
-bGe
+drY
bqc
brs
bIE
@@ -111349,7 +111399,7 @@ dbK
sAK
sAK
sAK
-sAK
+mfs
sAK
sAK
sAK
@@ -112375,13 +112425,13 @@ blX
bkF
ueV
efU
-cDB
-cDB
+sci
+sci
uug
-jDA
-rNB
-aaa
-aaa
+sci
+mDh
+xyH
+gtW
jKq
vhz
bWT
@@ -112635,10 +112685,10 @@ bwm
iTH
sci
jQh
-bwm
-bwm
-aaa
-aaa
+sci
+mDh
+cqh
+wDz
jKq
vmk
bWT
@@ -112889,13 +112939,13 @@ rgn
jRG
rgn
bwm
-rNB
-bwm
-bwm
-bwm
-aht
-aaa
-aaa
+lHB
+sci
+jQh
+qHa
+mDh
+dOM
+mDh
jKq
jOv
bWT
@@ -113146,13 +113196,13 @@ qVi
lWy
vuQ
bwm
-aaa
-aht
-aaa
-aaa
-aht
-pDW
-mDh
+kEb
+sci
+sci
+sci
+sci
+sci
+xVA
jKq
hWu
yhV
@@ -113403,13 +113453,13 @@ bwm
vtl
bwm
bwm
-aaa
-aby
+sxV
+sci
+gxc
+mDh
+dOM
mDh
-pDW
-pDW
mDh
-aaa
jKq
kwf
kwf
@@ -113660,14 +113710,14 @@ rNB
lWy
rui
bwm
-aht
-aby
-aaa
-aht
-aaa
-aaa
-aaa
-fMs
+nHs
+sci
+uUv
+mDh
+sci
+hjy
+sci
+bwm
aaa
aaa
aaa
@@ -113917,14 +113967,14 @@ bwm
hSM
bwm
bwm
-aaa
-aby
-aaa
-pDW
-aaa
-aaa
-aaa
-aaa
+xje
+sci
+fpH
+mDh
+sci
+sci
+jDA
+bwm
aaa
aaa
aaa
@@ -114173,15 +114223,15 @@ aht
ahi
ahi
ahi
-aht
-aht
-aby
-aht
-pDW
-aaa
-aaa
-aaa
-aaa
+bwm
+boP
+sci
+lJl
+mDh
+sci
+qan
+sci
+bwm
aaa
aaa
aaa
@@ -114430,15 +114480,15 @@ aaa
aaa
aaa
aaa
-aht
-aaa
-aed
-aaa
-pDW
-aaa
-aaa
-aaa
-aaa
+bwm
+rNB
+rNB
+rNB
+rNB
+bls
+bls
+bls
+bwm
aaa
aaa
aaa
@@ -114687,15 +114737,15 @@ aaa
aaa
aaa
aaa
-aby
+abI
aht
-aby
-aaa
-mDh
+abI
aaa
+aht
aaa
aaa
aaa
+cDB
aaa
aaa
aaa
@@ -114946,9 +114996,9 @@ aaa
aaa
aaa
aaa
-aby
+abI
aaa
-pDW
+aht
aaa
aaa
aaa
@@ -115203,9 +115253,9 @@ aht
aed
aaa
aaa
-aed
+abI
aaa
-pDW
+aht
aaa
aaa
aaa
@@ -115460,9 +115510,9 @@ aaa
aht
aaa
aaa
-aby
+abI
aaa
-pDW
+aht
aaa
aaa
aaa
diff --git a/code/__DEFINES/dcs/signals/signals_mind.dm b/code/__DEFINES/dcs/signals/signals_mind.dm
index 72f43f518ebcd0..e9a62a26102cf8 100644
--- a/code/__DEFINES/dcs/signals/signals_mind.dm
+++ b/code/__DEFINES/dcs/signals/signals_mind.dm
@@ -6,3 +6,6 @@
/// Called on the mind when an antagonist is being removed, after the antagonist list has updated (datum/antagonist/antagonist)
#define COMSIG_ANTAGONIST_REMOVED "antagonist_removed"
+
+/// Called on the mob when losing an antagonist datum (datum/antagonist/antagonist)
+#define COMSIG_MOB_ANTAGONIST_REMOVED "mob_antagonist_removed"
diff --git a/code/__DEFINES/dcs/signals/signals_movetype.dm b/code/__DEFINES/dcs/signals/signals_movetype.dm
index bc8b296b475316..da584ba022f4af 100644
--- a/code/__DEFINES/dcs/signals/signals_movetype.dm
+++ b/code/__DEFINES/dcs/signals/signals_movetype.dm
@@ -1,6 +1,3 @@
-// /datum/element/movetype_handler signals
-/// Called when the floating anim has to be temporarily stopped and restarted later: (timer)
-#define COMSIG_PAUSE_FLOATING_ANIM "pause_floating_anim"
/// From base of datum/element/movetype_handler/on_movement_type_trait_gain: (flag, old_movement_type)
#define COMSIG_MOVETYPE_FLAG_ENABLED "movetype_flag_enabled"
/// From base of datum/element/movetype_handler/on_movement_type_trait_loss: (flag, old_movement_type)
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 92a3c7c27cc8d5..51bb4bf1ceaced 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -913,6 +913,8 @@ GLOBAL_LIST_INIT(layers_to_offset, list(
/// Possible value of [/atom/movable/buckle_lying]. If set to a different (positive-or-zero) value than this, the buckling thing will force a lying angle on the buckled.
#define NO_BUCKLE_LYING -1
+/// Possible value of [/atom/movable/buckle_dir]. If set to a different (positive-or-zero) value than this, the buckling thing will force a dir on the buckled.
+#define BUCKLE_MATCH_DIR -1
// Flags for fully_heal().
diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm
index f11cc50dbbd58a..d50de26219bf88 100644
--- a/code/__DEFINES/traits/sources.dm
+++ b/code/__DEFINES/traits/sources.dm
@@ -193,6 +193,9 @@
/// Trait given by a fulton extraction pack
#define FULTON_PACK_TRAIT "fulton-pack"
+/// Trait from mob/living/update_transform()
+#define UPDATE_TRANSFORM_TRAIT "update_transform"
+
/// Trait granted by the berserker hood.
#define BERSERK_TRAIT "berserk_trait"
/// Trait granted by [/obj/item/rod_of_asclepius]
diff --git a/code/datums/components/face_decal.dm b/code/datums/components/face_decal.dm
index 674f17fe86cf1f..f045a4f18df6ef 100644
--- a/code/datums/components/face_decal.dm
+++ b/code/datums/components/face_decal.dm
@@ -118,7 +118,8 @@
GLOBAL_LIST_INIT(creamable, typecacheof(list(
/mob/living/carbon/human,
/mob/living/basic/pet/dog/corgi,
- /mob/living/silicon/ai)))
+ /mob/living/silicon/ai,
+)))
/datum/component/face_decal/creampie/Initialize()
. = ..()
diff --git a/code/datums/elements/block_turf_fingerprints.dm b/code/datums/elements/block_turf_fingerprints.dm
new file mode 100644
index 00000000000000..f3b7ab9cf19f13
--- /dev/null
+++ b/code/datums/elements/block_turf_fingerprints.dm
@@ -0,0 +1,56 @@
+/**
+ * ## block_turf_fingerprints
+ *
+ * Attach to a movable, prevents mobs from leaving fingerprints on the turf below it
+ */
+/datum/element/block_turf_fingerprints
+ element_flags = ELEMENT_DETACH_ON_HOST_DESTROY
+
+/datum/element/block_turf_fingerprints/Attach(datum/target)
+ . = ..()
+ if(!ismovable(target))
+ return ELEMENT_INCOMPATIBLE
+
+ var/atom/movable/target_movable = target
+ if(isturf(target_movable.loc))
+ apply_to_turf(target_movable.loc)
+
+ RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(move_turf))
+
+/datum/element/block_turf_fingerprints/Detach(atom/movable/target)
+ . = ..()
+ if(isturf(target.loc))
+ remove_from_turf(target.loc)
+
+ UnregisterSignal(target, COMSIG_MOVABLE_MOVED)
+
+/datum/element/block_turf_fingerprints/proc/apply_to_turf(turf/the_turf)
+ // It's possible two things with this element could be on the same turf, so let's avoid double-applying
+ if(the_turf.interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND)
+ // But what if the turf has this flag by default? We still need to override register a signal.
+ // Otherwise we may run into a very niche bug:
+ // - A turf as this flag by default
+ // - A movable with this element is placed on the turf
+ // - It does not gain the flag nor register a signal
+ // - The turf changes, and the new turf does not gain the flag
+ if(initial(the_turf.interaction_flags_atom) & INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND)
+ RegisterSignal(the_turf, COMSIG_TURF_CHANGE, PROC_REF(replace_our_turf), override = TRUE)
+ return
+
+ the_turf.interaction_flags_atom |= INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND
+ RegisterSignal(the_turf, COMSIG_TURF_CHANGE, PROC_REF(replace_our_turf))
+
+/datum/element/block_turf_fingerprints/proc/remove_from_turf(turf/the_turf)
+ the_turf.interaction_flags_atom &= ~INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND
+ UnregisterSignal(the_turf, COMSIG_TURF_CHANGE)
+
+/datum/element/block_turf_fingerprints/proc/move_turf(atom/movable/source, atom/old_loc)
+ SIGNAL_HANDLER
+ if(isturf(old_loc))
+ remove_from_turf(old_loc)
+ if(isturf(source.loc))
+ apply_to_turf(source.loc)
+
+/datum/element/block_turf_fingerprints/proc/replace_our_turf(datum/source, path, new_baseturfs, flags, post_change_callbacks)
+ SIGNAL_HANDLER
+ post_change_callbacks += CALLBACK(src, PROC_REF(apply_to_turf))
diff --git a/code/datums/elements/movetype_handler.dm b/code/datums/elements/movetype_handler.dm
index 6d730d345e2845..e88aac6e265152 100644
--- a/code/datums/elements/movetype_handler.dm
+++ b/code/datums/elements/movetype_handler.dm
@@ -8,7 +8,6 @@
element_flags = ELEMENT_DETACH_ON_HOST_DESTROY
var/list/attached_atoms = list()
- var/list/paused_floating_anim_atoms = list()
/datum/element/movetype_handler/Attach(datum/target)
. = ..()
@@ -22,7 +21,6 @@
RegisterSignals(movable_target, GLOB.movement_type_removetrait_signals, PROC_REF(on_movement_type_trait_loss))
RegisterSignal(movable_target, SIGNAL_ADDTRAIT(TRAIT_NO_FLOATING_ANIM), PROC_REF(on_no_floating_anim_trait_gain))
RegisterSignal(movable_target, SIGNAL_REMOVETRAIT(TRAIT_NO_FLOATING_ANIM), PROC_REF(on_no_floating_anim_trait_loss))
- RegisterSignal(movable_target, COMSIG_PAUSE_FLOATING_ANIM, PROC_REF(pause_floating_anim))
attached_atoms[movable_target] = TRUE
if(movable_target.movement_type & (FLOATING|FLYING) && !HAS_TRAIT(movable_target, TRAIT_NO_FLOATING_ANIM))
@@ -32,14 +30,12 @@
var/list/signals_to_remove = list(
SIGNAL_ADDTRAIT(TRAIT_NO_FLOATING_ANIM),
SIGNAL_REMOVETRAIT(TRAIT_NO_FLOATING_ANIM),
- COMSIG_PAUSE_FLOATING_ANIM
)
signals_to_remove += GLOB.movement_type_addtrait_signals
signals_to_remove += GLOB.movement_type_removetrait_signals
UnregisterSignal(source, signals_to_remove)
attached_atoms -= source
- paused_floating_anim_atoms -= source
STOP_FLOATING_ANIM(source)
return ..()
@@ -51,7 +47,7 @@
return
var/old_state = source.movement_type
source.movement_type |= flag
- if(!(old_state & (FLOATING|FLYING)) && (source.movement_type & (FLOATING|FLYING)) && !paused_floating_anim_atoms[source] && !HAS_TRAIT(source, TRAIT_NO_FLOATING_ANIM))
+ if(!(old_state & (FLOATING|FLYING)) && (source.movement_type & (FLOATING|FLYING)) && !HAS_TRAIT(source, TRAIT_NO_FLOATING_ANIM))
DO_FLOATING_ANIM(source)
SEND_SIGNAL(source, COMSIG_MOVETYPE_FLAG_ENABLED, flag, old_state)
@@ -78,24 +74,5 @@
/// Called when the TRAIT_NO_FLOATING_ANIM trait is removed from the mob. Restarts the bobbing animation.
/datum/element/movetype_handler/proc/on_no_floating_anim_trait_loss(atom/movable/source, trait)
SIGNAL_HANDLER
- if(source.movement_type & (FLOATING|FLYING) && !paused_floating_anim_atoms[source])
+ if(source.movement_type & (FLOATING|FLYING))
DO_FLOATING_ANIM(source)
-
-///Pauses the floating animation for the duration of the timer... plus [tickrate - (world.time + timer) % tickrate] to be precise.
-/datum/element/movetype_handler/proc/pause_floating_anim(atom/movable/source, timer)
- SIGNAL_HANDLER
- if(paused_floating_anim_atoms[source] < world.time + timer)
- STOP_FLOATING_ANIM(source)
- if(!length(paused_floating_anim_atoms))
- START_PROCESSING(SSdcs, src) //1 second tickrate.
- paused_floating_anim_atoms[source] = world.time + timer
-
-/datum/element/movetype_handler/process()
- for(var/_paused in paused_floating_anim_atoms)
- var/atom/movable/paused = _paused
- if(paused_floating_anim_atoms[paused] < world.time)
- if(paused.movement_type & (FLOATING|FLYING) && !HAS_TRAIT(paused, TRAIT_NO_FLOATING_ANIM))
- DO_FLOATING_ANIM(paused)
- paused_floating_anim_atoms -= paused
- if(!length(paused_floating_anim_atoms))
- STOP_PROCESSING(SSdcs, src)
diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm
index 738cb61f6c5808..bc32b031256605 100644
--- a/code/datums/looping_sounds/machinery_sounds.dm
+++ b/code/datums/looping_sounds/machinery_sounds.dm
@@ -126,10 +126,17 @@
falloff_distance = 1 //Instant falloff after initial tile
/datum/looping_sound/gravgen
- mid_sounds = list('sound/machines/gravgen/gravgen_mid1.ogg' = 1, 'sound/machines/gravgen/gravgen_mid2.ogg' = 1, 'sound/machines/gravgen/gravgen_mid3.ogg' = 1, 'sound/machines/gravgen/gravgen_mid4.ogg' = 1)
- mid_length = 1.8 SECONDS
- extra_range = 10
- volume = 20
+ start_sound = 'sound/machines/gravgen/grav_gen_start.ogg'
+ start_length = 1 SECONDS
+ mid_sounds = list(
+ 'sound/machines/gravgen/grav_gen_mid1.ogg' = 12,
+ 'sound/machines/gravgen/grav_gen_mid2.ogg' = 1,
+ )
+ mid_length = 1.1 SECONDS
+ end_sound = 'sound/machines/gravgen/grav_gen_end.ogg'
+ extra_range = 8
+ vary = TRUE
+ volume = 70
falloff_distance = 5
falloff_exponent = 20
diff --git a/code/game/atom/alternate_appearance.dm b/code/game/atom/alternate_appearance.dm
index 228462f7936a45..108b72b95d286a 100644
--- a/code/game/atom/alternate_appearance.dm
+++ b/code/game/atom/alternate_appearance.dm
@@ -35,20 +35,51 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances)
GLOB.active_alternate_appearances += src
for(var/mob in GLOB.player_list)
- if(mobShouldSee(mob))
- show_to(mob)
+ apply_to_new_mob(mob)
/datum/atom_hud/alternate_appearance/Destroy()
GLOB.active_alternate_appearances -= src
return ..()
-/datum/atom_hud/alternate_appearance/proc/onNewMob(mob/M)
- if(mobShouldSee(M))
- show_to(M)
+/// Wrapper for applying this alt hud to the passed mob (if they should see it)
+/datum/atom_hud/alternate_appearance/proc/apply_to_new_mob(mob/applying_to)
+ if(mobShouldSee(applying_to))
+ if(!hud_users_all_z_levels[applying_to])
+ show_to(applying_to)
+ return TRUE
+ return FALSE
+/// Checks if the passed mob should be seeing this hud
/datum/atom_hud/alternate_appearance/proc/mobShouldSee(mob/M)
return FALSE
+/datum/atom_hud/alternate_appearance/show_to(mob/new_viewer)
+ . = ..()
+ if(!new_viewer)
+ return
+ track_mob(new_viewer)
+
+/// Registers some signals to track the mob's state to determine if they should be seeing the hud still
+/datum/atom_hud/alternate_appearance/proc/track_mob(mob/new_viewer)
+ return
+
+/datum/atom_hud/alternate_appearance/hide_from(mob/former_viewer, absolute)
+ . = ..()
+ if(!former_viewer || hud_atoms_all_z_levels[former_viewer] >= 1)
+ return
+ untrack_mob(former_viewer)
+
+/// Unregisters the signals that were tracking the mob's state
+/datum/atom_hud/alternate_appearance/proc/untrack_mob(mob/former_viewer)
+ return
+
+/datum/atom_hud/alternate_appearance/proc/check_hud(mob/source)
+ SIGNAL_HANDLER
+ // Attempt to re-apply the hud entirely
+ if(!apply_to_new_mob(source))
+ // If that failed, probably shouldn't be seeing it at all, so nuke it
+ hide_from(source, absolute = TRUE)
+
/datum/atom_hud/alternate_appearance/add_atom_to_hud(atom/A, image/I)
. = ..()
if(.)
@@ -99,6 +130,22 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances)
if(ghost_appearance)
QDEL_NULL(ghost_appearance)
+/datum/atom_hud/alternate_appearance/basic/track_mob(mob/new_viewer)
+ RegisterSignals(new_viewer, list(
+ COMSIG_MOB_ANTAGONIST_REMOVED,
+ COMSIG_MOB_GHOSTIZED,
+ COMSIG_MOB_MIND_TRANSFERRED_INTO,
+ COMSIG_MOB_MIND_TRANSFERRED_OUT_OF,
+ ), PROC_REF(check_hud), override = TRUE)
+
+/datum/atom_hud/alternate_appearance/basic/untrack_mob(mob/former_viewer)
+ UnregisterSignal(former_viewer, list(
+ COMSIG_MOB_ANTAGONIST_REMOVED,
+ COMSIG_MOB_GHOSTIZED,
+ COMSIG_MOB_MIND_TRANSFERRED_INTO,
+ COMSIG_MOB_MIND_TRANSFERRED_OUT_OF,
+ ))
+
/datum/atom_hud/alternate_appearance/basic/add_atom_to_hud(atom/A)
LAZYINITLIST(A.hud_list)
A.hud_list[appearance_key] = image
@@ -136,16 +183,10 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances)
/datum/atom_hud/alternate_appearance/basic/noncult
/datum/atom_hud/alternate_appearance/basic/noncult/mobShouldSee(mob/M)
- if(!IS_CULTIST(M))
- return TRUE
- return FALSE
-
-/datum/atom_hud/alternate_appearance/basic/cult
+ return !IS_CULTIST(M)
-/datum/atom_hud/alternate_appearance/basic/cult/mobShouldSee(mob/M)
- if(IS_CULTIST(M))
- return TRUE
- return FALSE
+/datum/atom_hud/alternate_appearance/basic/has_antagonist/cult
+ antag_datum_type = /datum/antagonist/cult
/datum/atom_hud/alternate_appearance/basic/blessed_aware
diff --git a/code/game/machinery/big_manipulator.dm b/code/game/machinery/big_manipulator.dm
index d81c9d222a6c85..8d2bde3e145aeb 100644
--- a/code/game/machinery/big_manipulator.dm
+++ b/code/game/machinery/big_manipulator.dm
@@ -58,7 +58,6 @@
return
if(!manipulator_hand)
create_manipulator_hand()
- manipulator_hand.forceMove(get_turf(src))
/obj/machinery/big_manipulator/wrench_act(mob/living/user, obj/item/tool)
. = ..()
@@ -103,8 +102,9 @@
/// Creat manipulator hand effect on manipulator core.
/obj/machinery/big_manipulator/proc/create_manipulator_hand()
- manipulator_hand = new/obj/effect/big_manipulator_hand(get_turf(src))
+ manipulator_hand = new/obj/effect/big_manipulator_hand(src)
manipulator_hand.dir = take_here
+ vis_contents += manipulator_hand
/// Check servo tier and change manipulator speed, power_use and colour.
/obj/machinery/big_manipulator/proc/manipulator_lvl()
diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm
index 9ef3d8e3a99a90..bf33530b93e3e1 100644
--- a/code/game/machinery/stasis.dm
+++ b/code/game/machinery/stasis.dm
@@ -9,6 +9,7 @@
obj_flags = BLOCKS_CONSTRUCTION
can_buckle = TRUE
buckle_lying = 90
+ buckle_dir = SOUTH
circuit = /obj/item/circuitboard/machine/stasis
fair_market_price = 10
payment_department = ACCOUNT_MED
@@ -22,6 +23,7 @@
/obj/machinery/stasis/Initialize(mapload)
. = ..()
AddElement(/datum/element/elevation, pixel_shift = 6)
+ update_buckle_vars(dir)
/obj/machinery/stasis/examine(mob/user)
. = ..()
@@ -57,6 +59,13 @@
thaw_them(L)
return ..()
+/obj/machinery/stasis/setDir(newdir)
+ . = ..()
+ update_buckle_vars(newdir)
+
+/obj/machinery/stasis/proc/update_buckle_vars(newdir)
+ buckle_lying = newdir & NORTHEAST ? 270 : 90
+
/obj/machinery/stasis/proc/stasis_running()
return stasis_enabled && is_operational
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index fd57b24da099ff..c0435d2a0e6271 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -3,6 +3,8 @@
var/can_buckle = FALSE
/// Bed-like behaviour, forces mob.lying = buckle_lying if not set to [NO_BUCKLE_LYING].
var/buckle_lying = NO_BUCKLE_LYING
+ /// Bed-like behaviour, sets mob dir to buckle_dir if not set to [BUCKLE_MATCH_DIR]. If set to [BUCKLE_MATCH_DIR], makes mob dir match ours.
+ var/buckle_dir = BUCKLE_MATCH_DIR
/// Require people to be handcuffed before being able to buckle. eg: pipes
var/buckle_requires_restraints = FALSE
/// The mobs currently buckled to this atom
@@ -106,7 +108,10 @@
M.set_glide_size(glide_size)
M.Move(loc)
- M.setDir(dir)
+ if(buckle_dir == BUCKLE_MATCH_DIR)
+ M.setDir(dir)
+ else
+ M.setDir(buckle_dir)
//Something has unbuckled us in reaction to the above movement
if(!M.buckled)
diff --git a/code/game/objects/effects/phased_mob.dm b/code/game/objects/effects/phased_mob.dm
index b1df969b45c921..357e9683072c1f 100644
--- a/code/game/objects/effects/phased_mob.dm
+++ b/code/game/objects/effects/phased_mob.dm
@@ -23,6 +23,7 @@
jaunter.forceMove(src)
if(ismob(jaunter))
var/mob/mob_jaunter = jaunter
+ RegisterSignal(mob_jaunter, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change))
mob_jaunter.reset_perspective(src)
/obj/effect/dummy/phased_mob/Destroy()
@@ -55,6 +56,7 @@
/obj/effect/dummy/phased_mob/Exited(atom/movable/gone, direction)
. = ..()
if(gone == jaunter)
+ UnregisterSignal(jaunter, COMSIG_MOB_STATCHANGE)
SEND_SIGNAL(src, COMSIG_MOB_EJECTED_FROM_JAUNT, jaunter)
jaunter = null
@@ -98,3 +100,9 @@
newloc = can_z_move(direction, get_turf(src), newloc, ZMOVE_INCAPACITATED_CHECKS | ZMOVE_FEEDBACK | ZMOVE_ALLOW_ANCHORED, user)
return newloc
+
+/// Signal proc for [COMSIG_MOB_STATCHANGE], to throw us out of the jaunt if we lose consciousness.
+/obj/effect/dummy/phased_mob/proc/on_stat_change(mob/living/source, new_stat, old_stat)
+ SIGNAL_HANDLER
+ if(source == jaunter && source.stat != CONSCIOUS)
+ eject_jaunter()
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index e80e0008718a1f..e90f83a6e19dd0 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -1851,9 +1851,11 @@
/obj/item/proc/set_embed(datum/embed_data/embed)
if(embed_data == embed)
return
+ if(isnull(get_embed())) // Add embed on objects that did not have it added
+ AddElement(/datum/element/embed)
if(!GLOB.embed_by_type[embed_data?.type])
qdel(embed_data)
- embed_data = ispath(embed) ? get_embed_by_type(armor) : embed
+ embed_data = ispath(embed) ? get_embed_by_type(embed) : embed
SEND_SIGNAL(src, COMSIG_ITEM_EMBEDDING_UPDATE)
/**
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 565e1a0bc61b56..5c6b7d0d35a008 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -545,6 +545,11 @@
if(listening && overlay_speaker_idle)
. += overlay_speaker_idle
+/obj/item/radio/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(user.combat_mode && tool.tool_behaviour == TOOL_SCREWDRIVER)
+ return screwdriver_act(user, tool)
+ return ..()
+
/obj/item/radio/screwdriver_act(mob/living/user, obj/item/tool)
add_fingerprint(user)
unscrewed = !unscrewed
diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm
index b06dd737654d09..64ce9803657bbd 100644
--- a/code/game/objects/items/dice.dm
+++ b/code/game/objects/items/dice.dm
@@ -360,10 +360,8 @@
if(4)
//Destroy Equipment
selected_turf.visible_message(span_userdanger("Everything [user] is holding and wearing disappears!"))
- for(var/obj/item/non_implant in user)
- if(istype(non_implant, /obj/item/implant))
- continue
- qdel(non_implant)
+ var/list/belongings = user.get_all_gear()
+ QDEL_LIST(belongings)
if(5)
//Monkeying
selected_turf.visible_message(span_userdanger("[user] transforms into a monkey!"))
@@ -395,9 +393,9 @@
if(11)
//Cookie
selected_turf.visible_message(span_userdanger("A cookie appears out of thin air!"))
- var/obj/item/food/cookie/C = new(drop_location())
+ var/obj/item/food/cookie/ooh_a_cookie = new(drop_location())
do_smoke(0, holder = src, location = drop_location())
- C.name = "Cookie of Fate"
+ ooh_a_cookie.name = "Cookie of Fate"
if(12)
//Healing
selected_turf.visible_message(span_userdanger("[user] looks very healthy!"))
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index c980fe0dbb3596..73aaa7e75a1cbd 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -26,6 +26,10 @@
var/shield_break_sound = 'sound/effects/bang.ogg'
/// baton bash cooldown
COOLDOWN_DECLARE(baton_bash)
+ /// is shield bashable?
+ var/is_bashable = TRUE
+ /// sound when a shield is bashed
+ var/shield_bash_sound = 'sound/effects/shieldbash.ogg'
/datum/armor/item_shield
melee = 50
@@ -61,6 +65,19 @@
if(0 to 25)
. += span_warning("It's falling apart!")
+/obj/item/shield/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking)
+ . = ..()
+ if(. & ITEM_INTERACT_ANY_BLOCKER)
+ return .
+ if(!istype(tool, /obj/item/melee/baton) || !is_bashable)
+ return .
+ if(!COOLDOWN_FINISHED(src, baton_bash))
+ return ITEM_INTERACT_BLOCKING
+ user.visible_message(span_warning("[user] bashes [src] with [tool]!"))
+ playsound(src, shield_bash_sound, 50, TRUE)
+ COOLDOWN_START(src, baton_bash, BATON_BASH_COOLDOWN)
+ return ITEM_INTERACT_SUCCESS
+
/obj/item/shield/proc/on_shield_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE)
if(!breakable_by_damage || (damage_type != BRUTE && damage_type != BURN))
return TRUE
@@ -162,13 +179,6 @@
)
/obj/item/shield/riot/attackby(obj/item/attackby_item, mob/user, params)
- if(istype(attackby_item, /obj/item/melee/baton))
- if(!COOLDOWN_FINISHED(src, baton_bash))
- return
- user.visible_message(span_warning("[user] bashes [src] with [attackby_item]!"))
- playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, TRUE)
- COOLDOWN_START(src, baton_bash, BATON_BASH_COOLDOWN)
- return
if(istype(attackby_item, /obj/item/stack/sheet/mineral/titanium))
if (atom_integrity >= max_integrity)
to_chat(user, span_warning("[src] is already in perfect condition."))
@@ -284,7 +294,7 @@
/obj/item/shield/energy
name = "combat energy shield"
- desc = "A hardlight shield capable of reflecting blocked energy projectiles, as well las providing well-rounded defense from most all other attacks."
+ desc = "A hardlight shield capable of reflecting blocked energy projectiles, as well as providing well-rounded defense from most all other attacks."
icon_state = "eshield"
inhand_icon_state = "eshield"
w_class = WEIGHT_CLASS_TINY
@@ -296,6 +306,8 @@
throw_speed = 3
breakable_by_damage = FALSE
block_sound = 'sound/weapons/block_blade.ogg'
+ is_bashable = FALSE // Gotta wait till it activates y'know
+ shield_bash_sound = 'sound/effects/energyshieldbash.ogg'
/// Force of the shield when active.
var/active_force = 10
/// Throwforce of the shield when active.
@@ -344,6 +356,7 @@
if(user)
balloon_alert(user, active ? "activated" : "deactivated")
playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE)
+ is_bashable = !is_bashable
return COMPONENT_NO_DEFAULT_MESSAGE
/obj/item/shield/energy/proc/can_disarm_attack(datum/source, mob/living/victim, mob/living/user, send_message = TRUE)
@@ -355,7 +368,7 @@
/obj/item/shield/energy/advanced
name = "advanced combat energy shield"
- desc = "A hardlight shield capable of reflecting all energy projectiles, as well las providing well-rounded defense from most all other attacks. \
+ desc = "A hardlight shield capable of reflecting all energy projectiles, as well as providing well-rounded defense from most all other attacks. \
Often employed by Nanotrasen deathsquads."
icon_state = "advanced_eshield"
inhand_icon_state = "advanced_eshield"
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index adc7d30df1da00..15ad117f722fb5 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -76,6 +76,7 @@
/obj/item/wrench,
/obj/item/spess_knife,
/obj/item/melee/sickly_blade/lock,
+ /obj/item/reagent_containers/cup/soda_cans,
))
/obj/item/storage/belt/utility/chief
diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm
index 0fb193a057a148..4ade32bdd0e0ac 100644
--- a/code/game/objects/structures/beds_chairs/bed.dm
+++ b/code/game/objects/structures/beds_chairs/bed.dm
@@ -15,6 +15,7 @@
anchored = TRUE
can_buckle = TRUE
buckle_lying = 90
+ buckle_dir = SOUTH
resistance_flags = FLAMMABLE
max_integrity = 100
integrity_failure = 0.35
@@ -32,6 +33,7 @@
AddElement(/datum/element/soft_landing)
if(elevation)
AddElement(/datum/element/elevation, pixel_shift = elevation)
+ update_buckle_vars(dir)
register_context()
/obj/structure/bed/examine(mob/user)
@@ -51,6 +53,13 @@
context[SCREENTIP_CONTEXT_LMB] = "Unbuckle"
return CONTEXTUAL_SCREENTIP_SET
+/obj/structure/bed/setDir(newdir)
+ . = ..()
+ update_buckle_vars(newdir)
+
+/obj/structure/bed/proc/update_buckle_vars(newdir)
+ buckle_lying = newdir & NORTHEAST ? 270 : 90
+
/obj/structure/bed/atom_deconstruct(disassembled = TRUE)
if(build_stack_type)
new build_stack_type(loc, build_stack_amount)
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 0af1dcded4e44f..5fae9be3e886f0 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -88,7 +88,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28)
return display_radial_menu(user)
/obj/structure/mirror/proc/display_radial_menu(mob/living/carbon/human/user)
- var/pick = show_radial_menu(user, src, mirror_options, user, radius = 36, require_near = TRUE)
+ var/pick = show_radial_menu(user, src, mirror_options, user, radius = 36, require_near = TRUE, tooltips = TRUE)
if(!pick)
return TRUE //get out
@@ -383,12 +383,36 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28)
desc = "Pride cometh before the..."
race_flags = MIRROR_PRIDE
mirror_options = PRIDE_MIRROR_OPTIONS
+ /// If the last user has altered anything about themselves
+ var/changed = FALSE
+
+/obj/structure/mirror/magic/pride/display_radial_menu(mob/living/carbon/human/user)
+ var/pick = show_radial_menu(user, src, mirror_options, user, radius = 36, require_near = TRUE, tooltips = TRUE)
+ if(!pick)
+ return TRUE //get out
+
+ changed = TRUE
+ switch(pick)
+ if(CHANGE_HAIR)
+ change_hair(user)
+ if(CHANGE_BEARD)
+ change_beard(user)
+ if(CHANGE_RACE)
+ change_race(user)
+ if(CHANGE_SEX) // sex: yes
+ change_sex(user)
+ if(CHANGE_NAME)
+ change_name(user)
+ if(CHANGE_EYES)
+ change_eyes(user)
+
+ return display_radial_menu(user)
/obj/structure/mirror/magic/pride/attack_hand(mob/living/carbon/human/user)
+ changed = FALSE
. = ..()
- if(.)
- return TRUE
-
+ if (!changed)
+ return
user.visible_message(
span_bolddanger("The ground splits beneath [user] as [user.p_their()] hand leaves the mirror!"),
span_notice("Perfect. Much better! Now nobody will be able to resist yo-"),
diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm
index 191b508d9a09ce..fde0e1a4172cc1 100644
--- a/code/modules/antagonists/_common/antag_datum.dm
+++ b/code/modules/antagonists/_common/antag_datum.dm
@@ -271,6 +271,9 @@ GLOBAL_LIST_EMPTY(antagonists)
if(count_against_dynamic_roll_chance && owner.current.stat != DEAD && owner.current.client)
owner.current.add_to_current_living_antags()
+ for (var/datum/atom_hud/alternate_appearance/basic/antag_hud as anything in GLOB.active_alternate_appearances)
+ antag_hud.apply_to_new_mob(owner.current)
+
SEND_SIGNAL(owner, COMSIG_ANTAGONIST_GAINED, src)
/**
@@ -328,13 +331,8 @@ GLOBAL_LIST_EMPTY(antagonists)
if(team)
team.remove_member(owner)
SEND_SIGNAL(owner, COMSIG_ANTAGONIST_REMOVED, src)
-
- // Remove HUDs that they should no longer see
- var/mob/living/current = owner.current
- for (var/datum/atom_hud/alternate_appearance/basic/has_antagonist/antag_hud as anything in GLOB.has_antagonist_huds)
- if (!antag_hud.mobShouldSee(current))
- antag_hud.hide_from(current)
-
+ if(owner.current)
+ SEND_SIGNAL(owner.current, COMSIG_MOB_ANTAGONIST_REMOVED, src)
qdel(src)
// SKYRAT EDIT START
owner?.handle_exploitables() //Inefficient here, but on_removal() is called in multiple locations
@@ -534,8 +532,7 @@ GLOBAL_LIST_EMPTY(antagonists)
// Add HUDs that they couldn't see before
for (var/datum/atom_hud/alternate_appearance/basic/has_antagonist/antag_hud as anything in GLOB.has_antagonist_huds)
- if (antag_hud.mobShouldSee(owner.current))
- antag_hud.show_to(owner.current)
+ antag_hud.apply_to_new_mob(owner.current)
/// Takes a location, returns an image drawing "on" it that matches this antag datum's hud icon
/datum/antagonist/proc/hud_image_on(mob/hud_loc)
diff --git a/code/modules/antagonists/_common/antag_hud.dm b/code/modules/antagonists/_common/antag_hud.dm
index 863d52ef5ffe4b..9933569f9a9889 100644
--- a/code/modules/antagonists/_common/antag_hud.dm
+++ b/code/modules/antagonists/_common/antag_hud.dm
@@ -8,8 +8,9 @@ GLOBAL_LIST_EMPTY_TYPED(has_antagonist_huds, /datum/atom_hud/alternate_appearanc
var/datum/weakref/team_ref
/datum/atom_hud/alternate_appearance/basic/has_antagonist/New(key, image/I, antag_datum_type, datum/weakref/team)
- src.antag_datum_type = antag_datum_type
- team_ref = team
+ if(antag_datum_type)
+ src.antag_datum_type = antag_datum_type
+ src.team_ref = team
GLOB.has_antagonist_huds += src
return ..(key, I, NONE)
@@ -18,6 +19,8 @@ GLOBAL_LIST_EMPTY_TYPED(has_antagonist_huds, /datum/atom_hud/alternate_appearanc
return ..()
/datum/atom_hud/alternate_appearance/basic/has_antagonist/mobShouldSee(mob/M)
+ if(add_ghost_version && isobserver(M))
+ return FALSE // use the ghost version instead
var/datum/team/antag_team = team_ref?.resolve()
if(!isnull(antag_team))
return !!(M.mind in antag_team.members)
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index db261c29b54336..01d97f448cd607 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -498,6 +498,7 @@
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
block_chance = 50
+ is_bashable = FALSE
var/remaining_uses //Set by the changeling ability.
diff --git a/code/modules/antagonists/changeling/powers/spiders.dm b/code/modules/antagonists/changeling/powers/spiders.dm
index 1e140fab7f9c50..9d242906a9cb78 100644
--- a/code/modules/antagonists/changeling/powers/spiders.dm
+++ b/code/modules/antagonists/changeling/powers/spiders.dm
@@ -9,6 +9,14 @@
dna_cost = 1
req_absorbs = 3
+// Ensures that you cannot horrifically cheese the game by spawning spiders while in the vents
+/datum/action/changeling/spiders/can_be_used_by(mob/living/user)
+ if (!isopenturf(user.loc))
+ var/turf/user_turf = get_turf(user)
+ user_turf.balloon_alert(user, "not enough space!")
+ return FALSE
+ return ..()
+
//Makes a spider egg cluster. Allows you enable further general havok by introducing spiders to the station.
/datum/action/changeling/spiders/sting_action(mob/user)
..()
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 423ec6b441df52..203f1a672d942c 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -263,7 +263,7 @@
SEND_SOUND(caller, sound('sound/effects/ghost.ogg', FALSE, TRUE, 50))
var/image/sparkle_image = image('icons/effects/cult.dmi', clicked_on, "bloodsparkles", ABOVE_MOB_LAYER)
- clicked_on.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", sparkle_image, NONE)
+ clicked_on.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/has_antagonist/cult, "cult_apoc", sparkle_image, NONE)
addtimer(CALLBACK(clicked_on, TYPE_PROC_REF(/atom/, remove_alt_appearance), "cult_apoc", TRUE), 4 MINUTES, TIMER_OVERRIDE|TIMER_UNIQUE)
to_chat(caller, span_cult_bold("[clicked_on] has been cursed with living nightmares!"))
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index ceaa5a0694386c..b44be268561d12 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -1223,6 +1223,7 @@ Striking a noncultist, however, will tear their flesh."}
attack_verb_simple = list("bump", "prod")
hitsound = 'sound/weapons/smash.ogg'
block_sound = 'sound/weapons/effects/ric5.ogg'
+ shield_bash_sound = 'sound/effects/glassknock.ogg'
var/illusions = 2
/obj/item/shield/mirror/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE)
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index d8ce241caf3c88..dafc9e50f736a6 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -1160,8 +1160,8 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0)
images += B
if(!IS_CULTIST(M))
if(M.client)
- var/image/C = image('icons/effects/cult.dmi',M,"bloodsparkles", ABOVE_MOB_LAYER)
- add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", C, NONE)
+ var/image/C = image('icons/effects/cult.dmi', M, "bloodsparkles", ABOVE_MOB_LAYER)
+ add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/has_antagonist/cult, "cult_apoc", C, NONE)
addtimer(CALLBACK(M, TYPE_PROC_REF(/atom/, remove_alt_appearance),"cult_apoc",TRUE), duration)
images += C
else
diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm
index 1e40f0fff38566..70d6b22a97496c 100644
--- a/code/modules/antagonists/heretic/heretic_antag.dm
+++ b/code/modules/antagonists/heretic/heretic_antag.dm
@@ -313,7 +313,6 @@
RegisterSignal(our_mob, COMSIG_LIVING_CULT_SACRIFICED, PROC_REF(on_cult_sacrificed))
RegisterSignals(our_mob, list(COMSIG_MOB_BEFORE_SPELL_CAST, COMSIG_MOB_SPELL_ACTIVATED), PROC_REF(on_spell_cast))
RegisterSignal(our_mob, COMSIG_USER_ITEM_INTERACTION, PROC_REF(on_item_use))
- RegisterSignal(our_mob, COMSIG_MOB_LOGIN, PROC_REF(fix_influence_network))
RegisterSignal(our_mob, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(after_fully_healed))
/datum/antagonist/heretic/remove_innate_effects(mob/living/mob_override)
@@ -329,7 +328,6 @@
COMSIG_MOB_BEFORE_SPELL_CAST,
COMSIG_MOB_SPELL_ACTIVATED,
COMSIG_USER_ITEM_INTERACTION,
- COMSIG_MOB_LOGIN,
COMSIG_LIVING_POST_FULLY_HEAL,
COMSIG_LIVING_CULT_SACRIFICED,
))
@@ -457,18 +455,6 @@
var/obj/item/offhand = user.get_inactive_held_item()
return !QDELETED(offhand) && istype(offhand, /obj/item/melee/touch_attack/mansus_fist)
-/*
- * Signal proc for [COMSIG_MOB_LOGIN].
- *
- * Calls rework_network() on our reality smash tracker
- * whenever a login / client change happens, to ensure
- * influence client visibility is fixed.
- */
-/datum/antagonist/heretic/proc/fix_influence_network(mob/source)
- SIGNAL_HANDLER
-
- GLOB.reality_smash_track.rework_network()
-
/// Signal proc for [COMSIG_LIVING_POST_FULLY_HEAL],
/// Gives the heretic aliving heart on aheal or organ refresh
/datum/antagonist/heretic/proc/after_fully_healed(mob/living/source, heal_flags)
@@ -656,7 +642,7 @@
/datum/antagonist/heretic/proc/passive_influence_gain()
knowledge_points++
if(owner.current.stat <= SOFT_CRIT)
- to_chat(owner.current, "[span_hear("You hear a whisper...")] [span_hypnophrase(pick(strings(HERETIC_INFLUENCE_FILE, "drain_message")))]")
+ to_chat(owner.current, "[span_hear("You hear a whisper...")] [span_hypnophrase(pick_list(HERETIC_INFLUENCE_FILE, "drain_message"))]")
addtimer(CALLBACK(src, PROC_REF(passive_influence_gain)), passive_gain_timer)
/datum/antagonist/heretic/roundend_report()
diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm
index 81573b47915621..54c9b671ef5d55 100644
--- a/code/modules/antagonists/heretic/heretic_knowledge.dm
+++ b/code/modules/antagonists/heretic/heretic_knowledge.dm
@@ -680,9 +680,8 @@
our_heretic.knowledge_points += KNOWLEDGE_RITUAL_POINTS
was_completed = TRUE
- var/drain_message = pick(strings(HERETIC_INFLUENCE_FILE, "drain_message"))
to_chat(user, span_boldnotice("[name] completed!"))
- to_chat(user, span_hypnophrase(span_big("[drain_message]")))
+ to_chat(user, span_hypnophrase(span_big("[pick_list(HERETIC_INFLUENCE_FILE, "drain_message")]")))
desc += " (Completed!)"
log_heretic_knowledge("[key_name(user)] completed a [name] at [worldtime2text()].")
user.add_mob_memory(/datum/memory/heretic_knowledge_ritual)
diff --git a/code/modules/antagonists/heretic/influences.dm b/code/modules/antagonists/heretic/influences.dm
index 6184879a3587f7..01ed0d99ee93f4 100644
--- a/code/modules/antagonists/heretic/influences.dm
+++ b/code/modules/antagonists/heretic/influences.dm
@@ -29,36 +29,6 @@
tracked_heretics.Cut()
return ..()
-/**
- * Automatically fixes the target and smash network
- *
- * Fixes any bugs that are caused by late Generate() or exchanging clients
- */
-/datum/reality_smash_tracker/proc/rework_network()
- SIGNAL_HANDLER
-
- for(var/mind in tracked_heretics)
- if(isnull(mind))
- stack_trace("A null somehow landed in the [type] list of minds. How?")
- tracked_heretics -= mind
- continue
-
- add_to_smashes(mind)
-
-/**
- * Allow [to_add] to see all tracked reality smashes.
- */
-/datum/reality_smash_tracker/proc/add_to_smashes(datum/mind/to_add)
- for(var/obj/effect/heretic_influence/reality_smash as anything in smashes)
- reality_smash.add_mind(to_add)
-
-/**
- * Stop [to_remove] from seeing any tracked reality smashes.
- */
-/datum/reality_smash_tracker/proc/remove_from_smashes(datum/mind/to_remove)
- for(var/obj/effect/heretic_influence/reality_smash as anything in smashes)
- reality_smash.remove_mind(to_remove)
-
/**
* Generates a set amount of reality smashes
* based on the number of already existing smashes
@@ -83,8 +53,6 @@
new /obj/effect/heretic_influence(chosen_location)
- rework_network()
-
/**
* Adds a mind to the list of people that can see the reality smashes
*
@@ -100,9 +68,6 @@
//SKYRAT EDIT END
generate_new_influences()
- add_to_smashes(heretic)
-
-
/**
* Removes a mind from the list of people that can see the reality smashes
*
@@ -111,8 +76,6 @@
/datum/reality_smash_tracker/proc/remove_tracked_mind(datum/mind/heretic)
tracked_heretics -= heretic
- remove_from_smashes(heretic)
-
/obj/effect/visible_heretic_influence
name = "pierced reality"
icon = 'icons/effects/eldritch.dmi'
@@ -204,46 +167,23 @@
var/being_drained = FALSE
/// The icon state applied to the image created for this influence.
var/real_icon_state = "reality_smash"
- /// A list of all minds that can see us.
- var/list/datum/mind/minds = list()
- /// The image shown to heretics
- var/image/heretic_image
- /// We hold the turf we're on so we can remove and add the 'no prints' flag.
- var/turf/on_turf
/obj/effect/heretic_influence/Initialize(mapload)
. = ..()
GLOB.reality_smash_track.smashes += src
- heretic_image = image(icon, src, real_icon_state, OBJ_LAYER)
generate_name()
- on_turf = get_turf(src)
- if(!istype(on_turf))
- return
- on_turf.interaction_flags_atom |= INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND
- RegisterSignal(on_turf, COMSIG_TURF_CHANGE, PROC_REF(replace_our_turf))
+ var/image/heretic_image = image(icon, src, real_icon_state, OBJ_LAYER)
+ add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/has_antagonist/heretic, "reality_smash", heretic_image)
+
+ AddElement(/datum/element/block_turf_fingerprints)
AddComponent(/datum/component/redirect_attack_hand_from_turf, interact_check = CALLBACK(src, PROC_REF(verify_user_can_see)))
/obj/effect/heretic_influence/proc/verify_user_can_see(mob/user)
- return (user?.mind in minds)
-
-/obj/effect/heretic_influence/proc/replace_our_turf(datum/source, path, new_baseturfs, flags, post_change_callbacks)
- SIGNAL_HANDLER
- post_change_callbacks += CALLBACK(src, PROC_REF(replace_our_turf_two))
- on_turf = null //hard del ref?
-
-/obj/effect/heretic_influence/proc/replace_our_turf_two(turf/new_turf)
- new_turf.interaction_flags_atom |= INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND
- on_turf = new_turf
+ return (user.mind in GLOB.reality_smash_track.tracked_heretics)
/obj/effect/heretic_influence/Destroy()
GLOB.reality_smash_track.smashes -= src
- for(var/datum/mind/heretic in minds)
- remove_mind(heretic)
-
- heretic_image = null
- on_turf?.interaction_flags_atom &= ~INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND
- on_turf = null
return ..()
/obj/effect/heretic_influence/attack_hand_secondary(mob/user, list/modifiers)
@@ -299,43 +239,29 @@
// Aaand now we delete it
after_drain(user)
-/*
+/**
* Handle the effects of the drain.
*/
/obj/effect/heretic_influence/proc/after_drain(mob/living/user)
if(user)
- to_chat(user, span_hypnophrase(pick(strings(HERETIC_INFLUENCE_FILE, "drain_message"))))
+ to_chat(user, span_hypnophrase(pick_list(HERETIC_INFLUENCE_FILE, "drain_message")))
to_chat(user, span_warning("[src] begins to fade into reality!"))
var/obj/effect/visible_heretic_influence/illusion = new /obj/effect/visible_heretic_influence(drop_location())
- illusion.name = "\improper" + pick(strings(HERETIC_INFLUENCE_FILE, "drained")) + " " + format_text(name)
+ illusion.name = "\improper" + pick_list(HERETIC_INFLUENCE_FILE, "drained") + " " + format_text(name)
GLOB.reality_smash_track.num_drained++
qdel(src)
-/*
- * Add a mind to the list of tracked minds,
- * making another person able to see us.
- */
-/obj/effect/heretic_influence/proc/add_mind(datum/mind/heretic)
- minds |= heretic
- heretic.current?.client?.images |= heretic_image
-
-/*
- * Remove a mind present in our list
- * from being able to see us.
- */
-/obj/effect/heretic_influence/proc/remove_mind(datum/mind/heretic)
- if(!(heretic in minds))
- CRASH("[type] - remove_mind called with a mind not present in the minds list!")
-
- minds -= heretic
- heretic.current?.client?.images -= heretic_image
-
-/*
+/**
* Generates a random name for the influence.
*/
/obj/effect/heretic_influence/proc/generate_name()
- name = "\improper" + pick(strings(HERETIC_INFLUENCE_FILE, "prefix")) + " " + pick(strings(HERETIC_INFLUENCE_FILE, "postfix"))
+ name = "\improper" + pick_list(HERETIC_INFLUENCE_FILE, "prefix") + " " + pick_list(HERETIC_INFLUENCE_FILE, "postfix")
#undef NUM_INFLUENCES_PER_HERETIC
+
+/// Hud used for heretics to see influences
+/datum/atom_hud/alternate_appearance/basic/has_antagonist/heretic
+ antag_datum_type = /datum/antagonist/heretic
+ add_ghost_version = TRUE
diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm
index a34927a6b6f341..d5e96364ecd2b3 100644
--- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm
+++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm
@@ -403,6 +403,8 @@
to_chat(sac_target, span_big(span_hypnophrase("Unnatural forces begin to claw at your every being from beyond the veil.")))
+ playsound(sac_target, 'sound/ambience/antag/heretic/heretic_sacrifice.ogg', 50, FALSE) // play theme
+
sac_target.apply_status_effect(/datum/status_effect/unholy_determination, SACRIFICE_REALM_DURATION)
addtimer(CALLBACK(src, PROC_REF(after_target_wakes), sac_target), SACRIFICE_SLEEP_DURATION * 0.5) // Begin the minigame
diff --git a/code/modules/antagonists/heretic/knowledge/starting_lore.dm b/code/modules/antagonists/heretic/knowledge/starting_lore.dm
index d8d3b6cc5ab624..f7e87626f758ab 100644
--- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm
@@ -271,7 +271,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge())
/datum/heretic_knowledge/codex_cicatrix/cleanup_atoms(list/selected_atoms)
var/mob/living/body = locate() in selected_atoms
if(!body)
- return
+ return ..()
// A golem or an android doesn't have skin!
var/exterior_text = "skin"
// If carbon, it's the limb. If not, it's the body.
@@ -340,6 +340,6 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge())
return FALSE
to_chat(user, span_danger(span_big("Your ambition is ravaged, but something powerful remains in its wake...")))
- var/drain_message = pick(strings(HERETIC_INFLUENCE_FILE, "drain_message"))
+ var/drain_message = pick_list(HERETIC_INFLUENCE_FILE, "drain_message")
to_chat(user, span_hypnophrase(span_big("[drain_message]")))
return .
diff --git a/code/modules/antagonists/heretic/magic/space_crawl.dm b/code/modules/antagonists/heretic/magic/space_crawl.dm
index 90f74a37047f35..49b9ae96f30883 100644
--- a/code/modules/antagonists/heretic/magic/space_crawl.dm
+++ b/code/modules/antagonists/heretic/magic/space_crawl.dm
@@ -83,7 +83,6 @@
jaunter.put_in_hands(right_hand)
RegisterSignal(jaunter, SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING), PROC_REF(on_focus_lost))
- RegisterSignal(jaunter, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change))
playsound(our_turf, 'sound/magic/cosmic_energy.ogg', 50, TRUE, -1)
our_turf.visible_message(span_warning("[jaunter] sinks into [our_turf]!"))
new /obj/effect/temp_visual/space_explosion(our_turf)
@@ -107,7 +106,7 @@
/datum/action/cooldown/spell/jaunt/space_crawl/on_jaunt_exited(obj/effect/dummy/phased_mob/jaunt, mob/living/unjaunter)
UnregisterSignal(jaunt, COMSIG_MOVABLE_MOVED)
- UnregisterSignal(unjaunter, list(SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING), COMSIG_MOB_STATCHANGE))
+ UnregisterSignal(unjaunter, list(SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING)))
playsound(get_turf(unjaunter), 'sound/magic/cosmic_energy.ogg', 50, TRUE, -1)
new /obj/effect/temp_visual/space_explosion(get_turf(unjaunter))
if(iscarbon(unjaunter))
@@ -122,13 +121,6 @@
var/turf/our_turf = get_turf(source)
try_exit_jaunt(our_turf, source, TRUE)
-/// Signal proc for [COMSIG_MOB_STATCHANGE], to throw us out of the jaunt if we lose consciousness.
-/datum/action/cooldown/spell/jaunt/space_crawl/proc/on_stat_change(mob/living/source, new_stat, old_stat)
- SIGNAL_HANDLER
- if(new_stat != CONSCIOUS)
- var/turf/our_turf = get_turf(source)
- try_exit_jaunt(our_turf, source, TRUE)
-
/// Spacecrawl "hands", prevent the user from holding items in spacecrawl
/obj/item/space_crawl
name = "space crawl"
diff --git a/code/modules/antagonists/voidwalker/voidwalker_abilities.dm b/code/modules/antagonists/voidwalker/voidwalker_abilities.dm
index 4fe88f50d01c6b..7c1771cdb4fe76 100644
--- a/code/modules/antagonists/voidwalker/voidwalker_abilities.dm
+++ b/code/modules/antagonists/voidwalker/voidwalker_abilities.dm
@@ -37,7 +37,7 @@
spookify(cast_on)
return
owner.balloon_alert(owner, "line of sight broken!")
- return SPELL_CANCEL_CAST
+ return SPELL_NO_IMMEDIATE_COOLDOWN
/datum/action/cooldown/spell/pointed/unsettle/proc/check_if_in_view(mob/living/carbon/human/target)
SIGNAL_HANDLER
diff --git a/code/modules/clothing/head/costume.dm b/code/modules/clothing/head/costume.dm
index 5442210aecd731..a1cfd37ec0db03 100644
--- a/code/modules/clothing/head/costume.dm
+++ b/code/modules/clothing/head/costume.dm
@@ -119,14 +119,10 @@
/obj/item/clothing/head/costume/cardborg/equipped(mob/living/user, slot)
..()
if(ishuman(user) && (slot & ITEM_SLOT_HEAD))
- var/mob/living/carbon/human/H = user
- if(istype(H.wear_suit, /obj/item/clothing/suit/costume/cardborg))
- var/obj/item/clothing/suit/costume/cardborg/CB = H.wear_suit
- CB.disguise(user, src)
-
-/obj/item/clothing/head/costume/cardborg/dropped(mob/living/user)
- ..()
- user.remove_alt_appearance("standard_borg_disguise")
+ var/mob/living/carbon/human/human_user = user
+ if(istype(human_user.wear_suit, /obj/item/clothing/suit/costume/cardborg))
+ var/obj/item/clothing/suit/costume/cardborg/suit = human_user.wear_suit
+ suit.disguise(user, src)
/obj/item/clothing/head/costume/bronze
name = "bronze hat"
diff --git a/code/modules/clothing/shoes/jumpboots.dm b/code/modules/clothing/shoes/jumpboots.dm
index 3446c2e7c78738..dc9dadcea5a537 100644
--- a/code/modules/clothing/shoes/jumpboots.dm
+++ b/code/modules/clothing/shoes/jumpboots.dm
@@ -36,6 +36,7 @@
user.visible_message(span_warning("[usr] dashes forward into the air!"))
recharging_time = world.time + recharging_rate
else
+ REMOVE_TRAIT(user, TRAIT_MOVE_FLOATING, LEAPING_TRAIT)
to_chat(user, span_warning("Something prevents you from dashing forward!"))
/obj/item/clothing/shoes/bhop/rocket
diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm
index 75c1c5d850d4fa..5184e8792969c5 100644
--- a/code/modules/clothing/suits/costume.dm
+++ b/code/modules/clothing/suits/costume.dm
@@ -166,6 +166,7 @@
body_parts_covered = CHEST|GROIN|LEGS
flags_inv = HIDEJUMPSUIT
dog_fashion = /datum/dog_fashion/back
+ var/in_use = FALSE
/obj/item/clothing/suit/costume/cardborg/equipped(mob/living/user, slot)
..()
@@ -174,17 +175,33 @@
/obj/item/clothing/suit/costume/cardborg/dropped(mob/living/user)
..()
+ if (!in_use)
+ return
user.remove_alt_appearance("standard_borg_disguise")
-
-/obj/item/clothing/suit/costume/cardborg/proc/disguise(mob/living/carbon/human/H, obj/item/clothing/head/costume/cardborg/borghead)
- if(istype(H))
- if(!borghead)
- borghead = H.head
- if(istype(borghead, /obj/item/clothing/head/costume/cardborg)) //why is this done this way? because equipped() is called BEFORE THE ITEM IS IN THE SLOT WHYYYY
- var/image/I = image(icon = 'icons/mob/silicon/robots.dmi' , icon_state = "robot", loc = H)
- I.override = 1
- I.add_overlay(mutable_appearance('icons/mob/silicon/robots.dmi', "robot_e")) //gotta look realistic
- add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "standard_borg_disguise", I) //you look like a robot to robots! (including yourself because you're totally a robot)
+ in_use = FALSE
+ var/mob/living/carbon/human/human_user = user
+ if (istype(human_user.head, /obj/item/clothing/head/costume/cardborg))
+ UnregisterSignal(human_user.head, COMSIG_ITEM_DROPPED)
+
+/obj/item/clothing/suit/costume/cardborg/proc/disguise(mob/living/carbon/human/human_user, obj/item/clothing/head/costume/cardborg/borghead)
+ if(!istype(human_user))
+ return
+ if(!borghead)
+ borghead = human_user.head
+ if(!istype(borghead, /obj/item/clothing/head/costume/cardborg)) //why is this done this way? because equipped() is called BEFORE THE ITEM IS IN THE SLOT WHYYYY
+ return
+ RegisterSignal(borghead, COMSIG_ITEM_DROPPED, PROC_REF(helmet_drop)) // Don't need to worry about qdeleting since dropped will be called from there
+ in_use = TRUE
+ var/image/override_image = image(icon = 'icons/mob/silicon/robots.dmi' , icon_state = "robot", loc = human_user)
+ override_image.override = TRUE
+ override_image.add_overlay(mutable_appearance('icons/mob/silicon/robots.dmi', "robot_e")) //gotta look realistic
+ add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "standard_borg_disguise", override_image) //you look like a robot to robots! (including yourself because you're totally a robot)
+
+/obj/item/clothing/suit/costume/cardborg/proc/helmet_drop(datum/source, mob/living/user)
+ SIGNAL_HANDLER
+ UnregisterSignal(source, COMSIG_ITEM_DROPPED)
+ user.remove_alt_appearance("standard_borg_disguise")
+ in_use = FALSE
/obj/item/clothing/suit/costume/snowman
name = "snowman outfit"
diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm
index 858e4cd7aefcfe..e93f01190974c3 100644
--- a/code/modules/food_and_drinks/machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/machinery/smartfridge.dm
@@ -396,43 +396,39 @@
if(. || !ui.user.can_perform_action(src, FORBID_TELEKINESIS_REACH))
return
- . = TRUE
var/mob/living_mob = ui.user
switch(action)
if("Release")
var/amount = text2num(params["amount"])
- var/desired = 1
+ if(isnull(amount) || !isnum(amount))
+ return TRUE
var/dispensed_amount = 0
if(isAI(living_mob))
to_chat(living_mob, span_warning("[src] does not respect your authority!"))
- return
-
- if (amount > 1)
- desired = tgui_input_number(living_mob, "How many items would you like to take out?", "Release", default = min(amount, 50), max_value = min(amount, 50))
- if(!desired)
- return
+ return TRUE
- for(var/obj/item/dispensed_item in src)
- if(desired <= 0)
+ for(var/obj/item/dispensed_item in contents)
+ if(amount <= 0)
break
var/item_name = "[dispensed_item.type]-[replacetext(replacetext(dispensed_item.name, "\proper", ""), "\improper", "")]"
- if(params["path"] == item_name)
- if(dispensed_item in component_parts)
- CRASH("Attempted removal of [dispensed_item] component_part from smartfridge via smartfridge interface.")
- //dispense the item
- if(!living_mob.put_in_hands(dispensed_item))
- dispensed_item.forceMove(drop_location())
- adjust_item_drop_location(dispensed_item)
- use_energy(active_power_usage)
- dispensed_amount++
- desired--
+ if(params["path"] != item_name)
+ continue
+ if(dispensed_item in component_parts)
+ CRASH("Attempted removal of [dispensed_item] component_part from smartfridge via smartfridge interface.")
+ //dispense the item
+ if(!living_mob.put_in_hands(dispensed_item))
+ dispensed_item.forceMove(drop_location())
+ adjust_item_drop_location(dispensed_item)
+ use_energy(active_power_usage)
+ dispensed_amount++
+ amount--
if(dispensed_amount && vend_sound)
playsound(src, vend_sound, 50, TRUE, extrarange = -3)
if (visible_contents)
update_appearance()
- return
+ return TRUE
return FALSE
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index d9690a0e542a41..54988593a9761d 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -141,11 +141,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
add_to_dead_mob_list()
- for(var/v in GLOB.active_alternate_appearances)
- if(!v)
- continue
- var/datum/atom_hud/alternate_appearance/AA = v
- AA.onNewMob(src)
+ for(var/datum/atom_hud/alternate_appearance/alt_hud as anything in GLOB.active_alternate_appearances)
+ alt_hud.apply_to_new_mob(src)
. = ..()
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 021960395d086f..02d444a6346a1c 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -148,3 +148,27 @@
#undef BEYBLADE_DIZZINESS_DURATION
#undef BEYBLADE_CONFUSION_INCREMENT
#undef BEYBLADE_CONFUSION_LIMIT
+
+
+/datum/emote/jump
+ key = "jump"
+ key_third_person = "jumps"
+ message = "jumps!"
+ // Allows ghosts to jump
+ mob_type_ignore_stat_typecache = list(/mob/dead/observer)
+
+/datum/emote/jump/run_emote(mob/user, params, type_override, intentional)
+ . = ..()
+
+ var/original_transform = user.transform
+ animate(user, transform = user.transform.Translate(0, 4), time = 0.1 SECONDS, flags = ANIMATION_PARALLEL)
+ animate(transform = original_transform, time = 0.1 SECONDS)
+
+/datum/emote/jump/get_sound(mob/user)
+ return 'sound/weapons/thudswoosh.ogg'
+
+// Avoids playing sounds if we're a ghost
+/datum/emote/jump/should_play_sound(mob/user, intentional)
+ if ishuman(user)
+ return ..()
+ return FALSE
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index abd29622fbcab5..9f25bcb82dca48 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -225,20 +225,6 @@
key_third_person = "grimaces"
message = "grimaces."
-/datum/emote/living/jump
- key = "jump"
- key_third_person = "jumps"
- message = "jumps!"
- hands_use_check = TRUE
-
-/datum/emote/living/jump/run_emote(mob/living/user, params, type_override, intentional)
- . = ..()
- animate(user, pixel_y = user.pixel_y + 4, time = 0.1 SECONDS)
- animate(pixel_y = user.pixel_y - 4, time = 0.1 SECONDS)
-
-/datum/emote/living/jump/get_sound(mob/living/user)
- return 'sound/weapons/thudswoosh.ogg'
-
/datum/emote/living/kiss
key = "kiss"
key_third_person = "kisses"
diff --git a/code/modules/mob/living/living_update_icons.dm b/code/modules/mob/living/living_update_icons.dm
index a9e1a136800b04..4e8b809e047f9e 100644
--- a/code/modules/mob/living/living_update_icons.dm
+++ b/code/modules/mob/living/living_update_icons.dm
@@ -58,7 +58,8 @@
if(!changed) //Nothing has been changed, nothing has to be done.
return
- SEND_SIGNAL(src, COMSIG_PAUSE_FLOATING_ANIM, 0.3 SECONDS)
+ ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, UPDATE_TRANSFORM_TRAIT)
+ addtimer(TRAIT_CALLBACK_REMOVE(src, TRAIT_NO_FLOATING_ANIM, UPDATE_TRANSFORM_TRAIT), 0.3 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE)
//if true, we want to avoid any animation time, it'll tween and not rotate at all otherwise.
var/is_opposite_angle = SIMPLIFY_DEGREES(lying_angle+180) == lying_prev
animate(src, transform = ntransform, time = is_opposite_angle ? 0 : UPDATE_TRANSFORM_ANIMATION_TIME, pixel_y = final_pixel_y, dir = final_dir, easing = (EASE_IN|EASE_OUT))
diff --git a/code/modules/mob/living/silicon/ai/ai_say.dm b/code/modules/mob/living/silicon/ai/ai_say.dm
index 4eb56b42384338..45c3fb26a391e0 100644
--- a/code/modules/mob/living/silicon/ai/ai_say.dm
+++ b/code/modules/mob/living/silicon/ai/ai_say.dm
@@ -23,7 +23,18 @@
if(!radio_enabled) //AI cannot speak if radio is disabled (via intellicard) or depowered.
to_chat(src, span_danger("Your radio transmitter is offline!"))
return FALSE
- ..()
+ . = ..()
+ if(.)
+ return .
+ if(message_mods[MODE_HEADSET])
+ if(radio)
+ radio.talk_into(src, message, , spans, language, message_mods)
+ return NOPASS
+ else if(message_mods[RADIO_EXTENSION] in GLOB.radiochannels)
+ if(radio)
+ radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods)
+ return NOPASS
+ return FALSE
//For holopads only. Usable by AI.
/mob/living/silicon/ai/proc/holopad_talk(message, language)
diff --git a/code/modules/mob/living/silicon/silicon_say.dm b/code/modules/mob/living/silicon/silicon_say.dm
index 9310211aa0e6dc..824bba98dc0705 100644
--- a/code/modules/mob/living/silicon/silicon_say.dm
+++ b/code/modules/mob/living/silicon/silicon_say.dm
@@ -82,10 +82,10 @@
if(message_mods[MODE_HEADSET])
if(radio)
radio.talk_into(src, message, , spans, language, message_mods)
- return REDUCE_RANGE
+ return NOPASS
else if(message_mods[RADIO_EXTENSION] in GLOB.radiochannels)
if(radio)
radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods)
- return ITALICS | REDUCE_RANGE
+ return NOPASS
return FALSE
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index d017a2acca1be9..17e929ba42290d 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -91,11 +91,9 @@
sync_mind()
//Reload alternate appearances
- for(var/v in GLOB.active_alternate_appearances)
- if(!v)
- continue
- var/datum/atom_hud/alternate_appearance/AA = v
- AA.onNewMob(src)
+ for(var/datum/atom_hud/alternate_appearance/alt_hud as anything in GLOB.active_alternate_appearances)
+ if(!alt_hud.apply_to_new_mob(src))
+ alt_hud.hide_from(src, absolute = TRUE)
update_client_colour()
update_mouse_pointer()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index f2ac24d6ed91ce..b7b5fedfab4f39 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -85,11 +85,9 @@
add_to_alive_mob_list()
set_focus(src)
prepare_huds()
- for(var/v in GLOB.active_alternate_appearances)
- if(!v)
- continue
- var/datum/atom_hud/alternate_appearance/AA = v
- AA.onNewMob(src)
+ for(var/datum/atom_hud/alternate_appearance/alt_hud as anything in GLOB.active_alternate_appearances)
+ alt_hud.apply_to_new_mob(src)
+
set_nutrition(rand(NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_START_MAX))
. = ..()
setup_hud_traits()
diff --git a/code/modules/modular_computers/computers/item/disks/role_disks.dm b/code/modules/modular_computers/computers/item/disks/role_disks.dm
index f7f20efb70b437..2191aaccdff1d2 100644
--- a/code/modules/modular_computers/computers/item/disks/role_disks.dm
+++ b/code/modules/modular_computers/computers/item/disks/role_disks.dm
@@ -6,7 +6,6 @@
max_capacity = 32
///Static list of programss ALL command tablets have.
var/static/list/datum/computer_file/command_programs = list(
- /datum/computer_file/program/crew_manifest,
/datum/computer_file/program/science,
/datum/computer_file/program/status,
)
@@ -74,7 +73,6 @@
icon_state = "datadisk9"
starting_programs = list(
/datum/computer_file/program/records/security,
- /datum/computer_file/program/crew_manifest,
)
/**
diff --git a/code/modules/modular_computers/computers/item/disks/unique_disks.dm b/code/modules/modular_computers/computers/item/disks/unique_disks.dm
index 1fd31957befca7..a5e9d9750f3ea4 100644
--- a/code/modules/modular_computers/computers/item/disks/unique_disks.dm
+++ b/code/modules/modular_computers/computers/item/disks/unique_disks.dm
@@ -23,7 +23,6 @@
/datum/computer_file/program/supermatter_monitor,
/datum/computer_file/program/newscaster,
/datum/computer_file/program/secureye,
- /datum/computer_file/program/crew_manifest,
/datum/computer_file/program/status,
)
potential_programs += subtypesof(/datum/computer_file/program/maintenance) - /datum/computer_file/program/maintenance/theme
diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm
index ec67185314d982..c7317e1ba2a51a 100644
--- a/code/modules/modular_computers/computers/item/pda.dm
+++ b/code/modules/modular_computers/computers/item/pda.dm
@@ -39,9 +39,9 @@
/datum/computer_file/program/nt_pay,
/datum/computer_file/program/notepad,
// SKYRAT EDIT ADDITION START
- /datum/computer_file/program/crew_manifest, // Adds crew manifest to all base tablets
- /datum/computer_file/program/maintenance/camera // Adds camera to all base tablets
+ /datum/computer_file/program/maintenance/camera, // Adds camera to all base tablets
// SKRAT EDIT ADDITION END
+ /datum/computer_file/program/crew_manifest
)
///List of items that can be stored in a PDA
var/static/list/contained_item = list(
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 5c7f95d54e9169..1e20936b921bde 100644
--- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm
+++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm
@@ -7,7 +7,6 @@
greyscale_colors = "#67A364#a92323"
max_capacity = parent_type::max_capacity * 2
var/static/list/datum/computer_file/head_programs = list(
- /datum/computer_file/program/crew_manifest,
/datum/computer_file/program/status,
/datum/computer_file/program/science,
/datum/computer_file/program/robocontrol,
@@ -105,7 +104,6 @@
inserted_item = /obj/item/pen/red/security
starting_programs = list(
/datum/computer_file/program/records/security,
- /datum/computer_file/program/crew_manifest,
/datum/computer_file/program/robocontrol,
)
@@ -115,7 +113,6 @@
inserted_item = /obj/item/pen/red/security
starting_programs = list(
/datum/computer_file/program/records/security,
- /datum/computer_file/program/crew_manifest,
/datum/computer_file/program/robocontrol,
)
@@ -126,7 +123,6 @@
inserted_item = /obj/item/pen/red/security
starting_programs = list(
/datum/computer_file/program/records/security,
- /datum/computer_file/program/crew_manifest,
/datum/computer_file/program/robocontrol,
)
@@ -220,7 +216,6 @@
greyscale_colors = "#FAFAFA#000099#1f2026"
starting_programs = list(
/datum/computer_file/program/records/medical,
- /datum/computer_file/program/crew_manifest,
)
/**
@@ -383,7 +378,6 @@
greyscale_colors = "#333333#000099#3F96CC"
starting_programs = list(
/datum/computer_file/program/records/medical,
- /datum/computer_file/program/crew_manifest,
/datum/computer_file/program/robocontrol,
)
@@ -400,7 +394,6 @@
name = "bridge assistant PDA"
greyscale_colors = "#374f7e#a92323"
starting_programs = list(
- /datum/computer_file/program/crew_manifest,
/datum/computer_file/program/status,
)
@@ -410,7 +403,6 @@
inserted_item = /obj/item/pen/fountain
starting_programs = list(
/datum/computer_file/program/records/security,
- /datum/computer_file/program/crew_manifest,
/datum/computer_file/program/coupon, //veteran discount
/datum/computer_file/program/skill_tracker,
)
diff --git a/code/modules/modular_computers/file_system/programs/crewmanifest.dm b/code/modules/modular_computers/file_system/programs/crewmanifest.dm
index 39a9d8c3c7fe5a..d0dcf0ae873fe3 100644
--- a/code/modules/modular_computers/file_system/programs/crewmanifest.dm
+++ b/code/modules/modular_computers/file_system/programs/crewmanifest.dm
@@ -1,15 +1,13 @@
/datum/computer_file/program/crew_manifest
filename = "plexagoncrew"
filedesc = "Plexagon Crew List"
- downloader_category = PROGRAM_CATEGORY_SECURITY
+ downloader_category = PROGRAM_CATEGORY_DEVICE
program_open_overlay = "id"
extended_desc = "Program for viewing and printing the current crew manifest"
- download_access = list(ACCESS_SECURITY, ACCESS_COMMAND)
program_flags = PROGRAM_ON_NTNET_STORE | PROGRAM_REQUIRES_NTNET
- size = 4
+ size = 0
tgui_id = "NtosCrewManifest"
program_icon = "clipboard-list"
- detomatix_resistance = DETOMATIX_RESIST_MAJOR
/datum/computer_file/program/crew_manifest/ui_static_data(mob/user)
var/list/data = list()
diff --git a/code/modules/modular_computers/file_system/programs/records.dm b/code/modules/modular_computers/file_system/programs/records.dm
index 3effdbd5b803d6..0aab001db042d5 100644
--- a/code/modules/modular_computers/file_system/programs/records.dm
+++ b/code/modules/modular_computers/file_system/programs/records.dm
@@ -29,6 +29,7 @@
download_access = list(ACCESS_SECURITY, ACCESS_FLAG_COMMAND)
program_flags = PROGRAM_ON_NTNET_STORE
mode = "security"
+ detomatix_resistance = DETOMATIX_RESIST_MINOR
/datum/computer_file/program/records/proc/GetRecordsReadable()
var/list/all_records = list()
diff --git a/code/modules/modular_computers/file_system/programs/statusdisplay.dm b/code/modules/modular_computers/file_system/programs/statusdisplay.dm
index fa844215b93b9a..a57940d99c1fa3 100644
--- a/code/modules/modular_computers/file_system/programs/statusdisplay.dm
+++ b/code/modules/modular_computers/file_system/programs/statusdisplay.dm
@@ -11,6 +11,7 @@
can_run_on_flags = PROGRAM_ALL
program_flags = PROGRAM_REQUIRES_NTNET
+ detomatix_resistance = DETOMATIX_RESIST_MAJOR
var/upper_text = ""
var/lower_text = ""
diff --git a/code/modules/modular_computers/file_system/programs/virtual_pet.dm b/code/modules/modular_computers/file_system/programs/virtual_pet.dm
index 78a9148b013fec..8f1eef074d46a5 100644
--- a/code/modules/modular_computers/file_system/programs/virtual_pet.dm
+++ b/code/modules/modular_computers/file_system/programs/virtual_pet.dm
@@ -429,7 +429,7 @@ GLOBAL_LIST_EMPTY(virtual_pets_list)
var/static/list/possible_emotes = list(
/datum/emote/flip,
- /datum/emote/living/jump,
+ /datum/emote/jump,
/datum/emote/living/shiver,
/datum/emote/spin,
/datum/emote/silicon/beep,
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index ef54987d579379..5293a1220e04a6 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -220,7 +220,7 @@
ignored_mobs = user
)
- if(chambered.integrity_damage)
+ if(chambered?.integrity_damage)
take_damage(chambered.integrity_damage, sound_effect = FALSE)
/obj/item/gun/atom_destruction(damage_flag)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 9471051440ee7c..0763a22f8a4939 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -480,6 +480,8 @@
return ..()
/obj/item/gun/ballistic/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1)
+ if(isnull(chambered))
+ return ..()
if(can_misfire && chambered.can_misfire != FALSE)
misfire_probability += misfire_percentage_increment
misfire_probability = clamp(misfire_probability, 0, misfire_probability_cap)
diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm
index 024f8353ddb486..5ddca6d96bb34a 100644
--- a/code/modules/projectiles/guns/ballistic/rifle.dm
+++ b/code/modules/projectiles/guns/ballistic/rifle.dm
@@ -193,9 +193,9 @@
/obj/item/gun/ballistic/rifle/rebarxbow
name = "Heated Rebar Crossbow"
- desc = "Made from an inducer, iron rods, and some wire, this crossbow fires sharpened iron rods, made from the plentiful iron rods found stationwide. \
- Additionally, can fire specialty ammo made from the materials in the atmos crystalizer - zaukerite, metallic hydrogen, and healium crytals all work. \
- Very slow to reload - you can craft the crossbow with a crowbar to try loosen the crossbar, but risks a misfire, or worse..."
+ desc = "A handcrafted crossbow. \
+ Aside from conventional sharpened iron rods, it can also fire specialty ammo made from the atmos crystalizer - zaukerite, metallic hydrogen, and healium rods all work. \
+ Very slow to reload - you can craft the crossbow with a crowbar to loosen the crossbar, but risk a misfire, or worse..."
icon = 'icons/obj/weapons/guns/ballistic.dmi'
icon_state = "rebarxbow"
inhand_icon_state = "rebarxbow"
@@ -212,7 +212,6 @@
bolt_wording = "bowstring"
magazine_wording = "rod"
cartridge_wording = "rod"
- misfire_probability = 25
weapon_weight = WEAPON_HEAVY
initial_caliber = CALIBER_REBAR
accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/rebarxbow/normal
@@ -266,7 +265,7 @@
/obj/item/gun/ballistic/rifle/rebarxbow/syndie
name = "Syndicate Rebar Crossbow"
desc = "The syndicate liked the bootleg rebar crossbow NT engineers made, so they showed what it could be if properly developed. \
- Holds three shots without a chance of exploding, and features a built in scope. Compatable with all known crossbow ammunition."
+ Holds three shots without a chance of exploding, and features a built in scope. Compatible with all known crossbow ammunition."
icon_state = "rebarxbowsyndie"
inhand_icon_state = "rebarxbowsyndie"
worn_icon_state = "rebarxbowsyndie"
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 0046c0156a1db9..6364afab811630 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -50,13 +50,11 @@
//overclocked laser, does a bit more damage but has much higher wound power (-0 vs -20)
/obj/projectile/beam/laser/hellfire
name = "hellfire laser"
+ icon_state = "hellfire"
wound_bonus = 0
damage = 30
speed = 0.6 // higher power = faster, that's how light works right
-
-/obj/projectile/beam/laser/hellfire/Initialize(mapload)
- . = ..()
- transform *= 2
+ light_color = "#FF969D"
/obj/projectile/beam/laser/heavylaser
name = "heavy laser"
diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
index fca0982d205490..31f7572b09c74e 100644
--- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
@@ -344,6 +344,7 @@
taste_description = "spiked butterscotch"
ph = 6.5
default_container = /obj/item/reagent_containers/cup/glass/bottle/rum
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
/datum/reagent/consumable/ethanol/rum/aged
name = "Aged Rum"
diff --git a/code/modules/research/anomaly/anomaly_core.dm b/code/modules/research/anomaly/anomaly_core.dm
index febb25add5301e..9cf762e58d219c 100644
--- a/code/modules/research/anomaly/anomaly_core.dm
+++ b/code/modules/research/anomaly/anomaly_core.dm
@@ -20,8 +20,9 @@
A.anomalyNeutralize()
return TRUE
-/obj/item/assembly/signaler/anomaly/manual_suicide(mob/living/carbon/user)
- user.visible_message(span_suicide("[user]'s [src] is reacting to the radio signal, warping [user.p_their()] body!"))
+/obj/item/assembly/signaler/anomaly/manual_suicide(datum/mind/suicidee)
+ var/mob/living/user = suicidee.current
+ user.visible_message(span_suicide("[user]'s [name] is reacting to the radio signal, warping [user.p_their()] body!"))
user.set_suicide(TRUE)
user.gib(DROP_ALL_REMAINS)
diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
index c5136baafb1491..152a90f9795eb6 100644
--- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
@@ -66,6 +66,7 @@ Slimecrossing Weapons
attack_verb_simple = list("bash", "pound", "slam")
item_flags = SLOWS_WHILE_IN_HAND
breakable_by_damage = FALSE
+ shield_bash_sound = 'sound/effects/glassknock.ogg'
/datum/armor/shield_adamantineshield
melee = 50
diff --git a/code/modules/transport/tram/tram_signals.dm b/code/modules/transport/tram/tram_signals.dm
index faf4a46e11e286..a5d309b8378b0e 100644
--- a/code/modules/transport/tram/tram_signals.dm
+++ b/code/modules/transport/tram/tram_signals.dm
@@ -150,8 +150,8 @@
. += span_notice("The orange [EXAMINE_HINT("remote warning")] light is on.")
. += span_notice("The status display reads: Check track sensor.")
if(TRANSPORT_REMOTE_FAULT)
- . += span_notice("The blue [EXAMINE_HINT("remote fault")] light is on.")
- . += span_notice("The status display reads: Check tram controller.")
+ . += span_notice("The blue [EXAMINE_HINT("telecoms failure")] light is on.")
+ . += span_notice("The status display reads: Check telecommunications network.")
if(TRANSPORT_LOCAL_FAULT)
. += span_notice("The red [EXAMINE_HINT("local fault")] light is on.")
. += span_notice("The status display reads: Repair required.")
@@ -246,10 +246,10 @@
operating_status = TRANSPORT_REMOTE_FAULT
else
operating_status = TRANSPORT_SYSTEM_NORMAL
+ if(isnull(linked_sensor))
+ link_sensor()
+ wake_sensor()
- if(isnull(linked_sensor))
- link_sensor()
- wake_sensor()
update_operating()
/obj/machinery/transport/crossing_signal/on_set_machine_stat()
@@ -304,6 +304,8 @@
// degraded signal operating conditions of any type show blue
var/idle_aspect = operating_status == TRANSPORT_SYSTEM_NORMAL ? XING_STATE_GREEN : XING_STATE_MALF
var/datum/transport_controller/linear/tram/tram = transport_ref?.resolve()
+ if(tram.controller_status & COMM_ERROR)
+ idle_aspect = XING_STATE_MALF
// Check for stopped states. Will kill the process since tram starting up will restart process.
if(!tram || !tram.controller_operational || !tram.controller_active || !is_operational || !inbound || !outbound)
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 7e501217eb68c6..0d347709536ee0 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -172,6 +172,8 @@
ADD_TRAIT(created, TRAIT_CONTRABAND, INNATE_TRAIT)
for(var/obj/contained as anything in created.get_all_contents())
ADD_TRAIT(contained, TRAIT_CONTRABAND, INNATE_TRAIT)
+
+ if(isgun(created))
replace_pin(created)
else if(istype(created, /obj/item/storage/toolbox/guncase))
for(var/obj/item/gun/gun in created)
diff --git a/dependencies.sh b/dependencies.sh
index 3d9933d8f47330..01ba3094e5b4c5 100644
--- a/dependencies.sh
+++ b/dependencies.sh
@@ -31,4 +31,4 @@ export AUXLUA_VERSION=1.4.4
export CUTTER_REPO=spacestation13/hypnagogic
#hypnagogic git tag
-export CUTTER_VERSION=v3.1.0
+export CUTTER_VERSION=v4.0.0
diff --git a/html/changelogs/archive/2024-09.yml b/html/changelogs/archive/2024-09.yml
new file mode 100644
index 00000000000000..770aec409a663f
--- /dev/null
+++ b/html/changelogs/archive/2024-09.yml
@@ -0,0 +1,76 @@
+2024-09-03:
+ Moostard:
+ - bugfix: Ceremonial rifle crate now contains 3 rifles as advertised. The naming
+ of the single-pack variant is more clear as well.
+2024-09-04:
+ KathrinBailey:
+ - bugfix: Jean skirts no longer cover chest/legs.
+ SkyratBot:
+ - balance: Plexagon Crew Manifest is now a default PDA app for everyone, and is
+ free.
+ - balance: Plexagon Crew Manifest no longer provides Detomatix resistance, but security
+ records and status display control now do.
+2024-09-05:
+ Erol509:
+ - bugfix: Repathed tesh satchels, removed not needed hood overlay on Teshari characters
+2024-09-06:
+ Melbert:
+ - bugfix: Some spy items should spawn less broken
+ Rhials:
+ - spellcheck: Anomaly suicides now use proper grammar.
+ - bugfix: Anomaly suicides work again.
+ SkyratBot:
+ - qol: Smartfridges now lets you set how many pills you want to vend, rather than
+ popping out a second separate tgui window.
+ - bugfix: fixed a bug that could sometimes cause jump boots users to retain the
+ floating trait indefinitely when using the ability
+ - bugfix: Rum can be synthetized again.
+ - bugfix: Big manipulator hands now move smoothly with the base when it's moved.
+ - bugfix: Cardborg costume no longer gets its appearance deleted when you drop a
+ second hat/suit you are holding in your hand
+ - qol: Unsettle (Voidwalker) doesn't go on cooldown if line of sight is broken
+ - qol: Mirrors now have text tooltips for their radial menus
+ - bugfix: Fixed pride mirrors not dumping you into space after use
+ - bugfix: Buckling yourself to a bed or stasis bed will now make you actually use
+ the headrest/pillow and face up.
+ - bugfix: fixed that screwdriwing radio headset in combat mode don't do anything.
+ - bugfix: You will now be ejected from any jaunt (i.e bloodcrawl or shadow walk)
+ if you lose consciousness somehow during the jaunt.
+ - bugfix: due to a clerical error, all ballistic guns were shipping with built-in
+ silencers. this has been resolved-they will now make noise once again when fired.
+ - bugfix: Changelings can no longer spawn undetectable spider eggs inside of vents
+ - spellcheck: fixed a few typos with energy shield descriptions.
+ grungussuss:
+ - sound: being sacrificed by a heretic is now spookier
+ oranges:
+ - rscadd: ghosts can now jump, bhop your way to life
+ thegrb93:
+ - bugfix: Fixes vox breath mask being unable to eat or drink through after adjusting
+ it
+2024-09-07:
+ Melbert:
+ - refactor: Refactored heretic influences a tiny bit, now ghosts can see them! Report
+ any oddities.
+ SkyratBot:
+ - bugfix: Embed updating now actually updates embeds
+ - spellcheck: Changed description of Rebar crossbow.
+ - bugfix: Rebar crossbow description will no longer lie about it's missfire potential.
+ - sound: adds sounds for energy shieldbashing
+ - code_imp: Shieldbashing feature is now consistent across all shield types
+ - qol: All cans (soda cans etc) fit on utility belts now. Drink on the job!
+ - image: Added new sprites for hellfire lasers
+ - bugfix: fixed the die of fate deleting all your organs when rolling a 4
+ - balance: When silicons use their radio they will not whisper out loud anymore
+ TwistedSilicon:
+ - bugfix: The Codex Cicatrix ritual now consumes the item in the case where a hide
+ was used instead of a corpse. No more free books.
+ grungussuss and kayozz:
+ - sound: gravity generator has a new sound
+ xXPawnStarrXx:
+ - bugfix: fixed cyborg upgrades deleting the bonesetter and giving no alternative.
+2024-09-08:
+ LT3:
+ - balance: Increased PDA default battery capacity
+ SkyratBot:
+ - bugfix: Fixed the taskbar/menu bar icon showing the virgin orange byond icon instead
+ of the chad blue ss13 icon.
diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi
index a6cf89e9b910f5..cbf79a92b538f6 100644
Binary files a/icons/obj/weapons/guns/projectiles.dmi and b/icons/obj/weapons/guns/projectiles.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 3e11a95545cf1b..41d615afe12ead 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -65,7 +65,7 @@ window "mainwindow"
is-default = true
saved-params = "pos;size;is-minimized;is-maximized"
statusbar = false
- icon = 'icons\\ui_icons\\common\\tg_32.png'
+ icon = 'icons\\ui\\common\\tg_32.png'
macro = "default"
menu = "menu"
elem "split"
diff --git a/modular_skyrat/master_files/code/modules/clothing/under/skirts_dresses.dm b/modular_skyrat/master_files/code/modules/clothing/under/skirts_dresses.dm
index cef9c7c5eda4c4..4c106704c19825 100644
--- a/modular_skyrat/master_files/code/modules/clothing/under/skirts_dresses.dm
+++ b/modular_skyrat/master_files/code/modules/clothing/under/skirts_dresses.dm
@@ -88,6 +88,7 @@
greyscale_config_worn_digi = /datum/greyscale_config/jean_skirt/worn/digi
greyscale_colors = "#787878#723E0E#4D7EAC"
flags_1 = IS_PLAYER_COLORABLE_1
+ body_parts_covered = GROIN
/obj/item/clothing/under/dress/skirt/skyrat/lone_skirt
name = "skirt"
diff --git a/modular_skyrat/master_files/code/modules/modular_computers/computers/item/computer.dm b/modular_skyrat/master_files/code/modules/modular_computers/computers/item/computer.dm
new file mode 100644
index 00000000000000..5a072fd075bc85
--- /dev/null
+++ b/modular_skyrat/master_files/code/modules/modular_computers/computers/item/computer.dm
@@ -0,0 +1,3 @@
+/obj/item/modular_computer
+ // Extended PDA cell to compensate for increased round length
+ internal_cell = /obj/item/stock_parts/power_store/cell/upgraded
diff --git a/modular_skyrat/modules/borgs/code/robot_upgrade.dm b/modular_skyrat/modules/borgs/code/robot_upgrade.dm
index 3b61fd70535582..b1e354c655d577 100644
--- a/modular_skyrat/modules/borgs/code/robot_upgrade.dm
+++ b/modular_skyrat/modules/borgs/code/robot_upgrade.dm
@@ -16,11 +16,13 @@
items_to_add = list(/obj/item/scalpel/advanced,
/obj/item/retractor/advanced,
/obj/item/cautery/advanced,
+ /obj/item/blood_filter/advanced,
/obj/item/healthanalyzer/advanced,
)
items_to_remove = list(
/obj/item/borg/cyborg_omnitool/medical,
/obj/item/borg/cyborg_omnitool/medical, // Twice because you get two
+ /obj/item/blood_filter,
/obj/item/healthanalyzer,
)
diff --git a/modular_skyrat/modules/customization/modules/clothing/masks/breath.dm b/modular_skyrat/modules/customization/modules/clothing/masks/breath.dm
index 25f8e9237ce890..6a4faf9676314b 100644
--- a/modular_skyrat/modules/customization/modules/clothing/masks/breath.dm
+++ b/modular_skyrat/modules/customization/modules/clothing/masks/breath.dm
@@ -3,6 +3,7 @@
name = "vox breath mask"
actions_types = list()
flags_cover = NONE
+ visor_flags_cover = NONE
/obj/item/clothing/mask/balaclavaadjust
name = "adjustable balaclava"
diff --git a/modular_skyrat/modules/sec_haul/code/guns/cargo_stuff.dm b/modular_skyrat/modules/sec_haul/code/guns/cargo_stuff.dm
index 2b248320e9c924..54f558b4eb4ba2 100644
--- a/modular_skyrat/modules/sec_haul/code/guns/cargo_stuff.dm
+++ b/modular_skyrat/modules/sec_haul/code/guns/cargo_stuff.dm
@@ -128,7 +128,7 @@
name = "Romulus Ceremonial Bolt Action Rifle Crate"
desc = "Contains Three Ceremonial Bolt Action Rifle in .40 , as well as ammo for it."
cost = CARGO_CRATE_VALUE * 12
- contains = list(/obj/item/storage/toolbox/guncase/skyrat/ceremonial_rifle = 1,
+ contains = list(/obj/item/storage/toolbox/guncase/skyrat/ceremonial_rifle = 3,
)
crate_name = "Romulus Ceremonial Rifle Crate"
diff --git a/modular_skyrat/modules/sec_haul/code/misc/packs.dm b/modular_skyrat/modules/sec_haul/code/misc/packs.dm
index d4f68cfc00cd36..96918f8c8e04f4 100644
--- a/modular_skyrat/modules/sec_haul/code/misc/packs.dm
+++ b/modular_skyrat/modules/sec_haul/code/misc/packs.dm
@@ -27,7 +27,7 @@
access_view = ACCESS_WEAPONS
/datum/supply_pack/goody/ceremonial_rifle
- name = "Romulus Sporting Rifle"
+ name = "Romulus Ceremonial Bolt Action Rifle"
desc = "A sporting rifle made of light polymer material chambered in Sol .40, poor recoil handling but quite accurate."
contains = list(/obj/item/storage/toolbox/guncase/skyrat/ceremonial_rifle = 1)
cost = PAYCHECK_COMMAND * 20
diff --git a/modular_skyrat/modules/teshari/code/teshari_clothes.dm b/modular_skyrat/modules/teshari/code/teshari_clothes.dm
index 85a40824994168..64d23b3399e2bc 100644
--- a/modular_skyrat/modules/teshari/code/teshari_clothes.dm
+++ b/modular_skyrat/modules/teshari/code/teshari_clothes.dm
@@ -17,7 +17,7 @@
/obj/item/clothing/neck/cloak
species_clothing_color_coords = list(list(CLOAK_COLORPIXEL_X_1, CLOAK_COLORPIXEL_Y_1), list(CLOAK_COLORPIXEL_X_2, CLOAK_COLORPIXEL_Y_2))
greyscale_config_worn_teshari_fallback = /datum/greyscale_config/teshari/cloak
-
+
/obj/item/clothing/neck/mantle
species_clothing_color_coords = list(list(MANTLE_COLORPIXEL_X_1, MANTLE_COLORPIXEL_Y_1), list(MANTLE_COLORPIXEL_X_2, MANTLE_COLORPIXEL_Y_2))
greyscale_config_worn_teshari_fallback = /datum/greyscale_config/teshari/mantle
@@ -33,11 +33,11 @@
/obj/item/clothing/suit
species_clothing_color_coords = list(list(COAT_COLORPIXEL_X_1, COAT_COLORPIXEL_Y_1))
greyscale_config_worn_teshari_fallback = /datum/greyscale_config/teshari/coat
-
+
/obj/item/clothing/suit/wizrobe
species_clothing_color_coords = list(list(THICKROBE_COLORPIXEL_X_1, THICKROBE_COLORPIXEL_Y_1), list(THICKROBE_COLORPIXEL_X_2, THICKROBE_COLORPIXEL_Y_2), list(THICKROBE_COLORPIXEL_X_3, THICKROBE_COLORPIXEL_Y_3), list(THICKROBE_COLORPIXEL_X_4, THICKROBE_COLORPIXEL_Y_4), list(THICKROBE_COLORPIXEL_X_5, THICKROBE_COLORPIXEL_Y_5), list(THICKROBE_COLORPIXEL_X_6, THICKROBE_COLORPIXEL_Y_6))
greyscale_config_worn_teshari_fallback = /datum/greyscale_config/teshari/thickrobe/wiz
-
+
/obj/item/clothing/suit/jacket/trenchcoat
species_clothing_color_coords = list(list(LONGCOAT_COLORPIXEL_X_1, LONGCOAT_COLORPIXEL_Y_1), list(THICKROBE_COLORPIXEL_X_2, THICKROBE_COLORPIXEL_Y_2), list(THICKROBE_COLORPIXEL_X_3, THICKROBE_COLORPIXEL_Y_3), list(LONGCOAT_COLORPIXEL_X_4, LONGCOAT_COLORPIXEL_Y_4))
greyscale_config_worn_teshari_fallback = /datum/greyscale_config/teshari/thickrobe/longcoat
@@ -170,7 +170,7 @@
/obj/item/clothing/under/dress/sundress
greyscale_config_worn_teshari = /datum/greyscale_config/sundress/worn/teshari
-
+
/obj/item/clothing/neck/scarf
greyscale_config_worn_teshari = /datum/greyscale_config/scarf/worn/teshari
@@ -182,7 +182,23 @@
/obj/item/clothing/suit/kimjacket
species_clothing_color_coords = list(list(JACKET_COLORPIXEL_X_1, JACKET_COLORPIXEL_Y_1), list(JACKET_COLORPIXEL_X_2, JACKET_COLORPIXEL_Y_2), list(THICKROBE_COLORPIXEL_X_3, THICKROBE_COLORPIXEL_Y_3), list(JACKET_COLORPIXEL_X_4, JACKET_COLORPIXEL_Y_4))
greyscale_config_worn_teshari_fallback = /datum/greyscale_config/teshari/thickrobe/jacket
-
+
/obj/item/clothing/suit/discoblazer
species_clothing_color_coords = list(list(JACKET_COLORPIXEL_X_1, JACKET_COLORPIXEL_Y_1), list(JACKET_COLORPIXEL_X_2, JACKET_COLORPIXEL_Y_2), list(THICKROBE_COLORPIXEL_X_3, THICKROBE_COLORPIXEL_Y_3), list(JACKET_COLORPIXEL_X_4, JACKET_COLORPIXEL_Y_4))
greyscale_config_worn_teshari_fallback = /datum/greyscale_config/teshari/thickrobe/jacket
+
+// Wintercoats and Satchels
+
+/obj/item/storage/backpack/satchel
+ worn_icon_teshari = 'modular_skyrat/master_files/icons/mob/clothing/species/teshari/back.dmi'
+
+/obj/item/storage/backpack/duffelbag
+ worn_icon_teshari = 'modular_skyrat/master_files/icons/mob/clothing/species/teshari/back.dmi'
+
+/obj/item/clothing/suit/hooded/wintercoat/equipped(mob/living/user, slot)
+ var/mob/living/carbon/human/teshari = user
+ if(teshari.dna.species.name == "Teshari")
+ var/datum/component/toggle_attached_clothing/component = GetComponent(/datum/component/toggle_attached_clothing)
+ component.undeployed_overlay = null
+ . = ..()
+
diff --git a/sound/ambience/antag/heretic/attribution.txt b/sound/ambience/antag/heretic/attribution.txt
new file mode 100644
index 00000000000000..8744b2497f5bd9
--- /dev/null
+++ b/sound/ambience/antag/heretic/attribution.txt
@@ -0,0 +1 @@
+heretic_sacrifice.ogg - made by sadboysusss, License: CC-by-SA
\ No newline at end of file
diff --git a/sound/ambience/antag/heretic/heretic_sacrifice.ogg b/sound/ambience/antag/heretic/heretic_sacrifice.ogg
new file mode 100644
index 00000000000000..5a8efb65083566
Binary files /dev/null and b/sound/ambience/antag/heretic/heretic_sacrifice.ogg differ
diff --git a/sound/effects/energyshieldbash.ogg b/sound/effects/energyshieldbash.ogg
new file mode 100644
index 00000000000000..c8d5bee557222e
Binary files /dev/null and b/sound/effects/energyshieldbash.ogg differ
diff --git a/sound/machines/gravgen/attribution.txt b/sound/machines/gravgen/attribution.txt
new file mode 100644
index 00000000000000..f4aeab2c4902ae
--- /dev/null
+++ b/sound/machines/gravgen/attribution.txt
@@ -0,0 +1,6 @@
+{
+grav_gen_start.ogg
+grav_gen_mid1.ogg
+grav_gen_mid2.ogg - + Explosion 7b by LiamG_SFX -- https://freesound.org/s/322492/ -- License: Attribution NonCommercial 4.0
+grav_gen_end.ogg
+} made by sadboysuss by editing a sound made by kayozz , license: CC-by-SA
\ No newline at end of file
diff --git a/sound/machines/gravgen/grav_gen_end.ogg b/sound/machines/gravgen/grav_gen_end.ogg
new file mode 100644
index 00000000000000..a63305708d0303
Binary files /dev/null and b/sound/machines/gravgen/grav_gen_end.ogg differ
diff --git a/sound/machines/gravgen/grav_gen_mid1.ogg b/sound/machines/gravgen/grav_gen_mid1.ogg
new file mode 100644
index 00000000000000..e6e38c11d467b2
Binary files /dev/null and b/sound/machines/gravgen/grav_gen_mid1.ogg differ
diff --git a/sound/machines/gravgen/grav_gen_mid2.ogg b/sound/machines/gravgen/grav_gen_mid2.ogg
new file mode 100644
index 00000000000000..cf112de1885b41
Binary files /dev/null and b/sound/machines/gravgen/grav_gen_mid2.ogg differ
diff --git a/sound/machines/gravgen/grav_gen_start.ogg b/sound/machines/gravgen/grav_gen_start.ogg
new file mode 100644
index 00000000000000..4a734e5517020c
Binary files /dev/null and b/sound/machines/gravgen/grav_gen_start.ogg differ
diff --git a/sound/machines/gravgen/gravgen_mid1.ogg b/sound/machines/gravgen/gravgen_mid1.ogg
deleted file mode 100644
index de2744194bdc62..00000000000000
Binary files a/sound/machines/gravgen/gravgen_mid1.ogg and /dev/null differ
diff --git a/sound/machines/gravgen/gravgen_mid2.ogg b/sound/machines/gravgen/gravgen_mid2.ogg
deleted file mode 100644
index 7b09d566e91eb3..00000000000000
Binary files a/sound/machines/gravgen/gravgen_mid2.ogg and /dev/null differ
diff --git a/sound/machines/gravgen/gravgen_mid3.ogg b/sound/machines/gravgen/gravgen_mid3.ogg
deleted file mode 100644
index 6e133b5fcfe60e..00000000000000
Binary files a/sound/machines/gravgen/gravgen_mid3.ogg and /dev/null differ
diff --git a/sound/machines/gravgen/gravgen_mid4.ogg b/sound/machines/gravgen/gravgen_mid4.ogg
deleted file mode 100644
index 4f08f5e6d2273c..00000000000000
Binary files a/sound/machines/gravgen/gravgen_mid4.ogg and /dev/null differ
diff --git a/tgstation.dme b/tgstation.dme
index b39e3eb027b68c..8f36dbaa0be0d9 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1509,6 +1509,7 @@
#include "code\datums\elements\beauty.dm"
#include "code\datums\elements\bed_tucking.dm"
#include "code\datums\elements\befriend_petting.dm"
+#include "code\datums\elements\block_turf_fingerprints.dm"
#include "code\datums\elements\blocks_explosives.dm"
#include "code\datums\elements\body_temp_sensitive.dm"
#include "code\datums\elements\bombable_turf.dm"
@@ -6812,6 +6813,7 @@
#include "modular_skyrat\master_files\code\modules\mod\modules\modules_antag.dm"
#include "modular_skyrat\master_files\code\modules\mod\modules\modules_security.dm"
#include "modular_skyrat\master_files\code\modules\mod\modules\modules_supply.dm"
+#include "modular_skyrat\master_files\code\modules\modular_computers\computers\item\computer.dm"
#include "modular_skyrat\master_files\code\modules\modular_computers\computers\item\laptop_presets.dm"
#include "modular_skyrat\master_files\code\modules\modular_computers\file_system\programs\maintenance\camera.dm"
#include "modular_skyrat\master_files\code\modules\movespeed\modifiers\items.dm"
diff --git a/tgui/packages/tgui/interfaces/SmartVend.tsx b/tgui/packages/tgui/interfaces/SmartVend.tsx
index 9023afacbc71a8..e92e6fbcdbd5e9 100644
--- a/tgui/packages/tgui/interfaces/SmartVend.tsx
+++ b/tgui/packages/tgui/interfaces/SmartVend.tsx
@@ -4,7 +4,15 @@ import { useState } from 'react';
import { DmIcon, Icon } from 'tgui-core/components';
import { useBackend } from '../backend';
-import { Box, Button, Input, NoticeBox, Section, Stack } from '../components';
+import {
+ Box,
+ Button,
+ Input,
+ NoticeBox,
+ NumberInput,
+ Section,
+ Stack,
+} from '../components';
import { Window } from '../layouts';
type Item = {
@@ -169,6 +177,7 @@ const ItemList = ({ item }) => {
const fallback = (
);
+ const [itemCount, setItemCount] = useState(1);
return (
@@ -236,29 +245,20 @@ const ItemList = ({ item }) => {
onClick={() =>
act('Release', {
path: item.path,
- amount: 1,
+ amount: itemCount,
})
}
>
Vend
-
-
-
+ setItemCount(value)}
+ />
) as any;
diff --git a/tools/WebhookProcessor/github_webhook_processor.php b/tools/WebhookProcessor/github_webhook_processor.php
index 0aea0a6cc691c6..87aec4adb759be 100644
--- a/tools/WebhookProcessor/github_webhook_processor.php
+++ b/tools/WebhookProcessor/github_webhook_processor.php
@@ -485,8 +485,10 @@ function game_announce($action, $payload, $pr_flags) {
$msg = '['.$payload['pull_request']['base']['repo']['full_name'].'] Pull Request '.$action.' by '.htmlSpecialChars($payload['sender']['login']).': '.htmlSpecialChars('#'.$payload['pull_request']['number'].' '.$payload['pull_request']['user']['login'].' - '.$payload['pull_request']['title']).'';
$game_servers = filter_announce_targets($servers, $payload['pull_request']['base']['repo']['owner']['login'], $payload['pull_request']['base']['repo']['name'], $action, $pr_flags);
-
- $msg = '?announce='.urlencode($msg).'&payload='.urlencode(json_encode($payload));
+ $game_payload = array();
+ $game_payload['pull_request'] = array();
+ $game_payload['pull_request']['id'] = $payload['pull_request']['id'];
+ $msg = '?announce='.urlencode($msg).'&payload='.urlencode(json_encode($game_payload));
foreach ($game_servers as $serverid => $server) {
$server_message = $msg;
@@ -789,7 +791,7 @@ function game_server_send($addr, $port, $str) {
/* --- Create a socket and connect it to the server --- */
$server = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or exit("ERROR");
socket_set_option($server, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 2, 'usec' => 0)); //sets connect and send timeout to 2 seconds
- if(!socket_connect($server,$addr,$port)) {
+ if(!@socket_connect($server,$addr,$port)) {
return "ERROR: Connection failed";
}
@@ -807,8 +809,8 @@ function game_server_send($addr, $port, $str) {
}
/* --- Idle for a while until received bytes from game server --- */
- $result = socket_read($server, 10000, PHP_BINARY_READ);
- socket_close($server); // we don't need this anymore
+ $result = @socket_read($server, 10000, PHP_BINARY_READ);
+ @socket_close($server); // we don't need this anymore
if($result != "") {
if($result[0] == "\x00" || $result[1] == "\x83") { // make sure it's the right packet format