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