diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm index 0b39c276a7d61..e0e5a97fc6510 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm @@ -29,7 +29,10 @@ /obj/machinery/light/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "ce" = ( /obj/machinery/modular_computer/preset{ @@ -62,11 +65,17 @@ /area/ruin/comms_agent) "dP" = ( /obj/structure/closet/crate/secure/freezer/commsagent, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "eE" = ( /obj/structure/cable, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "eT" = ( /obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms/icemoon{ @@ -126,7 +135,10 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "ig" = ( /obj/effect/turf_decal/siding/wood, @@ -136,11 +148,17 @@ /obj/effect/turf_decal/siding/wideplating/light/corner{ dir = 8 }, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "in" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "iZ" = ( /obj/effect/turf_decal/siding/wood{ @@ -156,7 +174,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "ka" = ( /obj/machinery/seed_extractor, @@ -192,13 +213,19 @@ /obj/effect/decal/cleanable/cobweb, /obj/item/storage/bag/trash, /obj/structure/closet/crate/bin, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "kL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "la" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -223,7 +250,10 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "mr" = ( /obj/effect/turf_decal/siding/wood{ @@ -232,7 +262,10 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "mM" = ( /obj/structure/ore_box, @@ -297,6 +330,7 @@ /obj/structure/closet/crate, /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, /turf/open/floor/wood/parquet, /area/ruin/comms_agent) "rh" = ( @@ -361,7 +395,10 @@ pixel_x = 6; pixel_y = 4 }, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "ud" = ( /obj/effect/decal/cleanable/dirt, @@ -386,11 +423,17 @@ }, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/tank_holder/extinguisher, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "up" = ( /obj/effect/decal/cleanable/food/flour, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "uY" = ( /obj/effect/mapping_helpers/broken_floor, @@ -410,7 +453,10 @@ "vK" = ( /obj/effect/turf_decal/siding/wideplating/light, /obj/machinery/computer/arcade/orion_trail, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "vV" = ( /obj/structure/toilet{ @@ -445,7 +491,11 @@ "xq" = ( /obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom{ - pixel_x = 31 + pixel_x = 31; + syndie = 1; + freerange = 1; + name = "syndicate radio intercom"; + desc = "A custom-made Syndicate-issue intercom used to transmit on all Nanotrasen frequencies. Particularly expensive." }, /obj/structure/table/reinforced, /obj/machinery/fax{ @@ -504,7 +554,10 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "zJ" = ( /obj/machinery/biogenerator, @@ -518,7 +571,14 @@ /obj/machinery/coffeemaker/impressa{ pixel_y = 4 }, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, +/area/ruin/comms_agent) +"Bx" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/closed/wall, /area/ruin/comms_agent) "BD" = ( /obj/effect/turf_decal/siding/wood/corner{ @@ -542,12 +602,16 @@ /obj/item/reagent_containers/condiment/milk, /obj/item/reagent_containers/condiment/flour, /obj/structure/closet/secure_closet/freezer/empty, +/obj/item/storage/box/donkpockets, +/obj/item/coffee_cartridge, +/obj/item/coffee_cartridge/decaf, +/obj/item/coffee_cartridge/fancy, /turf/open/floor/iron/white, /area/ruin/comms_agent) "CL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible/layer2, -/obj/structure/closet/emcloset, +/obj/machinery/power/smes/super/full, /turf/open/floor/plating, /area/ruin/comms_agent/maint) "CS" = ( @@ -563,6 +627,7 @@ /area/ruin/comms_agent/maint) "CW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/closet/emcloset, /turf/open/floor/plating, /area/ruin/comms_agent/maint) "DH" = ( @@ -604,7 +669,10 @@ "FZ" = ( /obj/effect/baseturf_helper/reinforced_plating/ceiling, /obj/structure/cable, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "Gp" = ( /obj/structure/fluff/empty_sleeper/syndicate{ @@ -619,7 +687,10 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "GI" = ( /obj/structure/closet/crate/hydroponics, @@ -680,7 +751,11 @@ pixel_x = -13; pixel_y = 4 }, -/turf/open/floor/wood, +/obj/item/storage/box/coffeepack, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "JD" = ( /obj/structure/closet/cabinet, @@ -694,6 +769,7 @@ /obj/item/toy/plush/nukeplushie, /obj/item/ammo_box/magazine/m9mm, /obj/item/ammo_box/magazine/m9mm, +/obj/item/clothing/head/costume/ushanka, /turf/open/floor/wood/tile, /area/ruin/comms_agent) "JY" = ( @@ -706,11 +782,11 @@ /obj/machinery/atmospherics/components/trinary/filter/layer2{ dir = 8 }, +/obj/structure/cable, /obj/machinery/power/terminal{ dir = 4 }, -/obj/structure/cable, -/obj/machinery/power/smes/super/full, +/obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plating, /area/ruin/comms_agent/maint) "KB" = ( @@ -728,6 +804,10 @@ "KQ" = ( /turf/open/genturf, /area/template_noop) +"KR" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/closed/wall, +/area/ruin/comms_agent/maint) "Lh" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -769,7 +849,7 @@ /area/ruin/comms_agent) "Lz" = ( /turf/open/floor/wood{ - initial_gas_mix = "o2=22;n2=82;TEMP=180"; + initial_gas_mix = "ICEMOON_ATMOS"; name = "bridge" }, /area/icemoon/underground/explored) @@ -814,7 +894,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "MH" = ( /turf/closed/mineral/snowmountain/icemoon, @@ -895,11 +978,11 @@ "Qn" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/effect/mapping_helpers/apc/syndicate_access, -/obj/machinery/power/terminal{ - dir = 4 - }, /obj/structure/cable, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "Qx" = ( /obj/structure/cable, @@ -916,7 +999,10 @@ /obj/item/pipe/trinary/flippable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "QT" = ( /obj/structure/table, @@ -925,7 +1011,10 @@ pixel_y = 4 }, /obj/item/crowbar/red, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "QU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1068,7 +1157,10 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS"; + name = "bridge" + }, /area/ruin/comms_agent) "ZE" = ( /obj/structure/sink/directional/east, @@ -2361,8 +2453,8 @@ xD ij hW Ac -WR -YI +Bx +KR YI YI LP diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm index ef32d3e8ed9c6..71c7495ae2218 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm @@ -1,104 +1,83 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aK" = ( -/obj/structure/rack, -/obj/effect/spawner/random/entertainment/cigarette_pack, -/obj/effect/spawner/random/entertainment/cigarette_pack, -/obj/effect/spawner/random/entertainment/cigarette_pack, -/obj/effect/spawner/random/entertainment/lighter, -/obj/effect/spawner/random/entertainment/lighter, -/obj/effect/spawner/random/entertainment/lighter, -/obj/machinery/light/directional/south, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"bT" = ( -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"ck" = ( -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"dm" = ( -/obj/machinery/door/airlock/engineering, -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"fy" = ( -/obj/machinery/light/directional/south, /obj/structure/table/reinforced, -/obj/item/stack/sheet/mineral/plasma/thirty, -/obj/item/stack/sheet/mineral/plasma/five, -/obj/item/stack/sheet/mineral/plasma/five, -/obj/item/stack/sheet/mineral/plasma/five, -/obj/item/stack/sheet/mineral/plasma/five, -/obj/machinery/light/directional/north, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"fF" = ( -/obj/effect/turf_decal/arrows{ - dir = 8 +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"fH" = ( -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"fX" = ( -/obj/structure/sink/directional/east{ - has_water_reclaimer = 0 +/area/ruin/thelizardsgas_lavaland) +"aW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/obj/structure/railing{ + dir = 4 }, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"go" = ( -/obj/machinery/power/terminal{ +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/obj/effect/turf_decal/stripes/end{ dir = 1 }, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"ia" = ( -/obj/effect/spawner/random/structure/billboard/lizardsgas, -/obj/effect/turf_decal/arrows{ - dir = 4 +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/lavaland_atmos{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"iK" = ( -/obj/structure/cable, -/obj/machinery/power/rtg/advanced, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"jY" = ( +/area/ruin/thelizardsgas_lavaland) +"bT" = ( /obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/rack, -/obj/item/reagent_containers/condiment/yoghurt{ - pixel_x = -3; - pixel_y = 1 +/obj/item/food/popsicle/creamsicle_berry{ + pixel_y = 4; + pixel_x = -1 }, -/obj/item/reagent_containers/condiment/yoghurt{ - pixel_x = 6; - pixel_y = -1 +/obj/item/food/popsicle/creamsicle_berry{ + pixel_y = 1; + pixel_x = 5 }, -/turf/open/floor/iron/freezer, -/area/ruin/lizard_gaslava) -"ks" = ( -/obj/structure/sign/warning/fire/directional/north, +/obj/item/food/popsicle/creamsicle_orange, +/obj/item/food/popsicle/creamsicle_orange{ + pixel_y = 6; + pixel_x = 3 + }, +/obj/structure/closet/crate/freezer, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/turf/open/floor/iron/freezer{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"cc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/obj/structure/sign/warning/no_smoking/directional/east, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"ck" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, +/mob/living/basic/lizard{ + name = "Zarpo"; + desc = "This little guy is a survivor, that's for sure." + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"dm" = ( +/obj/structure/cable, /obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/light/small/dim/directional/north, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"mn" = ( -/obj/structure/reagent_dispensers/plumbed/fuel, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"mz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"dC" = ( +/obj/structure/sign/warning/fire/directional/north, +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input{ + dir = 4; + chamber_id = "lizardgaslava" + }, +/turf/open/floor/engine/plasma{ + initial_gas_mix = "plasma=30000;TEMP=293.15" + }, +/area/ruin/thelizardsgas_lavaland) +"dI" = ( /obj/structure/rack, /obj/item/food/candy, /obj/item/food/candy, @@ -110,69 +89,82 @@ /obj/item/food/chocolatebar{ pixel_y = 6 }, -/obj/structure/sign/poster/contraband/hacking_guide/directional/north, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"mG" = ( -/obj/effect/turf_decal/arrows{ - dir = 4 +/obj/structure/sign/poster/contraband/space_cola/directional/north, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"mY" = ( -/obj/effect/spawner/random/structure/billboard/lizardsgas, -/obj/effect/turf_decal/arrows{ +/area/ruin/thelizardsgas_lavaland) +"dT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/obj/structure/railing{ dir = 8 }, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"nc" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/turf/open/floor/plating/lavaland_atmos{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"fj" = ( +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"fl" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"ng" = ( -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating, -/area/ruin/lizard_gaslava) -"om" = ( +/obj/structure/cable, +/obj/structure/sign/poster/contraband/starkist/directional/north, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"fy" = ( /obj/effect/turf_decal/arrows{ dir = 1 }, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"pp" = ( -/obj/structure/sign/poster/contraband/jumbo_bar/directional/east, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"pJ" = ( -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"rM" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/rack, -/obj/item/food/cheese/mozzarella{ - pixel_y = 5; - pixel_x = -5 +/turf/open/floor/asphalt/lavaland, +/area/lavaland/surface/outdoors) +"fF" = ( +/obj/machinery/portable_atmospherics/canister, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"fH" = ( +/obj/machinery/duct, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"fO" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output{ + dir = 8; + chamber_id = "lizardgaslava" }, -/obj/item/food/cheese/mozzarella{ - pixel_y = -4; - pixel_x = 1 +/turf/open/floor/engine/plasma{ + initial_gas_mix = "plasma=30000;TEMP=293.15" }, -/obj/item/food/cheese/wheel, -/obj/item/food/cheese/cheese_curds, -/obj/item/food/cheese/curd_cheese, -/turf/open/floor/iron/freezer, -/area/ruin/lizard_gaslava) -"sY" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/open/floor/plating, -/area/ruin/lizard_gaslava) -"tD" = ( +/area/ruin/thelizardsgas_lavaland) +"fX" = ( +/obj/structure/sink/gasstation{ + dir = 4; + pixel_x = -14 + }, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"fZ" = ( +/obj/structure/cable, +/obj/structure/sign/poster/contraband/robust_softdrinks/directional/east, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"go" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"ia" = ( /obj/structure/rack, /obj/item/food/chips{ pixel_x = 7 @@ -189,192 +181,252 @@ pixel_y = -4; pixel_x = -5 }, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"ub" = ( -/obj/structure/railing{ - dir = 9 +/obj/machinery/light/directional/north, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"uV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/area/ruin/thelizardsgas_lavaland) +"iK" = ( +/obj/structure/cable, +/obj/machinery/power/rtg/advanced, +/obj/effect/turf_decal/bot, +/obj/structure/sign/warning/electric_shock/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"vt" = ( -/obj/machinery/duct, -/obj/machinery/atmospherics/components/tank/oxygen{ - dir = 4 +/area/ruin/thelizardsgas_lavaland) +"iN" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/machinery/computer/atmos_control/noreconnect{ + atmos_chambers = list("lizardgaslava"="Plasma Supply"); + dir = 4; + name = "gas tank monitor"; + desc = "This computer connects to and controls the sensors and equipment in a nearby pressurised gas reservoir." }, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"vH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/obj/machinery/light/small/dim/directional/south, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"wl" = ( -/obj/structure/sink/directional/west{ - has_water_reclaimer = 0 +/area/ruin/thelizardsgas_lavaland) +"iP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8 }, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"xH" = ( -/obj/machinery/light/directional/south, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"xW" = ( -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"yH" = ( +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"iT" = ( /obj/structure/rack, -/obj/item/food/sticko/nutty{ - pixel_y = 5; - pixel_x = -5 +/obj/item/food/cornchips/random, +/obj/item/food/cornchips/random, +/obj/item/food/cornchips/random, +/obj/item/food/cornchips/random, +/obj/item/food/cornchips/random, +/obj/item/food/cornchips/random, +/obj/structure/sign/poster/contraband/eat/directional/north, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/obj/item/food/sticko{ - pixel_y = 2; - pixel_x = 6 +/area/ruin/thelizardsgas_lavaland) +"jY" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/item/storage/cans/sixbeer, +/obj/item/storage/cans/sixsoda, +/obj/structure/closet/crate/freezer, +/turf/open/floor/iron/freezer{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"Ag" = ( -/obj/structure/table, -/obj/item/coffee_cartridge, -/obj/item/coffee_cartridge, -/obj/effect/mapping_helpers/apc/cell_10k, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"Ao" = ( -/obj/structure/sign/poster/contraband/tipper_cream_soda/directional/south, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"Bf" = ( -/mob/living/basic/lizard, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 +/area/ruin/thelizardsgas_lavaland) +"ks" = ( +/obj/structure/sign/warning/fire/directional/north, +/obj/structure/reagent_dispensers/fueltank/large{ + anchored = 1; + can_be_unanchored = 1 }, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"BH" = ( -/obj/structure/table/reinforced, -/obj/item/food/hotdog{ - pixel_y = 4; - pixel_x = -2 +/obj/structure/railing{ + dir = 8 }, -/obj/item/food/hotdog{ - pixel_y = -3; - pixel_x = 1 +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"lI" = ( +/obj/effect/spawner/random/structure/billboard/roadsigns, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mn" = ( +/obj/structure/sign/poster/official/plasma_effects/directional/east, +/obj/structure/reagent_dispensers/plumbed/storage{ + dir = 8; + reagent_id = /datum/reagent/toxin/plasma; + name = "plasma storage tank"; + tank_volume = 2500 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"BX" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"DI" = ( -/turf/template_noop, -/area/template_noop) -"Ef" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"Eh" = ( +/area/ruin/thelizardsgas_lavaland) +"mz" = ( /obj/structure/table/reinforced, -/obj/item/food/honeybar{ - pixel_y = 5; - pixel_x = -1 +/obj/structure/closet/mini_fridge{ + pixel_y = 5 }, -/obj/item/food/honeybar{ - pixel_x = 2; - pixel_y = 2 +/obj/effect/spawner/random/food_or_drink/refreshing_beverage, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/obj/item/food/honeybar{ - pixel_y = 8; - pixel_x = -1 +/area/ruin/thelizardsgas_lavaland) +"mG" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/obj/structure/noticeboard/directional/north, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/obj/item/food/honeybar{ - pixel_x = 2; - pixel_y = 5 +/area/ruin/thelizardsgas_lavaland) +"mJ" = ( +/obj/structure/chair/sofa/left/maroon{ + dir = 4 }, -/obj/item/food/granola_bar{ - pixel_y = 9; - pixel_x = -1 +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/obj/item/food/granola_bar{ - pixel_y = 6; - pixel_x = 2 +/area/ruin/thelizardsgas_lavaland) +"mY" = ( +/obj/structure/chair/sofa/right/maroon{ + dir = 4 }, +/obj/structure/cable, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"El" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/rack, -/obj/item/food/popsicle/creamsicle_berry{ - pixel_y = 4; - pixel_x = -1 +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/obj/item/food/popsicle/creamsicle_berry{ - pixel_y = 1; - pixel_x = 5 +/area/ruin/thelizardsgas_lavaland) +"nc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/obj/structure/sign/poster/fluff/lizards_gas_payment/directional/west, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/obj/item/food/popsicle/creamsicle_orange, -/obj/item/food/popsicle/creamsicle_orange{ - pixel_y = 6; - pixel_x = 3 +/area/ruin/thelizardsgas_lavaland) +"ng" = ( +/obj/structure/cable, +/obj/structure/railing{ + dir = 8 }, -/turf/open/floor/iron/freezer, -/area/ruin/lizard_gaslava) -"Es" = ( -/obj/structure/sign/warning/fire/directional/south, +/obj/effect/turf_decal/stripes/end, +/turf/open/floor/plating/lavaland_atmos{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"nX" = ( +/obj/structure/sign/poster/contraband/tipper_cream_soda/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"om" = ( +/turf/open/floor/asphalt/lavaland, +/area/lavaland/surface/outdoors) +"ou" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"oD" = ( +/obj/effect/spawner/random/trash/crushed_can, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"pp" = ( +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"pJ" = ( +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"qk" = ( +/obj/structure/cable, +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/structure/sign/poster/fluff/lizards_gas_power/directional/north, /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"EA" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/rack, -/obj/item/storage/fancy/egg_box, -/obj/item/storage/fancy/egg_box{ - pixel_y = 9 +/area/ruin/thelizardsgas_lavaland) +"qO" = ( +/obj/structure/sign/warning/fire/directional/south, +/obj/structure/reagent_dispensers/fueltank/large{ + anchored = 1; + can_be_unanchored = 1 }, -/obj/item/storage/fancy/pickles_jar, -/turf/open/floor/iron/freezer, -/area/ruin/lizard_gaslava) -"FA" = ( /obj/structure/railing{ dir = 8 }, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"FC" = ( -/obj/structure/sign/poster/fluff/lizards_gas_power/directional/west, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"FL" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"rr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"rv" = ( +/obj/structure/sign/warning/fire/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output{ + dir = 8; + chamber_id = "lizardgaslava" + }, +/turf/open/floor/engine/plasma{ + initial_gas_mix = "plasma=30000;TEMP=293.15" + }, +/area/ruin/thelizardsgas_lavaland) +"rM" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"Gv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"rW" = ( +/obj/machinery/portable_atmospherics/canister/plasma{ + filled = 0.05 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"sY" = ( /obj/structure/table/reinforced, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/east, /obj/item/food/sandwich/blt{ pixel_y = 6; pixel_x = -2 @@ -382,805 +434,813 @@ /obj/item/food/little_shiro_sandwich{ pixel_y = 1 }, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"GK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"tk" = ( +/obj/structure/chair/stool/bar/directional/east, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"tD" = ( +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/obj/machinery/door/airlock/grunge, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"ub" = ( /obj/structure/railing{ - dir = 10 + dir = 9 }, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"HI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/obj/structure/girder/reinforced, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"uV" = ( /obj/structure/table/reinforced, -/obj/structure/closet/mini_fridge{ +/obj/item/food/honeybar{ + pixel_y = 5; + pixel_x = -1 + }, +/obj/item/food/honeybar{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/food/honeybar{ + pixel_y = 8; + pixel_x = -1 + }, +/obj/item/food/honeybar{ + pixel_x = 2; pixel_y = 5 }, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage, -/obj/effect/spawner/random/food_or_drink/booze, -/obj/effect/spawner/random/food_or_drink/booze, -/obj/effect/spawner/random/food_or_drink/booze, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"HL" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"HS" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/rack, -/obj/item/food/cornuto{ - pixel_y = 4; - pixel_x = -3 +/obj/item/food/granola_bar{ + pixel_y = 9; + pixel_x = -1 }, -/obj/item/food/cornuto{ - pixel_y = -5; +/obj/item/food/granola_bar{ + pixel_y = 6; pixel_x = 2 }, -/obj/item/food/cornuto{ - pixel_y = 5; - pixel_x = 6 +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/obj/item/food/cornuto{ - pixel_y = -5; - pixel_x = -3 +/area/ruin/thelizardsgas_lavaland) +"vb" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/item/storage/fancy/egg_box, +/obj/item/storage/fancy/egg_box{ + pixel_y = 9 }, -/turf/open/floor/iron/freezer, -/area/ruin/lizard_gaslava) -"HW" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/ruin/lizard_gaslava) -"IU" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"JX" = ( +/obj/item/storage/fancy/pickles_jar, +/obj/structure/closet/crate/freezer, +/turf/open/floor/iron/freezer{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"vi" = ( +/obj/structure/cable, /obj/structure/railing, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"Kl" = ( -/obj/structure/rack, -/obj/item/food/cornchips/random, -/obj/item/food/cornchips/random, -/obj/item/food/cornchips/random, -/obj/item/food/cornchips/random, -/obj/item/food/cornchips/random, -/obj/item/food/cornchips/random, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"Km" = ( -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"KJ" = ( -/obj/structure/railing{ +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"Mv" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/sign/poster/fluff/lizards_gas_payment/directional/west, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"Nr" = ( -/obj/structure/window/plasma/spawner/directional/west, -/obj/structure/window/spawner/directional/east, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/ruin/lizard_gaslava) -"Ov" = ( -/obj/structure/table, -/obj/machinery/coffeemaker{ - pixel_y = 5 +/turf/open/floor/plating/lavaland_atmos{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"PS" = ( -/obj/effect/turf_decal/bot, +/area/ruin/thelizardsgas_lavaland) +"vt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, /obj/structure/cable, -/obj/machinery/power/rtg/advanced, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"Qb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"Qt" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"Rq" = ( -/obj/machinery/computer/security/telescreen/bar{ - pixel_y = -32 +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"vH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"wl" = ( +/obj/structure/sink/gasstation{ + dir = 8; + pixel_x = 14 + }, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"wY" = ( +/obj/structure/table, +/obj/structure/sign/poster/official/festive/directional/south, +/obj/item/wrench, +/obj/item/universal_scanner{ + pixel_y = 6; + pixel_x = 7 }, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"RA" = ( -/turf/closed/wall, -/area/ruin/lizard_gaslava) -"RK" = ( -/obj/machinery/light/directional/east, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"SL" = ( -/obj/machinery/duct, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"SZ" = ( -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"TA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"Uk" = ( +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"xw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"xH" = ( +/obj/machinery/door/window/right/directional/east, +/obj/machinery/door/window/left/directional/west, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"xW" = ( +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"yH" = ( +/obj/structure/cable, /obj/machinery/duct, -/obj/machinery/light/directional/north, -/turf/open/misc/ashplanet/rocky, -/area/ruin/lizard_gaslava) -"UK" = ( +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"zr" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/item/reagent_containers/condiment/yoghurt{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/reagent_containers/condiment/yoghurt{ + pixel_x = 6; + pixel_y = -1 + }, +/obj/structure/closet/crate/freezer, +/turf/open/floor/iron/freezer{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Ag" = ( +/obj/structure/table, +/obj/item/coffee_cartridge, +/obj/item/coffee_cartridge, +/obj/effect/mapping_helpers/apc/cell_10k, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/obj/machinery/power/smes/engineering, -/turf/open/floor/iron/smooth, -/area/ruin/lizard_gaslava) -"VD" = ( -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"Wa" = ( -/obj/structure/rack, -/obj/item/reagent_containers/condiment/vegetable_oil{ - pixel_y = 5; - pixel_x = -1 +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/obj/item/reagent_containers/condiment/vegetable_oil{ - pixel_y = 1; - pixel_x = 3 +/area/ruin/thelizardsgas_lavaland) +"Ao" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Bf" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, -/obj/item/reagent_containers/condiment/olive_oil, -/turf/open/floor/iron, -/area/ruin/lizard_gaslava) -"Xe" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/east, +/area/ruin/thelizardsgas_lavaland) +"Bp" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/duct, +/turf/open/floor/plating/lavaland_baseturf, +/area/ruin/thelizardsgas_lavaland) +"Bz" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/item/food/cheese/mozzarella{ + pixel_y = 5; + pixel_x = -5 + }, +/obj/item/food/cheese/mozzarella{ + pixel_y = -4; + pixel_x = 1 + }, +/obj/item/food/cheese/wheel, +/obj/item/food/cheese/cheese_curds, +/obj/item/food/cheese/curd_cheese, +/obj/structure/closet/crate/freezer, +/turf/open/floor/iron/freezer{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"BH" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"BU" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input{ + dir = 4; + chamber_id = "lizardgaslava" + }, +/turf/open/floor/engine/plasma{ + initial_gas_mix = "plasma=30000;TEMP=293.15" + }, +/area/ruin/thelizardsgas_lavaland) +"BX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/directional/south, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Cs" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/plating/lavaland_baseturf, +/area/ruin/thelizardsgas_lavaland) +"Cx" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"CJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/lavaland_atmos{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"CR" = ( +/obj/structure/cable, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, +/obj/machinery/door/airlock/maintenance_hatch, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Dw" = ( +/obj/structure/cable, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"DI" = ( +/turf/template_noop, +/area/template_noop) +"Ef" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/cable, +/turf/open/floor/plating/lavaland_atmos{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Eh" = ( +/obj/machinery/atmospherics/components/tank/oxygen{ + dir = 8 + }, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"El" = ( +/obj/structure/sign/poster/official/pda_ad/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Es" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "lizardgas_lavaland_entrance" + }, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"EA" = ( +/turf/closed/wall/r_wall, +/area/ruin/thelizardsgas_lavaland) +"FA" = ( +/turf/closed/wall/r_wall{ + baseturfs = /turf/open/floor/plating/lavaland_baseturf + }, +/area/ruin/thelizardsgas_lavaland) +"FC" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/thelizardsgas_lavaland) +"FL" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/lavaland_atmos{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Gg" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Gu" = ( +/obj/effect/spawner/random/structure/billboard/lizardsgas, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Gv" = ( +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"GK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Hz" = ( +/obj/structure/cable, +/obj/structure/railing, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/lavaland_atmos{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"HB" = ( +/obj/effect/spawner/random/trash/cigbutt, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"HI" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/machinery/duct, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"HL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"HS" = ( /obj/structure/rack, -/obj/item/storage/cans/sixbeer, -/obj/item/storage/cans/sixsoda, -/turf/open/floor/iron/freezer, -/area/ruin/lizard_gaslava) -"Zf" = ( -/obj/machinery/door/airlock/glass, +/obj/item/reagent_containers/condiment/vegetable_oil{ + pixel_y = 5; + pixel_x = -1 + }, +/obj/item/reagent_containers/condiment/vegetable_oil{ + pixel_y = 1; + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/olive_oil, +/obj/structure/cable, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"HW" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "lizardgas_lavaland_entrance" + }, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"IC" = ( +/obj/structure/cable, +/obj/structure/railing, +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/turf/open/floor/plating/lavaland_atmos{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"IU" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"JB" = ( +/obj/machinery/air_sensor{ + chamber_id = "lizardgaslava" + }, +/turf/open/floor/engine/plasma{ + initial_gas_mix = "plasma=30000;TEMP=293.15" + }, +/area/ruin/thelizardsgas_lavaland) +"JK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output{ + dir = 8; + chamber_id = "lizardgaslava" + }, +/obj/item/toy/plush/lizard_plushie/space/green{ + desc = "A famous lizard, in plushy form."; + name = "Bingo" + }, +/turf/open/floor/engine/plasma{ + initial_gas_mix = "plasma=30000;TEMP=293.15" + }, +/area/ruin/thelizardsgas_lavaland) +"JX" = ( +/obj/machinery/duct, +/obj/machinery/light/directional/north, +/obj/structure/sign/warning/chem_diamond/directional/north, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"Kb" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Kc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Kl" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Km" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"KJ" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"Lh" = ( +/obj/structure/cable, +/obj/structure/sign/poster/official/fruit_bowl/directional/east, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Mv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/rack, +/obj/effect/spawner/random/entertainment/cigarette_pack, +/obj/effect/spawner/random/entertainment/cigarette_pack, +/obj/effect/spawner/random/entertainment/cigarette_pack, +/obj/effect/spawner/random/entertainment/lighter, +/obj/effect/spawner/random/entertainment/lighter, +/obj/effect/spawner/random/entertainment/lighter, +/obj/structure/sign/poster/contraband/smoke/directional/west, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"MX" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, /turf/open/floor/iron, -/area/ruin/lizard_gaslava) - -(1,1,1) = {" -DI -DI -DI -fF -fF -mY -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -ia -mG -mG -DI -DI -"} -(2,1,1) = {" -DI -DI -DI -fH -fH -fH -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -fH -fH -fH -DI -DI -"} -(3,1,1) = {" -DI -DI -DI -fH -fH -fH -DI -DI -ub -FA -FA -FA -FA -FA -FA -FA -FA -GK -DI -DI -fH -fH -fH -DI -DI -"} -(4,1,1) = {" -DI -DI -DI -fH -fH -fH -DI -DI -KJ -fH -SL -SL -SL -SL -SL -SL -SL -JX -DI -DI -fH -fH -fH -DI -DI -"} -(5,1,1) = {" -DI -DI -DI -fH -fH -fH -om -fH -fH -fH -wl -fH -wl -wl -fH -wl -SL -fH -fH -om -fH -fH -fH -DI -DI -"} -(6,1,1) = {" -DI -DI -DI -fH -fH -fH -om -fH -fH -xH -RA -fy -RA -RA -fy -RA -Uk -fH -fH -om -fH -fH -fH -DI -DI -"} -(7,1,1) = {" -DI -DI -DI -fH -fH -fH -om -fH -fH -fH -fX -fH -fX -fX -fH -fX -SL -fH -fH -om -fH -fH -fH -DI -DI -"} -(8,1,1) = {" -DI -DI -DI -DI -DI -DI -DI -DI -fH -fH -SL -SL -SL -SL -SL -SL -SL -fH -DI -DI -DI -DI -DI -DI -DI -"} -(9,1,1) = {" -DI -DI -DI -DI -DI -DI -DI -DI -RK -fH -fH -fH -fH -fH -fH -SL -fH -RK -DI -DI -DI -DI -DI -DI -DI -"} -(10,1,1) = {" -DI -DI -DI -DI -DI -DI -DI -DI -RA -Nr -Nr -Nr -RA -RA -RA -HW -ng -RA -DI -DI -DI -DI -DI -DI -DI -"} -(11,1,1) = {" -DI -DI -DI -DI -DI -DI -DI -DI -RA -Kl -xW -HI -Mv -aK -RA -ks -Es -RA -DI -DI -DI -DI -DI -DI -DI -"} -(12,1,1) = {" -DI -DI -DI -RA -RA -RA -RA -RA -RA -tD -VD -Gv -Bf -Rq -RA -nc -vH -RA -DI -DI -DI -DI -DI -DI -DI -"} -(13,1,1) = {" -DI -DI -DI -RA -Ov -FC -mn -vt -RA -mz -Qt -Km -bT -Zf -RA -sY -ng -RA -DI -DI -DI -DI -DI -DI -DI -"} -(14,1,1) = {" -DI -DI -DI -RA -Ag -pJ -TA -ck -dm -SZ -SZ -HL -SZ -HL -SZ -SZ -IU -RA -DI -DI -DI -DI -DI -DI -DI -"} -(15,1,1) = {" -DI -DI -DI -RA -UK -go -iK -PS -RA -Qt -Qb -xW -xW -jY -El -HS -uV -RA -DI -DI -DI -DI -DI -DI -DI -"} -(16,1,1) = {" -DI -DI -DI -RA -RA -RA -RA -RA -RA -xW -BH -yH -Qt -xW -VD -Qt -Ao -RA -DI -DI -DI -DI -DI -DI -DI -"} -(17,1,1) = {" -DI -DI -DI -DI -DI -DI -DI -DI -RA -xW -Ef -xW -xW -rM -EA -Xe -xW -RA -DI -DI -DI -DI -DI -DI -DI -"} -(18,1,1) = {" -DI -DI -DI -DI -DI -DI -DI -DI -RA -FL -Wa -Eh -xW -Qt -pp -xW -BX -RA -DI -DI -DI -DI -DI -DI -DI -"} -(19,1,1) = {" -DI -DI -DI -DI -DI -DI -DI -DI -RA -RA -RA -RA -RA -RA -RA -RA -RA -RA -DI -DI -DI -DI -DI -DI -DI -"} -(20,1,1) = {" -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -"} -(21,1,1) = {" -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -"} -(22,1,1) = {" -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -"} -(23,1,1) = {" -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI -DI +/area/ruin/thelizardsgas_lavaland) +"Nr" = ( +/obj/effect/spawner/random/trash/food_packaging, +/obj/structure/cable, +/obj/machinery/duct, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"NY" = ( +/obj/structure/closet/crate/preopen, +/obj/effect/spawner/random/trash/deluxe_garbage, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Om" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/obj/structure/girder/reinforced, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"Ov" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/item/food/hotdog{ + pixel_y = 4; + pixel_x = -2 + }, +/obj/item/food/hotdog{ + pixel_y = -3; + pixel_x = 1 + }, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"PS" = ( +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/obj/structure/bed/dogbed{ + name = "Zarpo's bed"; + desc = "A comfy-looking lizard bed. Looks a lot like a dog bed." + }, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Qb" = ( +/obj/structure/cable, +/obj/structure/sign/poster/contraband/moffuchis_pizza/directional/north, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Qt" = ( +/obj/structure/sign/poster/contraband/jumbo_bar/directional/east, +/obj/structure/cable, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Rq" = ( +/obj/machinery/light/directional/south, +/obj/structure/sign/warning/chem_diamond/directional/south, +/obj/machinery/duct, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"Ry" = ( +/obj/structure/rack, +/obj/item/food/sticko/nutty{ + pixel_y = 5; + pixel_x = -5 + }, +/obj/item/food/sticko{ + pixel_y = 2; + pixel_x = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"RA" = ( +/turf/closed/wall{ + baseturfs = /turf/open/floor/plating/lavaland_baseturf + }, +/area/ruin/thelizardsgas_lavaland) +"RK" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/end, +/turf/open/floor/plating/lavaland_atmos{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"SL" = ( +/obj/structure/cable, +/obj/structure/railing, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/lavaland_atmos{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"SZ" = ( +/obj/structure/cable, +/obj/machinery/light/directional/north, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Ty" = ( +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"TA" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/spawner/random/trash/deluxe_garbage, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"TI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/obj/machinery/duct, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"Uk" = ( +/obj/machinery/duct, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"Ux" = ( +/obj/structure/table, +/obj/machinery/coffeemaker{ + pixel_y = 5 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"UK" = ( +/obj/structure/cable, +/obj/machinery/power/smes/full, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"UZ" = ( +/obj/structure/sign/warning/fire/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"VD" = ( +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"VQ" = ( +/obj/machinery/light/small/dim/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, +/turf/open/floor/iron/smooth{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Wa" = ( +/obj/machinery/duct, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/asphalt/lavaland, +/area/ruin/thelizardsgas_lavaland) +"WY" = ( +/turf/open/floor/engine/plasma{ + initial_gas_mix = "plasma=30000;TEMP=293.15" + }, +/area/ruin/thelizardsgas_lavaland) +"Xe" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/cable, +/obj/machinery/atmospherics/components/binary/pump/on/pink/visible{ + dir = 8; + target_pressure = 4100 + }, +/turf/open/floor/plating/lavaland_atmos{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Xo" = ( +/obj/structure/sign/warning/fire/directional/north, +/turf/template_noop, +/area/template_noop) +"XB" = ( +/obj/structure/sign/warning/fire/directional/north, +/obj/machinery/atmospherics/components/unary/passive_vent/layer4{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Yx" = ( +/obj/structure/cable, +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/lavaland_atmos{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) +"Zf" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/food/cornuto{ + pixel_y = 4; + pixel_x = -3 + }, +/obj/item/food/cornuto{ + pixel_y = -5; + pixel_x = 2 + }, +/obj/item/food/cornuto{ + pixel_y = 5; + pixel_x = 6 + }, +/obj/item/food/cornuto{ + pixel_y = -5; + pixel_x = -3 + }, +/obj/structure/closet/crate/freezer, +/turf/open/floor/iron/freezer{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) + +(1,1,1) = {" DI DI DI DI DI +ub +BH +BH +BH +BH +BH +BH +BH +BH +Om DI DI DI @@ -1188,57 +1248,371 @@ DI DI DI "} -(24,1,1) = {" +(2,1,1) = {" DI DI DI DI DI +KJ +fH +Wa +fH +Wa +Wa +fH +Wa +fH +Ty DI DI DI DI DI DI +"} +(3,1,1) = {" DI DI +om +fy +om +xw +fH +wl +fj +wl +wl +fj +wl +fH +xw +om +fy DI DI DI DI +"} +(4,1,1) = {" DI +om +om +fy +om +xw +Rq +FA +qO +FA +FA +ks +FA +JX +xw +om +fy +om DI DI DI +"} +(5,1,1) = {" DI DI +om +fy +om +xw +fH +fX +fj +fX +fX +fj +fX +fH +xw +om +fy +om +om DI DI "} -(25,1,1) = {" +(6,1,1) = {" DI DI +HB +Gu +Ao +xw +fH +Uk +fH +Uk +Uk +fH +Uk +fH +xw +oD +lI +Ao DI DI DI +"} +(7,1,1) = {" DI DI +Ao +Ao +Ao +xw +xw +TI +xw +xw +xw +cc +xw +xw +xw +GK +Ao +Ao DI DI DI +"} +(8,1,1) = {" DI DI +fF +Ao +HB +FA +Cs +Bp +Cs +FA +FA +FA +HW +HW +FA +UZ +Ao +Ao DI DI DI +"} +(9,1,1) = {" +FA +FA +FC +FC +FA +FA +iT +yH +mz +Mv +iN +RA +VQ +Kc +FA +dT +Yx +Yx +ng +EA +Xo +"} +(10,1,1) = {" +FA +Ux +mJ +mY +wY +RA +ia +Nr +Ov +tk +BX +RA +mG +rr +FA +Xe +Xe +Xe +Ef +IC DI +"} +(11,1,1) = {" +FA +Ag +pJ +ou +NY +RA +dI +HI +Km +aK +xH +RA +Es +HW +FA +rv +JK +fO +Ef +vi DI +"} +(12,1,1) = {" +FA +qk +Lh +go +vt +tD +VD +Gv +Bf +vH +Bf +nc +vH +Kl +FA +WY +JB +WY +Ef +vi DI +"} +(13,1,1) = {" +FA +RA +RA +RA +CR +RA +fl +zr +bT +Zf +xW +sY +Ry +El +FA +WY +WY +WY +Ef +SL DI +"} +(14,1,1) = {" +FA +UK +TA +ck +dm +RA +SZ +iP +IU +HL +xW +rM +IU +pp +FA +dC +BU +BU +Ef +SL DI +"} +(15,1,1) = {" +FA +iK +PS +Eh +mn +RA +Qb +Bz +vb +jY +xW +HS +uV +nX +FA +Xe +Xe +Xe +Ef +Hz DI +"} +(16,1,1) = {" +FA +FA +FA +FA +FA +FA +Cx +Dw +Qt +Dw +Cx +fZ +Dw +Gg +MX +aW +CJ +FL +RK +EA +Xo +"} +(17,1,1) = {" DI DI +Ao +fF +fF +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +XB +Kb +Ao +rW DI DI "} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_shuttle_wreckage.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_shuttle_wreckage.dmm new file mode 100644 index 0000000000000..3fb9b8725272c --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_shuttle_wreckage.dmm @@ -0,0 +1,880 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"bl" = ( +/obj/item/stack/sheet/iron/five, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"bw" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/mineral/titanium{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"cB" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/rubble, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"dI" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Emergency Shuttle Cockpit" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/titanium{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"dK" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/rubble, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"en" = ( +/obj/effect/mob_spawn/corpse/human/charredskeleton, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"eQ" = ( +/obj/item/shard/titanium, +/obj/effect/decal/cleanable/glass, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"fy" = ( +/obj/structure/door_assembly/door_assembly_shuttle, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"fz" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/ash, +/turf/open/floor/mineral/titanium/blue{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"gP" = ( +/turf/closed/mineral/titanium, +/area/ruin/unpowered) +"hT" = ( +/turf/closed/wall/mineral/titanium{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"hY" = ( +/obj/effect/mob_spawn/corpse/human/charredskeleton, +/turf/open/floor/mineral/titanium{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"ih" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"iU" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"ky" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"ld" = ( +/obj/item/stack/sheet/mineral/titanium/fifty{ + amount = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/mineral/titanium{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"lu" = ( +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered) +"mS" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/mineral/plastitanium/red{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"oE" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/ash, +/turf/open/floor/mineral/titanium/yellow{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"py" = ( +/obj/effect/decal/cleanable/ash, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"rn" = ( +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface) +"rr" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/glass, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"rE" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"se" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/ash, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"sE" = ( +/obj/item/shard/titanium, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"sZ" = ( +/turf/closed/mineral/random, +/area/ruin/unpowered) +"tp" = ( +/obj/item/stack/sheet/iron, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"tx" = ( +/obj/machinery/light/small/directional/east, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered) +"tD" = ( +/obj/item/stack/sheet/mineral/titanium/fifty{ + amount = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/ash, +/turf/open/floor/mineral/titanium{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"uh" = ( +/turf/closed/mineral/random, +/area/lavaland/surface) +"uH" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"vf" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/mineral/titanium/blue{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"xz" = ( +/obj/machinery/computer, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"yZ" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/ruin/unpowered) +"zk" = ( +/obj/effect/spawner/random/structure/crate, +/obj/effect/decal/cleanable/glass, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"Bb" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"BT" = ( +/obj/effect/mob_spawn/corpse/human/charredskeleton, +/turf/open/floor/mineral/plastitanium/red{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"Cg" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"CX" = ( +/obj/item/stack/sheet/mineral/titanium, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/mineral/titanium/yellow{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"Dq" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"Dy" = ( +/obj/item/shard/titanium, +/obj/machinery/light/small/directional/east, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"DL" = ( +/obj/item/stack/sheet/mineral/titanium/fifty{ + amount = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"DZ" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/mineral/titanium/yellow{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"Ee" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/item/stack/sheet/iron, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"Er" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/ash, +/turf/open/floor/mineral/titanium{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"Fq" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"FI" = ( +/obj/machinery/power/shuttle_engine/heater, +/turf/open/floor/plating/lavaland_atmos, +/area/ruin/unpowered) +"FL" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/surface) +"FR" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/mineral/titanium/yellow{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"FY" = ( +/obj/item/stack/sheet/iron/five, +/obj/item/stack/sheet/mineral/titanium/fifty{ + amount = 4 + }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/mineral/titanium{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"Ga" = ( +/obj/machinery/power/shuttle_engine/propulsion, +/turf/open/floor/plating/lavaland_atmos, +/area/ruin/unpowered) +"GF" = ( +/obj/structure/window/reinforced/shuttle/unanchored, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"GS" = ( +/obj/item/stack/sheet/iron/five, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"GZ" = ( +/turf/closed/mineral/titanium, +/area/lavaland/surface) +"Hy" = ( +/obj/machinery/computer/communications{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"HM" = ( +/obj/item/stack/sheet/mineral/titanium, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"JD" = ( +/mob/living/basic/mining/goliath, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"JN" = ( +/obj/item/shard/titanium, +/obj/item/stack/sheet/mineral/titanium, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"KN" = ( +/obj/structure/spawner/lavaland/legion, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"Lz" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"LQ" = ( +/mob/living/basic/mining/goldgrub, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"Ma" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"NI" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/blue{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"NS" = ( +/obj/item/stack/sheet/iron, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"Om" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/mineral/titanium{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"On" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/ash, +/turf/open/floor/mineral/titanium{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"OZ" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"Pa" = ( +/obj/structure/table, +/obj/item/storage/medkit/regular{ + pixel_x = 2; + pixel_y = 3 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"Qq" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/mineral/plastitanium/red{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"Rm" = ( +/obj/item/shard/titanium, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"St" = ( +/obj/structure/window/reinforced/shuttle, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"SV" = ( +/turf/template_noop, +/area/template_noop) +"Tq" = ( +/mob/living/basic/mining/goliath, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/mineral/titanium/blue{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"Tt" = ( +/obj/item/stack/sheet/iron, +/obj/effect/decal/cleanable/glass, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"TF" = ( +/obj/effect/decal/cleanable/rubble, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"TQ" = ( +/obj/item/stack/sheet/iron, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/mineral/plastitanium/red{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"Vs" = ( +/obj/item/stack/sheet/mineral/titanium, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"VN" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/mineral/titanium{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"XT" = ( +/obj/item/stack/sheet/mineral/titanium, +/obj/effect/decal/cleanable/glass, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"XU" = ( +/obj/item/stack/sheet/mineral/titanium/fifty{ + amount = 4 + }, +/turf/open/floor/mineral/titanium/yellow{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"XZ" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) +"Zo" = ( +/obj/effect/mob_spawn/corpse/human/legioninfested, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"Zq" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/ash, +/turf/open/floor/mineral/titanium/blue{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered) + +(1,1,1) = {" +SV +SV +SV +SV +SV +SV +SV +GZ +GZ +Fq +Fq +Fq +FL +FL +FL +FL +SV +SV +SV +SV +"} +(2,1,1) = {" +SV +SV +SV +SV +SV +FL +GZ +gP +yZ +fy +iU +fy +yZ +hT +XZ +yZ +FL +SV +SV +SV +"} +(3,1,1) = {" +SV +SV +uh +uh +yZ +hT +hT +hT +yZ +yZ +Rm +Rm +HM +hT +BT +mS +yZ +FL +SV +SV +"} +(4,1,1) = {" +SV +uh +sZ +hT +ky +HM +ih +sE +NI +vf +eQ +tp +lu +lu +lu +TQ +yZ +yZ +FL +SV +"} +(5,1,1) = {" +SV +FL +hT +yZ +yZ +yZ +py +Tq +lu +lu +fz +Zo +lu +hT +Qq +lu +zk +St +FL +FL +"} +(6,1,1) = {" +FL +FL +hT +yZ +yZ +uH +FY +lu +lu +Zq +DL +NS +lu +lu +lu +lu +Cg +St +FL +FL +"} +(7,1,1) = {" +FL +FL +yZ +yZ +ky +VN +lu +tx +lu +Vs +dK +Bb +tp +sE +Lz +eQ +py +St +FL +FL +"} +(8,1,1) = {" +Fq +Fq +yZ +yZ +cB +ld +lu +hT +lu +lu +Ma +KN +Dq +LQ +Lz +sE +CX +St +FL +FL +"} +(9,1,1) = {" +Fq +Fq +Lz +TF +bl +Er +hY +hT +lu +lu +lu +sE +tp +se +FR +HM +yZ +yZ +FL +FL +"} +(10,1,1) = {" +Fq +Fq +Cg +GF +xz +Lz +tD +dI +lu +lu +lu +Ma +HM +Pa +yZ +CX +yZ +yZ +uh +FL +"} +(11,1,1) = {" +Fq +GZ +gP +bw +Tt +JD +TF +hT +lu +lu +GS +TF +Lz +DZ +XU +FI +Ga +uh +uh +FL +"} +(12,1,1) = {" +SV +GZ +gP +gP +VN +Ee +Hy +eQ +rE +rr +Lz +OZ +en +oE +yZ +yZ +FL +uh +uh +SV +"} +(13,1,1) = {" +SV +GZ +gP +Lz +py +hT +hT +St +Rm +HM +Om +py +Om +FI +Ga +FL +FL +SV +SV +SV +"} +(14,1,1) = {" +SV +GZ +Fq +Lz +lu +lu +lu +Rm +JN +Dy +On +Om +GZ +FL +FL +SV +SV +SV +SV +SV +"} +(15,1,1) = {" +SV +FL +FL +Fq +rn +lu +lu +XT +yZ +St +St +gP +GZ +SV +SV +SV +SV +SV +SV +SV +"} +(16,1,1) = {" +SV +FL +FL +FL +FL +Lz +py +St +yZ +FL +GZ +GZ +SV +SV +SV +SV +SV +SV +SV +SV +"} +(17,1,1) = {" +SV +SV +FL +FL +FL +Fq +Fq +FL +FL +FL +SV +SV +SV +SV +SV +SV +SV +SV +SV +SV +"} +(18,1,1) = {" +SV +SV +FL +FL +FL +Fq +Fq +FL +FL +FL +SV +SV +SV +SV +SV +SV +SV +SV +SV +SV +"} +(19,1,1) = {" +SV +SV +SV +FL +FL +uh +uh +uh +FL +FL +SV +SV +SV +SV +SV +SV +SV +SV +SV +SV +"} +(20,1,1) = {" +SV +SV +SV +SV +SV +FL +uh +uh +FL +SV +SV +SV +SV +SV +SV +SV +SV +SV +SV +SV +"} diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm index 2c23219b7d382..6ee95f03755dd 100644 --- a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm @@ -42,7 +42,9 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/crusher) "am" = ( -/obj/machinery/recycler/deathtrap, +/obj/machinery/recycler/deathtrap{ + dir = 8 + }, /obj/machinery/conveyor{ dir = 4; id = "bunkerrecycle" diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index a7096750a1975..2451c55731215 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -3392,7 +3392,8 @@ /area/awaymission/cabin/caves) "wq" = ( /obj/machinery/recycler/lumbermill{ - desc = "Is better at killing people than cutting logs, for some reason." + desc = "Is better at killing people than cutting logs, for some reason."; + dir = 8 }, /obj/machinery/conveyor{ dir = 4; diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index dc7c06cc66964..9299d821e6fb7 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -52104,7 +52104,7 @@ name = "Permabrig Visitation" }, /obj/effect/mapping_helpers/airlock/access/any/security/brig, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/station/security/prison/visit) "pDt" = ( /obj/effect/landmark/start/hangover, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 4f2571c68dc4b..25448696a6025 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -62,13 +62,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"abA" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/piratepad/civilian, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "abI" = ( /obj/structure/chair/stool/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -412,17 +405,6 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/white, /area/station/security/prison/mess) -"ahv" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining{ - name = "Deliveries" - }, -/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/sorting) "ahD" = ( /obj/structure/displaycase/trophy, /turf/open/floor/wood, @@ -489,6 +471,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/office) +"ajv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "ajI" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -891,18 +885,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"arJ" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "asi" = ( /obj/structure/table/reinforced, /obj/item/storage/box/lights/mixed, @@ -1124,6 +1106,17 @@ /obj/item/pillow/random, /turf/open/floor/carpet, /area/station/commons/dorms) +"awf" = ( +/obj/effect/turf_decal/bot, +/obj/effect/spawner/random/structure/crate, +/obj/effect/turf_decal/arrows{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "awy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1490,12 +1483,6 @@ "aDb" = ( /turf/closed/wall, /area/station/construction/mining/aux_base) -"aDe" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "aDl" = ( /obj/effect/spawner/random/maintenance, /obj/structure/cable, @@ -1727,15 +1714,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"aHB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "aHH" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/effect/turf_decal/siding/purple{ @@ -1800,6 +1778,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"aIF" = ( +/obj/machinery/computer/cargo{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/button/door/directional/west{ + id = "QMLoaddoor"; + layer = 4; + name = "Loading Doors"; + pixel_y = -8; + req_access = list("cargo") + }, +/obj/machinery/button/door/directional/west{ + id = "QMLoaddoor2"; + layer = 4; + name = "Loading Doors"; + pixel_y = 8; + req_access = list("cargo") + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "aIO" = ( /obj/machinery/dna_scannernew, /obj/effect/turf_decal/siding/purple{ @@ -2345,21 +2344,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"aSd" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "aSe" = ( /obj/machinery/duct, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -2975,10 +2959,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"bbY" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "bcb" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, @@ -4346,20 +4326,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) -"bBa" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/machinery/status_display/evac/directional/west, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "bBo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/purple, @@ -4397,6 +4363,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) +"bBM" = ( +/obj/machinery/door/airlock/mining{ + name = "Quartermaster's Office" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/qm, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/diagonal_edge, +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/diagonal, +/area/station/command/heads_quarters/qm) "bCc" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -4455,39 +4434,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"bDd" = ( -/obj/machinery/camera/directional/north, -/obj/structure/chair/greyscale, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/cargo/lobby) -"bDj" = ( -/obj/machinery/computer/cargo{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/button/door/directional/west{ - id = "QMLoaddoor"; - layer = 4; - name = "Loading Doors"; - pixel_y = -8; - req_access = list("cargo") - }, -/obj/machinery/button/door/directional/west{ - id = "QMLoaddoor2"; - layer = 4; - name = "Loading Doors"; - pixel_y = 8; - req_access = list("cargo") - }, -/obj/item/reagent_containers/cup/soda_cans{ - pixel_x = -5; - pixel_y = 15 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "bDm" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/siding{ @@ -5748,6 +5694,13 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/science/ordnance/office) +"bZG" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "bZW" = ( /obj/structure/light_construct/directional/north, /turf/open/floor/plating, @@ -5808,6 +5761,21 @@ "cbz" = ( /turf/closed/wall, /area/station/cargo/storage) +"cbE" = ( +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/effect/turf_decal/tile/yellow/diagonal_edge, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/yellow/corner{ + dir = 8 + }, +/turf/open/floor/iron/diagonal, +/area/station/cargo/storage) "ccc" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -5816,6 +5784,12 @@ /obj/machinery/duct, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"ccq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "ccD" = ( /mob/living/carbon/human/species/monkey, /turf/open/floor/grass, @@ -5883,6 +5857,16 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron, /area/station/science/xenobiology) +"cew" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "cez" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -6399,6 +6383,17 @@ }, /turf/open/floor/iron/dark, /area/station/medical/break_room) +"cpS" = ( +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/obj/structure/window/spawner/directional/west, +/obj/machinery/light/small/directional/south, +/obj/structure/window/spawner/directional/east, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/station/cargo/sorting) "cpU" = ( /obj/structure/girder, /obj/effect/spawner/random/structure/grille, @@ -6693,6 +6688,18 @@ /obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"cuS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining{ + name = "Deliveries" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) "cuZ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -6987,6 +6994,15 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/wood, /area/station/service/library) +"cxI" = ( +/obj/structure/window/spawner/directional/south, +/obj/machinery/computer/cargo/request{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/cargo/sorting) "cxU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -7065,27 +7081,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/station/security/lockers) -"czD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"czF" = ( -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/tank_holder/extinguisher, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/qm) "czG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7487,6 +7482,26 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"cJr" = ( +/obj/structure/table, +/obj/item/clothing/gloves/cargo_gauntlet{ + pixel_y = 2 + }, +/obj/item/clothing/gloves/cargo_gauntlet{ + pixel_y = 5 + }, +/obj/item/clothing/gloves/cargo_gauntlet{ + pixel_y = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable, +/obj/item/reagent_containers/cup/soda_cans/random{ + pixel_x = -9 + }, +/turf/open/floor/catwalk_floor/iron, +/area/station/cargo/storage) "cJt" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -7699,13 +7714,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/service/hydroponics) -"cOi" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "cOj" = ( /obj/structure/sign/chalkboard_menu, /turf/closed/wall, @@ -7854,6 +7862,18 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"cRC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "cRU" = ( /obj/structure/bed, /obj/item/bedsheet/captain, @@ -7903,18 +7923,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"cSF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/newscaster/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "cSN" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8339,6 +8347,19 @@ /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"daZ" = ( +/obj/machinery/light/directional/west, +/obj/machinery/piratepad/civilian, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "dbh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8958,6 +8979,16 @@ /obj/structure/closet/emcloset/anchored, /turf/open/floor/plating, /area/station/maintenance/port) +"dlN" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "dme" = ( /obj/effect/turf_decal/arrows{ dir = 1 @@ -9239,7 +9270,7 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"drG" = ( +"drQ" = ( /obj/structure/window/spawner/directional/west, /obj/structure/window/spawner/directional/east, /obj/structure/disposaloutlet{ @@ -9248,6 +9279,7 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, +/obj/structure/plasticflaps, /turf/open/floor/plating, /area/station/cargo/sorting) "dsb" = ( @@ -9441,6 +9473,11 @@ }, /turf/open/floor/wood/parquet, /area/station/medical/psychology) +"dvC" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "dvJ" = ( /obj/structure/tank_dispenser, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -10398,6 +10435,14 @@ /obj/effect/spawner/random/engineering/tank, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"dPf" = ( +/obj/machinery/computer/cargo{ + dir = 4 + }, +/obj/structure/window/spawner/directional/west, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) "dPh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/corner, @@ -10781,16 +10826,6 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/engine, /area/station/science/xenobiology) -"dVy" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "dVN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11764,6 +11799,17 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/plating, /area/station/maintenance/disposal) +"eku" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/effect/landmark/start/quartermaster, +/obj/item/binoculars, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/qm) "eky" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -11781,6 +11827,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"ekF" = ( +/obj/machinery/mineral/ore_redemption{ + dir = 4; + input_dir = 8; + output_dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/east{ + name = "Ore Redemption Window" + }, +/obj/machinery/door/window/left/directional/west{ + req_access = list("cargo"); + name = "Cargo Security Window" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/lobby) "ekG" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -12201,13 +12265,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/wood, /area/station/service/library) -"erW" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "esd" = ( /obj/item/reagent_containers/cup/glass/drinkingglass{ pixel_x = 4; @@ -13047,26 +13104,6 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/white, /area/station/security/prison/mess) -"eJv" = ( -/obj/machinery/light_switch/directional/south, -/obj/machinery/conveyor_switch/oneway{ - id = "packageSort2"; - name = "Sort and Deliver"; - pixel_x = -2; - pixel_y = 12 - }, -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "packageExternal"; - name = "Crate Returns"; - pixel_x = -5; - pixel_y = -3 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "eJy" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -13264,11 +13301,6 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/grass, /area/station/science/research) -"eMY" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "eNb" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -13379,6 +13411,20 @@ }, /turf/open/floor/engine/co2, /area/station/engineering/atmos) +"ePd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "ePg" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13684,12 +13730,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) -"eVg" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, -/area/station/cargo/storage) "eVi" = ( /obj/structure/closet/firecloset, /turf/open/floor/iron/dark, @@ -13712,6 +13752,21 @@ }, /turf/open/floor/iron, /area/station/commons/locker) +"eVD" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Central Primary Hallway - Fore - Port Corner" + }, +/obj/machinery/computer/piratepad_control/civilian{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "eVX" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -14901,17 +14956,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) -"fov" = ( -/obj/machinery/light/directional/north, -/obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/delivery_chute{ - dir = 4; - name = "Crate Returns" - }, -/obj/structure/window/spawner/directional/south, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/cargo/lobby) "foB" = ( /obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/stripes/line{ @@ -15195,16 +15239,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"fuE" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/lobby) "fvE" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/medical/central) @@ -15532,6 +15566,23 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"fDN" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) +"fDR" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/mining{ + name = "Mining Office" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "fEg" = ( /obj/machinery/door/airlock{ name = "Service Hall" @@ -15814,11 +15865,32 @@ }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"fIl" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "fIo" = ( /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) +"fIr" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "fIE" = ( /obj/machinery/telecomms/server/presets/supply, /turf/open/floor/circuit/telecomms/mainframe, @@ -16174,20 +16246,6 @@ }, /turf/open/space/basic, /area/space) -"fQl" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/modular_computer/preset/cargochat/cargo{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/iron, -/area/station/cargo/sorting) "fQo" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/purple/corner{ @@ -16208,6 +16266,20 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"fQK" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/qm) "fQW" = ( /obj/machinery/door/airlock/mining/glass{ name = "Mining Dock" @@ -16721,14 +16793,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) -"gbn" = ( -/obj/effect/turf_decal/bot, -/obj/effect/spawner/random/structure/crate, -/obj/effect/turf_decal/arrows{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "gbG" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/item/storage/box/lights/mixed, @@ -16980,6 +17044,19 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) +"ggF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/mining{ + name = "Mining Office" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "ggH" = ( /obj/effect/spawner/random/structure/chair_maintenance, /turf/open/floor/iron/checker, @@ -17095,15 +17172,6 @@ }, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"gji" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "gjk" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -17126,6 +17194,13 @@ /obj/machinery/vending/wardrobe/jani_wardrobe, /turf/open/floor/iron, /area/station/service/janitor) +"gjK" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "gjZ" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -17638,6 +17713,12 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"gtF" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "gtR" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/green{ @@ -18134,15 +18215,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/station/commons/fitness/recreation) -"gCn" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "gCy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/window/reinforced/spawner/directional/east, @@ -18819,6 +18891,16 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"gNB" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin/tagger, +/obj/structure/sign/poster/official/random/directional/south, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/turf/open/floor/iron, +/area/station/cargo/sorting) "gNC" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/engine, @@ -19009,15 +19091,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"gRK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "gSn" = ( /obj/item/wrench, /turf/open/floor/iron, @@ -19159,6 +19232,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"gVd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "gVj" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue, @@ -20590,6 +20674,15 @@ /obj/effect/turf_decal/trimline/brown/filled/warning, /turf/open/floor/iron, /area/station/cargo/sorting) +"hvC" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "hvI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21107,18 +21200,6 @@ /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) -"hDj" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "hDp" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -21528,6 +21609,32 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/construction, /turf/open/floor/plating, /area/station/maintenance/port) +"hMp" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/shipping{ + pixel_x = -6; + pixel_y = 15 + }, +/obj/item/multitool{ + pixel_x = -3; + pixel_y = -4 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 8; + pixel_y = 11 + }, +/obj/item/flashlight/lamp{ + pixel_x = -7; + pixel_y = 5 + }, +/obj/item/storage/box/shipping{ + pixel_x = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "hMq" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -21995,14 +22102,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"hVp" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/sorting) "hVE" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -22040,6 +22139,28 @@ /obj/effect/landmark/navigate_destination, /turf/open/floor/iron/white, /area/station/medical/virology) +"hVU" = ( +/obj/machinery/light_switch/directional/south, +/obj/machinery/conveyor_switch/oneway{ + id = "packageSort2"; + name = "Sort and Deliver"; + pixel_x = -2; + pixel_y = 12 + }, +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "packageExternal"; + name = "Crate Returns"; + pixel_x = -5; + pixel_y = -3 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/effect/turf_decal/trimline/white/corner, +/turf/open/floor/iron, +/area/station/cargo/sorting) "hVX" = ( /obj/structure/toilet{ pixel_y = 8 @@ -22104,18 +22225,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/locker) -"hWG" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "hWK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/landmark/start/depsec/supply, @@ -22315,6 +22424,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/genetics) +"hZP" = ( +/obj/machinery/light/directional/south, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/cargo/lobby) "hZQ" = ( /turf/closed/wall/r_wall, /area/station/maintenance/port/fore) @@ -22413,6 +22531,17 @@ }, /turf/open/floor/iron/dark, /area/station/security/execution/education) +"ibP" = ( +/obj/structure/cable, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "ibX" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -22490,6 +22619,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"icZ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Port Primary Hallway" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "idr" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -24064,6 +24211,16 @@ /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"iEs" = ( +/obj/structure/cable, +/obj/structure/closet/crate, +/obj/effect/turf_decal/bot/left, +/obj/structure/window/spawner/directional/east, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "iEv" = ( /obj/structure/closet, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -24549,14 +24706,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"iNt" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/landmark/start/cargo_technician, -/turf/open/floor/iron, -/area/station/cargo/sorting) "iNB" = ( /obj/machinery/firealarm/directional/east, /obj/structure/table/glass, @@ -24714,18 +24863,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) -"iPP" = ( -/obj/machinery/door/airlock/mining{ - name = "Quartermaster's Office" - }, -/obj/effect/mapping_helpers/airlock/access/all/supply/qm, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/diagonal_edge, -/obj/effect/turf_decal/tile/brown/diagonal_centre, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/diagonal, -/area/station/command/heads_quarters/qm) "iPT" = ( /obj/machinery/light/floor, /turf/open/floor/wood, @@ -25433,6 +25570,23 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"jbp" = ( +/obj/effect/spawner/random/bureaucracy/birthday_wrap, +/obj/item/stack/package_wrap{ + pixel_y = 5 + }, +/obj/item/stack/package_wrap{ + pixel_y = 2 + }, +/obj/item/stack/package_wrap, +/obj/machinery/light/directional/south, +/obj/machinery/firealarm/directional/south, +/obj/structure/table, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "jbF" = ( /obj/structure/table, /obj/effect/decal/cleanable/cobweb, @@ -25739,6 +25893,10 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) +"jhh" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "jhk" = ( /obj/structure/chair{ dir = 1 @@ -27266,30 +27424,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) -"jHM" = ( -/obj/machinery/newscaster/directional/east, -/obj/structure/table, -/obj/item/stack/package_wrap{ - pixel_x = 2; - pixel_y = -3 - }, -/obj/item/stack/package_wrap{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/end{ - dir = 1 - }, -/obj/item/pen{ - pixel_x = -7; - pixel_y = 10 - }, -/obj/item/reagent_containers/cup/glass/waterbottle{ - pixel_y = 16 - }, -/obj/machinery/digital_clock/directional/north, -/turf/open/floor/iron, -/area/station/cargo/sorting) "jHN" = ( /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; @@ -27917,6 +28051,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"jRJ" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "jRO" = ( /obj/structure/table, /obj/item/paper_bin, @@ -27984,18 +28128,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"jTd" = ( -/obj/effect/landmark/start/quartermaster, -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/diagonal_centre, -/obj/effect/turf_decal/tile/yellow/diagonal_edge, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/diagonal, -/area/station/cargo/storage) "jTi" = ( /obj/machinery/hydroponics/soil, /obj/machinery/camera/directional/west{ @@ -28078,15 +28210,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"jTY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "jTZ" = ( /turf/closed/wall, /area/station/security/execution/transfer) @@ -28665,17 +28788,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"ken" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "keK" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 4 @@ -29957,12 +30069,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/command/teleporter) -"kCg" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "kCq" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/modular_computer/preset/engineering, @@ -30518,36 +30624,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/hydroponics) -"kMK" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/item/stamp/head/qm{ - pixel_x = 4; - pixel_y = 12 - }, -/obj/item/stamp/granted{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/item/stamp/denied{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/stamp/void{ - pixel_x = 4; - pixel_y = 5 - }, -/obj/effect/spawner/random/entertainment/money_medium{ - pixel_y = -6; - pixel_x = 3 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/qm) "kMX" = ( /obj/machinery/washing_machine, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -31503,13 +31579,6 @@ /obj/structure/cable, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"leT" = ( -/obj/structure/window/spawner/directional/south, -/obj/machinery/computer/cargo/request{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/cargo/sorting) "lfc" = ( /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/stripes/corner{ @@ -31801,16 +31870,6 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"lkR" = ( -/obj/structure/disposaloutlet{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk, -/obj/structure/window/spawner/directional/west, -/obj/machinery/light/small/directional/south, -/obj/structure/window/spawner/directional/east, -/turf/open/floor/plating, -/area/station/cargo/sorting) "lkW" = ( /obj/machinery/light/small/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -31978,6 +32037,19 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) +"low" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/newscaster/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "loA" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -32362,15 +32434,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"lvm" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "lvs" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment, @@ -32443,14 +32506,6 @@ }, /turf/open/floor/grass, /area/station/medical/virology) -"lwZ" = ( -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "lxf" = ( /obj/structure/bed, /obj/effect/spawner/random/bedsheet, @@ -32536,18 +32591,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"lzg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/mining{ - name = "Mining Office" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/any/supply/mining, -/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "lzJ" = ( /obj/structure/cable, /turf/open/floor/iron/solarpanel/airless, @@ -33946,6 +33989,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/cryo) +"mcd" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "mcl" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -34327,16 +34376,6 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"mjQ" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/mining{ - name = "Mining Office" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, -/obj/effect/mapping_helpers/airlock/access/any/supply/mining, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "mkr" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -34596,10 +34635,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/space, /area/space/nearstation) -"moQ" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "moV" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -34774,6 +34809,16 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) +"msL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/stripes/corner, +/obj/item/reagent_containers/cup/soda_cans/pwr_game, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "msN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/reagent_dispensers/watertank, @@ -35176,20 +35221,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/cargo/sorting) -"mzl" = ( -/obj/structure/closet/crate/preopen, -/obj/effect/spawner/random/bureaucracy/birthday_wrap, -/obj/item/stack/package_wrap{ - pixel_y = 5 - }, -/obj/item/stack/package_wrap{ - pixel_y = 2 - }, -/obj/item/stack/package_wrap, -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/cargo/lobby) "mzm" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/saltshaker{ @@ -35595,9 +35626,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/station/engineering/main) -"mFq" = ( -/turf/open/floor/iron, -/area/station/cargo/warehouse) "mFr" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating/airless, @@ -37093,13 +37121,6 @@ /obj/effect/spawner/random/entertainment/dice, /turf/open/floor/iron, /area/station/commons/dorms) -"ngS" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "QMLoad2" - }, -/turf/open/floor/plating, -/area/station/cargo/storage) "ngT" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -37200,6 +37221,28 @@ dir = 8 }, /area/station/medical/morgue) +"niE" = ( +/obj/machinery/newscaster/directional/east, +/obj/structure/table, +/obj/item/stack/package_wrap{ + pixel_x = 2; + pixel_y = -3 + }, +/obj/item/stack/package_wrap{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -7; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/glass/waterbottle{ + pixel_y = 16 + }, +/obj/machinery/digital_clock/directional/north, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) "niY" = ( /obj/structure/disposalpipe/segment, /obj/structure/lattice/catwalk, @@ -37719,28 +37762,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"nrM" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/cafeteria) -"nrN" = ( -/obj/machinery/mineral/ore_redemption{ - dir = 4; - input_dir = 8; - output_dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/east{ - name = "Ore Redemption Window" - }, -/obj/machinery/door/window/left/directional/west{ - req_access = list("cargo"); - name = "Cargo Security Window" - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "nrV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /turf/open/floor/iron/dark, @@ -38154,19 +38175,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/customs) -"nxv" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/mining{ - name = "Cargo Bay" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, -/obj/effect/landmark/navigate_destination, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/lobby) "nxy" = ( /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) @@ -38651,16 +38659,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"nFY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/stripes/corner, -/obj/item/reagent_containers/cup/soda_cans, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "nGd" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -38781,6 +38779,11 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"nJi" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "nJn" = ( /obj/machinery/chem_dispenser{ layer = 2.7 @@ -39120,6 +39123,11 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"nOx" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/cargo/sorting) "nOK" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/stripes/white/line{ @@ -39173,17 +39181,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/prison/garden) -"nQw" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "nQz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/trash/janitor_supplies, @@ -39320,27 +39317,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"nSx" = ( -/obj/structure/table, -/obj/item/clothing/gloves/cargo_gauntlet{ - pixel_y = 2 - }, -/obj/item/clothing/gloves/cargo_gauntlet{ - pixel_y = 5 - }, -/obj/item/clothing/gloves/cargo_gauntlet{ - pixel_y = 8 - }, -/obj/item/reagent_containers/cup/soda_cans{ - pixel_x = -7; - pixel_y = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron, -/area/station/cargo/storage) "nSB" = ( /obj/item/toy/figure/roboticist, /obj/structure/disposalpipe/segment, @@ -39382,6 +39358,15 @@ /obj/effect/turf_decal/trimline/dark_red/filled/line, /turf/open/floor/iron, /area/station/security/warden) +"nUc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "nUp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -39758,18 +39743,6 @@ /obj/structure/closet/crate/engineering, /turf/open/floor/plating, /area/station/engineering/main) -"obb" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "obk" = ( /obj/item/target/alien, /turf/open/floor/plating, @@ -39817,6 +39790,18 @@ "obG" = ( /turf/closed/wall, /area/station/service/theater) +"obJ" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "obN" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -41223,15 +41208,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"oDo" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/bin/tagger, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron, -/area/station/cargo/sorting) "oDJ" = ( /obj/structure/sign/warning/vacuum/external, /turf/closed/wall, @@ -41672,20 +41648,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"oKy" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "oKA" = ( /obj/machinery/door/airlock/hatch{ name = "Telecomms Control Room" @@ -42151,6 +42113,21 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"oUp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "oUu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42253,6 +42230,15 @@ "oWk" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/aft) +"oWw" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/filled/line, +/turf/open/floor/iron, +/area/station/cargo/sorting) "oWF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -42394,15 +42380,6 @@ /obj/item/pillow/random, /turf/open/floor/carpet, /area/station/commons/dorms) -"oYz" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Cargo Bay - Mailroom" - }, -/obj/effect/turf_decal/trimline/brown/filled/shrink_ccw, -/obj/effect/turf_decal/trimline/white/filled/warning, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/cargo/sorting) "oYM" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -42976,6 +42953,14 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"pks" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "pkx" = ( /obj/machinery/modular_computer/preset/research{ dir = 8 @@ -43654,24 +43639,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron, /area/station/commons/storage/tools) -"pvL" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "pvY" = ( /obj/machinery/camera/directional/north{ c_tag = "Holodeck - Fore"; @@ -43847,6 +43814,20 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"pzL" = ( +/obj/machinery/light/directional/north, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/delivery_chute{ + dir = 4; + name = "Crate Returns" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/window/spawner/directional/south, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "pzT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, @@ -43892,6 +43873,16 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) +"pAA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/iron, +/area/station/cargo/lobby) "pAD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/window/reinforced/spawner/directional/west, @@ -44725,6 +44716,22 @@ dir = 4 }, /area/station/service/chapel) +"pPv" = ( +/obj/structure/table, +/obj/item/papercutter{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/item/stamp/denied{ + pixel_x = -7; + pixel_y = 7 + }, +/obj/item/stamp/granted{ + pixel_x = -7 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) "pPH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/wood{ @@ -44912,6 +44919,19 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"pSP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "pSS" = ( /obj/structure/lattice/catwalk, /obj/structure/transit_tube/junction/flipped{ @@ -46431,13 +46451,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/space, /area/space/nearstation) -"qyk" = ( -/obj/machinery/computer/cargo{ - dir = 4 - }, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron, -/area/station/cargo/sorting) "qyr" = ( /obj/item/kirbyplants, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -46542,6 +46555,22 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/security/prison) +"qzY" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/machinery/light/directional/north, +/obj/structure/statue/gold/qm, +/obj/machinery/status_display/supply{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/effect/turf_decal/tile/yellow/diagonal_edge, +/obj/effect/turf_decal/siding/yellow{ + dir = 10 + }, +/turf/open/floor/iron/diagonal, +/area/station/cargo/storage) "qAc" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -46779,21 +46808,6 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) -"qDH" = ( -/obj/structure/table, -/obj/item/papercutter{ - pixel_x = 9; - pixel_y = 4 - }, -/obj/item/stamp/denied{ - pixel_x = -7; - pixel_y = 7 - }, -/obj/item/stamp/granted{ - pixel_x = -7 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "qDS" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -47105,6 +47119,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/locker) +"qJS" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "qJU" = ( /obj/structure/sign/map/right{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; @@ -47392,6 +47417,44 @@ }, /turf/open/floor/iron, /area/station/security/prison) +"qNP" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/stamp/head/qm{ + pixel_x = 1; + pixel_y = 12 + }, +/obj/item/stamp/granted{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/item/stamp/denied{ + pixel_x = -7; + pixel_y = 5 + }, +/obj/item/stamp/void{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/effect/spawner/random/entertainment/money_medium{ + pixel_y = -6; + pixel_x = -3 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/clipboard{ + pixel_x = 10; + pixel_y = 8 + }, +/obj/item/coin/gold{ + pixel_y = -5; + pixel_x = 10 + }, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/qm) "qNV" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47869,6 +47932,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/space_hut) +"qUT" = ( +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "qVc" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, @@ -48088,6 +48159,21 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /turf/open/floor/iron/dark, /area/station/tcommsat/server) +"qYh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "qYt" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -48108,14 +48194,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/ai_monitored/command/nuke_storage) -"qYW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/lobby) "qZa" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -49981,6 +50059,15 @@ "rGC" = ( /turf/open/floor/iron/dark, /area/station/security/courtroom) +"rGK" = ( +/obj/machinery/camera/directional/north, +/obj/machinery/airalarm/directional/north, +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "rHh" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law{ @@ -50415,6 +50502,34 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"rOv" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/folder/yellow{ + pixel_x = 8; + pixel_y = -1 + }, +/obj/item/ammo_casing/rocket{ + pixel_x = -2; + pixel_y = 19; + name = "Dud Rocket"; + desc = "An 84mm High Explosive rocket. This one's a dud. Pretty sure." + }, +/obj/item/computer_disk/quartermaster{ + pixel_x = 9; + pixel_y = 13 + }, +/obj/effect/spawner/random/entertainment/lighter{ + pixel_x = -7; + pixel_y = -4 + }, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/qm) "rOz" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -50512,6 +50627,19 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"rQh" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "rQl" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -50924,23 +51052,6 @@ /obj/effect/landmark/navigate_destination, /turf/open/floor/plating, /area/station/science/ordnance/testlab) -"rXl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/item/reagent_containers/cup/glass/waterbottle{ - pixel_y = 48; - pixel_x = 9 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "rXJ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool/directional/east, @@ -51046,10 +51157,6 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) -"rZv" = ( -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "rZy" = ( /obj/machinery/camera/directional/east{ c_tag = "AI Chamber - Starboard"; @@ -51269,6 +51376,11 @@ /obj/item/plant_analyzer, /turf/open/floor/grass, /area/station/security/prison/garden) +"sce" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/cafeteria) "sch" = ( /turf/closed/wall, /area/station/security/medical) @@ -51853,6 +51965,18 @@ /obj/item/training_toolbox, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"soO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "soU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -51964,15 +52088,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/central) -"srM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "srP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52117,11 +52232,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/prison) -"suE" = ( -/obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "suP" = ( /obj/structure/lattice, /obj/machinery/atmospherics/components/unary/passive_vent/layer2{ @@ -52814,12 +52924,6 @@ }, /turf/open/floor/iron, /area/station/service/kitchen) -"sFI" = ( -/obj/structure/cable, -/obj/structure/closet/crate, -/obj/effect/turf_decal/bot/left, -/turf/open/floor/iron, -/area/station/cargo/lobby) "sFY" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -53169,16 +53273,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"sNr" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "sNt" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53446,6 +53540,19 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron, /area/station/engineering/atmos) +"sRz" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/mining{ + name = "Cargo Bay" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/effect/landmark/navigate_destination, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/lobby) "sRJ" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/item/kirbyplants/organic/plant16, @@ -53876,18 +53983,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron, /area/station/security/prison/garden) -"sXr" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "sXF" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -55254,6 +55349,15 @@ "tyY" = ( /turf/closed/wall, /area/station/command/heads_quarters/captain/private) +"tzd" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/start/cargo_technician, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) "tzg" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/grass, @@ -55653,29 +55757,6 @@ /obj/structure/cable/layer3, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) -"tHV" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/shipping{ - pixel_x = -6; - pixel_y = 15 - }, -/obj/item/multitool{ - pixel_x = -3; - pixel_y = -4 - }, -/obj/item/storage/box/lights/mixed{ - pixel_x = 8; - pixel_y = 11 - }, -/obj/item/flashlight/lamp{ - pixel_x = -7; - pixel_y = 5 - }, -/obj/item/storage/box/shipping{ - pixel_x = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "tHZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -56817,13 +56898,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/explab) -"tZq" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/cargo/storage) "tZz" = ( /obj/effect/turf_decal/stripes/corner, /obj/structure/cable, @@ -56834,6 +56908,19 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"tZA" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Cargo Bay - Mailroom" + }, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/white/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "tZD" = ( /obj/effect/landmark/start/captain, /obj/structure/chair/comfy/brown, @@ -56858,6 +56945,15 @@ /obj/item/canvas/twentythree_twentythree, /turf/open/floor/iron, /area/station/commons/storage/tools) +"tZP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "tZX" = ( /obj/structure/window/spawner/directional/west, /obj/machinery/light/floor, @@ -56882,6 +56978,20 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"uai" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/item/reagent_containers/cup/glass/waterbottle{ + pixel_y = 48; + pixel_x = 9 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "uaj" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/effect/turf_decal/siding/wood{ @@ -57434,11 +57544,6 @@ /obj/effect/landmark/start/quartermaster, /turf/open/floor/wood/large, /area/station/command/heads_quarters/qm) -"uko" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) "ukq" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1 @@ -57524,18 +57629,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"unj" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "unk" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -58246,6 +58339,20 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"uyW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/machinery/status_display/evac/directional/west, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "uyY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58470,6 +58577,13 @@ /obj/structure/sign/departments/aiupload/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) +"uDE" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "uDH" = ( /obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ dir = 1 @@ -58989,17 +59103,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"uLE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "uLK" = ( /obj/structure/flora/bush/pale/style_random, /obj/structure/flora/bush/ferny/style_random, @@ -59521,21 +59624,6 @@ /obj/structure/sign/poster/official/nanotrasen_logo/directional/east, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) -"uVm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "uVv" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -59953,13 +60041,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"vbF" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/circuit/green{ - luminosity = 2 - }, -/area/station/ai_monitored/command/nuke_storage) "vbL" = ( /obj/machinery/door/airlock/research{ name = "Ordnance Lab" @@ -61118,21 +61199,6 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/fitness/recreation) -"vwu" = ( -/obj/structure/railing/corner/end/flip{ - dir = 8 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/turf_decal/tile/brown/diagonal_centre, -/obj/effect/turf_decal/tile/yellow/diagonal_edge, -/obj/effect/turf_decal/siding/thinplating_new/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/diagonal, -/area/station/cargo/storage) "vwP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62485,22 +62551,6 @@ dir = 9 }, /area/station/medical/treatment_center) -"vSB" = ( -/obj/structure/railing{ - dir = 10 - }, -/obj/machinery/light/directional/north, -/obj/structure/statue/gold/qm, -/obj/machinery/status_display/supply{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/brown/diagonal_centre, -/obj/effect/turf_decal/tile/yellow/diagonal_edge, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 10 - }, -/turf/open/floor/iron/diagonal, -/area/station/cargo/storage) "vSC" = ( /obj/machinery/rnd/production/protolathe/department/engineering, /obj/effect/turf_decal/bot, @@ -62979,11 +63029,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"waq" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/lobby) "was" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63178,14 +63223,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/cargo/lobby) -"wdY" = ( -/obj/effect/turf_decal/trimline/brown/filled/end{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron, -/area/station/cargo/lobby) "wem" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -63885,15 +63922,6 @@ "wrn" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"wrt" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "wrJ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -63902,6 +63930,14 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) +"wrO" = ( +/obj/structure/cable, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "wrZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -64194,6 +64230,17 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"wwi" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/modular_computer/preset/cargochat/cargo{ + dir = 8 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "wwj" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -64900,46 +64947,6 @@ dir = 8 }, /area/station/medical/chem_storage) -"wMu" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/item/coin/gold{ - pixel_y = 12; - pixel_x = -3 - }, -/obj/item/coin/gold{ - pixel_x = 4; - pixel_y = 16 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/item/ammo_casing/rocket{ - pixel_x = -10; - pixel_y = 18; - name = "Dud Rocket"; - desc = "An 84mm High Explosive rocket. This one's a dud. Pretty sure." - }, -/obj/item/computer_disk/quartermaster{ - pixel_x = 6; - pixel_y = 4 - }, -/obj/effect/spawner/random/entertainment/lighter{ - pixel_x = -6; - pixel_y = 1 - }, -/obj/item/clipboard{ - pixel_x = -5; - pixel_y = 31 - }, -/obj/item/folder/yellow{ - pixel_x = 3; - pixel_y = 8 - }, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/qm) "wMx" = ( /obj/effect/turf_decal/bot, /obj/effect/landmark/start/hangover, @@ -65285,15 +65292,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) -"wRP" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "wRT" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -65315,6 +65313,21 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"wSm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "wSq" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -66418,6 +66431,13 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) +"xmt" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/circuit/green{ + luminosity = 2 + }, +/area/station/ai_monitored/command/nuke_storage) "xmD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/medical/memeorgans, @@ -66615,6 +66635,18 @@ /obj/item/storage/bag/tray, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"xqD" = ( +/obj/effect/landmark/start/quartermaster, +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/effect/turf_decal/tile/yellow/diagonal_edge, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/turf/open/floor/iron/diagonal, +/area/station/cargo/storage) "xqI" = ( /obj/machinery/computer/security/labor{ dir = 8 @@ -66785,6 +66817,13 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"xtv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "xtw" = ( /obj/item/stack/rods, /turf/open/space/basic, @@ -66962,14 +67001,6 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/grass, /area/station/science/genetics) -"xwU" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/obj/effect/landmark/start/quartermaster, -/obj/item/binoculars, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/qm) "xwV" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -67804,18 +67835,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"xLB" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "xLR" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -68769,6 +68788,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/locker) +"ycY" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/cargo/lobby) "ydb" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -69201,18 +69227,6 @@ /obj/item/clothing/suit/jacket/straight_jacket, /turf/open/floor/iron/dark, /area/station/medical/office) -"yln" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Central Primary Hallway - Fore - Port Corner" - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/machinery/computer/piratepad_control/civilian{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "ylt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -86333,10 +86347,10 @@ hKg uvw yeq yeq -ngS +yeq cvv wcy -bDj +aIF fXZ sUc vsO @@ -86348,7 +86362,7 @@ exQ vQs cna hjt -bbY +fIl bGu slZ vQs @@ -86843,7 +86857,7 @@ apC sUD sWU mUz -mjQ +fDR hWC cEY tqo @@ -86860,7 +86874,7 @@ xHC aok vlk fqe -mFq +jhh ojW hpj uSO @@ -87100,7 +87114,7 @@ jGb uMj poj hnV -lzg +ggF gUH dAk dAk @@ -87121,7 +87135,7 @@ xbZ kZI nbd vKn -nFY +msL rgM vQs hyW @@ -87634,7 +87648,7 @@ vQs vde tGU hYl -rZv +nJi rPp eIc vQs @@ -88140,19 +88154,19 @@ dfk rQD nsh vWD -nSx +cJr liU nrB smB tik -iev +nOx xwa fjw cwY sbF -drG +drQ bzH -srM +hyW xOw wAk pOa @@ -88372,7 +88386,7 @@ qGP sHu pkT sHu -eMY +dvC cVL jXu kIJ @@ -88407,9 +88421,9 @@ uya yhL nQR hYx -lkR +cpS iev -arJ +cRC sly nxF sVY @@ -88663,7 +88677,7 @@ bzH gPN ebd ebd -eJv +hVU bzH bzH bBy @@ -88903,7 +88917,7 @@ lpS lpS bkF cbz -vSB +qzY kKO vQT hBo @@ -88911,19 +88925,19 @@ gWz kQv cgZ hIp -dVy +nUc lQf -tZq -uko -eVg +gtF +pks +qUT oTw -sNr +bZG sHX uyh hvB sqt iev -obb +pSP iVs fLd fpy @@ -89160,8 +89174,8 @@ jXu kAI gfa eOl -vwu -jTd +cbE +xqD tvv xTe xTe @@ -89169,8 +89183,8 @@ tvv kQP wdM asT -nxv -nrN +sRz +ekF lVp bzH bzH @@ -89180,7 +89194,7 @@ rmL hOh lAi bzH -cSF +low uxa mmm vjv @@ -89418,17 +89432,17 @@ twr nsT heR kQP -iPP +bBM kQP eTt -xwU +eku izI kQP -fov -lvm -gRK -aDe -mzl +pzL +hvC +qxJ +mcd +jbp bzH dGC uud @@ -89674,20 +89688,20 @@ jXu sxn ciE dUd -czF +fQK fpV fdB bEK ydp cNb mXO -erW +cew rVn qxJ sik ryV -leT -qyk +cxI +dPf ekb wpO wbW @@ -89929,7 +89943,7 @@ rlU aaa jXu jXu -ken +qJS kQP hOO dFg @@ -89938,20 +89952,20 @@ iqo wyV cJt mXO -gbn +awf aUm jvv bNN rod mhM -iNt +tzd wuo tPW ayz bLj rnh iev -gCn +rQh nqo qsX sVY @@ -90195,20 +90209,20 @@ wyV wyV oxX mXO -sFI +iEs oac fhB hxd dHz aqG -qDH +pPv ekb lsU bQl -oYz +tZA bzH bzH -unj +obJ ivB qaw sVY @@ -90438,7 +90452,7 @@ rlU trx uWn spf -czD +xtv lBg tWU wWe @@ -90447,25 +90461,25 @@ tlJ kQP npj aSv -kMK -wMu +qNP +rOv ukm dLh kQP -bDd -kCg -aHB -xLB -wdY +rGK +fDN +qxJ +pAA +hZP bzH -jHM -rXl +niE +uai gxM jRo qCx -oDo +gNB bzH -nQw +ePd tEr iOc sVY @@ -90692,7 +90706,7 @@ uEA mKr aaa rlU -vbF +xmt wHW wHW okj @@ -90710,9 +90724,9 @@ kQP kQP kQP rcR -waq -qYW -fuE +dlN +ycY +fIr nDG bzH bzH @@ -90720,9 +90734,9 @@ usJ kFa lak rUd -hVp -ahv -sXr +oWw +cuS +qYh ybn fLp sVY @@ -90965,21 +90979,21 @@ aHt eaQ aHt qlW -suE -lwZ -cOi -jTY -wrt -yln -abA +wrO +ibP +gjK +ccq +jRJ +eVD +daZ bzH -fQl +wwi sul pkF dtE -tHV +hMp aqG -oKy +ePd xOw iOc sVY @@ -91226,9 +91240,9 @@ mPK lgg kWP lgg -uLE +gVd cSu -moQ +uDE bzH aqG aqG @@ -91236,7 +91250,7 @@ mxx aqG aqG aqG -pvL +icZ mFo npY qwR @@ -91483,17 +91497,17 @@ bLh pPH hSg uTN -uVm +oUp sSV -wRP -bBa -gji -gji -hWG -gji -hDj -hDj -aSd +tZP +uyW +ajv +ajv +wSm +ajv +ajv +ajv +soO vhB guR lsf @@ -91739,7 +91753,7 @@ jfX aUC iFC iBt -nrM +sce yaE tmK htd diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index a1da07d798773..b0c8d17c83315 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -4604,9 +4604,8 @@ dir = 10 }, /obj/structure/table/wood, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/spawner/random/decoration/ornament, +/obj/item/folder/yellow, +/obj/item/stamp/law, /turf/open/floor/iron/grimy, /area/station/service/lawoffice) "aGq" = ( @@ -6756,7 +6755,11 @@ /area/station/engineering/atmos/pumproom) "bnh" = ( /obj/item/radio/intercom/directional/north, -/obj/machinery/photocopier, +/obj/machinery/fax{ + name = "Law Office Fax Machine"; + fax_name = "Law Office" + }, +/obj/structure/table/wood, /turf/open/floor/wood, /area/station/service/lawoffice) "bnY" = ( @@ -7615,10 +7618,11 @@ /area/station/maintenance/tram/left) "bFc" = ( /obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/vending/wardrobe/law_wardrobe, /obj/machinery/camera/directional/north{ c_tag = "Civilian - Lawyer's Office" }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, /turf/open/floor/wood, /area/station/service/lawoffice) "bFl" = ( @@ -12232,10 +12236,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningdock) -"dep" = ( -/obj/machinery/newscaster/directional/west, -/turf/open/floor/wood, -/area/station/service/lawoffice) "deq" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/plasticflaps/opaque{ @@ -17918,12 +17918,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/workout) -"flv" = ( -/obj/structure/aquarium/lawyer, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/lawoffice) "flP" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/trimline/green/line{ @@ -18843,9 +18837,10 @@ /turf/open/floor/iron/dark/herringbone, /area/station/commons/vacant_room) "fEZ" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, /obj/structure/noticeboard/directional/north, +/obj/structure/aquarium/lawyer, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/wood, /area/station/service/lawoffice) "fFa" = ( @@ -24685,6 +24680,7 @@ dir = 1 }, /obj/effect/landmark/start/lawyer, +/obj/machinery/newscaster/directional/west, /turf/open/floor/wood, /area/station/service/lawoffice) "hPB" = ( @@ -26540,6 +26536,9 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/grimy, /area/station/service/lawoffice) "izO" = ( @@ -28273,17 +28272,11 @@ /area/station/service/bar/backroom) "jeC" = ( /obj/machinery/airalarm/directional/north, -/obj/structure/rack, -/obj/item/clipboard, -/obj/item/chair/plastic, -/obj/item/chair/plastic{ - pixel_y = 5 - }, -/obj/effect/spawner/random/bureaucracy/briefcase, /obj/machinery/light_switch/directional/east{ pixel_x = 23; pixel_y = -8 }, +/obj/machinery/photocopier, /turf/open/floor/wood, /area/station/service/lawoffice) "jeO" = ( @@ -30842,10 +30835,9 @@ dir = 9 }, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, /area/station/service/lawoffice) "jYb" = ( @@ -35501,7 +35493,10 @@ /obj/effect/turf_decal/siding/wood{ dir = 10 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/table/wood, +/obj/effect/spawner/random/decoration/ornament, /turf/open/floor/iron/grimy, /area/station/service/lawoffice) "lxW" = ( @@ -38103,12 +38098,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/miningfoundry) -"mrb" = ( -/obj/structure/table/wood, -/obj/item/folder/yellow, -/obj/item/stamp/law, -/turf/open/floor/wood, -/area/station/service/lawoffice) "mrf" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -48064,6 +48053,7 @@ pixel_x = 3; pixel_y = 3 }, +/obj/effect/spawner/random/bureaucracy/briefcase, /turf/open/floor/wood, /area/station/service/lawoffice) "pYH" = ( @@ -48390,13 +48380,6 @@ }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) -"qel" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) "qeo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -67664,10 +67647,10 @@ dir = 1 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 5 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, /area/station/service/lawoffice) "wLR" = ( @@ -68060,11 +68043,7 @@ /area/station/hallway/primary/tram/center) "wUL" = ( /obj/machinery/status_display/evac/directional/north, -/obj/machinery/fax{ - name = "Law Office Fax Machine"; - fax_name = "Law Office" - }, -/obj/structure/table/wood, +/obj/machinery/vending/wardrobe/law_wardrobe, /turf/open/floor/wood, /area/station/service/lawoffice) "wVV" = ( @@ -68949,9 +68928,6 @@ /area/station/service/hydroponics) "xmH" = ( /obj/structure/sign/poster/official/report_crimes/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, /turf/open/floor/wood, /area/station/service/lawoffice) "xmJ" = ( @@ -99478,11 +99454,11 @@ hLr nCe udP hFr -hFr -hFr -hFr -hFr -hFr +abM +abM +abM +abM +abM abM abM abM @@ -99734,11 +99710,11 @@ nzL jkM adC jmp -iTz -flv -qnk -mrb -dep +hFr +hFr +hFr +hFr +hFr hFr abM abM @@ -99993,7 +99969,7 @@ vBa vrG iTz fEZ -qel +qnk aGk hPA hFr diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 637da6f7c065b..3116f34a2033b 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -2096,16 +2096,12 @@ /turf/open/floor/iron, /area/station/cargo/storage) "aIX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/turf/open/floor/plating, -/area/station/science/auxlab) +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/landmark/start/scientist, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "aJa" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -2770,6 +2766,13 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"aUx" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) "aUy" = ( /obj/structure/railing{ dir = 8 @@ -3528,6 +3531,9 @@ "bjK" = ( /obj/structure/barricade/wooden, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/department/science) "bjM" = ( @@ -4914,6 +4920,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"bKL" = ( +/obj/item/flashlight/glowstick/cyan{ + start_on = 1; + pixel_y = 7 + }, +/turf/open/misc/asteroid, +/area/station/asteroid) "bKQ" = ( /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, @@ -5215,6 +5228,7 @@ "bRZ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/firealarm/directional/north, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/iron/dark, /area/station/science/ordnance) "bSr" = ( @@ -5816,6 +5830,11 @@ "cdk" = ( /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"cdl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/station/science/cytology) "cdo" = ( /obj/machinery/elevator_control_panel/directional/south{ linked_elevator_id = "aisat"; @@ -5991,6 +6010,10 @@ }, /turf/open/floor/iron/herringbone, /area/station/commons/fitness/recreation) +"cgu" = ( +/obj/machinery/duct, +/turf/open/misc/asteroid, +/area/station/asteroid) "cgw" = ( /obj/machinery/disposal/bin{ desc = "A pneumatic waste disposal unit. This one leads into space!"; @@ -8299,6 +8322,9 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/station/science/ordnance) "dbJ" = ( @@ -8720,6 +8746,21 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"dhR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/rack, +/obj/item/wrench, +/obj/item/knife/kitchen{ + pixel_x = 6; + pixel_y = 2 + }, +/obj/item/soap{ + pixel_y = -2 + }, +/obj/machinery/firealarm/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "dic" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -10246,6 +10287,13 @@ /obj/machinery/light/small/dim/directional/north, /turf/open/misc/asteroid, /area/station/maintenance/department/cargo) +"dGX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/science) "dHa" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -10573,12 +10621,17 @@ /turf/open/floor/wood, /area/station/command/heads_quarters/qm) "dOg" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/table, -/obj/effect/spawner/random/maintenance/two, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/plating, -/area/station/science/auxlab) +/obj/item/petri_dish{ + pixel_x = -5; + pixel_y = 2 + }, +/obj/item/food/pizzaslice/moldy/bacteria{ + pixel_y = 15; + pixel_x = 3 + }, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "dOv" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -10751,11 +10804,9 @@ /turf/open/floor/plating, /area/station/service/lawoffice) "dRh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/door_assembly/door_assembly_science, -/turf/open/floor/iron/white, -/area/station/science/auxlab) +/obj/structure/closet/secure_closet/cytology, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "dRi" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -11026,17 +11077,16 @@ /area/station/medical/storage) "dVp" = ( /turf/closed/wall, -/area/station/science/auxlab) +/area/station/science/cytology) "dVs" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) "dVt" = ( -/obj/structure/barricade/wooden/crude, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/science/auxlab) +/area/station/science/cytology) "dVu" = ( /obj/structure/railing{ dir = 8 @@ -14086,10 +14136,9 @@ /turf/open/floor/engine/n2, /area/station/engineering/atmos) "fdN" = ( -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/auxlab) +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "fdQ" = ( /obj/structure/table, /obj/effect/spawner/random/entertainment/cigarette, @@ -15622,12 +15671,11 @@ /turf/open/floor/iron, /area/station/engineering/main) "fFg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/science/auxlab) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "fFj" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /obj/effect/turf_decal/tile/yellow{ @@ -15915,6 +15963,14 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/plating, /area/station/engineering/storage) +"fJs" = ( +/obj/item/stock_parts/cell/bluespace{ + rigged = 1; + pixel_x = -5; + pixel_y = -8 + }, +/turf/open/misc/asteroid, +/area/station/asteroid) "fJz" = ( /obj/item/reagent_containers/condiment/vegetable_oil, /obj/machinery/grill, @@ -16379,9 +16435,16 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) "fSi" = ( -/obj/structure/microscope, -/obj/structure/table/glass, /obj/machinery/light/directional/north, +/obj/structure/table, +/obj/item/pen{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/item/hand_labeler{ + pixel_y = 10; + pixel_x = -13 + }, /turf/open/floor/glass/reinforced, /area/station/science/xenobiology) "fSk" = ( @@ -16571,9 +16634,8 @@ /turf/open/floor/iron/dark, /area/station/command/bridge) "fVf" = ( -/obj/item/stock_parts/cell/bluespace{ - rigged = 1 - }, +/obj/effect/mob_spawn/corpse/human/clown, +/obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid, /area/station/asteroid) "fVs" = ( @@ -19131,11 +19193,16 @@ /turf/open/floor/engine, /area/station/engineering/supermatter/room) "gTf" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/table, -/obj/item/wirecutters, -/turf/open/floor/plating, -/area/station/science/auxlab) +/obj/machinery/reagentgrinder{ + pixel_x = -1; + pixel_y = 8 + }, +/obj/item/swab{ + pixel_x = 15 + }, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "gTh" = ( /obj/structure/table/wood, /obj/item/gift, @@ -20198,10 +20265,10 @@ /turf/open/floor/wood, /area/station/service/library) "hkG" = ( +/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/tank/oxygen{ - dir = 8 + dir = 4 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/science) "hld" = ( @@ -21054,6 +21121,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/storage) +"hyM" = ( +/obj/structure/closet, +/obj/item/food/grown/banana, +/obj/item/food/grown/banana, +/obj/item/food/grown/banana, +/obj/item/food/grown/banana, +/obj/item/food/grown/banana, +/turf/open/misc/asteroid, +/area/station/asteroid) "hyS" = ( /obj/effect/spawner/random/maintenance, /obj/effect/mapping_helpers/broken_floor, @@ -21365,10 +21441,10 @@ /turf/open/misc/asteroid, /area/station/maintenance/disposal/incinerator) "hFq" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 6 - }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, /turf/open/floor/plating, /area/station/maintenance/department/science) "hFA" = ( @@ -21503,13 +21579,6 @@ color = "#795C32" }, /area/station/security/courtroom) -"hHE" = ( -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/science) "hHF" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -21581,6 +21650,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/robotics/mechbay) +"hJj" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "hJo" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -22974,6 +23056,22 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/central/lesser) +"ikp" = ( +/obj/structure/table, +/obj/item/toy/plush/slimeplushie{ + pixel_y = 12; + pixel_x = 3 + }, +/obj/item/stamp{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = 1 + }, +/turf/open/floor/glass/reinforced, +/area/station/science/xenobiology) "ikD" = ( /obj/structure/grille/broken, /obj/effect/decal/cleanable/glass, @@ -23265,12 +23363,8 @@ /turf/open/floor/iron/white, /area/station/science/lobby) "ipx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/science/auxlab) +/turf/closed/wall/r_wall, +/area/station/science/cytology) "ipJ" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -24381,8 +24475,11 @@ /turf/open/floor/iron/white, /area/station/science/research) "iJT" = ( -/turf/closed/wall/r_wall, -/area/station/science/auxlab) +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "iKb" = ( /obj/machinery/door/poddoor/shutters/window/preopen{ id = "ordstorage" @@ -24913,15 +25010,11 @@ /turf/open/floor/glass/reinforced, /area/station/command/meeting_room) "iXn" = ( -/obj/structure/closet/secure_closet/cytology, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/stripes{ - dir = 6 - }, /obj/item/radio/intercom/directional/north, /obj/effect/turf_decal/siding/purple{ dir = 4 }, +/obj/structure/closet/emcloset, /turf/open/floor/iron/white/textured_corner{ dir = 8 }, @@ -27050,6 +27143,9 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 9 + }, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) "jHH" = ( @@ -27292,6 +27388,10 @@ dir = 4 }, /obj/item/radio/intercom/directional/south, +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 8; + name = "Waste Release" + }, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos) "jLp" = ( @@ -29114,6 +29214,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/department/cargo) +"kqf" = ( +/obj/machinery/plumbing/input{ + dir = 8 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "kqj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -29749,6 +29856,9 @@ "kAI" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 1 + }, /turf/open/floor/plating, /area/station/science/ordnance/testlab) "kAW" = ( @@ -35219,6 +35329,7 @@ "mzB" = ( /obj/machinery/firealarm/directional/west, /obj/structure/closet/firecloset/full, +/obj/structure/sign/departments/science/alt/directional/south, /turf/open/floor/iron/white, /area/station/science/research) "mzI" = ( @@ -36356,9 +36467,6 @@ /turf/open/floor/engine, /area/station/engineering/supermatter/room) "mWB" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 9 - }, /obj/machinery/requests_console/auto_name/directional/south, /obj/effect/mapping_helpers/requests_console/supplies, /obj/effect/mapping_helpers/requests_console/assistance, @@ -36366,6 +36474,7 @@ dir = 8 }, /obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos) "mWF" = ( @@ -36383,14 +36492,10 @@ /turf/open/floor/iron, /area/station/commons/storage/primary) "mWS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/obj/effect/decal/cleanable/glass, -/obj/item/stack/rods/two, -/obj/item/shard, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/auxlab) +/obj/machinery/light/small/directional/north, +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/asteroid, +/area/station/asteroid) "mWX" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -36426,14 +36531,11 @@ /turf/open/floor/carpet, /area/station/commons/dorms) "mXJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken/directional/south, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/auxlab) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "mXK" = ( /obj/item/clothing/mask/gas/clown_hat, /obj/effect/decal/remains/human, @@ -40847,12 +40949,14 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "oGQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/structure/chair, -/obj/item/restraints/handcuffs/cable/zipties/used, -/turf/open/floor/iron/white, -/area/station/science/auxlab) +/obj/structure/table, +/obj/structure/microscope, +/obj/item/storage/box/beakers{ + pixel_y = 18; + pixel_x = -14 + }, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "oGX" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -41056,6 +41160,13 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) +"oKB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/engineering/atmos) "oKF" = ( /obj/structure/closet/toolcloset, /obj/machinery/power/apc/auto_name/directional/north, @@ -41502,14 +41613,11 @@ /turf/open/floor/iron, /area/station/security/brig/entrance) "oSG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/south, -/obj/structure/fluff/broken_canister_frame, -/obj/machinery/camera/autoname/directional/west{ - network = list("ss13","rd") +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/science/auxlab) +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "oSJ" = ( /obj/structure/stairs/east, /turf/open/floor/iron/white/smooth_large, @@ -41726,7 +41834,6 @@ "oWg" = ( /obj/machinery/door/airlock/maintenance/external, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/science/lobby) "oWr" = ( @@ -42484,15 +42591,11 @@ }, /area/station/service/theater) "pjL" = ( -/obj/item/book/manual/wiki/cytology{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/biopsy_tool{ - pixel_x = 8; - pixel_y = 2 +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 6 }, -/obj/structure/table/glass, /turf/open/floor/glass/reinforced, /area/station/science/xenobiology) "pjN" = ( @@ -43021,6 +43124,10 @@ }, /turf/open/space/basic, /area/space/nearstation) +"pti" = ( +/obj/machinery/plumbing/growing_vat, +/turf/open/misc/asteroid, +/area/station/asteroid) "ptq" = ( /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt/dust, @@ -44503,6 +44610,9 @@ /obj/machinery/door/firedoor/heavy, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, /turf/open/floor/iron/white, /area/station/science/ordnance) "pTC" = ( @@ -47497,6 +47607,9 @@ /obj/machinery/light/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 10 + }, /turf/open/floor/iron/dark, /area/station/science/ordnance) "qZh" = ( @@ -47692,6 +47805,13 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) +"rbS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/science) "rce" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green{ @@ -49878,6 +49998,9 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 5 + }, /turf/open/floor/iron/dark, /area/station/science/ordnance) "rKW" = ( @@ -50767,6 +50890,10 @@ "rZc" = ( /turf/open/floor/cult, /area/station/service/chapel/office) +"rZg" = ( +/mob/living/carbon/human/species/monkey, +/turf/open/misc/asteroid, +/area/station/asteroid) "rZz" = ( /obj/machinery/door/airlock{ name = "Maintenance Bathroom" @@ -50962,6 +51089,9 @@ "sbS" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 1 + }, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) "sbU" = ( @@ -51937,9 +52067,8 @@ /obj/effect/mapping_helpers/airlock/autoname, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/welded, -/turf/open/floor/iron/white, -/area/station/science/auxlab) +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "stj" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/purple{ @@ -52056,10 +52185,9 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "suw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/plating, -/area/station/science/auxlab) +/obj/machinery/chem_master, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "suB" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/bottle/syrup_bottle/liqueur{ @@ -55047,6 +55175,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/department/engine) +"tzy" = ( +/obj/machinery/camera/autoname/directional/west{ + network = list("ss13","rd") + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "tzT" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/structure/cable, @@ -56128,11 +56263,9 @@ /turf/open/floor/plating, /area/station/maintenance/central/lesser) "tQI" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/any/science/general, -/turf/open/floor/plating, -/area/station/science/auxlab) +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "tQM" = ( /obj/effect/mapping_helpers/airlock/access/all/supply/general, /obj/machinery/door/airlock/mining{ @@ -58214,10 +58347,10 @@ }, /area/station/command/emergency_closet) "uCr" = ( -/obj/structure/table/glass, -/obj/machinery/reagentgrinder{ - pixel_x = -1; - pixel_y = 8 +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Xenobiology Desk"; + name = "Xenobiology's Fax Machine" }, /turf/open/floor/glass/reinforced, /area/station/science/xenobiology) @@ -60361,13 +60494,8 @@ /turf/open/floor/iron, /area/station/engineering/lobby) "vqN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/science/auxlab) +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "vqY" = ( /obj/structure/table, /obj/item/clipboard, @@ -62539,6 +62667,13 @@ }, /turf/open/floor/iron/textured, /area/station/engineering/atmos) +"wfU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/science) "wfW" = ( /obj/structure/lattice/catwalk, /obj/item/food/pie/cream, @@ -65533,6 +65668,16 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/commons/storage/primary) +"xje" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "xjh" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron/white, @@ -66208,6 +66353,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_half, /area/station/medical/pharmacy) +"xwe" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/stripes/full, +/obj/effect/mapping_helpers/airlock/access/any/science/general, +/obj/machinery/door/airlock/maintenance/external/glass, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "xwf" = ( /obj/structure/chair/plastic{ dir = 8 @@ -66611,6 +66763,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/purple, /area/station/service/library) +"xCX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/misc/asteroid, +/area/station/asteroid) "xDf" = ( /obj/machinery/door/poddoor/shutters/window/preopen{ name = "Security Shutters"; @@ -67102,10 +67260,27 @@ /turf/open/floor/iron, /area/station/security/office) "xNo" = ( -/obj/effect/decal/cleanable/dirt, /obj/machinery/light_switch/directional/east, -/turf/open/floor/plating, -/area/station/science/auxlab) +/obj/structure/table, +/obj/machinery/light/small/directional/east, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_y = 14; + pixel_x = 6 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_y = 7; + pixel_x = 10 + }, +/obj/item/book/manual/wiki/cytology{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/biopsy_tool{ + pixel_x = -14; + pixel_y = 4 + }, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "xNp" = ( /obj/effect/turf_decal/stripes{ dir = 1 @@ -68235,6 +68410,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"yjm" = ( +/obj/item/flashlight/glowstick/orange{ + start_on = 1; + pixel_x = -5; + pixel_y = -6 + }, +/turf/open/misc/asteroid, +/area/station/asteroid) "yjw" = ( /obj/effect/turf_decal/tile/neutral, /obj/structure/chair/sofa/bench{ @@ -111456,7 +111639,7 @@ ilp foX gOY bRZ -lcd +hJj cmn jgl efL @@ -112256,7 +112439,7 @@ mWF sMs hfp wKT -hfp +oKB kUX agq kGZ @@ -112481,8 +112664,8 @@ aku aku aku upd -upd -upd +wfU +rbS kAI sbS jHE @@ -112513,7 +112696,7 @@ rZB pLe bwC lfG -bwC +aUx kUX wWk kGZ @@ -112738,7 +112921,7 @@ aku aku vfR vfJ -upd +dGX upd moe jxe @@ -113253,7 +113436,7 @@ aQm obA upd hFq -hHE +upd moe rHG bpW @@ -167229,7 +167412,7 @@ vxX vxX vxX vxX -gMk +xUx uet vxX vxX @@ -167483,16 +167666,16 @@ tqD gQu gvF vxX +bKL gMk gMk -gMk -gMk -gMk +rZg gMk gMk vxX vxX vxX +vxX gMk gMk gqm @@ -167743,10 +167926,10 @@ gMk fXf gMk gMk -vxX -vxX gMk gMk +gMk +fVf vxX vxX vxX @@ -167997,11 +168180,11 @@ gOc gOc gvF vxX -vxX -vxX -vxX -vxX -vxX +xUx +gMk +gMk +gMk +gMk gMk gMk vxX @@ -168255,9 +168438,9 @@ gOc gvF vxX vxX -vxX -vxX +uet gMk +pti gMk gMk gMk @@ -168512,9 +168695,9 @@ gOc gvF vxX vxX -vxX -vxX -vxX +hyM +gMk +cgu gMk gMk gMk @@ -168770,9 +168953,9 @@ gvF vxX vxX vxX -vxX -vxX -vxX +gMk +cgu +yjm vxX vxX gMk @@ -169027,8 +169210,8 @@ cMZ cMZ cMZ vxX -vxX -vxX +uet +cgu vxX vxX uet @@ -169283,16 +169466,16 @@ nas bbe ycq cMZ -iJT -iJT -iJT -vxX +ipx +dVt +cdl +ipx vxX vxX gMk gMk gMk -fVf +gMk vxX vxX kTV @@ -169542,9 +169725,9 @@ jnw gKt gTf dOg -iJT -iJT -vxX +kqf +ipx +ipx vxX gMk vxX @@ -169800,9 +169983,9 @@ gKt oGQ aIX oSG -iJT -vxX -gMk +tzy +dVt +xCX gMk xUx uet @@ -170058,8 +170241,8 @@ xNo suw fdN tQI -gMk -gMk +xwe +xCX gMk gMk gMk @@ -170313,9 +170496,9 @@ dpp gKt dVp dRh -mWS -iJT -vxX +fdN +xje +ipx vxX gMk gMk @@ -170332,7 +170515,7 @@ vxX vxX vxX gMk -gMk +fJs vxX dtQ vxX @@ -170572,9 +170755,9 @@ dVp vqN mXJ iJT -vxX +ipx uKm -aXH +mWS gMk ent vxX @@ -170826,12 +171009,12 @@ bNp iHH iHH sti -ipx fFg -iJT -vxX +fFg +dhR +ipx vxX -gMk +uet gMk vxX vxX @@ -171085,8 +171268,8 @@ frG dVp dVt dVt -iJT -vxX +ipx +ipx vxX vxX vxX @@ -187285,7 +187468,7 @@ hhX fZF jQS uCr -jEt +ikp hLP cWc wnA diff --git a/_maps/shuttles/pirate_medieval.dmm b/_maps/shuttles/pirate_medieval.dmm index 03441b8a6528d..87b4a42603595 100644 --- a/_maps/shuttles/pirate_medieval.dmm +++ b/_maps/shuttles/pirate_medieval.dmm @@ -1,15 +1,15 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( +"aa" = ( /turf/template_noop, /area/template_noop) -"b" = ( +"ab" = ( /obj/structure/table/wood, /obj/item/stack/sheet/mineral/wood/fifty{ pixel_y = 4 }, /turf/open/floor/stone, /area/shuttle/pirate) -"c" = ( +"ac" = ( /obj/structure/fake_stairs/wood/directional/east, /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/south, @@ -18,7 +18,7 @@ }, /turf/open/floor/stone, /area/shuttle/pirate) -"d" = ( +"ad" = ( /obj/structure/fake_stairs/wood/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -26,7 +26,7 @@ /obj/structure/mineral_door/gold, /turf/open/floor/stone, /area/shuttle/pirate) -"e" = ( +"ae" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, @@ -35,20 +35,20 @@ /obj/effect/mob_spawn/ghost_role/human/pirate/medieval, /turf/open/floor/plating, /area/shuttle/pirate) -"f" = ( +"af" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/random/trash/garbage, /turf/open/floor/plating, /area/shuttle/pirate) -"g" = ( +"ag" = ( /obj/structure/fans/tiny, /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/mineral_door/iron, /turf/open/floor/plating, /area/shuttle/pirate) -"h" = ( +"ah" = ( /obj/structure/table/wood, /obj/item/spear/military{ pixel_y = 8; @@ -64,13 +64,17 @@ }, /turf/open/floor/stone, /area/shuttle/pirate) -"j" = ( +"ai" = ( +/obj/machinery/power/shuttle_engine/propulsion/left, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"aj" = ( /obj/item/flashlight/lantern{ light_on = 1 }, /turf/open/floor/stone, /area/shuttle/pirate) -"k" = ( +"ak" = ( /obj/structure/table/wood, /obj/item/restraints/legcuffs/bola/tactical, /obj/item/restraints/legcuffs/bola/tactical, @@ -80,12 +84,12 @@ /obj/item/restraints/legcuffs/bola, /turf/open/floor/stone, /area/shuttle/pirate) -"l" = ( +"al" = ( /obj/structure/fans/tiny, /obj/structure/mineral_door/iron, /turf/open/floor/stone, /area/shuttle/pirate) -"m" = ( +"am" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/arrows{ @@ -99,11 +103,11 @@ }, /turf/open/floor/plating, /area/shuttle/pirate) -"n" = ( +"an" = ( /obj/effect/decal/cleanable/vomit/old, /turf/open/floor/stone, /area/shuttle/pirate) -"o" = ( +"ao" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/arrows{ @@ -117,17 +121,10 @@ }, /turf/open/floor/plating, /area/shuttle/pirate) -"p" = ( +"ap" = ( /turf/closed/wall/mineral/wood, /area/shuttle/pirate) -"q" = ( -/obj/effect/mob_spawn/ghost_role/human/pirate/medieval/warlord, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/stone, -/area/shuttle/pirate) -"r" = ( +"ar" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, @@ -135,7 +132,7 @@ /obj/effect/mob_spawn/ghost_role/human/pirate/medieval, /turf/open/floor/plating, /area/shuttle/pirate) -"s" = ( +"as" = ( /obj/structure/fans/tiny, /obj/structure/window/reinforced/spawner/directional/east, /obj/docking_port/mobile/pirate{ @@ -152,9 +149,17 @@ width = 17 }, /obj/structure/mineral_door/iron, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/plating, +/area/shuttle/pirate) +"at" = ( +/obj/structure/fans/tiny, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/mineral_door/iron, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating, /area/shuttle/pirate) -"u" = ( +"au" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/blood/gibs/limb, /obj/effect/decal/cleanable/blood/gibs/body, @@ -162,21 +167,21 @@ /obj/item/kitchen/fork, /turf/open/floor/stone, /area/shuttle/pirate) -"v" = ( +"av" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/random/trash/garbage, /turf/open/floor/plating, /area/shuttle/pirate) -"w" = ( +"aw" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, /turf/open/floor/stone, /area/shuttle/pirate) -"x" = ( +"ax" = ( /obj/structure/fake_stairs/wood/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -184,51 +189,56 @@ /obj/structure/mineral_door/gold, /turf/open/floor/stone, /area/shuttle/pirate) -"y" = ( +"ay" = ( /obj/machinery/shuttle_scrambler, /turf/open/floor/stone, /area/shuttle/pirate) -"z" = ( +"az" = ( /obj/structure/fans/tiny, /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/mineral_door/iron, /turf/open/floor/plating, /area/shuttle/pirate) -"A" = ( +"aA" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /obj/item/reagent_containers/cup/glass/bottle/vodka, /turf/open/floor/plating, /area/shuttle/pirate) -"C" = ( +"aB" = ( +/obj/machinery/power/shuttle_engine/heater, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"aC" = ( /obj/machinery/airalarm/directional/west, /obj/effect/mapping_helpers/airalarm/all_access, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/stone, /area/shuttle/pirate) -"D" = ( +"aD" = ( /obj/machinery/piratepad, /turf/open/floor/stone, /area/shuttle/pirate) -"E" = ( +"aE" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /obj/structure/barricade/wooden/crude, /turf/open/floor/stone, /area/shuttle/pirate) -"F" = ( +"aF" = ( /turf/open/floor/stone, /area/shuttle/pirate) -"G" = ( +"aG" = ( /obj/machinery/computer/piratepad_control, /turf/open/floor/stone, /area/shuttle/pirate) -"H" = ( +"aH" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/chair/wood/wings, /turf/open/floor/stone, /area/shuttle/pirate) -"I" = ( +"aI" = ( /obj/structure/fake_stairs/wood/directional/west, /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/south, @@ -237,7 +247,7 @@ }, /turf/open/floor/stone, /area/shuttle/pirate) -"J" = ( +"aJ" = ( /obj/effect/decal/cleanable/blood/gibs/old, /obj/item/food/burger/human, /obj/structure/table/wood, @@ -251,7 +261,7 @@ }, /turf/open/floor/stone, /area/shuttle/pirate) -"K" = ( +"aK" = ( /obj/structure/table/wood, /obj/item/stack/medical/poultice{ pixel_y = 6; @@ -264,13 +274,13 @@ /obj/item/storage/medkit/fire, /turf/open/floor/stone, /area/shuttle/pirate) -"L" = ( +"aL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, /turf/open/floor/stone, /area/shuttle/pirate) -"M" = ( +"aM" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/spawner/random/trash/graffiti, /obj/effect/decal/cleanable/dirt, @@ -278,11 +288,11 @@ /obj/effect/spawner/random/trash/garbage, /turf/open/floor/plating, /area/shuttle/pirate) -"N" = ( +"aN" = ( /obj/machinery/computer/shuttle/pirate/drop_pod, /turf/open/floor/stone, /area/shuttle/pirate) -"O" = ( +"aO" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/fermenting_barrel/thermite, /obj/item/reagent_containers/cup/beaker/large, @@ -290,11 +300,11 @@ /obj/item/reagent_containers/cup/beaker/large, /turf/open/floor/stone, /area/shuttle/pirate) -"P" = ( +"aP" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/stone, /area/shuttle/pirate) -"Q" = ( +"aQ" = ( /obj/structure/closet/cabinet, /obj/item/claymore, /obj/item/shield/kite, @@ -302,42 +312,42 @@ /obj/item/shield/kite, /turf/open/floor/stone, /area/shuttle/pirate) -"R" = ( +"aR" = ( /obj/machinery/atmospherics/components/tank/air{ dir = 1 }, /turf/open/floor/stone, /area/shuttle/pirate) -"S" = ( +"aS" = ( /obj/structure/frame/computer{ anchored = 1 }, /obj/item/assault_pod/medieval, /turf/open/floor/stone, /area/shuttle/pirate) -"T" = ( +"aT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, /turf/open/floor/stone, /area/shuttle/pirate) -"U" = ( +"aU" = ( /obj/machinery/loot_locator, /turf/open/floor/stone, /area/shuttle/pirate) -"V" = ( +"aV" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/shuttle/pirate) -"W" = ( +"aW" = ( /obj/structure/table/wood, /obj/item/radio/intercom{ pixel_y = 5 }, /turf/open/floor/stone, /area/shuttle/pirate) -"X" = ( +"aX" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -356,180 +366,188 @@ }, /turf/open/floor/stone, /area/shuttle/pirate) -"Y" = ( +"aY" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/stone, /area/shuttle/pirate) -"Z" = ( +"aZ" = ( /obj/effect/decal/cleanable/dirt, /obj/item/flashlight/lantern{ light_on = 1 }, /turf/open/floor/stone, /area/shuttle/pirate) +"qA" = ( +/obj/machinery/power/shuttle_engine/propulsion/right, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"HQ" = ( +/obj/effect/mob_spawn/ghost_role/human/pirate/medieval/warlord, +/turf/open/floor/stone, +/area/shuttle/pirate) (1,1,1) = {" -a -a -p -p -l -p -p -p -a +aa +aa +ap +ap +al +ap +aB +ai +aa "} (2,1,1) = {" -a -a -g -f -o -r -A -s -a +aa +aa +ag +af +ao +ar +aA +as +aa "} (3,1,1) = {" -a -a -a -a -I -a -a -a -a +aa +aa +aa +aa +aI +aa +aa +aa +aa "} (4,1,1) = {" -p -p -p -p -x -p -E -p -a +ap +ap +ap +ap +ax +ap +aE +ap +aa "} (5,1,1) = {" -a -E -R -X -T -C -Q -p -p +aa +aE +aR +aX +aT +aC +aQ +ap +ap "} (6,1,1) = {" -p -p -W -F -T -j -Y -h -E +ap +ap +aW +aF +aT +aj +aY +ah +aE "} (7,1,1) = {" -a -E -N -Y -T -Y -F -k -p +aa +aE +aN +aY +aT +aY +aF +ak +ap "} (8,1,1) = {" -V -V -S -P -q -L -F -F -l +aV +aV +aS +aP +aT +aL +HQ +aF +al "} (9,1,1) = {" -a -E -y -F -w -n -H -b -p +aa +aE +ay +aF +aw +an +aH +ab +ap "} (10,1,1) = {" -p -p -U -F -w -Z -u -K -E +ap +ap +aU +aF +aw +aZ +au +aK +aE "} (11,1,1) = {" -a -E -G -D -T -O -J -p -p +aa +aE +aG +aD +aT +aO +aJ +ap +ap "} (12,1,1) = {" -p -p -p -p -d -p -E -p -a +ap +ap +ap +ap +ad +ap +aE +ap +aa "} (13,1,1) = {" -a -a -a -a -c -a -a -a -a +aa +aa +aa +aa +ac +aa +aa +aa +aa "} (14,1,1) = {" -a -a -z -M -m -e -v -z -a +aa +aa +az +aM +am +ae +av +at +aa "} (15,1,1) = {" -a -a -p -p -l -p -p -p -a +aa +aa +ap +ap +al +ap +aB +qA +aa "} diff --git a/_maps/shuttles/ruin_cyborg_mothership.dmm b/_maps/shuttles/ruin_cyborg_mothership.dmm index 86178845e3ab4..cb12e49ee631c 100644 --- a/_maps/shuttles/ruin_cyborg_mothership.dmm +++ b/_maps/shuttles/ruin_cyborg_mothership.dmm @@ -12,7 +12,7 @@ id = "mothership_main" }, /obj/machinery/recycler{ - dir = 8 + dir = 4 }, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) diff --git a/_maps/virtual_domains/fredingtonfastingbear.dmm b/_maps/virtual_domains/fredingtonfastingbear.dmm new file mode 100644 index 0000000000000..a9118edf73487 --- /dev/null +++ b/_maps/virtual_domains/fredingtonfastingbear.dmm @@ -0,0 +1,3196 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aV" = ( +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/powered/virtual_domain) +"bu" = ( +/obj/machinery/oven/range, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/powered/virtual_domain) +"bL" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/mop_bucket/janitorialcart, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/decal/cleanable/greenglow, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"bP" = ( +/obj/structure/sign/poster/official/report_crimes, +/turf/closed/indestructible/reinforced, +/area/virtual_domain/protected_space/fullbright) +"bR" = ( +/obj/machinery/chem_dispenser/drinks/beer, +/obj/structure/table/wood, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"bW" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/table, +/obj/item/food/pizza{ + pixel_y = 6 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"cn" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/item/toy/balloon{ + pixel_x = 7; + pixel_y = 2 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"cp" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/mob/living/basic/bear/snow, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"cY" = ( +/obj/structure/sign/poster/official/no_erp/directional/north, +/obj/structure/sign/poster/official/no_erp/directional/north, +/turf/closed/indestructible/reinforced, +/area/ruin/space/has_grav/powered/virtual_domain) +"dl" = ( +/obj/structure/sign/poster/contraband/blood_geometer/directional/south, +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"dz" = ( +/obj/structure/table/wood, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"dN" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/decal/cleanable/blood/xtracks, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"dV" = ( +/obj/structure/table/glass, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"ex" = ( +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"eE" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/closet/gmcloset, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"eW" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"fd" = ( +/obj/structure/table/wood/poker, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"fo" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/shaker{ + pixel_x = 5 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"fy" = ( +/obj/machinery/stove, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/powered/virtual_domain) +"fz" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/table, +/obj/item/pizzabox/bomb/armed{ + pixel_x = 3; + pixel_y = 6 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"fU" = ( +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"gl" = ( +/obj/structure/sign/poster/contraband/blasto_detergent, +/turf/closed/indestructible/reinforced, +/area/ruin/space/has_grav/powered/virtual_domain) +"gL" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/item/toy/balloon/heart, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/light/built/directional/east, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"hq" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/seclite{ + pixel_y = 9 + }, +/obj/item/flashlight/seclite, +/obj/item/flashlight/seclite{ + pixel_y = 6 + }, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/protected_space/fullbright) +"hI" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/turf/closed/indestructible/reinforced, +/area/ruin/space/has_grav/powered/virtual_domain) +"hK" = ( +/obj/item/trash/popcorn, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"hR" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/table, +/obj/item/food/pizzaslice/mothic_margherita, +/obj/effect/decal/cleanable/confetti, +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"jE" = ( +/obj/structure/sign/poster/abductor/ayy_over_tizira, +/obj/structure/sign/poster/official/the_owl, +/turf/closed/indestructible/reinforced, +/area/virtual_domain/protected_space/fullbright) +"jZ" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/caution/stand_clear, +/obj/structure/fake_stairs/wood{ + dir = 4 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"kf" = ( +/obj/structure/chair/stool/bar/directional/east, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"km" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"kL" = ( +/obj/machinery/light/built/directional/west, +/obj/item/light/tube/broken, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"lc" = ( +/obj/machinery/vending/boozeomat, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"lL" = ( +/obj/structure/table, +/obj/item/kitchen/rollingpin/illegal, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/powered/virtual_domain) +"lP" = ( +/obj/machinery/vending/sovietsoda, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"lS" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"ma" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/table, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"ms" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"mC" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/table, +/obj/item/food/pizza, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"mX" = ( +/obj/machinery/computer/arcade/amputation{ + dir = 1 + }, +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"ng" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"nF" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/turf/open/floor/iron, +/area/virtual_domain/protected_space/fullbright) +"nP" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/closet/gmcloset, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/item/clothing/mask/animal/small/bear/cursed, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"nX" = ( +/obj/structure/chair/sofa/corp/left, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"ob" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/decal/cleanable/greenglow, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"of" = ( +/obj/structure/railing, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"oO" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/chair/greyscale{ + dir = 4 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"pr" = ( +/obj/machinery/light/built/directional/east, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"pK" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"pX" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/item/restraints/legcuffs/beartrap/prearmed, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"ql" = ( +/obj/structure/table/reinforced, +/obj/item/toy/plush/nukeplushie{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/phone{ + base_pixel_w = 4; + pixel_x = -6 + }, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/protected_space/fullbright) +"qK" = ( +/turf/closed/indestructible/fakedoor, +/area/ruin/space/has_grav/powered/virtual_domain) +"rc" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"re" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"ri" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/chair/greyscale{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"rB" = ( +/obj/item/trash/boritos/green{ + pixel_x = 4; + pixel_y = 11 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"rD" = ( +/obj/machinery/door/poddoor{ + id = "door2" + }, +/turf/open/floor/iron/kitchen, +/area/virtual_domain/protected_space/fullbright) +"rY" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"sg" = ( +/obj/structure/sign/poster/contraband/bountyhunters/directional/south, +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"si" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/table, +/obj/item/balloon_mallet, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"sk" = ( +/obj/machinery/computer/slot_machine, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"sl" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/obj/structure/sign/poster/contraband/space_cola/directional/north, +/turf/open/floor/iron, +/area/virtual_domain/protected_space/fullbright) +"sR" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 1 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"td" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/decal/chempuff, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"to" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"tC" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/table, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"tI" = ( +/obj/item/trash/can, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"tN" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"tZ" = ( +/obj/structure/table/wood/poker, +/obj/item/trash/ready_donk, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"ud" = ( +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/protected_space/fullbright) +"ur" = ( +/obj/structure/chair/sofa/corp{ + dir = 1 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"uZ" = ( +/obj/effect/decal/cleanable/food/salt, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/powered/virtual_domain) +"ve" = ( +/turf/closed/indestructible/reinforced, +/area/ruin/space/has_grav/powered/virtual_domain) +"vk" = ( +/obj/structure/railing, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"vm" = ( +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"vs" = ( +/obj/structure/closet/secure_closet/freezer/cream_pie, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/powered/virtual_domain) +"vw" = ( +/mob/living/basic/bear/butter, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"vy" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/decal/cleanable/blood/gibs/down, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"vz" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/iron, +/area/ruin/space/has_grav/powered/virtual_domain) +"vF" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/button/door/directional/west{ + id = "door2" + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"vG" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/powered/virtual_domain) +"vR" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/table, +/obj/item/trash/tray, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"vT" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/chair/greyscale{ + dir = 4 + }, +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"wM" = ( +/obj/item/toy/balloon/heart, +/obj/machinery/light/built/directional/west, +/obj/structure/fake_stairs/wood{ + dir = 1 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"xa" = ( +/obj/structure/railing, +/obj/structure/curtain/cloth/fancy/mechanical/start_closed, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"xk" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/table, +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"xv" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/sign/poster/official/moth_hardhat/directional/west, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"xY" = ( +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"yz" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"yB" = ( +/obj/structure/railing, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"zU" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Ag" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/chair/greyscale{ + dir = 4 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"AF" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/bottle/goldschlager{ + pixel_y = 11; + pixel_x = 7 + }, +/obj/item/reagent_containers/cup/glass/bottle/cognac{ + pixel_x = -4 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Bc" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"Bf" = ( +/obj/effect/spawner/random/trash/graffiti, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Bj" = ( +/obj/machinery/computer/arcade/amputation, +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Bo" = ( +/obj/machinery/door/airlock, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/powered/virtual_domain) +"BU" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/protected_space/fullbright) +"Ce" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/chair/greyscale{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/gibs/up, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Cm" = ( +/turf/template_noop, +/area/space) +"Ct" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/light/built/directional/east, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Dx" = ( +/obj/effect/decal/cleanable/fuel_pool, +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/protected_space/fullbright) +"Dz" = ( +/mob/living/basic/bear/fightpit, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"DV" = ( +/obj/machinery/door, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/protected_space/fullbright) +"EO" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/chair/greyscale{ + dir = 4 + }, +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"EP" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/decal/cleanable/leaper_sludge, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"Fc" = ( +/turf/closed/indestructible/reinforced, +/area/virtual_domain/protected_space/fullbright) +"Fy" = ( +/obj/effect/decal/cleanable/confetti, +/obj/machinery/light/built/directional/west, +/obj/structure/fake_stairs/wood, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"FA" = ( +/obj/effect/decal/cleanable/food/flour, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/powered/virtual_domain) +"Gb" = ( +/obj/item/trash/peanuts, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Gn" = ( +/obj/machinery/light/built/directional/east, +/obj/effect/decal/cleanable/food/tomato_smudge, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/powered/virtual_domain) +"GD" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"GK" = ( +/obj/structure/closet/crate/trashcart/filled, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Hi" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/closet/gmcloset, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Ho" = ( +/obj/effect/decal/cleanable/fuel_pool/hivis, +/mob/living/basic/bear/fightpit, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"HE" = ( +/obj/structure/table/reinforced, +/obj/item/gun/energy/laser{ + pixel_x = -4 + }, +/obj/item/gun/energy/laser{ + pixel_y = 2 + }, +/obj/item/gun/energy/laser{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/machinery/recharger{ + pixel_x = 7; + pixel_y = -1 + }, +/obj/machinery/button/door/directional/east{ + id = "door2" + }, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/protected_space/fullbright) +"HG" = ( +/obj/structure/curtain/cloth/fancy/mechanical, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"If" = ( +/mob/living/basic/bear/russian, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"Io" = ( +/obj/structure/closet/crate/trashcart/filled, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"IX" = ( +/obj/machinery/computer/arcade/amputation, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"IY" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck/syndicate, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Jh" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/table, +/obj/item/food/pizza/energy/raw{ + pixel_x = 3; + pixel_y = 8 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"JD" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"JF" = ( +/obj/modular_map_root/safehouse{ + key = "wood" + }, +/turf/template_noop, +/area/virtual_domain/safehouse) +"JW" = ( +/obj/structure/sign/poster/official/the_owl, +/turf/closed/indestructible/reinforced, +/area/virtual_domain/protected_space/fullbright) +"Ke" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/item/trash/pistachios, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"KJ" = ( +/mob/living/basic/bear/fightpit, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/powered/virtual_domain) +"Ln" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/chair/greyscale{ + dir = 8 + }, +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"LP" = ( +/obj/item/trash/shrimp_chips, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"LU" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/button/door/directional/east{ + id = "door1" + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Mc" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/structure/fake_stairs/wood{ + dir = 8 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Mm" = ( +/obj/structure/chair/stool/bar/directional/north, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Mq" = ( +/obj/structure/sign/poster/contraband/ambrosia_vulgaris/directional/west, +/turf/closed/indestructible/reinforced, +/area/ruin/space/has_grav/powered/virtual_domain) +"ML" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"MO" = ( +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"MS" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/item/toy/balloon{ + pixel_x = 7; + pixel_y = 2 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Ne" = ( +/turf/closed/indestructible/binary, +/area/space) +"Nz" = ( +/obj/structure/sign/poster/official/pda_ad/directional/north, +/turf/closed/indestructible/reinforced, +/area/ruin/space/has_grav/powered/virtual_domain) +"NA" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"NE" = ( +/obj/structure/sign/poster/abductor/ayy_cops/directional/north, +/turf/closed/indestructible/reinforced, +/area/ruin/space/has_grav/powered/virtual_domain) +"Od" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Ox" = ( +/obj/structure/sign/poster/official/the_owl, +/turf/closed/indestructible/reinforced, +/area/ruin/space/has_grav/powered/virtual_domain) +"OB" = ( +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"OD" = ( +/mob/living/basic/bear/russian, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"OM" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/food/salt, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/powered/virtual_domain) +"Pm" = ( +/obj/structure/chair/sofa/corp/right, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"PK" = ( +/obj/structure/curtain/cloth/fancy/mechanical, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"Qg" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/item/toy/balloon/heart, +/obj/machinery/light/built/directional/west, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"RB" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/built/directional/west, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Sp" = ( +/obj/structure/chair/sofa/corp, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Sr" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"SE" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/built/directional/east, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"SW" = ( +/obj/machinery/door/poddoor{ + id = "door1" + }, +/turf/open/floor/iron/kitchen, +/area/virtual_domain/protected_space/fullbright) +"Ti" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/soda{ + pixel_x = 3; + pixel_y = 6 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Tp" = ( +/obj/structure/sign/poster/official/soft_cap_pop_art, +/turf/closed/indestructible/reinforced, +/area/ruin/space/has_grav/powered/virtual_domain) +"Tq" = ( +/turf/open/misc/dirt/jungle, +/area/virtual_domain/fullbright) +"TG" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/chair/greyscale{ + dir = 8 + }, +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"TR" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/decal/cleanable/ants/fire, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"TW" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/mob/living/basic/bear/snow, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Uj" = ( +/obj/structure/curtain/bounty/start_closed, +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"Ux" = ( +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"UR" = ( +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"UW" = ( +/obj/structure/sign/poster/official/no_erp/directional/north, +/turf/closed/indestructible/reinforced, +/area/ruin/space/has_grav/powered/virtual_domain) +"Vd" = ( +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/protected_space/fullbright) +"Ve" = ( +/obj/structure/table, +/obj/item/kitchen/tongs, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/powered/virtual_domain) +"Vs" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/machinery/light/built/directional/west, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"VS" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/camera_advanced, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/protected_space/fullbright) +"VW" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Wj" = ( +/obj/structure/sign/poster/contraband/free_key/directional, +/turf/closed/indestructible/reinforced, +/area/virtual_domain/protected_space/fullbright) +"Wy" = ( +/obj/effect/decal/cleanable/molten_object/large, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"WG" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/chair/greyscale{ + dir = 4 + }, +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"XG" = ( +/obj/machinery/roulette, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Yd" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/chair/greyscale{ + dir = 8 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Ye" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/soda_cans/grey_bull, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"Yy" = ( +/obj/machinery/computer/arcade/amputation{ + dir = 1 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"YK" = ( +/obj/effect/spawner/random/trash, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"YL" = ( +/obj/item/trash/raisins, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"YT" = ( +/obj/machinery/button/door/directional/west{ + id = "door1" + }, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/protected_space/fullbright) +"Zf" = ( +/obj/machinery/deepfryer, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/powered/virtual_domain) +"Zj" = ( +/mob/living/basic/bear/fightpit, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"Zp" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"ZL" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/virtual_domain) +"ZU" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) +"ZZ" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/chair/greyscale{ + dir = 8 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/powered/virtual_domain) + +(1,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(2,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(3,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(4,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Ne +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(5,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(6,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Ne +Uj +Uj +Uj +Uj +Uj +Uj +Uj +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(7,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Ne +Ne +Uj +MO +OB +OB +OB +OB +Uj +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(8,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Ne +Ne +Uj +OB +OB +OB +OB +Zj +Uj +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(9,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Uj +vm +OB +OB +OB +vm +Uj +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(10,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Ne +ve +ve +ve +ve +ve +ve +Ox +ve +ve +ve +ve +ve +OB +OB +OB +ve +ve +Ne +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(11,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Ne +ve +sk +Ux +Ux +kL +Ux +Ux +UR +Ux +Ux +Ux +Fy +EP +ZL +ZL +wM +ve +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(12,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Ne +ve +GK +Gb +Ux +IX +rB +YL +mX +UR +Ux +Ux +Ux +UR +UR +Ux +Ux +ve +Ne +Ne +ve +ve +ve +ve +ve +ve +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(13,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Ne +gl +GK +Ux +Ux +Bj +Ux +Ux +Yy +Bf +Ux +Ux +Ux +Zp +rc +re +Ux +ve +Ne +Ne +ve +Ux +Ux +Ux +Ux +ve +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(14,1,1) = {" +Cm +Cm +Cm +Ne +Ne +Ne +ve +GK +Ux +Ux +Bj +UR +Ux +Yy +Ux +Ux +Ux +Ux +Ke +re +re +Ux +Tp +Ne +Ne +ve +Ux +vw +Ux +Ux +ve +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(15,1,1) = {" +Cm +Ne +Ne +Ne +Ne +Ne +ve +sk +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +re +re +re +Ux +ve +Ne +Ne +ve +Ux +Ux +Ux +Ux +ve +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(16,1,1) = {" +Cm +Ne +Uj +Uj +Uj +Uj +ve +ve +ve +ve +Ux +Ux +Ux +Wy +ve +ve +NE +Ux +Ux +Ux +Ux +Ho +ve +ve +ve +ve +ve +ve +ve +ve +ve +ve +UW +UW +cY +UW +ve +ve +Ne +Ne +Cm +Cm +Cm +Cm +Ne +Ne +Cm +Cm +"} +(17,1,1) = {" +Cm +Ne +Uj +OB +OB +dl +hI +to +Vs +dN +vT +oO +ML +EO +WG +Qg +ve +Ux +xY +Ux +Ux +NA +NA +NA +NA +RB +NA +NA +zU +NA +NA +NA +yz +yz +yz +yz +nP +ve +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Cm +"} +(18,1,1) = {" +Cm +Ne +Uj +OB +OB +OB +xa +jZ +to +eW +bW +ma +to +hR +tC +MS +ve +Ux +XG +XG +Ux +NA +pX +NA +NA +NA +NA +NA +NA +NA +NA +td +yz +LU +yz +ob +bL +ve +Ne +Bc +Bc +Bc +Bc +Bc +JF +Ne +Cm +Cm +"} +(19,1,1) = {" +Cm +Ne +Uj +OB +OB +OB +HG +of +ML +ZU +mC +vR +ML +tC +Jh +to +Ux +Ux +Od +tZ +Ux +TR +ve +ve +ve +ve +ve +ve +ve +Fc +Fc +sl +SW +Fc +Wj +Fc +ve +ve +ve +Bc +Bc +Bc +Bc +Bc +Bc +Ne +Cm +Cm +"} +(20,1,1) = {" +Cm +Ne +Uj +OB +OB +OB +HG +vk +to +ML +Ln +ZZ +to +ZZ +Yd +eW +Ux +hK +fd +Ux +Ux +NA +vz +tI +VW +ve +ex +ex +ex +Fc +hq +ud +Dx +YT +Vd +Fc +Tq +Tq +Tq +Bc +Bc +Bc +Bc +Bc +Bc +Ne +Cm +Cm +"} +(21,1,1) = {" +Cm +Ne +Uj +OB +OB +OB +HG +vk +ML +to +ML +cn +ML +to +ML +ZU +Ux +Ux +fd +Ux +Ux +NA +Ux +Ux +lP +qK +ex +ex +sg +jE +VS +Vd +Vd +Vd +Vd +DV +Tq +Tq +Tq +Bc +Bc +Bc +Bc +Bc +Bc +Ne +Cm +Cm +"} +(22,1,1) = {" +Cm +Ne +Uj +OB +OB +pK +PK +yB +to +ML +EO +Ag +to +Ag +EO +eW +Ux +Ux +fd +Ux +Ux +NA +vz +LP +lc +ve +ex +ex +ex +JW +ql +BU +ud +HE +Vd +Fc +Io +Tq +Tq +Bc +Bc +Bc +Bc +Bc +Bc +Ne +Cm +Cm +"} +(23,1,1) = {" +Cm +Ne +Uj +OB +OB +pK +xa +Mc +JD +ZU +xk +tC +ML +si +ma +ZU +YK +Ux +fd +IY +Ux +NA +ve +ve +ve +ve +ve +ve +ve +Fc +Fc +nF +rD +Fc +bP +Fc +ve +ve +ve +Bc +Bc +Bc +Bc +Bc +Bc +Ne +Cm +Cm +"} +(24,1,1) = {" +Cm +Ne +Uj +OB +OB +If +ve +ML +rY +ML +tC +Jh +to +ma +fz +TW +ve +Ux +XG +XG +Ux +NA +NA +NA +NA +NA +NA +NA +xv +NA +NA +NA +yz +vF +yz +yz +Hi +ve +Ne +Bc +Bc +Bc +Bc +Bc +tN +Ne +Cm +Cm +"} +(25,1,1) = {" +Cm +Ne +Uj +OB +OB +vm +ve +lS +gL +ms +ri +TG +eW +Yd +Ce +Ct +ve +Ux +Ux +Ux +Ux +cp +NA +NA +NA +SE +NA +NA +vy +NA +NA +NA +yz +yz +yz +yz +eE +ve +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Cm +Cm +"} +(26,1,1) = {" +Cm +Ne +Uj +Uj +Uj +Uj +ve +ve +ve +ve +GD +Ux +Ux +Ux +ve +ve +ve +Ux +Ux +Ux +Ux +Ux +ve +ve +ve +ve +ve +ve +qK +ve +ve +Nz +ve +ve +ve +ve +ve +ve +Ne +Ne +Ne +Ne +Cm +Cm +Ne +Cm +Cm +Cm +"} +(27,1,1) = {" +Cm +Ne +Ne +Ne +Ne +Ne +ve +OD +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +ve +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(28,1,1) = {" +Cm +Cm +Ne +Ne +Ne +Ne +ve +kf +kf +kf +kf +kf +kf +Ux +Ux +Ux +Ux +Ux +Pm +Ye +km +Ux +ve +ve +ve +ve +ve +ve +ve +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Ne +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(29,1,1) = {" +Cm +Cm +Cm +Cm +Ne +Ne +ve +dz +dz +dz +dz +dz +dz +Mm +Ux +Ux +Ux +Ux +Sp +dV +ur +Ux +Bo +aV +uZ +KJ +Ve +lL +ve +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(30,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Ne +Mq +bR +Ux +Ux +Ux +Ux +dz +Mm +Ux +Ux +Ux +Dz +nX +Ti +sR +Ux +Bo +aV +aV +FA +aV +OM +ve +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(31,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Ne +ve +lc +Ux +fo +AF +pr +dz +Mm +Ux +Ux +ng +fU +fU +pr +Ux +Ux +ve +ve +ve +vG +aV +Zf +ve +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(32,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Ne +ve +ve +qK +ve +ve +ve +ve +ve +ve +Ux +Sr +ve +ve +ve +ve +ve +ve +Ne +ve +vG +aV +fy +ve +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(33,1,1) = {" +Cm +Cm +Cm +Cm +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +ve +Ux +Sr +ve +Ne +Ne +Ne +Ne +Ne +Ne +ve +vs +Gn +bu +ve +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(34,1,1) = {" +Cm +Cm +Cm +Cm +Ne +Ne +ve +ve +ve +ve +ve +ve +ve +ve +ve +Ux +Ux +ve +ve +ve +ve +ve +ve +Ne +ve +ve +ve +ve +ve +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(35,1,1) = {" +Cm +Cm +Cm +Cm +Ne +Ne +ve +Ux +Ux +Ux +Ux +Ux +Dz +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +ve +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(36,1,1) = {" +Cm +Cm +Cm +Cm +Ne +Ne +ve +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +Ux +ve +Ne +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(37,1,1) = {" +Cm +Cm +Cm +Cm +Ne +Ne +ve +ve +ve +qK +qK +ve +ve +ve +ve +ve +ve +ve +ve +qK +qK +ve +ve +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(38,1,1) = {" +Cm +Cm +Cm +Cm +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(39,1,1) = {" +Cm +Cm +Cm +Ne +Ne +Ne +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(40,1,1) = {" +Cm +Cm +Cm +Cm +Ne +Ne +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(41,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Ne +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(42,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} +(43,1,1) = {" +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +Cm +"} diff --git a/code/__DEFINES/cleaning.dm b/code/__DEFINES/cleaning.dm index 79708cd152b62..1db2a9d31aaa9 100644 --- a/code/__DEFINES/cleaning.dm +++ b/code/__DEFINES/cleaning.dm @@ -1,8 +1,17 @@ // Cleaning flags -///Whether we should not attempt to clean. -#define DO_NOT_CLEAN "do_not_clean" +/// Return to prevent clean attempts +#define CLEAN_BLOCKED (1<<0) +/// Return to allow clean attempts +/// This is (currently) the same as returning null / none but more explicit +#define CLEAN_ALLOWED (1<<1) +/// Return to prevent XP gain +/// Only does anything if [CLEAN_ALLOWED] is also returned +#define CLEAN_NO_XP (1<<2) +/// Return to stop cleaner component from blocking interaction chain further +/// Only does anything if [CLEAN_BLOCKED] is also returned +#define CLEAN_DONT_BLOCK_INTERACTION (1<<3) // Different kinds of things that can be cleaned. // Use these when overriding the wash proc or registering for the clean signals to check if your thing should be cleaned diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 3d6a03052f497..6246e25e93b56 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -319,13 +319,6 @@ GLOBAL_LIST_INIT(leg_zones, list(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) /// Proceed with the attack chain, but don't call the normal methods. #define SECONDARY_ATTACK_CONTINUE_CHAIN 3 -/// Flag for when /afterattack potentially acts on an item. -/// Used for the swap hands/drop tutorials to know when you might just be trying to do something normally. -/// Does not necessarily imply success, or even that it did hit an item, just intent. -// This is intentionally not (1 << 0) because some stuff currently erroneously returns TRUE/FALSE for afterattack. -// Doesn't need to be set if proximity flag is FALSE. -#define AFTERATTACK_PROCESSED_ITEM (1 << 1) - //Autofire component /// Compatible firemode is in the gun. Wait until it's held in the user hands. #define AUTOFIRE_STAT_IDLE (1<<0) @@ -388,6 +381,9 @@ GLOBAL_LIST_INIT(leg_zones, list(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) ///If the obstacle is an object at the border of the turf (so no signal from being sent to the other turf) #define SHOVE_DIRECTIONAL_BLOCKED (1<<6) +///Bitfield returned by listeners for COMSIG_CARBON_ENTER_STAMCRIT when they perform some action that prevents a mob going into stamcrit. +#define STAMCRIT_CANCELLED (1<<0) + ///Deathmatch lobby current status #define DEATHMATCH_NOT_PLAYING 0 #define DEATHMATCH_PRE_PLAYING 1 diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm index f79f91ff641b0..5c5c2aefa6c25 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm @@ -6,7 +6,7 @@ #define COMSIG_ATOM_ATTACKBY "atom_attackby" /// From base of [atom/proc/attacby_secondary()]: (/obj/item/weapon, /mob/user, params) #define COMSIG_ATOM_ATTACKBY_SECONDARY "atom_attackby_secondary" -///from [/item/afterattack()], sent by an atom which was just attacked by an item: (/obj/item/weapon, /mob/user, proximity_flag, click_parameters) +/// From [/item/attack()], sent by an atom which was just attacked by an item: (/obj/item/weapon, /mob/user, proximity_flag, click_parameters) #define COMSIG_ATOM_AFTER_ATTACKEDBY "atom_after_attackby" /// From base of [/atom/proc/attack_hand_secondary]: (mob/user, list/modifiers) - Called when the atom receives a secondary unarmed attack. #define COMSIG_ATOM_ATTACK_HAND_SECONDARY "atom_attack_hand_secondary" diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm index 06d372ceb0d33..ae06585ae5f49 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm @@ -15,8 +15,8 @@ #define COMSIG_CLICK_CTRL "ctrl_click" ///from base of atom/AltClick(): (/mob) #define COMSIG_CLICK_ALT "alt_click" -///from base of atom/alt_click_secondary(): (/mob) -#define COMSIG_CLICK_ALT_SECONDARY "alt_click_secondary" +///from base of atom/base_click_alt_secondary(): (/mob) +#define COMSIG_CLICK_ALT_SECONDARY "click_alt_secondary" #define COMPONENT_CANCEL_CLICK_ALT_SECONDARY (1<<0) ///from base of atom/CtrlShiftClick(/mob) #define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm index f6f7f6e4a291c..6448be3fecb74 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm @@ -56,6 +56,8 @@ /// Args: (mob/living/user, obj/item/tool, list/modifiers) /// Return any ITEM_INTERACT_ flags as relevant (see tools.dm) #define COMSIG_ATOM_ITEM_INTERACTION_SECONDARY "atom_item_interaction_secondary" +/// Sent from [atom/proc/item_interaction], to a mob clicking on an atom with an item +#define COMSIG_USER_ITEM_INTERACTION "user_item_interaction" /// Sent from [atom/proc/item_interaction], to an item clicking on an atom /// Args: (mob/living/user, atom/interacting_with, list/modifiers) /// Return any ITEM_INTERACT_ flags as relevant (see tools.dm) @@ -64,6 +66,8 @@ /// Args: (mob/living/user, atom/interacting_with, list/modifiers) /// Return any ITEM_INTERACT_ flags as relevant (see tools.dm) #define COMSIG_ITEM_INTERACTING_WITH_ATOM_SECONDARY "item_interacting_with_atom_secondary" +/// Sent from [atom/proc/item_interaction], when this atom is right-clicked on by a mob with a tool +#define COMSIG_USER_ITEM_INTERACTION_SECONDARY "user_item_interaction_secondary" /// Sent from [atom/proc/item_interaction], when this atom is left-clicked on by a mob with a tool of a specific tool type /// Args: (mob/living/user, obj/item/tool, list/recipes) /// Return any ITEM_INTERACT_ flags as relevant (see tools.dm) @@ -72,3 +76,20 @@ /// Args: (mob/living/user, obj/item/tool) /// Return any ITEM_INTERACT_ flags as relevant (see tools.dm) #define COMSIG_ATOM_SECONDARY_TOOL_ACT(tooltype) "tool_secondary_act_[tooltype]" + +/// Sent from [atom/proc/ranged_item_interaction], when this atom is left-clicked on by a mob with an item while not adjacent +#define COMSIG_ATOM_RANGED_ITEM_INTERACTION "atom_ranged_item_interaction" +/// Sent from [atom/proc/ranged_item_interaction], when this atom is right-clicked on by a mob with an item while not adjacent +#define COMSIG_ATOM_RANGED_ITEM_INTERACTION_SECONDARY "atom_ranged_item_interaction_secondary" +/// Sent from [atom/proc/ranged_item_interaction], when a mob is using this item while left-clicking on by an atom while not adjacent +#define COMSIG_RANGED_ITEM_INTERACTING_WITH_ATOM "ranged_item_interacting_with_atom" +/// Sent from [atom/proc/ranged_item_interaction], when a mob is using this item while right-clicking on by an atom while not adjacent +#define COMSIG_RANGED_ITEM_INTERACTING_WITH_ATOM_SECONDARY "ranged_item_interacting_with_atom_secondary" + +/// Sent from [atom/proc/item_interaction], when this atom is used as a tool and an event occurs +#define COMSIG_ITEM_TOOL_ACTED "tool_item_acted" + +/// This is sent via item interaction (IE, item clicking on atom) right before the item's inserted into the atom's storage +/// Args: (obj/item/inserting, mob/living/user) +#define COMSIG_ATOM_STORAGE_ITEM_INTERACT_INSERT "atom_storage_item_interact_insert" + #define BLOCK_STORAGE_INSERT (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_heretic.dm b/code/__DEFINES/dcs/signals/signals_heretic.dm index a80526f96ab4f..bce4269720ccf 100644 --- a/code/__DEFINES/dcs/signals/signals_heretic.dm +++ b/code/__DEFINES/dcs/signals/signals_heretic.dm @@ -1,15 +1,15 @@ /// Heretic signals -/// From /obj/item/melee/touch_attack/mansus_fist/on_mob_hit : (mob/living/source, mob/living/target) +/// From /datum/action/cooldown/spell/touch/mansus_grasp/cast_on_hand_hit : (mob/living/source, mob/living/target) #define COMSIG_HERETIC_MANSUS_GRASP_ATTACK "mansus_grasp_attack" /// Default behavior is to use the hand, so return this to blocks the mansus fist from being consumed after use. #define COMPONENT_BLOCK_HAND_USE (1<<0) -/// From /obj/item/melee/touch_attack/mansus_fist/afterattack_secondary : (mob/living/source, atom/target) +/// From /datum/action/cooldown/spell/touch/mansus_grasp/cast_on_secondary_hand_hit : (mob/living/source, atom/target) #define COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY "mansus_grasp_attack_secondary" /// Default behavior is to continue attack chain and do nothing else, so return this to use up the hand after use. #define COMPONENT_USE_HAND (1<<0) -/// From /obj/item/melee/sickly_blade/afterattack (with proximity) : (mob/living/source, mob/living/target) +/// From /obj/item/melee/sickly_blade/afterattack : (mob/living/source, mob/living/target) #define COMSIG_HERETIC_BLADE_ATTACK "blade_attack" -/// From /obj/item/melee/sickly_blade/afterattack (without proximity) : (mob/living/source, mob/living/target) +/// From /obj/item/melee/sickly_blade/ranged_interact_with_atom (without proximity) : (mob/living/source, mob/living/target) #define COMSIG_HERETIC_RANGED_BLADE_ATTACK "ranged_blade_attack" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index cf6a5a12ef7cc..1515c8b7347ff 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -43,10 +43,12 @@ #define COMSIG_LIVING_SET_BUCKLED "living_set_buckled" ///from base of mob/living/set_body_position() #define COMSIG_LIVING_SET_BODY_POSITION "living_set_body_position" +/// Sent to a mob being injected with a syringe when the do_after initiates +#define COMSIG_LIVING_TRY_SYRINGE_INJECT "living_try_syringe_inject" +/// Sent to a mob being withdrawn from with a syringe when the do_after initiates +#define COMSIG_LIVING_TRY_SYRINGE_WITHDRAW "living_try_syringe_withdraw" ///from base of mob/living/set_usable_legs() #define COMSIG_LIVING_LIMBLESS_SLOWDOWN "living_limbless_slowdown" -///From post-can inject check of syringe after attack (mob/user) -#define COMSIG_LIVING_TRY_SYRINGE "living_try_syringe" ///From living/Life(). (deltatime, times_fired) #define COMSIG_LIVING_LIFE "living_life" /// Block the Life() proc from proceeding... this should really only be done in some really wacky situations. diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index 7fce084dc2f11..1735619967154 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -181,10 +181,6 @@ #define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" ///from base of /obj/item/attack(): (mob/M, mob/user) #define COMSIG_MOB_ITEM_ATTACK "mob_item_attack" -///from base of obj/item/afterattack(): (atom/target, obj/item/weapon, proximity_flag, click_parameters) -#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" -///from base of obj/item/afterattack_secondary(): (atom/target, obj/item/weapon, proximity_flag, click_parameters) -#define COMSIG_MOB_ITEM_AFTERATTACK_SECONDARY "mob_item_afterattack_secondary" ///from base of mob/RangedAttack(): (atom/A, modifiers) #define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" ///from base of mob/ranged_secondary_attack(): (atom/target, modifiers) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index d7e895221d0e0..d92408f2192e7 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -9,7 +9,7 @@ #define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench" ///from base of /turf/proc/levelupdate(). (intact) true to hide and false to unhide #define COMSIG_OBJ_HIDE "obj_hide" -/// from /obj/item/toy/crayon/spraycan/afterattack: (user, spraycan, color_is_dark) +/// from /obj/item/toy/crayon/spraycan/use_on: (user, spraycan, color_is_dark) #define COMSIG_OBJ_PAINTED "obj_painted" #define DONT_USE_SPRAYCAN_CHARGES (1<<0) /// from /obj/obj_reskin: (mob/user, skin) @@ -161,9 +161,6 @@ /// Return to prevent the default behavior (attack_selfing) from ocurring. #define COMPONENT_ITEM_ACTION_SLOT_INVALID (1<<0) -/// Sent from /obj/item/attack_atom(): (atom/attacked_atom, mob/living/user) -#define COMSIG_ITEM_POST_ATTACK_ATOM "item_post_attack_atom" - ///from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone) #define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" ///from base of obj/item/hit_reaction(): (owner, hitby, attack_text, final_block_chance, damage, attack_type, damage_type) @@ -208,7 +205,7 @@ #define COMSIG_STACK_CAN_MERGE "stack_can_merge" #define CANCEL_STACK_MERGE (1<<0) -///from /obj/item/book/bible/afterattack(): (mob/user, proximity) +///from /obj/item/book/bible/interact_with_atom(): (mob/user) #define COMSIG_BIBLE_SMACKED "bible_smacked" ///stops the bible chain from continuing. When all of the effects of the bible smacking have been moved to a signal we can kill this #define COMSIG_END_BIBLE_CHAIN (1<<0) @@ -450,8 +447,6 @@ ///from base of /obj/item/attack(): (mob/living, mob/living, params) #define COMSIG_ITEM_ATTACK "item_attack" -///from base of /obj/item/attack(): (mob/living, mob/living, params) -#define COMSIG_ITEM_POST_ATTACK "item_post_attack" // called only if the attack was executed ///from base of obj/item/attack_self(): (/mob) #define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self_secondary(): (/mob) @@ -467,14 +462,8 @@ #define COMPONENT_SECONDARY_CALL_NORMAL_ATTACK_CHAIN (1<<2) /// From base of [/obj/item/proc/attack_secondary()]: (atom/target, mob/user, params) #define COMSIG_ITEM_ATTACK_SECONDARY "item_attack_secondary" -///from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) +///from base of [obj/item/attack()]: (atom/target, mob/user, proximity_flag, click_parameters) #define COMSIG_ITEM_AFTERATTACK "item_afterattack" - /// Flag for when /afterattack potentially acts on an item. - /// Used for the swap hands/drop tutorials to know when you might just be trying to do something normally. - /// Does not necessarily imply success, or even that it did hit an item, just intent. - #define COMPONENT_AFTERATTACK_PROCESSED_ITEM (1<<0) -///from base of obj/item/afterattack_secondary(): (atom/target, mob/user, proximity_flag, click_parameters) -#define COMSIG_ITEM_AFTERATTACK_SECONDARY "item_afterattack_secondary" ///from base of obj/item/embedded(): (atom/target, obj/item/bodypart/part) #define COMSIG_ITEM_EMBEDDED "item_embedded" ///from base of datum/component/embedded/safeRemove(): (mob/living/carbon/victim) @@ -495,7 +484,7 @@ ///from base of /obj/item/mmi/set_brainmob(): (mob/living/brain/new_brainmob) #define COMSIG_MMI_SET_BRAINMOB "mmi_set_brainmob" -/// from base of /obj/item/slimepotion/speed/afterattack(): (obj/target, /obj/src, mob/user) +/// from base of /obj/item/slimepotion/speed/interact_with_atom(): (obj/target, /obj/src, mob/user) #define COMSIG_SPEED_POTION_APPLIED "speed_potion" #define SPEED_POTION_STOP (1<<0) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 7032e4b9a2338..0ca23dcf23a10 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -161,8 +161,6 @@ #define HUMAN_MAX_OXYLOSS 3 #define HUMAN_CRIT_MAX_OXYLOSS (SSMOBS_DT/3) -#define STAMINA_REGEN_BLOCK_TIME (10 SECONDS) - #define HEAT_DAMAGE_LEVEL_1 1 //Amount of damage applied when your body temperature just passes the 360.15k safety point #define HEAT_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 400K point #define HEAT_DAMAGE_LEVEL_3 4 //Amount of damage applied when your body temperature passes the 460K point and you are on fire diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 2989310fb9b73..51a995c90e100 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -142,3 +142,17 @@ /// The key used for sprite accessories that should never actually be applied to the player. #define SPRITE_ACCESSORY_NONE "None" + +// Loadout +/// Used to make something not recolorable even if it's capable +#define DONT_GREYSCALE -1 +// Loadout item info keys +// Changing these will break existing loadouts +/// Tracks GAGS color information +#define INFO_GREYSCALE "greyscale" +/// Used to set custom names +#define INFO_NAMED "name" +/// Used for specific alt-reskins, like the pride pin +#define INFO_RESKIN "reskin" +/// Handles which layer the item will be on, for accessories +#define INFO_LAYER "layer" diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm index 3e78ecf40d032..7809610e6abec 100644 --- a/code/__DEFINES/tools.dm +++ b/code/__DEFINES/tools.dm @@ -31,6 +31,8 @@ /// Return to prevent the rest of the attack chain from being executed / preventing the item user from thwacking the target. /// Similar to [ITEM_INTERACT_SUCCESS], but does not necessarily indicate success. #define ITEM_INTERACT_BLOCKING (1<<1) + /// Only for people who get confused by the naming scheme + #define ITEM_INTERACT_FAILURE ITEM_INTERACT_BLOCKING /// Return to skip the rest of the interaction chain, going straight to attack. #define ITEM_INTERACT_SKIP_TO_ATTACK (1<<2) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 457f7dfe45183..17d9008a543b3 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -1151,4 +1151,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Does this item bypass ranged armor checks? #define TRAIT_BYPASS_RANGED_ARMOR "bypass_ranged_armor" +/// This item cannot be selected for or used by a theft objective (Spies, Traitors, etc.) +#define TRAIT_ITEM_OBJECTIVE_BLOCKED "item_objective_blocked" + // END TRAIT DEFINES diff --git a/code/__HELPERS/atoms.dm b/code/__HELPERS/atoms.dm index 406ea75143c66..cb1e2a87f767e 100644 --- a/code/__HELPERS/atoms.dm +++ b/code/__HELPERS/atoms.dm @@ -325,3 +325,14 @@ rough example of the "cone" made by the 3 dirs checked "x" = icon_width > world.icon_size && pixel_x != 0 ? (icon_width - world.icon_size) * 0.5 : 0, "y" = icon_height > world.icon_size && pixel_y != 0 ? (icon_height - world.icon_size) * 0.5 : 0, ) + +/** + * Called before an item is put into this atom's storage datum via the item clicking on this atom + * + * This can be used to add item-atom interactions that you want handled before inserting something into storage + * (But it's also fairly snowflakey) + * + * Returning FALSE will block that item from being put into our storage + */ +/atom/proc/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) + return TRUE diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 94349d689de66..1fe465da39f0d 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -522,6 +522,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_HAUNTED" = TRAIT_HAUNTED, "TRAIT_HONKSPAMMING" = TRAIT_HONKSPAMMING, "TRAIT_INNATELY_FANTASTICAL_ITEM" = TRAIT_INNATELY_FANTASTICAL_ITEM, + "TRAIT_ITEM_OBJECTIVE_BLOCKED" = TRAIT_ITEM_OBJECTIVE_BLOCKED, "TRAIT_NEEDS_TWO_HANDS" = TRAIT_NEEDS_TWO_HANDS, "TRAIT_NO_BARCODES" = TRAIT_NO_BARCODES, "TRAIT_NO_STORAGE_INSERT" = TRAIT_NO_STORAGE_INSERT, diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index ff0da9caa5ed0..0caa2fff50f53 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -53,11 +53,10 @@ /** * Standard mob ClickOn() - * Handles exceptions: Buildmode, middle click, modified clicks, mech actions * * After that, mostly just check your state, check whether you're holding an item, - * check whether you're adjacent to the target, then pass off the click to whoever - * is receiving it. + * check whether you're adjacent to the target, then pass off the click to whoever is receiving it. + * * The most common are: * * [mob/proc/UnarmedAttack] (atom,adjacent) - used here only when adjacent, with no item in hand; in the case of humans, checks gloves * * [atom/proc/attackby] (item,user) - used only when adjacent @@ -167,13 +166,7 @@ UnarmedAttack(A, TRUE, modifiers) else if(W) - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - var/after_attack_secondary_result = W.afterattack_secondary(A, src, FALSE, params) - - if(after_attack_secondary_result == SECONDARY_ATTACK_CALL_NORMAL) - W.afterattack(A, src, FALSE, params) - else - W.afterattack(A, src, FALSE, params) + A.base_ranged_item_interaction(src, W, modifiers) else if(LAZYACCESS(modifiers, RIGHT_CLICK)) ranged_secondary_attack(A, modifiers) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index b16d74550a96d..026376a9af562 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -84,13 +84,7 @@ W.melee_attack_chain(src, A, params) return else if(isturf(A) || isturf(A.loc)) - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - var/after_attack_secondary_result = W.afterattack_secondary(A, src, FALSE, params) - - if(after_attack_secondary_result == SECONDARY_ATTACK_CALL_NORMAL) - W.afterattack(A, src, FALSE, params) - else - W.afterattack(A, src, FALSE, params) + A.base_ranged_item_interaction(src, W, modifiers) //Give cyborgs hotkey clicks without breaking existing uses of hotkey clicks // for non-doors/apcs diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 18e9fa12a660a..bb4cf4cd0299b 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -17,6 +17,8 @@ if(item_interact_result & ITEM_INTERACT_BLOCKING) return FALSE + // At this point it means we're not doing a non-combat interaction so let's just try to bash it + var/pre_attack_result if (is_right_clicking) switch (pre_attack_secondary(target, user, params)) @@ -34,8 +36,9 @@ if(pre_attack_result) return TRUE - var/attackby_result + // At this point the attack is really about to happen + var/attackby_result if (is_right_clicking) switch (target.attackby_secondary(src, user, params)) if (SECONDARY_ATTACK_CALL_NORMAL) @@ -50,24 +53,19 @@ attackby_result = target.attackby(src, user, params) if (attackby_result) + // This means the attack failed or was handled for whatever reason return TRUE - if (is_right_clicking) - var/after_attack_secondary_result = afterattack_secondary(target, user, TRUE, params) - - // There's no chain left to continue at this point, so CANCEL_ATTACK_CHAIN and CONTINUE_CHAIN are functionally the same. - if (after_attack_secondary_result == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || after_attack_secondary_result == SECONDARY_ATTACK_CONTINUE_CHAIN) - return TRUE + // At this point it means the attack was "successful", or at least unhandled, in some way + // This can mean nothing happened, this can mean the target took damage, etc. - var/afterattack_result = afterattack(target, user, TRUE, params) - - if (!(afterattack_result & AFTERATTACK_PROCESSED_ITEM) && isitem(target)) - if (isnull(user.get_inactive_held_item())) + if(user.client && isitem(target)) + if(isnull(user.get_inactive_held_item())) SStutorials.suggest_tutorial(user, /datum/tutorial/switch_hands, params2list(params)) else SStutorials.suggest_tutorial(user, /datum/tutorial/drop, params2list(params)) - return afterattack_result & TRUE //this is really stupid but its needed because afterattack can return TRUE | FLAGS. + return TRUE /// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. /obj/item/proc/attack_self(mob/user, modifiers) @@ -160,16 +158,6 @@ return attacking_item.attack_atom(src, user, params) /mob/living/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - // Surgery and such happens very high up in the interaction chain, before parent call - var/attempt_tending = item_tending(user, tool, modifiers) - if(attempt_tending & ITEM_INTERACT_ANY_BLOCKER) - return attempt_tending - - return ..() | attempt_tending - -/// Handles any use of using a surgical tool or item on a mob to tend to them. -/// The sole reason this is a separate proc is so carbons can tend wounds AFTER the check for surgery. -/mob/living/proc/item_tending(mob/living/user, obj/item/tool, list/modifiers) for(var/datum/surgery/operation as anything in surgeries) if(IS_IN_INVALID_SURGICAL_POSITION(src, operation)) continue @@ -211,21 +199,21 @@ if(signal_return & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE if(signal_return & COMPONENT_SKIP_ATTACK) - return + return FALSE SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, target_mob, user, params) if(item_flags & NOBLUDGEON) - return + return FALSE if(damtype != STAMINA && force && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to harm other living beings!")) - return + return FALSE if(!force && !HAS_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND)) - playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), TRUE, -1) + playsound(src, 'sound/weapons/tap.ogg', get_clamped_volume(), TRUE, -1) else if(hitsound) - playsound(loc, hitsound, get_clamped_volume(), TRUE, extrarange = stealthy_audio ? SILENCED_SOUND_EXTRARANGE : -1, falloff_distance = 0) + playsound(src, hitsound, get_clamped_volume(), TRUE, extrarange = stealthy_audio ? SILENCED_SOUND_EXTRARANGE : -1, falloff_distance = 0) target_mob.lastattacker = user.real_name target_mob.lastattackerckey = user.ckey @@ -233,14 +221,18 @@ if(force && target_mob == user && user.client) user.client.give_award(/datum/award/achievement/misc/selfouch, user) - user.do_attack_animation(target_mob) + if(get(src, /mob/living) == user) // telekinesis. + user.do_attack_animation(target_mob) if(!target_mob.attacked_by(src, user)) return TRUE - SEND_SIGNAL(src, COMSIG_ITEM_POST_ATTACK, target_mob, user, params) + SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target_mob, user, params) + SEND_SIGNAL(target_mob, COMSIG_ATOM_AFTER_ATTACKEDBY, src, user, params) + afterattack(target_mob, user, params) log_combat(user, target_mob, "attacked", src.name, "(COMBAT MODE: [uppertext(user.combat_mode)]) (DAMTYPE: [uppertext(damtype)])") add_fingerprint(user) + return FALSE // unhandled /// The equivalent of [/obj/item/proc/attack] but for alternate attacks, AKA right clicking /obj/item/proc/attack_secondary(mob/living/victim, mob/living/user, params) @@ -256,14 +248,21 @@ /// The equivalent of the standard version of [/obj/item/proc/attack] but for non mob targets. /obj/item/proc/attack_atom(atom/attacked_atom, mob/living/user, params) - if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_ATOM, attacked_atom, user) & COMPONENT_CANCEL_ATTACK_CHAIN) - return + var/signal_return = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_ATOM, attacked_atom, user) + if(signal_return & COMPONENT_SKIP_ATTACK) + return TRUE + if(signal_return & COMPONENT_CANCEL_ATTACK_CHAIN) + return FALSE if(item_flags & NOBLUDGEON) - return + return FALSE user.changeNext_move(attack_speed) - user.do_attack_animation(attacked_atom) + if(get(src, /mob/living) == user) // telekinesis. + user.do_attack_animation(attacked_atom) attacked_atom.attacked_by(src, user) - SEND_SIGNAL(src, COMSIG_ITEM_POST_ATTACK_ATOM, attacked_atom, user) + SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, attacked_atom, user, params) + SEND_SIGNAL(attacked_atom, COMSIG_ATOM_AFTER_ATTACKEDBY, src, user, params) + afterattack(attacked_atom, user, params) + return FALSE // unhandled /// Called from [/obj/item/proc/attack_atom] and [/obj/item/proc/attack] if the attack succeeds /atom/proc/attacked_by(obj/item/attacking_item, mob/living/user) @@ -443,33 +442,9 @@ * * proximity_flag - is 1 if this afterattack was called on something adjacent, in your square, or on your person. * * click_parameters - is the params string from byond [/atom/proc/Click] code, see that documentation. */ -/obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = NONE - . |= SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters) - SEND_SIGNAL(user, COMSIG_MOB_ITEM_AFTERATTACK, target, src, proximity_flag, click_parameters) - SEND_SIGNAL(target, COMSIG_ATOM_AFTER_ATTACKEDBY, src, user, proximity_flag, click_parameters) - return . - -/** - * Called at the end of the attack chain if the user right-clicked. - * - * Arguments: - * * atom/target - The thing that was hit - * * mob/user - The mob doing the hitting - * * proximity_flag - is 1 if this afterattack was called on something adjacent, in your square, or on your person. - * * click_parameters - is the params string from byond [/atom/proc/Click] code, see that documentation. - */ -/obj/item/proc/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK_SECONDARY, target, user, proximity_flag, click_parameters) - SEND_SIGNAL(user, COMSIG_MOB_ITEM_AFTERATTACK_SECONDARY, target, src, proximity_flag, click_parameters) - - if(signal_result & COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - if(signal_result & COMPONENT_SECONDARY_CONTINUE_ATTACK_CHAIN) - return SECONDARY_ATTACK_CONTINUE_CHAIN - - return SECONDARY_ATTACK_CALL_NORMAL +/obj/item/proc/afterattack(atom/target, mob/user, click_parameters) + PROTECTED_PROC(TRUE) + return /obj/item/proc/get_clamped_volume() if(w_class) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index c0ef2b6001f44..bdbf6ab0a024a 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -71,7 +71,7 @@ /obj/item/attack_self_tk(mob/user) if(attack_self(user)) - return COMPONENT_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING /atom/proc/attack_self_secondary_tk(mob/user) return @@ -79,7 +79,7 @@ /obj/item/attack_self_secondary_tk(mob/user) if(attack_self_secondary(user)) - return COMPONENT_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING /* @@ -146,80 +146,44 @@ if(QDELING(focus)) qdel(src) return - if(focus.attack_self_tk(user) & COMPONENT_CANCEL_ATTACK_CHAIN) + if(focus.attack_self_tk(user) & ITEM_INTERACT_ANY_BLOCKER) . = TRUE update_appearance() +/obj/item/tk_grab/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return ranged_interact_with_atom(interacting_with, user, modifiers) -/obj/item/tk_grab/afterattack(atom/target, mob/living/carbon/user, proximity, params)//TODO: go over this - . = ..() - if(.) - return - - if(!target || !user) - return - +/obj/item/tk_grab/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!focus) - focus_object(target) - return TRUE + focus_object(interacting_with) + return ITEM_INTERACT_BLOCKING if(!check_if_focusable(focus)) - return + return NONE - if(target == focus) - if(target.attack_self_tk(user) & COMPONENT_CANCEL_ATTACK_CHAIN) - . = TRUE - update_appearance() - return + if(interacting_with == focus) + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + . = focus.attack_self_secondary_tk(user) || NONE + else + . = interacting_with.attack_self_tk(user) || NONE - if(isitem(focus)) - var/obj/item/I = focus + else if(isitem(focus)) + var/obj/item/focused_item = focus apply_focus_overlay() - if(target.Adjacent(focus)) - . = I.melee_attack_chain(tk_user, target, params) //isn't copying the attack chain fun. we should do it more often. + if(interacting_with.Adjacent(focus)) + . = focused_item.melee_attack_chain(user, interacting_with, list2params(modifiers)) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING if(check_if_focusable(focus)) - focus.do_attack_animation(target, null, focus) - else if(isgun(I)) //I've only tested this with guns, and it took some doing to make it work - . = I.afterattack(target, tk_user, 0, params) - . |= AFTERATTACK_PROCESSED_ITEM - - user.changeNext_move(CLICK_CD_MELEE) - update_appearance() - return . - -/obj/item/tk_grab/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return - - if(!target || !user) - return - - if(!focus) - focus_object(target) - return TRUE - - if(!check_if_focusable(focus)) - return - - if(target == focus) - if(target.attack_self_secondary_tk(user) & COMPONENT_CANCEL_ATTACK_CHAIN) - . = TRUE - update_appearance() - return + focus.do_attack_animation(interacting_with, null, focus) - if(isitem(focus)) - var/obj/item/I = focus - apply_focus_overlay() - if(target.Adjacent(focus)) - . = I.melee_attack_chain(tk_user, target, click_parameters) //isn't copying the attack chain fun. we should do it more often. - if(check_if_focusable(focus)) - focus.do_attack_animation(target, null, focus) - else if(isgun(I)) //I've only tested this with guns, and it took some doing to make it work - . = I.afterattack_secondary(target, tk_user, 0, click_parameters) + // isgun check lets us shoot guns at range + // quoting the old comment: "I've only tested this with guns, and it took some doing to make it work" + // reader beware if trying to add other snowflake cases + else if(isgun(focused_item)) + . = interacting_with.base_ranged_item_interaction(user, focus, modifiers) user.changeNext_move(CLICK_CD_MELEE) update_appearance() + return . /obj/item/tk_grab/on_thrown(mob/living/carbon/user, atom/target) if(!target || !user) @@ -232,7 +196,7 @@ return if(target == focus) - if(target.attack_self_tk(user) & COMPONENT_CANCEL_ATTACK_CHAIN) + if(target.attack_self_tk(user) & ITEM_INTERACT_ANY_BLOCKER) return update_appearance() return diff --git a/code/controllers/subsystem/dynamic/dynamic.dm b/code/controllers/subsystem/dynamic/dynamic.dm index e23fc7e64db7a..e34b0c7e446c0 100644 --- a/code/controllers/subsystem/dynamic/dynamic.dm +++ b/code/controllers/subsystem/dynamic/dynamic.dm @@ -385,12 +385,14 @@ SUBSYSTEM_DEF(dynamic) advisory_string += "Advisory Level: Pulsar Star
" advisory_string += "Your sector's advisory level is Pulsar Star. A large, unknown electromagnetic field has stormed through nearby surveillance equipment, causing major data loss. Partial data was recovered and showed no credible threats to Nanotrasen assets within the Spinward Sector; however, the Department of Intelligence advises maintaining high alert against potential threats due to the lack of complete data." return advisory_string + //a white dwarf shift leads to a green security alert on report and special announcement, this prevents a meta check if the alert report is fake or not. + if(round(shown_threat) == 0 && round(threat_level) == 0) + advisory_string += "Advisory Level: White Dwarf
" + advisory_string += "Your sector's advisory level is White Dwarf. Our surveillance has ruled out any and all potential threats known in our database, eliminating most risks to our assets in the Spinward Sector. We advise a lower level of security, alongside distributing resources on potential profit." + return advisory_string switch(round(shown_threat)) - if(0) - advisory_string += "Advisory Level: White Dwarf
" - advisory_string += "Your sector's advisory level is White Dwarf. Our surveillance has ruled out any and all potential threats known in our database, eliminating most risks to our assets in the Spinward Sector. We advise a lower level of security, alongside distributing resources on potential profit." - if(1 to 19) + if(0 to 19) var/show_core_territory = (GLOB.current_living_antags.len > 0) if (prob(FAKE_GREENSHIFT_FORM_CHANCE)) show_core_territory = !show_core_territory diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 5f12370c60d7b..dc1091bcfc516 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -557,7 +557,7 @@ SUBSYSTEM_DEF(job) SEND_SIGNAL(equipping, COMSIG_JOB_RECEIVED, job) equipping.mind?.set_assigned_role_with_greeting(job, player_client) - equipping.on_job_equipping(job) + equipping.on_job_equipping(job, player_client) job.announce_job(equipping) if(player_client?.holder) diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index a915346cebdf0..bd782968abef2 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -10,7 +10,7 @@ GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list( list(/datum/quirk/no_taste, /datum/quirk/vegetarian, /datum/quirk/deviant_tastes, /datum/quirk/gamer), list(/datum/quirk/pineapple_liker, /datum/quirk/pineapple_hater, /datum/quirk/gamer), list(/datum/quirk/alcohol_tolerance, /datum/quirk/light_drinker), - list(/datum/quirk/item_quirk/clown_enjoyer, /datum/quirk/item_quirk/mime_fan, /datum/quirk/item_quirk/pride_pin), + list(/datum/quirk/item_quirk/clown_enjoyer, /datum/quirk/item_quirk/mime_fan), list(/datum/quirk/bad_touch, /datum/quirk/friendly), list(/datum/quirk/extrovert, /datum/quirk/introvert), list(/datum/quirk/prosthetic_limb, /datum/quirk/quadruple_amputee, /datum/quirk/transhumanist, /datum/quirk/body_purist), diff --git a/code/datums/ai/monkey/monkey_behaviors.dm b/code/datums/ai/monkey/monkey_behaviors.dm index af9091db2dd1d..a5febe03143f1 100644 --- a/code/datums/ai/monkey/monkey_behaviors.dm +++ b/code/datums/ai/monkey/monkey_behaviors.dm @@ -197,7 +197,7 @@ var/can_shoot = gun?.can_shoot() || FALSE if(gun && controller.blackboard[BB_MONKEY_GUN_WORKED] && prob(95)) // We attempt to attack even if we can't shoot so we get the effects of pulling the trigger - gun.afterattack(real_target, living_pawn, FALSE) + gun.melee_attack_chain(living_pawn, real_target) controller.set_blackboard_key(BB_MONKEY_GUN_WORKED, can_shoot ? TRUE : prob(80)) // Only 20% likely to notice it didn't work if(can_shoot) controller.set_blackboard_key(BB_MONKEY_GUN_NEURONS_ACTIVATED, TRUE) diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm index 693427ba4bd10..451d692b65d34 100644 --- a/code/datums/ai/monkey/monkey_controller.dm +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -80,7 +80,7 @@ have ways of interacting with a specific mob and control it. living_pawn.AddElement(/datum/element/relay_attackers) RegisterSignal(new_pawn, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) RegisterSignal(new_pawn, COMSIG_LIVING_START_PULL, PROC_REF(on_startpulling)) - RegisterSignal(new_pawn, COMSIG_LIVING_TRY_SYRINGE, PROC_REF(on_try_syringe)) + RegisterSignals(new_pawn, list(COMSIG_LIVING_TRY_SYRINGE_INJECT, COMSIG_LIVING_TRY_SYRINGE_WITHDRAW), PROC_REF(on_try_syringe)) RegisterSignal(new_pawn, COMSIG_CARBON_CUFF_ATTEMPTED, PROC_REF(on_attempt_cuff)) RegisterSignal(new_pawn, COMSIG_MOB_MOVESPEED_UPDATED, PROC_REF(update_movespeed)) @@ -92,7 +92,8 @@ have ways of interacting with a specific mob and control it. UnregisterSignal(pawn, list( COMSIG_ATOM_WAS_ATTACKED, COMSIG_LIVING_START_PULL, - COMSIG_LIVING_TRY_SYRINGE, + COMSIG_LIVING_TRY_SYRINGE_INJECT, + COMSIG_LIVING_TRY_SYRINGE_WITHDRAW, COMSIG_CARBON_CUFF_ATTEMPTED, COMSIG_MOB_MOVESPEED_UPDATED, )) diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index 1d121d0db8a86..27b6150fe32b6 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -16,12 +16,16 @@ if(owner.stat != CONSCIOUS || owner.IsSleeping() || owner.IsUnconscious()) return if(HAS_TRAIT(owner, TRAIT_RDS_SUPPRESSED)) + owner.remove_language(/datum/language/aphasia, source = LANGUAGE_APHASIA) return + if(!HAS_TRAIT(owner, TRAIT_RDS_SUPPRESSED)) + owner.grant_language(/datum/language/aphasia, source = LANGUAGE_APHASIA) owner.adjust_hallucinations_up_to(10 SECONDS * seconds_per_tick, 100 SECONDS) /datum/brain_trauma/mild/hallucinations/on_lose() owner.remove_status_effect(/datum/status_effect/hallucination) + owner.remove_language(/datum/language/aphasia, source = LANGUAGE_APHASIA) return ..() /datum/brain_trauma/mild/stuttering @@ -118,7 +122,7 @@ return ..() /datum/brain_trauma/mild/healthy/on_life(seconds_per_tick, times_fired) - owner.adjustStaminaLoss(-2.5 * seconds_per_tick) //no pain, no fatigue + owner.adjustStaminaLoss(-6 * seconds_per_tick) //no pain, no fatigue /datum/brain_trauma/mild/healthy/on_lose() owner.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 3e8bd52e5f94e..325203dbb350a 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -307,7 +307,10 @@ if(prob(15)) playsound(owner,'sound/effects/sf_hiccup_male_01.ogg', 50) owner.emote("hiccup") - owner.adjustStaminaLoss(-5) //too drunk to feel anything + //too drunk to feel anything + //if they're to this point, they're likely dying of liver damage + //and not accounting for that, the split personality is temporary + owner.adjustStaminaLoss(-25) duration_in_seconds -= seconds_per_tick /mob/living/split_personality/blackout diff --git a/code/datums/components/cleaner.dm b/code/datums/components/cleaner.dm index 49f200b4b9286..3001fde9837fb 100644 --- a/code/datums/components/cleaner.dm +++ b/code/datums/components/cleaner.dm @@ -35,16 +35,16 @@ return ..() /datum/component/cleaner/RegisterWithParent() - if(isbot(parent)) + if(ismob(parent)) RegisterSignal(parent, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_unarmed_attack)) - return - RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_afterattack)) + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_INTERACTING_WITH_ATOM, PROC_REF(on_interaction)) /datum/component/cleaner/UnregisterFromParent() - if(isbot(parent)) - UnregisterSignal(parent, COMSIG_LIVING_UNARMED_ATTACK) - return - UnregisterSignal(parent, COMSIG_ITEM_AFTERATTACK) + UnregisterSignal(parent, list( + COMSIG_ITEM_INTERACTING_WITH_ATOM, + COMSIG_LIVING_UNARMED_ATTACK, + )) /** * Handles the COMSIG_LIVING_UNARMED_ATTACK signal used for cleanbots @@ -52,29 +52,27 @@ */ /datum/component/cleaner/proc/on_unarmed_attack(datum/source, atom/target, proximity_flags, modifiers) SIGNAL_HANDLER - return on_afterattack(source, target, parent, proximity_flags, modifiers) + if(on_interaction(source, source, target, modifiers) & ITEM_INTERACT_ANY_BLOCKER) + return COMPONENT_CANCEL_ATTACK_CHAIN + return NONE /** - * Handles the COMSIG_ITEM_AFTERATTACK signal by calling the clean proc. - * - * Arguments - * * source the datum that sent the signal to start cleaning - * * target the thing being cleaned - * * user the person doing the cleaning - * * clean_target set this to false if the target should not be washed and if experience should not be awarded to the user + * Handles the COMSIG_ITEM_INTERACTING_WITH_ATOM signal by calling the clean proc. */ -/datum/component/cleaner/proc/on_afterattack(datum/source, atom/target, mob/user, proximity_flag, click_parameters) +/datum/component/cleaner/proc/on_interaction(datum/source, mob/living/user, atom/target, list/modifiers) SIGNAL_HANDLER - if(!proximity_flag) - return - . |= COMPONENT_AFTERATTACK_PROCESSED_ITEM - var/clean_target + + // By default, give XP + var/give_xp = TRUE if(pre_clean_callback) - clean_target = pre_clean_callback?.Invoke(source, target, user) - if(clean_target == DO_NOT_CLEAN) - return . - INVOKE_ASYNC(src, PROC_REF(clean), source, target, user, clean_target) //signal handlers can't have do_afters inside of them - return . + var/callback_return = pre_clean_callback.Invoke(source, target, user) + if(callback_return & CLEAN_BLOCKED) + return (callback_return & CLEAN_DONT_BLOCK_INTERACTION) ? NONE : ITEM_INTERACT_BLOCKING + if(callback_return & CLEAN_NO_XP) + give_xp = FALSE + + INVOKE_ASYNC(src, PROC_REF(clean), source, target, user, give_xp) + return ITEM_INTERACT_SUCCESS /** * Cleans something using this cleaner. diff --git a/code/datums/components/igniter.dm b/code/datums/components/igniter.dm index d94c4be101aa3..ad9351b34e9bf 100644 --- a/code/datums/components/igniter.dm +++ b/code/datums/components/igniter.dm @@ -20,13 +20,10 @@ /datum/component/igniter/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_POST_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT)) -/datum/component/igniter/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) +/datum/component/igniter/proc/item_afterattack(obj/item/source, atom/target, mob/user, click_parameters) SIGNAL_HANDLER - if(!proximity_flag) - return do_igniter(target) - return COMPONENT_AFTERATTACK_PROCESSED_ITEM /datum/component/igniter/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target, success) SIGNAL_HANDLER diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm index 0e5341eabbfe5..bc7cc2e6af3c4 100644 --- a/code/datums/components/infective.dm +++ b/code/datums/components/infective.dm @@ -118,17 +118,16 @@ try_infect(target, hit_zone) -/datum/component/infective/proc/try_infect_attack_zone(datum/source, mob/living/carbon/target, mob/living/user, hit_zone) +/datum/component/infective/proc/try_infect_attack_zone(obj/item/source, mob/living/carbon/target, mob/living/user, hit_zone) SIGNAL_HANDLER - try_infect(user, BODY_ZONE_L_ARM) try_infect(target, hit_zone) -/datum/component/infective/proc/try_infect_attack(datum/source, mob/living/target, mob/living/user) +/datum/component/infective/proc/try_infect_attack(obj/item/source, mob/living/target, mob/living/user) SIGNAL_HANDLER - if(!iscarbon(target)) //this case will be handled by try_infect_attack_zone - try_infect(target) - try_infect(user, BODY_ZONE_L_ARM) + if(source.loc == user) + var/obj/item/bodypart/hand = user.get_active_hand() + try_infect(user, hand.body_zone) /datum/component/infective/proc/try_infect_equipped(datum/source, mob/living/L, slot) SIGNAL_HANDLER diff --git a/code/datums/components/jousting.dm b/code/datums/components/jousting.dm index 9c3dab3c8fbdd..6d11e20b3a3dd 100644 --- a/code/datums/components/jousting.dm +++ b/code/datums/components/jousting.dm @@ -44,7 +44,7 @@ RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) - RegisterSignal(parent, COMSIG_ITEM_POST_ATTACK, PROC_REF(on_successful_attack)) + RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_successful_attack)) RegisterSignal(parent, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /datum/component/jousting/UnregisterFromParent() @@ -53,7 +53,7 @@ COMSIG_ATOM_EXAMINE, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, - COMSIG_ITEM_POST_ATTACK, + COMSIG_ITEM_AFTERATTACK, COMSIG_TRANSFORMING_ON_TRANSFORM, )) diff --git a/code/datums/components/lockable_storage.dm b/code/datums/components/lockable_storage.dm index 52aba79974179..c559c008c7923 100644 --- a/code/datums/components/lockable_storage.dm +++ b/code/datums/components/lockable_storage.dm @@ -47,6 +47,7 @@ if(can_hack_open) RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), PROC_REF(on_screwdriver_act)) RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(on_multitool_act)) + RegisterSignal(parent, COMSIG_ATOM_STORAGE_ITEM_INTERACT_INSERT, PROC_REF(block_insert)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) @@ -62,6 +63,7 @@ UnregisterSignal(parent, list( COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), + COMSIG_ATOM_STORAGE_ITEM_INTERACT_INSERT, )) UnregisterSignal(parent, list( COMSIG_ATOM_EXAMINE, @@ -140,6 +142,15 @@ source.balloon_alert(user, "hacked") lock_code = null +/// Stops you from shoving your tools into the storage if you're trying to hack it +/datum/component/lockable_storage/proc/block_insert(atom/source, obj/item/inserting, mob/living/user) + SIGNAL_HANDLER + if(!can_hack_open || !source.atom_storage.locked) + return NONE // allow insert + if(inserting.tool_behaviour == TOOL_MULTITOOL || inserting.tool_behaviour == TOOL_SCREWDRIVER) + return BLOCK_STORAGE_INSERT // block insert + return NONE + ///Updates the icon state depending on if we're locked or not. /datum/component/lockable_storage/proc/on_update_icon_state(obj/source) SIGNAL_HANDLER diff --git a/code/datums/components/on_hit_effect.dm b/code/datums/components/on_hit_effect.dm index 4093249c1ad46..9d1d047429069 100644 --- a/code/datums/components/on_hit_effect.dm +++ b/code/datums/components/on_hit_effect.dm @@ -58,7 +58,6 @@ if(!extra_check_callback.Invoke(user, target, source)) return on_hit_callback.Invoke(source, user, target, user.zone_selected) - return COMPONENT_AFTERATTACK_PROCESSED_ITEM /datum/component/on_hit_effect/proc/hostile_attackingtarget(mob/living/attacker, atom/target, success) SIGNAL_HANDLER diff --git a/code/datums/components/reagent_refiller.dm b/code/datums/components/reagent_refiller.dm index 35bdcb4ce51ec..7e455b150ad5b 100644 --- a/code/datums/components/reagent_refiller.dm +++ b/code/datums/components/reagent_refiller.dm @@ -33,11 +33,11 @@ return ..() /datum/component/reagent_refiller/RegisterWithParent() - RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(refill)) + RegisterSignal(parent, COMSIG_ITEM_INTERACTING_WITH_ATOM, PROC_REF(refill)) RegisterSignal(parent, COMSIG_ATOM_EXITED, PROC_REF(delete_self)) /datum/component/reagent_refiller/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_ATOM_EXITED)) + UnregisterSignal(parent, list(COMSIG_ITEM_INTERACTING_WITH_ATOM, COMSIG_ATOM_EXITED)) /datum/component/reagent_refiller/proc/delete_self() SIGNAL_HANDLER @@ -48,8 +48,6 @@ /datum/component/reagent_refiller/proc/refill() SIGNAL_HANDLER - . |= COMPONENT_AFTERATTACK_PROCESSED_ITEM - var/obj/item/reagent_containers/container = parent var/amount = min((container.amount_per_transfer_from_this + container.reagents.total_volume), container.reagents.total_volume) if (amount == 0) diff --git a/code/datums/components/scope.dm b/code/datums/components/scope.dm index 531ff9e9962df..dfc9d1c66c4b8 100644 --- a/code/datums/components/scope.dm +++ b/code/datums/components/scope.dm @@ -27,7 +27,7 @@ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) switch(zoom_method) if(ZOOM_METHOD_RIGHT_CLICK) - RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK_SECONDARY, PROC_REF(on_secondary_afterattack)) + RegisterSignal(parent, COMSIG_RANGED_ITEM_INTERACTING_WITH_ATOM_SECONDARY, PROC_REF(do_secondary_zoom)) if(ZOOM_METHOD_WIELD) RegisterSignal(parent, SIGNAL_ADDTRAIT(TRAIT_WIELDED), PROC_REF(on_wielded)) RegisterSignal(parent, SIGNAL_REMOVETRAIT(TRAIT_WIELDED), PROC_REF(on_unwielded)) @@ -46,7 +46,7 @@ parent_item.remove_item_action(scope) UnregisterSignal(parent, list( COMSIG_MOVABLE_MOVED, - COMSIG_ITEM_AFTERATTACK_SECONDARY, + COMSIG_RANGED_ITEM_INTERACTING_WITH_ATOM_SECONDARY, SIGNAL_ADDTRAIT(TRAIT_WIELDED), SIGNAL_REMOVETRAIT(TRAIT_WIELDED), COMSIG_GUN_TRY_FIRE, @@ -71,14 +71,14 @@ return stop_zooming(tracker.owner) -/datum/component/scope/proc/on_secondary_afterattack(datum/source, atom/target, mob/user, proximity_flag, click_parameters) +/datum/component/scope/proc/do_secondary_zoom(datum/source, mob/user, atom/target, click_parameters) SIGNAL_HANDLER if(tracker) stop_zooming(user) else zoom(user) - return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING /datum/component/scope/proc/on_action_trigger(datum/action/source) SIGNAL_HANDLER diff --git a/code/datums/components/soul_stealer.dm b/code/datums/components/soul_stealer.dm index a69265421bb97..e725792bffe3c 100644 --- a/code/datums/components/soul_stealer.dm +++ b/code/datums/components/soul_stealer.dm @@ -22,9 +22,10 @@ /datum/component/soul_stealer/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_afterattack)) + RegisterSignal(parent, COMSIG_ITEM_INTERACTING_WITH_ATOM, PROC_REF(try_transfer_soul)) /datum/component/soul_stealer/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_ATOM_EXAMINE, COMSIG_ITEM_AFTERATTACK)) + UnregisterSignal(parent, list(COMSIG_ATOM_EXAMINE, COMSIG_ITEM_AFTERATTACK, COMSIG_ITEM_INTERACTING_WITH_ATOM)) ///signal called on parent being examined /datum/component/soul_stealer/proc/on_examine(datum/source, mob/user, list/examine_list) @@ -41,15 +42,15 @@ if(10 to INFINITY) examine_list += span_notice("A staggering [num_souls] souls have been claimed by it! And it hungers for more!") -/datum/component/soul_stealer/proc/on_afterattack(obj/item/source, atom/target, mob/living/user, proximity_flag, click_parameters) +/datum/component/soul_stealer/proc/on_afterattack(obj/item/source, atom/target, mob/living/user, click_parameters) SIGNAL_HANDLER - if(!proximity_flag) - return - if(ishuman(target)) INVOKE_ASYNC(src, PROC_REF(try_capture), target, user) +/datum/component/soul_stealer/proc/try_transfer_soul(obj/item/source, mob/user, atom/target, click_parameters) + SIGNAL_HANDLER + if(istype(target, /obj/structure/constructshell) && length(soulstones)) var/obj/item/soulstone/soulstone = soulstones[1] INVOKE_ASYNC(soulstone, TYPE_PROC_REF(/obj/item/soulstone, transfer_to_construct), target, user) @@ -58,7 +59,7 @@ else if(!length(soulstone.contents)) // something fucky happened qdel(soulstone) soulstones -= soulstone - + return ITEM_INTERACT_SUCCESS /datum/component/soul_stealer/proc/try_capture(mob/living/carbon/human/victim, mob/living/captor) if(victim.stat == CONSCIOUS) diff --git a/code/datums/components/spirit_holding.dm b/code/datums/components/spirit_holding.dm index e2b1cfb96bc3b..578e378b51cb9 100644 --- a/code/datums/components/spirit_holding.dm +++ b/code/datums/components/spirit_holding.dm @@ -115,7 +115,7 @@ SIGNAL_HANDLER return COMSIG_BLOCK_RELAYMOVE -/datum/component/spirit_holding/proc/on_bible_smacked(datum/source, mob/living/user, direction) +/datum/component/spirit_holding/proc/on_bible_smacked(datum/source, mob/living/user, ...) SIGNAL_HANDLER INVOKE_ASYNC(src, PROC_REF(attempt_exorcism), user) diff --git a/code/datums/components/style/style.dm b/code/datums/components/style/style.dm index 7e92f846c8570..f39379d636783 100644 --- a/code/datums/components/style/style.dm +++ b/code/datums/components/style/style.dm @@ -97,7 +97,7 @@ src.multitooled = multitooled /datum/component/style/RegisterWithParent() - RegisterSignal(parent, COMSIG_MOB_ITEM_AFTERATTACK, PROC_REF(hotswap)) + RegisterSignal(parent, COMSIG_USER_ITEM_INTERACTION, PROC_REF(hotswap)) RegisterSignal(parent, COMSIG_MOB_MINED, PROC_REF(on_mine)) RegisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_take_damage)) RegisterSignal(parent, COMSIG_MOB_EMOTED("flip"), PROC_REF(on_flip)) @@ -126,7 +126,7 @@ /datum/component/style/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_MOB_ITEM_AFTERATTACK) + UnregisterSignal(parent, COMSIG_USER_ITEM_INTERACTION) UnregisterSignal(parent, COMSIG_MOB_MINED) UnregisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE) UnregisterSignal(parent, list(COMSIG_MOB_EMOTED("flip"), COMSIG_MOB_EMOTED("spin"))) @@ -319,26 +319,27 @@ return "#364866" /// A proc that lets a user, when their rank >= `hotswap_rank`, swap items in storage with what's in their hands, simply by clicking on the stored item with a held item -/datum/component/style/proc/hotswap(mob/living/source, atom/target, obj/item/weapon, proximity_flag, click_parameters) +/datum/component/style/proc/hotswap(mob/living/source, atom/target, obj/item/weapon, click_parameters) SIGNAL_HANDLER if((rank < hotswap_rank) || !isitem(target) || !(target in source.get_all_contents())) - return + return NONE var/obj/item/item_target = target if(!(item_target.item_flags & IN_STORAGE)) - return + return NONE var/datum/storage/atom_storage = item_target.loc.atom_storage if(!atom_storage.can_insert(weapon, source, messages = FALSE)) source.balloon_alert(source, "unable to hotswap!") - return + return NONE atom_storage.attempt_insert(weapon, source, override = TRUE) INVOKE_ASYNC(source, TYPE_PROC_REF(/mob/living, put_in_hands), target) source.visible_message(span_notice("[source] quickly swaps [weapon] out with [target]!"), span_notice("You quickly swap [weapon] with [target].")) + return ITEM_INTERACT_BLOCKING // Point givers /datum/component/style/proc/on_punch(mob/living/carbon/human/punching_person, atom/attacked_atom, proximity) diff --git a/code/datums/components/summoning.dm b/code/datums/components/summoning.dm index 220a4baca5f9a..69ade1e2f1b56 100644 --- a/code/datums/components/summoning.dm +++ b/code/datums/components/summoning.dm @@ -49,13 +49,10 @@ /datum/component/summoning/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_POST_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT)) -/datum/component/summoning/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) +/datum/component/summoning/proc/item_afterattack(obj/item/source, atom/target, mob/user, click_parameters) SIGNAL_HANDLER - if(!proximity_flag) - return do_spawn_mob(get_turf(target), user) - return COMPONENT_AFTERATTACK_PROCESSED_ITEM /datum/component/summoning/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target, success) SIGNAL_HANDLER diff --git a/code/datums/components/trapdoor.dm b/code/datums/components/trapdoor.dm index bc4d247943376..f76dcf35e705a 100644 --- a/code/datums/components/trapdoor.dm +++ b/code/datums/components/trapdoor.dm @@ -349,26 +349,23 @@ . = ..() AddElement(/datum/element/openspace_item_click_handler) -/obj/item/trapdoor_kit/handle_openspace_click(turf/target, mob/user, proximity_flag, click_parameters) - afterattack(target, user, proximity_flag, click_parameters) +/obj/item/trapdoor_kit/handle_openspace_click(turf/target, mob/user, click_parameters) + interact_with_atom(target, user, click_parameters) -/obj/item/trapdoor_kit/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(!proximity_flag) - return - var/turf/target_turf = get_turf(target) +/obj/item/trapdoor_kit/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + var/turf/target_turf = get_turf(interacting_with) if(!isopenspaceturf(target_turf)) - return + return NONE in_use = TRUE balloon_alert(user, "constructing trapdoor") - if(!do_after(user, 5 SECONDS, target = target)) + if(!do_after(user, 5 SECONDS, interacting_with)) in_use = FALSE - return + return ITEM_INTERACT_BLOCKING in_use = FALSE if(!isopenspaceturf(target_turf)) // second check to make sure nothing changed during constructions - return + return ITEM_INTERACT_BLOCKING var/turf/new_turf = target_turf.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) new_turf.AddComponent(/datum/component/trapdoor, starts_open = FALSE, conspicuous = TRUE) balloon_alert(user, "trapdoor constructed") qdel(src) - return + return ITEM_INTERACT_SUCCESS diff --git a/code/datums/elements/can_shatter.dm b/code/datums/elements/can_shatter.dm index 73b025ad83c08..be7e02e25b458 100644 --- a/code/datums/elements/can_shatter.dm +++ b/code/datums/elements/can_shatter.dm @@ -31,7 +31,7 @@ RegisterSignal(target, COMSIG_MOVABLE_IMPACT, PROC_REF(on_throw_impact)) RegisterSignal(target, COMSIG_ATOM_ON_Z_IMPACT, PROC_REF(on_z_impact)) if(shatters_as_weapon) - RegisterSignal(target, COMSIG_ITEM_POST_ATTACK_ATOM, PROC_REF(on_post_attack_atom)) + RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_post_attack_atom)) /datum/element/can_shatter/Detach(datum/target) . = ..() diff --git a/code/datums/elements/easily_fragmented.dm b/code/datums/elements/easily_fragmented.dm index eb7f499c0f27e..aa8b07a866ecd 100644 --- a/code/datums/elements/easily_fragmented.dm +++ b/code/datums/elements/easily_fragmented.dm @@ -17,18 +17,21 @@ src.break_chance = break_chance RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_afterattack)) + RegisterSignal(target, COMSIG_ITEM_TOOL_ACTED, PROC_REF(on_tool_use)) /datum/element/easily_fragmented/Detach(datum/target) . = ..() - UnregisterSignal(target, COMSIG_ITEM_AFTERATTACK) + UnregisterSignal(target, list(COMSIG_ITEM_AFTERATTACK, COMSIG_ITEM_TOOL_ACTED)) -/datum/element/easily_fragmented/proc/on_afterattack(datum/source, atom/target, mob/user, proximity_flag, click_parameters) +/datum/element/easily_fragmented/proc/on_afterattack(datum/source, atom/target, mob/user, click_parameters) SIGNAL_HANDLER + try_break(source, user) - var/obj/item/item = source +/datum/element/easily_fragmented/proc/on_tool_use(datum/source, atom/target, mob/user, tool_type, result) + SIGNAL_HANDLER + try_break(source, user) +/datum/element/easily_fragmented/proc/try_break(obj/item/source, mob/user) if(prob(break_chance)) - user.visible_message(span_danger("[user]'s [item.name] snap[item.p_s()] into tiny pieces in [user.p_their()] hand.")) - item.deconstruct(disassembled = FALSE) - - return COMPONENT_AFTERATTACK_PROCESSED_ITEM + user.visible_message(span_danger("[user]'s [source.name] snap[source.p_s()] into tiny pieces in [user.p_their()] hand.")) + source.deconstruct(disassembled = FALSE) diff --git a/code/datums/elements/envenomable_casing.dm b/code/datums/elements/envenomable_casing.dm index 8cf77a2f2cc49..5e080adaf0001 100644 --- a/code/datums/elements/envenomable_casing.dm +++ b/code/datums/elements/envenomable_casing.dm @@ -15,7 +15,7 @@ if(!istype(target, /obj/item/ammo_casing)) return ELEMENT_INCOMPATIBLE src.amount_allowed = amount_allowed - RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_afterattack)) + RegisterSignal(target, COMSIG_ITEM_INTERACTING_WITH_ATOM, PROC_REF(handle_interaction)) RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine_before_dip)) /datum/element/envenomable_casing/Detach(datum/target) @@ -23,28 +23,29 @@ UnregisterSignal(target, list(COMSIG_ITEM_AFTERATTACK, COMSIG_ATOM_EXAMINE)) ///signal called on the parent attacking an item -/datum/element/envenomable_casing/proc/on_afterattack(obj/item/ammo_casing/casing, atom/target, mob/user, proximity_flag, click_parameters) +/datum/element/envenomable_casing/proc/handle_interaction(obj/item/ammo_casing/casing, mob/user, atom/target, click_parameters) SIGNAL_HANDLER if(!is_reagent_container(target)) - return + return NONE var/obj/item/reagent_containers/venom_container = target if(!casing.loaded_projectile) user.balloon_alert(user, "casing is already spent!") - return + return ITEM_INTERACT_BLOCKING if(!(venom_container.reagent_flags & OPENCONTAINER)) user.balloon_alert(user, "open the container!") - return + return ITEM_INTERACT_BLOCKING var/datum/reagent/venom_applied = venom_container.reagents.get_master_reagent() if(!venom_applied) - return + return ITEM_INTERACT_BLOCKING var/amount_applied = min(venom_applied.volume, amount_allowed) casing.loaded_projectile.AddElement(/datum/element/venomous, venom_applied.type, amount_applied) to_chat(user, span_notice("You coat [casing] in [venom_applied].")) venom_container.reagents.remove_reagent(venom_applied.type, amount_applied) ///stops further poison application - UnregisterSignal(casing, COMSIG_ITEM_AFTERATTACK) + UnregisterSignal(casing, COMSIG_ITEM_INTERACTING_WITH_ATOM) RegisterSignal(casing, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine_after_dip), override = TRUE) + return ITEM_INTERACT_SUCCESS ///signal called on parent being examined while not coated /datum/element/envenomable_casing/proc/on_examine_before_dip(obj/item/ammo_casing/casing, mob/user, list/examine_list) @@ -55,5 +56,3 @@ /datum/element/envenomable_casing/proc/on_examine_after_dip(obj/item/ammo_casing/casing, mob/user, list/examine_list) SIGNAL_HANDLER examine_list += span_warning("It's coated in some kind of chemical...") - - diff --git a/code/datums/elements/food/dunkable.dm b/code/datums/elements/food/dunkable.dm index d413119e285eb..baf4be2a81323 100644 --- a/code/datums/elements/food/dunkable.dm +++ b/code/datums/elements/food/dunkable.dm @@ -10,29 +10,27 @@ if(!isitem(target)) return ELEMENT_INCOMPATIBLE dunk_amount = amount_per_dunk - RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(get_dunked)) + RegisterSignal(target, COMSIG_ITEM_INTERACTING_WITH_ATOM, PROC_REF(get_dunked)) /datum/element/dunkable/Detach(datum/target) . = ..() - UnregisterSignal(target, COMSIG_ITEM_AFTERATTACK) + UnregisterSignal(target, COMSIG_ITEM_INTERACTING_WITH_ATOM) -/datum/element/dunkable/proc/get_dunked(datum/source, atom/target, mob/user, proximity_flag) +/datum/element/dunkable/proc/get_dunked(datum/source, mob/user, atom/target, params) SIGNAL_HANDLER - if(!proximity_flag) // if the user is not adjacent to the container - return var/obj/item/reagent_containers/container = target // the container we're trying to dunk into - if(istype(container) && container.reagent_flags & DUNKABLE) // container should be a valid target for dunking - . = COMPONENT_AFTERATTACK_PROCESSED_ITEM + if(istype(container) && (container.reagent_flags & DUNKABLE)) // container should be a valid target for dunking if(!container.is_drainable()) to_chat(user, span_warning("[container] is unable to be dunked in!")) - return COMPONENT_AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_BLOCKING var/obj/item/I = source // the item that has the dunkable element if(container.reagents.trans_to(I, dunk_amount, transferred_by = user)) //if reagents were transferred, show the message to_chat(user, span_notice("You dunk \the [I] into \the [container].")) - return COMPONENT_AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_SUCCESS if(!container.reagents.total_volume) to_chat(user, span_warning("[container] is empty!")) else to_chat(user, span_warning("[I] is full!")) - return COMPONENT_AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_BLOCKING + return NONE diff --git a/code/datums/elements/knockback.dm b/code/datums/elements/knockback.dm index 2ad669f989219..c8f06efa430e5 100644 --- a/code/datums/elements/knockback.dm +++ b/code/datums/elements/knockback.dm @@ -30,13 +30,10 @@ return ..() /// triggered after an item attacks something -/datum/element/knockback/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) +/datum/element/knockback/proc/item_afterattack(obj/item/source, atom/target, mob/user, click_parameters) SIGNAL_HANDLER - if(!proximity_flag) - return do_knockback(target, user, get_dir(source, target)) - return COMPONENT_AFTERATTACK_PROCESSED_ITEM /// triggered after a hostile simplemob attacks something /datum/element/knockback/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target, success) diff --git a/code/datums/elements/light_eater.dm b/code/datums/elements/light_eater.dm index 50f88cb9e9b23..ed3851944d980 100644 --- a/code/datums/elements/light_eater.dm +++ b/code/datums/elements/light_eater.dm @@ -126,12 +126,9 @@ * - [user][/mob/living]: The mob using the source to strike the target * - proximity: Whether the strike was in melee range so you can't eat lights from cameras */ -/datum/element/light_eater/proc/on_afterattack(obj/item/source, atom/target, mob/living/user, proximity) +/datum/element/light_eater/proc/on_afterattack(obj/item/source, atom/target, mob/living/user) SIGNAL_HANDLER - if(!proximity) - return NONE eat_lights(target, source) - return COMPONENT_AFTERATTACK_PROCESSED_ITEM /** * Called when a source object is used to block a thrown object, projectile, or attack diff --git a/code/datums/elements/openspace_item_click_handler.dm b/code/datums/elements/openspace_item_click_handler.dm index c9de01f381cd9..67a3dbefbde35 100644 --- a/code/datums/elements/openspace_item_click_handler.dm +++ b/code/datums/elements/openspace_item_click_handler.dm @@ -8,22 +8,22 @@ . = ..() if(!isitem(target)) return ELEMENT_INCOMPATIBLE - RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_afterattack)) + RegisterSignal(target, COMSIG_ITEM_INTERACTING_WITH_ATOM, PROC_REF(divert_interaction)) /datum/element/openspace_item_click_handler/Detach(datum/source) - UnregisterSignal(source, COMSIG_ITEM_AFTERATTACK) + UnregisterSignal(source, COMSIG_ITEM_INTERACTING_WITH_ATOM) return ..() //Invokes the proctype with a turf above as target. -/datum/element/openspace_item_click_handler/proc/on_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) +/datum/element/openspace_item_click_handler/proc/divert_interaction(obj/item/source, mob/user, atom/target, click_parameters) SIGNAL_HANDLER if(target.z == user.z) - return + return NONE var/turf/checked_turf = get_turf(target) while(!isnull(checked_turf)) checked_turf = GET_TURF_ABOVE(checked_turf) - if(checked_turf?.z == user.z) - INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, handle_openspace_click), checked_turf, user, user.CanReach(checked_turf, source), click_parameters) + if(checked_turf?.z == user.z && user.CanReach(checked_turf, source)) + INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, handle_openspace_click), checked_turf, user, click_parameters) break - return COMPONENT_AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_BLOCKING diff --git a/code/datums/elements/selfknockback.dm b/code/datums/elements/selfknockback.dm index 61b2d17c3db84..d330b30debc1a 100644 --- a/code/datums/elements/selfknockback.dm +++ b/code/datums/elements/selfknockback.dm @@ -36,19 +36,16 @@ clamping the Knockback_Force value below. */ else return default_speed -/datum/element/selfknockback/proc/Item_SelfKnockback(obj/item/I, atom/attacktarget, mob/usertarget, proximity_flag) +/datum/element/selfknockback/proc/Item_SelfKnockback(obj/item/I, atom/attacktarget, mob/usertarget) SIGNAL_HANDLER - if(isturf(attacktarget) && !attacktarget.density) - return - if(proximity_flag || (get_dist(attacktarget, usertarget) <= I.reach)) - var/knockback_force = Get_Knockback_Force(clamp(CEILING((I.force / 10), 1), 1, 5)) - var/knockback_speed = Get_Knockback_Speed(clamp(knockback_force, 1, 5)) + var/knockback_force = Get_Knockback_Force(clamp(CEILING((I.force / 10), 1), 1, 5)) + var/knockback_speed = Get_Knockback_Speed(clamp(knockback_force, 1, 5)) - var/target_angle = get_angle(attacktarget, usertarget) - var/move_target = get_ranged_target_turf(usertarget, angle2dir(target_angle), knockback_force) - usertarget.throw_at(move_target, knockback_force, knockback_speed) - usertarget.visible_message(span_warning("[usertarget] gets thrown back by the force of \the [I] impacting \the [attacktarget]!"), span_warning("The force of \the [I] impacting \the [attacktarget] sends you flying!")) + var/target_angle = get_angle(attacktarget, usertarget) + var/move_target = get_ranged_target_turf(usertarget, angle2dir(target_angle), knockback_force) + usertarget.throw_at(move_target, knockback_force, knockback_speed) + usertarget.visible_message(span_warning("[usertarget] gets thrown back by the force of \the [I] impacting \the [attacktarget]!"), span_warning("The force of \the [I] impacting \the [attacktarget] sends you flying!")) /datum/element/selfknockback/proc/Projectile_SelfKnockback(obj/projectile/P) SIGNAL_HANDLER diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm index 9ba78f9ef4539..454d23637f255 100644 --- a/code/datums/martial/psychotic_brawl.dm +++ b/code/datums/martial/psychotic_brawl.dm @@ -1,6 +1,7 @@ /datum/martial_art/psychotic_brawling name = "Psychotic Brawling" id = MARTIALART_PSYCHOBRAWL + pacifist_style = TRUE /datum/martial_art/psychotic_brawling/disarm_act(mob/living/attacker, mob/living/defender) return psycho_attack(attacker, defender) @@ -75,6 +76,8 @@ carbon_defender.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) attacker.Stun(rand(1 SECONDS, 4.5 SECONDS)) defender.Stun(rand(0.5 SECONDS, 3 SECONDS)) + if(HAS_TRAIT(attacker, TRAIT_PACIFISM)) + attacker.add_mood_event("bypassed_pacifism", /datum/mood_event/pacifism_bypassed) if(5,6) atk_verb = pick("kick", "hit", "slam") if(defender.check_block(attacker, 0, "[attacker]'s [atk_verb]", UNARMED_ATTACK)) @@ -94,6 +97,8 @@ var/throwtarget = get_edge_target_turf(attacker, get_dir(attacker, get_step_away(defender, attacker))) defender.throw_at(throwtarget, 4, 2, attacker)//So stuff gets tossed around at the same time. defender.Paralyze(6 SECONDS) + if(HAS_TRAIT(attacker, TRAIT_PACIFISM)) + attacker.add_mood_event("bypassed_pacifism", /datum/mood_event/pacifism_bypassed) if(7,8) return MARTIAL_ATTACK_INVALID //Resume default behaviour diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 20a803434f40d..892a88df49f59 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -499,3 +499,9 @@ description = "Nothing will ever rival with what I seen in the past..." mood_change = -3 special_screen_obj = "mood_desentized" + +//Used for the psychotic brawling martial art, if the person is a pacifist. +/datum/mood_event/pacifism_bypassed + description = "I DIDN'T MEAN TO HURT THEM!" + mood_change = -20 + timeout = 10 MINUTES diff --git a/code/datums/quirks/negative_quirks/insanity.dm b/code/datums/quirks/negative_quirks/insanity.dm index 40e70f07b1831..c5fc1afdf0d7c 100644 --- a/code/datums/quirks/negative_quirks/insanity.dm +++ b/code/datums/quirks/negative_quirks/insanity.dm @@ -1,13 +1,13 @@ /datum/quirk/insanity name = "Reality Dissociation Syndrome" - desc = "You suffer from a severe disorder that causes very vivid hallucinations. \ + desc = "You suffer from a severe disorder that causes very vivid hallucinations and trouble expressing your ideas. \ Mindbreaker toxin can suppress its effects, and you are immune to mindbreaker's hallucinogenic properties. \ THIS IS NOT A LICENSE TO GRIEF." icon = FA_ICON_GRIN_TONGUE_WINK value = -8 gain_text = span_userdanger("...") lose_text = span_notice("You feel in tune with the world again.") - medical_record_text = "Patient suffers from acute Reality Dissociation Syndrome and experiences vivid hallucinations." + medical_record_text = "Patient suffers from acute Reality Dissociation Syndrome and experiences vivid hallucinations, and may have trouble speaking." hardcore_value = 6 mail_goodies = list(/obj/item/storage/pill_bottle/lsdpsych) /// Weakref to the trauma we give out @@ -17,7 +17,7 @@ if(!iscarbon(quirk_holder)) return var/mob/living/carbon/carbon_quirk_holder = quirk_holder - + // Setup our special RDS mild hallucination. // Not a unique subtype so not to plague subtypesof, // also as we inherit the names and values from our quirk. diff --git a/code/datums/quirks/neutral_quirks/pride_pin.dm b/code/datums/quirks/neutral_quirks/pride_pin.dm deleted file mode 100644 index 488c0a2bccb58..0000000000000 --- a/code/datums/quirks/neutral_quirks/pride_pin.dm +++ /dev/null @@ -1,19 +0,0 @@ -/datum/quirk/item_quirk/pride_pin - name = "Pride Pin" - desc = "Show off your pride with this changing pride pin!" - icon = FA_ICON_RAINBOW - value = 0 - gain_text = span_notice("You feel fruity.") - lose_text = span_danger("You feel only slightly less fruity than before.") - medical_record_text = "Patient appears to be fruity." - -/datum/quirk/item_quirk/pride_pin/add_unique(client/client_source) - var/obj/item/clothing/accessory/pride/pin = new(get_turf(quirk_holder)) - - var/pride_choice = client_source?.prefs?.read_preference(/datum/preference/choiced/pride_pin) || assoc_to_keys(GLOB.pride_pin_reskins)[1] - var/pride_reskin = GLOB.pride_pin_reskins[pride_choice] - - pin.current_skin = pride_choice - pin.icon_state = pride_reskin - - give_item_to_holder(pin, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index b1322d09d5622..2cde66f187d14 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -316,3 +316,10 @@ suffix = "lavaland_surface_mookvillage.dmm" allow_duplicates = FALSE cost = 5 + +/datum/map_template/ruin/lavaland/shuttle_wreckage + name = "Lava-Ruin Shuttle Wreckage" + id = "shuttle_wreckage" + description = "Not every shuttle makes it back to CentCom." + suffix = "lavaland_surface_shuttle_wreckage.dmm" + allow_duplicates = FALSE diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 27824567a4dba..e8c4be7869707 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -339,7 +339,7 @@ need_mob_update += itemUser.adjustFireLoss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) need_mob_update += itemUser.adjustToxLoss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) //Because Slime People are people too need_mob_update += itemUser.adjustOxyLoss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) - need_mob_update += itemUser.adjustStaminaLoss(-0.6 * seconds_between_ticks, updating_stamina = FALSE, forced = TRUE) + need_mob_update += itemUser.adjustStaminaLoss(-3 * seconds_between_ticks, updating_stamina = FALSE, forced = TRUE) need_mob_update += itemUser.adjustOrganLoss(ORGAN_SLOT_BRAIN, -0.6 * seconds_between_ticks) if(need_mob_update) itemUser.updatehealth() diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 30fc4a729cd98..83d99461fce57 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -18,10 +18,12 @@ /datum/status_effect/incapacitating/on_creation(mob/living/new_owner, set_duration) if(isnum(set_duration)) duration = set_duration - . = ..() - if(. && (needs_update_stat || issilicon(owner))) - owner.update_stat() + return ..() +/datum/status_effect/incapacitating/on_apply() + if(needs_update_stat || issilicon(owner)) + owner.update_stat() + return TRUE /datum/status_effect/incapacitating/on_remove() if(needs_update_stat || issilicon(owner)) //silicons need stat updates in addition to normal canmove updates diff --git a/code/datums/status_effects/debuffs/spacer.dm b/code/datums/status_effects/debuffs/spacer.dm index daaf5576ee101..1add806c02f0e 100644 --- a/code/datums/status_effects/debuffs/spacer.dm +++ b/code/datums/status_effects/debuffs/spacer.dm @@ -42,7 +42,7 @@ // This has some interesting side effects with gravitum or similar negating effects that may be worth nothing owner.adjustStaminaLoss(-1 * stamina_heal_per_tick) owner.AdjustAllImmobility(-1 * stun_heal_per_tick) - // For comparison: Ephedrine heals 1 stamina per tick / 0.5 per second + // For comparison: Ephedrine heals 4 stamina per tick / 2 per second // and Nicotine heals 5 seconds of stun per tick / 2.5 per second // The bad side (being on a planet) diff --git a/code/datums/status_effects/debuffs/stamcrit.dm b/code/datums/status_effects/debuffs/stamcrit.dm new file mode 100644 index 0000000000000..05433244df09c --- /dev/null +++ b/code/datums/status_effects/debuffs/stamcrit.dm @@ -0,0 +1,75 @@ +/datum/status_effect/incapacitating/stamcrit + status_type = STATUS_EFFECT_UNIQUE + // Lasts until we go back to 0 stamina, which is handled by the mob + duration = -1 + tick_interval = -1 + /// Cooldown between displaying warning messages that we hit diminishing returns + COOLDOWN_DECLARE(warn_cd) + /// A counter that tracks every time we've taken enough damage to trigger diminishing returns + var/diminishing_return_counter = 0 + +/datum/status_effect/incapacitating/stamcrit/on_creation(mob/living/new_owner, set_duration) + . = ..() + if(!.) + return . + + // This should be in on apply but we need it to happen AFTER being added to the mob + // (Because we need to wait until the status effect is in their status effect list, or we'll add two) + if(owner.getStaminaLoss() < 120) + // Puts you a little further into the initial stamcrit, makes stamcrit harder to outright counter with chems. + owner.adjustStaminaLoss(30, FALSE) + + // Same + RegisterSignal(owner, COMSIG_LIVING_ADJUST_STAMINA_DAMAGE, PROC_REF(update_diminishing_return)) + RegisterSignal(owner, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(check_remove)) + +/datum/status_effect/incapacitating/stamcrit/on_apply() + if(owner.stat == DEAD) + return FALSE + if(owner.check_stun_immunity(CANKNOCKDOWN)) + return FALSE + + . = ..() + if(!.) + return . + + if(owner.stat == CONSCIOUS) + to_chat(owner, span_notice("You're too exhausted to keep going...")) + owner.add_traits(list(TRAIT_INCAPACITATED, TRAIT_IMMOBILIZED, TRAIT_FLOORED), STAMINA) + return . + +/datum/status_effect/incapacitating/stamcrit/on_remove() + UnregisterSignal(owner, COMSIG_LIVING_HEALTH_UPDATE) + UnregisterSignal(owner, COMSIG_LIVING_ADJUST_STAMINA_DAMAGE) + owner.remove_traits(list(TRAIT_INCAPACITATED, TRAIT_IMMOBILIZED, TRAIT_FLOORED), STAMINA) + return ..() + +/datum/status_effect/incapacitating/stamcrit/proc/update_diminishing_return(datum/source, type, amount, forced) + SIGNAL_HANDLER + if(amount <= 0 || forced) + return NONE + // Here we fake the effect of having diminishing returns + // We don't actually decrease incoming stamina damage because that would be pointless, the mob is at stam damage cap anyways + // Instead we just "ignore" the damage if we have a sufficiently high diminishing return counter + var/mod_amount = ceil(sqrt(amount) / 2) - diminishing_return_counter + // We check base amount not mod_amount because we still want to up tick it even if we've already got a high counter + // We also only uptick it after calculating damage so we start ticking up after the damage and not before + switch(amount) + if(5 to INFINITY) + diminishing_return_counter += 1 + if(2 to 5) // Prevent chems from skyrockting DR + diminishing_return_counter += 0.05 + if(mod_amount > 0) + return NONE + + if(COOLDOWN_FINISHED(src, warn_cd) && owner.stat == CONSCIOUS) + to_chat(owner, span_notice("You start to recover from the exhaustion!")) + owner.visible_message(span_warning("[owner] starts to recover from the exhaustion!"), ignored_mobs = owner) + COOLDOWN_START(src, warn_cd, 2.5 SECONDS) + + return COMPONENT_IGNORE_CHANGE + +/datum/status_effect/incapacitating/stamcrit/proc/check_remove(datum/source, ...) + SIGNAL_HANDLER + if(owner.maxHealth - owner.getStaminaLoss() > owner.crit_threshold) + qdel(src) diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 9efc867a043e5..c9e94e0dd97f5 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -1,13 +1,38 @@ //entirely neutral or internal status effects go here -/datum/status_effect/crusher_damage //tracks the damage dealt to this mob by kinetic crushers +/datum/status_effect/crusher_damage id = "crusher_damage" duration = -1 tick_interval = -1 status_type = STATUS_EFFECT_UNIQUE alert_type = null + /// How much damage? var/total_damage = 0 +/datum/status_effect/crusher_damage/on_apply() + RegisterSignal(owner, COMSIG_MOB_AFTER_APPLY_DAMAGE, PROC_REF(damage_taken)) + return TRUE + +/datum/status_effect/crusher_damage/on_remove() + UnregisterSignal(owner, COMSIG_MOB_AFTER_APPLY_DAMAGE) + +/datum/status_effect/crusher_damage/proc/damage_taken( + datum/source, + damage_dealt, + damagetype, + def_zone, + blocked, + wound_bonus, + bare_wound_bonus, + sharpness, + attack_direction, + attacking_item, +) + SIGNAL_HANDLER + + if(istype(attacking_item, /obj/item/kinetic_crusher)) + total_damage += damage_dealt + /datum/status_effect/syphon_mark id = "syphon_mark" duration = 50 diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index 023cc066747c9..0a86c9fb54568 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -199,14 +199,14 @@ parent = new_parent // a few of theses should probably be on the real_location rather than the parent - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) + RegisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(on_item_interact)) RegisterSignals(parent, list(COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_ATTACK_HAND), PROC_REF(on_attack)) RegisterSignal(parent, COMSIG_MOUSEDROP_ONTO, PROC_REF(on_mousedrop_onto)) RegisterSignal(parent, COMSIG_MOUSEDROPPED_ONTO, PROC_REF(on_mousedropped_onto)) RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(on_preattack)) RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(mass_empty)) RegisterSignals(parent, list(COMSIG_ATOM_ATTACK_GHOST, COMSIG_ATOM_ATTACK_HAND_SECONDARY), PROC_REF(open_storage_on_signal)) - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY_SECONDARY, PROC_REF(open_storage_attackby_secondary)) + RegisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION_SECONDARY, PROC_REF(on_item_interact_secondary)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(close_distance)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(update_actions)) RegisterSignal(parent, COMSIG_TOPIC, PROC_REF(topic_handle)) @@ -795,17 +795,23 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) attempt_insert(dropping, user) /// Signal handler for whenever we're attacked by an object. -/datum/storage/proc/on_attackby(datum/source, obj/item/thing, mob/user, params) +/datum/storage/proc/on_item_interact(datum/source, mob/user, obj/item/thing, params) SIGNAL_HANDLER - if(!insert_on_attack || !thing.attackby_storage_insert(src, parent, user)) - return + if(!insert_on_attack) + return NONE + if(!thing.storage_insert_on_interaction(src, parent, user)) + return NONE + if(!parent.storage_insert_on_interacted_with(src, thing, user)) + return NONE + if(SEND_SIGNAL(parent, COMSIG_ATOM_STORAGE_ITEM_INTERACT_INSERT, thing, user) & BLOCK_STORAGE_INSERT) + return NONE if(iscyborg(user)) - return COMPONENT_NO_AFTERATTACK + return ITEM_INTERACT_BLOCKING attempt_insert(thing, user) - return COMPONENT_NO_AFTERATTACK + return ITEM_INTERACT_SUCCESS /// Signal handler for whenever we're attacked by a mob. /datum/storage/proc/on_attack(datum/source, mob/user) @@ -915,14 +921,16 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /// Signal handler for when we get attacked with secondary click by an item. -/datum/storage/proc/open_storage_attackby_secondary(datum/source, atom/weapon, mob/user) +/datum/storage/proc/on_item_interact_secondary(datum/source, mob/user, atom/weapon) SIGNAL_HANDLER if(istype(weapon, /obj/item/chameleon)) var/obj/item/chameleon/chameleon_weapon = weapon chameleon_weapon.make_copy(source, user) - return open_storage_on_signal(source, user) + if(open_storage_on_signal(source, user)) + return ITEM_INTERACT_BLOCKING + return NONE /// Signal handler to open up the storage when we receive a signal. /datum/storage/proc/open_storage_on_signal(datum/source, mob/to_show) diff --git a/code/datums/storage/subtypes/extract_inventory.dm b/code/datums/storage/subtypes/extract_inventory.dm index 0fea7ffed6335..9d75b6eb1d336 100644 --- a/code/datums/storage/subtypes/extract_inventory.dm +++ b/code/datums/storage/subtypes/extract_inventory.dm @@ -7,6 +7,8 @@ locked = STORAGE_FULLY_LOCKED rustle_sound = FALSE silent = TRUE + // Snowflake so you can feed it + insert_on_attack = FALSE /datum/storage/extract_inventory/New( atom/parent, diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index 59ceb24288794..ff8e22b17b8fa 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -214,13 +214,18 @@ base_lighting_alpha = 145 return ..() -/area/icemoon/surface/outdoors/nospawn // this is the area you use for stuff to not spawn, but if you still want weather. +/// this is the area you use for stuff to not spawn, but if you still want weather. +/area/icemoon/surface/outdoors/nospawn -/area/icemoon/surface/outdoors/nospawn/New() // unless you roll forested trait lol +// unless you roll forested trait lol (fuck you time green) +/area/icemoon/surface/outdoors/nospawn/New() . = ..() + // this area SOMETIMES does map generation. Often it doesn't at all + // so it SHOULD NOT be used with the genturf turf type, as it is not always replaced if(HAS_TRAIT(SSstation, STATION_TRAIT_FORESTED)) map_generator = /datum/map_generator/cave_generator/icemoon/surface/forested - area_flags = MOB_SPAWN_ALLOWED | FLORA_ALLOWED//flip this on, the generator has already disabled dangerous fauna + // flip this on, the generator has already disabled dangerous fauna + area_flags = MOB_SPAWN_ALLOWED | FLORA_ALLOWED /area/icemoon/surface/outdoors/noteleport // for places like the cursed spring water area_flags = UNIQUE_AREA | FLORA_ALLOWED | NOTELEPORT diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm index c740c12316046..f9c57510132f6 100644 --- a/code/game/area/areas/ruins/lavaland.dm +++ b/code/game/area/areas/ruins/lavaland.dm @@ -10,9 +10,6 @@ name = "\improper Clown Biodome" ambientsounds = list('sound/ambience/clown.ogg') -/area/ruin/lizard_gaslava - name = "\improper Lizard's Gas(Lava)" - /area/ruin/unpowered/gaia name = "\improper Patch of Eden" @@ -48,6 +45,12 @@ area_flags = CULT_PERMITTED ambience_index = AMBIENCE_SPOOKY +/area/ruin/thelizardsgas_lavaland + name = "\improper The Lizard's Gas" + icon_state = "lizardgas" + sound_environment = SOUND_ENVIRONMENT_ROOM + ambient_buzz = 'sound/ambience/magma.ogg' + //Syndicate lavaland base /area/ruin/syndicate_lava_base/engineering diff --git a/code/game/atom/atom_tool_acts.dm b/code/game/atom/atom_tool_acts.dm index 69a174a6aa1cf..bacdae83b1316 100644 --- a/code/game/atom/atom_tool_acts.dm +++ b/code/game/atom/atom_tool_acts.dm @@ -13,11 +13,23 @@ var/is_left_clicking = !is_right_clicking var/early_sig_return = NONE if(is_left_clicking) + /* + * This is intentionally using `||` instead of `|` to short-circuit the signal calls + * This is because we want to return early if ANY of these signals return a value + * + * This puts priority on the atom's signals, then the tool's signals, then the user's signals + * So stuff like storage can be handled before stuff the item wants to do like cleaner component + * + * Future idea: Being on combat mode could change/reverse the priority of these signals + */ early_sig_return = SEND_SIGNAL(src, COMSIG_ATOM_ITEM_INTERACTION, user, tool, modifiers) \ - | SEND_SIGNAL(tool, COMSIG_ITEM_INTERACTING_WITH_ATOM, user, src, modifiers) + || SEND_SIGNAL(tool, COMSIG_ITEM_INTERACTING_WITH_ATOM, user, src, modifiers) \ + || SEND_SIGNAL(user, COMSIG_USER_ITEM_INTERACTION, src, tool, modifiers) else + // See above early_sig_return = SEND_SIGNAL(src, COMSIG_ATOM_ITEM_INTERACTION_SECONDARY, user, tool, modifiers) \ - | SEND_SIGNAL(tool, COMSIG_ITEM_INTERACTING_WITH_ATOM_SECONDARY, user, src, modifiers) + || SEND_SIGNAL(tool, COMSIG_ITEM_INTERACTING_WITH_ATOM_SECONDARY, user, src, modifiers) \ + || SEND_SIGNAL(user, COMSIG_USER_ITEM_INTERACTION_SECONDARY, src, tool, modifiers) if(early_sig_return) return early_sig_return @@ -76,6 +88,7 @@ else log_tool("[key_name(user)] used [tool] on [src] (right click) at [AREACOORD(src)]") SEND_SIGNAL(tool, COMSIG_TOOL_ATOM_ACTED_SECONDARY(tool_type), src) + SEND_SIGNAL(tool, COMSIG_ITEM_TOOL_ACTED, src, user, tool_type, act_result) return act_result /** @@ -121,6 +134,92 @@ /obj/item/proc/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) return interact_with_atom(interacting_with, user, modifiers) +/** + * ## Ranged item interaction + * + * Handles non-combat ranged interactions of a tool on this atom, + * such as shooting a gun in the direction of someone*, + * having a scanner you can point at someone to scan them at any distance, + * or pointing a laser pointer at something. + * + * *While this intuitively sounds combat related, it is not, + * because a "combat use" of a gun is gun-butting. + */ +/atom/proc/base_ranged_item_interaction(mob/living/user, obj/item/tool, list/modifiers) + SHOULD_CALL_PARENT(TRUE) + PROTECTED_PROC(TRUE) + + var/is_right_clicking = LAZYACCESS(modifiers, RIGHT_CLICK) + var/is_left_clicking = !is_right_clicking + var/early_sig_return = NONE + if(is_left_clicking) + // See [base_item_interaction] for defails on why this is using `||` (TL;DR it's short circuiting) + early_sig_return = SEND_SIGNAL(src, COMSIG_ATOM_RANGED_ITEM_INTERACTION, user, tool, modifiers) \ + || SEND_SIGNAL(tool, COMSIG_RANGED_ITEM_INTERACTING_WITH_ATOM, user, src, modifiers) + else + // See above + early_sig_return = SEND_SIGNAL(src, COMSIG_ATOM_RANGED_ITEM_INTERACTION_SECONDARY, user, tool, modifiers) \ + || SEND_SIGNAL(tool, COMSIG_RANGED_ITEM_INTERACTING_WITH_ATOM_SECONDARY, user, src, modifiers) + if(early_sig_return) + return early_sig_return + + var/self_interaction = is_left_clicking \ + ? ranged_item_interaction(user, tool, modifiers) \ + : ranged_item_interaction_secondary(user, tool, modifiers) + if(self_interaction) + return self_interaction + + var/interact_return = is_left_clicking \ + ? tool.ranged_interact_with_atom(src, user, modifiers) \ + : tool.ranged_interact_with_atom_secondary(src, user, modifiers) + if(interact_return) + return interact_return + + return NONE + +/** + * Called when this atom has an item used on it from a distance. + * IE, a mob is clicking on this atom with an item and is not adjacent. + * + * Does NOT include Telekinesis users, they are considered adjacent generally. + * + * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code. + */ +/atom/proc/ranged_item_interaction(mob/living/user, obj/item/tool, list/modifiers) + return NONE + +/** + * Called when this atom has an item used on it from a distance WITH RIGHT CLICK, + * IE, a mob is right clicking on this atom with an item and is not adjacent. + * + * Default behavior has it run the same code as left click. + * + * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code. + */ +/atom/proc/ranged_item_interaction_secondary(mob/living/user, obj/item/tool, list/modifiers) + return ranged_item_interaction(user, tool, modifiers) + +/** + * Called when this item is being used to interact with an atom from a distance, + * IE, a mob is clicking on an atom with this item and is not adjacent. + * + * Does NOT include Telekinesis users, they are considered adjacent generally + * (so long as this item is adjacent to the atom). + * + * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code. + */ +/obj/item/proc/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return NONE + +/** + * Called when this item is being used to interact with an atom from a distance WITH RIGHT CLICK, + * IE, a mob is right clicking on an atom with this item and is not adjacent. + * + * Default behavior has it run the same code as left click. + */ +/obj/item/proc/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + return ranged_interact_with_atom(interacting_with, user, modifiers) + /* * Tool-specific behavior procs. * diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index f0ca22b3b4fae..8894403586836 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -6,7 +6,7 @@ GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list var/name = "generic objective" //Name for admin prompts var/explanation_text = "Nothing" //What that person is supposed to do. ///if this objective doesn't print failure or success in the roundend report - var/no_failure = FALSE + var/no_failure = FALSE ///name used in printing this objective (Objective #1) var/objective_name = "Objective" var/team_explanation_text //For when there are multiple owners. @@ -688,6 +688,9 @@ GLOBAL_LIST_EMPTY(possible_items) var/list/all_items = M.current.get_all_contents() //this should get things in cheesewheels, books, etc. for(var/obj/I in all_items) //Check for items + if(HAS_TRAIT(I, TRAIT_ITEM_OBJECTIVE_BLOCKED)) + continue + if(istype(I, steal_target)) if(!targetinfo) //If there's no targetinfo, then that means it was a custom objective. At this point, we know you have the item, so return 1. return TRUE diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 8a994350be856..4bd635b7ebee5 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -5,7 +5,7 @@ //Contains the target item datums for Steal objectives. /datum/objective_item /// How the item is described in the objective - var/name = "A silly bike horn! Honk!" + var/name = "a silly bike horn! Honk!" /// Typepath of item var/targetitem = /obj/item/bikehorn /// Valid containers that the target item can be in. @@ -566,7 +566,7 @@ // A number of special early-game steal objectives intended to be used with the steal-and-destroy objective. // They're basically items of utility or emotional value that may be found on many players or lying around the station. /datum/objective_item/steal/traitor/insuls - name = "insulated gloves" + name = "some insulated gloves" targetitem = /obj/item/clothing/gloves/color/yellow excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_ATMOSPHERIC_TECHNICIAN, JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER) item_owner = list(JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER) @@ -578,7 +578,7 @@ return add_item_to_steal(src, /obj/item/clothing/gloves/color/yellow) /datum/objective_item/steal/traitor/moth_plush - name = "cute moth plush toy" + name = "a cute moth plush toy" targetitem = /obj/item/toy/plush/moth excludefromjob = list(JOB_PSYCHOLOGIST, JOB_PARAMEDIC, JOB_CHEMIST, JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_CORONER) exists_on_map = TRUE @@ -589,7 +589,7 @@ return add_item_to_steal(src, /obj/item/toy/plush/moth) /datum/objective_item/steal/traitor/lizard_plush - name = "cute lizard plush toy" + name = "a cute lizard plush toy" targetitem = /obj/item/toy/plush/lizard_plushie exists_on_map = TRUE difficulty = 1 @@ -633,7 +633,7 @@ return add_item_to_steal(src, /obj/item/book/manual/wiki/security_space_law) /datum/objective_item/steal/traitor/rpd - name = "rapid pipe dispenser" + name = "a rapid pipe dispenser" targetitem = /obj/item/pipe_dispenser excludefromjob = list( JOB_ATMOSPHERIC_TECHNICIAN, @@ -679,7 +679,7 @@ objective_type = OBJECTIVE_ITEM_TYPE_SPY /datum/objective_item/steal/spy/lamarr - name = "The Research Director's pet headcrab" + name = "the Research Director's pet headcrab" targetitem = /obj/item/clothing/mask/facehugger/lamarr excludefromjob = list(JOB_RESEARCH_DIRECTOR) exists_on_map = TRUE @@ -809,7 +809,7 @@ return add_item_to_steal(src, /obj/item/stamp/head) /datum/objective_item/steal/spy/sunglasses - name = "sunglasses" + name = "some sunglasses" targetitem = /obj/item/clothing/glasses/sunglasses excludefromjob = list( JOB_CAPTAIN, @@ -828,7 +828,7 @@ You can also obtain a pair from dissassembling hudglasses." /datum/objective_item/steal/spy/ce_modsuit - name = "the cheif engineer's advanced MOD control unit" + name = "the chief engineer's advanced MOD control unit" targetitem = /obj/item/mod/control/pre_equipped/advanced excludefromjob = list(JOB_CHIEF_ENGINEER) exists_on_map = TRUE diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 57047c25cac10..9f889a4193f76 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -350,15 +350,15 @@ user.transferItemToLoc(src, pad, TRUE) atom_storage.close_all() -/obj/item/storage/briefcase/launchpad/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/launchpad_remote)) - var/obj/item/launchpad_remote/L = I - if(L.pad == WEAKREF(src.pad)) //do not attempt to link when already linked - return ..() - L.pad = WEAKREF(src.pad) - to_chat(user, span_notice("You link [pad] to [L].")) - else - return ..() +/obj/item/storage/briefcase/launchpad/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) + if(istype(inserted, /obj/item/launchpad_remote)) + var/obj/item/launchpad_remote/remote = inserted + if(remote.pad == WEAKREF(src.pad)) + return TRUE + remote.pad = WEAKREF(src.pad) + to_chat(user, span_notice("You link [pad] to [remote].")) + return FALSE // no insert + return TRUE /obj/item/launchpad_remote name = "folder" diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 0ddebbf3ee30f..3e83890d755d6 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -413,7 +413,7 @@ //Dropper tools if(beaker) if(is_type_in_list(item, list(/obj/item/reagent_containers/dropper, /obj/item/ph_meter, /obj/item/ph_paper, /obj/item/reagent_containers/syringe))) - item.afterattack(beaker, user, 1) + item.interact_with_atom(beaker, user) return /obj/machinery/space_heater/improvised_chem_heater/on_deconstruction(disassembled = TRUE) diff --git a/code/game/objects/effects/spawners/random/trash.dm b/code/game/objects/effects/spawners/random/trash.dm index 4ed9fe2a812a4..dfac8e4c0c814 100644 --- a/code/game/objects/effects/spawners/random/trash.dm +++ b/code/game/objects/effects/spawners/random/trash.dm @@ -28,6 +28,32 @@ /obj/item/shard/plasma = 1, ) +/obj/effect/spawner/random/trash/deluxe_garbage + name = "fancy deluxe garbage spawner" + loot = list( + /obj/effect/spawner/random/trash/garbage = 25, + /obj/effect/spawner/random/trash/food_packaging = 10, + /obj/effect/spawner/random/entertainment/money = 10, + /obj/effect/spawner/random/trash/crushed_can = 10, + /obj/item/shard/plasma = 5, + /obj/item/reagent_containers/pill/maintenance = 5, + /obj/item/mail/junkmail = 5, + /obj/effect/spawner/random/food_or_drink/snack = 5, + /obj/effect/spawner/random/trash/soap = 3, + /obj/item/reagent_containers/cup/glass/sillycup = 3, + /obj/item/broken_bottle = 3, + /obj/item/reagent_containers/cup/soda_cans/grey_bull = 1, + /obj/effect/spawner/random/engineering/tool = 1, + /mob/living/basic/mouse = 1, + /obj/item/food/grown/cannabis = 1, + /obj/item/reagent_containers/cup/rag = 1, + /obj/effect/spawner/random/entertainment/drugs= 1, + /obj/item/modular_computer/pda = 1, + /obj/item/reagent_containers/syringe = 1, + /obj/effect/spawner/random/entertainment/cigar = 1, + /obj/item/stack/ore/gold = 1, + ) + /obj/effect/spawner/random/trash/cigbutt name = "cigarette butt spawner" loot = list( diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 452d02c981d62..08f4260e97b81 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1410,7 +1410,7 @@ mob_loc.update_clothing(slot_flags) /// Called on [/datum/element/openspace_item_click_handler/proc/on_afterattack]. Check the relative file for information. -/obj/item/proc/handle_openspace_click(turf/target, mob/user, proximity_flag, click_parameters) +/obj/item/proc/handle_openspace_click(turf/target, mob/user, click_parameters) stack_trace("Undefined handle_openspace_click() behaviour. Ascertain the openspace_item_click_handler element has been attached to the right item and that its proc override doesn't call parent.") /** @@ -1444,8 +1444,13 @@ SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED_AS_OUTFIT, outfit_wearer, visuals_only, item_slot) -/// Whether or not this item can be put into a storage item through attackby -/obj/item/proc/attackby_storage_insert(datum/storage, atom/storage_holder, mob/user) +/** + * Called before this item is placed into a storage container + * via the item clicking on the target atom + * + * Returning FALSE will prevent the item from being stored + */ +/obj/item/proc/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/user) return TRUE /obj/item/proc/do_pickup_animation(atom/target, turf/source) diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index 6d5a8340a3fb0..3365a24650a5b 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -219,14 +219,11 @@ . = ..() stored_custom_color = stored_color -/obj/item/airlock_painter/decal/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity) - balloon_alert(user, "get closer!") - return - - if(isfloorturf(target) && use_paint(user)) - paint_floor(target) +/obj/item/airlock_painter/decal/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(isfloorturf(interacting_with) && use_paint(user)) + paint_floor(interacting_with) + return ITEM_INTERACT_SUCCESS + return NONE /** * Actually add current decal to the floor. diff --git a/code/game/objects/items/bear_armor.dm b/code/game/objects/items/bear_armor.dm index 556875a474e2f..8cfad42be15a6 100644 --- a/code/game/objects/items/bear_armor.dm +++ b/code/game/objects/items/bear_armor.dm @@ -5,23 +5,21 @@ icon = 'icons/obj/tools.dmi' icon_state = "bear_armor_upgrade" -/obj/item/bear_armor/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(!proximity_flag) - return - if(!istype(target, /mob/living/basic/bear)) - return - var/mob/living/basic/bear/bear_target = target - if(bear_target.armored) - to_chat(user, span_warning("[bear_target] has already been armored up!")) - return - bear_target.armored = TRUE - bear_target.maxHealth += 60 - bear_target.health += 60 - bear_target.armour_penetration += 20 - bear_target.melee_damage_lower += 3 - bear_target.melee_damage_upper += 5 - bear_target.wound_bonus += 5 - bear_target.update_icons() - to_chat(user, span_info("You strap the armor plating to [bear_target] and sharpen [bear_target.p_their()] claws with the nail filer. This was a great idea.")) +/obj/item/bear_armor/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!istype(interacting_with, /mob/living/basic/bear)) + return NONE + var/mob/living/basic/bear/bear = interacting_with + if(bear.armored) + to_chat(user, span_warning("[bear] has already been armored up!")) + return ITEM_INTERACT_BLOCKING + bear.armored = TRUE + bear.maxHealth += 60 + bear.health += 60 + bear.armour_penetration += 20 + bear.melee_damage_lower += 3 + bear.melee_damage_upper += 5 + bear.wound_bonus += 5 + bear.update_icons() + to_chat(user, span_info("You strap the armor plating to [bear] and sharpen [bear.p_their()] claws with the nail filer. This was a great idea.")) qdel(src) + return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 19d3d273337c4..c949f977508f1 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -19,6 +19,7 @@ deploy_bodybag(user, interacting_with) return ITEM_INTERACT_SUCCESS return NONE + /obj/item/bodybag/attempt_pickup(mob/user) // can't pick ourselves up if we are inside of the bodybag, else very weird things may happen if(contains(user)) diff --git a/code/game/objects/items/broom.dm b/code/game/objects/items/broom.dm index 4f7cb137d3009..fa849c51437da 100644 --- a/code/game/objects/items/broom.dm +++ b/code/game/objects/items/broom.dm @@ -54,12 +54,9 @@ /obj/item/pushbroom/proc/on_unwield(obj/item/source, mob/user) UnregisterSignal(user, COMSIG_MOVABLE_PRE_MOVE) -/obj/item/pushbroom/afterattack(atom/A, mob/user, proximity) - . = ..() - if(!proximity) - return - sweep(user, A) - return . | AFTERATTACK_PROCESSED_ITEM +/obj/item/pushbroom/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + sweep(user, interacting_with) + return NONE // I guess /** * Attempts to push up to BROOM_PUSH_LIMIT atoms from a given location the user's faced direction diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 880e619da0a8a..6b7996c0423f4 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -425,13 +425,11 @@ user.visible_message(span_notice("[user] shows you: [icon2html(src, viewers(user))] [src.name][minor]."), span_notice("You show \the [src.name][minor].")) add_fingerprint(user) -/obj/item/card/id/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return - if(!proximity_flag || !check_allowed_items(target) || !isfloorturf(target)) - return - try_project_paystand(user, target) +/obj/item/card/id/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(!check_allowed_items(interacting_with) || !isfloorturf(interacting_with)) + return NONE + try_project_paystand(user, interacting_with) + return ITEM_INTERACT_SUCCESS /obj/item/card/id/attack_self_secondary(mob/user, modifiers) . = ..() @@ -1396,68 +1394,59 @@ theft_target = null return ..() -/obj/item/card/id/advanced/chameleon/afterattack(atom/target, mob/user, proximity, click_parameters) - . = ..() - if(!proximity) - return - - if(isidcard(target)) - theft_target = WEAKREF(target) +/obj/item/card/id/advanced/chameleon/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(isidcard(interacting_with)) + theft_target = WEAKREF(interacting_with) ui_interact(user) - return . | AFTERATTACK_PROCESSED_ITEM - -/obj/item/card/id/advanced/chameleon/pre_attack_secondary(atom/target, mob/living/user, params) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return . + return ITEM_INTERACT_SUCCESS + return NONE +/obj/item/card/id/advanced/chameleon/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) // If we're attacking a human, we want it to be covert. We're not ATTACKING them, we're trying // to sneakily steal their accesses by swiping our agent ID card near them. As a result, we - // return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN to cancel any part of the following the attack chain. - if(ishuman(target)) - target.balloon_alert(user, "scanning ID card...") + // return ITEM_INTERACT_BLOCKING to cancel any part of the following the attack chain. + if(ishuman(interacting_with)) + interacting_with.balloon_alert(user, "scanning ID card...") - if(!do_after(user, 2 SECONDS, target)) - target.balloon_alert(user, "interrupted!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - var/mob/living/carbon/human/human_target = target + if(!do_after(user, 2 SECONDS, interacting_with)) + interacting_with.balloon_alert(user, "interrupted!") + return ITEM_INTERACT_BLOCKING + var/mob/living/carbon/human/human_target = interacting_with var/list/target_id_cards = human_target.get_all_contents_type(/obj/item/card/id) if(!length(target_id_cards)) - target.balloon_alert(user, "no IDs!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + interacting_with.balloon_alert(user, "no IDs!") + return ITEM_INTERACT_BLOCKING var/selected_id = pick(target_id_cards) - target.balloon_alert(user, UNLINT("IDs synced")) + interacting_with.balloon_alert(user, UNLINT("IDs synced")) theft_target = WEAKREF(selected_id) ui_interact(user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_SUCCESS - if(isitem(target)) - var/obj/item/target_item = target + if(isitem(interacting_with)) + var/obj/item/target_item = interacting_with - target.balloon_alert(user, "scanning ID card...") + interacting_with.balloon_alert(user, "scanning ID card...") var/list/target_id_cards = target_item.get_all_contents_type(/obj/item/card/id) - var/target_item_id = target_item.GetID() if(target_item_id) target_id_cards |= target_item_id if(!length(target_id_cards)) - target.balloon_alert(user, "no IDs!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + interacting_with.balloon_alert(user, "no IDs!") + return ITEM_INTERACT_BLOCKING var/selected_id = pick(target_id_cards) - target.balloon_alert(user, UNLINT("IDs synced")) + interacting_with.balloon_alert(user, UNLINT("IDs synced")) theft_target = WEAKREF(selected_id) ui_interact(user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_SUCCESS - return . + return NONE /obj/item/card/id/advanced/chameleon/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 37cfb70240d67..62742b98add10 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -276,12 +276,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/mob/living/carbon/the_smoker = user return the_smoker.can_breathe_helmet() -/obj/item/clothing/mask/cigarette/afterattack(obj/item/reagent_containers/cup/glass, mob/user, proximity) - . = ..() - if(!proximity || lit) //can't dip if cigarette is lit (it will heat the reagents in the glass instead) - return +/obj/item/clothing/mask/cigarette/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(lit) //can't dip if cigarette is lit (it will heat the reagents in the glass instead) + return NONE + var/obj/item/reagent_containers/cup/glass = interacting_with if(!istype(glass)) //you can dip cigarettes into beakers - return + return NONE if(glass.reagents.trans_to(src, chem_volume, transferred_by = user)) //if reagents were transferred, show the message to_chat(user, span_notice("You dip \the [src] into \the [glass].")) @@ -290,8 +290,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM to_chat(user, span_warning("[glass] is empty!")) else to_chat(user, span_warning("[src] is full!")) - - return AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_SUCCESS /obj/item/clothing/mask/cigarette/update_icon_state() . = ..() diff --git a/code/game/objects/items/climbingrope.dm b/code/game/objects/items/climbingrope.dm index 0317860407453..693f850be2a98 100644 --- a/code/game/objects/items/climbingrope.dm +++ b/code/game/objects/items/climbingrope.dm @@ -26,20 +26,23 @@ . += span_notice("Then, click solid ground adjacent to the hole above you.") . += span_notice("The rope looks like you could use it [uses] times before it falls apart.") -/obj/item/climbing_hook/afterattack(turf/open/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(target.z == user.z) - return +/obj/item/climbing_hook/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return ranged_interact_with_atom(interacting_with, user, modifiers) + +/obj/item/climbing_hook/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(interacting_with.z == user.z) + return NONE + var/turf/open/target = interacting_with if(!istype(target) || isopenspaceturf(target)) - return - + return ITEM_INTERACT_BLOCKING + var/turf/user_turf = get_turf(user) var/turf/above = GET_TURF_ABOVE(user_turf) if(target_blocked(target, above)) - return + return ITEM_INTERACT_BLOCKING if(!isopenspaceturf(above) || !above.Adjacent(target)) //are we below a hole, is the target blocked, is the target adjacent to our hole balloon_alert(user, "blocked!") - return + return ITEM_INTERACT_BLOCKING var/away_dir = get_dir(above, target) user.visible_message(span_notice("[user] begins climbing upwards with [src]."), span_notice("You get to work on properly hooking [src] and going upwards.")) @@ -56,6 +59,7 @@ qdel(src) QDEL_LIST(effects) + return ITEM_INTERACT_SUCCESS // didnt want to mess up is_blocked_turf_ignore_climbable /// checks if our target is blocked, also checks for border objects facing the above turf and climbable stuff diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 52ba71a253863..3b10f044fc3c2 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -118,7 +118,9 @@ return TOXLOSS /obj/item/soap/proc/should_clean(datum/cleaning_source, atom/atom_to_clean, mob/living/cleaner) - return check_allowed_items(atom_to_clean) + . = CLEAN_ALLOWED + if(!check_allowed_items(atom_to_clean)) + . |= CLEAN_NO_XP /** * Decrease the number of uses the bar of soap has. @@ -145,17 +147,15 @@ qdel(src) /obj/item/soap/nanotrasen/cyborg/noUses(mob/user) - to_chat(user, span_warning("The soap has ran out of chemicals")) + to_chat(user, span_warning("[src] has ran out of chemicals! Head to a recharger to refill it.")) -/obj/item/soap/nanotrasen/cyborg/afterattack(atom/target, mob/user, proximity) - . = isitem(target) ? AFTERATTACK_PROCESSED_ITEM : NONE +/obj/item/soap/nanotrasen/cyborg/should_clean(datum/cleaning_source, atom/atom_to_clean, mob/living/cleaner) if(uses <= 0) - to_chat(user, span_warning("No good, you need to recharge!")) - return . - return ..() | . + return CLEAN_BLOCKED + return ..() -/obj/item/soap/attackby_storage_insert(datum/storage, atom/storage_holder, mob/living/user) - return !user?.combat_mode // only cleans a storage item if on combat +/obj/item/soap/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/living/user) + return !user.combat_mode // only cleans a storage item if on combat /* * Bike Horns diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index de81caa22e9a7..abad07f96d844 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -35,35 +35,35 @@ update_icon_state() balloon_alert(user, "mode: [desc[mode]]") -// Airlock remote works by sending NTNet packets to whatever it's pointed at. -/obj/item/door_remote/afterattack(atom/target, mob/user) - . = ..() +/obj/item/door_remote/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) +/obj/item/door_remote/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) var/obj/machinery/door/door - if (istype(target, /obj/machinery/door)) - door = target - + if (istype(interacting_with, /obj/machinery/door)) + door = interacting_with if (!door.opens_with_door_remote) - return + return ITEM_INTERACT_BLOCKING + else - for (var/obj/machinery/door/door_on_turf in get_turf(target)) + for (var/obj/machinery/door/door_on_turf in get_turf(interacting_with)) if (door_on_turf.opens_with_door_remote) door = door_on_turf break if (isnull(door)) - return + return ITEM_INTERACT_BLOCKING if (!door.check_access_list(access_list) || !door.requiresID()) - target.balloon_alert(user, "can't access!") - return + interacting_with.balloon_alert(user, "can't access!") + return ITEM_INTERACT_BLOCKING var/obj/machinery/door/airlock/airlock = door if (!door.hasPower() || (istype(airlock) && !airlock.canAIControl())) - target.balloon_alert(user, mode == WAND_OPEN ? "it won't budge!" : "nothing happens!") - return + interacting_with.balloon_alert(user, mode == WAND_OPEN ? "it won't budge!" : "nothing happens!") + return ITEM_INTERACT_BLOCKING switch (mode) if (WAND_OPEN) @@ -73,8 +73,8 @@ door.close() if (WAND_BOLT) if (!istype(airlock)) - target.balloon_alert(user, "only airlocks!") - return + interacting_with.balloon_alert(user, "only airlocks!") + return ITEM_INTERACT_BLOCKING if (airlock.locked) airlock.unbolt() @@ -84,12 +84,14 @@ log_combat(user, airlock, "bolted", src) if (WAND_EMERGENCY) if (!istype(airlock)) - target.balloon_alert(user, "only airlocks!") - return + interacting_with.balloon_alert(user, "only airlocks!") + return ITEM_INTERACT_BLOCKING airlock.emergency = !airlock.emergency airlock.update_appearance(UPDATE_ICON) + return ITEM_INTERACT_SUCCESS + /obj/item/door_remote/update_icon_state() var/icon_state_mode switch(mode) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 6e4dbd233bac8..03618551c0ca2 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -421,7 +421,7 @@ return LOWER_TEXT(crayon_regex.Replace(text, "")) /// Attempts to color the target. Returns how many charges were used. -/obj/item/toy/crayon/proc/use_on(atom/target, mob/user, params) +/obj/item/toy/crayon/proc/use_on(atom/target, mob/user, list/modifiers) var/static/list/punctuation = list("!","?",".",",","/","+","-","=","%","#","&") if(istype(target, /obj/effect/decal/cleanable)) @@ -491,7 +491,6 @@ else graf_rot = 0 - var/list/modifiers = params2list(params) var/clickx var/clicky @@ -568,19 +567,12 @@ reagents.expose(draw_turf, methods = TOUCH, volume_modifier = volume_multiplier) check_empty(user) -/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity, params) - . = ..() - - if(!proximity) - return - - if (isitem(target)) - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/toy/crayon/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if (!check_allowed_items(interacting_with)) + return NONE - if (!check_allowed_items(target)) - return - - use_on(target, user, params) + use_on(interacting_with, user, modifiers) + return ITEM_INTERACT_BLOCKING /obj/item/toy/crayon/get_writing_implement_details() return list( @@ -674,7 +666,7 @@ charges = INFINITE_CHARGES dye_color = DYE_RAINBOW -/obj/item/toy/crayon/rainbow/afterattack(atom/target, mob/user, proximity, params) +/obj/item/toy/crayon/rainbow/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) set_painting_tool_color(rgb(rand(0,255), rand(0,255), rand(0,255))) return ..() @@ -833,7 +825,7 @@ . += "It is empty." . += span_notice("Alt-click [src] to [ is_capped ? "take the cap off" : "put the cap on"]. Right-click a colored object to match its existing color.") -/obj/item/toy/crayon/spraycan/use_on(atom/target, mob/user, params) +/obj/item/toy/crayon/spraycan/use_on(atom/target, mob/user, list/modifiers) if(is_capped) balloon_alert(user, "take the cap off first!") return @@ -927,17 +919,15 @@ return ..() -/obj/item/toy/crayon/spraycan/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - if(!proximity_flag) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN +/obj/item/toy/crayon/spraycan/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) if(is_capped) balloon_alert(user, "take the cap off first!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING if(check_empty(user)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING - if(isbodypart(target) && actually_paints) - var/obj/item/bodypart/limb = target + if(isbodypart(interacting_with) && actually_paints) + var/obj/item/bodypart/limb = interacting_with if(!IS_ORGANIC_LIMB(limb)) var/list/skins = list() var/static/list/style_list_icons = list("standard" = 'icons/mob/augmentation/augments.dmi', "engineer" = 'icons/mob/augmentation/augments_engineer.dmi', "security" = 'icons/mob/augmentation/augments_security.dmi', "mining" = 'icons/mob/augmentation/augments_mining.dmi') @@ -950,16 +940,14 @@ if(choice && (use_charges(user, 5, requires_full = FALSE))) playsound(user.loc, 'sound/effects/spray.ogg', 5, TRUE, 5) limb.change_appearance(style_list_icons[choice], greyscale = FALSE) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(target.color) - paint_color = target.color + return ITEM_INTERACT_SUCCESS + if(interacting_with.color) + paint_color = interacting_with.color balloon_alert(user, "matched colour of target") update_appearance() - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - else - balloon_alert(user, "can't match those colours!") - - return SECONDARY_ATTACK_CONTINUE_CHAIN + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "can't match those colours!") + return ITEM_INTERACT_BLOCKING /obj/item/toy/crayon/spraycan/click_alt(mob/user) if(!has_cap) @@ -969,7 +957,7 @@ update_appearance() return CLICK_ACTION_SUCCESS -/obj/item/toy/crayon/spraycan/attackby_storage_insert(datum/storage, atom/storage_holder, mob/user) +/obj/item/toy/crayon/spraycan/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/user) return is_capped /obj/item/toy/crayon/spraycan/update_icon_state() diff --git a/code/game/objects/items/debug_items.dm b/code/game/objects/items/debug_items.dm index 44f53df2c2b2d..0a944b300d423 100644 --- a/code/game/objects/items/debug_items.dm +++ b/code/game/objects/items/debug_items.dm @@ -12,12 +12,16 @@ var/datum/species/selected_species var/valid_species = list() -/obj/item/debug/human_spawner/afterattack(atom/target, mob/user, proximity) - ..() - if(isturf(target)) - var/mob/living/carbon/human/H = new /mob/living/carbon/human(target) +/obj/item/debug/human_spawner/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) + +/obj/item/debug/human_spawner/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(isturf(interacting_with)) + var/mob/living/carbon/human/H = new /mob/living/carbon/human(interacting_with) if(selected_species) H.set_species(selected_species) + return ITEM_INTERACT_SUCCESS + return NONE /obj/item/debug/human_spawner/attack_self(mob/user) ..() diff --git a/code/game/objects/items/devices/anomaly_releaser.dm b/code/game/objects/items/devices/anomaly_releaser.dm index 0556b2a2afd49..a7a58bb5d9499 100644 --- a/code/game/objects/items/devices/anomaly_releaser.dm +++ b/code/game/objects/items/devices/anomaly_releaser.dm @@ -19,32 +19,28 @@ ///Can we be used infinitely? var/infinite = FALSE -/obj/item/anomaly_releaser/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - - if(used || !proximity_flag || !istype(target, /obj/item/assembly/signaler/anomaly)) - return +/obj/item/anomaly_releaser/interact_with_atom(atom/target, mob/living/user, list/modifiers) + if(!istype(target, /obj/item/assembly/signaler/anomaly)) + return NONE + if(used) + return ITEM_INTERACT_BLOCKING if(!do_after(user, 3 SECONDS, target)) - return - + return ITEM_INTERACT_BLOCKING if(used) - return + return ITEM_INTERACT_BLOCKING var/obj/item/assembly/signaler/anomaly/core = target - if(!core.anomaly_type) - return + return ITEM_INTERACT_BLOCKING var/obj/effect/anomaly/anomaly = new core.anomaly_type(get_turf(core)) anomaly.stabilize() log_combat(user, anomaly, "released", object = src, addition = "in [get_area(target)].") - if(infinite) - return - - icon_state = used_icon_state - used = TRUE - name = "used " + name - - qdel(core) + if(!infinite) + icon_state = used_icon_state + used = TRUE + name = "used " + name + qdel(core) + return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index e5507473faecd..1920e47f97f66 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -36,29 +36,25 @@ else to_chat(user, span_warning("You can't use [src] while inside something!")) -/obj/item/chameleon/afterattack(atom/target, mob/user , proximity) - . = ..() - if(!proximity) - return - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/chameleon/interact_with_atom(atom/target, mob/living/user, list/modifiers) if(!check_sprite(target)) - return + return ITEM_INTERACT_BLOCKING if(active_dummy)//I now present you the blackli(f)st - return + return ITEM_INTERACT_BLOCKING if(isturf(target)) - return + return ITEM_INTERACT_BLOCKING if(ismob(target)) - return + return ITEM_INTERACT_BLOCKING if(istype(target, /obj/structure/falsewall)) - return + return ITEM_INTERACT_BLOCKING if(target.alpha != 255) - return + return ITEM_INTERACT_BLOCKING if(target.invisibility != 0) - return - if(iseffect(target)) - if(!(istype(target, /obj/effect/decal))) //be a footprint - return + return ITEM_INTERACT_BLOCKING + if(iseffect(target) && !istype(target, /obj/effect/decal)) //be a footprint + return ITEM_INTERACT_BLOCKING make_copy(target, user) + return ITEM_INTERACT_SUCCESS /obj/item/chameleon/proc/make_copy(atom/target, mob/user) playsound(get_turf(src), 'sound/weapons/flash.ogg', 100, TRUE, -6) diff --git a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm index d5d2e6c4d145a..5814101463ba4 100644 --- a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm +++ b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm @@ -55,19 +55,18 @@ addtimer(CALLBACK(src, PROC_REF(recharge)), ROUND_UP(recharge_time)) return TRUE //The actual circuit magic itself is done on a per-object basis -/obj/item/electroadaptive_pseudocircuit/afterattack(atom/target, mob/living/user, proximity) - . = ..() - if(!proximity) - return - . |= AFTERATTACK_PROCESSED_ITEM - if(!is_type_in_typecache(target, recycleable_circuits)) - return +/obj/item/electroadaptive_pseudocircuit/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!is_type_in_typecache(interacting_with, recycleable_circuits)) + return NONE circuits++ maptext = MAPTEXT(circuits) - user.visible_message(span_notice("User breaks down [target] with [src]."), \ - span_notice("You recycle [target] into [src]. It now has material for [circuits] circuits.")) + user.visible_message( + span_notice("User breaks down [interacting_with] with [src]."), + span_notice("You recycle [interacting_with] into [src]. It now has material for [circuits] circuits.") + ) playsound(user, 'sound/items/deconstruct.ogg', 50, TRUE) - qdel(target) + qdel(interacting_with) + return ITEM_INTERACT_SUCCESS /obj/item/electroadaptive_pseudocircuit/proc/recharge() playsound(src, 'sound/machines/chime.ogg', 25, TRUE) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index d0b72fe2de8e0..99e7c43235ab9 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -108,162 +108,170 @@ user.visible_message(span_suicide("[user] is putting [src] close to [user.p_their()] eyes and turning it on! It looks like [user.p_theyre()] trying to commit suicide!")) return FIRELOSS -/obj/item/flashlight/attack(mob/living/carbon/M, mob/living/carbon/human/user) - add_fingerprint(user) - if(istype(M) && light_on && (user.zone_selected in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH))) +/obj/item/flashlight/proc/eye_examine(mob/living/carbon/human/M, mob/living/user) + . = list() + if((M.head && M.head.flags_cover & HEADCOVERSEYES) || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSEYES) || (M.glasses && M.glasses.flags_cover & GLASSESCOVERSEYES)) + to_chat(user, span_warning("You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSEYES) ? "helmet" : (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSEYES) ? "mask": "glasses"] first!")) + return - if((HAS_TRAIT(user, TRAIT_CLUMSY) || HAS_TRAIT(user, TRAIT_DUMB)) && prob(50)) //too dumb to use flashlight properly - return ..() //just hit them in the head + var/obj/item/organ/internal/eyes/E = M.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/brain = M.get_organ_slot(ORGAN_SLOT_BRAIN) + if(!E) + to_chat(user, span_warning("[M] doesn't have any eyes!")) + return - if(!ISADVANCEDTOOLUSER(user)) - to_chat(user, span_warning("You don't have the dexterity to do this!")) - return + M.flash_act(visual = TRUE, length = (user.combat_mode) ? 2.5 SECONDS : 1 SECONDS) // Apply a 1 second flash effect to the target. The duration increases to 2.5 Seconds if you have combat mode on. - if(!M.get_bodypart(BODY_ZONE_HEAD)) - to_chat(user, span_warning("[M] doesn't have a head!")) - return + if(M == user) //they're using it on themselves + user.visible_message(span_warning("[user] shines [src] into [M.p_their()] eyes."), ignored_mobs = user) + . += span_info("You direct [src] to into your eyes:\n") - if(light_power < 1) - to_chat(user, "[span_warning("\The [src] isn't bright enough to see anything!")] ") - return - - var/render_list = list()//information will be packaged in a list for clean display to the user + if(M.is_blind()) + . += "You're not entirely certain what you were expecting...\n" + else + . += "Trippy!\n" - switch(user.zone_selected) - if(BODY_ZONE_PRECISE_EYES) - if((M.head && M.head.flags_cover & HEADCOVERSEYES) || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSEYES) || (M.glasses && M.glasses.flags_cover & GLASSESCOVERSEYES)) - to_chat(user, span_warning("You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSEYES) ? "helmet" : (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSEYES) ? "mask": "glasses"] first!")) - return + else + user.visible_message(span_warning("[user] directs [src] to [M]'s eyes."), ignored_mobs = user) + . += span_info("You direct [src] to [M]'s eyes:\n") - var/obj/item/organ/internal/eyes/E = M.get_organ_slot(ORGAN_SLOT_EYES) - var/obj/item/organ/internal/brain = M.get_organ_slot(ORGAN_SLOT_BRAIN) - if(!E) - to_chat(user, span_warning("[M] doesn't have any eyes!")) - return + if(M.stat == DEAD || M.is_blind() || M.get_eye_protection() > FLASH_PROTECTION_WELDER) + . += "[M.p_Their()] pupils don't react to the light!\n"//mob is dead + else if(brain.damage > 20) + . += "[M.p_Their()] pupils contract unevenly!\n"//mob has sustained damage to their brain + else + . += "[M.p_Their()] pupils narrow.\n"//they're okay :D - M.flash_act(visual = TRUE, length = (user.combat_mode) ? 2.5 SECONDS : 1 SECONDS) // Apply a 1 second flash effect to the target. The duration increases to 2.5 Seconds if you have combat mode on. + if(M.dna && M.dna.check_mutation(/datum/mutation/human/xray)) + . += "[M.p_Their()] pupils give an eerie glow!\n"//mob has X-ray vision - if(M == user) //they're using it on themselves - user.visible_message(span_warning("[user] shines [src] into [M.p_their()] eyes."), ignored_mobs = user) - render_list += span_info("You direct [src] to into your eyes:\n") + return . - if(M.is_blind()) - render_list += "You're not entirely certain what you were expecting...\n" - else - render_list += "Trippy!\n" +/obj/item/flashlight/proc/mouth_examine(mob/living/carbon/human/M, mob/living/user) + . = list() + if(M.is_mouth_covered()) + to_chat(user, span_warning("You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSMOUTH) ? "helmet" : "mask"] first!")) + return + var/list/mouth_organs = list() + for(var/obj/item/organ/organ as anything in M.organs) + if(organ.zone == BODY_ZONE_PRECISE_MOUTH) + mouth_organs.Add(organ) + var/organ_list = "" + var/organ_count = LAZYLEN(mouth_organs) + if(organ_count) + for(var/I in 1 to organ_count) + if(I > 1) + if(I == mouth_organs.len) + organ_list += ", and " else - user.visible_message(span_warning("[user] directs [src] to [M]'s eyes."), ignored_mobs = user) - render_list += span_info("You direct [src] to [M]'s eyes:\n") - - if(M.stat == DEAD || M.is_blind() || M.get_eye_protection() > FLASH_PROTECTION_WELDER) - render_list += "[M.p_Their()] pupils don't react to the light!\n"//mob is dead - else if(brain.damage > 20) - render_list += "[M.p_Their()] pupils contract unevenly!\n"//mob has sustained damage to their brain - else - render_list += "[M.p_Their()] pupils narrow.\n"//they're okay :D - - if(M.dna && M.dna.check_mutation(/datum/mutation/human/xray)) - render_list += "[M.p_Their()] pupils give an eerie glow!\n"//mob has X-ray vision - - //display our packaged information in an examine block for easy reading - to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO) - - if(BODY_ZONE_PRECISE_MOUTH) - - if(M.is_mouth_covered()) - to_chat(user, span_warning("You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSMOUTH) ? "helmet" : "mask"] first!")) - return - - var/list/mouth_organs = new - for(var/obj/item/organ/organ as anything in M.organs) - if(organ.zone == BODY_ZONE_PRECISE_MOUTH) - mouth_organs.Add(organ) - var/organ_list = "" - var/organ_count = LAZYLEN(mouth_organs) - if(organ_count) - for(var/I in 1 to organ_count) - if(I > 1) - if(I == mouth_organs.len) - organ_list += ", and " - else - organ_list += ", " - var/obj/item/organ/O = mouth_organs[I] - organ_list += (O.gender == "plural" ? O.name : "\an [O.name]") - - var/pill_count = 0 - for(var/datum/action/item_action/hands_free/activate_pill/AP in M.actions) - pill_count++ - - if(M == user)//if we're looking on our own mouth - var/can_use_mirror = FALSE - if(isturf(user.loc)) - var/obj/structure/mirror/mirror = locate(/obj/structure/mirror, user.loc) - if(mirror) - switch(user.dir) - if(NORTH) - can_use_mirror = mirror.pixel_y > 0 - if(SOUTH) - can_use_mirror = mirror.pixel_y < 0 - if(EAST) - can_use_mirror = mirror.pixel_x > 0 - if(WEST) - can_use_mirror = mirror.pixel_x < 0 - - M.visible_message(span_notice("[M] directs [src] to [ M.p_their()] mouth."), ignored_mobs = user) - render_list += span_info("You point [src] into your mouth:\n") - if(!can_use_mirror) - to_chat(user, span_notice("You can't see anything without a mirror.")) - return - if(organ_count) - render_list += "Inside your mouth [organ_count > 1 ? "are" : "is"] [organ_list].\n" - else - render_list += "There's nothing inside your mouth.\n" - if(pill_count) - render_list += "You have [pill_count] implanted pill[pill_count > 1 ? "s" : ""].\n" - - else //if we're looking in someone elses mouth - user.visible_message(span_notice("[user] directs [src] to [M]'s mouth."), ignored_mobs = user) - render_list += span_info("You point [src] into [M]'s mouth:\n") - if(organ_count) - render_list += "Inside [ M.p_their()] mouth [organ_count > 1 ? "are" : "is"] [organ_list].\n" - else - render_list += "[M] doesn't have any organs in [ M.p_their()] mouth.\n" - if(pill_count) - render_list += "[M] has [pill_count] pill[pill_count > 1 ? "s" : ""] implanted in [ M.p_their()] teeth.\n" - - //assess any suffocation damage - var/hypoxia_status = M.getOxyLoss() > 20 - - if(M == user) - if(hypoxia_status) - render_list += "Your lips appear blue!\n"//you have suffocation damage - else - render_list += "Your lips appear healthy.\n"//you're okay! - else - if(hypoxia_status) - render_list += "[M.p_Their()] lips appear blue!\n"//they have suffocation damage - else - render_list += "[M.p_Their()] lips appear healthy.\n"//they're okay! - - //assess blood level - if(M == user) - render_list += span_info("You press a finger to your gums:\n") - else - render_list += span_info("You press a finger to [M.p_their()] gums:\n") + organ_list += ", " + var/obj/item/organ/O = mouth_organs[I] + organ_list += (O.gender == "plural" ? O.name : "\an [O.name]") + + var/pill_count = 0 + for(var/datum/action/item_action/hands_free/activate_pill/AP in M.actions) + pill_count++ + + if(M == user)//if we're looking on our own mouth + var/can_use_mirror = FALSE + if(isturf(user.loc)) + var/obj/structure/mirror/mirror = locate(/obj/structure/mirror, user.loc) + if(mirror) + switch(user.dir) + if(NORTH) + can_use_mirror = mirror.pixel_y > 0 + if(SOUTH) + can_use_mirror = mirror.pixel_y < 0 + if(EAST) + can_use_mirror = mirror.pixel_x > 0 + if(WEST) + can_use_mirror = mirror.pixel_x < 0 + + M.visible_message(span_notice("[M] directs [src] to [ M.p_their()] mouth."), ignored_mobs = user) + . += span_info("You point [src] into your mouth:\n") + if(!can_use_mirror) + to_chat(user, span_notice("You can't see anything without a mirror.")) + return + if(organ_count) + . += "Inside your mouth [organ_count > 1 ? "are" : "is"] [organ_list].\n" + else + . += "There's nothing inside your mouth.\n" + if(pill_count) + . += "You have [pill_count] implanted pill[pill_count > 1 ? "s" : ""].\n" + + else //if we're looking in someone elses mouth + user.visible_message(span_notice("[user] directs [src] to [M]'s mouth."), ignored_mobs = user) + . += span_info("You point [src] into [M]'s mouth:\n") + if(organ_count) + . += "Inside [ M.p_their()] mouth [organ_count > 1 ? "are" : "is"] [organ_list].\n" + else + . += "[M] doesn't have any organs in [ M.p_their()] mouth.\n" + if(pill_count) + . += "[M] has [pill_count] pill[pill_count > 1 ? "s" : ""] implanted in [ M.p_their()] teeth.\n" - if(M.blood_volume <= BLOOD_VOLUME_SAFE && M.blood_volume > BLOOD_VOLUME_OKAY) - render_list += "Color returns slowly!\n"//low blood - else if(M.blood_volume <= BLOOD_VOLUME_OKAY) - render_list += "Color does not return!\n"//critical blood - else - render_list += "Color returns quickly.\n"//they're okay :D + //assess any suffocation damage + var/hypoxia_status = M.getOxyLoss() > 20 + + if(M == user) + if(hypoxia_status) + . += "Your lips appear blue!\n"//you have suffocation damage + else + . += "Your lips appear healthy.\n"//you're okay! + else + if(hypoxia_status) + . += "[M.p_Their()] lips appear blue!\n"//they have suffocation damage + else + . += "[M.p_Their()] lips appear healthy.\n"//they're okay! - //display our packaged information in an examine block for easy reading - to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO) + //assess blood level + if(M == user) + . += span_info("You press a finger to your gums:\n") + else + . += span_info("You press a finger to [M.p_their()] gums:\n") + if(M.blood_volume <= BLOOD_VOLUME_SAFE && M.blood_volume > BLOOD_VOLUME_OKAY) + . += "Color returns slowly!\n"//low blood + else if(M.blood_volume <= BLOOD_VOLUME_OKAY) + . += "Color does not return!\n"//critical blood else - return ..() + . += "Color returns quickly.\n"//they're okay :D + +/obj/item/flashlight/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!ishuman(interacting_with)) + return NONE + if(!light_on) + return NONE + add_fingerprint(user) + if(user.combat_mode || (user.zone_selected != BODY_ZONE_PRECISE_EYES && user.zone_selected != BODY_ZONE_PRECISE_MOUTH)) + return NONE + if((HAS_TRAIT(user, TRAIT_CLUMSY) || HAS_TRAIT(user, TRAIT_DUMB)) && prob(50)) //too dumb to use flashlight properly + return ITEM_INTERACT_SKIP_TO_ATTACK //just hit them in the head + + . = ITEM_INTERACT_BLOCKING + if(!ISADVANCEDTOOLUSER(user)) + to_chat(user, span_warning("You don't have the dexterity to do this!")) + return + var/mob/living/scanning = interacting_with + if(!scanning.get_bodypart(BODY_ZONE_HEAD)) + to_chat(user, span_warning("[scanning] doesn't have a head!")) + return + if(light_power < 1) + to_chat(user, span_warning("[src] isn't bright enough to see anything!")) + return + + var/list/render_list = list() + switch(user.zone_selected) + if(BODY_ZONE_PRECISE_EYES) + render_list += eye_examine(scanning, user) + if(BODY_ZONE_PRECISE_MOUTH) + render_list += mouth_examine(scanning, user) + + if(length(render_list)) + //display our packaged information in an examine block for easy reading + to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING /// for directional sprites - so we get the same sprite in the inventory each time we pick one up /obj/item/flashlight/equipped(mob/user, slot, initial) @@ -299,24 +307,21 @@ light_color = "#CCFFFF" COOLDOWN_DECLARE(holosign_cooldown) -/obj/item/flashlight/pen/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(proximity_flag) - return - +/obj/item/flashlight/pen/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!COOLDOWN_FINISHED(src, holosign_cooldown)) balloon_alert(user, "not ready!") - return + return ITEM_INTERACT_BLOCKING - var/target_turf = get_turf(target) + var/turf/target_turf = get_turf(interacting_with) var/mob/living/living_target = locate(/mob/living) in target_turf if(!living_target || (living_target == user)) - return + return ITEM_INTERACT_BLOCKING to_chat(living_target, span_boldnotice("[user] is offering medical assistance; please halt your actions.")) new /obj/effect/temp_visual/medical_holosign(target_turf, user) //produce a holographic glow COOLDOWN_START(src, holosign_cooldown, 10 SECONDS) + return ITEM_INTERACT_SUCCESS // see: [/datum/wound/burn/flesh/proc/uv()] /obj/item/flashlight/pen/paramedic @@ -731,26 +736,26 @@ ..() return -/obj/item/flashlight/emp/afterattack(atom/movable/A, mob/user, proximity) +/obj/item/flashlight/emp/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) . = ..() - if(!proximity) + if(. & ITEM_INTERACT_ANY_BLOCKER) return if(emp_cur_charges > 0) emp_cur_charges -= 1 - if(ismob(A)) - var/mob/M = A - log_combat(user, M, "attacked", "EMP-light") - M.visible_message(span_danger("[user] blinks \the [src] at \the [A]."), \ + if(ismob(interacting_with)) + var/mob/empd = interacting_with + log_combat(user, empd, "attacked", "EMP-light") + empd.visible_message(span_danger("[user] blinks \the [src] at \the [empd]."), \ span_userdanger("[user] blinks \the [src] at you.")) else - A.visible_message(span_danger("[user] blinks \the [src] at \the [A].")) + interacting_with.visible_message(span_danger("[user] blinks \the [src] at \the [interacting_with].")) to_chat(user, span_notice("\The [src] now has [emp_cur_charges] charge\s.")) - A.emp_act(EMP_HEAVY) + interacting_with.emp_act(EMP_HEAVY) else to_chat(user, span_warning("\The [src] needs time to recharge!")) - return + return ITEM_INTERACT_SUCCESS /obj/item/flashlight/emp/debug //for testing emp_act() name = "debug EMP flashlight" diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index d102f06275638..5d40d40a4d925 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -21,41 +21,42 @@ /// Checks to make sure the projector isn't busy with making another forcefield. var/force_proj_busy = FALSE -/obj/item/forcefield_projector/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(!check_allowed_items(target, not_inside = TRUE)) - return - . |= AFTERATTACK_PROCESSED_ITEM - if(istype(target, /obj/structure/projected_forcefield)) - var/obj/structure/projected_forcefield/F = target +/obj/item/forcefield_projector/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) + +/obj/item/forcefield_projector/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!check_allowed_items(interacting_with, not_inside = TRUE)) + return NONE + if(istype(interacting_with, /obj/structure/projected_forcefield)) + var/obj/structure/projected_forcefield/F = interacting_with if(F.generator == src) to_chat(user, span_notice("You deactivate [F].")) qdel(F) - return - var/turf/T = get_turf(target) + return ITEM_INTERACT_BLOCKING + var/turf/T = get_turf(interacting_with) var/obj/structure/projected_forcefield/found_field = locate() in T if(found_field) to_chat(user, span_warning("There is already a forcefield in that location!")) - return + return ITEM_INTERACT_BLOCKING if(T.density) - return + return ITEM_INTERACT_BLOCKING if(get_dist(T,src) > field_distance_limit) - return - if (get_turf(src) == T) + return ITEM_INTERACT_BLOCKING + if(get_turf(src) == T) to_chat(user, span_warning("Target is too close, aborting!")) - return + return ITEM_INTERACT_BLOCKING if(LAZYLEN(current_fields) >= max_fields) to_chat(user, span_warning("[src] cannot sustain any more forcefields!")) - return + return ITEM_INTERACT_BLOCKING if(force_proj_busy) to_chat(user, span_notice("[src] is busy creating a forcefield.")) - return + return ITEM_INTERACT_BLOCKING playsound(loc, 'sound/machines/click.ogg', 20, TRUE) if(creation_time) force_proj_busy = TRUE - if(!do_after(user, creation_time, target = target)) + if(!do_after(user, creation_time, target = interacting_with)) force_proj_busy = FALSE - return + return ITEM_INTERACT_BLOCKING force_proj_busy = FALSE playsound(src,'sound/weapons/resonator_fire.ogg',50,TRUE) @@ -63,6 +64,7 @@ var/obj/structure/projected_forcefield/F = new(T, src) current_fields += F user.changeNext_move(CLICK_CD_MELEE) + return ITEM_INTERACT_SUCCESS /obj/item/forcefield_projector/attack_self(mob/user) if(LAZYLEN(current_fields)) diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index db2d0d820ba3a..1d5ef17a90c4a 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -67,18 +67,18 @@ update_appearance(UPDATE_ICON) balloon_alert(user, "switch [scanning ? "on" : "off"]") -/obj/item/geiger_counter/afterattack(atom/target, mob/living/user, params) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/geiger_counter/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) +/obj/item/geiger_counter/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if (user.combat_mode) - return - - if (!CAN_IRRADIATE(target)) - return + return NONE + if (!CAN_IRRADIATE(interacting_with)) + return NONE - user.visible_message(span_notice("[user] scans [target] with [src]."), span_notice("You scan [target]'s radiation levels with [src]...")) - addtimer(CALLBACK(src, PROC_REF(scan), target, user), 20, TIMER_UNIQUE) // Let's not have spamming GetAllContents + user.visible_message(span_notice("[user] scans [interacting_with] with [src]."), span_notice("You scan [interacting_with]'s radiation levels with [src]...")) + addtimer(CALLBACK(src, PROC_REF(scan), interacting_with, user), 20, TIMER_UNIQUE) // Let's not have spamming GetAllContents + return ITEM_INTERACT_SUCCESS /obj/item/geiger_counter/equipped(mob/user, slot, initial) . = ..() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index fc6c967ec1f28..1e47fd8044d66 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -182,13 +182,15 @@ . += "\The [diode.name]'s size is much smaller compared to the previous generation lasers, \ and the wide margin between it and the focus lens could probably house a crystal of some sort." -/obj/item/laser_pointer/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM - laser_act(target, user, params) +/obj/item/laser_pointer/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) + +/obj/item/laser_pointer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + laser_act(interacting_with, user, modifiers) + return ITEM_INTERACT_BLOCKING ///Handles shining the clicked atom, -/obj/item/laser_pointer/proc/laser_act(atom/target, mob/living/user, params) +/obj/item/laser_pointer/proc/laser_act(atom/target, mob/living/user, list/modifiers) if(isnull(diode)) to_chat(user, span_notice("You point [src] at [target], but nothing happens!")) return @@ -286,7 +288,6 @@ //setup pointer blip var/mutable_appearance/laser = mutable_appearance('icons/obj/weapons/guns/projectiles.dmi', pointer_icon_state) - var/list/modifiers = params2list(params) if(modifiers) if(LAZYACCESS(modifiers, ICON_X)) laser.pixel_x = (text2num(LAZYACCESS(modifiers, ICON_X)) - 16) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 375ddd49d2d84..07a1db55a9c98 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -62,11 +62,23 @@ . = ..() . += status_string() -/obj/item/lightreplacer/pre_attack(atom/target, mob/living/user, params) - . = ..() - if(.) - return - return do_action(target, user) //if we are attacking a valid target[light, floodlight or turf] stop here +/obj/item/lightreplacer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return do_action(interacting_with, user) ? ITEM_INTERACT_SUCCESS : NONE + +/obj/item/lightreplacer/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + // has no bluespace capabilities + if(!bluespace_toggle) + return NONE + // target not in range + if(interacting_with.z != user.z) + return NONE + // target not in view + if(!(interacting_with in view(7, get_turf(user)))) + user.balloon_alert(user, "out of range!") + return ITEM_INTERACT_BLOCKING + + //replace lights & stuff + return do_action(interacting_with, user) ? ITEM_INTERACT_SUCCESS : NONE /obj/item/lightreplacer/attackby(obj/item/insert, mob/user, params) . = ..() @@ -239,23 +251,6 @@ return FALSE -/obj/item/lightreplacer/afterattack(atom/target, mob/user, proximity) - . = ..() - - // has no bluespace capabilities - if(!bluespace_toggle) - return - // target not in range - if(target.z != user.z) - return - // target not in view - if(!(target in view(7, get_turf(user)))) - user.balloon_alert(user, "out of range!") - return - - //replace lights & stuff - do_action(target, user) - /obj/item/lightreplacer/proc/status_string() return "It has [uses] light\s remaining (plus [bulb_shards]/[BULB_SHARDS_REQUIRED] fragment\s)." diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index 3a3b9055725a7..12b73d79e275b 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -9,24 +9,24 @@ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT) -/obj/item/pipe_painter/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - //Make sure we only paint adjacent items - if(!proximity_flag) - return - - if(istype(target, /obj/machinery/atmospherics)) - var/obj/machinery/atmospherics/target_pipe = target +/obj/item/pipe_painter/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(istype(interacting_with, /obj/machinery/atmospherics)) + var/obj/machinery/atmospherics/target_pipe = interacting_with target_pipe.paint(GLOB.pipe_paint_colors[paint_color]) playsound(src, 'sound/machines/click.ogg', 50, TRUE) balloon_alert(user, "painted in [paint_color] color") - else if(istype(target, /obj/item/pipe)) - var/obj/item/pipe/target_pipe = target + return ITEM_INTERACT_SUCCESS + + if(istype(interacting_with, /obj/item/pipe)) + var/obj/item/pipe/target_pipe = interacting_with var/color = GLOB.pipe_paint_colors[paint_color] target_pipe.pipe_color = color - target.add_atom_colour(color, FIXED_COLOUR_PRIORITY) + target_pipe.add_atom_colour(color, FIXED_COLOUR_PRIORITY) playsound(src, 'sound/machines/click.ogg', 50, TRUE) balloon_alert(user, "painted in [paint_color] color") + return ITEM_INTERACT_SUCCESS + + return NONE /obj/item/pipe_painter/attack_self(mob/user) paint_color = tgui_input_list(user, "Which colour do you want to use?", "Pipe painter", GLOB.pipe_paint_colors) diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index e452c550cdfa7..b1110e389a1db 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -145,12 +145,13 @@ ui_interact(user) -/obj/item/analyzer/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!can_see(user, target, ranged_scan_distance)) - return - . |= AFTERATTACK_PROCESSED_ITEM - atmos_scan(user, (target.return_analyzable_air() ? target : get_turf(target))) +/obj/item/analyzer/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) + +/obj/item/analyzer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(can_see(user, interacting_with, ranged_scan_distance)) + atmos_scan(user, (interacting_with.return_analyzable_air() ? interacting_with : get_turf(interacting_with))) + return NONE // Non-blocking /// Called when our analyzer is used on something /obj/item/analyzer/proc/on_analyze(datum/source, atom/target) diff --git a/code/game/objects/items/devices/scanners/sequence_scanner.dm b/code/game/objects/items/devices/scanners/sequence_scanner.dm index 4c4c202f26fbd..03ed5670d7eec 100644 --- a/code/game/objects/items/devices/scanners/sequence_scanner.dm +++ b/code/game/objects/items/devices/scanners/sequence_scanner.dm @@ -30,6 +30,15 @@ . += span_notice("It has the genetic makeup of \"[genetic_makeup_buffer["name"]]\" stored inside its buffer") /obj/item/sequence_scanner/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(istype(interacting_with, /obj/machinery/computer/scan_consolenew)) + var/obj/machinery/computer/scan_consolenew/console = interacting_with + if(console.stored_research) + to_chat(user, span_notice("[name] linked to central research database.")) + discovered = console.stored_research.discovered_mutations + else + to_chat(user,span_warning("No database to update from.")) + return ITEM_INTERACT_SUCCESS + if(!isliving(interacting_with)) return NONE @@ -47,6 +56,12 @@ return ITEM_INTERACT_BLOCKING /obj/item/sequence_scanner/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(istype(interacting_with, /obj/machinery/computer/scan_consolenew)) + var/obj/machinery/computer/scan_consolenew/console = interacting_with + var/buffer_index = tgui_input_number(user, "Slot:", "Which slot to export:", 1, LAZYLEN(console.genetic_makeup_buffer), 1) + console.genetic_makeup_buffer[buffer_index] = genetic_makeup_buffer + return ITEM_INTERACT_SUCCESS + if(!isliving(interacting_with)) return NONE @@ -66,34 +81,12 @@ user.visible_message(span_notice("[user] fails to analyze [interacting_with]'s genetic makeup."), span_warning("[interacting_with] has no readable genetic makeup!")) return ITEM_INTERACT_BLOCKING -/obj/item/sequence_scanner/afterattack_secondary(obj/object, mob/user, proximity) - . = ..() - if(!istype(object) || !proximity) - return - if(istype(object, /obj/machinery/computer/scan_consolenew)) - var/obj/machinery/computer/scan_consolenew/console = object - var/buffer_index = tgui_input_number(user, "Slot:", "Which slot to export:", 1, LAZYLEN(console.genetic_makeup_buffer), 1) - console.genetic_makeup_buffer[buffer_index] = genetic_makeup_buffer - /obj/item/sequence_scanner/attack_self(mob/user) display_sequence(user) /obj/item/sequence_scanner/attack_self_tk(mob/user) return -/obj/item/sequence_scanner/afterattack(obj/object, mob/user, proximity) - . = ..() - if(!istype(object) || !proximity) - return - - if(istype(object, /obj/machinery/computer/scan_consolenew)) - var/obj/machinery/computer/scan_consolenew/console = object - if(console.stored_research) - to_chat(user, span_notice("[name] linked to central research database.")) - discovered = console.stored_research.discovered_mutations - else - to_chat(user,span_warning("No database to update from.")) - ///proc for scanning someone's mutations /obj/item/sequence_scanner/proc/gene_scan(mob/living/carbon/target, mob/living/user) if(!iscarbon(target) || !target.has_dna()) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 7e6ee077fcea9..b87bbda2841a5 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -361,29 +361,41 @@ effective or pretty fucking useless. new /obj/item/analyzer(src) new /obj/item/wirecutters(src) -/obj/item/storage/toolbox/emergency/turret/attackby(obj/item/attacking_item, mob/living/user, params) - if(!istype(attacking_item, /obj/item/wrench/combat)) - return ..() - +/obj/item/storage/toolbox/emergency/turret/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) + if(!istype(inserted, /obj/item/wrench/combat)) + return TRUE if(!user.combat_mode) - return - - if(!attacking_item.toolspeed) - return + return TRUE + if(!inserted.toolspeed) + return TRUE + return FALSE +/obj/item/storage/toolbox/emergency/turret/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/wrench/combat)) + return NONE + if(!user.combat_mode) + return NONE + if(!tool.toolspeed) + return ITEM_INTERACT_BLOCKING balloon_alert(user, "constructing...") - if(!attacking_item.use_tool(src, user, 2 SECONDS, volume = 20)) - return + if(!tool.use_tool(src, user, 2 SECONDS, volume = 20)) + return ITEM_INTERACT_BLOCKING balloon_alert(user, "constructed!") - user.visible_message(span_danger("[user] bashes [src] with [attacking_item]!"), \ - span_danger("You bash [src] with [attacking_item]!"), null, COMBAT_MESSAGE_RANGE) + user.visible_message( + span_danger("[user] bashes [src] with [tool]!"), + span_danger("You bash [src] with [tool]!"), + null, + COMBAT_MESSAGE_RANGE, + ) playsound(src, "sound/items/drill_use.ogg", 80, TRUE, -1) var/obj/machinery/porta_turret/syndicate/toolbox/turret = new(get_turf(loc)) set_faction(turret, user) turret.toolbox = src forceMove(turret) + return ITEM_INTERACT_SUCCESS + /obj/item/storage/toolbox/emergency/turret/proc/set_faction(obj/machinery/porta_turret/turret, mob/user) turret.faction = list("[REF(user)]") diff --git a/code/game/objects/items/dna_probe.dm b/code/game/objects/items/dna_probe.dm index 6f9944bc94940..f299a9254f80e 100644 --- a/code/game/objects/items/dna_probe.dm +++ b/code/game/objects/items/dna_probe.dm @@ -30,18 +30,12 @@ ///weak ref to the dna vault var/datum/weakref/dna_vault_ref -/obj/item/dna_probe/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!proximity_flag || !target) - return . - - if (isitem(target)) - . |= AFTERATTACK_PROCESSED_ITEM - - if(istype(target, /obj/machinery/dna_vault) && !dna_vault_ref?.resolve()) - try_linking_vault(target, user) +/obj/item/dna_probe/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(istype(interacting_with, /obj/machinery/dna_vault) && !dna_vault_ref?.resolve()) + try_linking_vault(interacting_with, user) else - scan_dna(target, user) + scan_dna(interacting_with, user) + return ITEM_INTERACT_BLOCKING /obj/item/dna_probe/proc/try_linking_vault(atom/target, mob/user) var/obj/machinery/dna_vault/our_vault = dna_vault_ref?.resolve() diff --git a/code/game/objects/items/emags.dm b/code/game/objects/items/emags.dm index 7882018701e4d..89efdd35b97ac 100644 --- a/code/game/objects/items/emags.dm +++ b/code/game/objects/items/emags.dm @@ -53,6 +53,9 @@ . = ..() type_blacklist = list(typesof(/obj/machinery/door/airlock) + typesof(/obj/machinery/door/window/) + typesof(/obj/machinery/door/firedoor) - typesof(/obj/machinery/door/airlock/tram)) //list of all typepaths that require a specialized emag to hack. +/obj/item/card/emag/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/living/user) + return !user.combat_mode + /obj/item/card/emag/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!can_emag(interacting_with, user)) return ITEM_INTERACT_BLOCKING @@ -60,15 +63,8 @@ interacting_with.emag_act(user, src) return ITEM_INTERACT_SUCCESS -/obj/item/card/emag/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - // Proximity based emagging is handled by above - // This is only for ranged emagging - if(proximity_flag || prox_check) - return - - . |= AFTERATTACK_PROCESSED_ITEM - interact_with_atom(target, user) +/obj/item/card/emag/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return prox_check ? NONE : interact_with_atom(interacting_with, user) /obj/item/card/emag/proc/can_emag(atom/target, mob/user) for (var/subtypelist in type_blacklist) diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index aded3d06ccfad..4d956611bc3a7 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -133,7 +133,7 @@ /obj/item/extinguisher/suicide_act(mob/living/carbon/user) if (!safety && (reagents.total_volume >= 1)) user.visible_message(span_suicide("[user] puts the nozzle to [user.p_their()] mouth. It looks like [user.p_theyre()] trying to extinguish the spark of life!")) - afterattack(user,user) + interact_with_atom(user, user) return OXYLOSS else if (safety && (reagents.total_volume >= 1)) user.visible_message(span_warning("[user] puts the nozzle to [user.p_their()] mouth... The safety's still on!")) @@ -187,67 +187,65 @@ else return FALSE -/obj/item/extinguisher/afterattack(atom/target, mob/user , flag) - . = ..() - // Make it so the extinguisher doesn't spray yourself when you click your inventory items - if (target.loc == user) - return +/obj/item/extinguisher/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/extinguisher/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if (interacting_with.loc == user) + return NONE if(refilling) refilling = FALSE - return . - if (!safety) - - - if (src.reagents.total_volume < 1) - balloon_alert(user, "it's empty!") - return . + return NONE + if(safety) + return NONE - if (world.time < src.last_use + 12) - return . + if (src.reagents.total_volume < 1) + balloon_alert(user, "it's empty!") + return . - src.last_use = world.time + if (world.time < src.last_use + 12) + return . - playsound(src.loc, 'sound/effects/extinguish.ogg', 75, TRUE, -3) + src.last_use = world.time - var/direction = get_dir(src,target) + playsound(src.loc, 'sound/effects/extinguish.ogg', 75, TRUE, -3) - if(user.buckled && isobj(user.buckled) && !user.buckled.anchored) - var/obj/B = user.buckled - var/movementdirection = REVERSE_DIR(direction) - addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/extinguisher, move_chair), B, movementdirection), 0.1 SECONDS) - else - user.newtonian_move(REVERSE_DIR(direction)) + var/direction = get_dir(src,interacting_with) - //Get all the turfs that can be shot at - var/turf/T = get_turf(target) - var/turf/T1 = get_step(T,turn(direction, 90)) - var/turf/T2 = get_step(T,turn(direction, -90)) - var/list/the_targets = list(T,T1,T2) + if(user.buckled && isobj(user.buckled) && !user.buckled.anchored) + var/obj/B = user.buckled + var/movementdirection = REVERSE_DIR(direction) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/extinguisher, move_chair), B, movementdirection), 0.1 SECONDS) + else + user.newtonian_move(REVERSE_DIR(direction)) + + //Get all the turfs that can be shot at + var/turf/T = get_turf(interacting_with) + var/turf/T1 = get_step(T,turn(direction, 90)) + var/turf/T2 = get_step(T,turn(direction, -90)) + var/list/the_targets = list(T,T1,T2) + if(precision) + var/turf/T3 = get_step(T1, turn(direction, 90)) + var/turf/T4 = get_step(T2,turn(direction, -90)) + the_targets.Add(T3,T4) + + var/list/water_particles = list() + for(var/a in 1 to 5) + var/obj/effect/particle_effect/water/extinguisher/water = new /obj/effect/particle_effect/water/extinguisher(get_turf(src)) + var/my_target = pick(the_targets) + water_particles[water] = my_target + // If precise, remove turf from targets so it won't be picked more than once if(precision) - var/turf/T3 = get_step(T1, turn(direction, 90)) - var/turf/T4 = get_step(T2,turn(direction, -90)) - the_targets.Add(T3,T4) - - var/list/water_particles = list() - for(var/a in 1 to 5) - var/obj/effect/particle_effect/water/extinguisher/water = new /obj/effect/particle_effect/water/extinguisher(get_turf(src)) - var/my_target = pick(the_targets) - water_particles[water] = my_target - // If precise, remove turf from targets so it won't be picked more than once - if(precision) - the_targets -= my_target - var/datum/reagents/water_reagents = new /datum/reagents(5) - water.reagents = water_reagents - water_reagents.my_atom = water - reagents.trans_to(water, 1, transferred_by = user) - - //Make em move dat ass, hun - move_particles(water_particles) - - return . + the_targets -= my_target + var/datum/reagents/water_reagents = new /datum/reagents(5) + water.reagents = water_reagents + water_reagents.my_atom = water + reagents.trans_to(water, 1, transferred_by = user) + + //Make em move dat ass, hun + move_particles(water_particles) + return ITEM_INTERACT_SKIP_TO_ATTACK // You can smack while spraying //Particle movement loop /obj/item/extinguisher/proc/move_particles(list/particles) diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index 2859b4d3b2c16..38e4c840694f5 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -51,15 +51,13 @@ user.visible_message(span_suicide("[user] axes [user.p_them()]self from head to toe! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS -/obj/item/fireaxe/afterattack(atom/A, mob/user, proximity) - . = ..() - if(!proximity) +/obj/item/fireaxe/afterattack(atom/target, mob/user, click_parameters) + if(!HAS_TRAIT(src, TRAIT_WIELDED)) //destroys windows and grilles in one hit + return + if(target.resistance_flags & INDESTRUCTIBLE) return - if(HAS_TRAIT(src, TRAIT_WIELDED)) //destroys windows and grilles in one hit - if(istype(A, /obj/structure/window) || istype(A, /obj/structure/grille)) - if(!(A.resistance_flags & INDESTRUCTIBLE)) - var/obj/structure/W = A - W.atom_destruction("fireaxe") + if(istype(target, /obj/structure/window) || istype(target, /obj/structure/grille)) + target.atom_destruction("fireaxe") /* * Bone Axe diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index be89193ba7edd..e2d587cd3594b 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -79,21 +79,17 @@ if(lit) . += "+lit" -/obj/item/flamethrower/afterattack(atom/target, mob/user, flag) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM - if(flag) - return // too close +/obj/item/flamethrower/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You can't bring yourself to fire \the [src]! You don't want to risk harming anyone...")) - log_combat(user, target, "attempted to flamethrower", src, "with gas mixture: {[print_gas_mixture(ptank.return_analyzable_air())]}, flamethrower: \"[name]\" ([src]), igniter: \"[igniter.name]\", tank: \"[ptank.name]\" and tank distribution pressure: \"[siunit(1000 * ptank.distribute_pressure, unit = "Pa", maxdecimals = 9)]\"" + (lit ? " while lit" : "" + " but failed due to pacifism.")) - return - if(user && user.get_active_held_item() == src) // Make sure our user is still holding us - var/turf/target_turf = get_turf(target) - if(target_turf) - var/turflist = get_line(user, target_turf) - log_combat(user, target, "flamethrowered", src, "with gas mixture: {[print_gas_mixture(ptank.return_analyzable_air())]}, flamethrower: \"[name]\", igniter: \"[igniter.name]\", tank: \"[ptank.name]\" and tank distribution pressure: \"[siunit(1000 * ptank.distribute_pressure, unit = "Pa", maxdecimals = 9)]\"" + (lit ? " while lit." : ".")) - flame_turf(turflist) + log_combat(user, interacting_with, "attempted to flamethrower", src, "with gas mixture: {[print_gas_mixture(ptank.return_analyzable_air())]}, flamethrower: \"[name]\" ([src]), igniter: \"[igniter.name]\", tank: \"[ptank.name]\" and tank distribution pressure: \"[siunit(1000 * ptank.distribute_pressure, unit = "Pa", maxdecimals = 9)]\"" + (lit ? " while lit" : "" + " but failed due to pacifism.")) + return ITEM_INTERACT_BLOCKING + var/turf/target_turf = get_turf(interacting_with) + if(target_turf) + var/turflist = get_line(user, target_turf) + log_combat(user, interacting_with, "flamethrowered", src, "with gas mixture: {[print_gas_mixture(ptank.return_analyzable_air())]}, flamethrower: \"[name]\", igniter: \"[igniter.name]\", tank: \"[ptank.name]\" and tank distribution pressure: \"[siunit(1000 * ptank.distribute_pressure, unit = "Pa", maxdecimals = 9)]\"" + (lit ? " while lit." : ".")) + flame_turf(turflist) + return ITEM_INTERACT_SUCCESS /obj/item/flamethrower/wrench_act(mob/living/user, obj/item/tool) . = TRUE diff --git a/code/game/objects/items/food/egg.dm b/code/game/objects/items/food/egg.dm index 62113e02e7780..b669e16b103cd 100644 --- a/code/game/objects/items/food/egg.dm +++ b/code/game/objects/items/food/egg.dm @@ -120,26 +120,27 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) else ..() -/obj/item/food/egg/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return - - if(!istype(target, /obj/machinery/griddle)) - return SECONDARY_ATTACK_CALL_NORMAL - - var/atom/broken_egg = new /obj/item/food/rawegg(target.loc) - broken_egg.pixel_x = pixel_x - broken_egg.pixel_y = pixel_y - playsound(get_turf(user), 'sound/items/sheath.ogg', 40, TRUE) - reagents.copy_to(broken_egg,reagents.total_volume) +/obj/item/food/egg/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(!istype(interacting_with, /obj/machinery/griddle)) + return NONE + + var/obj/machinery/griddle/hit_griddle = interacting_with + if(length(hit_griddle.griddled_objects) >= hit_griddle.max_items) + interacting_with.balloon_alert(user, "no room!") + return ITEM_INTERACT_BLOCKING + var/atom/broken_egg = new /obj/item/food/rawegg(interacting_with.loc) + if(LAZYACCESS(modifiers, ICON_X)) + broken_egg.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) + if(LAZYACCESS(modifiers, ICON_Y)) + broken_egg.pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) + playsound(user, 'sound/items/sheath.ogg', 40, TRUE) + reagents.copy_to(broken_egg, reagents.total_volume) - var/obj/machinery/griddle/hit_griddle = target hit_griddle.AddToGrill(broken_egg, user) - target.balloon_alert(user, "cracks [src] open") + interacting_with.balloon_alert(user, "cracks [src] open") qdel(src) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING /obj/item/food/egg/blue icon_state = "egg-blue" diff --git a/code/game/objects/items/food/packaged.dm b/code/game/objects/items/food/packaged.dm index 820b10927f619..0f08fd8f57dd9 100644 --- a/code/game/objects/items/food/packaged.dm +++ b/code/game/objects/items/food/packaged.dm @@ -117,13 +117,11 @@ return ..() apply_buff(user) -/obj/item/food/canned/envirochow/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(!proximity_flag) - return - if(!check_buffability(target)) - return - apply_buff(target, user) +/obj/item/food/canned/envirochow/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!check_buffability(interacting_with)) + return NONE + apply_buff(interacting_with, user) + return ITEM_INTERACT_SUCCESS ///This proc checks if the mob is able to receive the buff. /obj/item/food/canned/envirochow/proc/check_buffability(mob/living/hungry_pet) diff --git a/code/game/objects/items/grenades/_grenade.dm b/code/game/objects/items/grenades/_grenade.dm index 4c737ed53f3cb..5deb833b1f234 100644 --- a/code/game/objects/items/grenades/_grenade.dm +++ b/code/game/objects/items/grenades/_grenade.dm @@ -263,8 +263,8 @@ qdel(src) return TRUE //It hit the grenade, not them -/obj/item/grenade/afterattack(atom/target, mob/user) - . = ..() +/obj/item/grenade/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(active) - user.throw_item(target) - return . | AFTERATTACK_PROCESSED_ITEM + user.throw_item(interacting_with) + return ITEM_INTERACT_SUCCESS + return NONE diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index c1cf8c1010d86..336c9e5e2eea7 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -105,58 +105,56 @@ det_time = newtime to_chat(user, "Timer set for [det_time] seconds.") -/obj/item/grenade/c4/afterattack(atom/movable/bomb_target, mob/user, flag) - . = ..() - aim_dir = get_dir(user, bomb_target) - if(isdead(bomb_target)) - return - if(!flag) - return - - . |= AFTERATTACK_PROCESSED_ITEM - +/obj/item/grenade/c4/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + // Here lies C4 ghosts. We hardly knew ye + if(isdead(interacting_with)) + return NONE + aim_dir = get_dir(user, interacting_with) + return plant_c4(interacting_with, user) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + +/obj/item/grenade/c4/proc/plant_c4(atom/bomb_target, mob/living/user) if(bomb_target != user && HAS_TRAIT(user, TRAIT_PACIFISM) && isliving(bomb_target)) to_chat(user, span_warning("You don't want to harm other living beings!")) - return . + return FALSE to_chat(user, span_notice("You start planting [src]. The timer is set to [det_time]...")) - if(do_after(user, 3 SECONDS, target = bomb_target)) - if(!user.temporarilyRemoveItemFromInventory(src)) - return . - target = bomb_target - active = TRUE - - message_admins("[ADMIN_LOOKUPFLW(user)] planted [name] on [target.name] at [ADMIN_VERBOSEJMP(target)] with [det_time] second fuse") - user.log_message("planted [name] on [target.name] with a [det_time] second fuse.", LOG_ATTACK) - var/icon/target_icon = icon(bomb_target.icon, bomb_target.icon_state) - target_icon.Blend(icon(icon, icon_state), ICON_OVERLAY) - var/mutable_appearance/bomb_target_image = mutable_appearance(target_icon) - notify_ghosts( - "[user] has planted \a [src] on [target] with a [det_time] second fuse!", - source = bomb_target, - header = "Explosive Planted", - alert_overlay = bomb_target_image, - notify_flags = NOTIFY_CATEGORY_NOFLASH, - ) - - moveToNullspace() //Yep - - if(isitem(bomb_target)) //your crappy throwing star can't fly so good with a giant brick of c4 on it. - var/obj/item/thrown_weapon = bomb_target - thrown_weapon.throw_speed = max(1, (thrown_weapon.throw_speed - 3)) - thrown_weapon.throw_range = max(1, (thrown_weapon.throw_range - 3)) - if(thrown_weapon.embedding) - thrown_weapon.embedding["embed_chance"] = 0 - thrown_weapon.updateEmbedding() - else if(isliving(bomb_target)) - plastic_overlay.layer = FLOAT_LAYER - - target.add_overlay(plastic_overlay) - to_chat(user, span_notice("You plant the bomb. Timer counting down from [det_time].")) - addtimer(CALLBACK(src, PROC_REF(detonate)), det_time*10) - - return . + if(!do_after(user, 3 SECONDS, target = bomb_target)) + return FALSE + if(!user.temporarilyRemoveItemFromInventory(src)) + return FALSE + target = bomb_target + active = TRUE + + message_admins("[ADMIN_LOOKUPFLW(user)] planted [name] on [target.name] at [ADMIN_VERBOSEJMP(target)] with [det_time] second fuse") + user.log_message("planted [name] on [target.name] with a [det_time] second fuse.", LOG_ATTACK) + var/icon/target_icon = icon(bomb_target.icon, bomb_target.icon_state) + target_icon.Blend(icon(icon, icon_state), ICON_OVERLAY) + var/mutable_appearance/bomb_target_image = mutable_appearance(target_icon) + notify_ghosts( + "[user] has planted \a [src] on [target] with a [det_time] second fuse!", + source = bomb_target, + header = "Explosive Planted", + alert_overlay = bomb_target_image, + notify_flags = NOTIFY_CATEGORY_NOFLASH, + ) + + moveToNullspace() //Yep + + if(isitem(bomb_target)) //your crappy throwing star can't fly so good with a giant brick of c4 on it. + var/obj/item/thrown_weapon = bomb_target + thrown_weapon.throw_speed = max(1, (thrown_weapon.throw_speed - 3)) + thrown_weapon.throw_range = max(1, (thrown_weapon.throw_range - 3)) + if(thrown_weapon.embedding) + thrown_weapon.embedding["embed_chance"] = 0 + thrown_weapon.updateEmbedding() + else if(isliving(bomb_target)) + plastic_overlay.layer = FLOAT_LAYER + + target.add_overlay(plastic_overlay) + to_chat(user, span_notice("You plant the bomb. Timer counting down from [det_time].")) + addtimer(CALLBACK(src, PROC_REF(detonate)), det_time*10) + return TRUE /obj/item/grenade/c4/proc/shout_syndicate_crap(mob/player) if(!player) diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index 10a90b3dbdcef..371ecee6ff803 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -475,9 +475,10 @@ /// TRUE if the user was aiming anywhere but the mouth when they offer the kiss, if it's offered var/cheek_kiss -/obj/item/hand_item/kisser/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/hand_item/kisser/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return ranged_interact_with_atom(interacting_with, user, modifiers) + +/obj/item/hand_item/kisser/ranged_interact_with_atom(atom/target, mob/living/user, list/modifiers) if(HAS_TRAIT(user, TRAIT_GARLIC_BREATH)) kiss_type = /obj/projectile/kiss/french @@ -495,6 +496,7 @@ blown_kiss.preparePixelProjectile(target, user) blown_kiss.fire() qdel(src) + return ITEM_INTERACT_SUCCESS /obj/item/hand_item/kisser/on_offered(mob/living/carbon/offerer, mob/living/carbon/offered) if(!(locate(/mob/living/carbon) in orange(1, offerer))) diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index b4835a0d565a7..ff4d0260c4f35 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -26,8 +26,8 @@ AddElement(/datum/element/openspace_item_click_handler) RegisterSignal(src, COMSIG_OBJ_PAINTED, TYPE_PROC_REF(/obj/item/holosign_creator, on_color_change)) -/obj/item/holosign_creator/handle_openspace_click(turf/target, mob/user, proximity_flag, click_parameters) - afterattack(target, user, proximity_flag, click_parameters) +/obj/item/holosign_creator/handle_openspace_click(turf/target, mob/user, click_parameters) + interact_with_atom(target, user, click_parameters) /obj/item/holosign_creator/examine(mob/user) . = ..() @@ -35,39 +35,35 @@ return . += span_notice("It is currently maintaining [signs.len]/[max_signs] projections.") -/obj/item/holosign_creator/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(!proximity_flag) - return - . |= AFTERATTACK_PROCESSED_ITEM - if(!check_allowed_items(target, not_inside = TRUE)) - return . - var/turf/target_turf = get_turf(target) +/obj/item/holosign_creator/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!check_allowed_items(interacting_with, not_inside = TRUE)) + return NONE + var/turf/target_turf = get_turf(interacting_with) var/obj/structure/holosign/target_holosign = locate(holosign_type) in target_turf if(target_holosign) qdel(target_holosign) - return . + return ITEM_INTERACT_BLOCKING if(target_turf.is_blocked_turf(TRUE)) //can't put holograms on a tile that has dense stuff - return . + return ITEM_INTERACT_BLOCKING if(holocreator_busy) - to_chat(user, span_notice("[src] is busy creating a hologram.")) - return . + balloon_alert(user, "busy making a hologram!") + return ITEM_INTERACT_BLOCKING if(LAZYLEN(signs) >= max_signs) balloon_alert(user, "max capacity!") - return . - playsound(loc, 'sound/machines/click.ogg', 20, TRUE) + return ITEM_INTERACT_BLOCKING + playsound(src, 'sound/machines/click.ogg', 20, TRUE) if(creation_time) holocreator_busy = TRUE - if(!do_after(user, creation_time, target = target)) + if(!do_after(user, creation_time, target = interacting_with)) holocreator_busy = FALSE - return . + return ITEM_INTERACT_BLOCKING holocreator_busy = FALSE if(LAZYLEN(signs) >= max_signs) - return . + return ITEM_INTERACT_BLOCKING if(target_turf.is_blocked_turf(TRUE)) //don't try to sneak dense stuff on our tile during the wait. - return . - target_holosign = create_holosign(target, user) - return . + return ITEM_INTERACT_BLOCKING + target_holosign = create_holosign(interacting_with, user) + return ITEM_INTERACT_SUCCESS /obj/item/holosign_creator/attack(mob/living/carbon/human/M, mob/user) return diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm index 9a7da338885d9..20233db522b39 100644 --- a/code/game/objects/items/hot_potato.dm +++ b/code/game/objects/items/hot_potato.dm @@ -95,11 +95,12 @@ if(active) to_chat(user, span_userdanger("You have a really bad feeling about [src]!")) -/obj/item/hot_potato/afterattack(atom/target, mob/user, adjacent, params) +/obj/item/hot_potato/attack(mob/living/target_mob, mob/living/user, params) . = ..() - if(!adjacent || !ismob(target)) - return - force_onto(target, user) + if(.) + return . + + return force_onto(target_mob, user) /obj/item/hot_potato/proc/force_onto(mob/living/victim, mob/user) if(!istype(victim) || user != loc || victim == user) diff --git a/code/game/objects/items/implants/security/implant_chem.dm b/code/game/objects/items/implants/security/implant_chem.dm index bad6cca8c694c..c25496c634bb0 100644 --- a/code/game/objects/items/implants/security/implant_chem.dm +++ b/code/game/objects/items/implants/security/implant_chem.dm @@ -97,7 +97,7 @@ /obj/item/implantcase/chem/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/reagent_containers/syringe) && imp) - W.afterattack(imp, user, TRUE, params) + W.interact_with_atom(imp, user, params) return TRUE else return ..() diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index 8b4808848c245..622ee6592cb7a 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -77,9 +77,8 @@ /// Bleed stacks applied when an organic mob target is hit var/bleed_stacks_per_hit = 3 -/obj/item/knife/bloodletter/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!isliving(target) || !proximity_flag) +/obj/item/knife/bloodletter/afterattack(atom/target, mob/user, click_parameters) + if(!isliving(target)) return var/mob/living/M = target if(!(M.mob_biotypes & MOB_ORGANIC)) diff --git a/code/game/objects/items/machine_wand.dm b/code/game/objects/items/machine_wand.dm index bc5eb8583f9c4..fd0c730fff811 100644 --- a/code/game/objects/items/machine_wand.dm +++ b/code/game/objects/items/machine_wand.dm @@ -73,19 +73,22 @@ remove_old_machine() return CLICK_ACTION_SUCCESS -/obj/item/machine_remote/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() +/obj/item/machine_remote/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) + +/obj/item/machine_remote/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!COOLDOWN_FINISHED(src, timeout_time)) playsound(src, 'sound/machines/synth_no.ogg', 30 , TRUE) say("Remote control disabled temporarily. Please try again soon.") - return FALSE - if(!ismachinery(target) && !isbot(target)) - return + return ITEM_INTERACT_BLOCKING + if(!ismachinery(interacting_with) && !isbot(interacting_with)) + return NONE if(moving_bug) //we have a bug in transit already, so let's kill it. QDEL_NULL(moving_bug) var/turf/spawning_turf = (controlling_machine_or_bot ? get_turf(controlling_machine_or_bot) : get_turf(src)) - moving_bug = new(spawning_turf, src, target) + moving_bug = new(spawning_turf, src, interacting_with) remove_old_machine() + return ITEM_INTERACT_SUCCESS ///Sets a controlled machine to a new machine, if possible. Checks if AIs can even control it. /obj/item/machine_remote/proc/set_controlled_machine(obj/machinery/new_machine) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 01bbc9262d0af..80b1e66b2e3e9 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -191,10 +191,7 @@ final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword return ..() -/obj/item/melee/beesword/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity) - return +/obj/item/melee/beesword/afterattack(atom/target, mob/user, click_parameters) if(iscarbon(target)) var/mob/living/carbon/carbon_target = target carbon_target.reagents.add_reagent(/datum/reagent/toxin, 4) @@ -242,20 +239,24 @@ if(!isspaceturf(turf)) consume_turf(turf) -/obj/item/melee/supermatter_sword/afterattack(target, mob/user, proximity_flag) +/obj/item/melee/supermatter_sword/pre_attack(atom/A, mob/living/user, params) . = ..() - if(user && target == user) - user.dropItemToGround(src) - if(proximity_flag) - consume_everything(target) - return . | AFTERATTACK_PROCESSED_ITEM + if(.) + return . + + if(A == user) + user.dropItemToGround(src, TRUE) + else + user.do_attack_animation(A) + consume_everything(A) + return TRUE /obj/item/melee/supermatter_sword/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() if(ismob(hit_atom)) var/mob/mob = hit_atom if(src.loc == mob) - mob.dropItemToGround(src) + mob.dropItemToGround(src, TRUE) consume_everything(hit_atom) /obj/item/melee/supermatter_sword/pickup(user) @@ -330,10 +331,7 @@ attack_verb_simple = list("flog", "whip", "lash", "discipline") hitsound = 'sound/weapons/whip.ogg' -/obj/item/melee/curator_whip/attack(mob/living/target, mob/living/user, params) - . = ..() - if(.) - return +/obj/item/melee/curator_whip/afterattack(atom/target, mob/user, click_parameters) if(ishuman(target)) var/mob/living/carbon/human/human_target = target human_target.drop_all_held_items() @@ -429,22 +427,27 @@ held_sausage = null update_appearance() -/obj/item/melee/roastingstick/afterattack(atom/target, mob/user, proximity) - . = ..() +/obj/item/melee/roastingstick/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if (!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) - return - if (!is_type_in_typecache(target, ovens)) - return - if (istype(target, /obj/singularity) && get_dist(user, target) < 10) - to_chat(user, span_notice("You send [held_sausage] towards [target].")) + return NONE + if (!is_type_in_typecache(interacting_with, ovens)) + return NONE + if (istype(interacting_with, /obj/singularity) && get_dist(user, interacting_with) < 10) + to_chat(user, span_notice("You send [held_sausage] towards [interacting_with].")) playsound(src, 'sound/items/rped.ogg', 50, TRUE) - beam = user.Beam(target, icon_state = "rped_upgrade", time = 10 SECONDS) - else if (user.Adjacent(target)) - to_chat(user, span_notice("You extend [src] towards [target].")) - playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, TRUE) - else - return - finish_roasting(user, target) + beam = user.Beam(interacting_with, icon_state = "rped_upgrade", time = 10 SECONDS) + return ITEM_INTERACT_SUCCESS + return NONE + +/obj/item/melee/roastingstick/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if (!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) + return NONE + if (!is_type_in_typecache(interacting_with, ovens)) + return NONE + to_chat(user, span_notice("You extend [src] towards [interacting_with].")) + playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) + finish_roasting(user, interacting_with) + return ITEM_INTERACT_SUCCESS /obj/item/melee/roastingstick/proc/finish_roasting(user, atom/target) if(do_after(user, 10 SECONDS, target = user)) diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 28170bec14010..b2bd6d55d5cee 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -46,11 +46,13 @@ ///Checks whether or not we should clean. /obj/item/mop/proc/should_clean(datum/cleaning_source, atom/atom_to_clean, mob/living/cleaner) if(clean_blacklist[atom_to_clean.type]) - return DO_NOT_CLEAN + return CLEAN_BLOCKED|CLEAN_DONT_BLOCK_INTERACTION if(reagents.total_volume < 0.1) cleaner.balloon_alert(cleaner, "mop is dry!") - return DO_NOT_CLEAN - return reagents.has_reagent(amount = 1, chemical_flags = REAGENT_CLEANS) + return CLEAN_BLOCKED + if(reagents.has_reagent(amount = 1, chemical_flags = REAGENT_CLEANS)) + return CLEAN_ALLOWED + return CLEAN_BLOCKED|CLEAN_NO_XP /** * Applies reagents to the cleaned floor and removes them from the mop. diff --git a/code/game/objects/items/paint.dm b/code/game/objects/items/paint.dm index 0b357c3c728c2..41c1809b5589e 100644 --- a/code/game/objects/items/paint.dm +++ b/code/game/objects/items/paint.dm @@ -112,17 +112,16 @@ return FALSE return TRUE -/obj/item/paint/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity) - return +/obj/item/paint/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isturf(interacting_with) || isspaceturf(interacting_with)) + return NONE if(paintleft <= 0) - icon_state = "paint_empty" - return - if(!isturf(target) || isspaceturf(target)) - return + return NONE paintleft-- - target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY) + interacting_with.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY) + if(paintleft <= 0) + icon_state = "paint_empty" + return ITEM_INTERACT_SUCCESS /obj/item/paint/paint_remover gender = PLURAL @@ -130,12 +129,10 @@ desc = "Used to remove color from anything." icon_state = "paint_neutral" -/obj/item/paint/paint_remover/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity) - return - if(!isturf(target) || !isobj(target)) - return - . |= AFTERATTACK_PROCESSED_ITEM - if(target.color != initial(target.color)) - target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) +/obj/item/paint/paint_remover/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isturf(interacting_with) || !isobj(interacting_with)) + return NONE + if(interacting_with.color != initial(interacting_with.color)) + interacting_with.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + return ITEM_INTERACT_SUCCESS + return NONE diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 1d5c37ffc2283..052fc983c8306 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -531,6 +531,11 @@ desc = "An adorable stuffed toy that resembles a green lizardperson. This one fills you with nostalgia and soul." greyscale_colors = "#66ff33#000000" +/obj/item/toy/plush/lizard_plushie/greyscale + desc = "An adorable stuffed toy that resembles a lizardperson. This one has been custom made." + greyscale_colors = "#d3d3d3#000000" + flags_1 = IS_PLAYER_COLORABLE_1 + /obj/item/toy/plush/lizard_plushie/space name = "space lizard plushie" desc = "An adorable stuffed toy that resembles a very determined spacefaring lizardperson. To infinity and beyond, little guy." diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index bd31228f2fc92..b49fb7ec26051 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -161,14 +161,15 @@ loadedWeightClass++ return TRUE -/obj/item/pneumatic_cannon/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - if(flag && user.combat_mode)//melee attack - return - if(!istype(user)) - return - Fire(user, target) - return AFTERATTACK_PROCESSED_ITEM +/obj/item/pneumatic_cannon/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(user.combat_mode) + return ITEM_INTERACT_SKIP_TO_ATTACK + Fire(user, interacting_with) + return ITEM_INTERACT_SUCCESS + +/obj/item/pneumatic_cannon/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + Fire(user, interacting_with) + return ITEM_INTERACT_SUCCESS /obj/item/pneumatic_cannon/proc/Fire(mob/living/user, atom/target) if(!istype(user) && !target) diff --git a/code/game/objects/items/rcd/RCD.dm b/code/game/objects/items/rcd/RCD.dm index 8aefc4cf44f2f..10a2a8c60a0fd 100644 --- a/code/game/objects/items/rcd/RCD.dm +++ b/code/game/objects/items/rcd/RCD.dm @@ -254,7 +254,7 @@ if(ranged) var/atom/beam_source = owner ? owner : user beam = beam_source.Beam(target, icon_state = "rped_upgrade", time = delay) - if(delay && !do_after(user, delay, target = target)) // no need for do_after with no delay + if(!build_delay(user, delay, target = target)) // no need for do_after with no delay qdel(rcd_effect) if(!isnull(beam)) qdel(beam) @@ -379,6 +379,7 @@ construction_mode = mode rcd_design_path = design["[RCD_DESIGN_PATH]"] design_title = initial(rcd_design_path.name) + blueprint_changed = TRUE else airlock_electronics.do_action(action, params) @@ -389,29 +390,27 @@ . = ..() ui_interact(user) -/obj/item/construction/rcd/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - //proximity check for normal rcd & range check for arcd - if((!proximity_flag && !ranged) || (ranged && !range_check(target, user))) - return FALSE - - //do the work +/obj/item/construction/rcd/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) mode = construction_mode - rcd_create(target, user) + rcd_create(interacting_with, user) + return ITEM_INTERACT_SUCCESS - return . | AFTERATTACK_PROCESSED_ITEM +/obj/item/construction/rcd/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!ranged || !range_check(interacting_with, user)) + return ITEM_INTERACT_BLOCKING -/obj/item/construction/rcd/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - //proximity check for normal rcd & range check for arcd - if((!proximity_flag && !ranged) || (ranged && !range_check(target, user))) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return interact_with_atom(interacting_with, user, modifiers) - //do the work +/obj/item/construction/rcd/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) mode = RCD_DECONSTRUCT - rcd_create(target, user) + rcd_create(interacting_with, user) + return ITEM_INTERACT_SUCCESS + +/obj/item/construction/rcd/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(!ranged || !range_check(interacting_with, user)) + return ITEM_INTERACT_BLOCKING - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return interact_with_atom_secondary(interacting_with, user, modifiers) /obj/item/construction/rcd/proc/detonate_pulse() audible_message("[src] begins to vibrate and \ diff --git a/code/game/objects/items/rcd/RHD.dm b/code/game/objects/items/rcd/RHD.dm index 7dac16aa51a36..9c70bbef28b73 100644 --- a/code/game/objects/items/rcd/RHD.dm +++ b/code/game/objects/items/rcd/RHD.dm @@ -37,6 +37,8 @@ var/datum/component/remote_materials/silo_mats /// switch to use internal or remote storage var/silo_link = FALSE + /// has the blueprint design changed + var/blueprint_changed = FALSE /datum/armor/item_construction fire = 100 @@ -51,6 +53,18 @@ silo_mats = AddComponent(/datum/component/remote_materials, mapload, FALSE) update_appearance() +///An do_after() specially designed for rhd devices +/obj/item/construction/proc/build_delay(mob/user, delay, atom/target) + if(delay <= 0) + return TRUE + + blueprint_changed = FALSE + + return do_after(user, delay, target, extra_checks = CALLBACK(src, PROC_REF(blueprint_change))) + +/obj/item/construction/proc/blueprint_change() + return !blueprint_changed + ///used for examining the RCD and for its UI /obj/item/construction/proc/get_silo_iron() if(silo_link && silo_mats.mat_container && !silo_mats.on_hold()) diff --git a/code/game/objects/items/rcd/RLD.dm b/code/game/objects/items/rcd/RLD.dm index e321e5e941d67..80d98382e6452 100644 --- a/code/game/objects/items/rcd/RLD.dm +++ b/code/game/objects/items/rcd/RLD.dm @@ -88,61 +88,56 @@ else toggle_silo(user) -/obj/item/construction/rld/afterattack(atom/A, mob/user) - . = ..() - if(!range_check(A,user)) - return +/obj/item/construction/rld/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!range_check(interacting_with, user)) + return NONE + return interact_with_atom(interacting_with, user, modifiers) + +/obj/item/construction/rld/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) var/turf/start = get_turf(src) switch(mode) if(REMOVE_MODE) - if(!istype(A, /obj/machinery/light/)) - return FALSE + if(!istype(interacting_with, /obj/machinery/light)) + return NONE //resource sanity checks before & after delay if(!checkResource(DECONSTRUCT_COST, user)) - return FALSE - var/beam = user.Beam(A,icon_state="light_beam", time = 15) - playsound(loc, 'sound/machines/click.ogg', 50, TRUE) - if(!do_after(user, REMOVE_DELAY, target = A)) + return ITEM_INTERACT_BLOCKING + var/beam = user.Beam(interacting_with, icon_state="light_beam", time = 15) + playsound(src, 'sound/machines/click.ogg', 50, TRUE) + if(!do_after(user, REMOVE_DELAY, target = interacting_with)) qdel(beam) - return FALSE + return ITEM_INTERACT_BLOCKING if(!checkResource(DECONSTRUCT_COST, user)) - return FALSE - + return ITEM_INTERACT_BLOCKING if(!useResource(DECONSTRUCT_COST, user)) - return FALSE + return ITEM_INTERACT_BLOCKING activate() - qdel(A) - return TRUE + qdel(interacting_with) + return ITEM_INTERACT_SUCCESS if(LIGHT_MODE) //resource sanity checks before & after delay - var/cost = iswallturf(A) ? LIGHT_TUBE_COST : FLOOR_LIGHT_COST + var/cost = iswallturf(interacting_with) ? LIGHT_TUBE_COST : FLOOR_LIGHT_COST if(!checkResource(cost, user)) - return FALSE - var/beam = user.Beam(A,icon_state="light_beam", time = BUILD_DELAY) + return ITEM_INTERACT_BLOCKING + var/beam = user.Beam(interacting_with, icon_state="light_beam", time = BUILD_DELAY) playsound(loc, 'sound/machines/click.ogg', 50, TRUE) playsound(loc, 'sound/effects/light_flicker.ogg', 50, FALSE) - if(!do_after(user, BUILD_DELAY, target = A)) + if(!do_after(user, BUILD_DELAY, target = interacting_with)) qdel(beam) - return FALSE + return ITEM_INTERACT_BLOCKING if(!checkResource(cost, user)) - return FALSE + return ITEM_INTERACT_BLOCKING - if(iswallturf(A)) + if(iswallturf(interacting_with)) var/turf/open/winner = null var/winning_dist = null - var/skip = FALSE for(var/direction in GLOB.cardinals) - var/turf/C = get_step(A, direction) + var/turf/C = get_step(interacting_with, direction) //turf already has a light - skip = FALSE - for(var/obj/machinery/light/dupe in C) - if(istype(dupe, /obj/machinery/light)) - skip = TRUE - break - if(skip) + if(locate(/obj/machinery/light) in C) continue //can't put a light here if(!(isspaceturf(C) || TURF_SHARES(C))) @@ -159,43 +154,41 @@ winning_dist = contender if(!winner) balloon_alert(user, "no valid target!") - return FALSE - + return ITEM_INTERACT_BLOCKING if(!useResource(cost, user)) - return FALSE + return ITEM_INTERACT_BLOCKING activate() var/obj/machinery/light/L = new /obj/machinery/light(get_turf(winner)) - L.setDir(get_dir(winner, A)) + L.setDir(get_dir(winner, interacting_with)) L.color = color_choice L.set_light_color(color_choice) - return TRUE - - if(isfloorturf(A)) - var/turf/target = get_turf(A) - for(var/obj/machinery/light/floor/dupe in target) - if(istype(dupe)) - return FALSE + return ITEM_INTERACT_SUCCESS + if(isfloorturf(interacting_with)) + var/turf/target = get_turf(interacting_with) + if(locate(/obj/machinery/light/floor) in target) + return ITEM_INTERACT_BLOCKING if(!useResource(cost, user)) - return FALSE + return ITEM_INTERACT_BLOCKING activate() var/obj/machinery/light/floor/FL = new /obj/machinery/light/floor(target) FL.color = color_choice FL.set_light_color(color_choice) - return TRUE + return ITEM_INTERACT_SUCCESS if(GLOW_MODE) if(!useResource(GLOW_STICK_COST, user)) - return FALSE + return ITEM_INTERACT_BLOCKING activate() var/obj/item/flashlight/glowstick/new_stick = new /obj/item/flashlight/glowstick(start) new_stick.color = color_choice new_stick.set_light_color(new_stick.color) - new_stick.throw_at(A, 9, 3, user) + new_stick.throw_at(interacting_with, 9, 3, user) new_stick.turn_on() new_stick.update_brightness() + return ITEM_INTERACT_SUCCESS - return TRUE + return NONE /obj/item/construction/rld/mini name = "mini-rapid-light-device" diff --git a/code/game/objects/items/rcd/RPLD.dm b/code/game/objects/items/rcd/RPLD.dm index 2118def40c403..d55a1ad7bef41 100644 --- a/code/game/objects/items/rcd/RPLD.dm +++ b/code/game/objects/items/rcd/RPLD.dm @@ -177,6 +177,7 @@ if(!design) return FALSE blueprint = design + blueprint_changed = TRUE playsound(src, 'sound/effects/pop.ogg', 50, vary = FALSE) @@ -202,7 +203,7 @@ if(!is_allowed) balloon_alert(user, "turf is blocked!") return FALSE - if(!do_after(user, cost, target = destination)) //"cost" is relative to delay at a rate of 10 matter/second (1matter/decisecond) rather than playing with 2 different variables since everyone set it to this rate anyways. + if(!build_delay(user, cost, target = destination)) return FALSE if(!checkResource(cost, user) || !(is_allowed = canPlace(destination))) if(!is_allowed) @@ -240,31 +241,32 @@ if(duct_machine.duct_layer & layer_id) return FALSE -/obj/item/construction/plumbing/interact_with_atom(atom/target, mob/living/user, list/modifiers) - . = NONE +/obj/item/construction/plumbing/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) for(var/category_name in plumbing_design_types) var/list/designs = plumbing_design_types[category_name] for(var/obj/machinery/recipe as anything in designs) - if(target.type != recipe) + if(interacting_with.type != recipe) continue - var/obj/machinery/machine_target = target + var/obj/machinery/machine_target = interacting_with if(machine_target.anchored) balloon_alert(user, "unanchor first!") return ITEM_INTERACT_BLOCKING - if(do_after(user, 2 SECONDS, target = target)) + if(do_after(user, 2 SECONDS, target = interacting_with)) machine_target.deconstruct() //Let's not substract matter - playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) //this is just such a great sound effect + playsound(src, 'sound/machines/click.ogg', 50, TRUE) //this is just such a great sound effect return ITEM_INTERACT_SUCCESS - if(create_machine(target, user)) + if(!isopenturf(interacting_with)) + return NONE + if(create_machine(interacting_with, user)) return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING /obj/item/construction/plumbing/interact_with_atom_secondary(atom/target, mob/living/user, list/modifiers) - . = NONE if(!istype(target, /obj/machinery/duct)) - return ITEM_INTERACT_BLOCKING + return NONE var/obj/machinery/duct/duct = target if(duct.duct_layer && duct.duct_color) @@ -272,6 +274,7 @@ current_layer = GLOB.plumbing_layer_names["[duct.duct_layer]"] balloon_alert(user, "using [current_color], layer [current_layer]") return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING /obj/item/construction/plumbing/click_alt(mob/user) ui_interact(user) @@ -374,4 +377,3 @@ plumbing_design_types = service_design_types . = ..() - diff --git a/code/game/objects/items/rcd/RSF.dm b/code/game/objects/items/rcd/RSF.dm index 8db8c2a91161a..b267ecd05cf14 100644 --- a/code/game/objects/items/rcd/RSF.dm +++ b/code/game/objects/items/rcd/RSF.dm @@ -125,21 +125,18 @@ RSF return FALSE return TRUE -/obj/item/rsf/afterattack(atom/A, mob/user, proximity) +/obj/item/rsf/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(cooldown > world.time) - return - . = ..() - if(!proximity) - return . - . |= AFTERATTACK_PROCESSED_ITEM - if (!is_allowed(A)) - return . + return NONE + if (!is_allowed(interacting_with)) + return NONE if(use_matter(dispense_cost, user))//If we can charge that amount of charge, we do so and return true playsound(loc, 'sound/machines/click.ogg', 10, TRUE) - var/atom/meme = new to_dispense(get_turf(A)) + var/atom/meme = new to_dispense(get_turf(interacting_with)) to_chat(user, span_notice("[action_type] [meme.name]...")) cooldown = world.time + cooldowndelay - return . + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING ///A helper proc. checks to see if we can afford the amount of charge that is passed, and if we can docs the charge from our base, and returns TRUE. If we can't we return FALSE /obj/item/rsf/proc/use_matter(charge, mob/user) @@ -163,10 +160,7 @@ RSF ///Helper proc that iterates through all the things we are allowed to spawn on, and sees if the passed atom is one of them /obj/item/rsf/proc/is_allowed(atom/to_check) - for(var/sort in allowed_surfaces) - if(istype(to_check, sort)) - return TRUE - return FALSE + return is_type_in_list(to_check, allowed_surfaces) /obj/item/rsf/cookiesynth name = "Cookie Synthesizer" diff --git a/code/game/objects/items/rcd/RTD.dm b/code/game/objects/items/rcd/RTD.dm index e38b283631f62..783cb1914d44d 100644 --- a/code/game/objects/items/rcd/RTD.dm +++ b/code/game/objects/items/rcd/RTD.dm @@ -224,13 +224,20 @@ QDEL_LIST(design_overlays) design_category = params["category_name"] selected_design.set_info(target_design) + blueprint_changed = TRUE return TRUE -/obj/item/construction/rtd/afterattack(turf/open/floor/floor, mob/user) - . = ..() - if(!istype(floor) || !range_check(floor,user)) - return TRUE +/obj/item/construction/rtd/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!range_check(interacting_with, user)) + return NONE + return interact_with_atom(interacting_with, user, modifiers) + + +/obj/item/construction/rtd/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + var/turf/open/floor/floor = interacting_with + if(!istype(floor)) + return NONE var/floor_designs = GLOB.floor_designs if(!istype(floor, /turf/open/floor/plating)) //we infer what floor type it is if its not the usual plating @@ -259,11 +266,11 @@ selected_design.set_direction(floor.dir) balloon_alert(user, "tile changed to [selected_design.name]") - return TRUE + return ITEM_INTERACT_SUCCESS //can't infer floor type! balloon_alert(user, "design not supported!") - return TRUE + return ITEM_INTERACT_BLOCKING var/delay = CONSTRUCTION_TIME(selected_design.cost) var/obj/effect/constructing_effect/rcd_effect = new(floor, delay, RCD_TURF) @@ -271,27 +278,27 @@ //resource sanity check before & after delay along with special effects if(!checkResource(selected_design.cost, user)) qdel(rcd_effect) - return TRUE + return ITEM_INTERACT_BLOCKING var/beam = user.Beam(floor, icon_state = "light_beam", time = delay) playsound(loc, 'sound/effects/light_flicker.ogg', 50, FALSE) - if(!do_after(user, delay, target = floor)) + if(!build_delay(user, delay, target = floor)) qdel(beam) qdel(rcd_effect) - return TRUE + return ITEM_INTERACT_BLOCKING if(!checkResource(selected_design.cost, user)) qdel(rcd_effect) - return TRUE + return ITEM_INTERACT_BLOCKING if(!useResource(selected_design.cost, user)) qdel(rcd_effect) - return TRUE + return ITEM_INTERACT_BLOCKING activate() //step 1 create tile var/obj/item/stack/tile/final_tile = selected_design.new_tile(user.drop_location()) if(QDELETED(final_tile)) //if you were standing on a stack of tiles this newly spawned tile could get merged with it cause its spawned on your location qdel(rcd_effect) balloon_alert(user, "tile got merged with the stack beneath you!") - return TRUE + return ITEM_INTERACT_SUCCESS //step 2 lay tile var/turf/open/new_turf = final_tile.place_tile(floor, user) if(new_turf) //apply infered overlays @@ -299,16 +306,21 @@ info.add_decal(new_turf) rcd_effect.end_animation() - return TRUE + return ITEM_INTERACT_SUCCESS + +/obj/item/construction/rtd/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(!range_check(interacting_with, user)) + return NONE + return interact_with_atom_secondary(interacting_with, user, modifiers) -/obj/item/construction/rtd/afterattack_secondary(turf/open/floor/floor, mob/user, proximity_flag, click_parameters) - ..() - if(!istype(floor) || !range_check(floor,user)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN +/obj/item/construction/rtd/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + var/turf/open/floor/floor = interacting_with + if(!istype(floor)) + return NONE if(istype(floor, /turf/open/floor/plating)) //cant deconstruct normal plating thats the RCD's job balloon_alert(user, "nothing to deconstruct!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING var/floor_designs = GLOB.floor_designs @@ -327,7 +339,7 @@ break if(!cost) balloon_alert(user, "can't deconstruct this type!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING var/delay = DECONSTRUCTION_TIME(cost) var/obj/effect/constructing_effect/rcd_effect = new(floor, delay, RCD_DECONSTRUCT) @@ -335,21 +347,21 @@ //resource sanity check before & after delay along with beam effects if(!checkResource(cost * 0.7, user)) //no ballon alert for checkResource as it already spans an alert to chat qdel(rcd_effect) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING var/beam = user.Beam(floor, icon_state = "light_beam", time = delay) playsound(loc, 'sound/effects/light_flicker.ogg', 50, FALSE) if(!do_after(user, delay, target = floor)) qdel(beam) qdel(rcd_effect) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING if(!checkResource(cost * 0.7, user)) qdel(rcd_effect) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING //do the tiling if(!useResource(cost * 0.7, user)) qdel(rcd_effect) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING activate() //find & collect all decals var/list/all_decals = list() @@ -365,7 +377,7 @@ floor.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) rcd_effect.end_animation() - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_SUCCESS /obj/item/construction/rtd/loaded matter = 350 diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index c85bd5fe9615d..f25c022b5808a 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -343,15 +343,18 @@ var/staffcooldown = 0 var/staffwait = 30 -/obj/item/godstaff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() +/obj/item/godstaff/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) + +/obj/item/godstaff/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(staffcooldown + staffwait > world.time) - return - . |= AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_BLOCKING + user.visible_message(span_notice("[user] chants deeply and waves [user.p_their()] staff!")) - if(do_after(user, 2 SECONDS, src)) - target.add_atom_colour(conversion_color, WASHABLE_COLOUR_PRIORITY) //wololo + if(do_after(user, 2 SECONDS, interacting_with)) + interacting_with.add_atom_colour(conversion_color, WASHABLE_COLOUR_PRIORITY) //wololo staffcooldown = world.time + return ITEM_INTERACT_SUCCESS /obj/item/godstaff/red icon_state = "godstaff-red" diff --git a/code/game/objects/items/robot/items/food.dm b/code/game/objects/items/robot/items/food.dm index 40166a6a8fbfe..6e9b2143d12b6 100644 --- a/code/game/objects/items/robot/items/food.dm +++ b/code/game/objects/items/robot/items/food.dm @@ -117,23 +117,39 @@ user.visible_message(span_warning("[user] shoots a high-velocity gumball at [target]!")) check_amount() -/obj/item/borg/lollipop/afterattack(atom/target, mob/living/user, proximity, click_params) +/obj/item/borg/lollipop/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) check_amount() if(iscyborg(user)) var/mob/living/silicon/robot/robot_user = user - if(!robot_user.cell.use(0.012 * STANDARD_CELL_CHARGE)) + if(!robot_user.cell?.use(0.012 * STANDARD_CELL_CHARGE)) to_chat(user, span_warning("Not enough power.")) - return AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_BLOCKING + switch(mode) - if(DISPENSE_LOLLIPOP_MODE, DISPENSE_ICECREAM_MODE) - if(!proximity) - return AFTERATTACK_PROCESSED_ITEM - dispense(target, user) if(THROW_LOLLIPOP_MODE) - shootL(target, user, click_params) + shootL(interacting_with, user, list2params(modifiers)) + return ITEM_INTERACT_SUCCESS + if(THROW_GUMBALL_MODE) - shootG(target, user, click_params) - return ..() | AFTERATTACK_PROCESSED_ITEM + shootG(interacting_with, user, list2params(modifiers)) + return ITEM_INTERACT_SUCCESS + + return NONE + +/obj/item/borg/lollipop/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + check_amount() + if(iscyborg(user)) + var/mob/living/silicon/robot/robot_user = user + if(!robot_user.cell?.use(0.012 * STANDARD_CELL_CHARGE)) + to_chat(user, span_warning("Not enough power.")) + return ITEM_INTERACT_BLOCKING + + switch(mode) + if(DISPENSE_LOLLIPOP_MODE, DISPENSE_ICECREAM_MODE) + dispense(interacting_with, user) + return ITEM_INTERACT_SUCCESS + + return NONE /obj/item/borg/lollipop/attack_self(mob/living/user) switch(mode) diff --git a/code/game/objects/items/robot/items/generic.dm b/code/game/objects/items/robot/items/generic.dm index b9f28b4003e65..c3338ecc91c88 100644 --- a/code/game/objects/items/robot/items/generic.dm +++ b/code/game/objects/items/robot/items/generic.dm @@ -234,11 +234,11 @@ to_chat(user, span_notice("You toggle [src] to \"[mode]\" mode.")) update_appearance() -/obj/item/borg/charger/afterattack(obj/item/target, mob/living/silicon/robot/user, proximity_flag) - . = ..() - if(!proximity_flag || !iscyborg(user)) - return - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/borg/charger/interact_with_atom(atom/target, mob/living/silicon/robot/user, list/modifiers) + if(!iscyborg(user)) + return NONE + + . = ITEM_INTERACT_BLOCKING if(mode == "draw") if(is_type_in_list(target, charge_machines)) var/obj/machinery/target_machine = target diff --git a/code/game/objects/items/robot/items/hypo.dm b/code/game/objects/items/robot/items/hypo.dm index fc48a1b11b162..9c9c0b1b73a85 100644 --- a/code/game/objects/items/robot/items/hypo.dm +++ b/code/game/objects/items/robot/items/hypo.dm @@ -358,31 +358,29 @@ /obj/item/reagent_containers/borghypo/borgshaker/attack(mob/M, mob/user) return //Can't inject stuff with a shaker, can we? //not with that attitude -/obj/item/reagent_containers/borghypo/borgshaker/afterattack(obj/target, mob/user, proximity) - . = ..() - if(!proximity) - return . +/obj/item/reagent_containers/borghypo/borgshaker/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!interacting_with.is_refillable()) + return NONE if(!selected_reagent) balloon_alert(user, "no reagent selected!") - return . - . |= AFTERATTACK_PROCESSED_ITEM - if(target.is_refillable()) - if(!stored_reagents.has_reagent(selected_reagent.type, amount_per_transfer_from_this)) - balloon_alert(user, "not enough [selected_reagent.name]!") - return . - if(target.reagents.total_volume >= target.reagents.maximum_volume) - balloon_alert(user, "[target] is full!") - return . - - // This is the in-between where we're storing the reagent we're going to pour into the container - // because we cannot specify a singular reagent to transfer in trans_to - var/datum/reagents/shaker = new() - stored_reagents.remove_reagent(selected_reagent.type, amount_per_transfer_from_this) - shaker.add_reagent(selected_reagent.type, amount_per_transfer_from_this, reagtemp = dispensed_temperature, no_react = TRUE) + return ITEM_INTERACT_BLOCKING + if(!stored_reagents.has_reagent(selected_reagent.type, amount_per_transfer_from_this)) + balloon_alert(user, "not enough [selected_reagent.name]!") + return ITEM_INTERACT_BLOCKING + if(interacting_with.reagents.total_volume >= interacting_with.reagents.maximum_volume) + balloon_alert(user, "it's full!") + return ITEM_INTERACT_BLOCKING + + // This is the in-between where we're storing the reagent we're going to pour into the container + // because we cannot specify a singular reagent to transfer in trans_to + var/datum/reagents/shaker = new() + stored_reagents.remove_reagent(selected_reagent.type, amount_per_transfer_from_this) + shaker.add_reagent(selected_reagent.type, amount_per_transfer_from_this, reagtemp = dispensed_temperature, no_react = TRUE) + + shaker.trans_to(interacting_with, amount_per_transfer_from_this, transferred_by = user) + balloon_alert(user, "[amount_per_transfer_from_this] unit\s poured") + return ITEM_INTERACT_SUCCESS - shaker.trans_to(target, amount_per_transfer_from_this, transferred_by = user) - balloon_alert(user, "[amount_per_transfer_from_this] unit\s poured") - return . /obj/item/reagent_containers/borghypo/condiment_synthesizer // Solids! Condiments! The borger uprising! name = "Condiment Synthesizer" @@ -423,30 +421,26 @@ /obj/item/reagent_containers/borghypo/condiment_synthesizer/attack(mob/M, mob/user) return -/obj/item/reagent_containers/borghypo/condiment_synthesizer/afterattack(obj/target, mob/user, proximity) - . = ..() - if(!proximity) - return . +/obj/item/reagent_containers/borghypo/condiment_synthesizer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!interacting_with.is_refillable()) + return NONE if(!selected_reagent) balloon_alert(user, "no reagent selected!") - return . - . |= AFTERATTACK_PROCESSED_ITEM - if(!target.is_refillable()) - return . + return ITEM_INTERACT_BLOCKING if(!stored_reagents.has_reagent(selected_reagent.type, amount_per_transfer_from_this)) balloon_alert(user, "not enough [selected_reagent.name]!") - return . - if(target.reagents.total_volume >= target.reagents.maximum_volume) - balloon_alert(user, "[target] is full!") - return . + return ITEM_INTERACT_BLOCKING + if(interacting_with.reagents.total_volume >= interacting_with.reagents.maximum_volume) + balloon_alert(user, "it's full!") + return ITEM_INTERACT_BLOCKING // This is the in-between where we're storing the reagent we're going to pour into the container // because we cannot specify a singular reagent to transfer in trans_to var/datum/reagents/shaker = new() stored_reagents.remove_reagent(selected_reagent.type, amount_per_transfer_from_this) shaker.add_reagent(selected_reagent.type, amount_per_transfer_from_this, reagtemp = dispensed_temperature, no_react = TRUE) - shaker.trans_to(target, amount_per_transfer_from_this, transferred_by = user) + shaker.trans_to(interacting_with, amount_per_transfer_from_this, transferred_by = user) balloon_alert(user, "[amount_per_transfer_from_this] unit\s poured") - + return ITEM_INTERACT_SUCCESS /obj/item/reagent_containers/borghypo/borgshaker/hacked name = "cyborg shaker" diff --git a/code/game/objects/items/rollertable_dock.dm b/code/game/objects/items/rollertable_dock.dm index 222c8287ac93a..d0067e8c67596 100644 --- a/code/game/objects/items/rollertable_dock.dm +++ b/code/game/objects/items/rollertable_dock.dm @@ -26,13 +26,14 @@ user.visible_message(span_notice("[user] collects [src]."), balloon_alert(user, "you collect the [src].")) return TRUE -/obj/item/rolling_table_dock/afterattack(obj/target, mob/user , proximity) - . = ..() - var/turf/target_turf = get_turf(target) - if(!proximity || target_turf.is_blocked_turf(TRUE) || locate(/mob/living) in target_turf) - return - if(isopenturf(target)) - deploy_rolling_table(user, target) +/obj/item/rolling_table_dock/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + var/turf/target_turf = get_turf(interacting_with) + if(target_turf.is_blocked_turf(TRUE) || (locate(/mob/living) in target_turf)) + return NONE + if(isopenturf(interacting_with)) + deploy_rolling_table(user, interacting_with) + return ITEM_INTERACT_SUCCESS + return NONE /obj/item/rolling_table_dock/proc/deploy_rolling_table(mob/user, atom/location) var/obj/structure/table/rolling/rable = new /obj/structure/table/rolling(location) diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index f4c0b58a11bbe..66e96bcab4b83 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -167,30 +167,27 @@ return CLICK_ACTION_SUCCESS -/obj/item/spear/explosive/afterattack(atom/movable/AM, mob/user, proximity) - . = ..() - if(!proximity || !HAS_TRAIT(src, TRAIT_WIELDED) || !istype(AM)) +/obj/item/spear/explosive/afterattack(atom/movable/target, mob/user, click_parameters) + if(!HAS_TRAIT(src, TRAIT_WIELDED) || !istype(target)) + return + if(target.resistance_flags & INDESTRUCTIBLE) //due to the lich incident of 2021, embedding grenades inside of indestructible structures is forbidden return - . |= AFTERATTACK_PROCESSED_ITEM - if(AM.resistance_flags & INDESTRUCTIBLE) //due to the lich incident of 2021, embedding grenades inside of indestructible structures is forbidden - return . - if(ismob(AM)) - var/mob/mob_target = AM + if(ismob(target)) + var/mob/mob_target = target if(mob_target.status_flags & GODMODE) //no embedding grenade phylacteries inside of ghost poly either - return . - if(iseffect(AM)) //and no accidentally wasting your moment of glory on graffiti - return . + return + if(iseffect(target)) //and no accidentally wasting your moment of glory on graffiti + return user.say("[war_cry]", forced="spear warcry") if(isliving(user)) var/mob/living/living_user = user living_user.set_resting(new_resting = TRUE, silent = TRUE, instant = TRUE) - living_user.Move(get_turf(AM)) + living_user.Move(get_turf(target)) explosive.forceMove(get_turf(living_user)) explosive.detonate(lanced_by=user) if(!QDELETED(living_user)) living_user.set_resting(new_resting = FALSE, silent = TRUE, instant = TRUE) qdel(src) - return . //GREY TIDE /obj/item/spear/grey_tide @@ -201,20 +198,18 @@ force_unwielded = 15 force_wielded = 25 -/obj/item/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity) - . = ..() - if(!proximity) - return +/obj/item/spear/grey_tide/afterattack(atom/movable/target, mob/living/user, click_parameters) user.faction |= "greytide([REF(user)])" - if(isliving(AM)) - var/mob/living/L = AM - if(istype (L, /mob/living/simple_animal/hostile/illusion)) - return - if(!L.stat && prob(50)) - var/mob/living/simple_animal/hostile/illusion/M = new(user.loc) - M.faction = user.faction.Copy() - M.Copy_Parent(user, 100, user.health/2.5, 12, 30) - M.GiveTarget(L) + if(!isliving(target)) + return + var/mob/living/stabbed = target + if(istype(stabbed, /mob/living/simple_animal/hostile/illusion)) + return + if(stabbed.stat == CONSCIOUS && prob(50)) + var/mob/living/simple_animal/hostile/illusion/fake_clone = new(user.loc) + fake_clone.faction = user.faction.Copy() + fake_clone.Copy_Parent(user, 100, user.health/2.5, 12, 30) + fake_clone.GiveTarget(stabbed) //MILITARY /obj/item/spear/military diff --git a/code/game/objects/items/stacks/golem_food/golem_hand_actions.dm b/code/game/objects/items/stacks/golem_food/golem_hand_actions.dm index 39c17d2346c6a..e4b65e033975e 100644 --- a/code/game/objects/items/stacks/golem_food/golem_hand_actions.dm +++ b/code/game/objects/items/stacks/golem_food/golem_hand_actions.dm @@ -26,20 +26,23 @@ held_gibtonite.forceMove(src) addtimer(CALLBACK(src, PROC_REF(release_gibtonite)), GIBTONITE_GOLEM_HOLD_TIME, TIMER_DELETE_ME) -/obj/item/gibtonite_hand/afterattack(atom/target, mob/living/user, flag, params) - . = ..() +/obj/item/gibtonite_hand/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return ranged_interact_with_atom(interacting_with, user, modifiers) + +/obj/item/gibtonite_hand/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if (!held_gibtonite) to_chat(user, span_warning("[src] fizzles, it was a dud!")) qdel(src) - return TRUE | AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_BLOCKING + playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE) held_gibtonite.forceMove(get_turf(src)) held_gibtonite.det_time = 2 SECONDS - held_gibtonite.GibtoniteReaction(user, "A [src] has targeted [target] with a thrown and primed") - held_gibtonite.throw_at(target, range = 10, speed = 3, thrower = user) + held_gibtonite.GibtoniteReaction(user, "A [src] has targeted [interacting_with] with a thrown and primed") + held_gibtonite.throw_at(interacting_with, range = 10, speed = 3, thrower = user) held_gibtonite = null qdel(src) - return TRUE | AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_SUCCESS /// Called when you can't hold it in any longer and just drop it on the ground /obj/item/gibtonite_hand/proc/release_gibtonite() @@ -69,15 +72,17 @@ /// How accurate are you? var/teleport_vary = 2 -/obj/item/bluespace_finger/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - var/turf/target_turf = get_turf(target) +/obj/item/bluespace_finger/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return ranged_interact_with_atom(interacting_with, user, modifiers) + +/obj/item/bluespace_finger/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + var/turf/target_turf = get_turf(interacting_with) if (get_dist(target_turf, get_turf(src)) > teleport_range) balloon_alert(user, "too far!") - return TRUE | AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_BLOCKING if (target_turf.is_blocked_turf(exclude_mobs = TRUE)) balloon_alert(user, "no room!") - return TRUE | AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_BLOCKING var/obj/effect/temp_visual/teleport_golem/landing_indicator = new(target_turf) user.add_filter(BLUESPACE_GLOW_FILTER, 2, list("type" = "outline", "color" = COLOR_BRIGHT_BLUE, "alpha" = 0, "size" = 1)) @@ -89,7 +94,7 @@ qdel(landing_indicator) user.remove_filter(BLUESPACE_GLOW_FILTER) if (!did_teleport) - return + return ITEM_INTERACT_BLOCKING var/list/valid_landing_tiles = list(target_turf) for (var/turf/potential_landing in oview(teleport_vary, target_turf)) @@ -101,6 +106,7 @@ telefrag.Knockdown(2 SECONDS) do_teleport(user, final_destination, asoundin = 'sound/effects/phasein.ogg', no_effects = TRUE) qdel(src) + return ITEM_INTERACT_SUCCESS #undef GIBTONITE_GOLEM_HOLD_TIME #undef BLUESPACE_GLOW_FILTER diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 20b79bdfa71d3..6011e0b396159 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -63,9 +63,8 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ slapcraft_recipes = slapcraft_recipe_list,\ ) -/obj/item/stack/rods/handle_openspace_click(turf/target, mob/user, proximity_flag, click_parameters) - if(proximity_flag) - target.attackby(src, user, click_parameters) +/obj/item/stack/rods/handle_openspace_click(turf/target, mob/user, click_parameters) + target.attackby(src, user, click_parameters) /obj/item/stack/rods/get_main_recipes() . = ..() diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index e93b8c4cea59d..59196639ffeba 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -341,20 +341,16 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( if(T && is_station_level(T.z)) SSblackbox.record_feedback("tally", "station_mess_destroyed", 1, name) -/obj/item/shard/afterattack(atom/A as mob|obj, mob/user, proximity) - . = ..() - if(!proximity || !(src in user)) - return - if(isturf(A)) +/obj/item/shard/afterattack(atom/target, mob/user, click_parameters) + if(!iscarbon(user) || !user.is_holding(src)) return - if(istype(A, /obj/item/storage)) + + var/mob/living/carbon/jab = user + if(jab.get_all_covered_flags() & HANDS) return - var/hit_hand = ((user.active_hand_index % 2 == 0) ? "r_" : "l_") + "arm" - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(!H.gloves && !HAS_TRAIT(H, TRAIT_PIERCEIMMUNE)) // golems, etc - to_chat(H, span_warning("[src] cuts into your hand!")) - H.apply_damage(force*0.5, BRUTE, hit_hand, attacking_item = src) + + to_chat(user, span_warning("[src] cuts into your hand!")) + jab.apply_damage(force * 0.5, BRUTE, user.get_active_hand(), attacking_item = src) /obj/item/shard/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/lightreplacer)) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 2843feed54aaa..7b6d4b6207340 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -223,31 +223,31 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ user.put_in_inactive_hand(new_item) return ITEM_INTERACT_SUCCESS -/obj/item/stack/sheet/iron/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - if(isopenturf(target)) - var/turf/open/build_on = target - if(!user.Adjacent(build_on)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(isgroundlessturf(build_on)) - user.balloon_alert(user, "can't place it here!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(build_on.is_blocked_turf()) - user.balloon_alert(user, "something is blocking the tile!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(get_amount() < 2) - user.balloon_alert(user, "not enough material!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(!do_after(user, 4 SECONDS, build_on)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(build_on.is_blocked_turf()) - user.balloon_alert(user, "something is blocking the tile!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(!use(2)) - user.balloon_alert(user, "not enough material!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - new/obj/structure/girder/displaced(build_on) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - return SECONDARY_ATTACK_CONTINUE_CHAIN +/obj/item/stack/sheet/iron/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(!isopenturf(interacting_with)) + return NONE + var/turf/open/build_on = interacting_with + if(!user.Adjacent(build_on)) + return ITEM_INTERACT_BLOCKING + if(isgroundlessturf(build_on)) + user.balloon_alert(user, "can't place it here!") + return ITEM_INTERACT_BLOCKING + if(build_on.is_blocked_turf()) + user.balloon_alert(user, "something is blocking the tile!") + return ITEM_INTERACT_BLOCKING + if(get_amount() < 2) + user.balloon_alert(user, "not enough material!") + return ITEM_INTERACT_BLOCKING + if(!do_after(user, 4 SECONDS, build_on)) + return ITEM_INTERACT_BLOCKING + if(build_on.is_blocked_turf()) + user.balloon_alert(user, "something is blocking the tile!") + return ITEM_INTERACT_BLOCKING + if(!use(2)) + user.balloon_alert(user, "not enough material!") + return ITEM_INTERACT_BLOCKING + new/obj/structure/girder/displaced(build_on) + return ITEM_INTERACT_SUCCESS /* * Plasteel diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm index c8b46e2d28175..57aa666c046ab 100644 --- a/code/game/objects/items/stacks/tape.dm +++ b/code/game/objects/items/stacks/tape.dm @@ -39,18 +39,13 @@ . = ..() . += "[span_notice("You could rip a piece off by using an empty hand.")]" -/obj/item/stack/sticky_tape/afterattack(obj/item/target, mob/living/user, proximity) - if(!proximity) - return - - if(!istype(target)) - return - - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/stack/sticky_tape/interact_with_atom(obj/item/target, mob/living/user, list/modifiers) + if(!isitem(target)) + return NONE if(target.embedding && target.embedding == conferred_embed) to_chat(user, span_warning("[target] is already coated in [src]!")) - return . + return ITEM_INTERACT_BLOCKING user.visible_message(span_notice("[user] begins wrapping [target] with [src]."), span_notice("You begin wrapping [target] with [src].")) playsound(user, 'sound/items/duct_tape_rip.ogg', 50, TRUE) @@ -63,11 +58,11 @@ to_chat(user, span_notice("You turn [target] into [O] with [src].")) QDEL_NULL(target) user.put_in_hands(O) - return . + return ITEM_INTERACT_SUCCESS if(target.embedding && target.embedding == conferred_embed) to_chat(user, span_warning("[target] is already coated in [src]!")) - return . + return ITEM_INTERACT_BLOCKING target.embedding = conferred_embed target.updateEmbedding() @@ -78,7 +73,7 @@ var/obj/item/grenade/sticky_bomb = target sticky_bomb.sticky = TRUE - return . + return ITEM_INTERACT_SUCCESS /obj/item/stack/sticky_tape/super name = "super sticky tape" diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 86e86b9eb554f..700116ac1e18f 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -101,9 +101,8 @@ playsound(target_plating, 'sound/weapons/genhit.ogg', 50, TRUE) return target_plating -/obj/item/stack/tile/handle_openspace_click(turf/target, mob/user, proximity_flag, click_parameters) - if(proximity_flag) - target.attackby(src, user, click_parameters) +/obj/item/stack/tile/handle_openspace_click(turf/target, mob/user, click_parameters) + target.attackby(src, user, click_parameters) //Grass /obj/item/stack/tile/grass diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index 5097234b47c00..d7fcd17f2950d 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -102,26 +102,29 @@ /obj/item/delivery/can_be_package_wrapped() return FALSE -/obj/item/stack/package_wrap/afterattack(obj/target, mob/user, proximity) - . = ..() - if(!proximity) - return - if(!istype(target)) - return - if(target.anchored) - return - - if(isitem(target)) - . |= AFTERATTACK_PROCESSED_ITEM - var/obj/item/item = target +/obj/item/stack/package_wrap/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/user) + if(isitem(storage_holder)) + // Don't insert if the target can be wrapped + var/obj/item/item = storage_holder + return !item.can_be_package_wrapped() + return TRUE + +/obj/item/stack/package_wrap/interact_with_atom(obj/interacting_with, mob/living/user, list/modifiers) + if(!isobj(interacting_with)) + return NONE + if(interacting_with.anchored) + return NONE + + if(isitem(interacting_with)) + var/obj/item/item = interacting_with if(!item.can_be_package_wrapped()) balloon_alert(user, "can't be wrapped!") - return + return ITEM_INTERACT_BLOCKING if(user.is_holding(item)) if(!user.dropItemToGround(item)) - return + return ITEM_INTERACT_BLOCKING else if(!isturf(item.loc)) - return + return ITEM_INTERACT_BLOCKING if(use(1)) var/obj/item/delivery/small/parcel = new(get_turf(item.loc)) if(user.Adjacent(item)) @@ -135,15 +138,17 @@ size = min(size, 5) parcel.base_icon_state = "deliverypackage[size]" parcel.update_icon() + else + return ITEM_INTERACT_BLOCKING - else if(istype(target, /obj/structure/closet)) - var/obj/structure/closet/closet = target + else if(istype(interacting_with, /obj/structure/closet)) + var/obj/structure/closet/closet = interacting_with if(closet.opened) balloon_alert(user, "can't wrap while open!") - return + return ITEM_INTERACT_BLOCKING if(!closet.delivery_icon) //no delivery icon means unwrappable closet (e.g. body bags) balloon_alert(user, "can't wrap!") - return + return ITEM_INTERACT_BLOCKING if(use(3)) var/obj/item/delivery/big/parcel = new(get_turf(closet.loc)) parcel.base_icon_state = closet.delivery_icon @@ -154,13 +159,13 @@ closet.add_fingerprint(user) else balloon_alert(user, "not enough paper!") - return + return ITEM_INTERACT_BLOCKING - else if(istype(target, /obj/machinery/portable_atmospherics)) - var/obj/machinery/portable_atmospherics/portable_atmospherics = target + else if(istype(interacting_with, /obj/machinery/portable_atmospherics)) + var/obj/machinery/portable_atmospherics/portable_atmospherics = interacting_with if(portable_atmospherics.anchored) balloon_alert(user, "can't wrap while anchored!") - return + return ITEM_INTERACT_BLOCKING if(use(3)) var/obj/item/delivery/big/parcel = new(get_turf(portable_atmospherics.loc)) parcel.base_icon_state = "deliverybox" @@ -171,14 +176,15 @@ portable_atmospherics.add_fingerprint(user) else balloon_alert(user, "not enough paper!") - return + return ITEM_INTERACT_BLOCKING else balloon_alert(user, "can't wrap!") - return + return ITEM_INTERACT_BLOCKING - user.visible_message(span_notice("[user] wraps [target].")) - user.log_message("has used [name] on [key_name(target)]", LOG_ATTACK, color="blue") + user.visible_message(span_notice("[user] wraps [interacting_with].")) + user.log_message("has used [name] on [key_name(interacting_with)]", LOG_ATTACK, color="blue") + return ITEM_INTERACT_SUCCESS /obj/item/stack/package_wrap/use(used, transfer = FALSE, check = TRUE) var/turf/T = get_turf(src) diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 28caa290a9cc1..d7164988ddb68 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -155,11 +155,13 @@ UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) listeningTo = null -/obj/item/storage/bag/ore/attackby(obj/item/attacking_item, mob/user, params) - if(istype(attacking_item, /obj/item/boulder)) - to_chat(user, span_warning("You can't fit \the [attacking_item] into \the [src]. Perhaps you should break it down first, or find an ore box.")) - return TRUE - return ..() +/obj/item/storage/bag/ore/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) + if(istype(inserted, /obj/item/boulder)) + to_chat(user, span_warning("You can't fit [inserted] into [src]. \ + Perhaps you should break it down first, or find an ore box.")) + return FALSE + + return TRUE /obj/item/storage/bag/ore/proc/pickup_ores(mob/living/user) SIGNAL_HANDLER diff --git a/code/game/objects/items/storage/boxes/_boxes.dm b/code/game/objects/items/storage/boxes/_boxes.dm index 1861a5bd2fc38..56915d8a5fced 100644 --- a/code/game/objects/items/storage/boxes/_boxes.dm +++ b/code/game/objects/items/storage/boxes/_boxes.dm @@ -51,8 +51,3 @@ balloon_alert(user, "folded") qdel(src) user.put_in_hands(result) - -/obj/item/storage/box/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/stack/package_wrap)) - return FALSE - return ..() diff --git a/code/game/objects/items/storage/boxes/food_boxes.dm b/code/game/objects/items/storage/boxes/food_boxes.dm index c49fa288eb38b..45de0e58ff6c1 100644 --- a/code/game/objects/items/storage/boxes/food_boxes.dm +++ b/code/game/objects/items/storage/boxes/food_boxes.dm @@ -94,16 +94,16 @@ desc = "A paper sack with a crude smile etched onto the side." return ..() -/obj/item/storage/box/papersack/attackby(obj/item/attacking_item, mob/user, params) - if(istype(attacking_item, /obj/item/pen)) - var/choice = show_radial_menu(user, src , papersack_designs, custom_check = CALLBACK(src, PROC_REF(check_menu), user, attacking_item), radius = 36, require_near = TRUE) +/obj/item/storage/box/papersack/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) + if(istype(inserted, /obj/item/pen)) + var/choice = show_radial_menu(user, src , papersack_designs, custom_check = CALLBACK(src, PROC_REF(check_menu), user, inserted), radius = 36, require_near = TRUE) if(!choice || choice == design_choice) return FALSE design_choice = choice balloon_alert(user, "modified") update_appearance() return FALSE - if(attacking_item.get_sharpness() && !contents.len) + if(inserted.get_sharpness() && !contents.len) if(design_choice == "None") user.show_message(span_notice("You cut eyeholes into [src]."), MSG_VISUAL) new /obj/item/clothing/head/costume/papersack(drop_location()) @@ -114,7 +114,7 @@ new /obj/item/clothing/head/costume/papersack/smiley(drop_location()) qdel(src) return FALSE - return ..() + return TRUE /** * check_menu: Checks if we are allowed to interact with a radial menu diff --git a/code/game/objects/items/storage/boxes/job_boxes.dm b/code/game/objects/items/storage/boxes/job_boxes.dm index 220fdc2f79522..7785099a2262c 100644 --- a/code/game/objects/items/storage/boxes/job_boxes.dm +++ b/code/game/objects/items/storage/boxes/job_boxes.dm @@ -42,7 +42,7 @@ if(HAS_TRAIT(SSstation, STATION_TRAIT_RADIOACTIVE_NEBULA)) new /obj/item/storage/pill_bottle/potassiodide(src) - + if(SSmapping.is_planetary() && LAZYLEN(SSmapping.multiz_levels)) new /obj/item/climbing_hook/emergency(src) @@ -171,20 +171,20 @@ desc = "A colorful cardboard box for the clown" illustration = "clown" -/obj/item/storage/box/clown/attackby(obj/item/I, mob/user, params) - if((istype(I, /obj/item/bodypart/arm/left/robot)) || (istype(I, /obj/item/bodypart/arm/right/robot))) +/obj/item/storage/box/clown/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) + if(istype(inserted, /obj/item/bodypart/arm/left/robot) || istype(inserted, /obj/item/bodypart/arm/right/robot)) if(contents.len) //prevent accidently deleting contents balloon_alert(user, "items inside!") - return - if(!user.temporarilyRemoveItemFromInventory(I)) - return - qdel(I) - balloon_alert(user, "wheels added, honk!") + return FALSE + if(!user.temporarilyRemoveItemFromInventory(inserted)) + return FALSE + qdel(inserted) + loc.balloon_alert(user, "wheels added, honk!") var/obj/item/bot_assembly/honkbot/A = new qdel(src) user.put_in_hands(A) - else - return ..() + return FALSE + return TRUE /obj/item/storage/box/clown/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] opens [src] and gets consumed by [p_them()]! It looks like [user.p_theyre()] trying to commit suicide!")) diff --git a/code/game/objects/items/storage/boxes/service_boxes.dm b/code/game/objects/items/storage/boxes/service_boxes.dm index 6dc790cc49545..e4d6a86553f4c 100644 --- a/code/game/objects/items/storage/boxes/service_boxes.dm +++ b/code/game/objects/items/storage/boxes/service_boxes.dm @@ -92,13 +92,18 @@ atom_storage.max_slots = 10 atom_storage.set_holdable(/obj/item/match) +/obj/item/storage/box/matches/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) + return !istype(inserted, /obj/item/match) + /obj/item/storage/box/matches/PopulateContents() for(var/i in 1 to 10) new /obj/item/match(src) -/obj/item/storage/box/matches/attackby(obj/item/match/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/match)) - W.matchignite() +/obj/item/storage/box/matches/item_interaction(mob/living/user, obj/item/match/match, list/modifiers) + if(istype(match)) + match.matchignite() + return ITEM_INTERACT_SUCCESS + return NONE /obj/item/storage/box/matches/update_icon_state() . = ..() diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 87a7e4928dadc..3f80f0e22af55 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -23,12 +23,12 @@ register_context() -/obj/item/storage/lockbox/attackby(obj/item/W, mob/user, params) +/obj/item/storage/lockbox/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) var/locked = atom_storage.locked - if(W.GetID()) + if(inserted.GetID()) if(broken) balloon_alert(user, "broken!") - return + return FALSE if(allowed(user)) if(atom_storage.locked) atom_storage.locked = STORAGE_NOT_LOCKED @@ -42,15 +42,16 @@ icon_state = icon_closed balloon_alert(user, locked ? "locked" : "unlocked") - return + return FALSE - else - balloon_alert(user, "access denied!") - return - if(!locked) - return ..() - else + balloon_alert(user, "access denied!") + return FALSE + + if(locked) balloon_alert(user, "locked!") + return FALSE + + return TRUE /obj/item/storage/lockbox/emag_act(mob/user, obj/item/card/emag/emag_card) if(!broken) @@ -251,17 +252,14 @@ ADD_TRAIT(src, TRAIT_NO_MISSING_ITEM_ERROR, TRAIT_GENERIC) ADD_TRAIT(src, TRAIT_NO_MANIFEST_CONTENTS_ERROR, TRAIT_GENERIC) -/obj/item/storage/lockbox/order/attackby(obj/item/W, mob/user, params) - var/obj/item/card/id/id_card = W.GetID() +/obj/item/storage/lockbox/order/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) + var/obj/item/card/id/id_card = inserted.GetID() if(!id_card) return ..() - if(iscarbon(user)) - add_fingerprint(user) - if(id_card.registered_account != buyer_account) balloon_alert(user, "incorrect bank account!") - return + return FALSE if(privacy_lock) atom_storage.locked = STORAGE_NOT_LOCKED @@ -270,8 +268,11 @@ atom_storage.locked = STORAGE_FULLY_LOCKED icon_state = icon_closed privacy_lock = atom_storage.locked - user.visible_message(span_notice("[user] [privacy_lock ? "" : "un"]locks [src]'s privacy lock."), - span_notice("You [privacy_lock ? "" : "un"]lock [src]'s privacy lock.")) + user.visible_message( + span_notice("[user] [privacy_lock ? "" : "un"]locks [src]'s privacy lock."), + span_notice("You [privacy_lock ? "" : "un"]lock [src]'s privacy lock."), + ) + return FALSE ///screentips for lockboxes /obj/item/storage/lockbox/add_context(atom/source, list/context, obj/item/held_item, mob/user) diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index 5b09b5e0605bd..b1ca307e939f1 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -399,14 +399,13 @@ generate_items_inside(items_inside,src) //medibot assembly -/obj/item/storage/medkit/attackby(obj/item/bodypart/bodypart, mob/user, params) - if((!istype(bodypart, /obj/item/bodypart/arm/left/robot)) && (!istype(bodypart, /obj/item/bodypart/arm/right/robot))) - return ..() - +/obj/item/storage/medkit/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) + if(!istype(inserted, /obj/item/bodypart/arm/left/robot) && !istype(inserted, /obj/item/bodypart/arm/right/robot)) + return TRUE //Making a medibot! if(contents.len >= 1) balloon_alert(user, "items inside!") - return + return FALSE ///if you add a new one don't forget to update /datum/crafting_recipe/medbot/on_craft_completion() var/obj/item/bot_assembly/medbot/medbot_assembly = new @@ -424,10 +423,11 @@ medbot_assembly.set_skin("bezerk") user.put_in_hands(medbot_assembly) medbot_assembly.balloon_alert(user, "arm added") - medbot_assembly.robot_arm = bodypart.type + medbot_assembly.robot_arm = inserted.type medbot_assembly.medkit_type = type - qdel(bodypart) + qdel(inserted) qdel(src) + return FALSE /* * Pill Bottles @@ -733,20 +733,28 @@ icon_state = "[base_icon_state][cooling ? "-working" : null]" return ..() -/obj/item/storage/organbox/attackby(obj/item/I, mob/user, params) - if(is_reagent_container(I) && I.is_open_container()) - var/obj/item/reagent_containers/RC = I +/obj/item/storage/organbox/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) + if(is_reagent_container(inserted) && inserted.is_open_container()) + return FALSE + if(istype(inserted, /obj/item/plunger)) + return FALSE + return TRUE + +/obj/item/storage/organbox/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(is_reagent_container(tool) && tool.is_open_container()) + var/obj/item/reagent_containers/RC = tool var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this, transferred_by = user) if(units) balloon_alert(user, "[units]u transferred") - return - if(istype(I, /obj/item/plunger)) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING + if(istype(tool, /obj/item/plunger)) balloon_alert(user, "plunging...") if(do_after(user, 1 SECONDS, target = src)) balloon_alert(user, "plunged") reagents.clear_reagents() - return - return ..() + return ITEM_INTERACT_SUCCESS + return NONE /obj/item/storage/organbox/suicide_act(mob/living/carbon/user) if(HAS_TRAIT(user, TRAIT_RESISTCOLD)) //if they're immune to cold, just do the box suicide diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 6e831c1167836..6cd43c5719027 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -273,22 +273,23 @@ new /obj/item/gun_maintenance_supplies(src) //floorbot assembly -/obj/item/storage/toolbox/attackby(obj/item/stack/tile/iron/T, mob/user, params) - var/list/allowed_toolbox = list(/obj/item/storage/toolbox/emergency, //which toolboxes can be made into floorbots - /obj/item/storage/toolbox/electrical, - /obj/item/storage/toolbox/mechanical, - /obj/item/storage/toolbox/artistic, - /obj/item/storage/toolbox/syndicate) - - if(!istype(T, /obj/item/stack/tile/iron)) - ..() - return +/obj/item/storage/toolbox/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) + if(!istype(inserted, /obj/item/stack/tile/iron)) + return TRUE + var/static/list/allowed_toolbox = list( + /obj/item/storage/toolbox/artistic, + /obj/item/storage/toolbox/electrical, + /obj/item/storage/toolbox/emergency, + /obj/item/storage/toolbox/mechanical, + /obj/item/storage/toolbox/syndicate, + ) + if(!is_type_in_list(src, allowed_toolbox) && (type != /obj/item/storage/toolbox)) - return + return TRUE if(contents.len >= 1) balloon_alert(user, "not empty!") - return - if(T.use(10)) + return FALSE + if(inserted.use(10)) var/obj/item/bot_assembly/floorbot/B = new B.toolbox = type switch(B.toolbox) @@ -306,9 +307,9 @@ B.update_appearance() B.balloon_alert(user, "tiles added") qdel(src) - else - balloon_alert(user, "needs 10 tiles!") - return + return FALSE + balloon_alert(user, "needs 10 tiles!") + return FALSE /obj/item/storage/toolbox/haunted name = "old toolbox" diff --git a/code/game/objects/items/syndie_spraycan.dm b/code/game/objects/items/syndie_spraycan.dm index 774219fa12229..1b7e0d9c4024a 100644 --- a/code/game/objects/items/syndie_spraycan.dm +++ b/code/game/objects/items/syndie_spraycan.dm @@ -19,28 +19,27 @@ /// Set to true if we finished drawing something, this spraycan is now useless var/expended = FALSE -/obj/item/traitor_spraycan/afterattack(atom/target, mob/user, proximity, params) - . = ..() +/obj/item/traitor_spraycan/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if (!check_allowed_items(interacting_with) || !isliving(user)) + return NONE + if (expended) user.balloon_alert(user, "all out of paint...") - return COMPONENT_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING if (drawing_rune) user.balloon_alert(user, "already busy!") - return COMPONENT_CANCEL_ATTACK_CHAIN - - . |= AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_BLOCKING - if (!proximity || !check_allowed_items(target) || !isliving(user)) - return + if (isturf(interacting_with)) + try_draw_new_rune(user, interacting_with) + return ITEM_INTERACT_SUCCESS - if (isturf(target)) - try_draw_new_rune(user, target) - return COMPONENT_CANCEL_ATTACK_CHAIN + if (istype(interacting_with, /obj/effect/decal/cleanable/traitor_rune)) + try_complete_rune(user, interacting_with) + return ITEM_INTERACT_SUCCESS - if (istype(target, /obj/effect/decal/cleanable/traitor_rune)) - try_complete_rune(user, target) - return COMPONENT_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING /** * Attempt to draw a rune on [target_turf]. diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index e90dd08d93810..4bfcd92c2dbf9 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -137,9 +137,9 @@ return INITIALIZE_HINT_QDEL reagents = loc.reagents //This mister is really just a proxy for the tank's reagents -/obj/item/reagent_containers/spray/mister/afterattack(obj/target, mob/user, proximity) +/obj/item/reagent_containers/spray/mister/try_spray(atom/target, mob/user) if(target.loc == loc) //Safety check so you don't fill your mister with mutagen or something and then blast yourself in the face with it - return + return FALSE return ..() //Janitor tank @@ -287,49 +287,53 @@ return return -/obj/item/extinguisher/mini/nozzle/afterattack(atom/target, mob/user) - if(AttemptRefill(target, user)) - return +/obj/item/extinguisher/mini/nozzle/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(AttemptRefill(interacting_with, user)) + return NONE if(nozzle_mode == EXTINGUISHER) return ..() - var/Adj = user.Adjacent(target) + + var/Adj = user.Adjacent(interacting_with) if(nozzle_mode == RESIN_LAUNCHER) if(Adj) - return //Safety check so you don't blast yourself trying to refill your tank + return ITEM_INTERACT_BLOCKING //Safety check so you don't blast yourself trying to refill your tank var/datum/reagents/R = reagents if(R.total_volume < 100) balloon_alert(user, "not enough water!") - return + return ITEM_INTERACT_BLOCKING if(!COOLDOWN_FINISHED(src, resin_cooldown)) balloon_alert(user, "still recharging!") - return + return ITEM_INTERACT_BLOCKING COOLDOWN_START(src, resin_cooldown, 10 SECONDS) R.remove_all(100) var/obj/effect/resin_container/resin = new (get_turf(src)) user.log_message("used Resin Launcher", LOG_GAME) playsound(src,'sound/items/syringeproj.ogg',40,TRUE) var/delay = 2 - var/datum/move_loop/loop = GLOB.move_manager.move_towards(resin, target, delay, timeout = delay * 5, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + var/datum/move_loop/loop = GLOB.move_manager.move_towards(resin, interacting_with, delay, timeout = delay * 5, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(resin_stop_check)) RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(resin_landed)) - return + return ITEM_INTERACT_SUCCESS if(nozzle_mode == RESIN_FOAM) - if(!Adj || !isturf(target)) + if(!Adj || !isturf(interacting_with)) balloon_alert(user, "too far!") - return - for(var/S in target) - if(istype(S, /obj/effect/particle_effect/fluid/foam/metal/resin) || istype(S, /obj/structure/foamedmetal/resin)) + return ITEM_INTERACT_BLOCKING + for(var/thing in interacting_with) + if(istype(thing, /obj/effect/particle_effect/fluid/foam/metal/resin) || istype(thing, /obj/structure/foamedmetal/resin)) balloon_alert(user, "already has resin!") - return + return ITEM_INTERACT_BLOCKING if(metal_synthesis_cooldown < 5) - var/obj/effect/particle_effect/fluid/foam/metal/resin/foam = new (get_turf(target)) + var/obj/effect/particle_effect/fluid/foam/metal/resin/foam = new (get_turf(interacting_with)) foam.group.target_size = 0 metal_synthesis_cooldown++ addtimer(CALLBACK(src, PROC_REF(reduce_metal_synth_cooldown)), 10 SECONDS) - else - balloon_alert(user, "still being synthesized!") - return + return ITEM_INTERACT_SUCCESS + + balloon_alert(user, "still being synthesized!") + return ITEM_INTERACT_BLOCKING + + return NONE /obj/item/extinguisher/mini/nozzle/proc/resin_stop_check(datum/move_loop/source, result) SIGNAL_HANDLER diff --git a/code/game/objects/items/taster.dm b/code/game/objects/items/taster.dm index eaa65967f9795..599b78971db11 100644 --- a/code/game/objects/items/taster.dm +++ b/code/game/objects/items/taster.dm @@ -8,17 +8,12 @@ var/taste_sensitivity = 15 -/obj/item/taster/afterattack(atom/O, mob/user, proximity) - . = ..() - if(!proximity) - return - - . |= AFTERATTACK_PROCESSED_ITEM - - if(!O.reagents) - to_chat(user, span_notice("[src] cannot taste [O], since [O.p_they()] [O.p_have()] have no reagents.")) - else if(O.reagents.total_volume == 0) - to_chat(user, "[src] cannot taste [O], since [O.p_they()] [O.p_are()] empty.") +/obj/item/taster/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!interacting_with.reagents) + to_chat(user, span_notice("[src] cannot taste [interacting_with], since [interacting_with.p_they()] [interacting_with.p_have()] have no reagents.")) + else if(interacting_with.reagents.total_volume == 0) + to_chat(user, span_notice("[src] cannot taste [interacting_with], since [interacting_with.p_they()] [interacting_with.p_are()] empty.")) else - var/message = O.reagents.generate_taste_message(user, taste_sensitivity) - to_chat(user, "[src] tastes [message] in [O].") + var/message = interacting_with.reagents.generate_taste_message(user, taste_sensitivity) + to_chat(user, span_notice("[src] tastes [message] in [interacting_with].")) + return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index b139283223370..ba77c260ff7dc 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -134,11 +134,6 @@ . = ..() active_portal_pairs = list() -/obj/item/hand_tele/pre_attack(atom/target, mob/user, params) - if(try_dispel_portal(target, user)) - return TRUE - return ..() - /obj/item/hand_tele/proc/try_dispel_portal(atom/target, mob/user) if(is_parent_of_portal(target)) qdel(target) @@ -147,11 +142,15 @@ return TRUE return FALSE -/obj/item/hand_tele/afterattack(atom/target, mob/user) - try_dispel_portal(target, user) - . = ..() +/obj/item/hand_tele/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(try_dispel_portal(interacting_with, user)) + return ITEM_INTERACT_SUCCESS + return NONE + +/obj/item/hand_tele/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) -/obj/item/hand_tele/pre_attack_secondary(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/hand_tele/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) var/portal_location = last_portal_location if (isweakref(portal_location)) @@ -160,12 +159,13 @@ if (isnull(portal_location)) to_chat(user, span_warning("[src] flashes briefly. No target is locked in.")) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING try_create_portal_to(user, portal_location) + return ITEM_INTERACT_SUCCESS - - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN +/obj/item/hand_tele/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom_secondary(interacting_with, user, modifiers) /obj/item/hand_tele/attack_self(mob/user) if (!can_teleport_notifies(user)) diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index 5f0404c342350..41edfaea37e88 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -293,16 +293,13 @@ inhand_icon_state = "supermatter_tongs[sliver ? "_loaded" : null]" return ..() -/obj/item/hemostat/supermatter/afterattack(atom/O, mob/user, proximity) - . = ..() +/obj/item/hemostat/supermatter/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!sliver) - return - if (!proximity) - return - . |= AFTERATTACK_PROCESSED_ITEM - if(ismovable(O) && O != sliver) - Consume(O, user) - return . + return NONE + if(ismovable(interacting_with) && interacting_with != sliver) + Consume(interacting_with, user) + return ITEM_INTERACT_SUCCESS + return NONE /obj/item/hemostat/supermatter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) // no instakill supermatter javelins if(sliver) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 3bdad581866e0..0e9b9743a4593 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -135,6 +135,11 @@ target.cut_overlay(sparks) /obj/item/weldingtool/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!status && interacting_with.is_refillable()) + reagents.trans_to(interacting_with, reagents.total_volume, transferred_by = user) + to_chat(user, span_notice("You empty [src]'s fuel tank into [interacting_with].")) + update_appearance() + return ITEM_INTERACT_SUCCESS if(!ishuman(interacting_with)) return NONE if(user.combat_mode) @@ -158,29 +163,18 @@ item_heal_robotic(attacked_humanoid, user, 15, 0) return ITEM_INTERACT_SUCCESS -/obj/item/weldingtool/afterattack(atom/attacked_atom, mob/user, proximity) - . = ..() - if(!proximity) +/obj/item/weldingtool/afterattack(atom/target, mob/user, click_parameters) + if(!isOn()) return - - if(isOn() && ismovable(attacked_atom)) - use(1) - var/turf/location = get_turf(user) - location.hotspot_expose(700, 50, 1) - . |= AFTERATTACK_PROCESSED_ITEM - if (!QDELETED(attacked_atom) && isliving(attacked_atom)) // can't ignite something that doesn't exist - var/mob/living/attacked_mob = attacked_atom - if(attacked_mob.ignite_mob()) - message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(attacked_mob)] on fire with [src] at [AREACOORD(user)]") - user.log_message("set [key_name(attacked_mob)] on fire with [src].", LOG_ATTACK) - - if(!status && attacked_atom.is_refillable()) - . |= AFTERATTACK_PROCESSED_ITEM - reagents.trans_to(attacked_atom, reagents.total_volume, transferred_by = user) - to_chat(user, span_notice("You empty [src]'s fuel tank into [attacked_atom].")) - update_appearance() - - return . + use(1) + var/turf/location = get_turf(user) + location.hotspot_expose(700, 50, 1) + if(QDELETED(target) || !isliving(target)) // can't ignite something that doesn't exist + return + var/mob/living/attacked_mob = target + if(attacked_mob.ignite_mob()) + message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(attacked_mob)] on fire with [src] at [AREACOORD(user)]") + user.log_message("set [key_name(attacked_mob)] on fire with [src].", LOG_ATTACK) /obj/item/weldingtool/attack_self(mob/user) if(src.reagents.has_reagent(/datum/reagent/toxin/plasma)) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index faf8862e1169d..1c82bffbf7c7e 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -51,21 +51,21 @@ /obj/item/toy/waterballoon/attack(mob/living/carbon/human/M, mob/user) return -/obj/item/toy/waterballoon/afterattack(atom/A as mob|obj, mob/user, proximity) - . = ..() - if(!proximity) - return - if (istype(A, /obj/structure/reagent_dispensers)) - var/obj/structure/reagent_dispensers/RD = A - if(RD.reagents.total_volume <= 0) - to_chat(user, span_warning("[RD] is empty.")) - else if(reagents.total_volume >= 10) - to_chat(user, span_warning("[src] is full.")) - else - A.reagents.trans_to(src, 10, transferred_by = user) - to_chat(user, span_notice("You fill the balloon with the contents of [A].")) - desc = "A translucent balloon with some form of liquid sloshing around in it." - update_appearance() +/obj/item/toy/waterballoon/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if (!istype(interacting_with, /obj/structure/reagent_dispensers)) + return NONE + var/obj/structure/reagent_dispensers/RD = interacting_with + if(RD.reagents.total_volume <= 0) + to_chat(user, span_warning("[RD] is empty.")) + else if(reagents.total_volume >= 10) + to_chat(user, span_warning("[src] is full.")) + else + interacting_with.reagents.trans_to(src, 10, transferred_by = user) + to_chat(user, span_notice("You fill the balloon with the contents of [interacting_with].")) + desc = "A translucent balloon with some form of liquid sloshing around in it." + update_appearance() + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING /obj/item/toy/waterballoon/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/cup)) @@ -524,23 +524,21 @@ else return ..() -/obj/item/toy/gun/afterattack(atom/target as mob|obj|turf|area, mob/user, flag) - . = ..() - if (flag) - return - if (!ISADVANCEDTOOLUSER(user)) +/obj/item/toy/gun/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!ISADVANCEDTOOLUSER(user)) to_chat(user, span_warning("You don't have the dexterity to do this!")) - return + return ITEM_INTERACT_BLOCKING src.add_fingerprint(user) if (src.bullets < 1) user.show_message(span_warning("*click*"), MSG_AUDIBLE) playsound(src, 'sound/weapons/gun/revolver/dry_fire.ogg', 30, TRUE) - return + return ITEM_INTERACT_SUCCESS playsound(user, 'sound/weapons/gun/revolver/shot.ogg', 100, TRUE) src.bullets-- - user.visible_message(span_danger("[user] fires [src] at [target]!"), \ - span_danger("You fire [src] at [target]!"), \ + user.visible_message(span_danger("[user] fires [src] at [interacting_with]!"), \ + span_danger("You fire [src] at [interacting_with]!"), \ span_hear("You hear a gunshot!")) + return ITEM_INTERACT_SUCCESS /obj/item/toy/ammo/gun name = "capgun ammo" @@ -1055,11 +1053,9 @@ throwforce = 20 //the same damage as a disabler shot damtype = STAMINA //maybe someday we can add stuffing rocks (or perhaps ore?) into snowballs to make them deal brute damage -/obj/item/toy/snowball/afterattack(atom/target as mob|obj|turf|area, mob/user) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM - if(user.dropItemToGround(src)) - throw_at(target, throw_range, throw_speed) +/obj/item/toy/snowball/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + user.throw_item(interacting_with) + return ITEM_INTERACT_SUCCESS /obj/item/toy/snowball/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) diff --git a/code/game/objects/items/v8_engine.dm b/code/game/objects/items/v8_engine.dm index c3e5f31146184..c75f1ebc13af5 100644 --- a/code/game/objects/items/v8_engine.dm +++ b/code/game/objects/items/v8_engine.dm @@ -70,34 +70,33 @@ AddComponent(/datum/component/two_handed, force_unwielded = 12, force_wielded = 22, attacksound = active_hitsound) RegisterSignals(src, list(COMSIG_ITEM_DROPPED, COMSIG_MOVABLE_PRE_THROW, COMSIG_ITEM_ATTACK_SELF), PROC_REF(reset_charges)) -/obj/item/house_edge/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() +/obj/item/house_edge/afterattack(atom/target, mob/user, click_parameters) if(!ismob(target)) return if(HAS_TRAIT(src, TRAIT_WIELDED)) //Add a fire charge to a max of 3, updates icon_state. fire_charges = clamp((fire_charges + 1), HOUSE_EDGE_ICONS_MIN, HOUSE_EDGE_ICONS_MAX) - icon_state = "house_edge[fire_charges]" COOLDOWN_RESET(src, fire_charge_cooldown) else //Lose a fire charge to a min of 0, updates icon_state. fire_charges = clamp((fire_charges - 1), HOUSE_EDGE_ICONS_MIN, HOUSE_EDGE_ICONS_MAX) - icon_state = "house_edge[fire_charges]" do_sparks(number = 0, cardinal_only = TRUE, source = src) + update_appearance(UPDATE_ICON_STATE) -/obj/item/house_edge/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/house_edge/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) if(!COOLDOWN_FINISHED(src, fire_charge_cooldown)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING if(fire_charges <= 0) balloon_alert(user, "no fire charges!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - user.throw_at(target = get_turf(target), range = 2 * fire_charges, speed = 5, thrower = user, spin = FALSE, gentle = FALSE, quickstart = TRUE) + return ITEM_INTERACT_BLOCKING + user.throw_at(target = get_turf(interacting_with), range = 2 * fire_charges, speed = 5, thrower = user, spin = FALSE, gentle = FALSE, quickstart = TRUE) COOLDOWN_START(src, fire_charge_cooldown, DASH_COOLDOWN) reset_charges(on_dash = TRUE) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_SUCCESS /obj/item/house_edge/update_icon_state() inhand_icon_state = HAS_TRAIT(src, TRAIT_WIELDED) ? "house_edge1" : "house_edge0" + icon_state = "house_edge[fire_charges]" return ..() /obj/item/house_edge/proc/reset_charges(on_dash = FALSE) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index bb87ab7fd8454..3eea2400aa24f 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -951,15 +951,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 )) -/obj/item/melee/flyswatter/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(!proximity_flag || HAS_TRAIT(user, TRAIT_PACIFISM)) - return - +/obj/item/melee/flyswatter/afterattack(atom/target, mob/user, click_parameters) if(is_type_in_typecache(target, splattable)) - new /obj/effect/decal/cleanable/insectguts(target.drop_location()) to_chat(user, span_warning("You easily splat [target].")) if(isliving(target)) + new /obj/effect/decal/cleanable/insectguts(target.drop_location()) var/mob/living/bug = target bug.investigate_log("has been splatted by a flyswatter.", INVESTIGATE_DEATHS) bug.gib(DROP_ALL_REMAINS) @@ -1089,24 +1085,18 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(prob(final_block_chance * (HAS_TRAIT(src, TRAIT_WIELDED) ? 2 : 1))) owner.visible_message(span_danger("[owner] parries [attack_text] with [src]!")) return TRUE + return FALSE -/obj/item/highfrequencyblade/attack(mob/living/target, mob/living/user, params) - if(!HAS_TRAIT(src, TRAIT_WIELDED) || HAS_TRAIT(src, TRAIT_PACIFISM)) - return ..() - slash(target, user, params) - -/obj/item/highfrequencyblade/attack_atom(atom/target, mob/living/user, params) - if(HAS_TRAIT(src, TRAIT_WIELDED)) - return - return ..() - -/obj/item/highfrequencyblade/afterattack(atom/target, mob/user, proximity_flag, params) +/obj/item/highfrequencyblade/pre_attack(atom/A, mob/living/user, params) + . = ..() + if(.) + return . if(!HAS_TRAIT(src, TRAIT_WIELDED)) - return ..() - if(!proximity_flag || !(isclosedturf(target) || isitem(target) || ismachinery(target) || isstructure(target) || isvehicle(target))) - return - slash(target, user, params) - return AFTERATTACK_PROCESSED_ITEM + return . // Default attack + if(isliving(A) && HAS_TRAIT(src, TRAIT_PACIFISM)) + return . // Default attack (ultimately nothing) + + return slash(A, user, params) /// triggered on wield of two handed item /obj/item/highfrequencyblade/proc/on_wield(obj/item/source, mob/user) @@ -1141,14 +1131,19 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 living_target.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) living_target.gib(DROP_ALL_REMAINS) log_combat(user, living_target, "gibbed", src) + return TRUE else if(target.uses_integrity) target.take_damage(force*damage_mod*3, BRUTE, MELEE, FALSE, null, 50) + return TRUE else if(iswallturf(target) && prob(force*damage_mod*0.5)) var/turf/closed/wall/wall_target = target wall_target.dismantle_wall() + return TRUE else if(ismineralturf(target) && prob(force*damage_mod)) var/turf/closed/mineral/mineral_target = target mineral_target.gets_drilled() + return TRUE + return FALSE /obj/effect/temp_visual/slash icon_state = "highfreq_slash" diff --git a/code/game/objects/items/wizard_weapons.dm b/code/game/objects/items/wizard_weapons.dm index 8c2677d3ee35b..34676e18bf02d 100644 --- a/code/game/objects/items/wizard_weapons.dm +++ b/code/game/objects/items/wizard_weapons.dm @@ -39,9 +39,6 @@ icon_state = "[base_icon_state]0" return ..() -/obj/item/singularityhammer/proc/recharge() - charged = TRUE - /obj/item/singularityhammer/proc/vortex(turf/pull, mob/wielder) for(var/atom/X in orange(5,pull)) if(ismovable(X)) @@ -59,22 +56,19 @@ step_towards(A,pull) step_towards(A,pull) -/obj/item/singularityhammer/afterattack(atom/A as mob|obj|turf|area, mob/living/user, proximity) - . = ..() - if(!proximity) +/obj/item/singularityhammer/afterattack(atom/target, mob/user, click_parameters) + if(!HAS_TRAIT(src, TRAIT_WIELDED)) return - . |= AFTERATTACK_PROCESSED_ITEM - if(HAS_TRAIT(src, TRAIT_WIELDED)) - if(charged) - charged = FALSE - if(isliving(A)) - var/mob/living/Z = A - Z.take_bodypart_damage(20,0) - playsound(user, 'sound/weapons/marauder.ogg', 50, TRUE) - var/turf/target = get_turf(A) - vortex(target,user) - addtimer(CALLBACK(src, PROC_REF(recharge)), 10 SECONDS) - return . + if(!charged) + return + + charged = FALSE + if(isliving(target)) + var/mob/living/smacked = target + smacked.take_bodypart_damage(20, 0) + playsound(user, 'sound/weapons/marauder.ogg', 50, TRUE) + vortex(get_turf(target), user) + addtimer(VARSET_CALLBACK(src, charged, TRUE), 10 SECONDS) /obj/item/mjollnir name = "Mjollnir" diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 4e86db314279b..fbf6a55e2073c 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -368,17 +368,15 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) return TRUE return FALSE -/obj/item/chair/afterattack(atom/target, mob/living/carbon/user, proximity) - . = ..() - if(!proximity) +/obj/item/chair/afterattack(atom/target, mob/user, click_parameters) + if(!prob(break_chance)) return - if(prob(break_chance)) - user.visible_message(span_danger("[user] smashes \the [src] to pieces against \the [target]")) - if(iscarbon(target)) - var/mob/living/carbon/C = target - if(C.health < C.maxHealth*0.5) - C.Paralyze(20) - smash(user) + user.visible_message(span_danger("[user] smashes [src] to pieces against [target]")) + if(iscarbon(target)) + var/mob/living/carbon/C = target + if(C.health < C.maxHealth*0.5) + C.Paralyze(20) + smash(user) /obj/item/chair/greyscale material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 9aef99482a0b1..61b5d104e55a4 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -993,7 +993,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) // tk grab then use on self /obj/structure/closet/attack_self_tk(mob/user) if(attack_hand(user)) - return COMPONENT_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING /obj/structure/closet/verb/verb_toggleopen() set src in view(1) diff --git a/code/game/objects/structures/deployable_turret.dm b/code/game/objects/structures/deployable_turret.dm index b2bb5fe51c595..f24df392dedef 100644 --- a/code/game/objects/structures/deployable_turret.dm +++ b/code/game/objects/structures/deployable_turret.dm @@ -259,11 +259,11 @@ M.attacked_by(src, user) add_fingerprint(user) -/obj/item/gun_control/afterattack(atom/targeted_atom, mob/user, flag, params) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM - var/modifiers = params2list(params) +/obj/item/gun_control/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) var/obj/machinery/deployable_turret/E = user.buckled - E.calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(user, targeted_atom, modifiers) - E.direction_track(user, targeted_atom) - E.checkfire(targeted_atom, user) + E.calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(user, interacting_with, modifiers) + E.direction_track(user, interacting_with) + E.checkfire(interacting_with, user) + +/obj/item/gun_control/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) diff --git a/code/game/objects/structures/plaques/_plaques.dm b/code/game/objects/structures/plaques/_plaques.dm index 4a1684434dcca..1277869dbf67f 100644 --- a/code/game/objects/structures/plaques/_plaques.dm +++ b/code/game/objects/structures/plaques/_plaques.dm @@ -185,11 +185,10 @@ return return ..() -/obj/item/plaque/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!iswallturf(target) || !proximity) - return - var/turf/target_turf = target +/obj/item/plaque/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!iswallturf(interacting_with)) + return NONE + var/turf/target_turf = interacting_with var/turf/user_turf = get_turf(user) var/obj/structure/plaque/placed_plaque = new plaque_path(user_turf) //We place the plaque on the turf the user is standing, and pixel shift it to the target wall, as below. //This is to mimic how signs and other wall objects are usually placed by mappers, and so they're only visible from one side of a wall. @@ -213,3 +212,4 @@ placed_plaque.update_integrity(get_integrity()) placed_plaque.setDir(dir) qdel(src) + return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index b8709334c37f6..eefbe49ef3229 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -209,11 +209,10 @@ return return ..() -/obj/item/sign/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!iswallturf(target) || !proximity) - return - var/turf/target_turf = target +/obj/item/sign/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!iswallturf(interacting_with)) + return NONE + var/turf/target_turf = interacting_with var/turf/user_turf = get_turf(user) var/obj/structure/sign/placed_sign = new sign_path(user_turf) //We place the sign on the turf the user is standing, and pixel shift it to the target wall, as below. //This is to mimic how signs and other wall objects are usually placed by mappers, and so they're only visible from one side of a wall. @@ -233,6 +232,7 @@ placed_sign.setDir(dir) placed_sign.find_and_hang_on_wall(TRUE, placed_sign.knock_down_callback) qdel(src) + return ITEM_INTERACT_SUCCESS /obj/item/sign/welder_act(mob/living/user, obj/item/I) . = ..() diff --git a/code/game/objects/structures/training_machine.dm b/code/game/objects/structures/training_machine.dm index c2f4d3a18ae1b..bed4c4805cca6 100644 --- a/code/game/objects/structures/training_machine.dm +++ b/code/game/objects/structures/training_machine.dm @@ -360,12 +360,17 @@ ///Number of hits made since the Lap button (alt-click) was last pushed var/lap_hits = 0 -/obj/item/training_toolbox/afterattack(atom/target, mob/living/user, proximity) +/obj/item/training_toolbox/pre_attack(atom/A, mob/living/user, params) . = ..() - if (!proximity || target == user || !user.combat_mode) - return - if (check_hit(target)) - user.changeNext_move(CLICK_CD_MELEE) + if(.) + return . + if(A == user || !user.combat_mode) + return . + if(!check_hit(A)) + return . + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(A) + return TRUE /** * Check if we should increment the hit counter diff --git a/code/game/objects/structures/water_structures/sink.dm b/code/game/objects/structures/water_structures/sink.dm index f4c9d5a28f445..24cb2e806965f 100644 --- a/code/game/objects/structures/water_structures/sink.dm +++ b/code/game/objects/structures/water_structures/sink.dm @@ -250,6 +250,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14)) MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/kitchen, (-16)) +/obj/structure/sink/gasstation + name = "plasma fuel station" + desc = "A place to refuel vehicles with liquid plasma. It can also dispense into a container." + icon_state = "sink_gasstation" + dispensedreagent = /datum/reagent/toxin/plasma + has_water_reclaimer = FALSE + /obj/structure/sink/greyscale icon_state = "sink_greyscale" material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm index f8464a8ce4ef6..7c4428c4823ec 100644 --- a/code/game/turfs/open/floor/misc_floor.dm +++ b/code/game/turfs/open/floor/misc_floor.dm @@ -327,3 +327,12 @@ /turf/open/floor/iron/tgmcemblem/center icon_state = "tgmc_center" + +/turf/open/floor/asphalt + name = "asphalt" + desc = "Melted down oil can, in some cases, be used to pave road surfaces." + icon_state = "asphalt" + +/turf/open/floor/asphalt/lavaland + initial_gas_mix = LAVALAND_DEFAULT_ATMOS + baseturfs = /turf/open/misc/asteroid/basalt diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 91481bb9a3e6b..436e484cb430e 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -209,7 +209,11 @@ ADMIN_VERB(create_mapping_job_icons, R_DEBUG, "Generate job landmarks icons", "G for(var/obj/item/I in D) qdel(I) randomize_human(D) - D.dress_up_as_job(JB, TRUE) + D.dress_up_as_job( + equipping = JB, + visual_only = TRUE, + consistent = TRUE, + ) var/icon/I = icon(getFlatIcon(D), frame = 1) final.Insert(I, JB.title) qdel(D) diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm index 2fb5d52604531..d3f162f5fb55a 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm @@ -63,14 +63,8 @@ return ITEM_INTERACT_SUCCESS -/obj/item/abductor/gizmo/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - // Proximity is already handled via the interact_with_atom proc - if(proximity_flag) - return - - . |= AFTERATTACK_PROCESSED_ITEM - interact_with_atom(target, user) +/obj/item/abductor/gizmo/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) /obj/item/abductor/gizmo/proc/scan(atom/target, mob/living/user) if(ishuman(target)) @@ -117,14 +111,8 @@ radio_off(interacting_with, user) return ITEM_INTERACT_SUCCESS -/obj/item/abductor/silencer/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - // Proximity is already handled via the interact_with_atom proc - if(proximity_flag) - return - - . |= AFTERATTACK_PROCESSED_ITEM - interact_with_atom(target, user) +/obj/item/abductor/silencer/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) /obj/item/abductor/silencer/proc/radio_off(atom/target, mob/living/user) if( !(user in (viewers(7,target))) ) @@ -167,17 +155,19 @@ icon_state = "mind_device_message" to_chat(user, span_notice("You switch the device to [mode == MIND_DEVICE_MESSAGE? "TRANSMISSION": "COMMAND"] MODE")) -/obj/item/abductor/mind_device/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/abductor/mind_device/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) + +/obj/item/abductor/mind_device/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!ScientistCheck(user)) - return + return ITEM_INTERACT_BLOCKING switch(mode) if(MIND_DEVICE_CONTROL) - mind_control(target, user) + mind_control(interacting_with, user) if(MIND_DEVICE_MESSAGE) - mind_message(target, user) + mind_message(interacting_with, user) + return ITEM_INTERACT_SUCCESS /obj/item/abductor/mind_device/proc/mind_control(atom/target, mob/living/user) if(iscarbon(target)) diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index f8e679352bf78..8d1068baa1368 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -260,10 +260,6 @@ */ /datum/antagonist/changeling/proc/on_life(datum/source, seconds_per_tick, times_fired) SIGNAL_HANDLER - if(isliving(owner.current)) - var/mob/living/living_owner = owner.current - if(living_owner.fire_stacks && living_owner.on_fire) - return // No chemical regen while on fire. var/delta_time = DELTA_WORLD_TIME(SSmobs) diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm index d5152772e51c5..23b4f9548c424 100644 --- a/code/modules/antagonists/changeling/changeling_power.dm +++ b/code/modules/antagonists/changeling/changeling_power.dm @@ -81,10 +81,6 @@ the same goes for Remove(). if you override Remove(), call parent or else your p /datum/action/changeling/proc/can_sting(mob/living/user, mob/living/target) if(!can_be_used_by(user)) return FALSE - if(user.fire_stacks && user.on_fire) - user.balloon_alert(user, "on fire!") - to_chat(user, span_boldwarning("WE CANNOT DO THIS WHILE ENGULFED IN FLAMES!!! PUT OUT THE FIRE FIRST!!!")) - return FALSE var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(changeling.chem_charges < chemical_cost) user.balloon_alert(user, "needs [chemical_cost] chemicals!") diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 167c1c697cdc2..1c4fa8c501cd0 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -173,24 +173,15 @@ \***************************************/ /datum/action/changeling/weapon/arm_blade name = "Arm Blade" - desc = "We reform one of our arms into a deadly blade that breaks after a number of hits, improvable by absorbing genomes. Costs 40 chemicals." - helptext = "We may retract our armblade in the same manner as we form it. Organic tissue is not perfect; the armblade will break after it is used too much. The more genomes we absorb, the stronger it is. Cannot be used while in lesser form." + desc = "We reform one of our arms into a deadly blade. Costs 20 chemicals." + helptext = "We may retract our armblade in the same manner as we form it. Cannot be used while in lesser form." button_icon_state = "armblade" - chemical_cost = 30 - dna_cost = 3 + chemical_cost = 20 + dna_cost = 2 req_human = TRUE weapon_type = /obj/item/melee/arm_blade weapon_name_simple = "blade" -/datum/action/changeling/weapon/arm_blade/sting_action(mob/living/carbon/user) - var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) //So we can read the absorbed_count. - if(!changeling) - return - - var/obj/item/melee/arm_blade/blade = ..() - blade.remaining_uses = round(changeling.absorbed_count * 3) - return TRUE - /obj/item/melee/arm_blade name = "arm blade" desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter." @@ -212,10 +203,8 @@ wound_bonus = 10 bare_wound_bonus = 10 armour_penetration = 35 - resistance_flags = FLAMMABLE var/can_drop = FALSE var/fake = FALSE - var/remaining_uses /obj/item/melee/arm_blade/Initialize(mapload,silent,synthetic) . = ..() @@ -229,17 +218,13 @@ effectiveness = 80, \ ) -/obj/item/melee/arm_blade/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity) - return +/obj/item/melee/arm_blade/afterattack(atom/target, mob/user, click_parameters) if(istype(target, /obj/structure/table)) - var/obj/structure/table/T = target - T.deconstruct(FALSE) + var/obj/smash = target + smash.deconstruct(FALSE) else if(istype(target, /obj/machinery/computer)) - var/obj/machinery/computer/C = target - C.attack_alien(user) //muh copypasta + target.attack_alien(user) //muh copypasta else if(istype(target, /obj/machinery/door/airlock)) var/obj/machinery/door/airlock/opening = target @@ -261,15 +246,6 @@ span_hear("You hear a metal screeching sound.")) opening.open(BYPASS_DOOR_CHECKS) - if(remaining_uses <= 1) - if(ishuman(loc)) - var/mob/living/carbon/human/changeling = loc - changeling.visible_message(span_warning("With a sickening crunch, [changeling] reforms [changeling.p_their()] [src] into an arm!"), span_notice("We assimilate our armblade into our body."), "You hear organic matter ripping and tearing!") - qdel(src) - else - remaining_uses-- - - /obj/item/melee/arm_blade/dropped(mob/user) ..() if(can_drop) @@ -317,7 +293,6 @@ throw_range = 0 throw_speed = 0 can_hold_up = FALSE - resistance_flags = FLAMMABLE /obj/item/gun/magic/tentacle/Initialize(mapload, silent) . = ..() @@ -514,9 +489,6 @@ S.remaining_uses = round(changeling.absorbed_count * 3) return TRUE -/datum/armor/item_shield/changeling - fire = -100 - /obj/item/shield/changeling name = "shield-like mass" desc = "A mass of tough, boney tissue. You can still see the fingers as a twisted pattern in the shield." @@ -526,8 +498,6 @@ lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' block_chance = 50 - armor_type = /datum/armor/item_shield/changeling - resistance_flags = FLAMMABLE var/remaining_uses //Set by the changeling ability. @@ -538,7 +508,7 @@ loc.visible_message(span_warning("The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!"), span_warning("We inflate our hand into a strong shield."), span_hear("You hear organic matter ripping and tearing!")) /obj/item/shield/changeling/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) - if(remaining_uses <= 1) + if(remaining_uses < 1) if(ishuman(loc)) var/mob/living/carbon/human/H = loc H.visible_message(span_warning("With a sickening crunch, [H] reforms [H.p_their()] shield into an arm!"), span_notice("We assimilate our shield into our body"), "You hear a sharp crack.") - dest.visible_message(span_warning("There is a boom of outrushing air as something appears above the rune!"), null, "You hear a boom.") - ..() + if(!length(potential_runes)) + to_chat(user, span_warning("There are no valid runes to teleport to!")) + return + var/turf/T = get_turf(src) + if(is_away_level(T.z)) + to_chat(user, span_cult_italic("You are not in the right dimension!")) + return + var/input_rune_key = tgui_input_list(user, "Rune to teleport to", "Teleportation Target", potential_runes) //we know what key they picked + if(isnull(input_rune_key)) + return + if(isnull(potential_runes[input_rune_key])) + to_chat(user, span_warning("You must pick a valid rune!")) + return + var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to? + if(QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated() || !actual_selected_rune) + return + var/turf/dest = get_turf(actual_selected_rune) + if(dest.is_blocked_turf(TRUE)) + to_chat(user, span_warning("The target rune is blocked. You cannot teleport there.")) + return + uses-- + var/turf/origin = get_turf(user) + if(do_teleport(target, dest, channel = TELEPORT_CHANNEL_CULT)) + origin.visible_message( + span_warning("Dust flows from [user]'s hand, and [user.p_they()] disappear[user.p_s()] with a sharp crack!"), + span_cult_italic("You speak the words of the talisman and find yourself somewhere else!"), + span_hear("You hear a sharp crack."), + ) + dest.visible_message( + span_warning("There is a boom of outrushing air as something appears above the rune!"), + null, + span_hear("You hear a boom."), + ) + return ..() //Shackles /obj/item/melee/blood_magic/shackles @@ -503,15 +515,17 @@ invocation = "In'totum Lig'abis!" color = COLOR_BLACK // black -/obj/item/melee/blood_magic/shackles/afterattack(atom/target, mob/living/carbon/user, proximity) - if(IS_CULTIST(user) && iscarbon(target) && proximity) - var/mob/living/carbon/C = target - if(C.canBeHandcuffed()) - CuffAttack(C, user) - else - user.visible_message(span_cult_italic("This victim doesn't have enough arms to complete the restraint!")) - return - ..() +/obj/item/melee/blood_magic/shackles/cast_spell(atom/target, mob/living/carbon/user) + if(!iscarbon(target)) + return + var/mob/living/carbon/C = target + if(IS_CULTIST(C)) + return + if(!C.canBeHandcuffed()) + user.visible_message(span_cult_italic("This victim doesn't have enough arms to complete the restraint!")) + return + CuffAttack(C, user) + return ..() /obj/item/melee/blood_magic/shackles/proc/CuffAttack(mob/living/carbon/C, mob/living/user) if(!C.handcuffed) @@ -564,90 +578,95 @@ Purified soulstones (and any shades inside) into cultist soulstones\n Airlocks into brittle runed airlocks after a delay (harm intent)"} -/obj/item/melee/blood_magic/construction/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(proximity_flag && IS_CULTIST(user)) - if(channeling) - to_chat(user, span_cult_italic("You are already invoking twisted construction!")) +/obj/item/melee/blood_magic/construction/cast_spell(atom/target, mob/living/carbon/user) + if(channeling) + to_chat(user, span_cult_italic("You are already invoking twisted construction!")) + return + + var/turf/T = get_turf(target) + if(istype(target, /obj/item/stack/sheet/iron)) + var/obj/item/stack/sheet/candidate = target + if(!candidate.use(IRON_TO_CONSTRUCT_SHELL_CONVERSION)) + to_chat(user, span_warning("You need [IRON_TO_CONSTRUCT_SHELL_CONVERSION] iron to produce a construct shell!")) return - . |= AFTERATTACK_PROCESSED_ITEM - var/turf/T = get_turf(target) - if(istype(target, /obj/item/stack/sheet/iron)) - var/obj/item/stack/sheet/candidate = target - if(candidate.use(IRON_TO_CONSTRUCT_SHELL_CONVERSION)) - uses-- - to_chat(user, span_warning("A dark cloud emanates from your hand and swirls around the iron, twisting it into a construct shell!")) - new /obj/structure/constructshell(T) - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - else - to_chat(user, span_warning("You need [IRON_TO_CONSTRUCT_SHELL_CONVERSION] iron to produce a construct shell!")) - return - else if(istype(target, /obj/item/stack/sheet/plasteel)) - var/obj/item/stack/sheet/plasteel/candidate = target - var/quantity = candidate.amount - if(candidate.use(quantity)) - uses -- - new /obj/item/stack/sheet/runed_metal(T,quantity) - to_chat(user, span_warning("A dark cloud emanates from you hand and swirls around the plasteel, transforming it into runed metal!")) - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - else if(istype(target,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/candidate = target - if(candidate.mmi || candidate.shell) - channeling = TRUE - user.visible_message(span_danger("A dark cloud emanates from [user]'s hand and swirls around [candidate]!")) - playsound(T, 'sound/machines/airlock_alien_prying.ogg', 80, TRUE) - var/prev_color = candidate.color - candidate.color = "black" - if(do_after(user, 9 SECONDS, target = candidate)) - candidate.undeploy() - candidate.emp_act(EMP_HEAVY) - var/construct_class = show_radial_menu(user, src, GLOB.construct_radial_images, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) - if(!check_menu(user)) - return - if(QDELETED(candidate)) - channeling = FALSE - return - candidate.grab_ghost() - user.visible_message(span_danger("The dark cloud recedes from what was formerly [candidate], revealing a\n [construct_class]!")) - make_new_construct_from_class(construct_class, THEME_CULT, candidate, user, FALSE, T) - uses-- - qdel(candidate) - channeling = FALSE - else - channeling = FALSE - candidate.color = prev_color - return - else - uses-- - to_chat(user, span_warning("A dark cloud emanates from you hand and swirls around [candidate] - twisting it into a construct shell!")) - new /obj/structure/constructshell(T) - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - qdel(candidate) - else if(istype(target,/obj/machinery/door/airlock)) + uses-- + to_chat(user, span_warning("A dark cloud emanates from your hand and swirls around the iron, twisting it into a construct shell!")) + new /obj/structure/constructshell(T) + SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) + return ..() + + if(istype(target, /obj/item/stack/sheet/plasteel)) + var/obj/item/stack/sheet/plasteel/candidate = target + var/quantity = candidate.amount + if(!candidate.use(quantity)) + return + + uses-- + new /obj/item/stack/sheet/runed_metal(T,quantity) + to_chat(user, span_warning("A dark cloud emanates from you hand and swirls around the plasteel, transforming it into runed metal!")) + SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) + return ..() + + if(istype(target,/mob/living/silicon/robot)) + var/mob/living/silicon/robot/candidate = target + if(candidate.mmi || candidate.shell) channeling = TRUE - playsound(T, 'sound/machines/airlockforced.ogg', 50, TRUE) - do_sparks(5, TRUE, target) - if(do_after(user, 5 SECONDS, target = user)) - if(QDELETED(target)) - channeling = FALSE - return - target.narsie_act() - uses-- - user.visible_message(span_warning("Black ribbons suddenly emanate from [user]'s hand and cling to the airlock - twisting and corrupting it!")) - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) + user.visible_message(span_danger("A dark cloud emanates from [user]'s hand and swirls around [candidate]!")) + playsound(T, 'sound/machines/airlock_alien_prying.ogg', 80, TRUE) + var/prev_color = candidate.color + candidate.color = "black" + if(!do_after(user, 9 SECONDS, target = candidate)) channeling = FALSE - else + candidate.color = prev_color + return + candidate.undeploy() + candidate.emp_act(EMP_HEAVY) + var/construct_class = show_radial_menu(user, src, GLOB.construct_radial_images, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) + if(!check_menu(user) || QDELETED(candidate)) channeling = FALSE + candidate.color = prev_color return - else if(istype(target,/obj/item/soulstone)) - var/obj/item/soulstone/candidate = target - if(candidate.corrupt()) - uses-- - to_chat(user, span_warning("You corrupt [candidate]!")) - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - else - to_chat(user, span_warning("The spell will not work on [target]!")) + candidate.grab_ghost() + user.visible_message(span_danger("The dark cloud recedes from what was formerly [candidate], revealing a\n [construct_class]!")) + make_new_construct_from_class(construct_class, THEME_CULT, candidate, user, FALSE, T) + uses-- + qdel(candidate) + channeling = FALSE + return ..() + + uses-- + to_chat(user, span_warning("A dark cloud emanates from you hand and swirls around [candidate] - twisting it into a construct shell!")) + new /obj/structure/constructshell(T) + SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) + qdel(candidate) + return ..() + + if(istype(target,/obj/machinery/door/airlock)) + channeling = TRUE + playsound(T, 'sound/machines/airlockforced.ogg', 50, TRUE) + do_sparks(5, TRUE, target) + if(!do_after(user, 5 SECONDS, target = user) && !QDELETED(target)) + channeling = FALSE return - return . | ..() + + target.narsie_act() + uses-- + user.visible_message(span_warning("Black ribbons suddenly emanate from [user]'s hand and cling to the airlock - twisting and corrupting it!")) + SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) + channeling = FALSE + return ..() + + if(istype(target,/obj/item/soulstone)) + var/obj/item/soulstone/candidate = target + if(!candidate.corrupt()) + return + + uses-- + to_chat(user, span_warning("You corrupt [candidate]!")) + SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) + return ..() + + to_chat(user, span_warning("The spell will not work on [target]!")) /obj/item/melee/blood_magic/construction/proc/check_menu(mob/user) if(!istype(user)) @@ -663,21 +682,21 @@ desc = "Will equip cult combat gear onto a cultist on contact." color = "#33cc33" // green -/obj/item/melee/blood_magic/armor/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/blood_magic/armor/cast_spell(mob/living/target, mob/living/carbon/user) + if(!iscarbon(target) || !IS_CULTIST(target)) + return + uses-- var/mob/living/carbon/carbon_target = target - if(istype(carbon_target) && IS_CULTIST(carbon_target) && proximity) - uses-- - var/mob/living/carbon/C = target - C.visible_message(span_warning("Otherworldly armor suddenly appears on [C]!")) - C.equip_to_slot_or_del(new /obj/item/clothing/under/color/black,ITEM_SLOT_ICLOTHING) - C.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/cultrobes/alt(user), ITEM_SLOT_OCLOTHING) - C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), ITEM_SLOT_FEET) - C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), ITEM_SLOT_BACK) - if(C == user) - qdel(src) //Clears the hands - C.put_in_hands(new /obj/item/melee/cultblade/dagger(user)) - C.put_in_hands(new /obj/item/restraints/legcuffs/bola/cult(user)) - ..() + carbon_target.visible_message(span_warning("Otherworldly armor suddenly appears on [carbon_target]!")) + carbon_target.equip_to_slot_or_del(new /obj/item/clothing/under/color/black,ITEM_SLOT_ICLOTHING) + carbon_target.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/cultrobes/alt(user), ITEM_SLOT_OCLOTHING) + carbon_target.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), ITEM_SLOT_FEET) + carbon_target.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), ITEM_SLOT_BACK) + if(carbon_target == user) + qdel(src) //Clears the hands + carbon_target.put_in_hands(new /obj/item/melee/cultblade/dagger(user)) + carbon_target.put_in_hands(new /obj/item/restraints/legcuffs/bola/cult(user)) + return ..() /obj/item/melee/blood_magic/manipulator name = "Blood Rite Aura" @@ -698,10 +717,7 @@ * * '/obj/item/melee/blood_magic/manipulator/proc/blood_draw' handles blood pools/trails and does not affect parent proc */ -/obj/item/melee/blood_magic/manipulator/afterattack(atom/target, mob/living/carbon/human/user, proximity) - if(!proximity) - return - +/obj/item/melee/blood_magic/manipulator/cast_spell(mob/living/target, mob/living/carbon/user) if((isconstruct(target) || isshade(target)) && !heal_construct(target, user)) return if(istype(target, /obj/effect/decal/cleanable/blood) || istype(target, /obj/effect/decal/cleanable/trail_holder) || isturf(target)) @@ -714,12 +730,11 @@ if(human_bloodbag.stat == DEAD) human_bloodbag.balloon_alert(user, "dead!") return - if(IS_CULTIST(human_bloodbag) && !heal_cultist(human_bloodbag, user)) return if(!IS_CULTIST(human_bloodbag) && !drain_victim(human_bloodbag, user)) return - ..() + return ..() /** * handles blood rites usage on constructs diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index cd77799419c6d..8ff2a8b1d3235 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -639,49 +639,49 @@ Striking a noncultist, however, will tear their flesh."} var/charges = 5 start_on = TRUE -/obj/item/flashlight/flare/culttorch/afterattack(atom/movable/A, mob/user, proximity) - if(!proximity) - return - if(!IS_CULTIST(user)) - to_chat(user, "That doesn't seem to do anything useful.") - return +/obj/item/flashlight/flare/culttorch/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + var/datum/antagonist/cult/cult = user.mind.has_antag_datum(/datum/antagonist/cult) + var/datum/team/cult/cult_team = cult?.get_team() + if(isnull(cult_team)) + to_chat(user, span_warning("That doesn't seem to do anything useful.")) + return ITEM_INTERACT_BLOCKING + + if(!isitem(interacting_with)) + to_chat(user, span_warning("[src] can only transport items!")) + return ITEM_INTERACT_BLOCKING + + var/list/mob/living/cultists = list() + for(var/datum/mind/cult_mind as anything in cult_team.members) + if(cult_mind == user.mind) + continue + if(cult_mind.current?.stat != DEAD) + cultists |= cult_mind.current - if(!isitem(A)) - ..() - to_chat(user, span_warning("\The [src] can only transport items!")) - return - - . |= AFTERATTACK_PROCESSED_ITEM - - var/list/cultists = list() - for(var/datum/mind/M as anything in get_antag_minds(/datum/antagonist/cult)) - if(M.current && M.current.stat != DEAD) - cultists |= M.current var/mob/living/cultist_to_receive = tgui_input_list(user, "Who do you wish to call to [src]?", "Followers of the Geometer", (cultists - user)) - if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated()) - return + if(QDELETED(src) || loc != user || user.incapacitated()) + return ITEM_INTERACT_BLOCKING if(isnull(cultist_to_receive)) - to_chat(user, "You require a destination!") - log_game("[key_name(user)]'s Void torch failed - no target.") - return + to_chat(user, span_cult_italic("You require a destination!")) + return ITEM_INTERACT_BLOCKING if(cultist_to_receive.stat == DEAD) - to_chat(user, "[cultist_to_receive] has died!") - log_game("[key_name(user)]'s Void torch failed - target died.") - return - if(!IS_CULTIST(cultist_to_receive)) - to_chat(user, "[cultist_to_receive] is not a follower of the Geometer!") - log_game("[key_name(user)]'s Void torch failed - target was deconverted.") - return - if(A in user.get_all_contents()) - to_chat(user, "[A] must be on a surface in order to teleport it!") - return - to_chat(user, "You ignite [A] with \the [src], turning it to ash, but through the torch's flames you see that [A] has reached [cultist_to_receive]!") - user.log_message("teleported [A] to [cultist_to_receive] with \the [src].", LOG_GAME) - cultist_to_receive.put_in_hands(A) + to_chat(user, span_cult_italic("[cultist_to_receive] has died!")) + return ITEM_INTERACT_BLOCKING + if(!(cultist_to_receive.mind in cult_team.members)) + to_chat(user, span_cult_italic("[cultist_to_receive] is not a follower of the Geometer!")) + return ITEM_INTERACT_BLOCKING + if(!isturf(interacting_with.loc)) + to_chat(user, span_cult_italic("[interacting_with] must be on a surface in order to teleport it!")) + return ITEM_INTERACT_BLOCKING + + to_chat(user, span_cult_italic("You ignite [interacting_with] with [src], turning it to ash, \ + but through the torch's flames you see that [interacting_with] has reached [cultist_to_receive]!")) + user.log_message("teleported [interacting_with] to [cultist_to_receive] with [src].", LOG_GAME) + cultist_to_receive.put_in_hands(interacting_with) charges-- - to_chat(user, "\The [src] now has [charges] charge\s.") - if(charges == 0) + to_chat(user, span_notice("[src] now has [charges] charge\s.")) + if(charges <= 0) qdel(src) + return ITEM_INTERACT_SUCCESS /obj/item/melee/cultblade/halberd name = "bloody halberd" @@ -859,31 +859,33 @@ Striking a noncultist, however, will tear their flesh."} ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) -/obj/item/blood_beam/afterattack(atom/A, mob/living/user, proximity_flag, clickparams) - . = ..() +/obj/item/blood_beam/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return ranged_interact_with_atom(interacting_with, user, modifiers) + +/obj/item/blood_beam/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(firing || charging) - return - if(ishuman(user)) - angle = get_angle(user, A) - else - qdel(src) - return . | AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_BLOCKING + if(!ishuman(user)) + return ITEM_INTERACT_BLOCKING + angle = get_angle(user, interacting_with) charging = TRUE INVOKE_ASYNC(src, PROC_REF(charge), user) if(do_after(user, 9 SECONDS, target = user)) firing = TRUE ADD_TRAIT(user, TRAIT_IMMOBILIZED, CULT_TRAIT) - INVOKE_ASYNC(src, PROC_REF(pewpew), user, clickparams) + var/params = list2params(modifiers) + INVOKE_ASYNC(src, PROC_REF(pewpew), user, params) var/obj/structure/emergency_shield/cult/weak/N = new(user.loc) if(do_after(user, 9 SECONDS, target = user)) user.Paralyze(40) - to_chat(user, "You have exhausted the power of this spell!") + to_chat(user, span_cult_italic("You have exhausted the power of this spell!")) REMOVE_TRAIT(user, TRAIT_IMMOBILIZED, CULT_TRAIT) firing = FALSE if(N) qdel(N) qdel(src) charging = FALSE + return ITEM_INTERACT_SUCCESS /obj/item/blood_beam/proc/charge(mob/user) var/obj/O diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index b9940112b733e..9c41c54e84e09 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -230,7 +230,7 @@ GLOB.reality_smash_track.add_tracked_mind(owner) RegisterSignals(our_mob, list(COMSIG_MOB_BEFORE_SPELL_CAST, COMSIG_MOB_SPELL_ACTIVATED), PROC_REF(on_spell_cast)) - RegisterSignal(our_mob, COMSIG_MOB_ITEM_AFTERATTACK, PROC_REF(on_item_afterattack)) + 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)) @@ -245,7 +245,7 @@ UnregisterSignal(our_mob, list( COMSIG_MOB_BEFORE_SPELL_CAST, COMSIG_MOB_SPELL_ACTIVATED, - COMSIG_MOB_ITEM_AFTERATTACK, + COMSIG_USER_ITEM_INTERACTION, COMSIG_MOB_LOGIN, COMSIG_LIVING_POST_FULLY_HEAL, )) @@ -286,26 +286,25 @@ return SPELL_CANCEL_CAST /* - * Signal proc for [COMSIG_MOB_ITEM_AFTERATTACK]. + * Signal proc for [COMSIG_USER_ITEM_INTERACTION]. * * If a heretic is holding a pen in their main hand, * and have mansus grasp active in their offhand, * they're able to draw a transmutation rune. */ -/datum/antagonist/heretic/proc/on_item_afterattack(mob/living/source, atom/target, obj/item/weapon, proximity_flag, click_parameters) +/datum/antagonist/heretic/proc/on_item_use(mob/living/source, atom/target, obj/item/weapon, click_parameters) SIGNAL_HANDLER - if(!is_type_in_typecache(weapon, scribing_tools)) - return - if(!isturf(target) || !isliving(source) || !proximity_flag) - return + return NONE + if(!isturf(target) || !isliving(source)) + return NONE var/obj/item/offhand = source.get_inactive_held_item() if(QDELETED(offhand) || !istype(offhand, /obj/item/melee/touch_attack/mansus_fist)) - return + return NONE try_draw_rune(source, target, additional_checks = CALLBACK(src, PROC_REF(check_mansus_grasp_offhand), source)) - return COMPONENT_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_SUCCESS /** * Attempt to draw a rune on [target_turf]. diff --git a/code/modules/antagonists/heretic/items/forbidden_book.dm b/code/modules/antagonists/heretic/items/forbidden_book.dm index 06f091c77e762..6a6a799183a41 100644 --- a/code/modules/antagonists/heretic/items/forbidden_book.dm +++ b/code/modules/antagonists/heretic/items/forbidden_book.dm @@ -45,20 +45,16 @@ AddElement(/datum/element/heretic_focus) update_weight_class(WEIGHT_CLASS_NORMAL) -/obj/item/codex_cicatrix/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!proximity_flag) - return - +/obj/item/codex_cicatrix/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) if(!heretic_datum) - return - - if(isopenturf(target)) - var/obj/effect/heretic_influence/influence = locate(/obj/effect/heretic_influence) in target + return NONE + if(isopenturf(interacting_with)) + var/obj/effect/heretic_influence/influence = locate(/obj/effect/heretic_influence) in interacting_with if(!influence?.drain_influence_with_codex(user, src)) - heretic_datum.try_draw_rune(user, target, drawing_time = 8 SECONDS) - return TRUE + heretic_datum.try_draw_rune(user, interacting_with, drawing_time = 8 SECONDS) + return ITEM_INTERACT_BLOCKING + return NONE /// Plays a little animation that shows the book opening and closing. /obj/item/codex_cicatrix/proc/open_animation() diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index 81f9b4bc80a9f..e8982c4c87c2e 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -24,14 +24,19 @@ attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "rend") var/after_use_message = "" -/obj/item/melee/sickly_blade/attack(mob/living/M, mob/living/user) +/obj/item/melee/sickly_blade/pre_attack(atom/A, mob/living/user, params) + . = ..() + if(.) + return . if(!IS_HERETIC_OR_MONSTER(user)) to_chat(user, span_danger("You feel a pulse of alien intellect lash out at your mind!")) - var/mob/living/carbon/human/human_user = user - human_user.AdjustParalyzed(5 SECONDS) + user.AdjustParalyzed(5 SECONDS) return TRUE + return . - return ..() +/obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, click_parameters) + if(isliving(target)) + SEND_SIGNAL(user, COMSIG_HERETIC_BLADE_ATTACK, target, src) /obj/item/melee/sickly_blade/attack_self(mob/user) var/turf/safe_turf = find_safe_turf(zlevels = z, extended_safety_checks = TRUE) @@ -45,15 +50,10 @@ playsound(src, SFX_SHATTER, 70, TRUE) //copied from the code for smashing a glass sheet onto the ground to turn it into a shard qdel(src) -/obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!isliving(target)) - return - - if(proximity_flag) - SEND_SIGNAL(user, COMSIG_HERETIC_BLADE_ATTACK, target, src) - else - SEND_SIGNAL(user, COMSIG_HERETIC_RANGED_BLADE_ATTACK, target, src) +/obj/item/melee/sickly_blade/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(isliving(interacting_with)) + SEND_SIGNAL(user, COMSIG_HERETIC_RANGED_BLADE_ATTACK, interacting_with, src) + return ITEM_INTERACT_BLOCKING /obj/item/melee/sickly_blade/examine(mob/user) . = ..() diff --git a/code/modules/antagonists/heretic/items/keyring.dm b/code/modules/antagonists/heretic/items/keyring.dm index b71015dbfe1f2..e1768b0fed390 100644 --- a/code/modules/antagonists/heretic/items/keyring.dm +++ b/code/modules/antagonists/heretic/items/keyring.dm @@ -171,20 +171,17 @@ playsound(drop_location(),'sound/items/eatfood.ogg', rand(10,50), TRUE) access += card.access -/obj/item/card/id/advanced/heretic/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!proximity_flag || !IS_HERETIC(user)) - return +/obj/item/card/id/advanced/heretic/interact_with_atom(atom/target, mob/living/user, list/modifiers) + if(!IS_HERETIC(user)) + return NONE if(istype(target, /obj/effect/lock_portal)) clear_portals() - return - + return ITEM_INTERACT_SUCCESS if(!istype(target, /obj/machinery/door)) - return - + return NONE var/reference_resolved = link?.resolve() if(reference_resolved == target) - return + return ITEM_INTERACT_BLOCKING if(reference_resolved) make_portal(user, reference_resolved, target) @@ -194,6 +191,7 @@ else link = WEAKREF(target) balloon_alert(user, "link 1/2") + return ITEM_INTERACT_SUCCESS /obj/item/card/id/advanced/heretic/Destroy() QDEL_LIST_ASSOC(fused_ids) diff --git a/code/modules/antagonists/heretic/items/labyrinth_handbook.dm b/code/modules/antagonists/heretic/items/labyrinth_handbook.dm index b3e3649763fd5..8555b60f0c393 100644 --- a/code/modules/antagonists/heretic/items/labyrinth_handbook.dm +++ b/code/modules/antagonists/heretic/items/labyrinth_handbook.dm @@ -41,24 +41,29 @@ . += span_hypnophrase("Materializes a barrier upon any tile in sight, which only you can pass through. Lasts 8 seconds.") . += span_hypnophrase("It has [uses] uses left.") -/obj/item/heretic_labyrinth_handbook/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(IS_HERETIC(user)) - var/turf/turf_target = get_turf(target) - if(locate(barrier_type) in turf_target) - user.balloon_alert(user, "already occupied!") - return - turf_target.visible_message(span_warning("A storm of paper materializes!")) - new /obj/effect/temp_visual/paper_scatter(turf_target) - playsound(turf_target, 'sound/magic/smoke.ogg', 30) - new barrier_type(turf_target, user) - uses-- - if(uses <= 0) - to_chat(user, span_warning("[src] falls apart, turning into ash and dust!")) - qdel(src) - return - var/mob/living/carbon/human/human_user = user - to_chat(human_user, span_userdanger("Your mind burns as you stare deep into the book, a headache setting in like your brain is on fire!")) - human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 30, 190) - human_user.add_mood_event("gates_of_mansus", /datum/mood_event/gates_of_mansus) - human_user.dropItemToGround(src) +/obj/item/heretic_labyrinth_handbook/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) + +/obj/item/heretic_labyrinth_handbook/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!IS_HERETIC(user)) + if(ishuman(user)) + var/mob/living/carbon/human/human_user = user + to_chat(human_user, span_userdanger("Your mind burns as you stare deep into the book, a headache setting in like your brain is on fire!")) + human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 30, 190) + human_user.add_mood_event("gates_of_mansus", /datum/mood_event/gates_of_mansus) + human_user.dropItemToGround(src) + return ITEM_INTERACT_BLOCKING + + var/turf/turf_target = get_turf(interacting_with) + if(locate(barrier_type) in turf_target) + user.balloon_alert(user, "already occupied!") + return ITEM_INTERACT_BLOCKING + turf_target.visible_message(span_warning("A storm of paper materializes!")) + new /obj/effect/temp_visual/paper_scatter(turf_target) + playsound(turf_target, 'sound/magic/smoke.ogg', 30) + new barrier_type(turf_target, user) + uses-- + if(uses <= 0) + to_chat(user, span_warning("[src] falls apart, turning into ash and dust!")) + qdel(src) + return ITEM_INTERACT_SUCCESS diff --git a/code/modules/antagonists/heretic/structures/carving_knife.dm b/code/modules/antagonists/heretic/structures/carving_knife.dm index b9afe64324011..9bdad0ea5fce5 100644 --- a/code/modules/antagonists/heretic/structures/carving_knife.dm +++ b/code/modules/antagonists/heretic/structures/carving_knife.dm @@ -45,21 +45,14 @@ var/potion_string = span_info("\tThe " + initial(trap.name) + " - " + initial(trap.carver_tip)) . += potion_string -/obj/item/melee/rune_carver/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!proximity_flag) - return - +/obj/item/melee/rune_carver/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!IS_HERETIC_OR_MONSTER(user)) - return - - if(!isopenturf(target)) - return - - if(is_type_in_typecache(target, blacklisted_turfs)) - return + return NONE + if(!isopenturf(interacting_with) || is_type_in_typecache(interacting_with, blacklisted_turfs)) + return NONE - INVOKE_ASYNC(src, PROC_REF(try_carve_rune), target, user) + INVOKE_ASYNC(src, PROC_REF(try_carve_rune), interacting_with, user) + return ITEM_INTERACT_SUCCESS /* * Begin trying to carve a rune. Go through a few checks, then call do_carve_rune if successful. diff --git a/code/modules/antagonists/ninja/energy_katana.dm b/code/modules/antagonists/ninja/energy_katana.dm index 54c3c25ebf452..61a9b81c364c1 100644 --- a/code/modules/antagonists/ninja/energy_katana.dm +++ b/code/modules/antagonists/ninja/energy_katana.dm @@ -44,12 +44,11 @@ spark_system.set_up(5, 0, src) spark_system.attach(src) -/obj/item/energy_katana/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return - if(!target.density) - jaunt?.teleport(user, target) +/obj/item/energy_katana/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(!interacting_with.density) + jaunt?.teleport(user, interacting_with) + return ITEM_INTERACT_SUCCESS + return NONE /obj/item/energy_katana/equipped(mob/user, slot, initial) . = ..() diff --git a/code/modules/antagonists/ninja/ninja_explosive.dm b/code/modules/antagonists/ninja/ninja_explosive.dm index 4c014da186320..6e61ad687614f 100644 --- a/code/modules/antagonists/ninja/ninja_explosive.dm +++ b/code/modules/antagonists/ninja/ninja_explosive.dm @@ -47,15 +47,16 @@ return detonation_area = objective.detonation_location -/obj/item/grenade/c4/ninja/afterattack(atom/movable/target, mob/ninja, flag) - if(!IS_SPACE_NINJA(ninja)) +/obj/item/grenade/c4/ninja/plant_c4(atom/bomb_target, mob/living/user) + if(!IS_SPACE_NINJA(user)) say("Access denied.") - return - . |= AFTERATTACK_PROCESSED_ITEM - if (!check_loc(ninja)) - return . - detonator = WEAKREF(ninja) - return . | ..() + return FALSE + if(!check_loc(user)) + return FALSE + if(!..()) + return FALSE + detonator = WEAKREF(user) + return TRUE /obj/item/grenade/c4/ninja/detonate(mob/living/lanced_by) if(!check_loc(detonator.resolve())) // if its moved, deactivate the c4 diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm index 2ed8787316f00..4275c807ea884 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm @@ -29,7 +29,7 @@ /obj/machinery/nuclearbomb/beer/attackby(obj/item/weapon, mob/user, params) if(weapon.is_refillable()) - weapon.afterattack(keg, user, TRUE) // redirect refillable containers to the keg, allowing them to be filled + weapon.interact_with_atom(keg, user) // redirect refillable containers to the keg, allowing them to be filled return TRUE // pretend we handled the attack, too. if(istype(weapon, /obj/item/nuke_core_container)) diff --git a/code/modules/antagonists/pirate/pirate_gangs.dm b/code/modules/antagonists/pirate/pirate_gangs.dm index aef8222a99348..bb7451e212a06 100644 --- a/code/modules/antagonists/pirate/pirate_gangs.dm +++ b/code/modules/antagonists/pirate/pirate_gangs.dm @@ -221,7 +221,7 @@ GLOBAL_LIST_INIT(heavy_pirate_gangs, init_pirate_gangs(is_heavy = TRUE)) TO WELCOME YOU INTO OUR SPACE IF YOU PAY %PAYOFF AS HOMAGE TO OUR LAW. BE WISE ON YOUR CHOICE!! \ (send message. send message. why message not sent?)." arrival_announcement = "I FIGURED OUT HOW TO FLY MY SHIP, WE WILL BE DOCKING NEXT TO YOU IN A MINUTE!!" - possible_answers = list("Please don't hurt me.","You are dumb, go larp somewhere else.") + possible_answers = list("Alright, i like my skull intact.","You are dumb, go larp somewhere else.") response_received = "THIS WILL SUFFICE, REMEMBER WHO OWNS YOU!!" response_rejected = "FOOLISH DECISION, I'LL MAKE AN EXAMPLE OUT OF YOUR CARCASS!! (does anyone remember how to pilot our ship?)" diff --git a/code/modules/antagonists/spy/spy_bounty.dm b/code/modules/antagonists/spy/spy_bounty.dm index 0a9422e07b807..28984ce2272bd 100644 --- a/code/modules/antagonists/spy/spy_bounty.dm +++ b/code/modules/antagonists/spy/spy_bounty.dm @@ -219,6 +219,8 @@ continue if(!is_station_level(thing_turf.z) && !is_mining_level(thing_turf.z)) continue + if(HAS_TRAIT(existing_thing, TRAIT_ITEM_OBJECTIVE_BLOCKED)) + continue all_valid_existing_things += existing_thing if(!length(all_valid_existing_things)) @@ -253,16 +255,14 @@ return FALSE desired_item = pick(valid_possible_items) - // We need to do some snowflake for items that do exist vs generic items - var/list/obj/item/existing_items = GLOB.steal_item_handler.objectives_by_path[desired_item.targetitem] - var/obj/item/the_item = length(existing_items) ? pick(existing_items) : desired_item.targetitem - var/the_item_name = istype(the_item) ? the_item.name : initial(the_item.name) - name = "[the_item_name] [difficulty == SPY_DIFFICULTY_HARD ? "Grand ":""]Theft" - help = "Steal any [the_item_name][desired_item.steal_hint ? ": [desired_item.steal_hint]" : "."]" + name = "[desired_item.name] [difficulty == SPY_DIFFICULTY_HARD ? "Grand ":""]Theft" + help = "Steal [desired_item.name][desired_item.steal_hint ? ": [desired_item.steal_hint]" : "."]" return TRUE /datum/spy_bounty/objective_item/is_stealable(atom/movable/stealing) - return istype(stealing, desired_item.targetitem) && desired_item.check_special_completion(stealing) + return istype(stealing, desired_item.targetitem) \ + && !HAS_TRAIT(stealing, TRAIT_ITEM_OBJECTIVE_BLOCKED) \ + && desired_item.check_special_completion(stealing) /datum/spy_bounty/objective_item/random_easy difficulty = SPY_DIFFICULTY_EASY diff --git a/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm b/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm index 1976fd38fc8ae..4acfe7120489a 100644 --- a/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm +++ b/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm @@ -243,28 +243,24 @@ objective_weakref = null return ..() -/obj/item/grenade/c4/es8/afterattack(atom/movable/target, mob/user, flag) - if(!user.mind) - return - +/obj/item/grenade/c4/es8/plant_c4(atom/bomb_target, mob/living/user) if(!IS_TRAITOR(user)) to_chat(user, span_warning("You can't seem to find a way to detonate the charge.")) - return + return FALSE var/datum/traitor_objective/locate_weakpoint/objective = objective_weakref.resolve() - if(!objective || objective.objective_state == OBJECTIVE_STATE_INACTIVE || objective.handler.owner != user.mind) to_chat(user, span_warning("You don't think it would be wise to use [src].")) - return + return FALSE - var/area/target_area = get_area(target) + var/area/target_area = get_area(bomb_target) if (target_area.type != objective.weakpoint_area) to_chat(user, span_warning("[src] can only be detonated in [initial(objective.weakpoint_area.name)].")) - return + return FALSE - if(!isfloorturf(target) && !iswallturf(target)) + if(!isfloorturf(bomb_target) && !iswallturf(bomb_target)) to_chat(user, span_warning("[src] can only be planted on a wall or the floor!")) - return + return FALSE return ..() diff --git a/code/modules/antagonists/traitor/objectives/steal.dm b/code/modules/antagonists/traitor/objectives/steal.dm index 22d8ed7d39c7b..fdcd693fed889 100644 --- a/code/modules/antagonists/traitor/objectives/steal.dm +++ b/code/modules/antagonists/traitor/objectives/steal.dm @@ -29,6 +29,8 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) /datum/objective_item_handler/proc/new_item_created(datum/source, obj/item/item) SIGNAL_HANDLER + if(HAS_TRAIT(item, TRAIT_ITEM_OBJECTIVE_BLOCKED)) + return if(!generated_items) item.add_stealing_item_objective() return @@ -224,6 +226,8 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) /datum/traitor_objective/steal_item/proc/handle_special_case(obj/item/source, obj/item/target) SIGNAL_HANDLER + if(HAS_TRAIT(target, TRAIT_ITEM_OBJECTIVE_BLOCKED)) + return COMPONENT_FORCE_FAIL_PLACEMENT if(istype(target, target_item.targetitem)) if(!target_item.check_special_completion(target)) return COMPONENT_FORCE_FAIL_PLACEMENT @@ -273,28 +277,26 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) . += span_notice("This device must be placed by clicking on the [initial(target_object_type.name)] with it.") . += span_notice("Remember, you may leave behind fingerprints or fibers on the device. Use soap or similar to scrub it clean to be safe!") -/obj/item/traitor_bug/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!target_object_type) - return - if(!user.Adjacent(target)) - return - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/traitor_bug/interact_with_atom(atom/movable/target, mob/living/user, list/modifiers) + if(!target_object_type || !ismovable(target)) + return NONE + var/result = SEND_SIGNAL(src, COMSIG_TRAITOR_BUG_PRE_PLANTED_OBJECT, target) if(!(result & COMPONENT_FORCE_PLACEMENT)) if(result & COMPONENT_FORCE_FAIL_PLACEMENT || !istype(target, target_object_type)) balloon_alert(user, "you can't attach this onto here!") - return + return ITEM_INTERACT_BLOCKING if(!do_after(user, deploy_time, src, hidden = TRUE)) - return + return ITEM_INTERACT_BLOCKING if(planted_on) - return + return ITEM_INTERACT_BLOCKING forceMove(target) target.vis_contents += src vis_flags |= VIS_INHERIT_PLANE planted_on = target RegisterSignal(planted_on, COMSIG_QDELETING, PROC_REF(handle_planted_on_deletion)) SEND_SIGNAL(src, COMSIG_TRAITOR_BUG_PLANTED_OBJECT, target) + return ITEM_INTERACT_SUCCESS /obj/item/traitor_bug/proc/handle_planted_on_deletion() planted_on = null @@ -314,5 +316,5 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) UnregisterSignal(planted_on, COMSIG_QDELETING) planted_on = null -/obj/item/traitor_bug/attackby_storage_insert(datum/storage, atom/storage_holder, mob/user) +/obj/item/traitor_bug/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/user) return !istype(storage_holder, target_object_type) diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 40b15248413a7..2e4a438354d09 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -431,43 +431,45 @@ COMSIG_ITEM_MAGICALLY_CHARGED = PROC_REF(on_magic_charge), ) -/obj/item/runic_vendor_scepter/afterattack(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/runic_vendor_scepter/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) + +/obj/item/runic_vendor_scepter/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(scepter_is_busy_recharging) user.balloon_alert(user, "busy!") - return - if(!check_allowed_items(target, not_inside = TRUE)) - return - . |= AFTERATTACK_PROCESSED_ITEM - var/turf/afterattack_turf = get_turf(target) - if(istype(target, /obj/machinery/vending/runic_vendor)) - var/obj/machinery/vending/runic_vendor/runic_explosion_target = target + return ITEM_INTERACT_BLOCKING + if(!check_allowed_items(interacting_with, not_inside = TRUE)) + return NONE + if(istype(interacting_with, /obj/machinery/vending/runic_vendor)) + var/obj/machinery/vending/runic_vendor/runic_explosion_target = interacting_with runic_explosion_target.runic_explosion() - return + return ITEM_INTERACT_SUCCESS + var/turf/afterattack_turf = get_turf(interacting_with) var/obj/machinery/vending/runic_vendor/vendor_on_turf = locate() in afterattack_turf if(vendor_on_turf) vendor_on_turf.runic_explosion() - return + return ITEM_INTERACT_SUCCESS if(!summon_vendor_charges) user.balloon_alert(user, "no charges!") - return + return ITEM_INTERACT_BLOCKING if(get_dist(afterattack_turf,src) > max_summon_range) user.balloon_alert(user, "too far!") - return + return ITEM_INTERACT_BLOCKING if(get_turf(src) == afterattack_turf) user.balloon_alert(user, "too close!") - return + return ITEM_INTERACT_BLOCKING if(scepter_is_busy_summoning) user.balloon_alert(user, "already summoning!") - return + return ITEM_INTERACT_BLOCKING if(afterattack_turf.is_blocked_turf(TRUE)) user.balloon_alert(user, "blocked!") - return + return ITEM_INTERACT_BLOCKING if(summoning_time) scepter_is_busy_summoning = TRUE user.balloon_alert(user, "summoning...") - if(!do_after(user, summoning_time, target = target)) + if(!do_after(user, summoning_time, target = interacting_with)) scepter_is_busy_summoning = FALSE - return + return ITEM_INTERACT_BLOCKING scepter_is_busy_summoning = FALSE if(summon_vendor_charges) playsound(src,'sound/weapons/resonator_fire.ogg',50,TRUE) @@ -475,8 +477,8 @@ new /obj/machinery/vending/runic_vendor(afterattack_turf) summon_vendor_charges-- user.changeNext_move(CLICK_CD_MELEE) - return - return ..() + return ITEM_INTERACT_SUCCESS + return NONE /obj/item/runic_vendor_scepter/attack_self(mob/user, modifiers) . = ..() @@ -489,17 +491,20 @@ scepter_is_busy_recharging = FALSE summon_vendor_charges = RUNIC_SCEPTER_MAX_CHARGES -/obj/item/runic_vendor_scepter/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - var/turf/afterattack_secondary_turf = get_turf(target) +/obj/item/runic_vendor_scepter/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom_secondary(interacting_with, user, modifiers) + +/obj/item/runic_vendor_scepter/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + var/turf/afterattack_secondary_turf = get_turf(interacting_with) var/obj/machinery/vending/runic_vendor/vendor_on_turf = locate() in afterattack_secondary_turf - if(istype(target, /obj/machinery/vending/runic_vendor)) - var/obj/machinery/vending/runic_vendor/vendor_being_throw = target - vendor_being_throw.throw_at(get_edge_target_turf(target, get_cardinal_dir(src, target)), 4, 20, user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(istype(interacting_with, /obj/machinery/vending/runic_vendor)) + var/obj/machinery/vending/runic_vendor/vendor_being_throw = interacting_with + vendor_being_throw.throw_at(get_edge_target_turf(interacting_with, get_cardinal_dir(src, interacting_with)), 4, 20, user) + return ITEM_INTERACT_SUCCESS if(vendor_on_turf) - vendor_on_turf.throw_at(get_edge_target_turf(target, get_cardinal_dir(src, target)), 4, 20, user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + vendor_on_turf.throw_at(get_edge_target_turf(interacting_with, get_cardinal_dir(src, interacting_with)), 4, 20, user) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING /obj/item/runic_vendor_scepter/proc/on_magic_charge(datum/source, datum/action/cooldown/spell/charge/spell, mob/living/caster) SIGNAL_HANDLER diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index de5794a6e3570..3094af509dadb 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -77,7 +77,7 @@ whatever spark it once held long extinguished." ///signal called whenever a soulstone is smacked by a bible -/obj/item/soulstone/proc/on_bible_smacked(datum/source, mob/living/user, direction) +/obj/item/soulstone/proc/on_bible_smacked(datum/source, mob/living/user, ...) SIGNAL_HANDLER INVOKE_ASYNC(src, PROC_REF(attempt_exorcism), user) diff --git a/code/modules/antagonists/wizard/equipment/teleport_rod.dm b/code/modules/antagonists/wizard/equipment/teleport_rod.dm index a1d9904ddb27d..c15b66da6ff61 100644 --- a/code/modules/antagonists/wizard/equipment/teleport_rod.dm +++ b/code/modules/antagonists/wizard/equipment/teleport_rod.dm @@ -55,28 +55,21 @@ var/datum/status_effect/teleport_flux/perma/permaflux = user.has_status_effect(/datum/status_effect/teleport_flux/perma) permaflux?.delayed_remove(src) -/obj/item/teleport_rod/afterattack(atom/target, mob/living/user, proximity_flag, click_parameters) - . = ..() - if(!isliving(user)) - return - if(proximity_flag) // assuming you don't want to teleport 1 tile away - return - - . |= AFTERATTACK_PROCESSED_ITEM - +/obj/item/teleport_rod/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ITEM_INTERACT_BLOCKING var/turf/start_turf = get_turf(user) - var/turf/target_turf = get_turf(target) + var/turf/target_turf = get_turf(interacting_with) if(get_dist(start_turf, target_turf) > max_tp_range) user.balloon_alert(user, "too far!") - return + return . if(!(target_turf in view(user, user.client?.view || world.view))) user.balloon_alert(user, "out of view!") - return + return . if(target_turf.is_blocked_turf(exclude_mobs = TRUE, source_atom = user)) user.balloon_alert(user, "obstructed!") - return + return . var/tp_result = do_teleport( teleatom = user, @@ -88,7 +81,9 @@ if(!tp_result) user.balloon_alert(user, "teleport failed!") - return + return . + + . = ITEM_INTERACT_SUCCESS var/sound/teleport_sound = sound('sound/magic/summonitems_generic.ogg') teleport_sound.pitch = 0.5 @@ -101,7 +96,7 @@ user.changeNext_move(CLICK_CD_SLOW * 1.2) if(!apply_debuffs) - return + return . // Teleporting leaves some of your reagents behind! // (Primarily a way to prevent cheese with damage healing chem mixes, @@ -110,13 +105,14 @@ user.reagents?.remove_all(0.33, relative = TRUE) user_stomach?.reagents?.remove_all(0.33, relative = TRUE) if(user.has_status_effect(/datum/status_effect/teleport_flux/perma)) - return + return . if(user.has_status_effect(/datum/status_effect/teleport_flux)) // The status effect handles the damage, but we'll add a special pop up for rod usage specifically user.balloon_alert(user, "too soon!") user.apply_status_effect(/datum/status_effect/teleport_flux) + return . /// Temp visual displayed on both sides of a teleport rod teleport /obj/effect/temp_visual/teleport_flux diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm index 8ed46a5bf81af..fd64d212f3e80 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -310,12 +310,11 @@ Point with the chisel at the target to choose what to sculpt or hit block to cho Hit block again to start sculpting. Moving interrupts */ -/obj/item/chisel/pre_attack(atom/target, mob/living/user, params) - . = ..() +/obj/item/chisel/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(sculpting) - return TRUE - if(istype(target, /obj/structure/carving_block)) - var/obj/structure/carving_block/sculpt_block = target + return ITEM_INTERACT_BLOCKING + if(istype(interacting_with, /obj/structure/carving_block)) + var/obj/structure/carving_block/sculpt_block = interacting_with if(sculpt_block.completion) // someone already started sculpting this so just finish set_block(sculpt_block, user, silent = TRUE) @@ -326,19 +325,20 @@ Moving interrupts set_block(sculpt_block, user) else if(sculpt_block == prepared_block) show_generic_statues_prompt(user) - return TRUE - else if(prepared_block) //We're aiming at something next to us with block prepared - prepared_block.set_target(target, user) - return TRUE + return ITEM_INTERACT_SUCCESS -// We aim at something distant. -/obj/item/chisel/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() + else if(prepared_block) //We're aiming at something next to us with block prepared + prepared_block.set_target(interacting_with, user) + return ITEM_INTERACT_SUCCESS - if (!sculpting && prepared_block && ismovable(target) && prepared_block.completion == 0) - prepared_block.set_target(target,user) + return NONE - return . | AFTERATTACK_PROCESSED_ITEM +// We aim at something distant. +/obj/item/chisel/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if (!sculpting && prepared_block && ismovable(interacting_with) && prepared_block.completion == 0) + prepared_block.set_target(interacting_with, user) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING /// Starts or continues the sculpting action on the carving block material /obj/item/chisel/proc/start_sculpting(mob/living/user) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index a5822084b61d6..85b95feb6d549 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -470,11 +470,19 @@ for(var/turf/open/group_member as anything in turf_list) //Cache? var/datum/gas_mixture/turf/mix = group_member.air - if (roundstart && istype(group_member.air, /datum/gas_mixture/immutable)) - imumutable_in_group = TRUE - shared_mix.copy_from(group_member.air) //This had better be immutable young man - shared_gases = shared_mix.gases //update the cache - break + if (roundstart) + if(istype(group_member.air, /datum/gas_mixture/immutable)) + imumutable_in_group = TRUE + shared_mix.copy_from(group_member.air) //This had better be immutable young man + shared_gases = shared_mix.gases //update the cache + break + // If we're planetary use THAT mix, and stop here + if(group_member.planetary_atmos) + imumutable_in_group = TRUE + var/datum/gas_mixture/planetary_mix = SSair.planetary[group_member.initial_gas_mix] + shared_mix.copy_from(planetary_mix) + shared_gases = shared_mix.gases // Cache update + break //"borrowing" this code from merge(), I need to play with the temp portion. Lets expand it out //temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity var/capacity = mix.heat_capacity() diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm index c12893cb13749..6e0490e25efb3 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm @@ -5,29 +5,27 @@ icon_state = "hypernoblium_crystal" var/uses = 1 -/obj/item/hypernoblium_crystal/afterattack(obj/target_object, mob/user, proximity) - . = ..() - if(!proximity) - return - . |= AFTERATTACK_PROCESSED_ITEM - var/obj/machinery/portable_atmospherics/atmos_device = target_object +/obj/item/hypernoblium_crystal/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + var/obj/machinery/portable_atmospherics/atmos_device = interacting_with + var/obj/item/clothing/worn_item = interacting_with + if(!istype(worn_item) && !istype(atmos_device)) + to_chat(user, span_warning("The crystal can only be used on clothing and portable atmospheric devices!")) + return ITEM_INTERACT_BLOCKING + if(istype(atmos_device)) if(atmos_device.nob_crystal_inserted) to_chat(user, span_warning("[atmos_device] already has a hypernoblium crystal inserted in it!")) - return + return ITEM_INTERACT_BLOCKING atmos_device.nob_crystal_inserted = TRUE to_chat(user, span_notice("You insert the [src] into [atmos_device].")) - var/obj/item/clothing/worn_item = target_object - if(!istype(worn_item) && !istype(atmos_device)) - to_chat(user, span_warning("The crystal can only be used on clothing and portable atmospheric devices!")) - return + if(istype(worn_item)) if(istype(worn_item, /obj/item/clothing/suit/space)) to_chat(user, span_warning("The [worn_item] is already pressure-resistant!")) - return + return ITEM_INTERACT_BLOCKING if(worn_item.min_cold_protection_temperature == SPACE_SUIT_MIN_TEMP_PROTECT && worn_item.clothing_flags & STOPSPRESSUREDAMAGE) to_chat(user, span_warning("[worn_item] is already pressure-resistant!")) - return + return ITEM_INTERACT_BLOCKING to_chat(user, span_notice("You see how the [worn_item] changes color, it's now pressure proof.")) worn_item.name = "pressure-resistant [worn_item.name]" worn_item.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) @@ -35,6 +33,8 @@ worn_item.min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT worn_item.cold_protection = worn_item.body_parts_covered worn_item.clothing_flags |= STOPSPRESSUREDAMAGE + uses-- - if(!uses) + if(uses <= 0) qdel(src) + return ITEM_INTERACT_SUCCESS diff --git a/code/modules/basketball/basketball.dm b/code/modules/basketball/basketball.dm index 77c3214fe569a..35579dc448282 100644 --- a/code/modules/basketball/basketball.dm +++ b/code/modules/basketball/basketball.dm @@ -173,31 +173,37 @@ user.swap_hand(user.get_held_index_of_item(src)) playsound(src, 'sound/items/basketball_bounce.ogg', 75, FALSE) -/obj/item/toy/basketball/afterattack(atom/target, mob/living/user) - . = ..() - if(!user.combat_mode) - user.throw_item(target) +/obj/item/toy/basketball/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) + +/obj/item/toy/basketball/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(user.combat_mode) + user.throw_item(interacting_with) + return ITEM_INTERACT_SUCCESS + return NONE + +/obj/item/toy/basketball/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom_secondary(interacting_with, user, modifiers) -/obj/item/toy/basketball/afterattack_secondary(atom/aim_target, mob/living/baller, proximity_flag, click_parameters) - // dunking negates shooting - if(istype(aim_target, /obj/structure/hoop) && baller.Adjacent(aim_target)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN +/obj/item/toy/basketball/interact_with_atom_secondary(atom/interacting_with, mob/living/baller, list/modifiers) + if(istype(interacting_with, /obj/structure/hoop) && baller.Adjacent(interacting_with)) + return NONE // Do hoop stuff baller.adjustStaminaLoss(STAMINA_COST_SHOOTING) - var/dunk_dir = get_dir(baller, aim_target) + var/dunk_dir = get_dir(baller, interacting_with) var/dunk_pixel_y = dunk_dir & SOUTH ? -16 : 16 var/dunk_pixel_x = dunk_dir & EAST && 16 || dunk_dir & WEST && -16 || 0 animate(baller, pixel_x = dunk_pixel_x, pixel_y = dunk_pixel_y, time = 5, easing = BOUNCE_EASING|EASE_IN|EASE_OUT) if(do_after(baller, 0.5 SECONDS)) pass_flags |= PASSMOB - baller.throw_item(aim_target) + baller.throw_item(interacting_with) animate(baller, pixel_x = 0, pixel_y = 0, time = 3) - return SECONDARY_ATTACK_CONTINUE_CHAIN + return ITEM_INTERACT_SUCCESS animate(baller, pixel_x = 0, pixel_y = 0, time = 3) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING /obj/item/toy/basketball/throw_impact(mob/living/carbon/target, datum/thrownthing/throwingdatum) playsound(src, 'sound/items/basketball_bounce.ogg', 75, FALSE) diff --git a/code/modules/bitrunning/virtual_domain/domains/fredingtonfastingbear.dm b/code/modules/bitrunning/virtual_domain/domains/fredingtonfastingbear.dm new file mode 100644 index 0000000000000..841956675ca90 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/fredingtonfastingbear.dm @@ -0,0 +1,9 @@ +/datum/lazy_template/virtual_domain/fredingtonfastingbear + name = "Pizza Party" + cost = BITRUNNER_COST_MEDIUM + desc = "A famous pizzeria that got ruined by what it had to offer." + difficulty = BITRUNNER_DIFFICULTY_MEDIUM + help_text = "Pick up a flashlight and get going. Your favourite bear has been waiting for you..." + key = "fredingtonfastingbear" + map_name = "fredingtonfastingbear" + reward_points = BITRUNNER_REWARD_MEDIUM diff --git a/code/modules/cargo/universal_scanner.dm b/code/modules/cargo/universal_scanner.dm index 80a821a1f5e29..434162a36d953 100644 --- a/code/modules/cargo/universal_scanner.dm +++ b/code/modules/cargo/universal_scanner.dm @@ -58,17 +58,16 @@ icon_state = "[choice]" playsound(src, 'sound/machines/click.ogg', 40, TRUE) -/obj/item/universal_scanner/afterattack(obj/object, mob/user, proximity) - . = ..() - if(!istype(object) || !proximity) - return - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/universal_scanner/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isobj(interacting_with)) + return NONE if(scanning_mode == SCAN_EXPORTS) - export_scan(object, user) - return . + export_scan(interacting_with, user) + return ITEM_INTERACT_SUCCESS if(scanning_mode == SCAN_PRICE_TAG) - price_tag(target = object, user = user) - return . + price_tag(interacting_with, user) + return ITEM_INTERACT_SUCCESS + return NONE /obj/item/universal_scanner/attackby(obj/item/attacking_item, mob/user, params) . = ..() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 0e5d018be37d1..8eb0def90bfa3 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -225,8 +225,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) return TRUE if ("rotate") - character_preview_view.dir = turn(character_preview_view.dir, -90) - + character_preview_view.setDir(turn(character_preview_view.dir, -90)) return TRUE if ("set_preference") var/requested_preference_key = params["preference"] @@ -351,6 +350,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/mob/living/carbon/human/dummy/body /// The preferences this refers to var/datum/preferences/preferences + /// Whether we show current job clothes or nude/loadout only + var/show_job_clothes = TRUE /atom/movable/screen/map_view/char_preview/Initialize(mapload, datum/preferences/preferences) . = ..() @@ -368,16 +369,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) create_body() else body.wipe_state() - appearance = preferences.render_new_preview_appearance(body) + + appearance = preferences.render_new_preview_appearance(body, show_job_clothes) /atom/movable/screen/map_view/char_preview/proc/create_body() QDEL_NULL(body) body = new - // Without this, it doesn't show up in the menu - body.appearance_flags &= ~KEEP_TOGETHER - /datum/preferences/proc/create_character_profiles() var/list/profiles = list() diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm index 5fbf5c6953d6a..6c62ed1d054c2 100644 --- a/code/modules/client/preferences/_preference.dm +++ b/code/modules/client/preferences/_preference.dm @@ -18,11 +18,16 @@ /// support the "use gender" option. #define PREFERENCE_PRIORITY_BODY_TYPE 5 +/// Equpping items based on preferences. +/// Should happen after species and body type to make sure it looks right. +/// Mostly redundant, but a safety net for saving/loading. +#define PREFERENCE_PRIORITY_LOADOUT 6 + /// The priority at which names are decided, needed for proper randomization. -#define PREFERENCE_PRIORITY_NAMES 6 +#define PREFERENCE_PRIORITY_NAMES 7 /// Preferences that aren't names, but change the name changes set by PREFERENCE_PRIORITY_NAMES. -#define PREFERENCE_PRIORITY_NAME_MODIFICATIONS 7 +#define PREFERENCE_PRIORITY_NAME_MODIFICATIONS 8 /// The maximum preference priority, keep this updated, but don't use it for `priority`. #define MAX_PREFERENCE_PRIORITY PREFERENCE_PRIORITY_NAME_MODIFICATIONS diff --git a/code/modules/client/preferences/migrations/quirk_loadout_migration.dm b/code/modules/client/preferences/migrations/quirk_loadout_migration.dm new file mode 100644 index 0000000000000..52fcd993c5732 --- /dev/null +++ b/code/modules/client/preferences/migrations/quirk_loadout_migration.dm @@ -0,0 +1,27 @@ +/** + * Move quirk items into loadout items + * + * If this is accompanied with removal of a quirk, + * you don't need to worry about handling that here - + * quirk sanitization happens AFTER migration + */ +/datum/preferences/proc/migrate_quirk_to_loadout(quirk_to_migrate, new_typepath, list/data_to_migrate) + ASSERT(istext(quirk_to_migrate) && ispath(new_typepath, /obj/item)) + if(quirk_to_migrate in all_quirks) + add_loadout_item(new_typepath, data_to_migrate) + +/// Helper for slotting in a new loadout item +/datum/preferences/proc/add_loadout_item(typepath, list/data = list()) + PRIVATE_PROC(TRUE) + + var/list/loadout_list = read_preference(/datum/preference/loadout) || list() + loadout_list[typepath] = data + write_preference(GLOB.preference_entries[/datum/preference/loadout], loadout_list) + +/// Helper for removing a loadout item +/datum/preferences/proc/remove_loadout_item(typepath) + PRIVATE_PROC(TRUE) + + var/list/loadout_list = read_preference(/datum/preference/loadout) + if(loadout_list?.Remove(typepath)) + write_preference(GLOB.preference_entries[/datum/preference/loadout], loadout_list) diff --git a/code/modules/client/preferences/pride_pin.dm b/code/modules/client/preferences/pride_pin.dm deleted file mode 100644 index 326dad69979b4..0000000000000 --- a/code/modules/client/preferences/pride_pin.dm +++ /dev/null @@ -1,16 +0,0 @@ -/datum/preference/choiced/pride_pin - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_key = "pride_pin" - savefile_identifier = PREFERENCE_CHARACTER - -/datum/preference/choiced/pride_pin/init_possible_values() - return assoc_to_keys(GLOB.pride_pin_reskins) - -/datum/preference/choiced/pride_pin/is_accessible(datum/preferences/preferences) - if (!..(preferences)) - return FALSE - - return "Pride Pin" in preferences.all_quirks - -/datum/preference/choiced/pride_pin/apply_to_human(mob/living/carbon/human/target, value) - return diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 3d930ce898904..aa6b1840c50b2 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 44 +#define SAVEFILE_VERSION_MAX 45 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -104,6 +104,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if (current_version < 43) migrate_legacy_sound_toggles(savefile) + if (current_version < 45) + migrate_quirk_to_loadout( + quirk_to_migrate = "Pride Pin", + new_typepath = /obj/item/clothing/accessory/pride, + data_to_migrate = list(INFO_RESKIN = save_data?["pride_pin"]), + ) + /// checks through keybindings for outdated unbound keys and updates them /datum/preferences/proc/check_keybindings() if(!parent) diff --git a/code/modules/clothing/chameleon/chameleon_scanner.dm b/code/modules/clothing/chameleon/chameleon_scanner.dm index 5023997cefebf..2ea0958a0cc66 100644 --- a/code/modules/clothing/chameleon/chameleon_scanner.dm +++ b/code/modules/clothing/chameleon/chameleon_scanner.dm @@ -43,25 +43,24 @@ . += span_red("Left click will stealthily scan a target up to [scan_range] meters away and upload their getup as a custom outfit for you to use.") . += span_red("Right click will do the same, but instantly equip the outfit you obtain.") -/obj/item/chameleon_scanner/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(scan_target(target, user)) - . |= AFTERATTACK_PROCESSED_ITEM - return . +/obj/item/chameleon_scanner/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return scan_target(interacting_with, user) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING -/obj/item/chameleon_scanner/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return . +/obj/item/chameleon_scanner/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) - var/list/scanned_outfit = scan_target(target, user) +/obj/item/chameleon_scanner/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + var/list/scanned_outfit = scan_target(interacting_with, user) if(length(scanned_outfit)) var/datum/outfit/empty_outfit = new() var/datum/action/chameleon_outfit/outfit_action = locate() in user.actions outfit_action?.apply_outfit(empty_outfit, scanned_outfit.Copy()) qdel(empty_outfit) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING - return SECONDARY_ATTACK_CONTINUE_CHAIN // no normal afterattack +/obj/item/chameleon_scanner/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom_secondary(interacting_with, user, modifiers) /** * Attempts to scan a human's outfit diff --git a/code/modules/clothing/gloves/insulated.dm b/code/modules/clothing/gloves/insulated.dm index 99a1ed043555d..19109d68b9c93 100644 --- a/code/modules/clothing/gloves/insulated.dm +++ b/code/modules/clothing/gloves/insulated.dm @@ -39,18 +39,20 @@ icon = 'icons/obj/clothing/gloves.dmi' icon_state = "sprayoncan" -/obj/item/toy/sprayoncan/afterattack(atom/target, mob/living/carbon/user, proximity) - if(iscarbon(target) && proximity) - var/mob/living/carbon/C = target - var/mob/living/carbon/U = user - var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, qdel_on_fail = TRUE, disable_warning = TRUE) - if(success) - if(C == user) - C.visible_message(span_notice("[U] sprays their hands with glittery rubber!")) - else - C.visible_message(span_warning("[U] sprays glittery rubber on the hands of [C]!")) +/obj/item/toy/sprayoncan/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!iscarbon(interacting_with)) + return NONE + var/mob/living/carbon/C = interacting_with + var/mob/living/carbon/U = user + var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, qdel_on_fail = TRUE, disable_warning = TRUE) + if(success) + if(C == user) + C.visible_message(span_notice("[U] sprays their hands with glittery rubber!")) else - C.visible_message(span_warning("The rubber fails to stick to [C]'s hands!")) + C.visible_message(span_warning("[U] sprays glittery rubber on the hands of [C]!")) + else + C.visible_message(span_warning("The rubber fails to stick to [C]'s hands!")) + return ITEM_INTERACT_SUCCESS /obj/item/clothing/gloves/color/yellow/sprayon desc = "How're you gonna get 'em off, nerd?" diff --git a/code/modules/clothing/head/hat.dm b/code/modules/clothing/head/hat.dm index 6fbc2232b1b11..3316eb8c52c5d 100644 --- a/code/modules/clothing/head/hat.dm +++ b/code/modules/clothing/head/hat.dm @@ -84,6 +84,8 @@ name = "flat cap" desc = "A working man's cap." icon_state = "beret_flat" + icon_preview = 'icons/obj/clothing/head/beret.dmi' + icon_state_preview = "beret_flat" greyscale_config = /datum/greyscale_config/beret greyscale_config_worn = /datum/greyscale_config/beret/worn greyscale_colors = "#8F7654" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 8156c87a1fb44..27be2799b7d2e 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -511,8 +511,9 @@ desc = "A cheaply made kettle helmet with an added faceplate to protect your eyes and mouth." icon_state = "military" inhand_icon_state = "knight_helmet" - flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT + flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + flash_protect = FLASH_PROTECTION_FLASH strip_delay = 80 dog_fashion = null armor_type = /datum/armor/helmet_military @@ -539,6 +540,7 @@ armor_type = /datum/armor/helmet_warlord flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEMASK|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + flash_protect = FLASH_PROTECTION_FLASH slowdown = 0.2 /datum/armor/helmet_warlord diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 1ea2acb78a61f..cd1f6a2798ba2 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -310,7 +310,7 @@ else balloon_alert(wearer, "can't put in hands!") break - + return . /obj/item/clothing/head/fedora/inspector_hat/attackby(obj/item/item, mob/user, params) @@ -385,6 +385,8 @@ name = "beret" desc = "A beret, a mime's favorite headwear." icon_state = "beret" + icon_preview = 'icons/obj/clothing/head/beret.dmi' + icon_state_preview = "beret" dog_fashion = /datum/dog_fashion/head/beret greyscale_config = /datum/greyscale_config/beret greyscale_config_worn = /datum/greyscale_config/beret/worn diff --git a/code/modules/clothing/head/wig.dm b/code/modules/clothing/head/wig.dm index ecd70742ba889..10d69d2457c9f 100644 --- a/code/modules/clothing/head/wig.dm +++ b/code/modules/clothing/head/wig.dm @@ -60,20 +60,22 @@ add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) update_appearance() -/obj/item/clothing/head/wig/afterattack(mob/living/carbon/human/target, mob/user) - . = ..() - if(!istype(target)) - return +/obj/item/clothing/head/wig/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) +/obj/item/clothing/head/wig/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!ishuman(interacting_with) || interacting_with == user) + return NONE + var/mob/living/carbon/human/target = interacting_with if(target.head) var/obj/item/clothing/head = target.head if((head.flags_inv & HIDEHAIR) && !istype(head, /obj/item/clothing/head/wig)) to_chat(user, span_warning("You can't get a good look at [target.p_their()] hair!")) - return + return ITEM_INTERACT_BLOCKING var/obj/item/bodypart/head/noggin = target.get_bodypart(BODY_ZONE_HEAD) if(!noggin) to_chat(user, span_warning("[target.p_They()] have no head!")) - return + return ITEM_INTERACT_BLOCKING var/selected_hairstyle = null var/selected_hairstyle_color = null @@ -90,6 +92,7 @@ add_atom_colour(selected_hairstyle_color, FIXED_COLOUR_PRIORITY) hairstyle = selected_hairstyle update_appearance() + return ITEM_INTERACT_SUCCESS /obj/item/clothing/head/wig/random/Initialize(mapload) hairstyle = pick(SSaccessories.hairstyles_list - "Bald") //Don't want invisible wig diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 7a3c0f1150de4..839f3430cd9cc 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -398,6 +398,8 @@ /obj/item/clothing/neck/large_scarf name = "large scarf" icon_state = "large_scarf" + icon_preview = 'icons/obj/fluff/previews.dmi' + icon_state_preview = "scarf_large" w_class = WEIGHT_CLASS_TINY custom_price = PAYCHECK_CREW greyscale_colors = "#C6C6C6#EEEEEE" @@ -474,25 +476,21 @@ selling = !selling to_chat(user, span_notice("[src] has been set to [selling ? "'Sell'" : "'Get Price'"] mode.")) -/obj/item/clothing/neck/necklace/dope/merchant/afterattack(obj/item/I, mob/user, proximity) - . = ..() - if(!proximity) - return - . |= AFTERATTACK_PROCESSED_ITEM - var/datum/export_report/ex = export_item_and_contents(I, delete_unsold = selling, dry_run = !selling) +/obj/item/clothing/neck/necklace/dope/merchant/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + var/datum/export_report/ex = export_item_and_contents(interacting_with, delete_unsold = selling, dry_run = !selling) var/price = 0 for(var/x in ex.total_amount) price += ex.total_value[x] if(price) var/true_price = round(price*profit_scaling) - to_chat(user, span_notice("[selling ? "Sold" : "Getting the price of"] [I], value: [true_price] credits[I.contents.len ? " (exportable contents included)" : ""].[profit_scaling < 1 && selling ? "[round(price-true_price)] credit\s taken as processing fee\s." : ""]")) + to_chat(user, span_notice("[selling ? "Sold" : "Getting the price of"] [interacting_with], value: [true_price] credits[interacting_with.contents.len ? " (exportable contents included)" : ""].[profit_scaling < 1 && selling ? "[round(price-true_price)] credit\s taken as processing fee\s." : ""]")) if(selling) new /obj/item/holochip(get_turf(user), true_price) else - to_chat(user, span_warning("There is no export value for [I] or any items within it.")) + to_chat(user, span_warning("There is no export value for [interacting_with] or any items within it.")) - return . + return ITEM_INTERACT_BLOCKING /obj/item/clothing/neck/beads name = "plastic bead necklace" diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index bd20874f88d65..63a0dd515c3f6 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -104,6 +104,7 @@ return if(helmet_on) to_chat(user, span_notice("Your helmet's torch can't pass through your welding visor!")) + set_light_on(FALSE) helmet_on = FALSE playsound(src, 'sound/mecha/mechmove03.ogg', 50, TRUE) //Visors don't just come from nothing update_appearance() diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index bbafb4a132b1b..0ea3922893a76 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -175,26 +175,23 @@ name = "Pre-Approved Cyborg Candidate dogtag" display = "This employee has been screened for negative mental traits to an acceptable level of accuracy, and is approved for the NT Cyborg program as an alternative to medical resuscitation." -/// Reskins for the pride pin accessory, mapped by display name to icon state -GLOBAL_LIST_INIT(pride_pin_reskins, list( - "Rainbow Pride" = "pride", - "Bisexual Pride" = "pride_bi", - "Pansexual Pride" = "pride_pan", - "Asexual Pride" = "pride_ace", - "Non-binary Pride" = "pride_enby", - "Transgender Pride" = "pride_trans", - "Intersex Pride" = "pride_intersex", - "Lesbian Pride" = "pride_lesbian", -)) - /obj/item/clothing/accessory/pride name = "pride pin" desc = "A Nanotrasen Diversity & Inclusion Center-sponsored holographic pin to show off your pride, reminding the crew of their unwavering commitment to equity, diversity, and inclusion!" icon_state = "pride" obj_flags = UNIQUE_RENAME | INFINITE_RESKIN + unique_reskin = list( + "Rainbow Pride" = "pride", + "Bisexual Pride" = "pride_bi", + "Pansexual Pride" = "pride_pan", + "Asexual Pride" = "pride_ace", + "Non-binary Pride" = "pride_enby", + "Transgender Pride" = "pride_trans", + "Intersex Pride" = "pride_intersex", + "Lesbian Pride" = "pride_lesbian", + ) /obj/item/clothing/accessory/pride/setup_reskinning() - unique_reskin = GLOB.pride_pin_reskins if(!check_setup_reskinning()) return diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index c10648e3315c6..4f8d8c74cb123 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -8,12 +8,11 @@ inhand_icon_state = "" w_class = WEIGHT_CLASS_TINY -/obj/item/evidencebag/afterattack(obj/item/I, mob/user,proximity) - . = ..() - if(!proximity || loc == I) - return - evidencebagEquip(I, user) - return . | AFTERATTACK_PROCESSED_ITEM +/obj/item/evidencebag/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(interacting_with == loc) + return NONE + evidencebagEquip(interacting_with, user) + return ITEM_INTERACT_SUCCESS /obj/item/evidencebag/attackby(obj/item/I, mob/user, params) if(evidencebagEquip(I, user)) diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index 82c77839da75b..57987eda621d9 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -74,14 +74,16 @@ // Clear the logs log = list() -/obj/item/detective_scanner/pre_attack_secondary(atom/A, mob/user, params) - safe_scan(user, atom_to_scan = A) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN +/obj/item/detective_scanner/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/living/user) + return !user.combat_mode -/obj/item/detective_scanner/afterattack(atom/A, mob/user, params) - . = ..() - safe_scan(user, atom_to_scan = A) - return . | AFTERATTACK_PROCESSED_ITEM +/obj/item/detective_scanner/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + safe_scan(user, interacting_with) + return ITEM_INTERACT_SUCCESS + +/obj/item/detective_scanner/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + safe_scan(user, interacting_with) + return ITEM_INTERACT_SUCCESS /** * safe_scan - a wrapper proc for scan() diff --git a/code/modules/experisci/experiment/handlers/experiment_handler.dm b/code/modules/experisci/experiment/handlers/experiment_handler.dm index d1482c61c98c0..622d84551a285 100644 --- a/code/modules/experisci/experiment/handlers/experiment_handler.dm +++ b/code/modules/experisci/experiment/handlers/experiment_handler.dm @@ -89,16 +89,12 @@ /** * Provides feedback when an item isn't related to an experiment, and has fully passed the attack chain */ -/datum/component/experiment_handler/proc/ignored_handheld_experiment_attempt(datum/source, atom/target, mob/user, proximity_flag, params) +/datum/component/experiment_handler/proc/ignored_handheld_experiment_attempt(datum/source, atom/target, mob/user, params) SIGNAL_HANDLER - if (!proximity_flag) + if ((isnull(selected_experiment) && !(config_flags & EXPERIMENT_CONFIG_ALWAYS_ACTIVE)) || (config_flags & EXPERIMENT_CONFIG_SILENT_FAIL)) return - . |= COMPONENT_AFTERATTACK_PROCESSED_ITEM - if ((selected_experiment == null && !(config_flags & EXPERIMENT_CONFIG_ALWAYS_ACTIVE)) || config_flags & EXPERIMENT_CONFIG_SILENT_FAIL) - return . playsound(user, 'sound/machines/buzz-sigh.ogg', 25) to_chat(user, span_notice("[target] is not related to your currently selected experiment.")) - return . /** * Checks that an experiment can be run using the provided target, used for preventing the cancellation of the attack chain inappropriately diff --git a/code/modules/explorer_drone/loot.dm b/code/modules/explorer_drone/loot.dm index 901b87e101839..b616f4dbf9926 100644 --- a/code/modules/explorer_drone/loot.dm +++ b/code/modules/explorer_drone/loot.dm @@ -167,19 +167,18 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index()) /obj/item/firelance/get_cell() return cell -/obj/item/firelance/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM - if(!HAS_TRAIT(src,TRAIT_WIELDED)) - to_chat(user,span_notice("You need to wield [src] in two hands before you can fire it.")) - return +/obj/item/firelance/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ITEM_INTERACT_BLOCKING + if(!HAS_TRAIT(src, TRAIT_WIELDED)) + to_chat(user, span_notice("You need to wield [src] in two hands before you can fire it.")) + return . if(LAZYACCESS(user.do_afters, "firelance")) - return + return . if(!cell.use(0.2 * STANDARD_CELL_CHARGE)) - to_chat(user,span_warning("[src] battery ran dry!")) - return + to_chat(user,span_warning("[src]'s battery ran dry!")) + return . ADD_TRAIT(user, TRAIT_IMMOBILIZED, REF(src)) - to_chat(user,span_notice("You begin to charge [src]")) + to_chat(user,span_notice("You begin to charge [src]...")) inhand_icon_state = "firelance_charging" user.update_held_items() if(do_after(user,windup_time,interaction_key="firelance",extra_checks = CALLBACK(src, PROC_REF(windup_checks)))) @@ -189,9 +188,11 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index()) for(var/turf/turf_to_melt in get_line(start_turf,last_turf)) if(turf_to_melt.density) turf_to_melt.Melt() + . = ITEM_INTERACT_SUCCESS inhand_icon_state = initial(inhand_icon_state) user.update_held_items() REMOVE_TRAIT(user, TRAIT_IMMOBILIZED, REF(src)) + return . /// Additional windup checks /obj/item/firelance/proc/windup_checks() diff --git a/code/modules/fishing/aquarium/fish_analyzer.dm b/code/modules/fishing/aquarium/fish_analyzer.dm index 2706da8e9671b..2038f1960f903 100644 --- a/code/modules/fishing/aquarium/fish_analyzer.dm +++ b/code/modules/fishing/aquarium/fish_analyzer.dm @@ -78,31 +78,29 @@ return CONTEXTUAL_SCREENTIP_SET return NONE -/obj/item/fish_analyzer/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity || !user.can_read(src) || user.is_blind()) - return +/obj/item/fish_analyzer/interact_with_atom(atom/target, mob/living/user, list/modifiers) + if(!isfish(target) && !isaquarium(target)) + return NONE + if(!user.can_read(src) || user.is_blind()) + return ITEM_INTERACT_BLOCKING if(isfish(target)) balloon_alert(user, "analyzing stats") - user.visible_message(span_notice("[user] analyzes [target]."), span_notice("You analyze [target].")) analyze_status(target, user) else if(istype(target, /obj/structure/aquarium)) scan_aquarium(target, user) + return ITEM_INTERACT_SUCCESS - -/obj/item/fish_analyzer/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - if(!isfish(target)) - return - - if(!proximity_flag || !user.can_read(src) || user.is_blind()) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN +/obj/item/fish_analyzer/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(!isfish(interacting_with)) + return NONE + if(!user.can_read(src) || user.is_blind()) + return ITEM_INTERACT_BLOCKING balloon_alert(user, "analyzing traits") - - analyze_traits(target, user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + analyze_traits(interacting_with, user) + return ITEM_INTERACT_SUCCESS ///Instantiates the radial menu, populates the list of choices, shows it and register signals on the aquarium. /obj/item/fish_analyzer/proc/scan_aquarium(obj/structure/aquarium/aquarium, mob/user) diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 98ac7f8ff720f..9cc564df6f411 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -145,16 +145,6 @@ . = ..() ui_interact(user) -/obj/item/fishing_rod/pre_attack(atom/targeted_atom, mob/living/user, params) - . = ..() - /// Reel in if able - if(currently_hooked) - reel(user) - return TRUE - if(!hook) - balloon_alert(user, "install a hook first!") - SEND_SIGNAL(targeted_atom, COMSIG_PRE_FISHING) - /// Generates the fishing line visual from the current user to the target and updates inhands /obj/item/fishing_rod/proc/create_fishing_line(atom/movable/target, target_py = null) if(!display_fishing_line) @@ -205,22 +195,26 @@ qdel(source) return BEAM_CANCEL_DRAW -/obj/item/fishing_rod/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/fishing_rod/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return ranged_interact_with_atom(interacting_with, user, modifiers) + +/obj/item/fishing_rod/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!hook) + balloon_alert(user, "install a hook first!") + return ITEM_INTERACT_BLOCKING - /// Reel in if able + // Reel in if able if(currently_hooked) reel(user) - return . - - cast_line(target, user, proximity_flag) + return ITEM_INTERACT_BLOCKING - return . + SEND_SIGNAL(interacting_with, COMSIG_PRE_FISHING) + cast_line(interacting_with, user) + return ITEM_INTERACT_SUCCESS -///Called by afterattack(). If the line to whatever that is is clear and we're not already busy, try fishing in it -/obj/item/fishing_rod/proc/cast_line(atom/target, mob/user, proximity_flag) - if(casting || currently_hooked || proximity_flag) +/// If the line to whatever that is is clear and we're not already busy, try fishing in it +/obj/item/fishing_rod/proc/cast_line(atom/target, mob/user) + if(casting || currently_hooked) return if(!hook) balloon_alert(user, "install a hook first!") @@ -230,8 +224,6 @@ return if(!COOLDOWN_FINISHED(src, casting_cd)) return - /// Annoyingly pre attack is only called in melee - SEND_SIGNAL(target, COMSIG_PRE_FISHING) casting = TRUE var/obj/projectile/fishing_cast/cast_projectile = new(get_turf(src)) cast_projectile.range = cast_range diff --git a/code/modules/hydroponics/beekeeping/bee_smoker.dm b/code/modules/hydroponics/beekeeping/bee_smoker.dm index fc296339a9f74..91195dacc84d7 100644 --- a/code/modules/hydroponics/beekeeping/bee_smoker.dm +++ b/code/modules/hydroponics/beekeeping/bee_smoker.dm @@ -36,40 +36,33 @@ user.balloon_alert(user, "[activated ? "activated" : "deactivated"]") return TRUE -/obj/item/bee_smoker/afterattack(atom/attacked_atom, mob/living/user, proximity) - . = ..() - - if(!proximity) - return - - . |= AFTERATTACK_PROCESSED_ITEM - +/obj/item/bee_smoker/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!activated) user.balloon_alert(user, "not activated!") - return + return ITEM_INTERACT_BLOCKING if(current_herb_fuel < single_use_cost) user.balloon_alert(user, "not enough fuel!") - return + return ITEM_INTERACT_BLOCKING current_herb_fuel -= single_use_cost playsound(src, 'sound/effects/spray2.ogg', 100, TRUE) - var/turf/target_turf = get_turf(attacked_atom) + var/turf/target_turf = get_turf(interacting_with) new /obj/effect/temp_visual/mook_dust(target_turf) - for(var/mob/living/basic/bee/friend in target_turf) if(friend.flags_1 & HOLOGRAM_1) continue friend.befriend(user) - if(!istype(attacked_atom, /obj/structure/beebox)) - return + if(!istype(interacting_with, /obj/structure/beebox)) + return ITEM_INTERACT_BLOCKING - var/obj/structure/beebox/hive = attacked_atom + var/obj/structure/beebox/hive = interacting_with for(var/mob/living/bee as anything in hive.bees) if(bee.flags_1 & HOLOGRAM_1) continue bee.befriend(user) + return ITEM_INTERACT_SUCCESS /obj/item/bee_smoker/attackby(obj/item/herb, mob/living/carbon/human/user, list/modifiers) . = ..() diff --git a/code/modules/hydroponics/unique_plant_genes.dm b/code/modules/hydroponics/unique_plant_genes.dm index 99c877cdfbe4d..c3855ff6939e8 100644 --- a/code/modules/hydroponics/unique_plant_genes.dm +++ b/code/modules/hydroponics/unique_plant_genes.dm @@ -76,24 +76,9 @@ return /// Signal proc for [COMSIG_ITEM_AFTERATTACK] that allows for effects after an attack is done -/datum/plant_gene/trait/attack/proc/after_plant_attack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) +/datum/plant_gene/trait/attack/proc/after_plant_attack(obj/item/source, atom/target, mob/user, click_parameters) SIGNAL_HANDLER - - if(!proximity_flag) - return - - if(!ismovable(target)) - return - - . |= COMPONENT_AFTERATTACK_PROCESSED_ITEM - - if(isobj(target)) - var/obj/object_target = target - if(!(object_target.obj_flags & CAN_BE_HIT)) - return . - INVOKE_ASYNC(src, PROC_REF(after_attack_effect), source, target, user) - return . /* * Effects done when we hit people with our plant, AFTER the attack is done. diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index da9fafbd0c991..dd0a8dcd47c15 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -173,7 +173,7 @@ spawned_human.mind.adjust_experience(i, roundstart_experience[i], TRUE) /// Return the outfit to use -/datum/job/proc/get_outfit() +/datum/job/proc/get_outfit(consistent) return outfit /// Announce that this job as joined the round to all crew members. @@ -188,12 +188,12 @@ return TRUE -/mob/living/proc/on_job_equipping(datum/job/equipping) +/mob/living/proc/on_job_equipping(datum/job/equipping, client/player_client) return #define VERY_LATE_ARRIVAL_TOAST_PROB 20 -/mob/living/carbon/human/on_job_equipping(datum/job/equipping) +/mob/living/carbon/human/on_job_equipping(datum/job/equipping, client/player_client) if(equipping.paycheck_department) var/datum/bank_account/bank_account = new(real_name, equipping, dna.species.payday_modifier) bank_account.payday(STARTING_PAYCHECKS, TRUE) @@ -201,19 +201,24 @@ bank_account.replaceable = FALSE add_mob_memory(/datum/memory/key/account, remembered_id = account_id) - dress_up_as_job(equipping) + dress_up_as_job( + equipping = equipping, + visual_only = FALSE, + player_client = player_client, + consistent = FALSE, + ) if(EMERGENCY_PAST_POINT_OF_NO_RETURN && prob(VERY_LATE_ARRIVAL_TOAST_PROB)) equip_to_slot_or_del(new /obj/item/food/griddle_toast(src), ITEM_SLOT_MASK) #undef VERY_LATE_ARRIVAL_TOAST_PROB -/mob/living/proc/dress_up_as_job(datum/job/equipping, visual_only = FALSE) +/mob/living/proc/dress_up_as_job(datum/job/equipping, visual_only = FALSE, client/player_client, consistent = FALSE) return -/mob/living/carbon/human/dress_up_as_job(datum/job/equipping, visual_only = FALSE) +/mob/living/carbon/human/dress_up_as_job(datum/job/equipping, visual_only = FALSE, client/player_client, consistent = FALSE) dna.species.pre_equip_species_outfit(equipping, src, visual_only) - equipOutfit(equipping.get_outfit(), visual_only) + equip_outfit_and_loadout(equipping.get_outfit(consistent), player_client?.prefs, visual_only) /datum/job/proc/announce_head(mob/living/carbon/human/H, channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels. if(H && GLOB.announcement_systems.len) diff --git a/code/modules/jobs/job_types/assistant/assistant.dm b/code/modules/jobs/job_types/assistant/assistant.dm index c97c987cb5838..2732d5e21ca9c 100644 --- a/code/modules/jobs/job_types/assistant/assistant.dm +++ b/code/modules/jobs/job_types/assistant/assistant.dm @@ -37,7 +37,9 @@ Assistant rpg_title = "Lout" config_tag = "ASSISTANT" -/datum/job/assistant/get_outfit() +/datum/job/assistant/get_outfit(consistent) + if(consistent) + return /datum/outfit/job/assistant/consistent if(!HAS_TRAIT(SSstation, STATION_TRAIT_ASSISTANT_GIMMICKS)) return ..() diff --git a/code/modules/jobs/job_types/assistant/gimmick_assistants.dm b/code/modules/jobs/job_types/assistant/gimmick_assistants.dm index 7c2ac4a2df2b2..ed2851366153c 100644 --- a/code/modules/jobs/job_types/assistant/gimmick_assistants.dm +++ b/code/modules/jobs/job_types/assistant/gimmick_assistants.dm @@ -111,6 +111,7 @@ continue var/obj/structure/mop_bucket/bucket = new /obj/structure/mop_bucket(turf) equipped.start_pulling(bucket) + break /datum/outfit/job/assistant/gimmick/broomer name = "Gimmick Assistant - Broomer" diff --git a/code/modules/library/bibles.dm b/code/modules/library/bibles.dm index 31630c550a1d5..8c2ad28feadf8 100644 --- a/code/modules/library/bibles.dm +++ b/code/modules/library/bibles.dm @@ -269,49 +269,48 @@ GLOBAL_LIST_INIT(bibleitemstates, list( playsound(target_mob, SFX_PUNCH, 25, TRUE, -1) log_combat(user, target_mob, "attacked", src) -/obj/item/book/bible/attackby_storage_insert(datum/storage, atom/storage_holder, mob/user) +/obj/item/book/bible/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/user) return !istype(storage_holder, /obj/item/book/bible) -/obj/item/book/bible/afterattack(atom/bible_smacked, mob/user, proximity_flag, click_parameters) - . = ..() - if(!proximity_flag) - return - if(SEND_SIGNAL(bible_smacked, COMSIG_BIBLE_SMACKED, user, proximity_flag, click_parameters) & COMSIG_END_BIBLE_CHAIN) - return . | AFTERATTACK_PROCESSED_ITEM +/obj/item/book/bible/interact_with_atom(atom/bible_smacked, mob/living/user, list/modifiers) + if(SEND_SIGNAL(bible_smacked, COMSIG_BIBLE_SMACKED, user) & COMSIG_END_BIBLE_CHAIN) + return ITEM_INTERACT_SUCCESS if(isfloorturf(bible_smacked)) if(user.mind?.holy_role) var/area/current_area = get_area(bible_smacked) if(!GLOB.chaplain_altars.len && istype(current_area, /area/station/service/chapel)) make_new_altar(bible_smacked, user) - return + return ITEM_INTERACT_SUCCESS for(var/obj/effect/rune/nearby_runes in range(2, user)) nearby_runes.SetInvisibility(INVISIBILITY_NONE, id=type, priority=INVISIBILITY_PRIORITY_BASIC_ANTI_INVISIBILITY) bible_smacked.balloon_alert(user, "floor smacked!") + return ITEM_INTERACT_SUCCESS if(user.mind?.holy_role) - if(bible_smacked.reagents && bible_smacked.reagents.has_reagent(/datum/reagent/water)) // blesses all the water in the holder - . |= AFTERATTACK_PROCESSED_ITEM + if(bible_smacked.reagents?.has_reagent(/datum/reagent/water)) // blesses all the water in the holder bible_smacked.balloon_alert(user, "blessed") var/water2holy = bible_smacked.reagents.get_reagent_amount(/datum/reagent/water) bible_smacked.reagents.del_reagent(/datum/reagent/water) bible_smacked.reagents.add_reagent(/datum/reagent/water/holywater,water2holy) - if(bible_smacked.reagents && bible_smacked.reagents.has_reagent(/datum/reagent/fuel/unholywater)) // yeah yeah, copy pasted code - sue me - . |= AFTERATTACK_PROCESSED_ITEM + . = ITEM_INTERACT_SUCCESS + if(bible_smacked.reagents?.has_reagent(/datum/reagent/fuel/unholywater)) // yeah yeah, copy pasted code - sue me bible_smacked.balloon_alert(user, "purified") var/unholy2holy = bible_smacked.reagents.get_reagent_amount(/datum/reagent/fuel/unholywater) bible_smacked.reagents.del_reagent(/datum/reagent/fuel/unholywater) bible_smacked.reagents.add_reagent(/datum/reagent/water/holywater,unholy2holy) + . = ITEM_INTERACT_SUCCESS if(istype(bible_smacked, /obj/item/book/bible) && !istype(bible_smacked, /obj/item/book/bible/syndicate)) - . |= AFTERATTACK_PROCESSED_ITEM bible_smacked.balloon_alert(user, "converted") var/obj/item/book/bible/other_bible = bible_smacked other_bible.name = name other_bible.icon_state = icon_state other_bible.inhand_icon_state = inhand_icon_state other_bible.deity_name = deity_name + . = ITEM_INTERACT_SUCCESS + if(.) + return . if(istype(bible_smacked, /obj/item/cult_bastard) && !IS_CULTIST(user)) - . |= AFTERATTACK_PROCESSED_ITEM var/obj/item/cult_bastard/sword = bible_smacked bible_smacked.balloon_alert(user, "exorcising...") playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,TRUE) @@ -333,6 +332,9 @@ GLOBAL_LIST_INIT(bibleitemstates, list( new /obj/item/nullrod/claymore(get_turf(sword)) user.visible_message(span_notice("[user] exorcises [sword]!")) qdel(sword) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING + return NONE /obj/item/book/bible/booze desc = "To be applied to the head repeatedly." diff --git a/code/modules/loadout/categories/accessories.dm b/code/modules/loadout/categories/accessories.dm new file mode 100644 index 0000000000000..0dd655358bd68 --- /dev/null +++ b/code/modules/loadout/categories/accessories.dm @@ -0,0 +1,92 @@ +/// Accessory Items (Moves overrided items to backpack) +/datum/loadout_category/accessories + category_name = "Accessory" + category_ui_icon = FA_ICON_VEST + type_to_generate = /datum/loadout_item/accessory + tab_order = /datum/loadout_category/head::tab_order + 3 + +/datum/loadout_item/accessory + abstract_type = /datum/loadout_item/accessory + /// Can we adjust this accessory to be above or below suits? + VAR_FINAL/can_be_layer_adjusted = FALSE + +/datum/loadout_item/accessory/New() + . = ..() + if(ispath(item_path, /obj/item/clothing/accessory)) + can_be_layer_adjusted = TRUE + +/datum/loadout_item/accessory/get_ui_buttons() + if(!can_be_layer_adjusted) + return ..() + + var/list/buttons = ..() + + UNTYPED_LIST_ADD(buttons, list( + "label" = "Layer", + "act_key" = "set_layer", + "active_key" = INFO_LAYER, + "active_text" = "Above Suit", + "inactive_text" = "Below Suit", + )) + + return buttons + +/datum/loadout_item/accessory/handle_loadout_action(datum/preference_middleware/loadout/manager, mob/user, action, params) + if(action == "set_layer") + return set_accessory_layer(manager, user) + + return ..() + +/datum/loadout_item/accessory/proc/set_accessory_layer(datum/preference_middleware/loadout/manager, mob/user) + if(!can_be_layer_adjusted) + return FALSE + + var/list/loadout = manager.preferences.read_preference(/datum/preference/loadout) + if(!loadout?[item_path]) + return FALSE + + if(isnull(loadout[item_path][INFO_LAYER])) + loadout[item_path][INFO_LAYER] = FALSE + + loadout[item_path][INFO_LAYER] = !loadout[item_path][INFO_LAYER] + manager.preferences.update_preference(GLOB.preference_entries[/datum/preference/loadout], loadout) + return TRUE // Update UI + +/datum/loadout_item/accessory/insert_path_into_outfit(datum/outfit/outfit, mob/living/carbon/human/equipper, visuals_only = FALSE) + if(outfit.accessory) + LAZYADD(outfit.backpack_contents, outfit.accessory) + outfit.accessory = item_path + +/datum/loadout_item/accessory/on_equip_item( + obj/item/clothing/accessory/equipped_item, + datum/preferences/preference_source, + list/preference_list, + mob/living/carbon/human/equipper, + visuals_only = FALSE, +) + . = ..() + if(istype(equipped_item)) + equipped_item.above_suit = !!preference_list[item_path]?[INFO_LAYER] + . |= (ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING) + +/datum/loadout_item/accessory/maid_apron + name = "Maid Apron" + item_path = /obj/item/clothing/accessory/maidapron + +/datum/loadout_item/accessory/waistcoat + name = "Waistcoat" + item_path = /obj/item/clothing/accessory/waistcoat + +/datum/loadout_item/accessory/pocket_protector + name = "Pocket Protector" + item_path = /obj/item/clothing/accessory/pocketprotector + +/datum/loadout_item/accessory/full_pocket_protector + name = "Pocket Protector (Filled)" + item_path = /obj/item/clothing/accessory/pocketprotector/full + additional_displayed_text = list("Contains pens") + +/datum/loadout_item/accessory/pride + name = "Pride Pin" + item_path = /obj/item/clothing/accessory/pride + can_be_reskinned = TRUE diff --git a/code/modules/loadout/categories/glasses.dm b/code/modules/loadout/categories/glasses.dm new file mode 100644 index 0000000000000..5b8ff85620005 --- /dev/null +++ b/code/modules/loadout/categories/glasses.dm @@ -0,0 +1,55 @@ +/// Glasses Slot Items (Moves overrided items to backpack) +/datum/loadout_category/glasses + category_name = "Glasses" + category_ui_icon = FA_ICON_GLASSES + type_to_generate = /datum/loadout_item/glasses + tab_order = /datum/loadout_category/head::tab_order + 1 + +/datum/loadout_item/glasses + abstract_type = /datum/loadout_item/glasses + +/datum/loadout_item/glasses/insert_path_into_outfit(datum/outfit/outfit, mob/living/carbon/human/equipper, visuals_only = FALSE) + if(outfit.glasses) + LAZYADD(outfit.backpack_contents, outfit.glasses) + outfit.glasses = item_path + +/datum/loadout_item/glasses/prescription_glasses + name = "Glasses" + item_path = /obj/item/clothing/glasses/regular + additional_displayed_text = list("Prescription") + +/datum/loadout_item/glasses/prescription_glasses/circle_glasses + name = "Circle Glasses" + item_path = /obj/item/clothing/glasses/regular/circle + +/datum/loadout_item/glasses/prescription_glasses/hipster_glasses + name = "Hipster Glasses" + item_path = /obj/item/clothing/glasses/regular/hipster + +/datum/loadout_item/glasses/prescription_glasses/jamjar_glasses + name = "Jamjar Glasses" + item_path = /obj/item/clothing/glasses/regular/jamjar + +/datum/loadout_item/glasses/black_blindfold + name = "Black Blindfold" + item_path = /obj/item/clothing/glasses/blindfold + +/datum/loadout_item/glasses/cold_glasses + name = "Cold Glasses" + item_path = /obj/item/clothing/glasses/cold + +/datum/loadout_item/glasses/heat_glasses + name = "Heat Glasses" + item_path = /obj/item/clothing/glasses/heat + +/datum/loadout_item/glasses/orange_glasses + name = "Orange Glasses" + item_path = /obj/item/clothing/glasses/orange + +/datum/loadout_item/glasses/red_glasses + name = "Red Glasses" + item_path = /obj/item/clothing/glasses/red + +/datum/loadout_item/glasses/eyepatch + name = "Eyepatch" + item_path = /obj/item/clothing/glasses/eyepatch diff --git a/code/modules/loadout/categories/heads.dm b/code/modules/loadout/categories/heads.dm new file mode 100644 index 0000000000000..6b939495684ba --- /dev/null +++ b/code/modules/loadout/categories/heads.dm @@ -0,0 +1,138 @@ +/// Head Slot Items (Deletes overrided items) +/datum/loadout_category/head + category_name = "Head" + category_ui_icon = FA_ICON_HAT_COWBOY + type_to_generate = /datum/loadout_item/head + tab_order = 1 + +/datum/loadout_item/head + abstract_type = /datum/loadout_item/head + +/datum/loadout_item/head/insert_path_into_outfit(datum/outfit/outfit, mob/living/carbon/human/equipper, visuals_only = FALSE) + if(equipper.dna?.species?.outfit_important_for_life) + if(!visuals_only) + to_chat(equipper, "Your loadout helmet was not equipped directly due to your species outfit.") + LAZYADD(outfit.backpack_contents, item_path) + else + outfit.head = item_path + +/datum/loadout_item/head/beanie + name = "Beanie (Colorable)" + item_path = /obj/item/clothing/head/beanie + +/datum/loadout_item/head/fancy_cap + name = "Fancy Hat (Colorable)" + item_path = /obj/item/clothing/head/costume/fancy + +/datum/loadout_item/head/red_beret + name = "Red Beret (Colorable)" + item_path = /obj/item/clothing/head/beret + +/datum/loadout_item/head/black_cap + name = "Cap (Black)" + item_path = /obj/item/clothing/head/soft/black + +/datum/loadout_item/head/blue_cap + name = "Cap (Blue)" + item_path = /obj/item/clothing/head/soft/blue + +/datum/loadout_item/head/delinquent_cap + name = "Cap (Delinquent)" + item_path = /obj/item/clothing/head/costume/delinquent + +/datum/loadout_item/head/green_cap + name = "Cap (Green)" + item_path = /obj/item/clothing/head/soft/green + +/datum/loadout_item/head/grey_cap + name = "Cap (Grey)" + item_path = /obj/item/clothing/head/soft/grey + +/datum/loadout_item/head/orange_cap + name = "Cap (Orange)" + item_path = /obj/item/clothing/head/soft/orange + +/datum/loadout_item/head/purple_cap + name = "Cap (Purple)" + item_path = /obj/item/clothing/head/soft/purple + +/datum/loadout_item/head/rainbow_cap + name = "Cap (Rainbow)" + item_path = /obj/item/clothing/head/soft/rainbow + +/datum/loadout_item/head/red_cap + name = "Cap (Red)" + item_path = /obj/item/clothing/head/soft/red + +/datum/loadout_item/head/white_cap + name = "Cap (White)" + item_path = /obj/item/clothing/head/soft + +/datum/loadout_item/head/yellow_cap + name = "Cap (Yellow)" + item_path = /obj/item/clothing/head/soft/yellow + +/datum/loadout_item/head/flatcap + name = "Cap (Flat)" + item_path = /obj/item/clothing/head/flatcap + +/datum/loadout_item/head/beige_fedora + name = "Fedora (Beige)" + item_path = /obj/item/clothing/head/fedora/beige + +/datum/loadout_item/head/black_fedora + name = "Fedora (Black)" + item_path = /obj/item/clothing/head/fedora + +/datum/loadout_item/head/white_fedora + name = "Fedora (White)" + item_path = /obj/item/clothing/head/fedora/white + +/datum/loadout_item/head/mail_cap + name = "Cap (Mail)" + item_path = /obj/item/clothing/head/costume/mailman + +/datum/loadout_item/head/kitty_ears + name = "Kitty Ears" + item_path = /obj/item/clothing/head/costume/kitty + +/datum/loadout_item/head/rabbit_ears + name = "Rabbit Ears" + item_path = /obj/item/clothing/head/costume/rabbitears + +/datum/loadout_item/head/bandana + name = "Bandana Thin" + item_path = /obj/item/clothing/head/costume/tmc + +/datum/loadout_item/head/rastafarian + name = "Cap (Rastafarian)" + item_path = /obj/item/clothing/head/rasta + +/datum/loadout_item/head/top_hat + name = "Top Hat" + item_path = /obj/item/clothing/head/hats/tophat + +/datum/loadout_item/head/bowler_hat + name = "Bowler Hat" + item_path = /obj/item/clothing/head/hats/bowler + +/datum/loadout_item/head/bear_pelt + name = "Bear Pelt" + item_path = /obj/item/clothing/head/costume/bearpelt + +/datum/loadout_item/head/ushanka + name ="Ushanka" + item_path = /obj/item/clothing/head/costume/ushanka + +/datum/loadout_item/head/plague_doctor + name = "Cap (Plague Doctor)" + item_path = /obj/item/clothing/head/bio_hood/plague + +/datum/loadout_item/head/rose + name = "Rose" + item_path = /obj/item/food/grown/rose + +/datum/loadout_item/head/wig + name = "Wig" + item_path = /obj/item/clothing/head/wig/natural + additional_displayed_text = list("Hair Color") diff --git a/code/modules/loadout/categories/inhands.dm b/code/modules/loadout/categories/inhands.dm new file mode 100644 index 0000000000000..8ddc15676ab32 --- /dev/null +++ b/code/modules/loadout/categories/inhands.dm @@ -0,0 +1,33 @@ +/// Inhand items (Moves overrided items to backpack) +/datum/loadout_category/inhands + category_name = "Inhand" + category_ui_icon = FA_ICON_BRIEFCASE + type_to_generate = /datum/loadout_item/inhand + tab_order = /datum/loadout_category/head::tab_order + 4 + +/datum/loadout_item/inhand + abstract_type = /datum/loadout_item/inhand + +/datum/loadout_item/inhand/insert_path_into_outfit(datum/outfit/outfit, mob/living/carbon/human/equipper, visuals_only = FALSE) + if(outfit.l_hand && !outfit.r_hand) + outfit.r_hand = item_path + else + if(outfit.l_hand) + LAZYADD(outfit.backpack_contents, outfit.l_hand) + outfit.l_hand = item_path + +/datum/loadout_item/inhand/cane + name = "Cane" + item_path = /obj/item/cane + +/datum/loadout_item/inhand/cane_white + name = "White Cane" + item_path = /obj/item/cane/white + +/datum/loadout_item/inhand/briefcase + name = "Briefcase (Leather)" + item_path = /obj/item/storage/briefcase + +/datum/loadout_item/inhand/briefcase_secure + name = "Briefcase (Secure)" + item_path = /obj/item/storage/briefcase/secure diff --git a/code/modules/loadout/categories/neck.dm b/code/modules/loadout/categories/neck.dm new file mode 100644 index 0000000000000..a48597b3b9e51 --- /dev/null +++ b/code/modules/loadout/categories/neck.dm @@ -0,0 +1,36 @@ +/// Neck Slot Items (Deletes overrided items) +/datum/loadout_category/neck + category_name = "Neck" + category_ui_icon = FA_ICON_USER_TIE + type_to_generate = /datum/loadout_item/neck + tab_order = /datum/loadout_category/head::tab_order + 2 + +/datum/loadout_item/neck + abstract_type = /datum/loadout_item/neck + +/datum/loadout_item/neck/insert_path_into_outfit(datum/outfit/outfit, mob/living/carbon/human/equipper, visuals_only = FALSE) + outfit.neck = item_path + +/datum/loadout_item/neck/scarf_greyscale + name = "Scarf (Colorable)" + item_path = /obj/item/clothing/neck/scarf + +/datum/loadout_item/neck/greyscale_large + name = "Scarf (Large, Colorable)" + item_path = /obj/item/clothing/neck/large_scarf + +/datum/loadout_item/neck/greyscale_larger + name = "Scarf (Larger, Colorable)" + item_path = /obj/item/clothing/neck/infinity_scarf + +/datum/loadout_item/neck/necktie + name = "Necktie (Colorable)" + item_path = /obj/item/clothing/neck/tie + +/datum/loadout_item/neck/necktie_disco + name = "Necktie (Ugly)" + item_path = /obj/item/clothing/neck/tie/horrible + +/datum/loadout_item/neck/necktie_loose + name = "Necktie (Loose)" + item_path = /obj/item/clothing/neck/tie/detective diff --git a/code/modules/loadout/categories/pocket.dm b/code/modules/loadout/categories/pocket.dm new file mode 100644 index 0000000000000..e1cddde76e5b9 --- /dev/null +++ b/code/modules/loadout/categories/pocket.dm @@ -0,0 +1,203 @@ +/// Pocket items (Moved to backpack) +/datum/loadout_category/pocket + category_name = "Other" + category_ui_icon = FA_ICON_QUESTION + type_to_generate = /datum/loadout_item/pocket_items + tab_order = /datum/loadout_category/head::tab_order + 5 + /// How many pocket items are allowed + VAR_PRIVATE/max_allowed = 2 + +/datum/loadout_category/pocket/New() + . = ..() + category_info = "([max_allowed] allowed)" + +/datum/loadout_category/pocket/handle_duplicate_entires( + datum/preference_middleware/loadout/manager, + datum/loadout_item/conflicting_item, + datum/loadout_item/added_item, + list/datum/loadout_item/all_loadout_items, +) + var/list/datum/loadout_item/pocket_items/other_pocket_items = list() + for(var/datum/loadout_item/pocket_items/other_pocket_item in all_loadout_items) + other_pocket_items += other_pocket_item + + if(length(other_pocket_items) >= max_allowed) + // We only need to deselect something if we're above the limit + // (And if we are we prioritize the first item found, FIFO) + manager.deselect_item(other_pocket_items[1]) + return TRUE + +/datum/loadout_item/pocket_items + abstract_type = /datum/loadout_item/pocket_items + +/datum/loadout_item/pocket_items/on_equip_item( + obj/item/equipped_item, + datum/preferences/preference_source, + list/preference_list, + mob/living/carbon/human/equipper, + visuals_only = FALSE, +) + // Backpack items aren't created if it's a visual equipping, so don't do any on equip stuff. It doesn't exist. + if(visuals_only) + return NONE + + return ..() + +/datum/loadout_item/pocket_items/lipstick_black + name = "Lipstick (Black)" + item_path = /obj/item/lipstick/black + additional_displayed_text = list("Black") + +/datum/loadout_item/pocket_items/lipstick_blue + name = "Lipstick (Blue)" + item_path = /obj/item/lipstick/blue + additional_displayed_text = list("Blue") + + +/datum/loadout_item/pocket_items/lipstick_green + name = "Lipstick (Green)" + item_path = /obj/item/lipstick/green + additional_displayed_text = list("Green") + + +/datum/loadout_item/pocket_items/lipstick_jade + name = "Lipstick (Jade)" + item_path = /obj/item/lipstick/jade + additional_displayed_text = list("Jade") + +/datum/loadout_item/pocket_items/lipstick_purple + name = "Lipstick (Purple)" + item_path = /obj/item/lipstick/purple + additional_displayed_text = list("Purple") + +/datum/loadout_item/pocket_items/lipstick_red + name = "Lipstick (Red)" + item_path = /obj/item/lipstick + additional_displayed_text = list("Red") + +/datum/loadout_item/pocket_items/lipstick_white + name = "Lipstick (White)" + item_path = /obj/item/lipstick/white + additional_displayed_text = list("White") + +/datum/loadout_item/pocket_items/plush + abstract_type = /datum/loadout_item/pocket_items/plush + can_be_named = TRUE + +/datum/loadout_item/pocket_items/plush/bee + name = "Plush (Bee)" + item_path = /obj/item/toy/plush/beeplushie + +/datum/loadout_item/pocket_items/plush/carp + name = "Plush (Carp)" + item_path = /obj/item/toy/plush/carpplushie + +/datum/loadout_item/pocket_items/plush/lizard_greyscale + name = "Plush (Lizard, Colorable)" + item_path = /obj/item/toy/plush/lizard_plushie/greyscale + +/datum/loadout_item/pocket_items/plush/lizard_random + name = "Plush (Lizard, Random)" + can_be_greyscale = DONT_GREYSCALE + item_path = /obj/item/toy/plush/lizard_plushie + additional_displayed_text = list("Random color") + +/datum/loadout_item/pocket_items/plush/moth + name = "Plush (Moth)" + item_path = /obj/item/toy/plush/moth + +/datum/loadout_item/pocket_items/plush/narsie + name = "Plush (Nar'sie)" + item_path = /obj/item/toy/plush/narplush + +/datum/loadout_item/pocket_items/plush/nukie + name = "Plush (Nukie)" + item_path = /obj/item/toy/plush/nukeplushie + +/datum/loadout_item/pocket_items/plush/peacekeeper + name = "Plush (Peacekeeper)" + item_path = /obj/item/toy/plush/pkplush + +/datum/loadout_item/pocket_items/plush/plasmaman + name = "Plush (Plasmaman)" + item_path = /obj/item/toy/plush/plasmamanplushie + +/datum/loadout_item/pocket_items/plush/ratvar + name = "Plush (Ratvar)" + item_path = /obj/item/toy/plush/ratplush + +/datum/loadout_item/pocket_items/plush/rouny + name = "Plush (Rouny)" + item_path = /obj/item/toy/plush/rouny + +/datum/loadout_item/pocket_items/plush/snake + name = "Plush (Snake)" + item_path = /obj/item/toy/plush/snakeplushie + +/datum/loadout_item/pocket_items/card_binder + name = "Card Binder" + item_path = /obj/item/storage/card_binder + +/datum/loadout_item/pocket_items/card_deck + name = "Playing Card Deck" + item_path = /obj/item/toy/cards/deck + +/datum/loadout_item/pocket_items/kotahi_deck + name = "Kotahi Deck" + item_path = /obj/item/toy/cards/deck/kotahi + +/datum/loadout_item/pocket_items/wizoff_deck + name = "Wizoff Deck" + item_path = /obj/item/toy/cards/deck/wizoff + +/datum/loadout_item/pocket_items/dice_bag + name = "Dice Bag" + item_path = /obj/item/storage/dice + +/datum/loadout_item/pocket_items/d1 + name = "D1" + item_path = /obj/item/dice/d1 + +/datum/loadout_item/pocket_items/d2 + name = "D2" + item_path = /obj/item/dice/d2 + +/datum/loadout_item/pocket_items/d4 + name = "D4" + item_path = /obj/item/dice/d4 + +/datum/loadout_item/pocket_items/d6 + name = "D6" + item_path = /obj/item/dice/d6 + +/datum/loadout_item/pocket_items/d6_ebony + name = "D6 (Ebony)" + item_path = /obj/item/dice/d6/ebony + +/datum/loadout_item/pocket_items/d6_space + name = "D6 (Space)" + item_path = /obj/item/dice/d6/space + +/datum/loadout_item/pocket_items/d8 + name = "D8" + item_path = /obj/item/dice/d8 + +/datum/loadout_item/pocket_items/d10 + name = "D10" + item_path = /obj/item/dice/d10 + +/datum/loadout_item/pocket_items/d12 + name = "D12" + item_path = /obj/item/dice/d12 + +/datum/loadout_item/pocket_items/d20 + name = "D20" + item_path = /obj/item/dice/d20 + +/datum/loadout_item/pocket_items/d100 + name = "D100" + item_path = /obj/item/dice/d100 + +/datum/loadout_item/pocket_items/d00 + name = "D00" + item_path = /obj/item/dice/d00 diff --git a/code/modules/loadout/loadout_categories.dm b/code/modules/loadout/loadout_categories.dm new file mode 100644 index 0000000000000..760d3f597986c --- /dev/null +++ b/code/modules/loadout/loadout_categories.dm @@ -0,0 +1,79 @@ +/** + * # Loadout categories + * + * Loadout categories are singletons used to group loadout items together in the loadout screen. + */ +/datum/loadout_category + /// The name of the category, shown in the tabs + var/category_name + /// FontAwesome icon for the category + var/category_ui_icon + /// String to display on the top-right of a category tab + var/category_info + /// Order which they appear in the tabs, ties go alphabetically + var/tab_order = -1 + /// What type of loadout items should be generated for this category? + var/type_to_generate + /// List of all loadout items in this category + VAR_FINAL/list/datum/loadout_item/associated_items + +/datum/loadout_category/New() + . = ..() + associated_items = get_items() + for(var/datum/loadout_item/item as anything in associated_items) + if(GLOB.all_loadout_datums[item.item_path]) + stack_trace("Loadout datum collision - [item.item_path] is shared between multiple loadout datums.") + GLOB.all_loadout_datums[item.item_path] = item + +/datum/loadout_category/Destroy(force, ...) + if(!force) + stack_trace("QDEL called on loadout category [type]. This shouldn't ever happen. (Use FORCE if necessary.)") + return QDEL_HINT_LETMELIVE + + associated_items.Cut() + return ..() + +/// Return a list of all /datum/loadout_items in this category. +/datum/loadout_category/proc/get_items() as /list + var/list/all_items = list() + for(var/datum/loadout_item/found_type as anything in typesof(type_to_generate)) + if(found_type == initial(found_type.abstract_type)) + continue + + if(!ispath(initial(found_type.item_path), /obj/item)) + stack_trace("Loadout get_items(): Attempted to instantiate a loadout item ([found_type]) with an invalid or null typepath! (got path: [initial(found_type.item_path)])") + continue + + var/datum/loadout_item/spawned_type = new found_type(src) + all_items += spawned_type + + return all_items + +/// Returns a list of all /datum/loadout_items in this category, formatted for UI use. Only ran once. +/datum/loadout_category/proc/items_to_ui_data() as /list + if(!length(associated_items)) + return list() + + var/list/formatted_list = list() + + for(var/datum/loadout_item/item as anything in associated_items) + var/list/item_data = item.to_ui_data() + UNTYPED_LIST_ADD(formatted_list, item_data) + + sortTim(formatted_list, /proc/cmp_assoc_list_name) // Alphabetizing + return formatted_list + +/** + * Handles what happens when two items of this category are selected at once + * + * Return TRUE if it's okay to continue with adding the incoming item, + * or return FALSE to stop the new item from being added + */ +/datum/loadout_category/proc/handle_duplicate_entires( + datum/preference_middleware/loadout/manager, + datum/loadout_item/conflicting_item, + datum/loadout_item/added_item, + list/datum/loadout_item/all_loadout_items, +) + manager.deselect_item(conflicting_item) + return TRUE diff --git a/code/modules/loadout/loadout_helpers.dm b/code/modules/loadout/loadout_helpers.dm new file mode 100644 index 0000000000000..bbab79b633325 --- /dev/null +++ b/code/modules/loadout/loadout_helpers.dm @@ -0,0 +1,80 @@ +/** + * Equips this mob with a given outfit and loadout items as per the passed preferences. + * + * Loadout items override the pre-existing item in the corresponding slot of the job outfit. + * Some job items are preserved after being overridden - belt items, ear items, and glasses. + * The rest of the slots, the items are overridden completely and deleted. + * + * Species with special outfits are snowflaked to have loadout items placed in their bags instead of overriding the outfit. + * + * * outfit - the job outfit we're equipping + * * preference_source - the preferences to draw loadout items from. + * * visuals_only - whether we call special equipped procs, or if we just look like we equipped it + */ +/mob/living/carbon/human/proc/equip_outfit_and_loadout( + datum/outfit/outfit = /datum/outfit, + datum/preferences/preference_source, + visuals_only = FALSE, +) + if(isnull(preference_source)) + return equipOutfit(outfit, visuals_only) + + var/datum/outfit/equipped_outfit + if(ispath(outfit, /datum/outfit)) + equipped_outfit = new outfit() + else if(istype(outfit, /datum/outfit)) + equipped_outfit = outfit + else + CRASH("Invalid outfit passed to equip_outfit_and_loadout ([outfit])") + + var/list/preference_list = preference_source.read_preference(/datum/preference/loadout) + var/list/loadout_datums = loadout_list_to_datums(preference_list) + // Slap our things into the outfit given + for(var/datum/loadout_item/item as anything in loadout_datums) + item.insert_path_into_outfit(equipped_outfit, src, visuals_only) + // Equip the outfit loadout items included + if(!equipped_outfit.equip(src, visuals_only)) + return FALSE + // Handle any snowflake on_equips + var/list/new_contents = get_all_gear() + var/update = NONE + for(var/datum/loadout_item/item as anything in loadout_datums) + var/obj/item/equipped = locate(item.item_path) in new_contents + if(isnull(equipped)) + continue + update |= item.on_equip_item( + equipped_item = equipped, + preference_source = preference_source, + preference_list = preference_list, + equipper = src, + visuals_only = visuals_only, + ) + + if(update) + update_clothing(update) + + return TRUE + +/** + * Takes a list of paths (such as a loadout list) + * and returns a list of their singleton loadout item datums + * + * loadout_list - the list being checked + * + * Returns a list of singleton datums + */ +/proc/loadout_list_to_datums(list/loadout_list) as /list + var/list/datums = list() + + if(!length(GLOB.all_loadout_datums)) + CRASH("No loadout datums in the global loadout list!") + + for(var/path in loadout_list) + var/actual_datum = GLOB.all_loadout_datums[path] + if(!istype(actual_datum, /datum/loadout_item)) + stack_trace("Could not find ([path]) loadout item in the global list of loadout datums!") + continue + + datums += actual_datum + + return datums diff --git a/code/modules/loadout/loadout_items.dm b/code/modules/loadout/loadout_items.dm new file mode 100644 index 0000000000000..53d0a7cc6cd5b --- /dev/null +++ b/code/modules/loadout/loadout_items.dm @@ -0,0 +1,371 @@ +/// Global list of ALL loadout datums instantiated. +/// Loadout datums are created by loadout categories. +GLOBAL_LIST_EMPTY(all_loadout_datums) + +/// Global list of all loadout categories +/// Doesn't really NEED to be a global but we need to init this early for preferences, +/// as the categories instantiate all the loadout datums +GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) + +/// Inits the global list of loadout category singletons +/// Also inits loadout item singletons +/proc/init_loadout_categories() + var/list/loadout_categories = list() + for(var/category_type in subtypesof(/datum/loadout_category)) + loadout_categories += new category_type() + + sortTim(loadout_categories, /proc/cmp_loadout_categories) + return loadout_categories + +/proc/cmp_loadout_categories(datum/loadout_category/A, datum/loadout_category/B) + var/a_order = A::tab_order + var/b_order = B::tab_order + if(a_order == b_order) + return cmp_text_asc(A::category_name, B::category_name) + return cmp_numeric_asc(a_order, b_order) + +/** + * # Loadout item datum + * + * Singleton that holds all the information about each loadout items, and how to equip them. + */ +/datum/loadout_item + /// The category of the loadout item. Set automatically in New + VAR_FINAL/datum/loadout_category/category + /// Displayed name of the loadout item. + /// Defaults to the item's name if unset. + var/name + /// Whether this item has greyscale support. + /// Only works if the item is compatible with the GAGS system of coloring. + /// Set automatically to TRUE for all items that have the flag [IS_PLAYER_COLORABLE_1]. + /// If you really want it to not be colorable set this to [DONT_GREYSCALE] + var/can_be_greyscale = FALSE + /// Whether this item can be renamed. + /// I recommend you apply this sparingly becuase it certainly can go wrong (or get reset / overridden easily) + var/can_be_named = FALSE + /// Whether this item can be reskinned. + /// Only works if the item has a "unique reskin" list set. + var/can_be_reskinned = FALSE + /// The abstract parent of this loadout item, to determine which items to not instantiate + var/abstract_type = /datum/loadout_item + /// The actual item path of the loadout item. + var/obj/item/item_path + /// Lazylist of additional "information" text to display about this item. + var/list/additional_displayed_text + /// Icon file (DMI) for the UI to use for preview icons. + /// Set automatically if null + var/ui_icon + /// Icon state for the UI to use for preview icons. + /// Set automatically if null + var/ui_icon_state + /// Reskin options of this item if it can be reskinned. + VAR_FINAL/list/cached_reskin_options + +/datum/loadout_item/New(category) + src.category = category + + if(can_be_greyscale == DONT_GREYSCALE) + can_be_greyscale = FALSE + else if(item_path::flags_1 & IS_PLAYER_COLORABLE_1) + can_be_greyscale = TRUE + + if(isnull(name)) + name = item_path::name + + if(isnull(ui_icon) && isnull(ui_icon_state)) + ui_icon = item_path::icon_preview || item_path::icon + ui_icon_state = item_path::icon_state_preview || item_path::icon_state + + if(can_be_reskinned) + var/obj/item/dummy_item = new item_path() + if(!length(dummy_item.unique_reskin)) + can_be_reskinned = FALSE + stack_trace("Loadout item [item_path] has can_be_reskinned set to TRUE but has no unique reskins.") + else + cached_reskin_options = dummy_item.unique_reskin.Copy() + qdel(dummy_item) + +/datum/loadout_item/Destroy(force, ...) + if(force) + stack_trace("QDEL called on loadout item [type]. This shouldn't ever happen. (Use FORCE if necessary.)") + return QDEL_HINT_LETMELIVE + + GLOB.all_loadout_datums -= item_path + return ..() + +/** + * Takes in an action from a loadout manager and applies it + * + * Useful for subtypes of loadout items with unique actions + * + * Return TRUE to force an update to the UI / character preview + */ +/datum/loadout_item/proc/handle_loadout_action(datum/preference_middleware/loadout/manager, mob/user, action, params) + SHOULD_CALL_PARENT(TRUE) + + switch(action) + if("select_color") + if(can_be_greyscale) + return set_item_color(manager, user) + + if("set_name") + if(can_be_named) + return set_name(manager, user) + + if("set_skin") + return set_skin(manager, user, params) + + return TRUE + +/// Opens up the GAGS editing menu. +/datum/loadout_item/proc/set_item_color(datum/preference_middleware/loadout/manager, mob/user) + if(manager.menu) + return FALSE + + var/list/loadout = manager.preferences.read_preference(/datum/preference/loadout) + var/list/allowed_configs = list() + if(initial(item_path.greyscale_config)) + allowed_configs += "[initial(item_path.greyscale_config)]" + if(initial(item_path.greyscale_config_worn)) + allowed_configs += "[initial(item_path.greyscale_config_worn)]" + if(initial(item_path.greyscale_config_inhand_left)) + allowed_configs += "[initial(item_path.greyscale_config_inhand_left)]" + if(initial(item_path.greyscale_config_inhand_right)) + allowed_configs += "[initial(item_path.greyscale_config_inhand_right)]" + + var/datum/greyscale_modify_menu/menu = new( + manager, + user, + allowed_configs, + CALLBACK(src, PROC_REF(set_slot_greyscale), manager), + starting_icon_state = initial(item_path.icon_state), + starting_config = initial(item_path.greyscale_config), + starting_colors = loadout?[item_path]?[INFO_GREYSCALE] || initial(item_path.greyscale_colors), + ) + + manager.register_greyscale_menu(menu) + menu.ui_interact(user) + return TRUE + +/// Callback for GAGS menu to set this item's color. +/datum/loadout_item/proc/set_slot_greyscale(datum/preference_middleware/loadout/manager, datum/greyscale_modify_menu/open_menu) + if(!istype(open_menu)) + CRASH("set_slot_greyscale called without a greyscale menu!") + + var/list/loadout = manager.preferences.read_preference(/datum/preference/loadout) + if(!loadout?[item_path]) + return FALSE + + var/list/colors = open_menu.split_colors + if(!colors) + return FALSE + + loadout[item_path][INFO_GREYSCALE] = colors.Join("") + manager.preferences.update_preference(GLOB.preference_entries[/datum/preference/loadout], loadout) + return TRUE // update UI + +/// Sets the name of the item. +/datum/loadout_item/proc/set_name(datum/preference_middleware/loadout/manager, mob/user) + var/list/loadout = manager.preferences.read_preference(/datum/preference/loadout) + var/input_name = tgui_input_text( + user = user, + message = "What name do you want to give the [name]? Leave blank to clear.", + title = "[name] name", + default = loadout?[item_path]?[INFO_NAMED], // plop in existing name (if any) + max_length = MAX_NAME_LEN, + ) + if(QDELETED(src) || QDELETED(user) || QDELETED(manager) || QDELETED(manager.preferences)) + return FALSE + + loadout = manager.preferences.read_preference(/datum/preference/loadout) // Make sure no shenanigans happened + if(!loadout?[item_path]) + return FALSE + + if(input_name) + loadout[item_path][INFO_NAMED] = input_name + else if(input_name == "") + loadout[item_path] -= INFO_NAMED + + manager.preferences.update_preference(GLOB.preference_entries[/datum/preference/loadout], loadout) + return FALSE // no update needed + +/// Used for reskinning an item to an alt skin. +/datum/loadout_item/proc/set_skin(datum/preference_middleware/loadout/manager, mob/user, params) + if(!can_be_reskinned) + return FALSE + + var/reskin_to = params["skin"] + if(!cached_reskin_options[reskin_to]) + return FALSE + + var/list/loadout = manager.preferences.read_preference(/datum/preference/loadout) + if(!loadout?[item_path]) + return FALSE + + loadout[item_path][INFO_RESKIN] = reskin_to + manager.preferences.update_preference(GLOB.preference_entries[/datum/preference/loadout], loadout) + return TRUE // always update UI + +/** + * Place our [item_path] into the passed [outfit]. + * + * By default, just adds the item into the outfit's backpack contents, if non-visual. + * + * Arguments: + * * outfit - The outfit we're equipping our items into. + * * equipper - If we're equipping out outfit onto a mob at the time, this is the mob it is equipped on. Can be null. + * * visual - If TRUE, then our outfit is only for visual use (for example, a preview). + */ +/datum/loadout_item/proc/insert_path_into_outfit(datum/outfit/outfit, mob/living/carbon/human/equipper, visuals_only = FALSE) + if(!visuals_only) + LAZYADD(outfit.backpack_contents, item_path) + +/** + * Called When the item is equipped on [equipper]. + * + * At this point the item is in the mob's contents + * + * Arguments: + * * preference_source - the datum/preferences our loadout item originated from - cannot be null + * * equipper - the mob we're equipping this item onto - cannot be null + * * visuals_only - whether or not this is only concerned with visual things (not backpack, not renaming, etc) + * * preference_list - what the raw loadout list looks like in the preferences + * + * Return a bitflag of slot flags to update + */ +/datum/loadout_item/proc/on_equip_item( + obj/item/equipped_item, + datum/preferences/preference_source, + list/preference_list, + mob/living/carbon/human/equipper, + visuals_only = FALSE, +) + ASSERT(!isnull(equipped_item)) + + if(!visuals_only) + ADD_TRAIT(equipped_item, TRAIT_ITEM_OBJECTIVE_BLOCKED, "Loadout") + + var/list/item_details = preference_list[item_path] + var/update_flag = NONE + + if(can_be_greyscale && item_details?[INFO_GREYSCALE]) + equipped_item.set_greyscale(item_details[INFO_GREYSCALE]) + update_flag |= equipped_item.slot_flags + + if(can_be_named && item_details?[INFO_NAMED] && !visuals_only) + equipped_item.name = trim(item_details[INFO_NAMED], PREVENT_CHARACTER_TRIM_LOSS(MAX_NAME_LEN)) + ADD_TRAIT(equipped_item, TRAIT_WAS_RENAMED, "Loadout") + + if(can_be_reskinned && item_details?[INFO_RESKIN]) + var/skin_chosen = item_details[INFO_RESKIN] + if(skin_chosen in equipped_item.unique_reskin) + equipped_item.current_skin = skin_chosen + equipped_item.icon_state = equipped_item.unique_reskin[skin_chosen] + if(istype(equipped_item, /obj/item/clothing/accessory)) + // Snowflake handing for accessories, because we need to update the thing it's attached to instead + if(isclothing(equipped_item.loc)) + var/obj/item/clothing/under/attached_to = equipped_item.loc + attached_to.update_accessory_overlay() + update_flag |= (ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING) + else + update_flag |= equipped_item.slot_flags + + else + // Not valid, update the preference + item_details -= INFO_RESKIN + preference_source.write_preference(GLOB.preference_entries[/datum/preference/loadout], preference_list) + + return update_flag + +/** + * Returns a formatted list of data for this loadout item. + */ +/datum/loadout_item/proc/to_ui_data() as /list + SHOULD_CALL_PARENT(TRUE) + + var/list/formatted_item = list() + formatted_item["name"] = name + formatted_item["path"] = item_path + formatted_item["information"] = get_item_information() + formatted_item["buttons"] = get_ui_buttons() + formatted_item["reskins"] = get_reskin_options() + formatted_item["icon"] = ui_icon + formatted_item["icon_state"] = ui_icon_state + return formatted_item + +/** + * Returns a list of information to display about this item in the loadout UI. + * + * These should be short strings, sub 14 characters generally. + */ +/datum/loadout_item/proc/get_item_information() as /list + SHOULD_CALL_PARENT(TRUE) + + var/list/displayed_text = list() + + displayed_text += (additional_displayed_text || list()) + + if(can_be_greyscale) + displayed_text += "Recolorable" + + if(can_be_named) + displayed_text += "Renamable" + + if(can_be_reskinned) + displayed_text += "Reskinnable" + + return displayed_text + +/** + * Returns a list of buttons that are shown in the loadout UI for customizing this item. + * + * Buttons contain + * - 'L'abel: The text displayed beside the button + * - act_key: The key that is sent to the loadout manager when the button is clicked, + * for use in handle_loadout_action + * - button_icon: The FontAwesome icon to display on the button + * - active_key: In the loadout UI, this key is checked in the user's loadout list for this item + * to determine if the button is 'active' (green) or not (blue). + * - active_text: Optional, if provided, the button appears to be a checkbox and this text is shown when 'active' + * - inactive_text: Optional, if provided, the button appears to be a checkbox and this text is shown when not 'active' + */ +/datum/loadout_item/proc/get_ui_buttons() as /list + SHOULD_CALL_PARENT(TRUE) + + var/list/button_list = list() + + if(can_be_greyscale) + UNTYPED_LIST_ADD(button_list, list( + "label" = "Recolor", + "act_key" = "select_color", + "button_icon" = FA_ICON_PALETTE, + "active_key" = INFO_GREYSCALE, + )) + + if(can_be_named) + UNTYPED_LIST_ADD(button_list, list( + "label" = "Rename", + "act_key" = "set_name", + "button_icon" = FA_ICON_PEN, + "active_key" = INFO_NAMED, + )) + + return button_list + +/** + * Returns a list of options this item can be reskinned into. + */ +/datum/loadout_item/proc/get_reskin_options() as /list + if(!can_be_reskinned) + return null + + var/list/reskins = list() + + for(var/skin in cached_reskin_options) + UNTYPED_LIST_ADD(reskins, list( + "name" = skin, + "tooltip" = skin, + "skin_icon_state" = cached_reskin_options[skin], + )) + + return reskins diff --git a/code/modules/loadout/loadout_menu.dm b/code/modules/loadout/loadout_menu.dm new file mode 100644 index 0000000000000..243641faeed5e --- /dev/null +++ b/code/modules/loadout/loadout_menu.dm @@ -0,0 +1,120 @@ +/datum/preference_middleware/loadout + action_delegations = list( + "clear_all_items" = PROC_REF(action_clear_all), + "pass_to_loadout_item" = PROC_REF(action_pass_to_loadout_item), + "rotate_dummy" = PROC_REF(action_rotate_model_dir), + "select_item" = PROC_REF(action_select_item), + "toggle_job_clothes" = PROC_REF(action_toggle_job_outfit), + "close_greyscale_menu" = PROC_REF(force_close_greyscale_menu), + ) + /// Our currently open greyscaling menu. + VAR_FINAL/datum/greyscale_modify_menu/menu + +/datum/preference_middleware/loadout/Destroy(force, ...) + QDEL_NULL(menu) + return ..() + +/datum/preference_middleware/loadout/on_new_character(mob/user) + preferences.character_preview_view?.update_body() + +/datum/preference_middleware/loadout/proc/action_select_item(list/params, mob/user) + PRIVATE_PROC(TRUE) + var/path_to_use = text2path(params["path"]) + var/datum/loadout_item/interacted_item = GLOB.all_loadout_datums[path_to_use] + if(!istype(interacted_item)) + stack_trace("Failed to locate desired loadout item (path: [params["path"]]) in the global list of loadout datums!") + return TRUE // update + + if(params["deselect"]) + deselect_item(interacted_item) + else + select_item(interacted_item) + return TRUE + +/datum/preference_middleware/loadout/proc/action_clear_all(list/params, mob/user) + PRIVATE_PROC(TRUE) + preferences.update_preference(GLOB.preference_entries[/datum/preference/loadout], null) + return TRUE + +/datum/preference_middleware/loadout/proc/action_toggle_job_outfit(list/params, mob/user) + PRIVATE_PROC(TRUE) + preferences.character_preview_view.show_job_clothes = !preferences.character_preview_view.show_job_clothes + preferences.character_preview_view.update_body() + return TRUE + +/datum/preference_middleware/loadout/proc/action_rotate_model_dir(list/params, mob/user) + PRIVATE_PROC(TRUE) + switch(params["dir"]) + if("left") + preferences.character_preview_view.setDir(turn(preferences.character_preview_view.dir, -90)) + if("right") + preferences.character_preview_view.setDir(turn(preferences.character_preview_view.dir, 90)) + +/datum/preference_middleware/loadout/proc/action_pass_to_loadout_item(list/params, mob/user) + PRIVATE_PROC(TRUE) + var/path_to_use = text2path(params["path"]) + var/datum/loadout_item/interacted_item = GLOB.all_loadout_datums[path_to_use] + if(!istype(interacted_item)) // no you cannot href exploit to spawn with a pulse rifle + stack_trace("Failed to locate desired loadout item (path: [params["path"]]) in the global list of loadout datums!") + return TRUE // update + + if(interacted_item.handle_loadout_action(src, user, params["subaction"], params)) + preferences.character_preview_view.update_body() + return TRUE + + return FALSE + +/// Select [path] item to [category_slot] slot. +/datum/preference_middleware/loadout/proc/select_item(datum/loadout_item/selected_item) + var/list/loadout = preferences.read_preference(/datum/preference/loadout) + var/list/datum/loadout_item/loadout_datums = loadout_list_to_datums(loadout) + for(var/datum/loadout_item/item as anything in loadout_datums) + if(item.category != selected_item.category) + continue + if(!item.category.handle_duplicate_entires(src, item, selected_item, loadout_datums)) + return + + LAZYSET(loadout, selected_item.item_path, list()) + preferences.update_preference(GLOB.preference_entries[/datum/preference/loadout], loadout) + +/// Deselect [deselected_item]. +/datum/preference_middleware/loadout/proc/deselect_item(datum/loadout_item/deselected_item) + var/list/loadout = preferences.read_preference(/datum/preference/loadout) + LAZYREMOVE(loadout, deselected_item.item_path) + preferences.update_preference(GLOB.preference_entries[/datum/preference/loadout], loadout) + +/datum/preference_middleware/loadout/proc/register_greyscale_menu(datum/greyscale_modify_menu/open_menu) + src.menu = open_menu + RegisterSignal(menu, COMSIG_QDELETING, PROC_REF(cleanup_greyscale_menu)) + +/datum/preference_middleware/loadout/proc/cleanup_greyscale_menu() + SIGNAL_HANDLER + menu = null + +/datum/preference_middleware/loadout/proc/force_close_greyscale_menu() + menu?.ui_close() + +/datum/preference_middleware/loadout/get_ui_data(mob/user) + var/list/data = list() + data["job_clothes"] = preferences.character_preview_view.show_job_clothes + return data + +/datum/preference_middleware/loadout/get_ui_static_data(mob/user) + var/list/data = list() + data["loadout_preview_view"] = preferences.character_preview_view.assigned_map + return data + +/datum/preference_middleware/loadout/get_constant_data() + var/list/data = list() + var/list/loadout_tabs = list() + for(var/datum/loadout_category/category as anything in GLOB.all_loadout_categories) + var/list/cat_data = list( + "name" = category.category_name, + "category_icon" = category.category_ui_icon, + "category_info" = category.category_info, + "contents" = category.items_to_ui_data(), + ) + UNTYPED_LIST_ADD(loadout_tabs, cat_data) + + data["loadout_tabs"] = loadout_tabs + return data diff --git a/code/modules/loadout/loadout_preference.dm b/code/modules/loadout/loadout_preference.dm new file mode 100644 index 0000000000000..c1d286bedf635 --- /dev/null +++ b/code/modules/loadout/loadout_preference.dm @@ -0,0 +1,59 @@ +/datum/preference/loadout + savefile_key = "loadout_list" + savefile_identifier = PREFERENCE_CHARACTER + priority = PREFERENCE_PRIORITY_LOADOUT + can_randomize = FALSE + // Loadout preference is an assoc list [item_path] = [loadout item information list] + // + // it may look something like + // - list(/obj/item/glasses = list()) + // or + // - list(/obj/item/plush/lizard = list("name" = "Tests-The-Loadout", "color" = "#FF0000")) + +// Loadouts are applied with job equip code. +/datum/preference/loadout/apply_to_human(mob/living/carbon/human/target, value) + return + +// Sanitize on load to ensure no invalid paths from older saves get in +/datum/preference/loadout/deserialize(input, datum/preferences/preferences) + return sanitize_loadout_list(input, preferences.parent?.mob) + +// Default value is null - the loadout list is a lazylist +/datum/preference/loadout/create_default_value(datum/preferences/preferences) + return null + +/datum/preference/loadout/is_valid(value) + return isnull(value) || islist(value) + +/** + * Removes all invalid paths from loadout lists. + * This is a general sanitization for preference loading. + * + * Returns a list, or null if empty + */ +/datum/preference/loadout/proc/sanitize_loadout_list(list/passed_list, mob/optional_loadout_owner) as /list + var/list/sanitized_list + for(var/path in passed_list) + // Loading from json has each path in the list as a string that we need to convert back to typepath + var/obj/item/real_path = istext(path) ? text2path(path) : path + if(!ispath(real_path, /obj/item)) + if(optional_loadout_owner) + to_chat(optional_loadout_owner, span_boldnotice("The following invalid item path was found \ + in your character loadout: [real_path || "null"]. \ + It has been removed, renamed, or is otherwise missing - \ + You may want to check your loadout settings.")) + continue + + else if(!istype(GLOB.all_loadout_datums[real_path], /datum/loadout_item)) + if(optional_loadout_owner) + to_chat(optional_loadout_owner, span_boldnotice("The following invalid loadout item was found \ + in your character loadout: [real_path || "null"]. \ + It has been removed, renamed, or is otherwise missing - \ + You may want to check your loadout settings.")) + continue + + // Set into sanitize list using converted path key + var/list/data = passed_list[path] + LAZYSET(sanitized_list, real_path, LAZYLISTDUPLICATE(data)) + + return sanitized_list diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm b/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm index 1ec15d01345ed..ef6dc902c9f08 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm @@ -320,21 +320,23 @@ icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "prison_cube" -/obj/item/prisoncube/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!proximity_flag || !isliving(target)) - return - var/mob/living/victim = target - var/mob/living/carbon/carbon_victim = victim +/obj/item/prisoncube/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isliving(interacting_with)) + return NONE + + var/mob/living/carbon/carbon_victim = interacting_with //Handcuffed or unconscious - if(istype(carbon_victim) && carbon_victim.handcuffed || victim.stat != CONSCIOUS) - if(!puzzle_imprison(target)) - to_chat(user,span_warning("[src] does nothing.")) - return - to_chat(user,span_warning("You trap [victim] in the prison cube!")) + if(istype(carbon_victim) && (carbon_victim.handcuffed || carbon_victim.stat != CONSCIOUS)) + user.do_attack_animation(carbon_victim) + if(!puzzle_imprison(carbon_victim)) + to_chat(user, span_warning("[src] does nothing.")) + return ITEM_INTERACT_BLOCKING + to_chat(user, span_warning("You trap [carbon_victim] in the prison cube!")) qdel(src) - else - to_chat(user,span_notice("[src] only accepts restrained or unconscious prisoners.")) + return ITEM_INTERACT_SUCCESS + + to_chat(user, span_notice("[src] only accepts restrained or unconscious prisoners.")) + return ITEM_INTERACT_BLOCKING /proc/puzzle_imprison(mob/living/prisoner) var/turf/T = get_turf(prisoner) diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm index eb5f2437bcd4d..15566603a9322 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm @@ -26,8 +26,8 @@ /obj/item/knife/envy //Envy's knife: Found in the Envy ruin. Attackers take on the appearance of whoever they strike. name = "envy's knife" desc = "Their success will be yours." - icon = 'icons/obj/weapons/khopesh.dmi' - icon_state = "render" + icon = 'icons/obj/weapons/stabby.dmi' + icon_state = "envyknife" inhand_icon_state = "knife" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' @@ -36,18 +36,17 @@ w_class = WEIGHT_CLASS_NORMAL hitsound = 'sound/weapons/bladeslice.ogg' -/obj/item/knife/envy/afterattack(atom/movable/AM, mob/living/carbon/human/user, proximity) - . = ..() - if(!proximity) +/obj/item/knife/envy/afterattack(atom/target, mob/living/carbon/human/user, click_parameters) + if(!istype(user) || !ishuman(target)) return - if(!istype(user)) + + var/mob/living/carbon/human/H = target + if(user.real_name == H.dna.real_name) return - if(ishuman(AM)) - var/mob/living/carbon/human/H = AM - if(user.real_name != H.dna.real_name) - user.real_name = H.dna.real_name - H.dna.transfer_identity(user, transfer_SE=1) - user.updateappearance(mutcolor_update=1) - user.domutcheck() - user.visible_message(span_warning("[user]'s appearance shifts into [H]'s!"), \ - span_boldannounce("[H.p_They()] think[H.p_s()] [H.p_theyre()] sooo much better than you. Not anymore, [H.p_they()] won't.")) + + user.real_name = H.dna.real_name + H.dna.transfer_identity(user, transfer_SE=1) + user.updateappearance(mutcolor_update=1) + user.domutcheck() + user.visible_message(span_warning("[user]'s appearance shifts into [H]'s!"), \ + span_boldannounce("[H.p_They()] think[H.p_s()] [H.p_theyre()] sooo much better than you. Not anymore, [H.p_they()] won't.")) diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm index b2e0e16f9a82a..21075cea38add 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm @@ -524,14 +524,12 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) icon_state = "hilbertsanalyzer" worn_icon_state = "analyzer" -/obj/item/analyzer/hilbertsanalyzer/afterattack(atom/target, mob/user, proximity) - . = ..() - if(istype(target, /obj/item/hilbertshotel)) - . |= AFTERATTACK_PROCESSED_ITEM - if(!proximity) +/obj/item/analyzer/hilbertsanalyzer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(istype(interacting_with, /obj/item/hilbertshotel)) + if(!Adjacent(interacting_with)) to_chat(user, span_warning("It's to far away to scan!")) - return . - var/obj/item/hilbertshotel/sphere = target + return ITEM_INTERACT_BLOCKING + var/obj/item/hilbertshotel/sphere = interacting_with if(sphere.activeRooms.len) to_chat(user, "Currently Occupied Rooms:") for(var/roomnumber in sphere.activeRooms) @@ -544,7 +542,8 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) to_chat(user, roomnumber) else to_chat(user, "No vacated rooms.") - return . + return ITEM_INTERACT_SUCCESS + return ..() /obj/effect/landmark/transport/transport_id/hilbert specific_transport_id = HILBERT_LINE_1 diff --git a/code/modules/mining/equipment/grapple_gun.dm b/code/modules/mining/equipment/grapple_gun.dm index c7c91ede73e6f..6a8b2ec305328 100644 --- a/code/modules/mining/equipment/grapple_gun.dm +++ b/code/modules/mining/equipment/grapple_gun.dm @@ -35,26 +35,22 @@ zipline_sound = new(src) update_appearance() -/obj/item/grapple_gun/afterattack(atom/target, mob/living/user, proximity) - . = ..() - +/obj/item/grapple_gun/ranged_interact_with_atom(atom/target, mob/living/user, list/modifiers) if(isgroundlessturf(target)) - return + return NONE + if(target == user || !hooked) + return NONE if(!lavaland_equipment_pressure_check(get_turf(user))) user.balloon_alert(user, "gun mechanism wont work here!") - return - - if(target == user || !hooked) - return - + return ITEM_INTERACT_BLOCKING if(get_dist(user, target) > 9) user.balloon_alert(user, "too far away!") - return + return ITEM_INTERACT_BLOCKING var/turf/attacked_atom = get_turf(target) if(isnull(attacked_atom)) - return + return ITEM_INTERACT_BLOCKING var/list/turf_list = (get_line(user, attacked_atom) - get_turf(src)) for(var/turf/singular_turf as anything in turf_list) @@ -66,9 +62,7 @@ break if(user.CanReach(attacked_atom)) - return - - . |= AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_BLOCKING var/atom/bullet = fire_projectile(/obj/projectile/grapple_hook, attacked_atom, 'sound/weapons/zipline_fire.ogg') zipline = user.Beam(bullet, icon_state = "zipline_hook", maxdistance = 9, layer = BELOW_MOB_LAYER) @@ -77,6 +71,7 @@ RegisterSignal(bullet, COMSIG_PREQDELETED, PROC_REF(on_grapple_fail)) zipliner = WEAKREF(user) update_appearance() + return ITEM_INTERACT_SUCCESS /obj/item/grapple_gun/proc/on_grapple_hit(datum/source, atom/movable/firer, atom/target, Angle) SIGNAL_HANDLER diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 8dc27f9214f96..a9fa376d5b2c7 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -83,27 +83,24 @@ crusher_trophy.remove_from(src, user) return ITEM_INTERACT_SUCCESS -/obj/item/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user) +/obj/item/kinetic_crusher/pre_attack(atom/A, mob/living/user, params) + . = ..() + if(.) + return TRUE if(!HAS_TRAIT(src, TRAIT_WIELDED)) user.balloon_alert(user, "must be wielded!") - return - var/datum/status_effect/crusher_damage/crusher_damage_effect = target.has_status_effect(/datum/status_effect/crusher_damage) - if(!crusher_damage_effect) - crusher_damage_effect = target.apply_status_effect(/datum/status_effect/crusher_damage) - var/target_health = target.health - ..() - for(var/obj/item/crusher_trophy/crusher_trophy as anything in trophies) - if(!QDELETED(target)) - crusher_trophy.on_melee_hit(target, user) - if(!QDELETED(crusher_damage_effect) && !QDELETED(target)) - crusher_damage_effect.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did + return TRUE + return . -/obj/item/kinetic_crusher/afterattack(mob/living/target, mob/living/user, proximity_flag, clickparams) - . = ..() - if(.) +/obj/item/kinetic_crusher/afterattack(mob/living/target, mob/living/user, clickparams) + if(!isliving(target)) return - if(!proximity_flag || !isliving(target)) + // Melee effect + for(var/obj/item/crusher_trophy/crusher_trophy as anything in trophies) + crusher_trophy.on_melee_hit(target, user) + if(QDELETED(target)) return + // Clear existing marks var/valid_crusher_attack = FALSE for(var/datum/status_effect/crusher_mark/crusher_mark_effect as anything in target.get_all_status_effect_of_id(/datum/status_effect/crusher_mark)) //this will erase ALL crusher marks, not only ones by you. @@ -113,9 +110,8 @@ break if(!valid_crusher_attack) return - var/datum/status_effect/crusher_damage/crusher_damage_effect = target.has_status_effect(/datum/status_effect/crusher_damage) - if(!crusher_damage_effect) - crusher_damage_effect = target.apply_status_effect(/datum/status_effect/crusher_damage) + // Detonation effect + var/datum/status_effect/crusher_damage/crusher_damage_effect = target.has_status_effect(/datum/status_effect/crusher_damage) || target.apply_status_effect(/datum/status_effect/crusher_damage) var/target_health = target.health for(var/obj/item/crusher_trophy/crusher_trophy as anything in trophies) crusher_trophy.on_mark_detonation(target, user) @@ -128,6 +124,7 @@ var/combined_damage = detonation_damage var/backstab_dir = get_dir(user, target) var/def_check = target.getarmor(type = BOMB) + // Backstab bonus if((user.dir & backstab_dir) && (target.dir & backstab_dir)) backstabbed = TRUE combined_damage += backstab_bonus @@ -137,24 +134,23 @@ SEND_SIGNAL(user, COMSIG_LIVING_CRUSHER_DETONATE, target, src, backstabbed) target.apply_damage(combined_damage, BRUTE, blocked = def_check) -/obj/item/kinetic_crusher/attack_secondary(atom/target, mob/living/user, clickparams) - return SECONDARY_ATTACK_CONTINUE_CHAIN - -/obj/item/kinetic_crusher/afterattack_secondary(atom/target, mob/living/user, proximity_flag, click_parameters) +/obj/item/kinetic_crusher/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) if(!HAS_TRAIT(src, TRAIT_WIELDED)) balloon_alert(user, "wield it first!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(target == user) + return ITEM_INTERACT_BLOCKING + if(interacting_with == user) balloon_alert(user, "can't aim at yourself!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - fire_kinetic_blast(target, user, click_parameters) + return ITEM_INTERACT_BLOCKING + fire_kinetic_blast(interacting_with, user, modifiers) user.changeNext_move(CLICK_CD_MELEE) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_SUCCESS + +/obj/item/kinetic_crusher/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom_secondary(interacting_with, user, modifiers) -/obj/item/kinetic_crusher/proc/fire_kinetic_blast(atom/target, mob/living/user, click_parameters) +/obj/item/kinetic_crusher/proc/fire_kinetic_blast(atom/target, mob/living/user, list/modifiers) if(!charged) return - var/modifiers = params2list(click_parameters) var/turf/proj_turf = user.loc if(!isturf(proj_turf)) return diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm index ff90c418c8861..4e82c03d3736f 100644 --- a/code/modules/mining/equipment/lazarus_injector.dm +++ b/code/modules/mining/equipment/lazarus_injector.dm @@ -25,27 +25,25 @@ ///So you can't revive boss monsters or robots with it var/revive_type = SENTIENCE_ORGANIC -/obj/item/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(!loaded || !proximity_flag) - return - +/obj/item/lazarus_injector/interact_with_atom(atom/target, mob/living/user, list/modifiers) + if(!loaded) + return NONE if(SEND_SIGNAL(target, COMSIG_ATOM_ON_LAZARUS_INJECTOR, src, user) & LAZARUS_INJECTOR_USED) - return - + return ITEM_INTERACT_SUCCESS if(!isliving(target)) - return + return NONE var/mob/living/target_animal = target if(!target_animal.compare_sentience_type(revive_type)) // Will also return false if not a basic or simple mob, which are the only two we want anyway balloon_alert(user, "invalid creature!") - return + return ITEM_INTERACT_BLOCKING if(target_animal.stat != DEAD) balloon_alert(user, "it's not dead!") - return + return ITEM_INTERACT_BLOCKING target_animal.lazarus_revive(user, malfunctioning) expend(target_animal, user) + return ITEM_INTERACT_SUCCESS /obj/item/lazarus_injector/proc/expend(atom/revived_target, mob/user) user.visible_message(span_notice("[user] injects [revived_target] with [src], reviving it.")) diff --git a/code/modules/mining/equipment/monster_organs/monster_organ.dm b/code/modules/mining/equipment/monster_organs/monster_organ.dm index 135373469d847..a854f113740f8 100644 --- a/code/modules/mining/equipment/monster_organs/monster_organ.dm +++ b/code/modules/mining/equipment/monster_organs/monster_organ.dm @@ -8,24 +8,21 @@ desc = "Inject certain types of monster organs with this stabilizer to prevent their rapid decay." w_class = WEIGHT_CLASS_TINY -/obj/item/mining_stabilizer/afterattack(obj/item/organ/target_organ, mob/user, proximity) - . = ..() - if (!proximity) - return - . |= AFTERATTACK_PROCESSED_ITEM - - var/obj/item/organ/internal/monster_core/target_core = target_organ - if (!istype(target_core, /obj/item/organ/internal/monster_core)) +/obj/item/mining_stabilizer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isorgan(interacting_with)) + return NONE + var/obj/item/organ/internal/monster_core/target_core = interacting_with + if (!istype(target_core)) balloon_alert(user, "invalid target!") - return . + return ITEM_INTERACT_BLOCKING if (!target_core.preserve()) balloon_alert(user, "organ decayed!") - return . + return ITEM_INTERACT_BLOCKING balloon_alert(user, "organ stabilized") qdel(src) - return . + return ITEM_INTERACT_SUCCESS /** * Useful organs which drop as loot from a mining creature. @@ -135,12 +132,9 @@ icon_state = initial(icon_state) return ..() -/obj/item/organ/internal/monster_core/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if (!proximity_flag) - return - try_apply(target, user) - return . | AFTERATTACK_PROCESSED_ITEM +/obj/item/organ/internal/monster_core/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + try_apply(interacting_with, user) + return ITEM_INTERACT_SUCCESS /obj/item/organ/internal/monster_core/attack_self(mob/user) if (!user.can_perform_action(src, FORBID_TELEKINESIS_REACH|ALLOW_RESTING)) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 035bbb24fc49c..56b65c456197b 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -51,36 +51,33 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) beacon_ref = WEAKREF(chosen_beacon) balloon_alert(user, "linked!") -/obj/item/extraction_pack/afterattack(atom/movable/thing, mob/living/carbon/human/user, proximity_flag, params) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM - +/obj/item/extraction_pack/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!ismovable(interacting_with)) + return NONE + if(!isturf(interacting_with.loc)) // no extracting stuff inside other stuff + return NONE + var/atom/movable/thing = interacting_with + if(thing.anchored) + return NONE + + . = ITEM_INTERACT_BLOCKING var/obj/structure/extraction_point/beacon = beacon_ref?.resolve() if(isnull(beacon)) - balloon_alert(user, "not linked") + balloon_alert(user, "not linked!") beacon_ref = null - return - + return . if(!can_use_indoors) var/area/area = get_area(thing) if(!area.outdoors) - balloon_alert(user, "not outdoors") - return - - if(!proximity_flag || !istype(thing)) - return - + balloon_alert(user, "not outdoors!") + return . if(!safe_for_living_creatures && check_for_living_mobs(thing)) to_chat(user, span_warning("[src] is not safe for use with living creatures, they wouldn't survive the trip back!")) balloon_alert(user, "not safe!") - return - - if(!isturf(thing.loc)) // no extracting stuff inside other stuff - return - if(thing.anchored || (thing.move_resist > max_force_fulton)) + return . + if(thing.move_resist > max_force_fulton) balloon_alert(user, "too heavy!") - return - + return . balloon_alert_to_viewers("attaching...") playsound(thing, 'sound/items/zip.ogg', vol = 50, vary = TRUE) if(isliving(thing)) @@ -89,11 +86,12 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) to_chat(thing, span_userdanger("You are being extracted! Stand still to proceed.")) if(!do_after(user, 5 SECONDS, target = thing)) - return + return . balloon_alert_to_viewers("extracting!") - if(loc == user) - user.back?.atom_storage?.attempt_insert(src, user, force = STORAGE_SOFT_LOCKED) + if(loc == user && ishuman(user)) + var/mob/living/carbon/human/human_user = user + human_user.back?.atom_storage?.attempt_insert(src, user, force = STORAGE_SOFT_LOCKED) uses_left-- if(uses_left <= 0) @@ -180,6 +178,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) qdel(holder_obj) if(uses_left <= 0) qdel(src) + return ITEM_INTERACT_SUCCESS /obj/item/fulton_core name = "extraction beacon assembly kit" diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm index 1b015abea876f..dd3c2c243a02c 100644 --- a/code/modules/mining/lavaland/megafauna_loot.dm +++ b/code/modules/mining/lavaland/megafauna_loot.dm @@ -99,14 +99,14 @@ blink_activated = !blink_activated to_chat(user, span_notice("You [blink_activated ? "enable" : "disable"] the blink function on [src].")) -/obj/item/hierophant_club/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/hierophant_club/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) // If our target is the beacon and the hierostaff is next to the beacon, we're trying to pick it up. - if((target == beacon) && target.Adjacent(src)) - return + if(interacting_with == beacon) + return NONE if(blink_activated) - blink.teleport(user, target) + blink.teleport(user, interacting_with) + return ITEM_INTERACT_SUCCESS + return NONE /obj/item/hierophant_club/update_icon_state() icon_state = inhand_icon_state = "hierophant_club[blink?.current_charges > 0 ? "_ready":""][(!QDELETED(beacon)) ? "":"_beacon"]" @@ -795,40 +795,43 @@ var/timer = 0 var/static/list/banned_turfs = typecacheof(list(/turf/open/space, /turf/closed)) -/obj/item/lava_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() +/obj/item/lava_staff/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) + +/obj/item/lava_staff/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(timer > world.time) - return - . |= AFTERATTACK_PROCESSED_ITEM - if(is_type_in_typecache(target, banned_turfs)) - return - if(target in view(user.client.view, get_turf(user))) - var/turf/open/T = get_turf(target) - if(!istype(T)) - return - if(!islava(T)) - var/obj/effect/temp_visual/lavastaff/L = new /obj/effect/temp_visual/lavastaff(T) - L.alpha = 0 - animate(L, alpha = 255, time = create_delay) - user.visible_message(span_danger("[user] points [src] at [T]!")) - timer = world.time + create_delay + 1 - if(do_after(user, create_delay, target = T)) - var/old_name = T.name - if(T.TerraformTurf(turf_type, flags = CHANGETURF_INHERIT_AIR)) - user.visible_message(span_danger("[user] turns \the [old_name] into [transform_string]!")) - message_admins("[ADMIN_LOOKUPFLW(user)] fired the lava staff at [ADMIN_VERBOSEJMP(T)]") - user.log_message("fired the lava staff at [AREACOORD(T)].", LOG_ATTACK) - timer = world.time + create_cooldown - playsound(T,'sound/magic/fireball.ogg', 200, TRUE) - else - timer = world.time - qdel(L) - else + return NONE + if(is_type_in_typecache(interacting_with, banned_turfs)) + return NONE + if(!(interacting_with in view(user.client.view, get_turf(user)))) + return NONE + var/turf/open/T = get_turf(interacting_with) + if(!istype(T)) + return NONE + if(!islava(T)) + var/obj/effect/temp_visual/lavastaff/L = new /obj/effect/temp_visual/lavastaff(T) + L.alpha = 0 + animate(L, alpha = 255, time = create_delay) + user.visible_message(span_danger("[user] points [src] at [T]!")) + timer = world.time + create_delay + 1 + if(do_after(user, create_delay, target = T)) var/old_name = T.name - if(T.TerraformTurf(reset_turf_type, flags = CHANGETURF_INHERIT_AIR)) - user.visible_message(span_danger("[user] turns \the [old_name] into [reset_string]!")) - timer = world.time + reset_cooldown + if(T.TerraformTurf(turf_type, flags = CHANGETURF_INHERIT_AIR)) + user.visible_message(span_danger("[user] turns \the [old_name] into [transform_string]!")) + message_admins("[ADMIN_LOOKUPFLW(user)] fired the lava staff at [ADMIN_VERBOSEJMP(T)]") + user.log_message("fired the lava staff at [AREACOORD(T)].", LOG_ATTACK) + timer = world.time + create_cooldown playsound(T,'sound/magic/fireball.ogg', 200, TRUE) + else + timer = world.time + qdel(L) + else + var/old_name = T.name + if(T.TerraformTurf(reset_turf_type, flags = CHANGETURF_INHERIT_AIR)) + user.visible_message(span_danger("[user] turns \the [old_name] into [reset_string]!")) + timer = world.time + reset_cooldown + playsound(T,'sound/magic/fireball.ogg', 200, TRUE) + return ITEM_INTERACT_SUCCESS /obj/effect/temp_visual/lavastaff icon_state = "lavastaff_warn" @@ -1028,23 +1031,27 @@ affected_weather.wind_down() user.log_message("has dispelled a storm at [AREACOORD(user_turf)].", LOG_GAME) -/obj/item/storm_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/storm_staff/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return thunder_blast(interacting_with, user) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + +/obj/item/storm_staff/afterattack(atom/target, mob/user, click_parameters) + thunder_blast(target, user) + +/obj/item/storm_staff/proc/thunder_blast(atom/target, mob/user) if(!thunder_charges) balloon_alert(user, "needs to charge!") - return + return FALSE var/turf/target_turf = get_turf(target) var/area/target_area = get_area(target) if(!target_turf || !target_area || (is_type_in_list(target_area, excluded_areas))) balloon_alert(user, "can't bolt here!") - return + return FALSE if(target_turf in targeted_turfs) balloon_alert(user, "already targeted!") - return + return FALSE if(HAS_TRAIT(user, TRAIT_PACIFISM)) balloon_alert(user, "you don't want to harm!") - return + return FALSE var/power_boosted = FALSE for(var/datum/weather/weather as anything in SSweather.processing) if(weather.stage != MAIN_STAGE) @@ -1060,6 +1067,7 @@ thunder_charges-- addtimer(CALLBACK(src, PROC_REF(recharge)), thunder_charge_time) user.log_message("fired the staff of storms at [AREACOORD(target_turf)].", LOG_ATTACK) + return TRUE /obj/item/storm_staff/proc/recharge(mob/user) thunder_charges = min(thunder_charges + 1, max_thunder_charges) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 65644b00cc87a..e9c226731e747 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -646,20 +646,18 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ continue target_airlock.lock() -/obj/item/coin/eldritch/afterattack(atom/target_atom, mob/user, proximity) - . = ..() - if(!proximity) - return +/obj/item/coin/eldritch/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!istype(interacting_with, /obj/machinery/door/airlock)) + return NONE if(!IS_HERETIC(user)) - var/mob/living/living_user = user - living_user.adjustBruteLoss(5) - living_user.adjustFireLoss(5) - return - if(istype(target_atom, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/target_airlock = target_atom - to_chat(user, span_warning("You insert [src] into the airlock.")) - target_airlock.emag_act(user, src) - qdel(src) + user.adjustBruteLoss(5) + user.adjustFireLoss(5) + return ITEM_INTERACT_BLOCKING + var/obj/machinery/door/airlock/target_airlock = interacting_with + to_chat(user, span_warning("You insert [src] into the airlock.")) + target_airlock.emag_act(user, src) + qdel(src) + return ITEM_INTERACT_SUCCESS #undef GIBTONITE_QUALITY_HIGH #undef GIBTONITE_QUALITY_LOW diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 3d4fb9577b611..49ac17d48ece9 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -93,8 +93,9 @@ return preview_job -/datum/preferences/proc/render_new_preview_appearance(mob/living/carbon/human/dummy/mannequin) - var/datum/job/preview_job = get_highest_priority_job() +/datum/preferences/proc/render_new_preview_appearance(mob/living/carbon/human/dummy/mannequin, show_job_clothes = TRUE) + var/datum/job/no_job = SSjob.GetJobType(/datum/job/unassigned) + var/datum/job/preview_job = get_highest_priority_job() || no_job if(preview_job) // Silicons only need a very basic preview since there is no customization for them. @@ -106,9 +107,13 @@ // Set up the dummy for its photoshoot apply_prefs_to(mannequin, TRUE) - if(preview_job) - mannequin.job = preview_job.title - mannequin.dress_up_as_job(preview_job, TRUE) + mannequin.job = preview_job.title + mannequin.dress_up_as_job( + equipping = show_job_clothes ? preview_job : no_job, + visual_only = TRUE, + player_client = parent, + consistent = TRUE, + ) // Apply visual quirks // Yes we do it every time because it needs to be done after job gear diff --git a/code/modules/mob/living/basic/health_adjustment.dm b/code/modules/mob/living/basic/health_adjustment.dm index 6e5f4cc95af6c..bae9d7b9e57b5 100644 --- a/code/modules/mob/living/basic/health_adjustment.dm +++ b/code/modules/mob/living/basic/health_adjustment.dm @@ -66,3 +66,6 @@ if(updating_stamina) update_stamina() . -= staminaloss + +/mob/living/basic/received_stamina_damage(current_level, amount_actual, amount) + return diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm index 32f0ed80121f1..54fe9a07367cf 100644 --- a/code/modules/mob/living/basic/minebots/minebot.dm +++ b/code/modules/mob/living/basic/minebots/minebot.dm @@ -215,10 +215,10 @@ balloon_alert(user, "now [combat_mode ? "attacking wildlife" : "collecting loose ore"]") return CLICK_ACTION_SUCCESS -/mob/living/basic/mining_drone/RangedAttack(atom/target) +/mob/living/basic/mining_drone/RangedAttack(atom/target, list/modifiers) if(!combat_mode) return - stored_gun.afterattack(target, src) + stored_gun.try_fire_gun(target, src, list2params(modifiers)) /mob/living/basic/mining_drone/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) . = ..() diff --git a/code/modules/mob/living/basic/minebots/minebot_remote_control.dm b/code/modules/mob/living/basic/minebots/minebot_remote_control.dm index 618edc3d0b68e..3601940912389 100644 --- a/code/modules/mob/living/basic/minebots/minebot_remote_control.dm +++ b/code/modules/mob/living/basic/minebots/minebot_remote_control.dm @@ -43,22 +43,22 @@ user.client?.mouse_override_icon = 'icons/effects/mouse_pointers/weapon_pointer.dmi' user.update_mouse_pointer() -/obj/item/minebot_remote_control/afterattack(atom/attacked_atom, mob/living/user, proximity) - . = ..() - - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/minebot_remote_control/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return ranged_interact_with_atom(interacting_with, user, modifiers) +/obj/item/minebot_remote_control/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!primed) user.balloon_alert(user, "not primed!") - return - var/turf/target_turf = get_turf(attacked_atom) + return ITEM_INTERACT_BLOCKING + var/turf/target_turf = get_turf(interacting_with) if(isnull(target_turf) || isclosedturf(target_turf) || isgroundlessturf(target_turf)) user.balloon_alert(user, "invalid target!") - return + return ITEM_INTERACT_BLOCKING playsound(src, 'sound/machines/beep.ogg', 30) clear_priming() new /obj/effect/temp_visual/minebot_target(target_turf) COOLDOWN_START(src, bomb_timer, BOMB_COOLDOWN) + return ITEM_INTERACT_SUCCESS /obj/effect/temp_visual/minebot_target name = "Rocket Target" diff --git a/code/modules/mob/living/basic/minebots/minebot_upgrades.dm b/code/modules/mob/living/basic/minebots/minebot_upgrades.dm index 14c62f7fefc51..881342bcf662a 100644 --- a/code/modules/mob/living/basic/minebots/minebot_upgrades.dm +++ b/code/modules/mob/living/basic/minebots/minebot_upgrades.dm @@ -5,11 +5,11 @@ icon = 'icons/obj/devices/circuitry_n_data.dmi' item_flags = NOBLUDGEON -/obj/item/mine_bot_upgrade/afterattack(mob/living/basic/mining_drone/minebot, mob/user, proximity) - . = ..() - if(!istype(minebot) || !proximity) - return - upgrade_bot(minebot, user) +/obj/item/mine_bot_upgrade/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!istype(interacting_with, /mob/living/basic/mining_drone)) + return NONE + upgrade_bot(interacting_with, user) + return ITEM_INTERACT_SUCCESS /obj/item/mine_bot_upgrade/proc/upgrade_bot(mob/living/basic/mining_drone/minebot, mob/user) if(minebot.melee_damage_upper != initial(minebot.melee_damage_upper)) @@ -90,4 +90,3 @@ icon = 'icons/mob/silicon/aibots.dmi' icon_state = "minebot_shield_bottom_layer" layer = BELOW_MOB_LAYER - diff --git a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm index 04d52cf62125a..f936caa1d51ef 100644 --- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm +++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm @@ -18,18 +18,17 @@ /mob/living/basic/guardian, )) -/obj/item/fugu_gland/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(!proximity_flag || !isanimal_or_basicmob(target) || fugu_blacklist[target.type]) - return - var/mob/living/animal = target +/obj/item/fugu_gland/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isanimal_or_basicmob(interacting_with) || fugu_blacklist[interacting_with.type]) + return NONE + var/mob/living/animal = interacting_with if(animal.stat == DEAD || HAS_TRAIT(animal, TRAIT_FAKEDEATH)) balloon_alert(user, "it's dead!") - return + return ITEM_INTERACT_BLOCKING if(HAS_TRAIT(animal, TRAIT_FUGU_GLANDED)) balloon_alert(user, "already large!") - return + return ITEM_INTERACT_BLOCKING ADD_TRAIT(animal, TRAIT_FUGU_GLANDED, type) animal.AddComponent(/datum/component/seethrough_mob) @@ -41,3 +40,4 @@ animal.AddElement(/datum/element/wall_tearer) to_chat(user, span_info("You increase the size of [animal], giving [animal.p_them()] a surge of strength!")) qdel(src) + return ITEM_INTERACT_SUCCESS diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index cf12c2b4083d5..f951b8c4898fc 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -352,18 +352,18 @@ return ..() -/obj/item/food/deadmouse/afterattack(obj/target, mob/living/user, proximity_flag) - . = ..() - if(proximity_flag && reagents && target.is_open_container()) - . |= AFTERATTACK_PROCESSED_ITEM - // is_open_container will not return truthy if target.reagents doesn't exist - var/datum/reagents/target_reagents = target.reagents - var/trans_amount = reagents.maximum_volume - reagents.total_volume * (4 / 3) - if(target_reagents.has_reagent(/datum/reagent/fuel) && target_reagents.trans_to(src, trans_amount)) - to_chat(user, span_notice("You dip [src] into [target].")) - else - to_chat(user, span_warning("That's a terrible idea.")) - return . +/obj/item/food/deadmouse/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(isnull(reagents) || !interacting_with.is_open_container()) + return NONE + + // is_open_container will not return truthy if target.reagents doesn't exist + var/datum/reagents/target_reagents = interacting_with.reagents + var/trans_amount = reagents.maximum_volume - reagents.total_volume * (4 / 3) + if(target_reagents.has_reagent(/datum/reagent/fuel) && target_reagents.trans_to(src, trans_amount)) + to_chat(user, span_notice("You dip [src] into [interacting_with].")) + else + to_chat(user, span_warning("That's a terrible idea.")) + return ITEM_INTERACT_BLOCKING /obj/item/food/deadmouse/moldy name = "moldy dead mouse" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 2f8848b378020..97470f30d12e0 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -23,15 +23,14 @@ QDEL_NULL(dna) GLOB.carbon_list -= src -/mob/living/carbon/item_tending(mob/living/user, obj/item/tool, list/modifiers) +/mob/living/carbon/item_interaction(mob/living/user, obj/item/tool, list/modifiers) . = ..() if(. & ITEM_INTERACT_ANY_BLOCKER) return . - + // Needs to happen after parent call otherwise wounds are prioritized over surgery for(var/datum/wound/wound as anything in shuffle(all_wounds)) if(wound.try_treating(tool, user)) return ITEM_INTERACT_SUCCESS - return . /mob/living/carbon/CtrlShiftClick(mob/user) @@ -570,19 +569,6 @@ remove_movespeed_modifier(/datum/movespeed_modifier/carbon_softcrit) SEND_SIGNAL(src, COMSIG_LIVING_HEALTH_UPDATE) -/mob/living/carbon/update_stamina() - var/stam = getStaminaLoss() - if(stam > DAMAGE_PRECISION && (maxHealth - stam) <= crit_threshold) - if (!stat) - enter_stamcrit() - else if(HAS_TRAIT_FROM(src, TRAIT_INCAPACITATED, STAMINA)) - REMOVE_TRAIT(src, TRAIT_INCAPACITATED, STAMINA) - REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, STAMINA) - REMOVE_TRAIT(src, TRAIT_FLOORED, STAMINA) - else - return - update_stamina_hud() - /mob/living/carbon/update_sight() if(!client) return diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 0abad43c13d38..9f78c62e741ab 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -229,15 +229,6 @@ show_message(span_userdanger("The blob attacks!")) adjustBruteLoss(10) -/mob/living/carbon/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_CONTENTS) - return - for(var/obj/item/organ/organ as anything in organs) - organ.emp_act(severity) - for(var/obj/item/bodypart/bodypart as anything in src.bodyparts) - bodypart.emp_act(severity) - ///Adds to the parent by also adding functionality to propagate shocks through pulling and doing some fluff effects. /mob/living/carbon/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE, jitter_time = 20 SECONDS, stutter_time = 4 SECONDS, stun_duration = 4 SECONDS) . = ..() diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index d3e57c4ec1df1..7b61b4cb8ea85 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -86,9 +86,6 @@ /// This number is also reset to 0 every tick of carbon Life(). Pain. var/damageoverlaytemp = 0 - ///used to halt stamina regen temporarily - var/stam_regen_start_time = 0 - /// Protection (insulation) from the heat, Value 0-1 corresponding to the percentage of protection var/heat_protection = 0 // No heat protection /// Protection (insulation) from the cold, Value 0-1 corresponding to the percentage of protection diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index aeba381703b10..b781b296bc882 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -144,10 +144,10 @@ if(AT_TOXIN_VOMIT_THRESHOLD(src)) apply_status_effect(/datum/status_effect/tox_vomit) -/mob/living/carbon/adjustStaminaLoss(amount, updating_stamina, forced, required_biotype = ALL) +/mob/living/carbon/received_stamina_damage(current_level, amount_actual, amount) . = ..() - if(amount > 0) - stam_regen_start_time = world.time + STAMINA_REGEN_BLOCK_TIME + if((maxHealth - current_level) <= crit_threshold && stat != DEAD) + apply_status_effect(/datum/status_effect/incapacitating/stamcrit) /** * If an organ exists in the slot requested, and we are capable of taking damage (we don't have [GODMODE] on), call the damage proc on that organ. diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 2432888cce65d..6e1f9037018b6 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -796,9 +796,6 @@ if(leg_clothes) burning_items |= leg_clothes - for(var/obj/item/burnable_item in held_items) - burning_items |= burnable_item - for(var/obj/item/burning in burning_items) burning.fire_act((stacks * 25 * seconds_per_tick)) //damage taken is reduced to 2% of this value by fire_act() diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 96fc7f5ecd66d..e09d68db5fde8 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -24,11 +24,7 @@ if(stat != DEAD) handle_brain_damage(seconds_per_tick, times_fired) - if(stat == DEAD) - stop_sound_channel(CHANNEL_HEARTBEAT) - else - if(getStaminaLoss() > 0 && stam_regen_start_time <= world.time) - adjustStaminaLoss(-INFINITY) + if(stat != DEAD) handle_bodyparts(seconds_per_tick, times_fired) if(. && mind) //. == not dead diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index ba19418e2e220..eb1e95ad9db5d 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -10,7 +10,8 @@ return if(check_stun_immunity(CANKNOCKDOWN)) return - SEND_SIGNAL(src, COMSIG_CARBON_ENTER_STAMCRIT) + if (SEND_SIGNAL(src, COMSIG_CARBON_ENTER_STAMCRIT) & STAMCRIT_CANCELLED) + return to_chat(src, span_notice("You're too exhausted to keep going...")) add_traits(list(TRAIT_INCAPACITATED, TRAIT_IMMOBILIZED, TRAIT_FLOORED), STAMINA) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 49f7a7d7701b6..1ae6d3357e594 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -451,26 +451,42 @@ /mob/living/proc/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL) if(!can_adjust_stamina_loss(amount, forced, required_biotype)) return 0 - . = staminaloss + var/old_amount = staminaloss staminaloss = clamp((staminaloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, max_stamina) - . -= staminaloss - if(. == 0) // no change, no need to update + var/delta = old_amount - staminaloss + if(delta <= 0) + // need to check for stamcrit AFTER canadjust but BEFORE early return here + received_stamina_damage(staminaloss, -1 * delta) + if(delta == 0) // no change, no need to update return 0 if(updating_stamina) updatehealth() + return delta /mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL) if(!forced && (status_flags & GODMODE)) - return FALSE + return 0 if(!forced && !(mob_biotypes & required_biotype)) - return FALSE - . = staminaloss + return 0 + var/old_amount = staminaloss staminaloss = amount - . -= staminaloss - if(!.) // no change, no need to update - return FALSE + var/delta = old_amount - staminaloss + if(delta <= 0 && amount >= DAMAGE_PRECISION) + received_stamina_damage(staminaloss, -1 * delta, amount) + if(delta == 0) // no change, no need to update + return 0 if(updating_stamina) updatehealth() + return delta + +/// The mob has received stamina damage +/// +/// - current_level: The mob's current stamina damage amount (to save unnecessary getStaminaLoss() calls) +/// - amount_actual: The amount of stamina damage received, in actuality +/// For example, if you are taking 50 stamina damage but are at 90, you would actually only receive 30 stamina damage (due to the cap) +/// - amount: The amount of stamina damage received, raw +/mob/living/proc/received_stamina_damage(current_level, amount_actual, amount) + addtimer(CALLBACK(src, PROC_REF(setStaminaLoss), 0, TRUE, TRUE), stamina_regen_time, TIMER_UNIQUE|TIMER_OVERRIDE) /** * heal ONE external organ, organ gets randomly selected from damaged ones. diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6cc826aa580fd..40070192b24c7 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1376,7 +1376,7 @@ return TRUE /mob/living/proc/update_stamina() - return + update_stamina_hud() /mob/living/carbon/alien/update_stamina() return diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 8f68886af0b7d..9834267047a05 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -226,3 +226,6 @@ /// What our current gravity state is. Used to avoid duplicate animates and such var/gravity_state = null + + /// How long it takes to return to 0 stam + var/stamina_regen_time = 10 SECONDS diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index 58e5a244eaf74..90a41f1f2bf00 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -13,6 +13,9 @@ /mob/living/silicon/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) return FALSE +/mob/living/silicon/received_stamina_damage(current_level, amount_actual, amount) + return + /mob/living/silicon/adjustOrganLoss(slot, amount, maximum = 500, required_organ_flag) //immune to organ damage (no organs, duh) return FALSE diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm index f4487bfc9d9d7..db883e9141b1f 100644 --- a/code/modules/mob/living/simple_animal/bot/firebot.dm +++ b/code/modules/mob/living/simple_animal/bot/firebot.dm @@ -82,7 +82,7 @@ if(!can_unarmed_attack()) return if(internal_ext) - internal_ext.afterattack(A, src) + internal_ext.interact_with_atom(A, src, modifiers) else return ..() @@ -90,7 +90,7 @@ if(!(bot_mode_flags & BOT_MODE_ON)) return if(internal_ext) - internal_ext.afterattack(A, src) + internal_ext.interact_with_atom(A, src, modifiers) else return ..() @@ -289,7 +289,7 @@ flick("firebots_use", user) else flick("firebot1_use", user) - internal_ext.afterattack(target, user, null) + internal_ext.interact_with_atom(target, src) /mob/living/simple_animal/bot/firebot/update_icon_state() . = ..() diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm index 3e49ac30559b3..7a8a2fcb63b91 100644 --- a/code/modules/mob/living/simple_animal/damage_procs.dm +++ b/code/modules/mob/living/simple_animal/damage_procs.dm @@ -65,3 +65,6 @@ staminaloss = max(0, min(max_staminaloss, staminaloss + (amount * damage_coeff[STAMINA]))) if(updating_stamina) update_stamina() + +/mob/living/simple_animal/received_stamina_damage(current_level, amount_actual, amount) + return diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index 37649ceb3c5cf..193545d9985fa 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -122,7 +122,7 @@ Difficulty: Medium new /obj/effect/temp_visual/dir_setting/miner_death(loc, dir) /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Move(atom/newloc) - if(newloc && newloc.z == z && (islava(newloc) || ischasm(newloc))) //we're not stupid! + if(newloc && newloc.z == z && ischasm(newloc)) //we're not stupid! return FALSE return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 71801a44c95ef..7139f6a92bfcd 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -368,26 +368,26 @@ While using this makes the system rely on OnFire, it still gives options for tim throw_speed = 3 throw_range = 5 -/obj/item/tumor_shard/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(istype(target, /mob/living/simple_animal/hostile/asteroid/elite) && proximity_flag) - var/mob/living/simple_animal/hostile/asteroid/elite/E = target - if(E.stat != DEAD || E.sentience_type != SENTIENCE_BOSS || !E.key) - user.visible_message(span_notice("It appears [E] is unable to be revived right now. Perhaps try again later.")) - return - E.faction = list("[REF(user)]") - E.revive(HEAL_ALL) - user.visible_message(span_notice("[user] stabs [E] with [src], reviving it.")) - E.playsound_local(get_turf(E), 'sound/effects/magic.ogg', 40, 0) - to_chat(E, "You have been revived by [user]. While you can't speak to them, you owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk.") - to_chat(E, "Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!") - E.maxHealth = E.maxHealth * 0.4 - E.health = E.maxHealth - E.desc = "[E.desc] However, this one appears to be less wild in nature, and calmer around people." - E.sentience_type = SENTIENCE_ORGANIC - qdel(src) - else - to_chat(user, span_info("[src] only works on the corpse of a sentient lavaland elite.")) +/obj/item/tumor_shard/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!istype(interacting_with, /mob/living/simple_animal/hostile/asteroid/elite)) + return NONE + + var/mob/living/simple_animal/hostile/asteroid/elite/E = interacting_with + if(E.stat != DEAD || E.sentience_type != SENTIENCE_BOSS || !E.key) + user.visible_message(span_notice("It appears [E] is unable to be revived right now. Perhaps try again later.")) + return ITEM_INTERACT_BLOCKING + E.faction = list("[REF(user)]") + E.revive(HEAL_ALL) + user.visible_message(span_notice("[user] stabs [E] with [src], reviving it.")) + E.playsound_local(get_turf(E), 'sound/effects/magic.ogg', 40, 0) + to_chat(E, "You have been revived by [user]. While you can't speak to them, you owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk.") + to_chat(E, "Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!") + E.maxHealth = E.maxHealth * 0.4 + E.health = E.maxHealth + E.desc = "[E.desc] However, this one appears to be less wild in nature, and calmer around people." + E.sentience_type = SENTIENCE_ORGANIC + qdel(src) + return ITEM_INTERACT_SUCCESS /obj/effect/temp_visual/elite_tumor_wall name = "magic wall" diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 4fd168cee044a..05bcb44ae26a3 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -142,6 +142,9 @@ if(active) . += span_notice("Charge: [core ? "[get_charge_percent()]%" : "No core"].") . += span_notice("Selected module: [selected_module || "None"].") + if(atom_storage) + . += span_notice("While the suit's panel is open, \ + being on combat mode will prevent you from inserting items into it when clicking on it.") if(!open && !active) if(!wearer) . += span_notice("You could equip it to turn it on.") @@ -239,33 +242,28 @@ return ..() /obj/item/mod/control/wrench_act(mob/living/user, obj/item/wrench) - if(..()) - return TRUE if(seconds_electrified && get_charge() && shock(user)) - return TRUE + return ITEM_INTERACT_BLOCKING if(open) if(!core) balloon_alert(user, "no core!") - return TRUE + return ITEM_INTERACT_BLOCKING balloon_alert(user, "removing core...") wrench.play_tool_sound(src, 100) if(!wrench.use_tool(src, user, 3 SECONDS) || !open) balloon_alert(user, "interrupted!") - return TRUE + return ITEM_INTERACT_BLOCKING wrench.play_tool_sound(src, 100) balloon_alert(user, "core removed") core.forceMove(drop_location()) - return TRUE - return ..() + return ITEM_INTERACT_SUCCESS + return NONE /obj/item/mod/control/screwdriver_act(mob/living/user, obj/item/screwdriver) - . = ..() - if(.) - return TRUE if(active || activating || ai_controller) balloon_alert(user, "deactivate suit first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE + return ITEM_INTERACT_BLOCKING balloon_alert(user, "[open ? "closing" : "opening"] cover...") screwdriver.play_tool_sound(src, 100) if(screwdriver.use_tool(src, user, 1 SECONDS)) @@ -276,21 +274,21 @@ open = !open else balloon_alert(user, "interrupted!") - return TRUE + return ITEM_INTERACT_SUCCESS /obj/item/mod/control/crowbar_act(mob/living/user, obj/item/crowbar) . = ..() if(!open) balloon_alert(user, "open the cover first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE + return ITEM_INTERACT_BLOCKING if(!allowed(user)) balloon_alert(user, "insufficient access!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return + return ITEM_INTERACT_BLOCKING if(SEND_SIGNAL(src, COMSIG_MOD_MODULE_REMOVAL, user) & MOD_CANCEL_REMOVAL) playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE + return ITEM_INTERACT_BLOCKING if(length(modules)) var/list/removable_modules = list() for(var/obj/item/mod/module/module as anything in modules) @@ -299,52 +297,64 @@ removable_modules += module var/obj/item/mod/module/module_to_remove = tgui_input_list(user, "Which module to remove?", "Module Removal", removable_modules) if(!module_to_remove?.mod) - return FALSE + return ITEM_INTERACT_BLOCKING uninstall(module_to_remove) module_to_remove.forceMove(drop_location()) crowbar.play_tool_sound(src, 100) SEND_SIGNAL(src, COMSIG_MOD_MODULE_REMOVED, user) - return TRUE + return ITEM_INTERACT_SUCCESS balloon_alert(user, "no modules!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE + return ITEM_INTERACT_BLOCKING + +/obj/item/mod/control/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) + if(user.combat_mode) + // Block all item-click-inserts when we're open + // Other form of insertion will still function (mousedrop, hotkey) + if(open) + return FALSE + // ...You have to open it up somehow though + if(inserted.tool_behaviour == TOOL_SCREWDRIVER) + return FALSE + return TRUE -/obj/item/mod/control/attackby(obj/item/attacking_item, mob/living/user, params) +/obj/item/mod/control/item_interaction(mob/living/user, obj/item/attacking_item, list/modifiers) if(istype(attacking_item, /obj/item/pai_card)) if(!open) balloon_alert(user, "open the cover first!") - return FALSE + return ITEM_INTERACT_BLOCKING insert_pai(user, attacking_item) - return TRUE + return ITEM_INTERACT_SUCCESS if(istype(attacking_item, /obj/item/mod/module)) if(!open) balloon_alert(user, "open the cover first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE + return ITEM_INTERACT_BLOCKING install(attacking_item, user) SEND_SIGNAL(src, COMSIG_MOD_MODULE_ADDED, user) - return TRUE - else if(istype(attacking_item, /obj/item/mod/core)) + return ITEM_INTERACT_SUCCESS + if(istype(attacking_item, /obj/item/mod/core)) if(!open) balloon_alert(user, "open the cover first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE + return ITEM_INTERACT_BLOCKING if(core) balloon_alert(user, "core already installed!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE + return ITEM_INTERACT_BLOCKING var/obj/item/mod/core/attacking_core = attacking_item attacking_core.install(src) balloon_alert(user, "core installed") playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) - return TRUE - else if(is_wire_tool(attacking_item) && open) - wires.interact(user) - return TRUE - else if(open && attacking_item.GetID()) - update_access(user, attacking_item.GetID()) - return TRUE - return ..() + return ITEM_INTERACT_SUCCESS + if(open) + if(is_wire_tool(attacking_item)) + wires.interact(user) + return ITEM_INTERACT_SUCCESS + if(attacking_item.GetID()) + update_access(user, attacking_item.GetID()) + return ITEM_INTERACT_SUCCESS + return NONE /obj/item/mod/control/get_cell() var/obj/item/stock_parts/cell/cell = get_charge_source() diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 70e930ca31e3e..46b9b8f31fdd2 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -104,7 +104,7 @@ return ..() /obj/structure/filingcabinet/attack_self_tk(mob/user) - . = COMPONENT_CANCEL_ATTACK_CHAIN + . = ITEM_INTERACT_BLOCKING if(contents.len) if(prob(40 + contents.len * 5)) var/obj/item/I = pick(contents) @@ -203,4 +203,3 @@ GLOBAL_LIST_EMPTY(employmentCabinets) fillCurrent() virgin = FALSE return ..() - diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 88fc176801a7f..98f6662f8c525 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -116,7 +116,7 @@ labels_left = initial(labels_left) //Yes, it's capped at its initial value return ITEM_INTERACT_SUCCESS -/obj/item/hand_labeler/attackby_storage_insert(datum/storage, atom/storage_holder, mob/user) +/obj/item/hand_labeler/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/user) return !mode /obj/item/hand_labeler/borg diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 5dd5515c47c4c..fe2de7e752030 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -205,8 +205,17 @@ var/datum/paper_field/field_data_datum = null var/is_signature = ((text == "%sign") || (text == "%s")) + var/is_date = ((text == "%date") || (text == "%d")) + var/is_time = ((text == "%time") || (text == "%t")) + + var/field_text = text + if(is_signature) + field_text = signature_name + else if(is_date) + field_text = "[time2text(world.timeofday, "DD/MM")]/[CURRENT_STATION_YEAR]" + else if(is_time) + field_text = time2text(world.timeofday, "hh:mm") - var/field_text = is_signature ? signature_name : text var/field_font = is_signature ? SIGNATURE_FONT : font for(var/datum/paper_field/field_input in raw_field_input_data) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index ec71eda2e46f4..53df8dbd35b97 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -501,22 +501,22 @@ . += span_notice("To initiate the surrender prompt, simply click on an individual within your proximity.") //Code from the medical penlight -/obj/item/pen/red/security/afterattack(atom/target, mob/living/user, proximity) - . = ..() +/obj/item/pen/red/security/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!COOLDOWN_FINISHED(src, holosign_cooldown)) balloon_alert(user, "not ready!") - return + return ITEM_INTERACT_BLOCKING - var/target_turf = get_turf(target) + var/turf/target_turf = get_turf(interacting_with) var/mob/living/living_target = locate(/mob/living) in target_turf if(!living_target || (living_target == user)) - return + return ITEM_INTERACT_BLOCKING living_target.apply_status_effect(/datum/status_effect/surrender_timed) to_chat(living_target, span_userdanger("[user] requests your immediate surrender! You are given 30 seconds to comply!")) new /obj/effect/temp_visual/security_holosign(target_turf, user) //produce a holographic glow COOLDOWN_START(src, holosign_cooldown, 30 SECONDS) + return ITEM_INTERACT_SUCCESS /obj/effect/temp_visual/security_holosign name = "security holosign" diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 00cb86446bbfb..5814750dab168 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -107,7 +107,7 @@ . += "It has [pictures_left] photos left." //user can be atom or mob -/obj/item/camera/proc/can_target(atom/target, mob/user, prox_flag) +/obj/item/camera/proc/can_target(atom/target, mob/user) if(!on || blending || !pictures_left) return FALSE var/turf/T = get_turf(target) @@ -128,24 +128,30 @@ return FALSE return TRUE -/obj/item/camera/afterattack(atom/target, mob/user, flag) - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/camera/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return ranged_interact_with_atom(interacting_with, user, modifiers) +/obj/item/camera/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if (disk) - if(ismob(target)) + if(ismob(interacting_with)) if (disk.record) QDEL_NULL(disk.record) disk.record = new - var/mob/M = target + var/mob/M = interacting_with disk.record.caller_name = M.name disk.record.set_caller_image(M) else to_chat(user, span_warning("Invalid holodisk target.")) - return + return ITEM_INTERACT_BLOCKING - if(!can_target(target, user, flag)) - return + if(!can_target(interacting_with, user)) + return ITEM_INTERACT_BLOCKING + if(!photo_taken(interacting_with, user)) + return ITEM_INTERACT_BLOCKING + return ITEM_INTERACT_SUCCESS + +/obj/item/camera/proc/photo_taken(atom/target, mob/user) on = FALSE addtimer(CALLBACK(src, PROC_REF(cooldown)), cooldown) @@ -153,7 +159,7 @@ icon_state = state_off INVOKE_ASYNC(src, PROC_REF(captureimage), target, user, picture_size_x - 1, picture_size_y - 1) - + return TRUE /obj/item/camera/proc/cooldown() UNTIL(!blending) diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm index a7990f65ce5b9..87a46107a4bdd 100644 --- a/code/modules/plumbing/ducts.dm +++ b/code/modules/plumbing/ducts.dm @@ -354,24 +354,23 @@ All the important duct code: duct_color = new_color add_atom_colour(GLOB.pipe_paint_colors[new_color], FIXED_COLOUR_PRIORITY) -/obj/item/stack/ducts/afterattack(atom/target, user, proximity) - . = ..() - if(!proximity) - return - if(istype(target, /obj/machinery/duct)) - var/obj/machinery/duct/duct = target +/obj/item/stack/ducts/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(istype(interacting_with, /obj/machinery/duct)) + var/obj/machinery/duct/duct = interacting_with if(duct.anchored) to_chat(user, span_warning("The duct must be unanchored before it can be picked up.")) - return + return ITEM_INTERACT_BLOCKING // Turn into a duct stack and then merge to the in-hand stack. var/obj/item/stack/ducts/stack = new(duct.loc, 1, FALSE) qdel(duct) if(stack.can_merge(src)) stack.merge(src) - return + return ITEM_INTERACT_SUCCESS + + check_attach_turf(interacting_with) + return ITEM_INTERACT_SUCCESS - check_attach_turf(target) /obj/item/stack/ducts/proc/check_attach_turf(atom/target) if(isopenturf(target) && use(1)) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index db5791da43526..d7ad6a6b3f27a 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -304,10 +304,6 @@ /obj/item/stock_parts/cell/get_part_rating() return maxcharge * 10 + charge -/obj/item/stock_parts/cell/attackby_storage_insert(datum/storage, atom/storage_holder, mob/user) - var/obj/item/mod/control/mod = storage_holder - return !(istype(mod) && mod.open) - /* Cell variants*/ /obj/item/stock_parts/cell/empty empty = TRUE diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index c4be44ed36785..1659d30b2bbe9 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -501,11 +501,12 @@ . = ..() ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) -/obj/item/turret_control/afterattack(atom/targeted_atom, mob/user, proxflag, clickparams) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/turret_control/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return ranged_interact_with_atom(interacting_with, user, modifiers) + +/obj/item/turret_control/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) var/obj/machinery/power/emitter/emitter = user.buckled - emitter.setDir(get_dir(emitter,targeted_atom)) + emitter.setDir(get_dir(emitter, interacting_with)) user.setDir(emitter.dir) switch(emitter.dir) if(NORTH) @@ -541,7 +542,7 @@ user.pixel_x = 8 user.pixel_y = -12 - emitter.last_projectile_params = calculate_projectile_angle_and_pixel_offsets(user, null, clickparams) + emitter.last_projectile_params = calculate_projectile_angle_and_pixel_offsets(user, null, list2params(modifiers)) if(emitter.charge >= 10 && world.time > delay) emitter.charge -= 10 @@ -549,6 +550,7 @@ delay = world.time + 10 else if (emitter.charge < 10) playsound(src,'sound/machines/buzz-sigh.ogg', 50, TRUE) + return ITEM_INTERACT_SUCCESS /obj/machinery/power/emitter/ctf name = "Energy Cannon" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 912f162b922a4..198eed66e3c92 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -248,30 +248,66 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/item/gun/afterattack_secondary(mob/living/victim, mob/living/user, proximity_flag, click_parameters) - if(!isliving(victim) || !IN_GIVEN_RANGE(user, victim, GUNPOINT_SHOOTER_STRAY_RANGE)) - return ..() //if they're out of range, just shootem. - if(!can_hold_up) - return ..() +/obj/item/gun/pre_attack(atom/A, mob/living/user, params) + . = ..() + if(.) + return . + if(isnull(bayonet) || !user.combat_mode) + return . + return bayonet.melee_attack_chain(user, A, params) + +/obj/item/gun/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(user.combat_mode) + return NONE + + if(istype(tool, /obj/item/knife)) + var/obj/item/knife/new_stabber = tool + if(!can_bayonet || !new_stabber.bayonet || !isnull(bayonet)) //ensure the gun has an attachment point available, and that the knife is compatible with it. + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(new_stabber, src)) + return ITEM_INTERACT_BLOCKING + to_chat(user, span_notice("You attach [new_stabber] to [src]'s bayonet lug.")) + bayonet = new_stabber + update_appearance() + return ITEM_INTERACT_SUCCESS + + return NONE + +/obj/item/gun/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(user.combat_mode && isliving(interacting_with)) + return ITEM_INTERACT_SKIP_TO_ATTACK // Gun bash / bayonet attack + if(try_fire_gun(interacting_with, user, list2params(modifiers))) + return ITEM_INTERACT_SUCCESS + return NONE + +/obj/item/gun/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(!can_hold_up || !isliving(interacting_with)) + return interact_with_atom(interacting_with, user, modifiers) + var/datum/component/gunpoint/gunpoint_component = user.GetComponent(/datum/component/gunpoint) if (gunpoint_component) - if(gunpoint_component.target == victim) - balloon_alert(user, "already holding them up!") - else - balloon_alert(user, "already holding someone up!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if (user == victim) + balloon_alert(user, "already holding [gunpoint_component.target == interacting_with ? "them" : "someone"] up!") + return ITEM_INTERACT_BLOCKING + if (user == interacting_with) balloon_alert(user, "can't hold yourself up!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING - if(do_after(user, 0.5 SECONDS, victim)) - user.AddComponent(/datum/component/gunpoint, victim, src) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(do_after(user, 0.5 SECONDS, interacting_with)) + user.AddComponent(/datum/component/gunpoint, interacting_with, src) + return ITEM_INTERACT_SUCCESS + +/obj/item/gun/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(try_fire_gun(interacting_with, user, list2params(modifiers))) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING -/obj/item/gun/afterattack(atom/target, mob/living/user, flag, params) - ..() - fire_gun(target, user, flag, params) - return AFTERATTACK_PROCESSED_ITEM +/obj/item/gun/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(IN_GIVEN_RANGE(user, interacting_with, GUNPOINT_SHOOTER_STRAY_RANGE)) + return interact_with_atom_secondary(interacting_with, user, modifiers) + return ..() + +/obj/item/gun/proc/try_fire_gun(atom/target, mob/living/user, params) + return fire_gun(target, user, user.Adjacent(target), params) /obj/item/gun/proc/fire_gun(atom/target, mob/living/user, flag, params) if(QDELETED(target)) @@ -466,39 +502,6 @@ /obj/item/gun/proc/reset_semicd() semicd = FALSE -/obj/item/gun/attack(mob/M, mob/living/user) - if(user.combat_mode) //Flogging - if(bayonet) - M.attackby(bayonet, user) - return - else - return ..() - return - -/obj/item/gun/attack_atom(obj/O, mob/living/user, params) - if(user.combat_mode) - if(bayonet) - O.attackby(bayonet, user) - return - return ..() - -/obj/item/gun/attackby(obj/item/I, mob/living/user, params) - if(user.combat_mode) - return ..() - - else if(istype(I, /obj/item/knife)) - var/obj/item/knife/K = I - if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it. - return ..() - if(!user.transferItemToLoc(I, src)) - return - to_chat(user, span_notice("You attach [K] to [src]'s bayonet lug.")) - bayonet = K - update_appearance() - - else - return ..() - /obj/item/gun/screwdriver_act(mob/living/user, obj/item/I) . = ..() if(.) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 8c6e2ae7cbde3..30ba65dc94a86 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -159,17 +159,18 @@ underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted(src) update_appearance() -/obj/item/gun/ballistic/automatic/m90/afterattack_secondary(atom/target, mob/living/user, proximity_flag, click_parameters) - underbarrel.afterattack(target, user, proximity_flag, click_parameters) - return SECONDARY_ATTACK_CONTINUE_CHAIN +/obj/item/gun/ballistic/automatic/m90/try_fire_gun(atom/target, mob/living/user, params) + if(LAZYACCESS(params2list(params), RIGHT_CLICK)) + return underbarrel.try_fire_gun(target, user, params) + return ..() -/obj/item/gun/ballistic/automatic/m90/attackby(obj/item/A, mob/user, params) - if(isammocasing(A)) - if(istype(A, underbarrel.magazine.ammo_type)) +/obj/item/gun/ballistic/automatic/m90/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(isammocasing(tool)) + if(istype(tool, underbarrel.magazine.ammo_type)) underbarrel.attack_self(user) - underbarrel.attackby(A, user, params) - else - ..() + underbarrel.attackby(tool, user, list2params(modifiers)) + return ITEM_INTERACT_BLOCKING + return ..() /obj/item/gun/ballistic/automatic/tommygun name = "\improper Thompson SMG" @@ -276,15 +277,15 @@ . += "l6_door_[cover_open ? "open" : "closed"]" -/obj/item/gun/ballistic/automatic/l6_saw/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) - . |= AFTERATTACK_PROCESSED_ITEM - +/obj/item/gun/ballistic/automatic/l6_saw/try_fire_gun(atom/target, mob/living/user, params) if(cover_open) balloon_alert(user, "close the cover!") - return - else - . |= ..() + return FALSE + + . = ..() + if(.) update_appearance() + return . //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/gun/ballistic/automatic/l6_saw/attack_hand(mob/user, list/modifiers) diff --git a/code/modules/projectiles/guns/ballistic/bows/_bow.dm b/code/modules/projectiles/guns/ballistic/bows/_bow.dm index 86094d0fe17ad..15c89ddb8553d 100644 --- a/code/modules/projectiles/guns/ballistic/bows/_bow.dm +++ b/code/modules/projectiles/guns/ballistic/bows/_bow.dm @@ -63,14 +63,13 @@ playsound(src, 'sound/weapons/gun/bow/bow_draw.ogg', 25, TRUE) update_appearance() -/obj/item/gun/ballistic/bow/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE) - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/gun/ballistic/bow/try_fire_gun(atom/target, mob/living/user, params) if(!chambered) - return + return FALSE if(!drawn) to_chat(user, span_warning("Without drawing the bow, the arrow uselessly falls to the ground.")) drop_arrow() - return + return FALSE return ..() //fires, removing the arrow /obj/item/gun/ballistic/bow/equipped(mob/user, slot, initial) diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 21edc7035c5d4..23c41d1d07e15 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -89,8 +89,10 @@ This one has been fitted with a special backblast diverter to prevent 'friendly' fire 'accidents' during use." backblast = FALSE -/obj/item/gun/ballistic/rocketlauncher/afterattack() +/obj/item/gun/ballistic/rocketlauncher/try_fire_gun(atom/target, mob/living/user, params) . = ..() + if(!.) + return magazine.get_round(FALSE) //Hack to clear the mag after it's fired /obj/item/gun/ballistic/rocketlauncher/attack_self_tk(mob/user) diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 53af6c45dd1e7..35660571074fd 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -85,21 +85,20 @@ QDEL_NULL(underbarrel) return ..() -/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/afterattack_secondary(atom/target, mob/living/user, proximity_flag, click_parameters) - underbarrel.afterattack(target, user, proximity_flag, click_parameters) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN +/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/try_fire_gun(atom/target, mob/living/user, params) + if(LAZYACCESS(params2list(params), RIGHT_CLICK)) + return underbarrel.try_fire_gun(target, user, params) + return ..() -/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/afterattack(atom/target, mob/living/user, flag, params) - // mirrors what the standalone fisher does when you hit people with it - . = ..() - if(user.Adjacent(target)) - var/obj/projectile/energy/fisher/melee/simulated_hit = new - simulated_hit.firer = user - simulated_hit.on_hit(target) +/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/afterattack(atom/target, mob/user, click_parameters) + var/obj/projectile/energy/fisher/melee/simulated_hit = new + simulated_hit.firer = user + simulated_hit.on_hit(target) /obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - // as above comment, mirrors what the standalone fisher does when you hit people with it . = ..() + if(.) + return var/obj/projectile/energy/fisher/melee/simulated_hit = new simulated_hit.firer = throwingdatum.get_thrower() simulated_hit.on_hit(hit_atom) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index a06f6954bf374..792edbeaa16aa 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -218,26 +218,24 @@ toggle_magazine() return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/item/gun/ballistic/shotgun/bulldog/afterattack_secondary(mob/living/victim, mob/living/user, proximity_flag, click_parameters) +/obj/item/gun/ballistic/shotgun/bulldog/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) if(secondary_magazine) toggle_magazine() - return SECONDARY_ATTACK_CALL_NORMAL - -/obj/item/gun/ballistic/shotgun/bulldog/attackby_secondary(obj/item/weapon, mob/user, params) - if(!istype(weapon, secondary_magazine_type)) - balloon_alert(user, "[weapon.name] doesn't fit!") - return SECONDARY_ATTACK_CALL_NORMAL - if(!user.transferItemToLoc(weapon, src)) - to_chat(user, span_warning("You cannot seem to get [src] out of your hands!")) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ..() + +/obj/item/gun/ballistic/shotgun/bulldog/item_interaction_secondary(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, secondary_magazine_type)) + return ..() + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING var/obj/item/ammo_box/magazine/old_mag = secondary_magazine - secondary_magazine = weapon + secondary_magazine = tool if(old_mag) user.put_in_hands(old_mag) balloon_alert(user, "secondary [magazine_wording] loaded") playsound(src, load_empty_sound, load_sound_volume, load_sound_vary) update_appearance() - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_SUCCESS /obj/item/gun/ballistic/shotgun/bulldog/click_alt_secondary(mob/user) if(secondary_magazine) @@ -338,6 +336,7 @@ . = ..() . += span_notice("Right-click to shoot the hook.") -/obj/item/gun/ballistic/shotgun/hook/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - hook.afterattack(target, user, proximity_flag, click_parameters) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN +/obj/item/gun/ballistic/shotgun/hook/try_fire_gun(atom/target, mob/living/user, params) + if(LAZYACCESS(params2list(params), RIGHT_CLICK)) + return hook.try_fire_gun(target, user, params) + return ..() diff --git a/code/modules/projectiles/guns/energy/beam_rifle.dm b/code/modules/projectiles/guns/energy/beam_rifle.dm index 11399e9c24dad..e29e1ef4878be 100644 --- a/code/modules/projectiles/guns/energy/beam_rifle.dm +++ b/code/modules/projectiles/guns/energy/beam_rifle.dm @@ -328,26 +328,27 @@ sync_ammo() var/atom/target = source.mouse_object_ref?.resolve() if(target) - INVOKE_ASYNC(src, PROC_REF(afterattack), target, source.mob, FALSE, source.mouseParams, passthrough = TRUE) + INVOKE_ASYNC(src, PROC_REF(try_fire_gun), target, source.mob, source.mouseParams, TRUE) stop_aiming() QDEL_LIST(current_tracers) -/obj/item/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE) - . |= AFTERATTACK_PROCESSED_ITEM - if(flag) //It's adjacent, is the user, or is on the user's person +/obj/item/gun/energy/beam_rifle/try_fire_gun(atom/target, mob/living/user, params, passthrough = FALSE) + if(user.Adjacent(target)) //It's adjacent, is the user, or is on the user's person if(target in user.contents) //can't shoot stuff inside us. - return + return FALSE if(!ismob(target) || user.combat_mode) //melee attack - return + return FALSE if(target == user && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) //so we can't shoot ourselves (unless mouth selected) - return + return FALSE if(!passthrough && (aiming_time > aiming_time_fire_threshold)) - return + return FALSE if(lastfire > world.time + delay) - return + return FALSE + if(!..()) + return FALSE lastfire = world.time - . = ..() stop_aiming() + return TRUE /obj/item/gun/energy/beam_rifle/proc/sync_ammo() for(var/obj/item/ammo_casing/energy/beam_rifle/AC in contents) diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index 7b80e0c69f5cb..a27ee66a1ff5e 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -149,10 +149,11 @@ cell.give(transferred) -/obj/item/gun/energy/minigun/afterattack(atom/target, mob/living/user, flag, params) +/obj/item/gun/energy/minigun/try_fire_gun(atom/target, mob/living/user, params) if(!ammo_pack || ammo_pack.loc != user) to_chat(user, span_warning("You need the backpack power source to fire the gun!")) - . = ..() + return FALSE + return ..() /obj/item/stock_parts/cell/minigun name = "gatling gun fusion core" diff --git a/code/modules/projectiles/guns/energy/recharge.dm b/code/modules/projectiles/guns/energy/recharge.dm index 71d14348608fe..1b9409478cd7e 100644 --- a/code/modules/projectiles/guns/energy/recharge.dm +++ b/code/modules/projectiles/guns/energy/recharge.dm @@ -156,13 +156,13 @@ While some would argue that this is a really terrible design choice, others argue that it is very funny to be able to shoot at light sources.
\ Caveat emptor.") -/obj/item/gun/energy/recharge/fisher/afterattack(atom/target, mob/living/user, flag, params) - // you should just shoot them, but in case you can't/wont +/obj/item/gun/energy/recharge/fisher/attack(mob/living/target_mob, mob/living/user, params) . = ..() - if(user.Adjacent(target)) - var/obj/projectile/energy/fisher/melee/simulated_hit = new - simulated_hit.firer = user - simulated_hit.on_hit(target) + if(.) + return + var/obj/projectile/energy/fisher/melee/simulated_hit = new + simulated_hit.firer = user + simulated_hit.on_hit(target_mob) /obj/item/gun/energy/recharge/fisher/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) // ...you reeeeeally just shoot them, but in case you can't/won't diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 50d7c5385d50d..d184fd746acc9 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -231,17 +231,15 @@ if(istype(WH)) WH.gun = WEAKREF(src) -/obj/item/gun/energy/wormhole_projector/afterattack(atom/target, mob/living/user, flag, params) - if(select == AMMO_SELECT_ORANGE) //Last fired in right click mode. Switch to blue wormhole (left click). - select_fire() +/obj/item/gun/energy/wormhole_projector/try_fire_gun(atom/target, mob/living/user, params) + if(LAZYACCESS(params2list(params), RIGHT_CLICK)) + if(select == AMMO_SELECT_BLUE) //Last fired in left click mode. Switch to orange wormhole (right click). + select_fire() + else + if(select == AMMO_SELECT_ORANGE) //Last fired in right click mode. Switch to blue wormhole (left click). + select_fire() return ..() -/obj/item/gun/energy/wormhole_projector/afterattack_secondary(atom/target, mob/living/user, flag, params) - if(select == AMMO_SELECT_BLUE) //Last fired in left click mode. Switch to orange wormhole (right click). - select_fire() - fire_gun(target, user, flag, params) - return SECONDARY_ATTACK_CONTINUE_CHAIN - /obj/item/gun/energy/wormhole_projector/proc/on_portal_destroy(obj/effect/portal/P) SIGNAL_HANDLER if(P == p_blue) @@ -408,13 +406,15 @@ coin_count++ COOLDOWN_START(src, coin_regen_cd, coin_regen_rate) -/obj/item/gun/energy/marksman_revolver/afterattack_secondary(atom/target, mob/living/user, params) - if(!CAN_THEY_SEE(target, user)) +/obj/item/gun/energy/marksman_revolver/try_fire_gun(atom/target, mob/living/user, params) + if(!LAZYACCESS(params2list(params), RIGHT_CLICK)) return ..() + if(!CAN_THEY_SEE(target, user)) + return ITEM_INTERACT_BLOCKING if(max_coins && coin_count <= 0) to_chat(user, span_warning("You don't have any coins right now!")) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING if(max_coins) START_PROCESSING(SSobj, src) @@ -426,5 +426,4 @@ var/obj/projectile/bullet/coin/new_coin = new(get_turf(user), target_turf, user) new_coin.preparePixelProjectile(target_turf, user) new_coin.fire() - - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_SUCCESS diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 82b78a4859ed0..db51944729fe4 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -33,24 +33,23 @@ return ..() -/obj/item/gun/magic/wand/afterattack(atom/target, mob/living/user) - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/gun/magic/wand/try_fire_gun(atom/target, mob/living/user, params) if(!charges) shoot_with_empty_chamber(user) - return + return FALSE if(target == user) - if(no_den_usage) - var/area/A = get_area(user) - if(istype(A, /area/centcom/wizard_station)) - to_chat(user, span_warning("You know better than to violate the security of The Den, best wait until you leave to use [src].")) - return - else - no_den_usage = 0 + if(no_den_usage && istype(get_area(user), /area/centcom/wizard_station)) + to_chat(user, span_warning("You know better than to violate the security of The Den, best wait until you leave to use [src].")) + return FALSE zap_self(user) + . = TRUE + else - . |= ..() - update_appearance() + . = ..() + if(.) + update_appearance() + return . /obj/item/gun/magic/wand/proc/zap_self(mob/living/user) user.visible_message(span_danger("[user] zaps [user.p_them()]self with [src].")) diff --git a/code/modules/projectiles/guns/special/blastcannon.dm b/code/modules/projectiles/guns/special/blastcannon.dm index f9a8abf7ae3dc..d867ca09c041a 100644 --- a/code/modules/projectiles/guns/special/blastcannon.dm +++ b/code/modules/projectiles/guns/special/blastcannon.dm @@ -110,10 +110,8 @@ update_appearance() return TRUE -/obj/item/gun/blastcannon/afterattack(atom/target, mob/user, flag, params) - . |= AFTERATTACK_PROCESSED_ITEM - - if((!bomb && bombcheck) || !target || (get_dist(get_turf(target), get_turf(user)) <= 2)) +/obj/item/gun/blastcannon/try_fire_gun(atom/target, mob/living/user, params) + if((!bomb && bombcheck) || isnull(target) || (get_dist(get_turf(target), get_turf(user)) <= 2)) return ..() cached_target = WEAKREF(target) @@ -123,12 +121,12 @@ span_danger("[user] points [src] at [target]!"), span_danger("You point [src] at [target]!") ) - return + return FALSE cached_firer = WEAKREF(user) if(!bomb) - fire_debug(target, user, flag, params) - return + fire_debug(target, user, params) + return TRUE playsound(src, dry_fire_sound, 30, TRUE) // *click user.visible_message( @@ -141,8 +139,7 @@ user.log_message("opened blastcannon transfer valve at [AREACOORD(current_turf)] while aiming at [AREACOORD(target_turf)] (target).", LOG_GAME) bomb.toggle_valve() update_appearance() - return - + return TRUE /** * Channels an internal explosion into a blastwave projectile. diff --git a/code/modules/projectiles/guns/special/hand_of_midas.dm b/code/modules/projectiles/guns/special/hand_of_midas.dm index 6a5ccf2dea128..68b8158c32d9f 100644 --- a/code/modules/projectiles/guns/special/hand_of_midas.dm +++ b/code/modules/projectiles/guns/special/hand_of_midas.dm @@ -37,29 +37,36 @@ balloon_alert(user, "not enough gold") // Siphon gold from a victim, recharging our gun & removing their Midas Blight debuff in the process. -/obj/item/gun/magic/midas_hand/afterattack_secondary(mob/living/victim, mob/living/user, proximity_flag, click_parameters) - if(!isliving(victim) || !IN_GIVEN_RANGE(user, victim, gold_suck_range)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(victim == user) - balloon_alert(user, "can't siphon from self") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(!victim.reagents) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - var/gold_amount = victim.reagents.get_reagent_amount(/datum/reagent/gold, type_check = REAGENT_SUB_TYPE) +/obj/item/gun/magic/midas_hand/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(!isliving(interacting_with) || !IN_GIVEN_RANGE(user, interacting_with, gold_suck_range)) + return ITEM_INTERACT_BLOCKING + if(interacting_with == user) + balloon_alert(user, "can't siphon from self!") + return ITEM_INTERACT_BLOCKING + if(!interacting_with.reagents) + return ITEM_INTERACT_BLOCKING + + var/gold_amount = interacting_with.reagents.get_reagent_amount(/datum/reagent/gold, type_check = REAGENT_SUB_TYPE) if(!gold_amount) - balloon_alert(user, "no gold in bloodstream") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - var/gold_beam = user.Beam(victim, icon_state="drain_gold") - if(!do_after(user = user, delay = 1 SECONDS, target = victim, timed_action_flags = (IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE), extra_checks = CALLBACK(src, PROC_REF(check_gold_range), user, victim))) + balloon_alert(user, "no gold in bloodstream!") + return ITEM_INTERACT_BLOCKING + var/mob/living/victim = interacting_with + var/gold_beam = user.Beam(victim, icon_state = "drain_gold") + if(!do_after( + user = user, + delay = 1 SECONDS, + target = victim, + timed_action_flags = (IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE), + extra_checks = CALLBACK(src, PROC_REF(check_gold_range), user, victim), + )) qdel(gold_beam) - balloon_alert(user, "link broken") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + balloon_alert(user, "link broken!") + return ITEM_INTERACT_BLOCKING handle_gold_charges(user, gold_amount) victim.reagents.remove_reagent(/datum/reagent/gold, gold_amount, include_subtypes = TRUE) victim.remove_status_effect(/datum/status_effect/midas_blight) qdel(gold_beam) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_SUCCESS // If we botch a shot, we have to start over again by inserting gold coins into the gun. Can only be done if it has no charges or gold. /obj/item/gun/magic/midas_hand/attackby(obj/item/I, mob/living/user, params) diff --git a/code/modules/projectiles/guns/special/syringe_gun.dm b/code/modules/projectiles/guns/special/syringe_gun.dm index 71b1a82a38029..da93e2c1ab8a7 100644 --- a/code/modules/projectiles/guns/special/syringe_gun.dm +++ b/code/modules/projectiles/guns/special/syringe_gun.dm @@ -77,23 +77,23 @@ return TRUE -/obj/item/gun/syringe/attackby(obj/item/A, mob/user, params, show_msg = TRUE) - if(istype(A, /obj/item/reagent_containers/syringe/bluespace)) - balloon_alert(user, "[A.name] is too big!") - return TRUE - if(istype(A, /obj/item/reagent_containers/syringe)) +/obj/item/gun/syringe/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/reagent_containers/syringe/bluespace)) + balloon_alert(user, "[tool.name] is too big!") + return ITEM_INTERACT_BLOCKING + if(istype(tool, /obj/item/reagent_containers/syringe)) if(syringes.len < max_syringes) - if(!user.transferItemToLoc(A, src)) - return FALSE - balloon_alert(user, "[A.name] loaded") - syringes += A + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "[tool.name] loaded") + syringes += tool recharge_newshot() update_appearance() - playsound(loc, load_sound, 40) - return TRUE - else - balloon_alert(user, "it's already full!") - return FALSE + playsound(src, load_sound, 40) + return ITEM_INTERACT_SUCCESS + balloon_alert(user, "it's full!") + return ITEM_INTERACT_BLOCKING + return NONE /obj/item/gun/syringe/update_overlays() . = ..() @@ -158,24 +158,24 @@ . = ..() chambered = new /obj/item/ammo_casing/dnainjector(src) -/obj/item/gun/syringe/dna/attackby(obj/item/A, mob/user, params, show_msg = TRUE) - if(istype(A, /obj/item/dnainjector)) - var/obj/item/dnainjector/D = A +/obj/item/gun/syringe/dna/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/dnainjector)) + var/obj/item/dnainjector/D = tool if(D.used) balloon_alert(user, "[D.name] is used up!") - return + return ITEM_INTERACT_BLOCKING if(syringes.len < max_syringes) if(!user.transferItemToLoc(D, src)) - return FALSE + return ITEM_INTERACT_BLOCKING balloon_alert(user, "[D.name] loaded") syringes += D recharge_newshot() update_appearance() playsound(loc, load_sound, 40) - return TRUE - else - balloon_alert(user, "it's already full!") - return FALSE + return ITEM_INTERACT_SUCCESS + balloon_alert(user, "it's already full!") + return ITEM_INTERACT_BLOCKING + return NONE /obj/item/gun/syringe/blowgun name = "blowgun" diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 77d6a702b4940..0c4dc094159c6 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -25,32 +25,31 @@ if(isgun(newloc)) gun = newloc -/obj/item/firing_pin/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(proximity_flag) - if(isgun(target)) - . |= AFTERATTACK_PROCESSED_ITEM - var/obj/item/gun/targeted_gun = target - var/obj/item/firing_pin/old_pin = targeted_gun.pin - if(old_pin?.pin_removable && (force_replace || old_pin.pin_hot_swappable)) - if(Adjacent(user)) - user.put_in_hands(old_pin) - else - old_pin.forceMove(targeted_gun.drop_location()) - old_pin.gun_remove(user) - - if(!targeted_gun.pin) - if(!user.temporarilyRemoveItemFromInventory(src)) - return . - if(gun_insert(user, targeted_gun)) - if(old_pin) - balloon_alert(user, "swapped firing pin") - else - balloon_alert(user, "inserted firing pin") +/obj/item/firing_pin/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isgun(interacting_with)) + return NONE + + var/obj/item/gun/targeted_gun = interacting_with + var/obj/item/firing_pin/old_pin = targeted_gun.pin + if(old_pin?.pin_removable && (force_replace || old_pin.pin_hot_swappable)) + if(Adjacent(user)) + user.put_in_hands(old_pin) + else + old_pin.forceMove(targeted_gun.drop_location()) + old_pin.gun_remove(user) + + if(!targeted_gun.pin) + if(!user.temporarilyRemoveItemFromInventory(src)) + return . + if(gun_insert(user, targeted_gun)) + if(old_pin) + balloon_alert(user, "swapped firing pin") else - to_chat(user, span_notice("This firearm already has a firing pin installed.")) + balloon_alert(user, "inserted firing pin") + else + to_chat(user, span_notice("This firearm already has a firing pin installed.")) - return . + return ITEM_INTERACT_SUCCESS /obj/item/firing_pin/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) @@ -190,13 +189,15 @@ fail_message = "dna check failed!" var/unique_enzymes = null -/obj/item/firing_pin/dna/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(proximity_flag && iscarbon(target)) - var/mob/living/carbon/M = target +/obj/item/firing_pin/dna/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(iscarbon(interacting_with)) + var/mob/living/carbon/M = interacting_with if(M.dna && M.dna.unique_enzymes) unique_enzymes = M.dna.unique_enzymes balloon_alert(user, "dna lock set") + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING + return ..() /obj/item/firing_pin/dna/pin_auth(mob/living/carbon/user) if(user && user.dna && user.dna.unique_enzymes) diff --git a/code/modules/reagents/chemistry/items.dm b/code/modules/reagents/chemistry/items.dm index 25f805acdaf1b..6517cbc433909 100644 --- a/code/modules/reagents/chemistry/items.dm +++ b/code/modules/reagents/chemistry/items.dm @@ -78,20 +78,20 @@ ///If the paper was used, and therefore cannot change color again var/used = FALSE -/obj/item/ph_paper/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!is_reagent_container(target)) - return - . |= AFTERATTACK_PROCESSED_ITEM - var/obj/item/reagent_containers/cont = target - if(used == TRUE) - to_chat(user, span_warning("[src] has already been used!")) +/obj/item/ph_paper/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!is_reagent_container(interacting_with)) return + var/obj/item/reagent_containers/cont = interacting_with if(!LAZYLEN(cont.reagents.reagent_list)) - return + return NONE + if(used) + to_chat(user, span_warning("[src] has already been used!")) + return ITEM_INTERACT_BLOCKING CONVERT_PH_TO_COLOR(round(cont.reagents.ph, 1), color) desc += " The paper looks to be around a pH of [round(cont.reagents.ph, 1)]" name = "used [name]" used = TRUE + return ITEM_INTERACT_SUCCESS /* * pH meter that will give a detailed or truncated analysis of all the reagents in of an object with a reagents datum attached to it. Only way of detecting purity for now. @@ -113,18 +113,16 @@ to_chat(user, span_notice("You switch the chemical analyzer to not include reagent descriptions in it's report.")) scanmode = SHORTENED_CHEM_OUTPUT -/obj/item/ph_meter/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!is_reagent_container(target)) - return - . |= AFTERATTACK_PROCESSED_ITEM - var/obj/item/reagent_containers/cont = target - if(LAZYLEN(cont.reagents.reagent_list) == null) - return +/obj/item/ph_meter/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!is_reagent_container(interacting_with)) + return NONE + var/obj/item/reagent_containers/cont = interacting_with + if(!LAZYLEN(cont.reagents.reagent_list)) + return NONE var/list/out_message = list() to_chat(user, "The chemistry meter beeps and displays:") out_message += "Total volume: [round(cont.volume, 0.01)] Current temperature: [round(cont.reagents.chem_temp, 0.1)]K Total pH: [round(cont.reagents.ph, 0.01)]\n" - out_message += "Chemicals found in [target.name]:\n" + out_message += "Chemicals found in [interacting_with.name]:
\n" if(cont.reagents.is_reacting) out_message += "[span_warning("A reaction appears to be occuring currently.")]\n" for(var/datum/reagent/reagent in cont.reagents.reagent_list) @@ -137,6 +135,7 @@ out_message += "Analysis: [reagent.description]\n" to_chat(user, "[out_message.Join()]") desc = "An electrode attached to a small circuit box that will display details of a solution. Can be toggled to provide a description of each of the reagents. The screen currently displays detected vol: [round(cont.volume, 0.01)] detected pH:[round(cont.reagents.ph, 0.1)]." + return ITEM_INTERACT_SUCCESS /obj/item/burner name = "burner" @@ -187,24 +186,25 @@ set_lit(TRUE) user.visible_message(span_notice("[user] lights up the [src].")) -/obj/item/burner/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(lit) - . |= AFTERATTACK_PROCESSED_ITEM - if(is_reagent_container(target)) - var/obj/item/reagent_containers/container = target - container.reagents.expose_temperature(get_temperature()) - to_chat(user, span_notice("You heat up the [src].")) - playsound(user.loc, 'sound/chemistry/heatdam.ogg', 50, TRUE) - return . - else if(isitem(target)) - var/obj/item/item = target - if(item.heat > 1000) - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/burner/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!lit) + return NONE + + if(is_reagent_container(interacting_with)) + var/obj/item/reagent_containers/container = interacting_with + container.reagents.expose_temperature(get_temperature()) + user.visible_message(span_notice("[user] heats up [src]."), span_notice("You heat up [src].")) + playsound(user, 'sound/chemistry/heatdam.ogg', 50, TRUE) + return ITEM_INTERACT_SUCCESS + + else if(isitem(interacting_with)) + var/obj/item/item = interacting_with + if(item.get_temperature() > 1000) set_lit(TRUE) - user.visible_message(span_notice("[user] lights up the [src].")) + user.visible_message(span_notice("[user] lights up [src]."), span_notice("You light up [src].")) + return ITEM_INTERACT_SUCCESS - return . + return ITEM_INTERACT_BLOCKING /obj/item/burner/update_icon_state() . = ..() @@ -281,7 +281,7 @@ /obj/item/thermometer name = "thermometer" - desc = "A thermometer for checking a beaker's temperature" + desc = "A thermometer for checking a something's temperature." icon_state = "thermometer" icon = 'icons/obj/medical/chemical.dmi' item_flags = NOBLUDGEON @@ -291,19 +291,18 @@ var/datum/reagents/attached_to_reagents /obj/item/thermometer/Destroy() - QDEL_NULL(attached_to_reagents) //I have no idea how you can destroy this, but not the beaker, but here we go + attached_to_reagents = null return ..() -/obj/item/thermometer/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM - if(target.reagents) - if(!user.transferItemToLoc(src, target)) - return . - attached_to_reagents = target.reagents - to_chat(user, span_notice("You add the [src] to the [target].")) - ui_interact(usr, null) - return . +/obj/item/thermometer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(isnull(interacting_with.reagents)) + return NONE + if(!user.transferItemToLoc(src, interacting_with)) + return ITEM_INTERACT_BLOCKING + attached_to_reagents = interacting_with.reagents + to_chat(user, span_notice("You add the [src] to [interacting_with].")) + ui_interact(user) + return ITEM_INTERACT_SUCCESS /obj/item/thermometer/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -316,7 +315,7 @@ INVOKE_ASYNC(src, PROC_REF(remove_thermometer), user) /obj/item/thermometer/ui_status(mob/user, datum/ui_state/state) - if(!(in_range(src, user))) + if(!in_range(src, user)) return UI_CLOSE return UI_INTERACTIVE @@ -326,7 +325,9 @@ /obj/item/thermometer/ui_data(mob/user) if(!attached_to_reagents) ui_close(user) - var/data = list() + return + + var/list/data = list() data["Temperature"] = round(attached_to_reagents.chem_temp) return data @@ -335,8 +336,8 @@ attached_to_reagents = null /obj/item/thermometer/proc/try_put_in_hand(obj/object, mob/living/user) - to_chat(user, span_notice("You remove the [src] from the [attached_to_reagents.my_atom].")) - if(!issilicon(user) && in_range(src.loc, user)) + to_chat(user, span_notice("You remove the [src] from [attached_to_reagents.my_atom].")) + if(!issilicon(user) && in_range(loc, user)) user.put_in_hands(object) else object.forceMove(drop_location()) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 3cf5b75240065..dd4e0dff62624 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -96,7 +96,7 @@ if(!QDELETED(beaker)) if(istype(held_item, /obj/item/reagent_containers/dropper) || istype(held_item, /obj/item/reagent_containers/syringe)) var/obj/item/reagent_containers/injector = held_item - injector.afterattack(beaker, user, proximity_flag = TRUE) + injector.interact_with_atom(beaker, user, modifiers) return ITEM_INTERACT_SUCCESS if(is_reagent_container(held_item) && held_item.is_open_container()) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index f08989390a29e..dca2b603ca40f 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -87,9 +87,9 @@ return ..() var/list/modifiers = params2list(params) if(istype(held_item, /obj/item/reagent_containers/syringe) && LAZYACCESS(modifiers, RIGHT_CLICK)) - held_item.afterattack_secondary(beaker, user, Adjacent(user), params) + held_item.interact_with_atom_secondary(beaker, user) else - held_item.afterattack(beaker, user, Adjacent(user), params) + held_item.interact_with_atom(beaker, user) SStgui.update_uis(src) return TRUE diff --git a/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm b/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm index 5b425d61f8ae0..5728f6cb24db6 100644 --- a/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm @@ -85,7 +85,7 @@ /datum/reagent/nitrium_high_metabolization/on_mob_life(mob/living/carbon/breather, seconds_per_tick, times_fired) . = ..() var/need_mob_update - need_mob_update = breather.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update = breather.adjustStaminaLoss(-4 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) need_mob_update += breather.adjustToxLoss(0.1 * (current_cycle-1) * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) // 1 toxin damage per cycle at cycle 10 if(need_mob_update) return UPDATE_MOB_HEALTH diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm index 3fd769ddba9bb..e50775c2487e6 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm @@ -1610,7 +1610,7 @@ if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) var/need_mob_update need_mob_update = drinker.heal_bodypart_damage(2 * REM * seconds_per_tick, 2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) - need_mob_update += drinker.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += drinker.adjustStaminaLoss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -1655,7 +1655,8 @@ need_mob_update += drinker.adjustFireLoss(-heal_amt, updating_health = FALSE, required_bodytype = affected_bodytype) need_mob_update += drinker.adjustToxLoss(-heal_amt, updating_health = FALSE, required_biotype = affected_biotype) need_mob_update += drinker.adjustOxyLoss(-heal_amt, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - need_mob_update += drinker.adjustStaminaLoss(-heal_amt, updating_stamina = FALSE, required_biotype = affected_biotype) + // heal stamina loss on first metabolization, but only to a max of 20 + need_mob_update += drinker.adjustStaminaLoss(max(-heal_amt * 5, -20), updating_stamina = FALSE, required_biotype = affected_biotype) if(need_mob_update) drinker.updatehealth() drinker.visible_message(span_warning("[drinker] shivers with renewed vigor!"), span_notice("One taste of [LOWER_TEXT(name)] fills you with energy!")) @@ -2080,7 +2081,7 @@ need_mob_update = drinker.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick, updating_health = FALSE) need_mob_update += drinker.adjustOxyLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) need_mob_update += drinker.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) - need_mob_update += drinker.adjustStaminaLoss(-1 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += drinker.adjustStaminaLoss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -2137,7 +2138,7 @@ . = ..() if(SPT_PROB(2, seconds_per_tick)) to_chat(drinker, span_notice("[pick("You feel disregard for the rule of law.", "You feel pumped!", "Your head is pounding.", "Your thoughts are racing..")]")) - if(drinker.adjustStaminaLoss(-0.25 * drinker.get_drunk_amount() * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype)) + if(drinker.adjustStaminaLoss(-0.5 * drinker.get_drunk_amount() * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/old_timer diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index cb05757bdc548..b60a5b8028642 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -177,7 +177,7 @@ affected_mob.add_mood_event("tweaking", /datum/mood_event/stimulant_medium) affected_mob.AdjustAllImmobility(-40 * REM * seconds_per_tick) var/need_mob_update - need_mob_update = affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update = affected_mob.adjustStaminaLoss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) affected_mob.set_jitter_if_lower(4 SECONDS * REM * seconds_per_tick) need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1, 4) * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) if(need_mob_update) @@ -233,7 +233,7 @@ to_chat(affected_mob, span_notice("[high_message]")) affected_mob.add_mood_event("salted", /datum/mood_event/stimulant_heavy) var/need_mob_update - need_mob_update = affected_mob.adjustStaminaLoss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update = affected_mob.adjustStaminaLoss(-6 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) affected_mob.adjust_hallucinations(10 SECONDS * REM * seconds_per_tick) if(need_mob_update) @@ -811,7 +811,7 @@ if(!iscarbon(kronkaine_receptacle)) return var/mob/living/carbon/druggo = kronkaine_receptacle - if(druggo.adjustStaminaLoss(-4 * trans_volume, updating_stamina = FALSE)) + if(druggo.adjustStaminaLoss(-6 * trans_volume, updating_stamina = FALSE)) return UPDATE_MOB_HEALTH //I wish i could give it some kind of bonus when smoked, but we don't have an INHALE method. diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 40513f930bfba..505647fe332aa 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -602,7 +602,7 @@ affected_mob.set_jitter_if_lower(20 SECONDS) affected_mob.AdjustAllImmobility(-20 * REM * seconds_per_tick * normalise_creation_purity()) - affected_mob.adjustStaminaLoss(-1 * REM * seconds_per_tick * normalise_creation_purity(), updating_stamina = FALSE) + affected_mob.adjustStaminaLoss(-4 * REM * seconds_per_tick * normalise_creation_purity(), updating_stamina = FALSE) return UPDATE_MOB_HEALTH @@ -868,7 +868,7 @@ if(affected_mob.losebreath < 0) affected_mob.losebreath = 0 need_mob_update = TRUE - need_mob_update += affected_mob.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE) if(SPT_PROB(10, seconds_per_tick)) affected_mob.AdjustAllImmobility(-20) need_mob_update = TRUE @@ -1170,7 +1170,7 @@ if(need_mob_update) . = UPDATE_MOB_HEALTH affected_mob.AdjustAllImmobility(-60 * REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + affected_mob.adjustStaminaLoss(-12 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) /datum/reagent/medicine/stimulants/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -1284,14 +1284,14 @@ need_mob_update += affected_mob.adjustFireLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) need_mob_update += affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) need_mob_update += affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) - need_mob_update += affected_mob.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * seconds_per_tick, 150, affected_organ_flags) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that! else need_mob_update = affected_mob.adjustBruteLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) //slow to start, but very quick healing once it gets going need_mob_update += affected_mob.adjustFireLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) need_mob_update += affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) need_mob_update += affected_mob.adjustToxLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) - need_mob_update += affected_mob.adjustStaminaLoss(-3 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustStaminaLoss(-8 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM * seconds_per_tick, 150, affected_organ_flags) affected_mob.adjust_jitter_up_to(6 SECONDS * REM * seconds_per_tick, 1 MINUTES) if(SPT_PROB(5, seconds_per_tick)) @@ -1379,6 +1379,7 @@ . = ..() affected_mob.add_traits(list(TRAIT_SLEEPIMMUNE, TRAIT_BATON_RESISTANCE), type) affected_mob.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) + RegisterSignal(affected_mob, COMSIG_CARBON_ENTER_STAMCRIT, PROC_REF(on_stamcrit)) /datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/affected_mob) . = ..() @@ -1386,6 +1387,14 @@ affected_mob.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) affected_mob.remove_status_effect(/datum/status_effect/dizziness) affected_mob.remove_status_effect(/datum/status_effect/jitter) + UnregisterSignal(affected_mob, COMSIG_CARBON_ENTER_STAMCRIT) + +/datum/reagent/medicine/changelingadrenaline/proc/on_stamcrit(mob/living/affected_mob) + SIGNAL_HANDLER + affected_mob?.setStaminaLoss(90, updating_stamina = TRUE) + to_chat(affected_mob, span_changeling("Our gene-stim flares! We are invigorated, but its potency wanes.")) + volume -= (min(volume, 1)) + return STAMCRIT_CANCELLED /datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/metabolizer, seconds_per_tick, times_fired) . = ..() @@ -1468,7 +1477,7 @@ return overdose_threshold = overdose_threshold + ((rand(-10, 10) / 10) * REM * seconds_per_tick) // for extra fun metabolizer.AdjustAllImmobility(-5 * REM * seconds_per_tick) - metabolizer.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + metabolizer.adjustStaminaLoss(-3 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) metabolizer.set_jitter_if_lower(1 SECONDS * REM * seconds_per_tick) metabolization_rate = 0.005 * REAGENTS_METABOLISM * rand(5, 20) // randomizes metabolism between 0.02 and 0.08 per second return UPDATE_MOB_HEALTH diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 9859617ce4271..df14037ac1e8f 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2780,7 +2780,7 @@ var/obj/item/bodypart/wounded_part = W.limb if(wounded_part) wounded_part.heal_damage(0.25 * REM * seconds_per_tick, 0.25 * REM * seconds_per_tick) - if(affected_mob.adjustStaminaLoss(-0.25 * REM * seconds_per_tick, updating_stamina = FALSE)) // the more wounds, the more stamina regen + if(affected_mob.adjustStaminaLoss(-1 * REM * seconds_per_tick, updating_stamina = FALSE)) // the more wounds, the more stamina regen return UPDATE_MOB_HEALTH // unholy water, but for heretics. @@ -2964,7 +2964,7 @@ . = ..() var/need_mob_update need_mob_update = kronkus_enjoyer.adjustOrganLoss(ORGAN_SLOT_HEART, 0.1) - need_mob_update += kronkus_enjoyer.adjustStaminaLoss(-2, updating_stamina = FALSE) + need_mob_update += kronkus_enjoyer.adjustStaminaLoss(-6, updating_stamina = FALSE) if(need_mob_update) return UPDATE_MOB_HEALTH diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 4c68da0b7de5d..a804a106f7353 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -336,7 +336,7 @@ if(!isjellyperson(affected_mob)) //everyone but jellypeople get shocked as normal. return ..() affected_mob.AdjustAllImmobility(-40 *REM * seconds_per_tick) - if(affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE)) + if(affected_mob.adjustStaminaLoss(-10 * REM * seconds_per_tick, updating_stamina = FALSE)) . = UPDATE_MOB_HEALTH if(is_species(affected_mob, /datum/species/jelly/luminescent)) var/mob/living/carbon/human/affected_human = affected_mob diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index e34511e9e0d0e..ccabc2c410646 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -66,34 +66,33 @@ playsound(M.loc,'sound/items/drink.ogg', rand(10,50), TRUE) return TRUE -/obj/item/reagent_containers/condiment/afterattack(obj/target, mob/user , proximity) - . = ..() - if(!proximity) - return - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/reagent_containers/condiment/interact_with_atom(atom/target, mob/living/user, list/modifiers) if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. - if(!target.reagents.total_volume) to_chat(user, span_warning("[target] is empty!")) - return + return ITEM_INTERACT_BLOCKING if(reagents.total_volume >= reagents.maximum_volume) to_chat(user, span_warning("[src] is full!")) - return + return ITEM_INTERACT_BLOCKING var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You fill [src] with [trans] units of the contents of [target].")) + return ITEM_INTERACT_SUCCESS //Something like a glass or a food item. Player probably wants to transfer TO it. else if(target.is_drainable() || IS_EDIBLE(target)) if(!reagents.total_volume) to_chat(user, span_warning("[src] is empty!")) - return + return ITEM_INTERACT_BLOCKING if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, span_warning("you can't add anymore to [target]!")) - return + return ITEM_INTERACT_BLOCKING var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You transfer [trans] units of the condiment to [target].")) + return ITEM_INTERACT_SUCCESS + + return NONE /obj/item/reagent_containers/condiment/enzyme name = "universal enzyme" @@ -149,11 +148,10 @@ desc = "Salt. From dead crew, presumably." return TOXLOSS -/obj/item/reagent_containers/condiment/saltshaker/afterattack(obj/target, mob/living/user, proximity) +/obj/item/reagent_containers/condiment/saltshaker/interact_with_atom(atom/target, mob/living/user, list/modifiers) . = ..() - if(!proximity) - return - . |= AFTERATTACK_PROCESSED_ITEM + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . if(isturf(target)) if(!reagents.has_reagent(/datum/reagent/consumable/salt, 2)) to_chat(user, span_warning("You don't have enough salt to make a pile!")) @@ -161,7 +159,8 @@ user.visible_message(span_notice("[user] shakes some salt onto [target]."), span_notice("You shake some salt onto [target].")) reagents.remove_reagent(/datum/reagent/consumable/salt, 2) new/obj/effect/decal/cleanable/food/salt(target) - return + return ITEM_INTERACT_SUCCESS + return . /obj/item/reagent_containers/condiment/peppermill name = "pepper mill" @@ -441,26 +440,22 @@ /obj/item/reagent_containers/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly. return -/obj/item/reagent_containers/condiment/pack/afterattack(obj/target, mob/user , proximity) - if(!proximity) - return - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/reagent_containers/condiment/pack/interact_with_atom(atom/target, mob/living/user, list/modifiers) //You can tear the bag open above food to put the condiments on it, obviously. if(IS_EDIBLE(target)) if(!reagents.total_volume) to_chat(user, span_warning("You tear open [src], but there's nothing in it.")) qdel(src) - return + return ITEM_INTERACT_BLOCKING if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, span_warning("You tear open [src], but [target] is stacked so high that it just drips off!") ) qdel(src) - return - else - to_chat(user, span_notice("You tear open [src] above [target] and the condiments drip onto it.")) - src.reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user) - qdel(src) - return - return . | ..() + return ITEM_INTERACT_BLOCKING + to_chat(user, span_notice("You tear open [src] above [target] and the condiments drip onto it.")) + src.reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user) + qdel(src) + return ITEM_INTERACT_SUCCESS + return ..() /// Handles reagents getting added to the condiment pack. /obj/item/reagent_containers/condiment/pack/proc/on_reagent_add(datum/reagents/reagents) diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index 41542ea105e7a..644f0dd96948a 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -101,68 +101,66 @@ if(LAZYLEN(diseases_to_add)) AddComponent(/datum/component/infective, diseases_to_add) -/obj/item/reagent_containers/cup/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!proximity_flag) - return - - . |= AFTERATTACK_PROCESSED_ITEM - +/obj/item/reagent_containers/cup/interact_with_atom(atom/target, mob/living/user, list/modifiers) if(!check_allowed_items(target, target_self = TRUE)) - return - + return NONE if(!spillable) - return + return NONE if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, span_warning("[src] is empty!")) - return + return ITEM_INTERACT_BLOCKING if(target.reagents.holder_full()) to_chat(user, span_warning("[target] is full.")) - return + return ITEM_INTERACT_BLOCKING var/trans = reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You transfer [trans] unit\s of the solution to [target].")) SEND_SIGNAL(src, COMSIG_REAGENTS_CUP_TRANSFER_TO, target) target.update_appearance() + return ITEM_INTERACT_SUCCESS - else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us. + if(target.is_drainable()) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume) to_chat(user, span_warning("[target] is empty and can't be refilled!")) - return + return ITEM_INTERACT_BLOCKING if(reagents.holder_full()) to_chat(user, span_warning("[src] is full.")) - return + return ITEM_INTERACT_BLOCKING var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You fill [src] with [trans] unit\s of the contents of [target].")) SEND_SIGNAL(src, COMSIG_REAGENTS_CUP_TRANSFER_FROM, target) target.update_appearance() + return ITEM_INTERACT_SUCCESS -/obj/item/reagent_containers/cup/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - if((!proximity_flag) || !check_allowed_items(target, target_self = TRUE)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return NONE +/obj/item/reagent_containers/cup/interact_with_atom_secondary(atom/target, mob/living/user, list/modifiers) + if(user.combat_mode) + return ITEM_INTERACT_SKIP_TO_ATTACK + if(!check_allowed_items(target, target_self = TRUE)) + return NONE if(!spillable) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING if(target.is_drainable()) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume) to_chat(user, span_warning("[target] is empty!")) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING if(reagents.holder_full()) to_chat(user, span_warning("[src] is full.")) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You fill [src] with [trans] unit\s of the contents of [target].")) target.update_appearance() - return SECONDARY_ATTACK_CONTINUE_CHAIN + return ITEM_INTERACT_SUCCESS /obj/item/reagent_containers/cup/attackby(obj/item/attacking_item, mob/user, params) var/hotness = attacking_item.get_temperature() diff --git a/code/modules/reagents/reagent_containers/cups/drinks.dm b/code/modules/reagents/reagent_containers/cups/drinks.dm index 5a3ed446f607c..2f326accb9074 100644 --- a/code/modules/reagents/reagent_containers/cups/drinks.dm +++ b/code/modules/reagents/reagent_containers/cups/drinks.dm @@ -291,20 +291,18 @@ return ..() -/obj/item/reagent_containers/cup/glass/waterbottle/afterattack(obj/target, mob/living/user, proximity) - . |= AFTERATTACK_PROCESSED_ITEM - +/obj/item/reagent_containers/cup/glass/waterbottle/interact_with_atom(atom/target, mob/living/user, list/modifiers) if(cap_on && (target.is_refillable() || target.is_drainable() || (reagents.total_volume && !user.combat_mode))) to_chat(user, span_warning("You must remove the cap before you can do that!")) - return + return ITEM_INTERACT_BLOCKING - else if(istype(target, /obj/item/reagent_containers/cup/glass/waterbottle)) + if(istype(target, /obj/item/reagent_containers/cup/glass/waterbottle)) var/obj/item/reagent_containers/cup/glass/waterbottle/other_bottle = target if(other_bottle.cap_on) to_chat(user, span_warning("[other_bottle] has a cap firmly twisted on!")) - return + return ITEM_INTERACT_BLOCKING - return . | ..() + return ..() // heehoo bottle flipping /obj/item/reagent_containers/cup/glass/waterbottle/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index beb6f3e6314cd..76ab1166c08a7 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -11,22 +11,18 @@ reagent_flags = TRANSPARENT custom_price = PAYCHECK_CREW -/obj/item/reagent_containers/dropper/afterattack(obj/target, mob/user , proximity) - . = ..() - if(!proximity) - return - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/reagent_containers/dropper/interact_with_atom(atom/target, mob/living/user, list/modifiers) if(!target.reagents) - return + return NONE if(reagents.total_volume > 0) if(target.reagents.holder_full()) to_chat(user, span_notice("[target] is full.")) - return + return ITEM_INTERACT_BLOCKING if(!target.is_injectable(user)) to_chat(user, span_warning("You cannot transfer reagents to [target]!")) - return + return ITEM_INTERACT_BLOCKING var/trans = 0 var/fraction = min(amount_per_transfer_from_this / reagents.total_volume, 1) @@ -48,10 +44,10 @@ to_chat(user, span_notice("You transfer [trans] unit\s of the solution.")) update_appearance() - return + return ITEM_INTERACT_BLOCKING else if(isalien(target)) //hiss-hiss has no eyes! to_chat(target, span_danger("[target] does not seem to have any eyes!")) - return + return ITEM_INTERACT_BLOCKING target.visible_message(span_danger("[user] squirts something into [target]'s eyes!"), \ span_userdanger("[user] squirts something into your eyes!")) @@ -69,23 +65,23 @@ to_chat(user, span_notice("You transfer [trans] unit\s of the solution.")) update_appearance() target.update_appearance() + return ITEM_INTERACT_SUCCESS - else + if(!target.is_drawable(user, FALSE)) //No drawing from mobs here + to_chat(user, span_warning("You cannot directly remove reagents from [target]!")) + return ITEM_INTERACT_BLOCKING - if(!target.is_drawable(user, FALSE)) //No drawing from mobs here - to_chat(user, span_warning("You cannot directly remove reagents from [target]!")) - return + if(!target.reagents.total_volume) + to_chat(user, span_warning("[target] is empty!")) + return ITEM_INTERACT_BLOCKING - if(!target.reagents.total_volume) - to_chat(user, span_warning("[target] is empty!")) - return + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) + to_chat(user, span_notice("You fill [src] with [trans] unit\s of the solution.")) - to_chat(user, span_notice("You fill [src] with [trans] unit\s of the solution.")) - - update_appearance() - target.update_appearance() + update_appearance() + target.update_appearance() + return ITEM_INTERACT_SUCCESS /obj/item/reagent_containers/dropper/update_overlays() . = ..() diff --git a/code/modules/reagents/reagent_containers/misc.dm b/code/modules/reagents/reagent_containers/misc.dm index db9935d3ea262..40be7c5f43d09 100644 --- a/code/modules/reagents/reagent_containers/misc.dm +++ b/code/modules/reagents/reagent_containers/misc.dm @@ -137,15 +137,13 @@ user.visible_message(span_suicide("[user] is smothering [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return OXYLOSS -/obj/item/reagent_containers/cup/rag/afterattack(atom/target, mob/living/user, proximity_flag, click_parameters) - if(!proximity_flag) - return - if(!iscarbon(target) || !reagents?.total_volume) +/obj/item/reagent_containers/cup/rag/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!iscarbon(interacting_with) || !reagents?.total_volume) return ..() - var/mob/living/carbon/carbon_target = target + var/mob/living/carbon/carbon_target = interacting_with var/reagentlist = pretty_string_from_reagent_list(reagents.reagent_list) var/log_object = "containing [reagentlist]" - if(user.combat_mode && !carbon_target.is_mouth_covered()) + if(!carbon_target.is_mouth_covered()) reagents.trans_to(carbon_target, reagents.total_volume, transferred_by = user, methods = INGEST) carbon_target.visible_message(span_danger("[user] smothers \the [carbon_target] with \the [src]!"), span_userdanger("[user] smothers you with \the [src]!"), span_hear("You hear some struggling and muffled cries of surprise.")) log_combat(user, carbon_target, "smothered", src, log_object) @@ -154,7 +152,12 @@ reagents.clear_reagents() carbon_target.visible_message(span_notice("[user] touches \the [carbon_target] with \the [src].")) log_combat(user, carbon_target, "touched", src, log_object) + return ITEM_INTERACT_SUCCESS ///Checks whether or not we should clean. /obj/item/reagent_containers/cup/rag/proc/should_clean(datum/cleaning_source, atom/atom_to_clean, mob/living/cleaner) - return (src in cleaner) + if(cleaner.combat_mode && ismob(atom_to_clean)) + return CLEAN_BLOCKED|CLEAN_DONT_BLOCK_INTERACTION + if(loc == cleaner) + return CLEAN_ALLOWED + return CLEAN_ALLOWED|CLEAN_NO_XP diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index c4c3003d768e6..d561d0db48792 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -59,24 +59,20 @@ return TRUE -/obj/item/reagent_containers/pill/afterattack(obj/target, mob/user , proximity) - . = ..() - if(!proximity) - return - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/reagent_containers/pill/interact_with_atom(atom/target, mob/living/user, list/modifiers) if(!dissolvable || !target.is_refillable()) - return + return NONE if(target.is_drainable() && !target.reagents.total_volume) to_chat(user, span_warning("[target] is empty! There's nothing to dissolve [src] in.")) - return - + return ITEM_INTERACT_BLOCKING if(target.reagents.holder_full()) to_chat(user, span_warning("[target] is full.")) - return + return ITEM_INTERACT_BLOCKING user.visible_message(span_warning("[user] slips something into [target]!"), span_notice("You dissolve [src] in [target]."), null, 2) reagents.trans_to(target, reagents.total_volume, transferred_by = user) qdel(src) + return ITEM_INTERACT_SUCCESS /* * On accidental consumption, consume the pill diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index be40215039de4..387f3b84d4911 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -26,31 +26,38 @@ possible_transfer_amounts = list(5,10) var/spray_sound = 'sound/effects/spray2.ogg' -/obj/item/reagent_containers/spray/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(istype(target, /obj/structure/sink) || istype(target, /obj/structure/mop_bucket/janitorialcart) || istype(target, /obj/machinery/hydroponics)) - return +/obj/item/reagent_containers/spray/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return try_spray(interacting_with, user) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + +/obj/item/reagent_containers/spray/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + // This is a hack to make spray bottles fillable from / transferable to these sources + // However it can be completely removed when these objects are updated to use the new interaction system + // (because the desired effect will just work out of the box) + if(istype(interacting_with, /obj/structure/sink) || istype(interacting_with, /obj/structure/mop_bucket/janitorialcart) || istype(interacting_with, /obj/machinery/hydroponics)) + return NONE - . |= AFTERATTACK_PROCESSED_ITEM + return try_spray(interacting_with, user) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING - if((target.is_drainable() && !target.is_refillable()) && (get_dist(src, target) <= 1) && can_fill_from_container) +/obj/item/reagent_containers/spray/proc/try_spray(atom/target, mob/user) + var/adjacent = user.Adjacent(target) + if((target.is_drainable() && !target.is_refillable()) && adjacent && can_fill_from_container) if(!target.reagents.total_volume) to_chat(user, span_warning("[target] is empty.")) - return + return FALSE if(reagents.holder_full()) to_chat(user, span_warning("[src] is full.")) - return + return FALSE var/trans = target.reagents.trans_to(src, 50, transferred_by = user) //transfer 50u , using the spray's transfer amount would take too long to refill to_chat(user, span_notice("You fill \the [src] with [trans] units of the contents of \the [target].")) - return + return FALSE if(reagents.total_volume < amount_per_transfer_from_this) to_chat(user, span_warning("Not enough left!")) - return + return FALSE - if(proximity_flag && (target.density || ismob(target))) + if(adjacent && (target.density || ismob(target))) // If we're spraying an adjacent mob or a dense object, we start the spray on ITS tile rather than OURs // This is so we can use a spray bottle to clean stuff like windows without getting blocked by passflags spray(target, user, get_turf(target)) @@ -58,9 +65,9 @@ spray(target, user) playsound(src, spray_sound, 50, TRUE, -6) - user.changeNext_move(CLICK_CD_RANGE*2) + user.changeNext_move(CLICK_CD_RANGE * 2) user.newtonian_move(get_dir(target, user)) - return + return TRUE /// Handles creating a chem puff that travels towards the target atom, exposing reagents to everything it hits on the way. /obj/item/reagent_containers/spray/proc/spray(atom/target, mob/user, turf/start_turf = get_turf(src)) @@ -232,10 +239,10 @@ return OXYLOSS // Fix pepperspraying yourself -/obj/item/reagent_containers/spray/pepper/afterattack(atom/A as mob|obj, mob/user) - if (A.loc == user) - return - return ..() | AFTERATTACK_PROCESSED_ITEM +/obj/item/reagent_containers/spray/pepper/try_spray(atom/target, mob/user) + if (target.loc == user) + return FALSE + return ..() //water flower /obj/item/reagent_containers/spray/waterflower @@ -320,11 +327,10 @@ amount_per_transfer_from_this = 10 volume = 600 -/obj/item/reagent_containers/spray/chemsprayer/afterattack(atom/A as mob|obj, mob/user) - // Make it so the bioterror spray doesn't spray yourself when you click your inventory items - if (A.loc == user) - return - return ..() | AFTERATTACK_PROCESSED_ITEM +/obj/item/reagent_containers/spray/chemsprayer/try_spray(atom/target, mob/user) + if (target.loc == user) + return FALSE + return ..() /obj/item/reagent_containers/spray/chemsprayer/spray(atom/A, mob/user) var/direction = get_dir(src, A) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 83f71ff69b0ab..9fffd5ccc7c10 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -25,9 +25,7 @@ /obj/item/reagent_containers/syringe/attackby(obj/item/I, mob/user, params) return -/obj/item/reagent_containers/syringe/proc/try_syringe(atom/target, mob/user, proximity) - if(!proximity) - return FALSE +/obj/item/reagent_containers/syringe/proc/try_syringe(atom/target, mob/user) if(!target.reagents) return FALSE @@ -36,49 +34,50 @@ if(!living_target.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE|inject_flags)) return FALSE - // chance of monkey retaliation - SEND_SIGNAL(target, COMSIG_LIVING_TRY_SYRINGE, user) return TRUE -/obj/item/reagent_containers/syringe/afterattack(atom/target, mob/user, proximity) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/reagent_containers/syringe/interact_with_atom(atom/target, mob/living/user, list/modifiers) + if(!target.reagents) + return NONE + if(!try_syringe(target, user)) + return ITEM_INTERACT_BLOCKING - if (!try_syringe(target, user, proximity)) - return + SEND_SIGNAL(target, COMSIG_LIVING_TRY_SYRINGE_INJECT, user) var/contained = reagents.get_reagent_log_string() log_combat(user, target, "attempted to inject", src, addition="which had [contained]") if(!reagents.total_volume) to_chat(user, span_warning("[src] is empty! Right-click to draw.")) - return + return ITEM_INTERACT_BLOCKING if(!isliving(target) && !target.is_injectable(user)) to_chat(user, span_warning("You cannot directly fill [target]!")) - return + return ITEM_INTERACT_BLOCKING if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, span_notice("[target] is full.")) - return + return ITEM_INTERACT_BLOCKING if(isliving(target)) var/mob/living/living_target = target - if(!living_target.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE|inject_flags)) - return if(living_target != user) - living_target.visible_message(span_danger("[user] is trying to inject [living_target]!"), \ - span_userdanger("[user] is trying to inject you!")) - if(!do_after(user, CHEM_INTERACT_DELAY(3 SECONDS, user), living_target, extra_checks = CALLBACK(living_target, TYPE_PROC_REF(/mob/living, try_inject), user, null, INJECT_TRY_SHOW_ERROR_MESSAGE|inject_flags))) - return + living_target.visible_message( + span_danger("[user] is trying to inject [living_target]!"), + span_userdanger("[user] is trying to inject you!"), + ) + if(!do_after(user, CHEM_INTERACT_DELAY(3 SECONDS, user), living_target, extra_checks = CALLBACK(src, PROC_REF(try_syringe), living_target, user))) + return ITEM_INTERACT_BLOCKING if(!reagents.total_volume) - return + return ITEM_INTERACT_BLOCKING if(living_target.reagents.total_volume >= living_target.reagents.maximum_volume) - return - living_target.visible_message(span_danger("[user] injects [living_target] with the syringe!"), \ - span_userdanger("[user] injects you with the syringe!")) + return ITEM_INTERACT_BLOCKING + living_target.visible_message( + span_danger("[user] injects [living_target] with the syringe!"), + span_userdanger("[user] injects you with the syringe!"), + ) - if (living_target == user) + if(living_target == user) living_target.log_message("injected themselves ([contained]) with [name]", LOG_ATTACK, color="orange") else log_combat(user, living_target, "injected", src, addition="which had [contained]") @@ -86,44 +85,53 @@ if(reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user, methods = INJECT)) to_chat(user, span_notice("You inject [amount_per_transfer_from_this] units of the solution. The syringe now contains [reagents.total_volume] units.")) target.update_appearance() + return ITEM_INTERACT_SUCCESS -/obj/item/reagent_containers/syringe/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - if (!try_syringe(target, user, proximity_flag)) - return SECONDARY_ATTACK_CONTINUE_CHAIN + return ITEM_INTERACT_BLOCKING + +/obj/item/reagent_containers/syringe/interact_with_atom_secondary(atom/target, mob/living/user, list/modifiers) + if (!target.reagents) + return NONE + if (!try_syringe(target, user)) + return ITEM_INTERACT_BLOCKING + + SEND_SIGNAL(target, COMSIG_LIVING_TRY_SYRINGE_WITHDRAW, user) if(reagents.total_volume >= reagents.maximum_volume) to_chat(user, span_notice("[src] is full.")) - return SECONDARY_ATTACK_CONTINUE_CHAIN + return ITEM_INTERACT_BLOCKING if(isliving(target)) var/mob/living/living_target = target var/drawn_amount = reagents.maximum_volume - reagents.total_volume if(target != user) - target.visible_message(span_danger("[user] is trying to take a blood sample from [target]!"), \ - span_userdanger("[user] is trying to take a blood sample from you!")) - if(!do_after(user, CHEM_INTERACT_DELAY(3 SECONDS, user), target, extra_checks = CALLBACK(living_target, TYPE_PROC_REF(/mob/living, try_inject), user, null, INJECT_TRY_SHOW_ERROR_MESSAGE|inject_flags))) - return SECONDARY_ATTACK_CONTINUE_CHAIN + target.visible_message( + span_danger("[user] is trying to take a blood sample from [target]!"), + span_userdanger("[user] is trying to take a blood sample from you!"), + ) + if(!do_after(user, CHEM_INTERACT_DELAY(3 SECONDS, user), target, extra_checks = CALLBACK(src, PROC_REF(try_syringe), living_target, user))) + return ITEM_INTERACT_BLOCKING if(reagents.total_volume >= reagents.maximum_volume) - return SECONDARY_ATTACK_CONTINUE_CHAIN + return ITEM_INTERACT_BLOCKING if(living_target.transfer_blood_to(src, drawn_amount)) user.visible_message(span_notice("[user] takes a blood sample from [living_target].")) else to_chat(user, span_warning("You are unable to draw any blood from [living_target]!")) - else - if(!target.reagents.total_volume) - to_chat(user, span_warning("[target] is empty!")) - return SECONDARY_ATTACK_CONTINUE_CHAIN + return ITEM_INTERACT_SUCCESS - if(!target.is_drawable(user)) - to_chat(user, span_warning("You cannot directly remove reagents from [target]!")) - return SECONDARY_ATTACK_CONTINUE_CHAIN + if(!target.reagents.total_volume) + to_chat(user, span_warning("[target] is empty!")) + return ITEM_INTERACT_BLOCKING - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) // transfer from, transfer to - who cares? + if(!target.is_drawable(user)) + to_chat(user, span_warning("You cannot directly remove reagents from [target]!")) + return ITEM_INTERACT_BLOCKING - to_chat(user, span_notice("You fill [src] with [trans] units of the solution. It now contains [reagents.total_volume] units.")) - target.update_appearance() + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) // transfer from, transfer to - who cares? - return SECONDARY_ATTACK_CONTINUE_CHAIN + to_chat(user, span_notice("You fill [src] with [trans] units of the solution. It now contains [reagents.total_volume] units.")) + target.update_appearance() + return ITEM_INTERACT_SUCCESS /* * On accidental consumption, inject the eater with 2/3rd of the syringe and reveal it diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index c440926388709..c5dfdc39d3e98 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -543,10 +543,9 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) belt.id = id to_chat(user, span_notice("You have linked all nearby conveyor belt assemblies to this switch.")) -/obj/item/conveyor_switch_construct/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity || user.stat || !isfloorturf(target) || istype(target, /area/shuttle)) - return +/obj/item/conveyor_switch_construct/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isfloorturf(interacting_with)) + return NONE var/found = FALSE for(var/obj/machinery/conveyor/belt in view()) @@ -555,10 +554,11 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) break if(!found) to_chat(user, "[icon2html(src, user)]" + span_notice("The conveyor switch did not detect any linked conveyor belts in range.")) - return - var/obj/machinery/conveyor_switch/built_switch = new/obj/machinery/conveyor_switch(target, id) + return ITEM_INTERACT_BLOCKING + var/obj/machinery/conveyor_switch/built_switch = new/obj/machinery/conveyor_switch(interacting_with, id) transfer_fingerprints_to(built_switch) qdel(src) + return ITEM_INTERACT_SUCCESS /obj/item/stack/conveyor name = "conveyor belt assembly" @@ -576,17 +576,17 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) . = ..() id = _id -/obj/item/stack/conveyor/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity || user.stat || !isfloorturf(target) || istype(target, /area/shuttle)) - return - var/belt_dir = get_dir(target, user) - if(target == user.loc) +/obj/item/stack/conveyor/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isfloorturf(interacting_with)) + return NONE + var/belt_dir = get_dir(interacting_with, user) + if(interacting_with == user.loc) to_chat(user, span_warning("You cannot place a conveyor belt under yourself!")) - return - var/obj/machinery/conveyor/belt = new/obj/machinery/conveyor(target, belt_dir, id) + return ITEM_INTERACT_BLOCKING + var/obj/machinery/conveyor/belt = new/obj/machinery/conveyor(interacting_with, belt_dir, id) transfer_fingerprints_to(belt) use(1) + return ITEM_INTERACT_SUCCESS /obj/item/stack/conveyor/attackby(obj/item/item_used, mob/user, params) ..() diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 8c46de58a98b2..59b3d13c3424d 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -252,7 +252,7 @@ unwrap_contents() post_unwrap_contents(user) - return COMPONENT_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_BLOCKING /obj/item/dest_tagger name = "destination tagger" diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index d4cb4afefdaf0..3c7b48cef519b 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -37,19 +37,24 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good user.Beam(attacked_machinery, icon_state = "rped_upgrade", time = 0.5 SECONDS) return TRUE -/obj/item/storage/part_replacer/afterattack(obj/attacked_object, mob/living/user, adjacent, params) - . = ..() - if(!works_from_distance || adjacent) // Adjacent things = already handled by pre-attack - return . - - if(part_replace_action(attacked_object, user)) - user.Beam(attacked_object, icon_state = "rped_upgrade", time = 0.5 SECONDS) - return . | AFTERATTACK_PROCESSED_ITEM - - if(istype(attacked_object, /obj/structure/frame)) - attacked_object.item_interaction(user, src) // Cursed snowflake but we need to handle frame ranged interaction here - user.Beam(attacked_object, icon_state = "rped_upgrade", time = 0.5 SECONDS) - return . | AFTERATTACK_PROCESSED_ITEM +/obj/item/storage/part_replacer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(part_replace_action(interacting_with, user)) + return ITEM_INTERACT_SUCCESS + return NONE + +/obj/item/storage/part_replacer/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!works_from_distance) + return NONE + if(part_replace_action(interacting_with, user)) + user.Beam(interacting_with, icon_state = "rped_upgrade", time = 0.5 SECONDS) + return ITEM_INTERACT_SUCCESS + if(istype(interacting_with, /obj/structure/frame)) + // Cursed snowflake but we need to handle frame ranged interaction here + // Likely no longer necessary with the new framework, revisit later + interacting_with.item_interaction(user, src) + user.Beam(interacting_with, icon_state = "rped_upgrade", time = 0.5 SECONDS) + return ITEM_INTERACT_SUCCESS + return NONE /obj/item/storage/part_replacer/proc/play_rped_sound() //Plays the sound for RPED exhanging or installing parts. diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 0e6a37ce3d0ba..4053bfe7fd169 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -52,11 +52,10 @@ Slimecrossing Items ret[part.body_zone] = saved_part return ret -/obj/item/camera/rewind/afterattack(atom/target, mob/user, flag) - . |= AFTERATTACK_PROCESSED_ITEM - - if(!on || !pictures_left || !isturf(target.loc)) - return . +/obj/item/camera/rewind/photo_taken(atom/target, mob/user) + . = ..() + if(!.) + return if(user == target) to_chat(user, span_notice("You take a selfie!")) @@ -66,9 +65,6 @@ Slimecrossing Items to_chat(target, span_boldnotice("You'll remember this moment forever!")) target.AddComponent(/datum/component/dejavu, 2) - return . | ..() - - //Timefreeze camera - Old Burning Sepia result. Kept in case admins want to spawn it /obj/item/camera/timefreeze @@ -77,13 +73,11 @@ Slimecrossing Items pictures_left = 1 pictures_max = 1 -/obj/item/camera/timefreeze/afterattack(atom/target, mob/user, flag) - . |= AFTERATTACK_PROCESSED_ITEM - - if(!on || !pictures_left || !isturf(target.loc)) - return . +/obj/item/camera/timefreeze/photo_taken(atom/target, mob/user) + . = ..() + if(!.) + return new /obj/effect/timestop(get_turf(target), 2, 50, list(user)) - return . | ..() //Hypercharged slime cell - Charged Yellow /obj/item/stock_parts/cell/high/slime_hypercharged diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm index ecf76357e2010..16203cd3462fd 100644 --- a/code/modules/research/xenobiology/crossbreeding/_potions.dm +++ b/code/modules/research/xenobiology/crossbreeding/_potions.dm @@ -11,27 +11,25 @@ Slimecrossing Potions icon = 'icons/obj/medical/chemical.dmi' icon_state = "potpurple" -/obj/item/slimepotion/extract_cloner/afterattack(obj/item/target, mob/user , proximity) - if(!proximity) - return - . |= AFTERATTACK_PROCESSED_ITEM - if(is_reagent_container(target)) - return ..(target, user, proximity) - if(istype(target, /obj/item/slimecross)) - to_chat(user, span_warning("[target] is too complex for the potion to clone!")) - return - if(!istype(target, /obj/item/slime_extract)) - return - var/obj/item/slime_extract/S = target +/obj/item/slimepotion/extract_cloner/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + if(istype(interacting_with, /obj/item/slimecross)) + to_chat(user, span_warning("[interacting_with] is too complex for the potion to clone!")) + return ITEM_INTERACT_BLOCKING + if(!istype(interacting_with, /obj/item/slime_extract)) + return ITEM_INTERACT_BLOCKING + var/obj/item/slime_extract/S = interacting_with if(S.recurring) - to_chat(user, span_warning("[target] is too complex for the potion to clone!")) - return + to_chat(user, span_warning("[interacting_with] is too complex for the potion to clone!")) + return ITEM_INTERACT_BLOCKING var/path = S.type - var/obj/item/slime_extract/C = new path(get_turf(target)) + var/obj/item/slime_extract/C = new path(get_turf(interacting_with)) C.extract_uses = S.extract_uses - to_chat(user, span_notice("You pour the potion onto [target], and the fluid solidifies into a copy of it!")) + to_chat(user, span_notice("You pour the potion onto [interacting_with], and the fluid solidifies into a copy of it!")) qdel(src) - return + return ITEM_INTERACT_SUCCESS //Peace potion - Charged Light Pink /obj/item/slimepotion/peacepotion @@ -107,34 +105,34 @@ Slimecrossing Potions icon_state = "potblue" var/uses = 2 -/obj/item/slimepotion/spaceproof/afterattack(obj/item/clothing/C, mob/user, proximity) +/obj/item/slimepotion/spaceproof/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) . = ..() - if(!uses) + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + if(uses <= 0) qdel(src) - return - if(!proximity) - return - if(!istype(C)) + return ITEM_INTERACT_BLOCKING + var/obj/item/clothing/clothing = interacting_with + if(!istype(clothing)) to_chat(user, span_warning("The potion can only be used on clothing!")) - return - . |= AFTERATTACK_PROCESSED_ITEM - if(istype(C, /obj/item/clothing/suit/space)) - to_chat(user, span_warning("The [C] is already pressure-resistant!")) - return . | ..() - if(C.min_cold_protection_temperature == SPACE_SUIT_MIN_TEMP_PROTECT && C.clothing_flags & STOPSPRESSUREDAMAGE) - to_chat(user, span_warning("The [C] is already pressure-resistant!")) - return . | ..() - to_chat(user, span_notice("You slather the blue gunk over the [C], making it airtight.")) - C.name = "pressure-resistant [C.name]" - C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour(COLOR_NAVY, FIXED_COLOUR_PRIORITY) - C.min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - C.cold_protection = C.body_parts_covered - C.clothing_flags |= STOPSPRESSUREDAMAGE + return ITEM_INTERACT_BLOCKING + if(istype(clothing, /obj/item/clothing/suit/space)) + to_chat(user, span_warning("The [interacting_with] is already pressure-resistant!")) + return ITEM_INTERACT_BLOCKING + if(clothing.min_cold_protection_temperature == SPACE_SUIT_MIN_TEMP_PROTECT && (clothing.clothing_flags & STOPSPRESSUREDAMAGE)) + to_chat(user, span_warning("The [interacting_with] is already pressure-resistant!")) + return ITEM_INTERACT_BLOCKING + to_chat(user, span_notice("You slather the blue gunk over the [clothing], making it airtight.")) + clothing.name = "pressure-resistant [clothing.name]" + clothing.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + clothing.add_atom_colour(COLOR_NAVY, FIXED_COLOUR_PRIORITY) + clothing.min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + clothing.cold_protection = clothing.body_parts_covered + clothing.clothing_flags |= STOPSPRESSUREDAMAGE uses-- - if(!uses) + if(uses <= 0) qdel(src) - return . + return ITEM_INTERACT_SUCCESS //Enhancer potion - Charged Cerulean /obj/item/slimepotion/enhancer/max @@ -152,29 +150,30 @@ Slimecrossing Potions resistance_flags = LAVA_PROOF | FIRE_PROOF var/uses = 2 -/obj/item/slimepotion/lavaproof/afterattack(obj/item/C, mob/user, proximity) +/obj/item/slimepotion/lavaproof/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) . = ..() - if(!uses) + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + if(uses <= 0) qdel(src) - return ..() - if(!proximity) - return ..() - if(!istype(C)) + return ITEM_INTERACT_BLOCKING + if(!isitem(interacting_with)) to_chat(user, span_warning("You can't coat this with lavaproofing fluid!")) - return ..() - . |= AFTERATTACK_PROCESSED_ITEM - to_chat(user, span_notice("You slather the red gunk over the [C], making it lavaproof.")) - C.name = "lavaproof [C.name]" - C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour(COLOR_MAROON, FIXED_COLOUR_PRIORITY) - C.resistance_flags |= LAVA_PROOF - if (isclothing(C)) - var/obj/item/clothing/CL = C - CL.clothing_flags |= LAVAPROTECT + return ITEM_INTERACT_BLOCKING + + var/obj/item/clothing = interacting_with + to_chat(user, span_notice("You slather the red gunk over the [clothing], making it lavaproof.")) + clothing.name = "lavaproof [clothing.name]" + clothing.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + clothing.add_atom_colour(COLOR_MAROON, FIXED_COLOUR_PRIORITY) + clothing.resistance_flags |= LAVA_PROOF + if (isclothing(clothing)) + var/obj/item/clothing/clothing_real = clothing + clothing_real.clothing_flags |= LAVAPROTECT uses-- - if(!uses) + if(uses <= 0) qdel(src) - return . + return ITEM_INTERACT_SUCCESS //Revival potion - Charged Grey /obj/item/slimepotion/slime_reviver @@ -183,15 +182,21 @@ Slimecrossing Potions icon = 'icons/obj/medical/chemical.dmi' icon_state = "potsilver" -/obj/item/slimepotion/slime_reviver/attack(mob/living/basic/slime/revive_target, mob/user) +/obj/item/slimepotion/slime_reviver/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + var/mob/living/basic/slime/revive_target = interacting_with if(!isslime(revive_target)) to_chat(user, span_warning("The potion only works on slimes!")) - return ..() + return ITEM_INTERACT_BLOCKING if(revive_target.stat != DEAD) to_chat(user, span_warning("The slime is still alive!")) - return + return ITEM_INTERACT_BLOCKING if(revive_target.maxHealth <= 0) to_chat(user, span_warning("The slime is too unstable to return!")) + return ITEM_INTERACT_BLOCKING + user.do_attack_animation(interacting_with) revive_target.revive(HEAL_ALL) revive_target.set_stat(CONSCIOUS) revive_target.visible_message(span_notice("[revive_target] is filled with renewed vigor and blinks awake!")) @@ -199,6 +204,7 @@ Slimecrossing Potions revive_target.health -= 10 revive_target.regenerate_icons() qdel(src) + return ITEM_INTERACT_SUCCESS //Stabilizer potion - Charged Blue /obj/item/slimepotion/slime/chargedstabilizer diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 03b178e3f57f7..4b4e6ce105cee 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -1079,7 +1079,7 @@ var/obj/item/slimecross/stabilized/rainbow/X = linked_extract if(istype(X)) if(X.regencore) - X.regencore.afterattack(owner,owner,TRUE) + X.regencore.interact_with_atom(owner, owner) X.regencore = null owner.visible_message(span_warning("[owner] flashes a rainbow of colors, and [owner.p_their()] skin is coated in a milky regenerative goo!")) qdel(src) diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 1ad9ce683e475..c5136baafb149 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -27,8 +27,8 @@ Slimecrossing Weapons throwforce = 15 damtype = BRUTE -/obj/item/knife/rainbowknife/afterattack(atom/O, mob/user, proximity) - if(proximity && isliving(O)) +/obj/item/knife/rainbowknife/afterattack(atom/target, mob/user, params) + if(isliving(target)) damtype = pick(BRUTE, BURN, TOX, OXY) switch(damtype) if(BRUTE) @@ -47,7 +47,6 @@ Slimecrossing Weapons hitsound = 'sound/effects/space_wind.ogg' attack_verb_continuous = string_list(list("suffocates", "winds", "vacuums")) attack_verb_simple = string_list(list("suffocate", "wind", "vacuum")) - return ..() //Adamantine shield - Chilling Adamantine /obj/item/shield/adamantineshield diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index d8cf3456ed221..70784f5b90f3e 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -151,19 +151,20 @@ Chilling extracts: var/list/allies = list() var/active = FALSE -/obj/item/slimecross/chilling/bluespace/afterattack(atom/target, mob/user, proximity) - if(!proximity || !isliving(target) || active) - return - if(HAS_TRAIT(target, TRAIT_NO_TELEPORT)) - to_chat(user, span_warning("[target] resists being linked with [src]!")) - return - if(target in allies) - allies -= target - to_chat(user, span_notice("You unlink [src] with [target].")) +/obj/item/slimecross/chilling/bluespace/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isliving(interacting_with) || active) + return NONE + user.do_attack_animation(interacting_with) + if(HAS_TRAIT(interacting_with, TRAIT_NO_TELEPORT)) + to_chat(user, span_warning("[interacting_with] resists being linked with [src]!")) + return ITEM_INTERACT_BLOCKING + if(interacting_with in allies) + allies -= interacting_with + to_chat(user, span_notice("You unlink [src] with [interacting_with].")) else - allies |= target - to_chat(user, span_notice("You link [src] with [target].")) - return + allies += interacting_with + to_chat(user, span_notice("You link [src] with [interacting_with].")) + return ITEM_INTERACT_SUCCESS /obj/item/slimecross/chilling/bluespace/do_effect(mob/user) if(allies.len <= 0) @@ -193,16 +194,17 @@ Chilling extracts: effect_desc = "Touching someone with it adds/removes them from a list. Activating the extract stops time for 30 seconds, and everyone on the list is immune, except the user." var/list/allies = list() -/obj/item/slimecross/chilling/sepia/afterattack(atom/target, mob/user, proximity) - if(!proximity || !isliving(target)) - return - if(target in allies) - allies -= target - to_chat(user, span_notice("You unlink [src] with [target].")) +/obj/item/slimecross/chilling/sepia/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isliving(interacting_with)) + return NONE + user.do_attack_animation(interacting_with) + if(interacting_with in allies) + allies -= interacting_with + to_chat(user, span_notice("You unlink [src] with [interacting_with].")) else - allies |= target - to_chat(user, span_notice("You link [src] with [target].")) - return + allies += interacting_with + to_chat(user, span_notice("You link [src] with [interacting_with].")) + return ITEM_INTERACT_SUCCESS /obj/item/slimecross/chilling/sepia/do_effect(mob/user) user.visible_message(span_warning("[src] shatters, freezing time itself!")) diff --git a/code/modules/research/xenobiology/crossbreeding/prismatic.dm b/code/modules/research/xenobiology/crossbreeding/prismatic.dm index 3f8509c1a7cd6..947323b0e47f4 100644 --- a/code/modules/research/xenobiology/crossbreeding/prismatic.dm +++ b/code/modules/research/xenobiology/crossbreeding/prismatic.dm @@ -10,25 +10,25 @@ Prismatic extracts: icon_state = "prismatic" var/paintcolor = COLOR_WHITE -/obj/item/slimecross/prismatic/afterattack(turf/target, mob/user, proximity) - if(!proximity) - return - if(!istype(target) || isspaceturf(target)) - return - target.add_atom_colour(paintcolor, WASHABLE_COLOUR_PRIORITY) - playsound(target, 'sound/effects/slosh.ogg', 20, TRUE) - -/obj/item/slimecross/prismatic/grey/ +/obj/item/slimecross/prismatic/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isturf(interacting_with) || isspaceturf(interacting_with)) + return NONE + user.do_attack_animation(interacting_with) + interacting_with.add_atom_colour(paintcolor, WASHABLE_COLOUR_PRIORITY) + playsound(interacting_with, 'sound/effects/slosh.ogg', 20, TRUE) + return ITEM_INTERACT_SUCCESS + +/obj/item/slimecross/prismatic/grey colour = SLIME_TYPE_GREY desc = "It's constantly wet with a pungent-smelling, clear chemical." -/obj/item/slimecross/prismatic/grey/afterattack(turf/target, mob/user, proximity) - . = ..() - if(!proximity) - return - if(istype(target) && target.color != initial(target.color)) - target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - playsound(target, 'sound/effects/slosh.ogg', 20, TRUE) +/obj/item/slimecross/prismatic/grey/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(isturf(interacting_with) && interacting_with.color != initial(interacting_with.color)) + user.do_attack_animation(interacting_with) + interacting_with.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + playsound(interacting_with, 'sound/effects/slosh.ogg', 20, TRUE) + return ITEM_INTERACT_SUCCESS + return ..() /obj/item/slimecross/prismatic/orange paintcolor = "#FFA500" diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index ee02a18f11fae..e46290bef28d5 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -14,14 +14,13 @@ Regenerative extracts: /obj/item/slimecross/regenerative/proc/core_effect_before(mob/living/carbon/human/target, mob/user) return -/obj/item/slimecross/regenerative/afterattack(atom/target,mob/user,prox) - . = ..() - if(!prox || !isliving(target)) +/obj/item/slimecross/regenerative/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isliving(interacting_with)) return - var/mob/living/H = target + var/mob/living/H = interacting_with if(H.stat == DEAD) to_chat(user, span_warning("[src] will not work on the dead!")) - return + return ITEM_INTERACT_BLOCKING if(H != user) user.visible_message(span_notice("[user] crushes [src] over [H], the milky goo quickly regenerating all of [H.p_their()] injuries!"), span_notice("You squeeze [src], and it bursts over [H], the milky goo regenerating [H.p_their()] injuries.")) @@ -29,10 +28,12 @@ Regenerative extracts: user.visible_message(span_notice("[user] crushes [src] over [user.p_them()]self, the milky goo quickly regenerating all of [user.p_their()] injuries!"), span_notice("You squeeze [src], and it bursts in your hand, splashing you with milky goo which quickly regenerates your injuries!")) core_effect_before(H, user) + user.do_attack_animation(interacting_with) H.revive(HEAL_ALL) core_effect(H, user) - playsound(target, 'sound/effects/splat.ogg', 40, TRUE) + playsound(H, 'sound/effects/splat.ogg', 40, TRUE) qdel(src) + return ITEM_INTERACT_SUCCESS /obj/item/slimecross/regenerative/grey colour = SLIME_TYPE_GREY //Has no bonus effect. diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 7f87a08b85b3f..f06665c506e5a 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -644,13 +644,12 @@ desc = "A hard yet gelatinous capsule excreted by a slime, containing mysterious substances." w_class = WEIGHT_CLASS_TINY -/obj/item/slimepotion/afterattack(obj/item/reagent_containers/target, mob/user , proximity) - . = ..() - if(!proximity) - return - if (istype(target)) - to_chat(user, span_warning("You cannot transfer [src] to [target]! It appears the potion must be given directly to a slime to absorb.") ) - return +/obj/item/slimepotion/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(is_reagent_container(interacting_with)) + to_chat(user, span_warning("You cannot transfer [src] to [interacting_with]! \ + It appears the potion must be given directly to a slime to absorb.") ) + return ITEM_INTERACT_BLOCKING + return NONE /obj/item/slimepotion/slime/docility name = "docility potion" @@ -778,33 +777,36 @@ var/prompted = 0 var/animal_type = SENTIENCE_ORGANIC -/obj/item/slimepotion/transference/afterattack(mob/living/switchy_mob, mob/living/user, proximity) - if(!proximity) - return +/obj/item/slimepotion/transference/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + var/mob/living/switchy_mob = interacting_with if(prompted || !isliving(switchy_mob)) - return + return ITEM_INTERACT_BLOCKING if(switchy_mob.ckey) //much like sentience, these will not work on something that is already player controlled balloon_alert(user, "already sentient!") - return ..() + return ITEM_INTERACT_BLOCKING if(switchy_mob.stat) balloon_alert(user, "it's dead!") - return ..() + return ITEM_INTERACT_BLOCKING if(!switchy_mob.compare_sentience_type(animal_type)) balloon_alert(user, "invalid creature!") - return ..() + return ITEM_INTERACT_BLOCKING var/job_banned = is_banned_from(user.ckey, ROLE_MIND_TRANSFER) if(QDELETED(src) || QDELETED(switchy_mob) || QDELETED(user)) - return + return ITEM_INTERACT_BLOCKING if(job_banned) balloon_alert(user, "you're banned!") - return + return ITEM_INTERACT_BLOCKING + user.do_attack_animation(interacting_with) prompted = 1 if(tgui_alert(usr,"This will permanently transfer your consciousness to [switchy_mob]. Are you sure you want to do this?",,list("Yes","No")) == "No") prompted = 0 - return + return ITEM_INTERACT_BLOCKING to_chat(user, span_notice("You drink the potion then place your hands on [switchy_mob]...")) @@ -820,6 +822,7 @@ if(isanimal(switchy_mob)) var/mob/living/simple_animal/switchy_animal= switchy_mob switchy_animal.sentience_act() + return ITEM_INTERACT_SUCCESS /obj/item/slimepotion/slime/steroid name = "slime steroid" @@ -903,29 +906,29 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = "potyellow" -/obj/item/slimepotion/speed/afterattack(obj/C, mob/user, proximity) +/obj/item/slimepotion/speed/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) . = ..() - if(!proximity) - return - if(!istype(C)) + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + if(!isobj(interacting_with)) to_chat(user, span_warning("The potion can only be used on objects!")) - return - . |= AFTERATTACK_PROCESSED_ITEM - if(SEND_SIGNAL(C, COMSIG_SPEED_POTION_APPLIED, src, user) & SPEED_POTION_STOP) - return - if(isitem(C)) - var/obj/item/I = C - if(I.slowdown <= 0 || (I.item_flags & IMMUTABLE_SLOW)) - to_chat(user, span_warning("The [C] can't be made any faster!")) - return ..() - I.slowdown = 0 - - to_chat(user, span_notice("You slather the red gunk over the [C], making it faster.")) - C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour(COLOR_RED, FIXED_COLOUR_PRIORITY) + return ITEM_INTERACT_BLOCKING + if(SEND_SIGNAL(interacting_with, COMSIG_SPEED_POTION_APPLIED, src, user) & SPEED_POTION_STOP) + return ITEM_INTERACT_SUCCESS + if(isitem(interacting_with)) + var/obj/item/apply_to = interacting_with + if(apply_to.slowdown <= 0 || (apply_to.item_flags & IMMUTABLE_SLOW)) + to_chat(user, span_warning("The [apply_to] can't be made any faster!")) + return ITEM_INTERACT_BLOCKING + apply_to.slowdown = 0 + + to_chat(user, span_notice("You slather the red gunk over the [interacting_with], making it faster.")) + interacting_with.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + interacting_with.add_atom_colour(COLOR_RED, FIXED_COLOUR_PRIORITY) qdel(src) + return ITEM_INTERACT_SUCCESS -/obj/item/slimepotion/speed/attackby_storage_insert(datum/storage, atom/storage_holder, mob/user) +/obj/item/slimepotion/speed/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/user) if(!isitem(storage_holder)) return TRUE if(istype(storage_holder, /obj/item/mod/control)) @@ -942,20 +945,20 @@ resistance_flags = FIRE_PROOF var/uses = 3 -/obj/item/slimepotion/fireproof/afterattack(obj/item/clothing/clothing, mob/user, proximity) +/obj/item/slimepotion/fireproof/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) . = ..() - if(!proximity) - return - if(!uses) + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + if(uses <= 0) qdel(src) - return - . |= AFTERATTACK_PROCESSED_ITEM + return ITEM_INTERACT_BLOCKING + var/obj/item/clothing/clothing = interacting_with if(!istype(clothing)) to_chat(user, span_warning("The potion can only be used on clothing!")) - return + return ITEM_INTERACT_BLOCKING if(clothing.max_heat_protection_temperature >= FIRE_IMMUNITY_MAX_TEMP_PROTECT) to_chat(user, span_warning("The [clothing] is already fireproof!")) - return + return ITEM_INTERACT_BLOCKING to_chat(user, span_notice("You slather the blue gunk over the [clothing], fireproofing it.")) clothing.name = "fireproofed [clothing.name]" clothing.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) @@ -964,8 +967,9 @@ clothing.heat_protection = clothing.body_parts_covered clothing.resistance_flags |= FIRE_PROOF uses -- - if(!uses) + if(uses <= 0) qdel(src) + return ITEM_INTERACT_BLOCKING /obj/item/slimepotion/genderchange name = "gender change potion" @@ -1080,4 +1084,3 @@ max_amount = 60 turf_type = /turf/open/floor/sepia merge_type = /obj/item/stack/tile/sepia - diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 6ac45f9424d99..fad856df2b51c 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -797,14 +797,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/storage/pod, 32) new /obj/item/bodybag/environmental(src) new /obj/item/bodybag/environmental(src) -/obj/item/storage/pod/attackby(obj/item/W, mob/user, params) - if (can_interact(user)) - return ..() - -/obj/item/storage/pod/attackby_secondary(obj/item/weapon, mob/user, params) - if (!can_interact(user)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - return ..() +/obj/item/storage/pod/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) + return can_interact(user) /obj/item/storage/pod/attack_hand(mob/user, list/modifiers) if (can_interact(user)) diff --git a/code/modules/spells/spell_types/self/sanguine_strike.dm b/code/modules/spells/spell_types/self/sanguine_strike.dm index afb5860c6a61b..7afa3deb8d943 100644 --- a/code/modules/spells/spell_types/self/sanguine_strike.dm +++ b/code/modules/spells/spell_types/self/sanguine_strike.dm @@ -58,7 +58,7 @@ RegisterSignal(enchanted, COMSIG_ITEM_DROPPED, PROC_REF(on_dropped)) /// signal called from attacking with the enchanted item -/datum/action/cooldown/spell/sanguine_strike/proc/on_enchanted_afterattack(obj/item/enchanted, atom/target, mob/user, proximity_flag, click_parameters) +/datum/action/cooldown/spell/sanguine_strike/proc/on_enchanted_afterattack(obj/item/enchanted, atom/target, mob/user, click_parameters) SIGNAL_HANDLER end_enchantment(enchanted) if(!isliving(target)) diff --git a/code/modules/spells/spell_types/touch/_touch.dm b/code/modules/spells/spell_types/touch/_touch.dm index 2893c9cf83663..5045ea6522092 100644 --- a/code/modules/spells/spell_types/touch/_touch.dm +++ b/code/modules/spells/spell_types/touch/_touch.dm @@ -128,7 +128,6 @@ SHOULD_CALL_PARENT(TRUE) RegisterSignal(attached_hand, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_hand_hit)) - RegisterSignal(attached_hand, COMSIG_ITEM_AFTERATTACK_SECONDARY, PROC_REF(on_secondary_hand_hit)) RegisterSignal(attached_hand, COMSIG_ITEM_DROPPED, PROC_REF(on_hand_dropped)) RegisterSignal(attached_hand, COMSIG_QDELETING, PROC_REF(on_hand_deleted)) @@ -142,7 +141,6 @@ UnregisterSignal(attached_hand, list( COMSIG_ITEM_AFTERATTACK, - COMSIG_ITEM_AFTERATTACK_SECONDARY, COMSIG_ITEM_DROPPED, COMSIG_QDELETING, COMSIG_ITEM_OFFER_TAKEN, @@ -165,33 +163,17 @@ * * When our hand hits an atom, we can cast do_hand_hit() on them. */ -/datum/action/cooldown/spell/touch/proc/on_hand_hit(datum/source, atom/victim, mob/caster, proximity_flag, click_parameters) +/datum/action/cooldown/spell/touch/proc/on_hand_hit(datum/source, atom/victim, mob/caster, click_parameters) SIGNAL_HANDLER SHOULD_NOT_OVERRIDE(TRUE) // DEFINITELY don't put effects here, put them in cast_on_hand_hit - if(!proximity_flag) - return - if(!can_hit_with_hand(victim, caster)) - return - - INVOKE_ASYNC(src, PROC_REF(do_hand_hit), source, victim, caster) - -/** - * Signal proc for [COMSIG_ITEM_AFTERATTACK_SECONDARY] from our attached hand. - * - * Same as on_hand_hit, but for if right-click was used on hit. - */ -/datum/action/cooldown/spell/touch/proc/on_secondary_hand_hit(datum/source, atom/victim, mob/caster, proximity_flag, click_parameters) - SIGNAL_HANDLER - SHOULD_NOT_OVERRIDE(TRUE) // DEFINITELY don't put effects here, put them in cast_on_secondary_hand_hit - - if(!proximity_flag) - return if(!can_hit_with_hand(victim, caster)) return - INVOKE_ASYNC(src, PROC_REF(do_secondary_hand_hit), source, victim, caster) - return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN + if(LAZYACCESS(params2list(click_parameters), RIGHT_CLICK)) + INVOKE_ASYNC(src, PROC_REF(do_secondary_hand_hit), source, victim, caster) + else + INVOKE_ASYNC(src, PROC_REF(do_hand_hit), source, victim, caster) /// Checks if the passed victim can be cast on by the caster. /datum/action/cooldown/spell/touch/proc/can_hit_with_hand(atom/victim, mob/caster) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 07cb1fdd752c0..318926465ae08 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -1310,12 +1310,24 @@ else update_icon_dropped() -// Note: Does NOT return EMP protection value from parent call or pass it on to subtypes +// Note: For effects on subtypes, use the emp_effect() proc instead /obj/item/bodypart/emp_act(severity) var/protection = ..() - if((protection & EMP_PROTECT_WIRES) || !IS_ROBOTIC_LIMB(src)) - return FALSE + // If the limb doesn't protect contents, strike them first + if(!(protection & EMP_PROTECT_CONTENTS)) + for(var/atom/content as anything in contents) + content.emp_act(severity) + + if((protection & (EMP_PROTECT_WIRES | EMP_PROTECT_SELF))) + return protection + emp_effect(severity, protection) + return protection + +/// The actual effect of EMPs on the limb. Allows children to override it however they want +/obj/item/bodypart/proc/emp_effect(severity, protection) + if(!IS_ROBOTIC_LIMB(src)) + return FALSE // with defines at the time of writing, this is 2 brute and 1.5 burn // 2 + 1.5 = 3,5, with 6 limbs thats 21, on a heavy 42 // 42 * 0.8 = 33.6 diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index ca4b61228da42..5c6bd527d1b88 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -115,7 +115,7 @@ damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT) bodypart_flags = BODYPART_UNHUSKABLE -/obj/item/bodypart/leg/left/robot/emp_act(severity) +/obj/item/bodypart/leg/left/robot/emp_effect(severity, protection) . = ..() if(!. || isnull(owner)) return @@ -125,8 +125,9 @@ knockdown_time *= 2 owner.Knockdown(knockdown_time) if(owner.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB)) // So the message isn't duplicated. If they were stunned beforehand by something else, then the message not showing makes more sense anyways. - return + return FALSE to_chat(owner, span_danger("As your [plaintext_zone] unexpectedly malfunctions, it causes you to fall to the ground!")) + return /obj/item/bodypart/leg/right/robot name = "cyborg right leg" @@ -163,7 +164,7 @@ damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT) bodypart_flags = BODYPART_UNHUSKABLE -/obj/item/bodypart/leg/right/robot/emp_act(severity) +/obj/item/bodypart/leg/right/robot/emp_effect(severity, protection) . = ..() if(!. || isnull(owner)) return @@ -173,8 +174,9 @@ knockdown_time *= 2 owner.Knockdown(knockdown_time) if(owner.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB)) // So the message isn't duplicated. If they were stunned beforehand by something else, then the message not showing makes more sense anyways. - return + return FALSE to_chat(owner, span_danger("As your [plaintext_zone] unexpectedly malfunctions, it causes you to fall to the ground!")) + return /obj/item/bodypart/chest/robot name = "cyborg torso" @@ -215,7 +217,7 @@ var/wired = FALSE var/obj/item/stock_parts/cell/cell = null -/obj/item/bodypart/chest/robot/emp_act(severity) +/obj/item/bodypart/chest/robot/emp_effect(severity, protection) . = ..() if(!. || isnull(owner)) return @@ -236,6 +238,7 @@ to_chat(owner, span_danger("Your [plaintext_zone]'s logic boards temporarily become unresponsive!")) owner.Stun(stun_time) owner.Shake(pixelshiftx = shift_x, pixelshifty = shift_y, duration = shake_duration) + return /obj/item/bodypart/chest/robot/get_cell() return cell @@ -390,7 +393,7 @@ #define EMP_GLITCH "EMP_GLITCH" -/obj/item/bodypart/head/robot/emp_act(severity) +/obj/item/bodypart/head/robot/emp_effect(severity, protection) . = ..() if(!. || isnull(owner)) return @@ -404,6 +407,7 @@ owner.add_client_colour(/datum/client_colour/malfunction) addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living/carbon/human, remove_client_colour), /datum/client_colour/malfunction), glitch_duration) + return #undef EMP_GLITCH diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 85c1beab0a357..be4bdb6db5d24 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -341,11 +341,9 @@ . = ..() UnregisterSignal(user, COMSIG_SURGERY_STARTING) -/obj/item/surgical_processor/afterattack(atom/design_holder, mob/user, proximity) - if(!proximity) - return ..() +/obj/item/surgical_processor/interact_with_atom(atom/design_holder, mob/living/user, list/modifiers) if(!istype(design_holder, /obj/item/disk/surgery) && !istype(design_holder, /obj/machinery/computer/operating)) - return ..() + return NONE balloon_alert(user, "copying designs...") playsound(src, 'sound/machines/terminal_processing.ogg', 25, TRUE) if(do_after(user, 1 SECONDS, target = design_holder)) @@ -358,7 +356,8 @@ playsound(src, 'sound/machines/terminal_success.ogg', 25, TRUE) downloaded = TRUE update_appearance(UPDATE_OVERLAYS) - return TRUE + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING /obj/item/surgical_processor/update_overlays() . = ..() diff --git a/code/modules/transport/tram/tram_controller.dm b/code/modules/transport/tram/tram_controller.dm index a7b8a7c6a24a2..1323953de78f7 100644 --- a/code/modules/transport/tram/tram_controller.dm +++ b/code/modules/transport/tram/tram_controller.dm @@ -361,6 +361,7 @@ * Tram comes to an in-station degraded stop, throwing the players. Caused by power loss or tram malfunction event. */ /datum/transport_controller/linear/tram/proc/degraded_stop() + crash_fx() log_transport("TC: [specific_transport_id] trip completed with a degraded status. Info: [TC_TS_STATUS] nav_pos ([nav_beacon.x], [nav_beacon.y], [nav_beacon.z]) idle_pos ([destination_platform.x], [destination_platform.y], [destination_platform.z]).") addtimer(CALLBACK(src, PROC_REF(unlock_controls)), 4 SECONDS) if(controller_status & SYSTEM_FAULT) @@ -398,6 +399,7 @@ if(travel_remaining) travel_remaining = 0 + crash_fx() var/throw_direction = travel_direction for(var/obj/structure/transport/linear/tram/module in transport_modules) module.estop_throw(throw_direction) @@ -460,6 +462,17 @@ set_status_code(EMERGENCY_STOP, TRUE) log_transport("TC: [specific_transport_id] requested emergency stop.") +/** + * Tram crash sound and visuals + */ +/datum/transport_controller/linear/tram/proc/crash_fx() + playsound(source = nav_beacon, soundin = 'sound/vehicles/car_crash.ogg', vol = 100, vary = FALSE, falloff_distance = DEFAULT_TRAM_LENGTH) + nav_beacon.audible_message(span_userdanger("You hear metal grinding as the tram comes to a sudden, complete stop!")) + for(var/mob/living/tram_passenger in range(DEFAULT_TRAM_LENGTH - 2, nav_beacon)) + if(tram_passenger.stat != CONSCIOUS) + continue + shake_camera(M = tram_passenger, duration = 0.2 SECONDS, strength = 3) + /** * Handles unlocking the tram controls for use after moving * diff --git a/code/modules/transport/transport_module.dm b/code/modules/transport/transport_module.dm index eb516528da805..268452743e7b2 100644 --- a/code/modules/transport/transport_module.dm +++ b/code/modules/transport/transport_module.dm @@ -954,7 +954,6 @@ /obj/structure/transport/linear/tram/proc/estop_throw(throw_direction) for(var/mob/living/passenger in transport_contents) - to_chat(passenger, span_userdanger("The tram comes to a sudden, grinding stop!")) var/mob_throw_chance = transport_controller_datum.throw_chance if(prob(mob_throw_chance || 17.5) || HAS_TRAIT(passenger, TRAIT_CURSED)) // sometimes you go through a window, especially with bad luck passenger.AddElement(/datum/element/window_smashing, duration = 1.5 SECONDS) diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index e6275bc02e1e0..3fc6db542196e 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -119,6 +119,7 @@ #include "closets.dm" #include "clothing_under_armor_subtype_check.dm" #include "combat.dm" +#include "combat_stamina.dm" #include "combat_welder.dm" #include "component_tests.dm" #include "confusion.dm" @@ -204,6 +205,7 @@ #include "organ_bodypart_shuffle.dm" #include "organ_set_bonus.dm" #include "organs.dm" +#include "orphaned_genturf.dm" #include "outfit_sanity.dm" #include "oxyloss_suffocation.dm" #include "paintings.dm" diff --git a/code/modules/unit_tests/combat_stamina.dm b/code/modules/unit_tests/combat_stamina.dm new file mode 100644 index 0000000000000..fa0b6b4219b46 --- /dev/null +++ b/code/modules/unit_tests/combat_stamina.dm @@ -0,0 +1,24 @@ +/// Tests 100 stamina damage = stamcrit +/datum/unit_test/stamcrit + priority = TEST_LONGER + +/datum/unit_test/stamcrit/Run() + var/mob/living/carbon/human/consistent/tider = allocate(__IMPLIED_TYPE__) + tider.stamina_regen_time = 0.2 SECONDS + tider.adjustStaminaLoss(99) + TEST_ASSERT(!tider.has_status_effect(/datum/status_effect/incapacitating/stamcrit), "Stamcrit should not be applied at 99 stamina damage") + tider.adjustStaminaLoss(1) + TEST_ASSERT(tider.has_status_effect(/datum/status_effect/incapacitating/stamcrit), "Stamcrit should be applied at 100 stamina damage") + sleep(tider.stamina_regen_time * 2) + TEST_ASSERT(!tider.has_status_effect(/datum/status_effect/incapacitating/stamcrit), "Stamcrit should be removed after regen time") + +/// Tests stamina regen after the set time +/datum/unit_test/stam_regen + priority = TEST_LONGER + +/datum/unit_test/stam_regen/Run() + var/mob/living/carbon/human/consistent/tider = allocate(__IMPLIED_TYPE__) + tider.stamina_regen_time = 0.2 SECONDS + tider.adjustStaminaLoss(50) + sleep(tider.stamina_regen_time * 2) + TEST_ASSERT_EQUAL(tider.getStaminaLoss(), 0, "Stamina should be fully regenerated after regen time") diff --git a/code/modules/unit_tests/orphaned_genturf.dm b/code/modules/unit_tests/orphaned_genturf.dm new file mode 100644 index 0000000000000..289b883d2def4 --- /dev/null +++ b/code/modules/unit_tests/orphaned_genturf.dm @@ -0,0 +1,7 @@ +/// Ensures we do not leave genturfs sitting around post work +/// They serve as notice to the mapper and have no functionality, but it's good to make note of it here +/datum/unit_test/orphaned_genturf + +/datum/unit_test/orphaned_genturf/Run() + for(var/turf/open/genturf/orphaned in ALL_TURFS()) + TEST_FAIL("Floating genturf ([orphaned.type]) detected at ([orphaned.x], [orphaned.y], [orphaned.z]) : [orphaned.loc.type]. Why was it not replaced?") diff --git a/code/modules/unit_tests/projectiles.dm b/code/modules/unit_tests/projectiles.dm index a6462855179f5..7c2b1c00aa8d9 100644 --- a/code/modules/unit_tests/projectiles.dm +++ b/code/modules/unit_tests/projectiles.dm @@ -26,7 +26,7 @@ gunner.set_combat_mode(FALSE) // just to make sure we know we're not trying to pistol-whip them var/expected_damage = loaded_bullet.damage loaded_bullet.def_zone = BODY_ZONE_CHEST - var/did_we_shoot = test_gun.afterattack(victim, gunner) + var/did_we_shoot = test_gun.melee_attack_chain(gunner, victim) TEST_ASSERT(did_we_shoot, "Gun does not appeared to have successfully fired.") TEST_ASSERT_EQUAL(victim.getBruteLoss(), expected_damage, "Victim took incorrect amount of damage, expected [expected_damage], got [victim.getBruteLoss()].") diff --git a/code/modules/unit_tests/reagent_mob_expose.dm b/code/modules/unit_tests/reagent_mob_expose.dm index 51c35520dafb4..844b863c0374b 100644 --- a/code/modules/unit_tests/reagent_mob_expose.dm +++ b/code/modules/unit_tests/reagent_mob_expose.dm @@ -30,7 +30,7 @@ // TOUCH dropper.reagents.add_reagent(/datum/reagent/water, 5) - dropper.afterattack(human, human, TRUE) + dropper.melee_attack_chain(human, human) TEST_ASSERT(human.fire_stacks < 0, "Human still has fire stacks after touching water") // VAPOR diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 88ac58370df8b..015c3d6f7e0cb 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -316,28 +316,27 @@ product_ads = "Any day above ground is a good one!;My day starts when yours ends!;And they call this a dying business!;See you when you're dead!" vend_reply = "Don't forget your \"Buy one get one free\" burial deal!" products = list( - /obj/item/toy/crayon/white = 2, + /obj/item/cautery/cruel = 1, + /obj/item/clothing/gloves/latex/coroner = 1, /obj/item/clothing/head/utility/surgerycap/black = 1, /obj/item/clothing/mask/surgical = 1, - /obj/item/clothing/under/rank/medical/scrubs/coroner = 1, - /obj/item/clothing/under/rank/medical/coroner = 1, - /obj/item/clothing/under/rank/medical/coroner/skirt = 1, - /obj/item/clothing/suit/toggle/labcoat/coroner = 1, + /obj/item/clothing/shoes/sneakers/black = 1, /obj/item/clothing/suit/apron/surgical = 1, /obj/item/clothing/suit/hooded/wintercoat/medical/coroner = 1, - /obj/item/clothing/gloves/latex/coroner = 1, - /obj/item/clothing/shoes/sneakers/black = 1, + /obj/item/clothing/suit/toggle/labcoat/coroner = 1, + /obj/item/clothing/under/rank/medical/coroner = 1, + /obj/item/clothing/under/rank/medical/coroner/skirt = 1, + /obj/item/clothing/under/rank/medical/scrubs/coroner = 1, + /obj/item/hemostat/cruel = 1, + /obj/item/radio/headset/headset_srvmed = 2, + /obj/item/retractor/cruel = 1, + /obj/item/scalpel/cruel = 1, /obj/item/storage/backpack/coroner = 1, - /obj/item/storage/backpack/satchel/coroner = 1, /obj/item/storage/backpack/duffelbag/coroner = 1, /obj/item/storage/backpack/messenger/coroner = 1, + /obj/item/storage/backpack/satchel/coroner = 1, /obj/item/storage/box/bodybags = 3, - /obj/item/scalpel/cruel = 1, - /obj/item/retractor/cruel = 1, - /obj/item/hemostat/cruel = 1, - /obj/item/cautery/cruel = 1, - /obj/item/toy/crayon/white = 1, - /obj/item/radio/headset/headset_srvmed = 2, + /obj/item/toy/crayon/white = 2, ) contraband = list( /obj/item/knife/ritual = 1, diff --git a/code/modules/wiremod/components/admin/signal_handler/signal_list.dm b/code/modules/wiremod/components/admin/signal_handler/signal_list.dm index 8fbff3dcfaa7c..7d6571484b7f7 100644 --- a/code/modules/wiremod/components/admin/signal_handler/signal_list.dm +++ b/code/modules/wiremod/components/admin/signal_handler/signal_list.dm @@ -41,7 +41,6 @@ GLOBAL_LIST_INIT(integrated_circuit_signal_ids, generate_circuit_signal_list()) COMSIG_ITEM_AFTERATTACK = list(cancel_attack, target, user), COMSIG_ITEM_ATTACK_SECONDARY = list(secondary_cancel_attack, secondary_continue_attack, target, user), COMSIG_ITEM_PRE_ATTACK_SECONDARY = list(secondary_cancel_attack, secondary_continue_attack, target, user), - COMSIG_ITEM_AFTERATTACK_SECONDARY = list(secondary_cancel_attack, secondary_continue_attack, target, user), COMSIG_ITEM_ATTACK_SELF = list(cancel_attack, user), COMSIG_ITEM_ATTACK_SELF_SECONDARY = list(cancel_attack, user), ) diff --git a/code/modules/wiremod/shell/scanner.dm b/code/modules/wiremod/shell/scanner.dm index c88d7b1fb5f97..f32f91fa76f2e 100644 --- a/code/modules/wiremod/shell/scanner.dm +++ b/code/modules/wiremod/shell/scanner.dm @@ -41,22 +41,19 @@ signal = add_output_port("Scanned", PORT_TYPE_SIGNAL) /obj/item/circuit_component/wiremod_scanner/register_shell(atom/movable/shell) - RegisterSignal(shell, COMSIG_ITEM_AFTERATTACK, PROC_REF(handle_afterattack)) + RegisterSignal(shell, COMSIG_ITEM_INTERACTING_WITH_ATOM, PROC_REF(handle_interaction)) /obj/item/circuit_component/wiremod_scanner/unregister_shell(atom/movable/shell) - UnregisterSignal(shell, COMSIG_ITEM_AFTERATTACK) + UnregisterSignal(shell, COMSIG_ITEM_INTERACTING_WITH_ATOM) /** * Called when the shell item attacks something */ -/obj/item/circuit_component/wiremod_scanner/proc/handle_afterattack(atom/source, atom/target, mob/user, proximity_flag) +/obj/item/circuit_component/wiremod_scanner/proc/handle_interaction(atom/source, mob/user, atom/target, ...) SIGNAL_HANDLER - if(!proximity_flag) - return source.balloon_alert(user, "scanned object") - playsound(source, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) + playsound(source, SFX_TERMINAL_TYPE, 25, FALSE) attacker.set_output(user) attacking.set_output(target) signal.set_output(COMPONENT_SIGNAL) - return COMPONENT_AFTERATTACK_PROCESSED_ITEM - + return ITEM_INTERACT_SUCCESS diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 1d5caf8e9093b..14dc6edee1118 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -11,16 +11,11 @@ bare_wound_bonus = 15 sharpness = SHARP_EDGED -/obj/item/mutant_hand/zombie/afterattack(atom/target, mob/living/user, proximity_flag) - . = ..() - if(!proximity_flag) - return +/obj/item/mutant_hand/zombie/afterattack(atom/target, mob/user, click_parameters) + if(ishuman(target)) + try_to_zombie_infect(target, user, user.zone_selected) else if(isliving(target)) - if(ishuman(target)) - try_to_zombie_infect(target, user, user.zone_selected) - else - . |= AFTERATTACK_PROCESSED_ITEM - check_feast(target, user) + check_feast(target, user) /proc/try_to_zombie_infect(mob/living/carbon/human/target, mob/living/user, def_zone = BODY_ZONE_CHEST) CHECK_DNA_AND_SPECIES(target) diff --git a/config/lavaruinblacklist.txt b/config/lavaruinblacklist.txt index fd0c0d85c64af..fe4cbc86e1ef4 100644 --- a/config/lavaruinblacklist.txt +++ b/config/lavaruinblacklist.txt @@ -35,6 +35,7 @@ #_maps/RandomRuins/LavaRuins/lavaland_surface_mookvillage.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_shuttle_wreckage.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm @@ -42,3 +43,4 @@ #_maps/RandomRuins/LavaRuins/lavaland_surface_ww_vault.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm + diff --git a/html/changelogs/AutoChangeLog-pr-83445.yml b/html/changelogs/AutoChangeLog-pr-83445.yml new file mode 100644 index 0000000000000..5c11c512dfeb6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83445.yml @@ -0,0 +1,4 @@ +author: "Melbert" +delete-after: True +changes: + - balance: "Taking stamina damage in stamcrit has diminishing returns associated, meaning you cannot be infinitely stamcrit." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83510.yml b/html/changelogs/AutoChangeLog-pr-83510.yml deleted file mode 100644 index ef3af4284ec95..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83510.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "EnterTheJake" -delete-after: True -changes: - - rscadd: "adds the MOD shock-absorption module, into the game." - - rscadd: "The MOD shock-absorption module into the the uplinks, costs 4 TC." - - balance: "Nukie modsuits come with the shock_absorption module preinstalled." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83521.yml b/html/changelogs/AutoChangeLog-pr-83521.yml new file mode 100644 index 0000000000000..5ef70873333c6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83521.yml @@ -0,0 +1,5 @@ +author: "Melbert" +delete-after: True +changes: + - rscadd: "Character Loadouts" + - rscdel: "Pride Pin quirk (it's in the Loadout menu now)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83686.yml b/html/changelogs/AutoChangeLog-pr-83686.yml new file mode 100644 index 0000000000000..44cd7d3477090 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83686.yml @@ -0,0 +1,4 @@ +author: "Capsandi" +delete-after: True +changes: + - sound: "Some ambience tracks are quieter now." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83737.yml b/html/changelogs/AutoChangeLog-pr-83737.yml new file mode 100644 index 0000000000000..f8e4244a32aac --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83737.yml @@ -0,0 +1,4 @@ +author: "Kocma-san" +delete-after: True +changes: + - rscadd: "Added new keywords (%d, %date, %t, %time) for fields" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83818.yml b/html/changelogs/AutoChangeLog-pr-83818.yml new file mode 100644 index 0000000000000..ba03c694b09d9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83818.yml @@ -0,0 +1,6 @@ +author: "Melbert" +delete-after: True +changes: + - refactor: "Over 200 item interactions have been refactored to use a newer, easier-to-use system. Report any oddities with using items on other objects you may see (such as surgery, reagent containers like cups and spray bottles, or construction devices), especially using something at range (such as guns or chisels)" + - refactor: "Item-On-Modsuit interactions have changed slightly. While on combat mode, you will attempt to \"use\" the item on the suit instead of inserting it into the suit's storage. This means being on combat mode while the suit's panel is open will block you from inserting items entirely via click (but other methods such as hotkey, clicking on the storage boxes, and mousedrop will still work)." + - refactor: "The detective's scanner will now be inserted into storage items if clicked normally, and will scan the storage item if on combat mode" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83857.yml b/html/changelogs/AutoChangeLog-pr-83857.yml new file mode 100644 index 0000000000000..4b66dc9779c8b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83857.yml @@ -0,0 +1,5 @@ +author: "Majkl-J" +delete-after: True +changes: + - bugfix: "EMPs on carbons no longer happen twice" + - code_imp: "Moves organ emps under bodyparts, changes how bodyparts handle emp effects" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83858.yml b/html/changelogs/AutoChangeLog-pr-83858.yml new file mode 100644 index 0000000000000..47c6dcb25d774 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83858.yml @@ -0,0 +1,4 @@ +author: "Goat" +delete-after: True +changes: + - bugfix: "Enviro suit lights no longer stay on when the welding visor is activated." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83873.yml b/html/changelogs/AutoChangeLog-pr-83873.yml new file mode 100644 index 0000000000000..bbd273f8372f2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83873.yml @@ -0,0 +1,4 @@ +author: "LT3" +delete-after: True +changes: + - sound: "You can now experience tram crashes in higher fidelity than ever!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83878.yml b/html/changelogs/AutoChangeLog-pr-83878.yml new file mode 100644 index 0000000000000..bf364164ec397 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83878.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: " RCD, RPLD & RTD cancels their build process if their design is changed during build." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83883.yml b/html/changelogs/AutoChangeLog-pr-83883.yml new file mode 100644 index 0000000000000..6e46203a27b5a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83883.yml @@ -0,0 +1,4 @@ +author: "Rhials" +delete-after: True +changes: + - bugfix: "The \"mopper\" gimmick assistant outfit spawns with one cart instead of nine." \ No newline at end of file diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index 20dd1cfea33cb..a8af888ec8988 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -514,3 +514,63 @@ - bugfix: fixed rebar crossbow shots not dropping items on hitting walls - bugfix: fixed traitor crossbow having worse wound chance than the base one - sound: added new crossbow firing sound effect +2024-06-11: + Addust: + - bugfix: The Syndicate has corrected some technical issues at a listening post + in the Icemoon. + DaCoolBoss: + - rscadd: The Lizard's Gas ruin in Lavaland has been revamped, and now dispenses + plasma gas fuel. + EnterTheJake: + - rscadd: adds the MOD shock-absorption module, into the game. + - rscadd: The MOD shock-absorption module into the the uplinks, costs 4 TC. + - balance: Nukie modsuits come with the shock_absorption module preinstalled. + EuSouAFazer: + - rscadd: New room in Wawastation, the Cytology Lab! Positioned behind the test + fire range. + IsaacExists: + - bugfix: Eastern icebox visitation door no longer missing a floor tile. + grungususs: + - bugfix: fixed the hole in lawyer's office on tramstation + improvedname: + - qol: Adds additional piping to wawastation ordnance + - bugfix: Adds a missing atmos waste vent for wawastation + junkgle01: + - bugfix: Polishes up new Meta Cargo's decals and associated amenities. +2024-06-12: + Goat: + - bugfix: blood drunk miner can now path over lava + NewyearnewmeUwu: + - balance: Pacifists can now use psychotic brawling, at major mood costs. + PowerfulAtom111: + - rscadd: after a quick galactic meeting, insane people around the universe can + now speak gibbering to express their ideas free from the prying ears of the + walls + - rscadd: as an insane person, taking your meds deafens your ears to the holy tongue + all the other insane people are speaking + - spellcheck: added a bit of text to the RDS quirk and the RDS medical record text + to highlight the insane's new abilities + aaaa1023: + - bugfix: there is now one more crayon in the Mortidrobe. + grungussuss: + - bugfix: fixed getting a fake white dwarf report when the shift isn't extended + mode, which lead to meta knowledge being used. + munchyi: + - rscadd: 'added a new virtual domain + + :cl: + + ![image](https://github.com/tgstation/tgstation/assets/154919526/2d94fe21-bc45-40dc-9f84-4b69088b353c)' + norsvenska: + - bugfix: The recyclers in the snow cabin gateway, the cyborg mothership, and the + deep storage space ruin are now rotated properly. + r3dj4ck0424: + - rscadd: Added another ruin to Lavaland + sylvia-from-fulp-station: + - image: Adds a unique sprite for envyknife + uaioy: + - qol: the first Medieval pirate to spawn will be the Warlord, warlord and crude + helmet have flash protection + - bugfix: Medieval shuttle has actual engines now + - bugfix: Shortsword has its original colours + - bugfix: Crude helmet no longer makes you bald diff --git a/icons/area/areas_ruins.dmi b/icons/area/areas_ruins.dmi index 9f5929274d16c..f4b67ee6495fa 100644 Binary files a/icons/area/areas_ruins.dmi and b/icons/area/areas_ruins.dmi differ diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi index 6a0520ac9da69..40c58203286df 100644 Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi index 29db3057a2ab9..0600498a34ba9 100644 Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ diff --git a/icons/obj/fluff/previews.dmi b/icons/obj/fluff/previews.dmi index c62b055f71efd..8a69c1363189d 100644 Binary files a/icons/obj/fluff/previews.dmi and b/icons/obj/fluff/previews.dmi differ diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 0168e12acccb7..f8f83d9ab54ae 100644 Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ diff --git a/icons/obj/weapons/stabby.dmi b/icons/obj/weapons/stabby.dmi index f49bac3272af6..24d4e0aef31eb 100644 Binary files a/icons/obj/weapons/stabby.dmi and b/icons/obj/weapons/stabby.dmi differ diff --git a/icons/obj/weapons/sword.dmi b/icons/obj/weapons/sword.dmi index 5dca921bd5bc4..ca819ffcc5136 100644 Binary files a/icons/obj/weapons/sword.dmi and b/icons/obj/weapons/sword.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 28ad938775d3c..09e0898594629 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/sound/ambience/ambicave.ogg b/sound/ambience/ambicave.ogg index d78dc46a4ce05..dac8135f8e3fe 100644 Binary files a/sound/ambience/ambicave.ogg and b/sound/ambience/ambicave.ogg differ diff --git a/sound/ambience/ambigen12.ogg b/sound/ambience/ambigen12.ogg index 0ae24a9a680c9..27885070f4c71 100644 Binary files a/sound/ambience/ambigen12.ogg and b/sound/ambience/ambigen12.ogg differ diff --git a/sound/ambience/ambilava1.ogg b/sound/ambience/ambilava1.ogg index b552965faaccd..50cd0b23d5e1f 100644 Binary files a/sound/ambience/ambilava1.ogg and b/sound/ambience/ambilava1.ogg differ diff --git a/sound/ambience/ambimaint6.ogg b/sound/ambience/ambimaint6.ogg index f83e3ed1d6b0e..b4ad4350f4977 100644 Binary files a/sound/ambience/ambimaint6.ogg and b/sound/ambience/ambimaint6.ogg differ diff --git a/sound/ambience/ambimaint7.ogg b/sound/ambience/ambimaint7.ogg index 3db2f226a4ab5..9fa695102d821 100644 Binary files a/sound/ambience/ambimaint7.ogg and b/sound/ambience/ambimaint7.ogg differ diff --git a/sound/ambience/ambispace4.ogg b/sound/ambience/ambispace4.ogg index 76ef0814eaa5f..b3824c66135fc 100644 Binary files a/sound/ambience/ambispace4.ogg and b/sound/ambience/ambispace4.ogg differ diff --git a/sound/ambience/ambivapor1.ogg b/sound/ambience/ambivapor1.ogg index 4374f46710d88..6c43ff1ef0197 100644 Binary files a/sound/ambience/ambivapor1.ogg and b/sound/ambience/ambivapor1.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 352885b35305d..5a4f39a1d664f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1727,7 +1727,6 @@ #include "code\datums\quirks\neutral_quirks\photographer.dm" #include "code\datums\quirks\neutral_quirks\pineapple_hater.dm" #include "code\datums\quirks\neutral_quirks\pineapple_liker.dm" -#include "code\datums\quirks\neutral_quirks\pride_pin.dm" #include "code\datums\quirks\neutral_quirks\shifty_eyes.dm" #include "code\datums\quirks\neutral_quirks\snob.dm" #include "code\datums\quirks\neutral_quirks\transhumanist.dm" @@ -1843,6 +1842,7 @@ #include "code\datums\status_effects\debuffs\spacer.dm" #include "code\datums\status_effects\debuffs\speech_debuffs.dm" #include "code\datums\status_effects\debuffs\staggered.dm" +#include "code\datums\status_effects\debuffs\stamcrit.dm" #include "code\datums\status_effects\debuffs\static_vision.dm" #include "code\datums\status_effects\debuffs\strandling.dm" #include "code\datums\status_effects\debuffs\terrified.dm" @@ -3524,6 +3524,7 @@ #include "code\modules\bitrunning\virtual_domain\domains\bubblegum.dm" #include "code\modules\bitrunning\virtual_domain\domains\clown_planet.dm" #include "code\modules\bitrunning\virtual_domain\domains\colossus.dm" +#include "code\modules\bitrunning\virtual_domain\domains\fredingtonfastingbear.dm" #include "code\modules\bitrunning\virtual_domain\domains\gondola_asteroid.dm" #include "code\modules\bitrunning\virtual_domain\domains\hierophant.dm" #include "code\modules\bitrunning\virtual_domain\domains\pipedream.dm" @@ -3694,7 +3695,6 @@ #include "code\modules\client\preferences\pixel_size.dm" #include "code\modules\client\preferences\playtime_reward_cloak.dm" #include "code\modules\client\preferences\preferred_map.dm" -#include "code\modules\client\preferences\pride_pin.dm" #include "code\modules\client\preferences\prisoner_crime.dm" #include "code\modules\client\preferences\prosthetic_limb.dm" #include "code\modules\client\preferences\prosthetic_organ.dm" @@ -3729,6 +3729,7 @@ #include "code\modules\client\preferences\migrations\body_type_migration.dm" #include "code\modules\client\preferences\migrations\convert_to_json_savefile.dm" #include "code\modules\client\preferences\migrations\legacy_sound_toggles_migration.dm" +#include "code\modules\client\preferences\migrations\quirk_loadout_migration.dm" #include "code\modules\client\preferences\migrations\tgui_prefs_migration.dm" #include "code\modules\client\preferences\migrations\tts_blip_migration.dm" #include "code\modules\client\preferences\species_features\basic.dm" @@ -4402,6 +4403,17 @@ #include "code\modules\lighting\lighting_source.dm" #include "code\modules\lighting\lighting_turf.dm" #include "code\modules\lighting\static_lighting_area.dm" +#include "code\modules\loadout\loadout_categories.dm" +#include "code\modules\loadout\loadout_helpers.dm" +#include "code\modules\loadout\loadout_items.dm" +#include "code\modules\loadout\loadout_menu.dm" +#include "code\modules\loadout\loadout_preference.dm" +#include "code\modules\loadout\categories\accessories.dm" +#include "code\modules\loadout\categories\glasses.dm" +#include "code\modules\loadout\categories\heads.dm" +#include "code\modules\loadout\categories\inhands.dm" +#include "code\modules\loadout\categories\neck.dm" +#include "code\modules\loadout\categories\pocket.dm" #include "code\modules\logging\log_category.dm" #include "code\modules\logging\log_entry.dm" #include "code\modules\logging\log_holder.dm" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferenceWindow.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferenceWindow.tsx index 261c40408f1b9..1e6f779c847ac 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferenceWindow.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferenceWindow.tsx @@ -7,6 +7,7 @@ import { Window } from '../../layouts'; import { AntagsPage } from './AntagsPage'; import { PreferencesMenuData } from './data'; import { JobsPage } from './JobsPage'; +import { LoadoutPage } from './loadout/index'; import { MainPage } from './MainPage'; import { PageButton } from './PageButton'; import { QuirksPage } from './QuirksPage'; @@ -18,6 +19,7 @@ enum Page { Jobs, Species, Quirks, + Loadout, } const CharacterProfiles = (props: { @@ -75,6 +77,11 @@ export const CharacterPreferenceWindow = (props) => { case Page.Quirks: pageContents = ; break; + + case Page.Loadout: + pageContents = ; + break; + default: exhaustiveCheck(currentPage); } @@ -116,6 +123,16 @@ export const CharacterPreferenceWindow = (props) => { + + + Loadout + + + ; @@ -191,6 +194,9 @@ export type ServerData = { random: { randomizable: string[]; }; + loadout: { + loadout_tabs: LoadoutCategory[]; + }; species: Record; [otheyKey: string]: unknown; }; diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/ItemDisplay.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/ItemDisplay.tsx new file mode 100644 index 0000000000000..11b20b0097963 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/ItemDisplay.tsx @@ -0,0 +1,147 @@ +import { createSearch } from '../../../../common/string'; +import { useBackend } from '../../../backend'; +import { + Box, + Button, + DmIcon, + Flex, + Icon, + NoticeBox, +} from '../../../components'; +import { LoadoutCategory, LoadoutItem, LoadoutManagerData } from './base'; + +export const ItemIcon = (props: { item: LoadoutItem; scale?: number }) => { + const { item, scale = 3 } = props; + const icon_to_use = item.icon; + const icon_state_to_use = item.icon_state; + + if (!icon_to_use || !icon_state_to_use) { + return ( + + ); + } + + return ( + } + icon={icon_to_use} + icon_state={icon_state_to_use} + style={{ + transform: `scale(${scale}) translateX(${scale * 3}px) translateY(${ + scale * 3 + }px)`, + }} + /> + ); +}; + +export const ItemDisplay = (props: { + active: boolean; + item: LoadoutItem; + scale?: number; +}) => { + const { act } = useBackend(); + const { active, item, scale = 3 } = props; + + const boxSize = `${scale * 32}px`; + + return ( + + ); +}; + +const ItemListDisplay = (props: { items: LoadoutItem[] }) => { + const { data } = useBackend(); + const { loadout_list } = data.character_preferences.misc; + return ( + + {props.items.map((item) => ( + + + + ))} + + ); +}; + +export const LoadoutTabDisplay = (props: { + category: LoadoutCategory | undefined; +}) => { + const { category } = props; + if (!category) { + return ( + + Erroneous category detected! This is a bug, please report it. + + ); + } + + return ; +}; + +export const SearchDisplay = (props: { + loadout_tabs: LoadoutCategory[]; + currentSearch: string; +}) => { + const { loadout_tabs, currentSearch } = props; + + const search = createSearch( + currentSearch, + (loadout_item: LoadoutItem) => loadout_item.name, + ); + + const validLoadoutItems = loadout_tabs + .flatMap((tab) => tab.contents) + .filter(search) + .sort((a, b) => (a.name > b.name ? 1 : -1)); + + if (validLoadoutItems.length === 0) { + return No items found!; + } + + return ; +}; diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/ModifyPanel.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/ModifyPanel.tsx new file mode 100644 index 0000000000000..70959691af850 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/ModifyPanel.tsx @@ -0,0 +1,219 @@ +import { useBackend } from '../../../backend'; +import { + Box, + Button, + Dimmer, + DmIcon, + Flex, + Icon, + LabeledList, + Section, + Stack, +} from '../../../components'; +import { FAIcon, LoadoutItem, LoadoutManagerData, ReskinOption } from './base'; +import { ItemIcon } from './ItemDisplay'; + +// Used in LoadoutItem to make buttons relating to how an item can be edited +export type LoadoutButton = { + label: string; + act_key?: string; + button_icon?: FAIcon; + button_text?: string; + active_key?: string; + active_text?: string; + inactive_text?: string; + tooltip_text?: string; +}; + +const LoadoutModifyButton = (props: { + button: LoadoutButton; + modifyItemDimmer: LoadoutItem; +}) => { + const { act, data } = useBackend(); + const { loadout_list } = data.character_preferences.misc; + const { button, modifyItemDimmer } = props; + + const buttonIsActive = + button.active_key && loadout_list[modifyItemDimmer.path][button.active_key]; + + if (button.active_text && button.inactive_text) { + return ( + { + act('pass_to_loadout_item', { + subaction: button.act_key, + path: modifyItemDimmer.path, + }); + }} + > + {buttonIsActive ? button.active_text : button.inactive_text} + + ); + } + + return ( + + ); +}; + +const LoadoutModifyButtons = (props: { modifyItemDimmer: LoadoutItem }) => { + const { act, data } = useBackend(); + const { loadout_list } = data.character_preferences.misc; + const { modifyItemDimmer } = props; + + const isActive = (item: LoadoutItem, reskin: ReskinOption) => { + return loadout_list && loadout_list[item.path]['reskin'] + ? loadout_list[item.path]['reskin'] === reskin.name + : item.icon_state === reskin.skin_icon_state; + }; + + return ( + + + + {!!modifyItemDimmer.reskins && ( + + + {modifyItemDimmer.reskins.map((reskin) => ( + + + + ))} + + + )} + {modifyItemDimmer.buttons.map((button) => ( + + + + ))} + + + + ); +}; + +const LoadoutModifyItemDisplay = (props: { modifyItemDimmer: LoadoutItem }) => { + const { modifyItemDimmer } = props; + return ( + + + + {modifyItemDimmer.name} + + + + + + + ); +}; + +export const LoadoutModifyDimmer = (props: { + modifyItemDimmer: LoadoutItem; + setModifyItemDimmer: (dimmer: LoadoutItem | null) => void; +}) => { + const { act } = useBackend(); + const { modifyItemDimmer, setModifyItemDimmer } = props; + return ( + + + + + + + + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/base.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/base.ts new file mode 100644 index 0000000000000..33f8cabea9cb0 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/base.ts @@ -0,0 +1,46 @@ +import { BooleanLike } from '../../../../common/react'; +import { PreferencesMenuData } from '../data'; +import { LoadoutButton } from './ModifyPanel'; + +// Generic types +export type DmIconFile = string; +export type DmIconState = string; +export type FAIcon = string; +export type typePath = string; + +type LoadoutInfoKey = string; +type LoadoutInfoValue = string; +// Info about a loadout item (key to info, such as color, reskin, layer, etc) +type LoadoutListInfo = Record | []; +// Typepath to info about the item +export type LoadoutList = Record; + +// Used for holding reskin information +export type ReskinOption = { + name: string; + tooltip: string; + skin_icon_state: DmIconState; // The icon is the same as the item icon +}; + +// Actual item passed in from the loadout +export type LoadoutItem = { + name: string; + path: typePath; + icon: DmIconFile | null; + icon_state: DmIconState | null; + buttons: LoadoutButton[]; + reskins: ReskinOption[] | null; + information: string[]; +}; + +// Category of items in the loadout +export type LoadoutCategory = { + name: string; + category_icon: FAIcon | null; + category_info: string | null; + contents: LoadoutItem[]; +}; + +export type LoadoutManagerData = PreferencesMenuData & { + job_clothes: BooleanLike; +}; diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/index.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/index.tsx new file mode 100644 index 0000000000000..211f8ed8ae5e1 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/index.tsx @@ -0,0 +1,337 @@ +import { Fragment, useState } from 'react'; + +import { useBackend } from '../../../backend'; +import { + Box, + Button, + Divider, + Icon, + Input, + NoticeBox, + Section, + Stack, + Tabs, +} from '../../../components'; +import { CharacterPreview } from '../../common/CharacterPreview'; +import { ServerData } from '../data'; +import { ServerPreferencesFetcher } from '../ServerPreferencesFetcher'; +import { + LoadoutCategory, + LoadoutItem, + LoadoutManagerData, + typePath, +} from './base'; +import { ItemIcon, LoadoutTabDisplay, SearchDisplay } from './ItemDisplay'; +import { LoadoutModifyDimmer } from './ModifyPanel'; + +export const LoadoutPage = () => { + return ( + { + if (!serverData) { + return Loading...; + } + const loadoutServerData: ServerData = serverData; + return ( + + ); + }} + /> + ); +}; + +const LoadoutPageInner = (props: { loadout_tabs: LoadoutCategory[] }) => { + const { loadout_tabs } = props; + const [searchLoadout, setSearchLoadout] = useState(''); + const [selectedTabName, setSelectedTab] = useState(loadout_tabs[0].name); + const [modifyItemDimmer, setModifyItemDimmer] = useState( + null, + ); + + return ( + + + {!!modifyItemDimmer && ( + + )} +
setSearchLoadout(value)} + placeholder="Search for an item..." + value={searchLoadout} + /> + } + > + + {loadout_tabs.map((curTab) => ( + { + setSelectedTab(curTab.name); + setSearchLoadout(''); + }} + > + + {curTab.category_icon && ( + + )} + {curTab.name} + + + ))} + +
+
+ + + +
+ ); +}; + +const LoadoutTabs = (props: { + loadout_tabs: LoadoutCategory[]; + currentTab: string; + currentSearch: string; + modifyItemDimmer: LoadoutItem | null; + setModifyItemDimmer: (dimmer: LoadoutItem | null) => void; +}) => { + const { + loadout_tabs, + currentTab, + currentSearch, + modifyItemDimmer, + setModifyItemDimmer, + } = props; + const activeCategory = loadout_tabs.find((curTab) => { + return curTab.name === currentTab; + }); + const searching = currentSearch.length > 1; + + return ( + + + + + + + + + + + + + {searching || activeCategory?.contents ? ( +
+ {activeCategory.category_info} + + ) : null + } + > + + + {searching ? ( + + ) : ( + + )} + + +
+ ) : ( +
+ No contents for selected tab. +
+ )} +
+
+ ); +}; + +const typepathToLoadoutItem = ( + typepath: typePath, + all_tabs: LoadoutCategory[], +) => { + // Maybe a bit inefficient, could be replaced with a hashmap? + for (const tab of all_tabs) { + for (const item of tab.contents) { + if (item.path === typepath) { + return item; + } + } + } + return null; +}; + +const LoadoutSelectedItem = (props: { + path: typePath; + all_tabs: LoadoutCategory[]; + modifyItemDimmer: LoadoutItem | null; + setModifyItemDimmer: (dimmer: LoadoutItem | null) => void; +}) => { + const { all_tabs, path, modifyItemDimmer, setModifyItemDimmer } = props; + const { act } = useBackend(); + + const item = typepathToLoadoutItem(path, all_tabs); + if (!item) { + return null; + } + + return ( + + + + + {item.name} + {item.buttons.length ? ( + + + + ) : ( + // empty space + )} + + + + + ); +}; + +const LoadoutSelectedSection = (props: { + all_tabs: LoadoutCategory[]; + modifyItemDimmer: LoadoutItem | null; + setModifyItemDimmer: (dimmer: LoadoutItem | null) => void; +}) => { + const { act, data } = useBackend(); + const { loadout_list } = data.character_preferences.misc; + const { all_tabs, modifyItemDimmer, setModifyItemDimmer } = props; + + return ( +
act('clear_all_items')} + > + Clear All + + } + > + {loadout_list && + Object.entries(loadout_list).map(([path, item]) => ( + + + + + ))} +
+ ); +}; + +const LoadoutPreviewSection = () => { + const { act, data } = useBackend(); + + return ( +
act('toggle_job_clothes')} + > + Job Clothes + + } + > + + + + + + + + +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/pride_pin.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/pride_pin.tsx deleted file mode 100644 index 70c6f8a8efec3..0000000000000 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/pride_pin.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { FeatureChoiced } from '../base'; -import { FeatureDropdownInput } from '../dropdowns'; - -export const pride_pin: FeatureChoiced = { - name: 'Pride Pin', - component: FeatureDropdownInput, -}; diff --git a/tools/midi2piano/README.txt b/tools/midi2piano/README.txt index 798e9ba00a71d..71582cf0f3bc4 100644 --- a/tools/midi2piano/README.txt +++ b/tools/midi2piano/README.txt @@ -29,5 +29,4 @@ Additional notes: This tool is considered final. -Made by EditorRUS/Delta Epsilon from Animus Station, ss13.ru -Contact me in Discord if you find any major issues: DeltaEpsilon#7787 \ No newline at end of file +Made by Delta Epsilon from Animus Station, ss13.ru