diff --git a/.gitignore b/.gitignore index f5801d891f966..560dbcd17317a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ #Ignore everything in datafolder and subdirectories /data/**/* /tmp/**/* +/cache/**/* #Ignore byond config folder. /cfg/**/* @@ -191,6 +192,9 @@ Temporary Items /_maps/**/backup/ /_maps/templates.dm +#dmm palette file. You really should be using StrongDMM instead. +*.dmm-pal + #dmdoc default folder /dmdoc diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm index 5c9336c5c5ca4..6f86429720ac0 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm @@ -88,7 +88,7 @@ /turf/open/floor/iron, /area/ruin/planetengi) "aA" = ( -/obj/machinery/rnd/production/protolathe/department/engineering/no_tax, +/obj/machinery/rnd/production/protolathe/department/engineering, /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 9 }, diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm index 865695e5b3327..356bed29f9fe1 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm @@ -1016,7 +1016,7 @@ /area/ruin/plasma_facility/commons) "pE" = ( /obj/structure/bed/maint, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/item/flashlight/flare/candle{ pixel_x = 12; pixel_y = 9 diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm index c2b11194dfb4c..97b4e3d53c99f 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm @@ -40,7 +40,7 @@ "fD" = ( /obj/structure/bed, /obj/effect/decal/cleanable/blood/bubblegum, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/wood, /area/ruin/powered) "gG" = ( @@ -416,7 +416,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /turf/open/floor/wood, diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm index 25f29890f45db..eb537cd26f6c6 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm @@ -63,7 +63,7 @@ "oj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /turf/open/floor/iron/grimy{ initial_gas_mix = "ICEMOON_ATMOS" }, diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm index 91ab82e4be2d2..05d5324cac034 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm @@ -113,7 +113,7 @@ /area/ruin/powered/mailroom) "kZ" = ( /obj/structure/filingcabinet/chestdrawer/wheeled, -/obj/item/valentine, +/obj/item/paper/valentine, /obj/item/grenade/c4, /obj/item/clothing/accessory/medal/conduct, /obj/item/paper/crumpled/muddy/fluff/instructions, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index 3b220a5022aed..7de6e7d990082 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -286,7 +286,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/structure/bed{ @@ -524,8 +524,8 @@ /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) "qK" = ( -/obj/structure/closet/secure_closet/bar/lavaland_bartender_clothes, /obj/machinery/light/small/directional/east, +/obj/structure/closet/secure_closet/bar/lavaland_bartender_clothes, /turf/open/floor/wood, /area/ruin/powered/beach) "qT" = ( diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm index c389af77150b2..dc6cea464f7ef 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm @@ -16,7 +16,7 @@ /area/ruin/space/djstation) "k" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/iron/grimy, /area/ruin/space/djstation) "p" = ( @@ -41,7 +41,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /turf/open/floor/iron/grimy, diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm index 8e632403b3669..52ec466ae8623 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm @@ -39,7 +39,7 @@ /turf/open/floor/iron/freezer/airless, /area/ruin/space/djstation) "x" = ( -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/plating/airless, /area/ruin/space/djstation) "A" = ( diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm index 5645ac3ef152c..2c23219b7d382 100644 --- a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm @@ -1958,7 +1958,7 @@ /area/ruin/space/has_grav/deepstorage/hydroponics) "zl" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood, /area/ruin/space/has_grav/deepstorage/dorm) @@ -2128,7 +2128,7 @@ "Ev" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /turf/open/floor/wood, /area/ruin/space/has_grav/deepstorage/dorm) "EA" = ( diff --git a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm index 9660b317c66f1..524e81ebb69cc 100644 --- a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm +++ b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm @@ -570,7 +570,7 @@ /area/ruin/space/has_grav/hellfactory) "cc" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /turf/open/floor/holofloor/wood, /area/ruin/space/has_grav/hellfactory) "cd" = ( @@ -899,7 +899,7 @@ /area/ruin/space/has_grav/hellfactoryoffice) "xK" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/holofloor/wood, /area/ruin/space/has_grav/hellfactory) diff --git a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm index f829696000951..b964addf1f6e6 100644 --- a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm +++ b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm @@ -349,7 +349,7 @@ /area/ruin/space/has_grav/powered/hilbertresearchfacility) "jt" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /turf/open/floor/carpet/black, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "jC" = ( diff --git a/_maps/RandomRuins/SpaceRuins/waystation.dmm b/_maps/RandomRuins/SpaceRuins/waystation.dmm index 9399ee029474d..def97102238e5 100644 --- a/_maps/RandomRuins/SpaceRuins/waystation.dmm +++ b/_maps/RandomRuins/SpaceRuins/waystation.dmm @@ -1143,7 +1143,7 @@ /area/ruin/space/has_grav/waystation/dorms) "rQ" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/wood, /area/ruin/space/has_grav/waystation/dorms) "rV" = ( @@ -1889,7 +1889,7 @@ /area/ruin/space/has_grav/waystation/cargobay) "IS" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/ruin/space/has_grav/waystation/dorms) diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index c6366d62e541d..7ad0b42218f51 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -2142,7 +2142,7 @@ /area/awaymission/cabin/caves) "km" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /turf/open/floor/wood, /area/awaymission/cabin/caves) "ko" = ( diff --git a/_maps/RandomZLevels/museum.dmm b/_maps/RandomZLevels/museum.dmm new file mode 100644 index 0000000000000..f40ecc09015c6 --- /dev/null +++ b/_maps/RandomZLevels/museum.dmm @@ -0,0 +1,71210 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"ab" = ( +/obj/machinery/computer/old{ + name = "replica computer"; + dir = 8; + icon_keyboard = "rd_key"; + icon_screen = "rdcomp" + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"ai" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"am" = ( +/obj/structure/table/reinforced, +/obj/structure/railing{ + dir = 9 + }, +/obj/item/storage/toolbox/mechanical/old, +/turf/open/floor/iron/smooth_corner, +/area/awaymission/museum) +"ap" = ( +/turf/cordon, +/area/awaymission/museum) +"as" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/item/stack/rods, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"at" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/item/stack/rods, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"av" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/iron, +/area/awaymission/museum) +"aw" = ( +/obj/structure/shipping_container/nanotrasen{ + opacity = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"az" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/musical_instrument, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"aG" = ( +/obj/machinery/conveyor{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"aK" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/preopen, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"aR" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/chair/sofa/bench{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"aW" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"bg" = ( +/obj/structure/no_effect_signpost{ + name = "if youre reading this you stink and also made by jimmyl" + }, +/turf/open/floor/bluespace, +/area/awaymission/museum) +"bi" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/machinery/computer/terminal/museum{ + dir = 4; + content = list("Sometime long ago, someone accidentally slipped in the design for gloves that work like batons into the basic employee craftsmanship teaching program. Naturally, this was not a good thing and all the ruffians onstation would usually have one of these. As Nanotrasen found out and removed the design, these are no longer ever seen, for nobody knows how to make them.") + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"bj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/airlock/wood{ + name = "Bathroom" + }, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/museum) +"bk" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"bn" = ( +/obj/structure/hedge/opaque, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"br" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"bs" = ( +/turf/open/misc/dirt/station, +/area/awaymission/museum/mothroachvoid) +"bt" = ( +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = 12 + }, +/obj/effect/oneway{ + dir = 4 + }, +/turf/open/mirage{ + dir = 8; + target_turf_x = 11; + range = 1 + }, +/area/awaymission/museum) +"bC" = ( +/obj/structure/closet/secure_closet/freezer/kitchen/all_access, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"bE" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"bF" = ( +/obj/effect/mapping_helpers/bombable_wall, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"bG" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/grille/broken, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"bI" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "nothing" + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"bJ" = ( +/mob/living/basic/statue/mannequin{ + dir = 8; + name = "Dale Knox" + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"bK" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"bM" = ( +/obj/item/kirbyplants/random/dead, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"bQ" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"bV" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"bW" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic/light, +/obj/effect/landmark/transport/transport_id{ + specific_transport_id = "museum_cargo" + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"ce" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 6 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"cf" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/item/storage/box/stickers/googly, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"cm" = ( +/obj/machinery/door/airlock/grunge, +/obj/structure/barricade/wooden/crude, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"cn" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"cs" = ( +/obj/effect/spawner/random/food_or_drink/snack, +/obj/effect/spawner/random/food_or_drink/snack, +/obj/effect/spawner/random/food_or_drink/snack, +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"ct" = ( +/obj/structure/chair/comfy, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"cv" = ( +/obj/effect/turf_decal/bot/left, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/museum) +"cy" = ( +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"cA" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 10 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"cB" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"cC" = ( +/turf/open/floor/mineral/silver, +/area/awaymission/museum/mothroachvoid) +"cF" = ( +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/awaymission/museum) +"cH" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/museum) +"cM" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"cN" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/item/toy/balloon/corgi, +/obj/machinery/status_display/random_message{ + firstline_to_secondline = list("NO" = "LITTERING","YOU ARE" = "BEING WATCHED", "DO NOT TOUCH" = "THE EXHIBITS"); + pixel_x = 32 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"cR" = ( +/obj/structure/broken_flooring/side/always_floorplane{ + dir = 8 + }, +/obj/structure/lattice, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"cS" = ( +/obj/effect/step_trigger/thrower{ + direction = 1; + facedir = 1; + tiles = 10; + mobs_only = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/awaymission/museum) +"cW" = ( +/obj/machinery/computer/old, +/turf/open/floor/circuit/green, +/area/awaymission/museum) +"cX" = ( +/obj/structure/plaque/static_plaque/golden/commission/dream, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"cZ" = ( +/obj/structure/fluff/divine/nexus, +/turf/open/floor/cult, +/area/awaymission/museum) +"da" = ( +/obj/effect/turf_decal/siding/dark_blue/corner, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"de" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/engine, +/area/awaymission/museum) +"dl" = ( +/obj/structure/sign/warning/fire/directional/west, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/delivery/red, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"dn" = ( +/turf/open/floor/carpet, +/area/awaymission/museum) +"do" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"dx" = ( +/obj/structure/fluff/beach_umbrella, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"dF" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/table, +/obj/effect/spawner/random/bureaucracy/paper{ + spawn_loot_count = 7; + spawn_random_offset = 6 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"dH" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/shaker, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"dK" = ( +/turf/open/mirage{ + range = 2; + target_turf_y = -4; + dir = 1 + }, +/area/awaymission/museum) +"dL" = ( +/obj/structure/sink/directional/west, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"dN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"dR" = ( +/obj/effect/turf_decal/siding/wideplating/corner{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"dS" = ( +/mob/living/basic/statue/mannequin{ + dir = 4; + held_item = /obj/item/weldingtool; + hat = /obj/item/clothing/head/utility/welding + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"dV" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + req_access = list("bartender") + }, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"dY" = ( +/mob/living/basic/statue/mannequin{ + hat = /obj/item/clothing/head/helmet/space; + dir = 1 + }, +/turf/open/floor/holofloor/hyperspace/ns, +/area/awaymission/museum) +"dZ" = ( +/obj/structure/lattice/catwalk/mining, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"ea" = ( +/obj/structure/flora/rock/icy/style_random, +/obj/effect/turf_decal/siding{ + dir = 10 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing/corner, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"ec" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "museum_secret" + }, +/obj/machinery/puzzle_keycardpad/directional/east{ + id = "museum_secret" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"eg" = ( +/obj/effect/spawner/structure/window/hollow/directional{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"ek" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "l"; + pixel_x = -10 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "i" + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "e"; + pixel_x = 12 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/engine, +/area/awaymission/museum) +"el" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"em" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron, +/area/awaymission/museum) +"en" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/stripes/red/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"es" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"ev" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"ex" = ( +/obj/structure/chair/stool/bar/directional/west{ + can_buckle = 1 + }, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"eA" = ( +/obj/machinery/door/airlock/wood{ + name = "Dance Room" + }, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"eD" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/showcase/machinery/implanter, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"eF" = ( +/obj/structure/showcase/machinery/cloning_pod, +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/engine, +/area/awaymission/museum) +"eH" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"eM" = ( +/obj/structure/statue/gold/qm{ + anchored = 1 + }, +/turf/open/misc/dirt/station, +/area/awaymission/museum/mothroachvoid) +"eN" = ( +/obj/machinery/door/poddoor/shutters/window/indestructible{ + dir = 4; + id = "nothing" + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"eO" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/spawner/random/entertainment/dice, +/obj/structure/fluff/fake_camera{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"eP" = ( +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"eQ" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"eR" = ( +/obj/structure/plaque/static_plaque/golden/commission/omega, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"eX" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 4 + }, +/turf/open/floor/holofloor/beach/coast{ + dir = 1 + }, +/area/awaymission/museum) +"fa" = ( +/obj/effect/turf_decal/sand/plating, +/mob/living/basic/statue/mannequin{ + held_item = /obj/item/pickaxe; + hat = /obj/item/clothing/suit/hooded/explorer + }, +/obj/effect/turf_decal/mining, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"fe" = ( +/turf/closed/indestructible/reinforced/titanium/nodiagonal, +/area/awaymission/museum) +"ff" = ( +/turf/open/floor/holofloor/beach/coast{ + dir = 6 + }, +/area/awaymission/museum/mothroachvoid) +"fi" = ( +/obj/structure/table/wood, +/obj/item/plate, +/obj/item/kitchen/fork, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"fn" = ( +/turf/open/floor/holofloor/hyperspace/ns, +/area/awaymission/museum) +"fo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/engine, +/area/awaymission/museum) +"fu" = ( +/obj/item/banhammer{ + force = -200 + }, +/turf/open/floor/bluespace, +/area/awaymission/museum) +"fy" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"fz" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/plate/large, +/obj/item/food/little_hawaii_hotdog, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"fC" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/table/wood, +/obj/item/language_manual/roundstart_species, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"fJ" = ( +/obj/structure/fluff/fake_camera{ + dir = 10 + }, +/turf/open/misc/beach/coast{ + dir = 1 + }, +/area/awaymission/museum) +"fK" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/painting{ + pixel_y = 32; + persistence_id = "museumgate" + }, +/obj/machinery/light/floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"fT" = ( +/obj/structure/broken_flooring/corner/always_floorplane{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"fW" = ( +/obj/machinery/light/warm/directional/north, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"gf" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"gj" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"gm" = ( +/obj/structure/statue/gold/cmo{ + anchored = 1 + }, +/turf/open/floor/mineral/diamond, +/area/awaymission/museum/mothroachvoid) +"go" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"gu" = ( +/obj/structure/flora/tree/palm/style_random, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"gA" = ( +/obj/structure/toilet{ + dir = 1 + }, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/museum) +"gB" = ( +/obj/structure/table/wood, +/obj/item/knife, +/obj/item/kitchen/rollingpin, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"gC" = ( +/obj/machinery/conveyor{ + dir = 8 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"gG" = ( +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"gJ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 8 + }, +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"gM" = ( +/turf/open/floor/wood/large, +/area/awaymission/museum) +"gN" = ( +/obj/structure/lattice/catwalk/mining, +/obj/item/stack/rods/ten, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"gQ" = ( +/turf/open/mirage{ + target_turf_y = 14 + }, +/area/awaymission/museum) +"gR" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/eight, +/obj/effect/spawner/random/maintenance/eight, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"gT" = ( +/obj/machinery/door/window/left/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"gW" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"hb" = ( +/turf/open/misc/beach/coast{ + dir = 9 + }, +/area/awaymission/museum/mothroachvoid) +"hi" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"hj" = ( +/obj/structure/lattice/catwalk/mining, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"hk" = ( +/obj/effect/smooths_with_walls, +/turf/open/mirage{ + target_turf_y = -29; + dir = 1 + }, +/area/awaymission/museum) +"hl" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "gateway_waste" + }, +/obj/machinery/conveyor{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"hp" = ( +/mob/living/basic/mothroach/bar, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"ht" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"hw" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"hA" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair/sofa/bench{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"hC" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/computer/terminal/museum{ + dir = 4; + content = list("2005 - By the early 2000s, Nanotrasen had long observed the computer gaming industry since its inception during the 1980s, and in 2005 would finally make their own entry into the market via the Nanoplay: the world’s first game console with built-in internet connectivity capabilities, bringing the gamers of the world together.") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"hE" = ( +/obj/machinery/light/floor, +/turf/open/floor/holofloor/hyperspace/ns, +/area/awaymission/museum) +"hM" = ( +/turf/closed/wall/rock/porous, +/area/awaymission/museum) +"hT" = ( +/mob/living/basic/statue/mannequin{ + dir = 8; + name = "Dale Knox"; + held_item = /obj/item/circuitboard + }, +/obj/structure/sign/flag/nanotrasen/directional/south, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"hV" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"hX" = ( +/obj/item/circuitboard{ + icon_state = "flopdrive"; + name = "microprocessor" + }, +/obj/structure/table/reinforced, +/turf/open/floor/circuit/green, +/area/awaymission/museum) +"hY" = ( +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 6 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"il" = ( +/obj/structure/table/wood, +/obj/item/clothing/suit/costume/judgerobe, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"im" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"ix" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "l"; + pixel_x = -10 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "i" + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "e"; + pixel_x = 12 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/museum) +"iz" = ( +/obj/machinery/door/airlock/shuttle/glass, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 5 + }, +/turf/open/floor/mineral/plastitanium, +/area/awaymission/museum) +"iB" = ( +/obj/effect/spawner/random/engineering/canister, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/singular/always_floorplane, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"iD" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/iron, +/area/awaymission/museum) +"iE" = ( +/obj/structure/fluff/wallsign/directional/west{ + name = "History of Nanotrasen" + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"iF" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/machinery/button{ + pixel_y = 32 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"iI" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/painting{ + pixel_y = 32; + persistence_id = "museumgate" + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"iK" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/tram/plate, +/area/awaymission/museum) +"iN" = ( +/mob/living/basic/mothroach, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/awaymission/museum) +"iT" = ( +/obj/machinery/door/airlock/engineering, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/airlock/access/all/away/generic3, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"iU" = ( +/obj/machinery/telecomms/relay/preset/auto, +/turf/open/floor/bluespace, +/area/awaymission/museum) +"iV" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/table, +/obj/item/binoculars, +/obj/item/clothing/mask/whistle, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"iW" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"iZ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/effect/step_trigger/thrower{ + direction = 1; + facedir = 1; + tiles = 10; + mobs_only = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"jf" = ( +/mob/living/basic/mothroach, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"jm" = ( +/mob/living/basic/mothroach, +/turf/open/misc/dirt/station, +/area/awaymission/museum/mothroachvoid) +"jn" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/museum) +"jo" = ( +/obj/effect/spawner/structure/window/hollow/directional{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"jt" = ( +/obj/structure/fluff/divine/conduit, +/obj/structure/railing{ + dir = 9 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/cult, +/area/awaymission/museum) +"jy" = ( +/mob/living/basic/statue/mannequin{ + dir = 8; + name = "Dale Knox"; + held_item = /obj/item/circuitboard + }, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/circuit/green, +/area/awaymission/museum) +"jB" = ( +/obj/effect/spawner/structure/window, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"jF" = ( +/obj/machinery/suit_storage_unit/open, +/obj/effect/turf_decal/box, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/museum) +"jG" = ( +/turf/open/floor/carpet/cyan, +/area/awaymission/museum/mothroachvoid) +"jH" = ( +/obj/structure/fake_stairs/directional/west, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"jI" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/awaymission/museum) +"jL" = ( +/obj/structure/sink/kitchen/directional/west, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"jN" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"jP" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 8 + }, +/obj/structure/table, +/obj/structure/fluff/fake_camera{ + dir = 9 + }, +/obj/item/reagent_containers/cup/glass/coffee, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"jU" = ( +/obj/effect/landmark/transport/nav_beacon/tram/platform{ + specific_transport_id = "museum_cargo"; + platform_code = 2; + name = "Exhibit Loading Bay" + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"jV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"jW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/integrated_circuit/loaded/hello_world, +/turf/open/floor/iron, +/area/awaymission/museum) +"kd" = ( +/mob/living/basic/mothroach, +/obj/structure/chair/comfy{ + dir = 1 + }, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"ke" = ( +/obj/structure/statue/gold/hos{ + anchored = 1 + }, +/turf/open/floor/mineral/diamond, +/area/awaymission/museum/mothroachvoid) +"kg" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/effect/spawner/random/structure/crate, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"kh" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"kq" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"kr" = ( +/obj/structure/table/wood, +/obj/structure/window/spawner/directional/west, +/obj/item/storage/box/fireworks, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"kw" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"kA" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/item/vending_refill/wardrobe/coroner_wardrobe, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"kO" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"kQ" = ( +/obj/structure/fluff/meteor, +/turf/open/floor/holofloor/hyperspace/ns, +/area/awaymission/museum) +"kX" = ( +/obj/structure/girder/displaced, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/awaymission/museum) +"kY" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/random/entertainment/money_medium, +/obj/effect/spawner/random/entertainment/money_medium, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"la" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"lb" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"lf" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"lg" = ( +/mob/living/basic/mothroach, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/carpet/executive, +/area/awaymission/museum) +"lh" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/structure/railing, +/turf/open/floor/catwalk_floor, +/area/awaymission/museum) +"lk" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 4 + }, +/turf/open/floor/holofloor/beach/coast, +/area/awaymission/museum) +"ll" = ( +/obj/structure/plasticflaps/opaque, +/obj/machinery/conveyor{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"ls" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/computer/arcade/amputation{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"lz" = ( +/obj/effect/landmark/awaystart, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/awaymission/museum) +"lB" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/tram/plate, +/area/awaymission/museum) +"lC" = ( +/obj/structure/table, +/obj/item/cigbutt/cigarbutt, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"lG" = ( +/mob/living/basic/mothroach, +/obj/item/clothing/shoes/sandal/beach, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"lH" = ( +/obj/structure/plaque/static_plaque/golden/commission/uterus, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"lI" = ( +/obj/effect/smooths_with_walls, +/turf/open/mirage{ + target_turf_y = 29 + }, +/area/awaymission/museum) +"lM" = ( +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"lS" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/clothing/beret_or_rabbitears, +/turf/open/floor/iron, +/area/awaymission/museum) +"lT" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/mob/living/basic/statue/mannequin{ + hat = /obj/item/clothing/suit/toggle/labcoat/science; + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"lU" = ( +/obj/structure/plasticflaps, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"lV" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic/light, +/obj/effect/landmark/transport/nav_beacon/tram/nav{ + specific_transport_id = "museum_cargo" + }, +/obj/effect/landmark/transport/nav_beacon/tram/platform{ + specific_transport_id = "museum_cargo"; + platform_code = 1; + name = "Internal Loading Bay" + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"lZ" = ( +/obj/structure/plaque/static_plaque/golden/commission/cere, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"mg" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/item/reagent_containers/cup/soda_cans/air, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"mj" = ( +/turf/open/mirage{ + range = 2; + target_turf_y = 4 + }, +/area/awaymission/museum) +"ml" = ( +/obj/structure/table/wood, +/obj/item/food/hotcrossbun, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"mn" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"mA" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/holofloor/beach/water, +/area/awaymission/museum) +"mC" = ( +/obj/structure/fluff/beach_umbrella, +/turf/open/floor/carpet/cyan, +/area/awaymission/museum/mothroachvoid) +"mK" = ( +/obj/structure/window/spawner/directional/south, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/awaymission/museum) +"mN" = ( +/obj/structure/statue/sandstone/assistant, +/obj/effect/turf_decal/tile/green/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/museum) +"mQ" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/grass, +/area/awaymission/museum) +"mS" = ( +/mob/living/basic/statue/mannequin{ + held_item = /obj/item/wrench; + hat = /obj/item/clothing/head/utility/hardhat; + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/iron, +/area/awaymission/museum) +"mV" = ( +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"mX" = ( +/obj/machinery/computer/arcade/battle{ + dir = 4 + }, +/obj/effect/turf_decal/siding/red, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"mZ" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/door/airlock/freezer{ + req_access = list("bartender") + }, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"nb" = ( +/turf/open/misc/beach/coast/corner, +/area/awaymission/museum/mothroachvoid) +"nc" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/tram, +/obj/machinery/transport/tram_controller{ + configured_transport_id = "museum_cargo"; + cover_locked = 0 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"ne" = ( +/obj/structure/fluff/preserved_borer, +/turf/open/floor/carpet, +/area/awaymission/museum) +"nh" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"nl" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"nq" = ( +/obj/structure/table/wood, +/obj/item/paper/fluff/jobs/security/court_judgement, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"nr" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/museum) +"ns" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"nu" = ( +/obj/effect/decal/cleanable/glass/titanium, +/mob/living/basic/mouse/rat, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"nv" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 5 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"nw" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/machinery/computer/terminal/museum{ + dir = 8; + content = list("The so-called Hands Of God, loyal devotees of some illegal eldritch force. Their effect on the world weakened and crumbled as Nanotrasen loyal employees destroyed these so called Gods. Remember, only follow the faith of the chaplain and his regulated religions!") + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"nx" = ( +/obj/structure/chair/plastic{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"nz" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/fluff{ + icon = 'icons/mob/simple/hivebot.dmi'; + icon_state = "fab_robot"; + name = "old plasma extractor" + }, +/turf/open/lava/plasma/mafia, +/area/awaymission/museum) +"nC" = ( +/obj/structure/railing, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/carpet, +/area/awaymission/museum) +"nD" = ( +/obj/structure/plaque/static_plaque/golden/commission/efficiency, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"nE" = ( +/obj/machinery/light/warm/dim/directional/north, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/museum) +"nF" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/step_trigger/thrower{ + direction = 1; + facedir = 1; + tiles = 10; + mobs_only = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"nH" = ( +/obj/structure/fluff/minepost, +/obj/effect/turf_decal/siding{ + dir = 5 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"nJ" = ( +/obj/structure/fluff/divine/convertaltar, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/cult, +/area/awaymission/museum) +"nQ" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/awaymission/museum) +"nS" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"nT" = ( +/obj/effect/mapping_helpers/bombable_wall, +/turf/closed/indestructible/fakedoor/maintenance, +/area/awaymission/museum) +"nW" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"od" = ( +/obj/structure/fluff/fake_vent, +/turf/open/floor/iron, +/area/awaymission/museum) +"oe" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 1 + }, +/obj/structure/table, +/obj/item/food/sandwich/cheese/grilled, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"of" = ( +/obj/effect/puzzle_poddoor_open{ + icon = 'icons/effects/mapping_helpers.dmi'; + id = "museum_secret"; + queue_id = "museum_secret" + }, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"oo" = ( +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"os" = ( +/obj/item/toy/beach_ball/branded, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"ot" = ( +/obj/structure/grille, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"ow" = ( +/obj/structure/girder/displaced, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"ox" = ( +/obj/machinery/computer/terminal/museum{ + dir = 8; + content = list("1998 - Dale Knox, the cofounder of Nanotrasen, would leave for health reasons.") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"oA" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 4 + }, +/turf/open/floor/holofloor/beach/water, +/area/awaymission/museum) +"oC" = ( +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"oI" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/awaymission/museum) +"oQ" = ( +/turf/open/floor/holofloor/beach/coast{ + dir = 1 + }, +/area/awaymission/museum) +"oZ" = ( +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"pb" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/poster/official/pda_ad/directional/south, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"pc" = ( +/turf/open/floor/iron/dark/side{ + dir = 6 + }, +/area/awaymission/museum) +"pf" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/gibs/body, +/turf/open/floor/iron, +/area/awaymission/museum) +"pg" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 6 + }, +/obj/structure/hedge/opaque, +/turf/open/floor/iron, +/area/awaymission/museum) +"pi" = ( +/mob/living/basic/statue/mannequin{ + hat = /obj/item/clothing/head/costume/nursehat; + held_item = /obj/item/clothing/neck/stethoscope + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"pp" = ( +/obj/structure/chair/stool/bar/directional/north, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"pt" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/awaymission/museum) +"pv" = ( +/obj/machinery/computer/terminal/museum{ + dir = 4; + content = list("Nanotrasen used to have much more volatile welding fuel mixtures because it was cheap. This backfired when a review revealed that infiltrators would use the fuel tanks to destroy bodies of their victims, leading to Nanotrasen developing a less unstable mixture months later.") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"pw" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"pD" = ( +/obj/structure/broken_flooring/corner/always_floorplane/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/crate_loot, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"pF" = ( +/obj/structure/hedge/opaque, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"pI" = ( +/obj/machinery/suit_storage_unit/open, +/obj/machinery/light/small/dim/directional/east, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/museum) +"pL" = ( +/obj/item/clothing/suit/costume/bronze, +/turf/open/floor/bronze, +/area/awaymission/museum) +"pM" = ( +/obj/effect/spawner/random/engineering/canister, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/singular/always_floorplane{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"pX" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/two, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/grenade/iedcasing/spawned, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"pY" = ( +/obj/item/pickaxe/drill/diamonddrill, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"qj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/awaymission/museum) +"qo" = ( +/obj/effect/oneway{ + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/museum/mothroachvoid) +"qp" = ( +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"qt" = ( +/obj/effect/spawner/random/food_or_drink/booze{ + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); + spawn_random_offset = 2 + }, +/turf/open/floor/carpet/cyan, +/area/awaymission/museum/mothroachvoid) +"qw" = ( +/obj/item/flashlight/flare{ + start_on = 1; + icon_state = "flare-on" + }, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"qx" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"qA" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"qJ" = ( +/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/engine, +/area/awaymission/museum) +"qL" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"qM" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"qP" = ( +/obj/structure/plaque/static_plaque/golden/commission/pubby, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"qQ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"qR" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 4 + }, +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"qS" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"qU" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/turf_decal/delivery/red, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"qX" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/fluff/fake_camera, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"qY" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 4; + opacity = 1 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"rc" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/girder/displaced, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"re" = ( +/turf/cordon/secret, +/area/awaymission/museum) +"rm" = ( +/turf/open/indestructible/plating, +/area/awaymission/museum) +"ro" = ( +/obj/structure/railing, +/turf/open/floor/holofloor/asteroid{ + icon_state = "asteroid3" + }, +/area/awaymission/museum) +"rp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/carpet/executive, +/area/awaymission/museum) +"rq" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/gibspawner/human, +/obj/effect/gibspawner/human, +/obj/effect/gibspawner/human, +/obj/effect/gibspawner/human, +/mob/living/basic/statue/mannequin/suspicious, +/turf/open/floor/iron, +/area/awaymission/museum) +"rr" = ( +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"rA" = ( +/obj/structure/chair/comfy/beige{ + dir = 8 + }, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"rB" = ( +/obj/structure/lattice/catwalk/mining, +/obj/machinery/light/floor, +/turf/open/chasm, +/area/awaymission/museum) +"rJ" = ( +/obj/structure/broken_flooring/side/always_floorplane{ + dir = 2 + }, +/obj/structure/lattice, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"rL" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/holosign/barrier/engineering, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"rO" = ( +/obj/effect/spawner/random/trash/mess, +/obj/effect/turf_decal/siding/red, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"rP" = ( +/obj/item/clothing/mask/gas/clown_hat, +/turf/open/floor/iron, +/area/awaymission/museum) +"rQ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/railing/corner/end, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"rU" = ( +/mob/living/basic/statue/mannequin{ + dir = 4; + held_item = /obj/item/wrench; + name = "Michael Trasen" + }, +/obj/structure/sign/flag/nanotrasen/directional/south, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"rW" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/dark_blue, +/obj/effect/spawner/random/entertainment/toy_figure, +/obj/effect/spawner/random/entertainment/toy_figure, +/obj/structure/desk_bell, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"rX" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/engine, +/area/awaymission/museum) +"rY" = ( +/obj/machinery/light/small/broken/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/basic/mouse/rat, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"sd" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair/office, +/turf/open/floor/iron, +/area/awaymission/museum) +"sh" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/iron, +/area/awaymission/museum) +"sj" = ( +/mob/living/basic/statue{ + sentience_type = 2 + }, +/turf/open/floor/black, +/area/awaymission/museum) +"sm" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/museum) +"sp" = ( +/obj/machinery/door/window/left/directional/west, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"sq" = ( +/obj/structure/plaque/static_plaque/golden/commission/delta, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"st" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"sy" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_camera, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"sz" = ( +/obj/effect/decal/cleanable/glass/titanium, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"sA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/gift{ + contains_type = /mob/living/basic/pet/cat/feral + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"sC" = ( +/obj/item/toy/figure/dsquad, +/obj/item/toy/figure/dsquad{ + pixel_x = -9 + }, +/obj/item/toy/figure/dsquad{ + pixel_x = 9 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/holofloor/beach/coast, +/area/awaymission/museum) +"sD" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"sE" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "museum_secret" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"sG" = ( +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron, +/area/awaymission/museum) +"sN" = ( +/obj/effect/mine/explosive, +/obj/item/food/cake/berry_chocolate_cake, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/museum) +"sX" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/machinery/light/warm/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"tc" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/chair, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"tf" = ( +/obj/item/instrument/musicalmoth, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"th" = ( +/obj/structure/flora/rock/icy/style_random, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"tj" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/mob/living/basic/statue/mannequin{ + dir = 1; + hat = /obj/item/clothing/head/utility/hardhat; + held_item = /obj/item/wrench + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"tk" = ( +/obj/structure/plaque/static_plaque/golden/commission/northstar, +/turf/open/floor/mineral/gold, +/area/awaymission/museum) +"tl" = ( +/obj/item/food/cake/mothmallow, +/obj/structure/table, +/turf/open/floor/carpet/executive, +/area/awaymission/museum) +"tq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"ts" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"tt" = ( +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"tv" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/structure/railing, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"tx" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/booze{ + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); + spawn_random_offset = 2 + }, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"ty" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow{ + siemens_coefficient = 10; + name = "fake stungloves"; + desc = "A crude replica of stungloves. Essentially gloves wrapped with wire. Extremely unsafe." + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/awaymission/museum) +"tB" = ( +/obj/effect/turf_decal/siding/thinplating_new, +/turf/open/chasm, +/area/awaymission/museum) +"tC" = ( +/obj/structure/sign/departments/lawyer/directional/south, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"tD" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"tG" = ( +/obj/structure/barricade/wooden/crude, +/turf/closed/indestructible/fakedoor, +/area/awaymission/museum) +"tI" = ( +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/holofloor/asteroid{ + icon_state = "asteroid5" + }, +/area/awaymission/museum) +"tK" = ( +/obj/structure/sign/warning, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"tM" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/contraband/cannabis, +/obj/effect/spawner/random/contraband/cannabis, +/obj/effect/spawner/random/contraband/cannabis, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"tN" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/tram/plate, +/area/awaymission/museum) +"tS" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/closet/crate/bin, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"tU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"uc" = ( +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/awaymission/museum) +"ud" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"ue" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/light/small/dim/directional/north, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"uf" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"ul" = ( +/obj/effect/oneway{ + dir = 8 + }, +/turf/open/floor/holofloor/beach/coast{ + dir = 2 + }, +/area/awaymission/museum/mothroachvoid) +"up" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/door/airlock/wood{ + name = "Bathroom" + }, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/museum) +"uu" = ( +/obj/structure/rack, +/obj/effect/spawner/random/engineering/material, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"uE" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"uM" = ( +/obj/structure/fluff/fake_camera{ + dir = 10 + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"uN" = ( +/turf/open/floor/grass, +/area/awaymission/museum) +"uR" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/east, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"uT" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle/indestructible, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"uY" = ( +/turf/open/floor/iron, +/area/awaymission/museum) +"vb" = ( +/obj/structure/grille/indestructible, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"vc" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/painting/large{ + persistence_id = "museumgate_big"; + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"ve" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/holosign/barrier/engineering, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"vg" = ( +/obj/structure/puzzle_blockade/oneway{ + dir = 8 + }, +/obj/structure/broken_flooring/side/always_floorplane/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"vh" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/item/reagent_containers/cup/soda_cans/sol_dry, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"vj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/phone, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"vp" = ( +/obj/structure/girder/displaced, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"vs" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/holosign/barrier/engineering, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"vw" = ( +/obj/structure/window/bronze/spawner/directional/south, +/obj/structure/window/bronze/spawner/directional/west, +/obj/structure/window/bronze/spawner/directional/north, +/obj/structure/grille, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"vx" = ( +/obj/structure/sign/poster/random/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"vy" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"vC" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/chair/plastic, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"vE" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 5 + }, +/obj/structure/filingcabinet, +/turf/open/floor/iron, +/area/awaymission/museum) +"vM" = ( +/mob/living/basic/statue/mannequin{ + dir = 1; + hat = /obj/item/clothing/suit/costume/bronze + }, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/bronze, +/area/awaymission/museum) +"vO" = ( +/turf/open/floor/iron/stairs/left{ + dir = 4 + }, +/area/awaymission/museum) +"vU" = ( +/obj/machinery/door/airlock/wood{ + name = "Dance Room" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"vZ" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/toy, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"wh" = ( +/obj/structure/broken_flooring/corner/always_floorplane/directional/west, +/obj/structure/lattice, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"wi" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + dir = 8; + id = "nothing" + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"wk" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"wy" = ( +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"wA" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"wC" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/museum) +"wE" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 6 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"wG" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/structure/broken_flooring/corner/always_floorplane{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"wH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/floor/iron, +/area/awaymission/museum) +"wI" = ( +/obj/structure/window/spawner/directional/north, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/awaymission/museum) +"wJ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/fluff/dnamod, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"wL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/awaymission/museum) +"wN" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/painting/large{ + persistence_id = "museumgate_big"; + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"wO" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"wZ" = ( +/turf/open/misc/beach/coast{ + dir = 1 + }, +/area/awaymission/museum/mothroachvoid) +"xb" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"xc" = ( +/obj/structure/falsewall/reinforced, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"xd" = ( +/obj/structure/table/reinforced, +/obj/structure/window/spawner/directional/west, +/obj/effect/spawner/random/bureaucracy/paper{ + spawn_random_offset = 7; + spawn_loot_count = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"xf" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"xg" = ( +/obj/structure/table/reinforced, +/obj/item/circuitboard{ + icon_state = "bluespacearray"; + name = "fancy replica tech" + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"xj" = ( +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/turf/open/floor/holofloor/asteroid{ + icon_state = "asteroid3" + }, +/area/awaymission/museum) +"xm" = ( +/turf/open/floor/holofloor/beach/coast{ + dir = 2 + }, +/area/awaymission/museum/mothroachvoid) +"xn" = ( +/obj/effect/oneway{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"xr" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/freezer/food, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"xt" = ( +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"xu" = ( +/turf/closed/indestructible/rock, +/area/awaymission/museum/mothroachvoid) +"xv" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"xx" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"xB" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/flashlight/lamp{ + start_on = 0 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"xD" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/fluff/balloon_nuke, +/turf/open/floor/holofloor/beach, +/area/awaymission/museum) +"xE" = ( +/turf/open/floor/mineral/gold, +/area/awaymission/museum/mothroachvoid) +"xF" = ( +/mob/living/basic/statue/mannequin{ + dir = 1; + held_item = /obj/item/weldingtool + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/awaymission/museum) +"xI" = ( +/turf/open/floor/iron/white, +/area/awaymission/museum) +"xJ" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/computer/terminal/museum{ + dir = 1; + content = list("1995 - By the early 90s, as computers became smaller and technology more compact, Trasen-Knox saw the need to create more of a recognisable brand. They would officially change their name to Nanotrasen in 1995, and the name would stick for the company.") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"xP" = ( +/obj/structure/closet/crate/cardboard, +/obj/item/storage/toolbox/artistic, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"xR" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"xT" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/storage/box/party_poppers, +/obj/structure/table/wood, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"ya" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/plate, +/obj/item/food/kebab/fiesta, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"yf" = ( +/obj/structure/lattice/catwalk/mining, +/obj/machinery/light/small/directional/north, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"yi" = ( +/obj/structure/chair/comfy/beige{ + dir = 1 + }, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"yl" = ( +/turf/open/lava/plasma/mafia, +/area/awaymission/museum) +"yn" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"yo" = ( +/obj/machinery/conveyor/inverted{ + dir = 10 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"yq" = ( +/obj/structure/fluff/meteor/large, +/turf/open/floor/holofloor/hyperspace/ns, +/area/awaymission/museum) +"yr" = ( +/obj/structure/chair/comfy, +/obj/effect/mapping_helpers/mob_buckler, +/mob/living/basic/mothroach, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"yu" = ( +/turf/open/floor/catwalk_floor/iron_dark, +/area/awaymission/museum) +"yw" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/table, +/obj/item/flashlight/lamp, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"yx" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"yA" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"yE" = ( +/obj/item/pickaxe/diamond, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"yF" = ( +/obj/machinery/light/small/broken/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"yG" = ( +/obj/structure/lattice/catwalk/mining, +/obj/machinery/button/door/directional/east{ + id = "gateway_waste" + }, +/obj/structure/railing, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"yK" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/structure/fluff/fokoff_sign, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"yM" = ( +/obj/machinery/door/poddoor{ + id = "gatewayfake" + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"yN" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/computer/terminal/museum{ + dir = 8; + content = list("Galaxywise Shipyards (Field: General Aerospace) - Much of Nanotrasen's strength as a megacorporation comes from their ability to practice what is essentially autarky- the production of all required goods from raw material to finalised item, with little to no reliance on external companies or factors. To this end, Galaxywise is critical to Nanotrasen's practice of autarky- from their orbital shipyards above Adasta, Nanotrasen is able to produce a wide range of important vessels, from small single-man scouting vessels to large-scale freighters and everything inbetween. Unfortunately for Nanotrasen, however, their autarky chain is broken by limitations imposed by TerraGov stating that only licensed corporations are capable of producing heavily armed vessels (the Merchant Marine Act states that any vessel capable of bearing armaments in excess of Class 2, the highest legal civilian grade, may be produced by licensed companies only)- a license Galaxywise has been unable to secure due to politicking by corporate rivals at the senate. ") + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"yS" = ( +/turf/closed/wall/space, +/area/awaymission/museum) +"zc" = ( +/obj/structure/railing, +/obj/effect/turf_decal/stripes, +/obj/structure/fluff/fake_camera{ + dir = 8 + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"zd" = ( +/obj/effect/landmark/awaystart, +/turf/open/floor/grass, +/area/awaymission/museum) +"zg" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"zh" = ( +/obj/machinery/conveyor{ + dir = 9 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"zr" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"zz" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/girder/bronze, +/turf/open/floor/bronze/flat, +/area/awaymission/museum) +"zA" = ( +/obj/effect/mapping_helpers/ztrait_injector/museum, +/turf/open/floor/bluespace, +/area/awaymission/museum) +"zC" = ( +/obj/machinery/vending/boozeomat/all_access, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"zE" = ( +/turf/closed/indestructible/rock, +/area/awaymission/museum) +"zG" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/siding/red, +/mob/living/basic/statue/mannequin{ + dir = 8; + hat = /obj/item/clothing/head/fedora + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"zI" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/window/bronze/spawner/directional/north, +/obj/machinery/computer/terminal/museum{ + pixel_y = -6; + content = list("Ratvar was once a powerful entity competing with the likes of Nar-Sie. It resided on a plane known as “Reebee” or the “City of cogs.” Supposedly, it was a clockwork city made of brass in which its cultists could enter once they had realized its power. However, this plane was also Ratvar’s prison from which it yearned to escape. While Reebee is gone, it is assumed that other structures such as temples or engines of the cult's creation still exist although it is unknown if they still have the power once bestowed to them by Ratvar. The fall of Reebe was an event in which Reebe, Ratvar, and all of its cultists were struck down by Nanotrasen. The cult was preparing Reebe for the freeing of Ratvar where the Veil was weak. Outpost 17, a small nanotrasen asteroid mining station was the target. Brave crewmembers managed to slip through the cracks in the veil and into the heart of Reebe with a bluespace artillery beacon in tow. With a desperate plea being sent out to a nearby security outpost, Reebe was obliterated along with the crewmembers of Outpost 17.") + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"zK" = ( +/obj/machinery/computer/arcade/battle{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"zL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/stamp/denied{ + pixel_y = 12 + }, +/obj/item/stamp/granted{ + pixel_y = 12; + pixel_x = 8 + }, +/obj/effect/spawner/random/bureaucracy/paper{ + spawn_random_offset = 12; + spawn_scatter_radius = 1; + spawn_loot_count = 8 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"zM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/tracks, +/obj/structure/broken_flooring/side/always_floorplane{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"zR" = ( +/obj/structure/statue/gold/hop{ + anchored = 1 + }, +/turf/open/floor/mineral/diamond, +/area/awaymission/museum/mothroachvoid) +"zU" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/generic, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"zX" = ( +/obj/machinery/door/poddoor/shutters/preopen, +/turf/open/floor/iron, +/area/awaymission/museum) +"zY" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/machinery/light/warm/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Ab" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/glass/titanium, +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/fluff/fake_vent, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"Ag" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"Ah" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/tram/alt/titanium, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Ai" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/obj/machinery/door/window/elevator/left/directional/south{ + transport_linked_id = "museum_cargo" + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Ak" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Am" = ( +/obj/structure/window/spawner/directional/west, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/awaymission/museum) +"Aq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/engine, +/area/awaymission/museum) +"Ar" = ( +/turf/open/water/beach, +/area/awaymission/museum/mothroachvoid) +"As" = ( +/mob/living/basic/statue/mannequin{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow, +/obj/effect/turf_decal/trimline/yellow/corner, +/obj/machinery/conveyor{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"At" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/grass, +/area/awaymission/museum) +"Ay" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"AC" = ( +/obj/machinery/door/airlock/shuttle/glass, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 9 + }, +/turf/open/floor/mineral/plastitanium, +/area/awaymission/museum) +"AE" = ( +/obj/structure/fluff/divine/powerpylon, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/cult, +/area/awaymission/museum) +"AG" = ( +/obj/machinery/oven, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"AI" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/machinery/light/small/dim/directional/east, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"AM" = ( +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = -30 + }, +/turf/open/mirage{ + target_turf_y = -29; + dir = 1 + }, +/area/awaymission/museum) +"AP" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"AR" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/grille/broken, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"AS" = ( +/obj/effect/smooths_with_walls, +/turf/open/mirage{ + dir = 1; + target_turf_x = -9 + }, +/area/awaymission/museum) +"AY" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/door/airlock/grunge{ + name = "Souvenir Shop" + }, +/obj/effect/turf_decal/siding/green, +/obj/effect/mapping_helpers/airlock/access/all/away/generic3, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"AZ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/machinery/light/warm/directional/south, +/obj/structure/closet/crate/bin, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Be" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Bj" = ( +/obj/structure/closet/lawcloset, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Bo" = ( +/obj/machinery/jukebox, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Bq" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Bu" = ( +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"BF" = ( +/turf/open/misc/beach/coast{ + dir = 6 + }, +/area/awaymission/museum/mothroachvoid) +"BK" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"BO" = ( +/obj/structure/sign/poster/random/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"BQ" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"BX" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Cb" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/obj/effect/spawner/random/maintenance/no_decals/five, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Cc" = ( +/obj/structure/hedge/opaque, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Cd" = ( +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = 14 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Cf" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 4 + }, +/obj/structure/table, +/obj/effect/spawner/random/bureaucracy/crayon{ + spawn_loot_count = 5; + spawn_random_offset = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Ci" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/clothing/mask/party_horn, +/obj/item/clothing/mask/party_horn, +/obj/structure/table/wood, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Cj" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Co" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/chair/sofa/bench{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Cq" = ( +/obj/structure/statue/gold/rd{ + anchored = 1 + }, +/turf/open/floor/mineral/diamond, +/area/awaymission/museum/mothroachvoid) +"Cu" = ( +/turf/open/misc/beach/coast{ + dir = 10 + }, +/area/awaymission/museum/mothroachvoid) +"Cy" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/booze{ + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); + spawn_random_offset = 2; + spawn_loot_count = 2 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"CB" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"CC" = ( +/obj/effect/turf_decal/siding/wideplating, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"CD" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/fluff/wallsign/directional/west{ + name = "Exit"; + dir = 2 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"CF" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "nothing" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"CI" = ( +/obj/effect/turf_decal/caution, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"CK" = ( +/obj/item/bedsheet/medical, +/obj/structure/bed, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"CL" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/carpet/executive, +/area/awaymission/museum) +"CT" = ( +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/awaymission/museum) +"CV" = ( +/obj/structure/sink/directional/south, +/obj/structure/mirror/directional/north{ + pixel_y = 32 + }, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/museum) +"CW" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/fluff/fake_camera{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"De" = ( +/obj/effect/oneway{ + dir = 8 + }, +/turf/open/misc/beach/coast{ + dir = 1 + }, +/area/awaymission/museum/mothroachvoid) +"Dk" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/engine, +/area/awaymission/museum) +"Dl" = ( +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/awaymission/museum/mothroachvoid) +"Dr" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_scrubber, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"Du" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/insectguts, +/obj/structure/closet/crate/preopen, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Dx" = ( +/obj/effect/mine/sound, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"DA" = ( +/obj/machinery/light/small/directional/west, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"DD" = ( +/turf/open/floor/bluespace, +/area/awaymission/museum) +"DE" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/fluff/fake_camera{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"DI" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner, +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"DL" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"DS" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/structure/girder, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"DT" = ( +/obj/structure/broken_flooring/side/always_floorplane/directional/south, +/turf/open/floor/black, +/area/awaymission/museum) +"DU" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"DV" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 9 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"DY" = ( +/turf/closed/indestructible/reinforced/titanium, +/area/awaymission/museum) +"Ea" = ( +/obj/machinery/light/small/broken/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Ec" = ( +/mob/living/basic/mothroach, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/awaymission/museum) +"Ef" = ( +/obj/machinery/computer/old{ + name = "replica computer"; + dir = 4; + icon_keyboard = "rd_key"; + icon_screen = "rdcomp" + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"Ek" = ( +/obj/structure/table/wood, +/obj/structure/window/spawner/directional/east, +/obj/item/plate, +/obj/item/kitchen/fork, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"El" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4 + }, +/obj/structure/fluff/wallsign/directional/south{ + dir = 4; + name = "Oddities" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Eo" = ( +/mob/living/basic/statue/mannequin{ + held_item = /obj/item/wrench; + hat = /obj/item/clothing/head/utility/hardhat + }, +/obj/machinery/light/directional/north, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Er" = ( +/obj/structure/chair/comfy/beige, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"EA" = ( +/obj/machinery/door/airlock/shuttle/glass, +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"ED" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic, +/obj/machinery/light/floor, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"EE" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/secure/freezer, +/obj/item/food/pizza/flatbread/fish, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"EG" = ( +/obj/item/flashlight/flare{ + start_on = 1; + icon_state = "flare-on"; + light_range = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"EK" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"EM" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/booze{ + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); + spawn_random_offset = 2; + spawn_loot_count = 2 + }, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"EO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"EQ" = ( +/obj/item/circuitboard{ + icon_state = "secmodschematic" + }, +/obj/item/screwdriver, +/obj/structure/table/reinforced, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/circuit/green, +/area/awaymission/museum) +"ET" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/mob/living/basic/statue/mannequin{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"EU" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4 + }, +/obj/structure/fluff/wallsign/directional/north{ + dir = 4; + name = "Oddities" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"EX" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"EY" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Fa" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/open/floor/iron, +/area/awaymission/museum) +"Fc" = ( +/obj/item/food/sandwich/cheese, +/turf/open/floor/carpet/cyan, +/area/awaymission/museum/mothroachvoid) +"Fg" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"Fh" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/closet/crate/bin, +/obj/structure/sign/departments/restroom/directional/west, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Fi" = ( +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"Fj" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 2 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Fq" = ( +/obj/machinery/light/warm/directional/north, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Fr" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Fv" = ( +/obj/effect/smooths_with_walls, +/turf/open/mirage{ + target_turf_y = -19 + }, +/area/awaymission/museum) +"Fw" = ( +/obj/effect/decal/cleanable/blood/tracks{ + should_dry = 0; + name = "replica blood" + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/awaymission/museum) +"FA" = ( +/obj/structure/table/reinforced, +/obj/item/circuitboard{ + icon_state = "printer"; + name = "fancy replica tech" + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"FD" = ( +/obj/structure/girder, +/obj/structure/grille, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"FE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/carpet/executive, +/area/awaymission/museum) +"FG" = ( +/obj/structure/window/spawner/directional/south, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/awaymission/museum) +"FH" = ( +/obj/structure/plaque/static_plaque/golden/commission/box, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"FJ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/stripes/red/line, +/turf/open/floor/iron, +/area/awaymission/museum) +"FK" = ( +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"FM" = ( +/obj/structure/sign/departments/restroom/directional/south, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Gh" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 10 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Gi" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/closet/crate/miningcar, +/turf/open/floor/tram/plate, +/area/awaymission/museum) +"Gv" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "l"; + pixel_x = -10 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "i" + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "e"; + pixel_x = 12 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/museum) +"Gx" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/awaymission/museum) +"GE" = ( +/obj/structure/plaque/static_plaque/golden/commission/meta, +/turf/open/floor/mineral/gold, +/area/awaymission/museum) +"GG" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/mob/living/basic/statue/mannequin{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"GO" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/plate/large, +/obj/item/food/kurry_ok_subsando, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"GQ" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"GS" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"GT" = ( +/obj/structure/table/wood, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/west, +/obj/item/book/manual/wiki/security_space_law, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"GU" = ( +/mob/living/basic/mothroach, +/turf/open/water/beach, +/area/awaymission/museum/mothroachvoid) +"GV" = ( +/obj/structure/plaque/static_plaque/golden/commission/disc, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"GY" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/structure/fluff/fake_camera{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Hf" = ( +/obj/structure/table/wood, +/obj/item/language_manual/roundstart_species, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Hi" = ( +/obj/structure/fluff/fake_scrubber, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/museum) +"Hj" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Hk" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/corner/always_floorplane, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Hn" = ( +/mob/living/basic/statue/mannequin{ + hat = /obj/item/clothing/head/costume/kitty; + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/obj/machinery/conveyor{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"Ho" = ( +/obj/structure/fluff/divine/powerpylon, +/turf/open/floor/cult, +/area/awaymission/museum) +"Hs" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/machinery/door/poddoor/shutters/indestructible{ + dir = 4; + id = "nothing" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Hw" = ( +/obj/machinery/computer/terminal/museum{ + content = list("Early 1970s, 1978 - With the introduction of the microprocessor in the early 1970s, the world of computers became accessible to the masses via the introduction of the personal computer. Seizing on the opportunity to expand their horizons, Trasen-Knox would introduce their first personal computer, the TKC Personal Computer, in 1978, becoming a household name as well as the favourite computer producer of scientific groups in North America.") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"HA" = ( +/obj/machinery/status_display/random_message{ + firstline_to_secondline = list("NO" = "LITTERING","YOU ARE" = "BEING WATCHED", "DO NOT TOUCH" = "THE EXHIBITS") + }, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"HD" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/machinery/door/poddoor/shutters/indestructible{ + dir = 8; + id = "nothing" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"HE" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/showcase/perfect_employee, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"HJ" = ( +/obj/structure/hedge/opaque, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"HL" = ( +/obj/structure/table/reinforced, +/obj/item/toy/beach_ball/branded{ + pixel_y = 10 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"HP" = ( +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"HU" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/computer/old{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"HY" = ( +/obj/machinery/light/floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/awaymission/museum) +"Ic" = ( +/obj/machinery/light/warm/dim/directional/north, +/turf/open/floor/carpet, +/area/awaymission/museum) +"Ij" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Im" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/holosign/barrier/engineering, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Iu" = ( +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"Iz" = ( +/obj/structure/disposalpipe/broken, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"IB" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic/light, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/obj/item/clothing/gloves/color/yellow, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"IC" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"IF" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage, +/obj/item/food/grilled_beef_gyro, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"IH" = ( +/obj/machinery/portable_atmospherics/canister/water_vapor, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/singular/always_floorplane{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"IP" = ( +/turf/open/floor/holofloor/beach/coast, +/area/awaymission/museum) +"IV" = ( +/obj/structure/railing, +/obj/effect/turf_decal/stripes, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"IZ" = ( +/obj/structure/chair/comfy/beige{ + dir = 4 + }, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Jb" = ( +/turf/open/floor/iron/dark/side, +/area/awaymission/museum) +"Jc" = ( +/obj/structure/window/spawner/directional/north, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/awaymission/museum) +"Jd" = ( +/obj/machinery/vending/cigarette/beach, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Je" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/carpet, +/area/awaymission/museum) +"Jg" = ( +/obj/structure/statue/sandstone/assistant, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Jj" = ( +/mob/living/basic/mothroach, +/turf/open/floor/mineral/gold, +/area/awaymission/museum/mothroachvoid) +"Jk" = ( +/obj/item/toy/plush/moth, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/carpet/executive, +/area/awaymission/museum) +"Jn" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/toy, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"Js" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/machinery/computer/terminal/museum{ + dir = 8; + content = list("This exhibit is of a preserved cortical borer. Cortical borers went extinct in the Spinward sector due to almost every of them starving as they could not find enough food in the brains of the crewmembers, as they are usually pretty small or damaged by plasma exposure.") + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Jv" = ( +/obj/machinery/light/warm/dim/directional/south, +/obj/structure/fluff/divine/shrine, +/turf/open/floor/cult, +/area/awaymission/museum) +"Jx" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Jz" = ( +/obj/machinery/light/floor, +/turf/open/floor/mineral/silver, +/area/awaymission/museum) +"JF" = ( +/obj/machinery/gateway/away, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/museum) +"JK" = ( +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = 18 + }, +/turf/open/mirage{ + dir = 1; + target_turf_x = -9 + }, +/area/awaymission/museum) +"JU" = ( +/obj/machinery/computer/terminal/museum{ + dir = 4; + content = list("1963 - Founded in the city of Fresno by Michael Trasen and Dale Knox, Trasen-Knox Computing (as it was known at the time) would get its start producing scientific computers for academia. Trasen-Knox computers quickly gained a reputation for quality and reliability, and the company would gain a decent market share with American and Canadian universities over the coming decade. Trasen-Knox would also work closely with NASA in producing equipment for the space race- giving them an early start in Humanity’s push to the stars. ") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"JV" = ( +/turf/open/floor/bronze, +/area/awaymission/museum) +"JW" = ( +/obj/structure/broken_flooring/singular/always_floorplane{ + dir = 8 + }, +/turf/open/floor/black, +/area/awaymission/museum) +"JY" = ( +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/awaymission/museum/mothroachvoid) +"Kb" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Kd" = ( +/obj/structure/chair/stool/bar/directional/east{ + can_buckle = 1 + }, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Kh" = ( +/turf/closed/indestructible/fakeglass, +/area/awaymission/museum) +"Ko" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/marker_beacon/burgundy, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Ks" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/keycard/blue{ + puzzle_id = "museum_secret" + }, +/turf/open/floor/carpet/executive, +/area/awaymission/museum) +"Kt" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/turf/open/floor/iron, +/area/awaymission/museum) +"Kv" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/catwalk_floor, +/area/awaymission/museum) +"Kx" = ( +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/basic/skeleton, +/obj/effect/spawner/random/maintenance/three, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"KI" = ( +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/awaymission/museum) +"KN" = ( +/obj/effect/landmark/awaystart, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"Le" = ( +/obj/structure/fluff/fake_vent, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/museum) +"Lg" = ( +/obj/machinery/griddle, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"Lk" = ( +/obj/machinery/light/directional/north, +/obj/structure/showcase/mecha/marauder, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"Lm" = ( +/turf/open/floor/black, +/area/awaymission/museum) +"Lp" = ( +/obj/machinery/status_display/random_message{ + firstline_to_secondline = list("NO" = "LITTERING","YOU ARE" = "BEING WATCHED", "DO NOT TOUCH" = "THE EXHIBITS") + }, +/turf/closed/indestructible/reinforced/titanium/nodiagonal, +/area/awaymission/museum) +"Lq" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"Ls" = ( +/obj/structure/table/reinforced, +/obj/item/instrument/piano_synth/headphones, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Lt" = ( +/obj/structure/plaque/static_plaque/golden/commission/asteroid, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"Lv" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/circuit/green, +/area/awaymission/museum) +"Lw" = ( +/turf/open/floor/mineral/silver, +/area/awaymission/museum) +"Ly" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron, +/area/awaymission/museum) +"LB" = ( +/turf/open/floor/iron/stairs/right{ + dir = 8 + }, +/area/awaymission/museum) +"LC" = ( +/obj/machinery/computer/terminal/museum{ + dir = 4; + content = list("Mothroach") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"LN" = ( +/obj/effect/decal/cleanable/glass/titanium, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"LQ" = ( +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = -12 + }, +/obj/effect/oneway{ + dir = 8 + }, +/turf/open/mirage{ + dir = 4; + range = 1; + target_turf_x = -11 + }, +/area/awaymission/museum) +"LS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"LY" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/awaymission/museum) +"Ma" = ( +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Mg" = ( +/obj/structure/plaque/static_plaque/golden/commission/tram, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"Mn" = ( +/obj/machinery/light/warm/directional/south, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Ms" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/side/always_floorplane{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Mv" = ( +/mob/living/basic/statue/mannequin{ + dir = 4; + held_item = /obj/item/wrench; + name = "Michael Trasen" + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"Mx" = ( +/obj/structure/table, +/obj/item/phone, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"MB" = ( +/obj/structure/railing, +/turf/open/floor/holofloor/asteroid{ + icon_state = "asteroid5" + }, +/area/awaymission/museum) +"MC" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/light/floor, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"ME" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/iron, +/area/awaymission/museum) +"MF" = ( +/turf/closed/indestructible/wood, +/area/awaymission/museum) +"MI" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/mecha_parts/mecha_equipment/generator, +/turf/open/floor/iron, +/area/awaymission/museum) +"MV" = ( +/turf/open/floor/engine, +/area/awaymission/museum) +"MZ" = ( +/obj/structure/fluff/divine/defensepylon, +/turf/open/floor/cult, +/area/awaymission/museum) +"Na" = ( +/obj/structure/girder, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Nc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"Nd" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 9 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Ng" = ( +/obj/item/stack/sheet/bronze/thirty, +/obj/structure/table/bronze, +/turf/open/floor/bronze, +/area/awaymission/museum) +"Ni" = ( +/obj/machinery/computer/terminal/museum{ + dir = 4; + content = list("Primarily an advanced research and development conglomerate, but also has skin in many other fields. While a great deal of their income still comes from producing public research funded by government research grants, their operations also include directly producing and selling their most profitable designs, leasing their asset protection forces to governments and private organizations (both space fleets and ground troops), logistics management with a specialization in remote settlement self-sufficiency, and maintaining interstellar communication infrastructures to name a few. The common theme that runs through most of their business ventures is taking the lessons they've learned from operating on such a massive scale and helping smaller organizations stretch themselves.") + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"Nm" = ( +/obj/structure/plaque/static_plaque/golden/commission/birdboat, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"Ns" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/booze{ + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); + spawn_random_offset = 2 + }, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Ny" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"NB" = ( +/obj/effect/turf_decal/siding/wideplating/corner, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"ND" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing, +/obj/structure/table, +/obj/item/clothing/mask/cigarette/cigar{ + lit = 1; + icon_state = "cigaron" + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"NK" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/away/generic3, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"NO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"NT" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"NV" = ( +/obj/structure/bed/pod{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"NY" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Oi" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/spawner/random/trash/cigbutt, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Ok" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Ol" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/singular/always_floorplane{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Oo" = ( +/obj/structure/closet/secure_closet/bar/lavaland_bartender_booze{ + anchored = 1 + }, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"Op" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/computer/terminal/museum{ + dir = 4; + content = list("The DNA Manipulator, oh how great you were. Phased out several years ago because a study discovered that plants modified by the DNA Manipulator usually gave you cancer. Naturally, this was the botanists fault.") + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Ov" = ( +/turf/open/chasm, +/area/awaymission/museum) +"OD" = ( +/obj/machinery/computer/terminal/museum{ + dir = 8; + content = list("2560 - The Nanotrasen Cloning Incident; Did you know that Nanotrasen used to provide cloning for profitable employees? No? Good! Because in 2560, there was a terrorist backed sabotage on one of our cloning material supply facilities, resulting in a Feline serum being dumped into the carefully curated output. This resulted in horrible cat mutations for anyone who got cloned, weeks later. Facing outlash, Nanotrasen had to shut down all cloning clinics.") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"OI" = ( +/obj/machinery/light/floor, +/turf/open/floor/bronze/filled, +/area/awaymission/museum) +"OP" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/awaymission/museum) +"OS" = ( +/obj/structure/chair/stool/bar/directional/east{ + can_buckle = 1 + }, +/obj/effect/mapping_helpers/mob_buckler, +/mob/living/basic/mothroach, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"OT" = ( +/obj/structure/marker_beacon/burgundy, +/obj/structure/lattice/catwalk/mining, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"OZ" = ( +/obj/item/toy/figure/syndie, +/obj/item/toy/figure/syndie{ + pixel_x = -9 + }, +/obj/item/toy/figure/syndie{ + pixel_x = 9 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/holofloor/beach/coast{ + dir = 1 + }, +/area/awaymission/museum) +"Pb" = ( +/mob/living/basic/mothroach, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/awaymission/museum) +"Pc" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"Pd" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 2 + }, +/obj/structure/broken_flooring/corner/always_floorplane{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Pf" = ( +/obj/structure/table/wood, +/obj/item/food/kebab/pineapple_skewer, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"Pi" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 4 + }, +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Pl" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Pp" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/machinery/light/small/dim/directional/north, +/obj/structure/chair/stool/directional/east, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Pq" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/plate, +/obj/item/food/kebab/pineapple_skewer, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Ps" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"PB" = ( +/turf/closed/indestructible/fakedoor/engineering, +/area/awaymission/museum) +"PC" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"PF" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/mining, +/obj/item/flashlight/lantern{ + icon_state = "lantern-on"; + start_on = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"PK" = ( +/obj/machinery/door/poddoor{ + id = "gatewayfake" + }, +/obj/machinery/conveyor{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"PN" = ( +/obj/structure/girder/bronze, +/turf/open/floor/bronze/flat, +/area/awaymission/museum) +"PP" = ( +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"PR" = ( +/obj/structure/fluff/minepost, +/obj/effect/turf_decal/siding{ + dir = 9 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"PU" = ( +/obj/machinery/shower/directional/east, +/obj/effect/decal/cleanable/plastic, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/museum) +"PW" = ( +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = -18 + }, +/turf/open/mirage{ + target_turf_y = -19 + }, +/area/awaymission/museum) +"PX" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic/light, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"PZ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/item/flashlight/flare{ + start_on = 1; + icon_state = "flare-on" + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Qa" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Qb" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"Qc" = ( +/obj/item/kirbyplants/random/dead, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Qe" = ( +/obj/structure/broken_flooring/singular/always_floorplane{ + dir = 4 + }, +/turf/open/floor/black, +/area/awaymission/museum) +"Qf" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green, +/obj/structure/table, +/obj/machinery/coffeemaker, +/turf/open/floor/iron, +/area/awaymission/museum) +"Qi" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Qj" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/grass, +/area/awaymission/museum) +"Qk" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Qo" = ( +/obj/structure/closet/crate/cardboard/mothic, +/obj/item/food/pizza/mothic_white_pie, +/obj/item/toy/plush/moth, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Qs" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/light/floor, +/obj/effect/replica_spawner{ + target_path = /obj/structure/reagent_dispensers/fueltank + }, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/iron, +/area/awaymission/museum) +"Qt" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron, +/area/awaymission/museum) +"Qv" = ( +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/awaymission/museum) +"Qw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"QB" = ( +/obj/structure/plaque/static_plaque/golden/commission/birdshot, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"QD" = ( +/obj/structure/fluff/broken_canister_frame, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"QF" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"QG" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/museum) +"QI" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/north, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"QK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/closet/crate/bin, +/turf/open/floor/grass, +/area/awaymission/museum) +"QN" = ( +/obj/structure/table/wood, +/obj/item/food/grilled_beef_gyro, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"QP" = ( +/obj/effect/playeronly_barrier, +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/iron, +/area/awaymission/museum) +"QU" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/side/always_floorplane{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"QX" = ( +/obj/structure/sign/poster/party_game/directional/south, +/turf/open/floor/iron/dark/side, +/area/awaymission/museum) +"Re" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Ri" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Rl" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/fluff{ + name = "replica prototype autolathe"; + icon = 'icons/obj/machines/lathes.dmi'; + icon_state = "autolathe"; + desc = "A non-functional replica of a prototype Autolathe." + }, +/turf/open/floor/iron/smooth_corner{ + dir = 4 + }, +/area/awaymission/museum) +"Rq" = ( +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Rs" = ( +/mob/living/basic/mothroach, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/awaymission/museum) +"Rz" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"RC" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"RD" = ( +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 5 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"RJ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/maintenance/three, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"RL" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"RR" = ( +/obj/machinery/suit_storage_unit/open, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/museum) +"RU" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic, +/obj/structure/closet/crate/engineering, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Sa" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/door/airlock/freezer, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"Sc" = ( +/obj/effect/baseturf_helper{ + baseturf_to_replace = list(/turf/open/space/basic); + baseturf = /turf/open/indestructible/plating + }, +/turf/open/floor/bluespace, +/area/awaymission/museum) +"Se" = ( +/obj/structure/chair/comfy/beige, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Sh" = ( +/obj/effect/turf_decal/siding, +/obj/structure/railing, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"So" = ( +/obj/machinery/shower/directional/east, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/museum) +"Sr" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Sv" = ( +/obj/machinery/status_display/random_message{ + firstline_to_secondline = list("SOUVENIR" = "SHOP") + }, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"SA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/wirecutters, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"SN" = ( +/obj/structure/fluff/divine/conduit, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/cult, +/area/awaymission/museum) +"SQ" = ( +/mob/living/basic/mothroach, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"ST" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + dir = 8; + id = "nothing" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"SU" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/stack/spacecash/c1000, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Tr" = ( +/obj/structure/plaque/static_plaque/golden/commission/kilo, +/obj/machinery/light/floor, +/turf/open/floor/mineral/gold, +/area/awaymission/museum) +"Tt" = ( +/obj/structure/holosign/barrier/engineering, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"Tu" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 8 + }, +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Tz" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"TB" = ( +/obj/item/stack/rods, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/corner/always_floorplane{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"TF" = ( +/turf/open/floor/iron/stairs/right{ + dir = 4 + }, +/area/awaymission/museum) +"TI" = ( +/obj/structure/chair/bronze{ + dir = 8 + }, +/turf/open/floor/bronze/flat, +/area/awaymission/museum) +"TJ" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/replica_spawner{ + target_path = /obj/machinery/autolathe + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"TM" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/awaymission/museum) +"TN" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/item/kirbyplants/random/fullysynthetic, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"TO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/crate_abandoned, +/turf/open/floor/iron, +/area/awaymission/museum) +"TQ" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/singular/always_floorplane{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"TR" = ( +/obj/structure/window/spawner/directional/east, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/awaymission/museum) +"TV" = ( +/obj/structure/sign/poster/random/directional/east, +/obj/structure/grille, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"TY" = ( +/turf/open/floor/iron/showroomfloor, +/area/awaymission/museum) +"Ue" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/obj/machinery/door/window/elevator/right/directional/south{ + transport_linked_id = "museum_cargo" + }, +/obj/effect/spawner/random/maintenance/no_decals/seven, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Um" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/structure/fluff/wallsign/directional/east{ + dir = 2; + name = "Exit" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Un" = ( +/obj/structure/fluff/wallsign/directional/west{ + name = "History of Nanotrasen" + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/machinery/light/warm/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Uo" = ( +/obj/structure/fluff/fake_scrubber, +/turf/open/floor/iron, +/area/awaymission/museum) +"Uq" = ( +/obj/effect/smooths_with_walls, +/turf/cordon/secret, +/area/awaymission/museum) +"Ut" = ( +/mob/living/basic/statue/mannequin{ + held_item = /obj/item/banner/command; + hat = /obj/item/clothing/head/helmet/space + }, +/turf/open/floor/holofloor/hyperspace/ns, +/area/awaymission/museum) +"Uu" = ( +/turf/open/floor/mineral/titanium/white, +/area/awaymission/museum) +"Ux" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/table, +/obj/item/computer_disk{ + icon_state = "datadisk_hydro"; + name = "plant data disk" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"UB" = ( +/obj/structure/fluff/minepost, +/obj/effect/turf_decal/siding{ + dir = 6 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"UD" = ( +/obj/item/reagent_containers/pill/patch/ondansetron, +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/reagent_containers/pill/patch/libital, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"UG" = ( +/mob/living/basic/mothroach, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"UI" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/awaymission/museum) +"UK" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/preopen, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"UP" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/bronze, +/obj/item/clothing/suit/costume/bronze, +/obj/item/clothing/shoes/bronze, +/obj/item/clothing/head/costume/bronze, +/turf/open/floor/bronze/flat, +/area/awaymission/museum) +"UR" = ( +/obj/structure/railing, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"US" = ( +/obj/machinery/computer/old{ + name = "replica computer"; + dir = 8 + }, +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/circuit/green, +/area/awaymission/museum) +"UT" = ( +/obj/machinery/status_display/random_message{ + firstline_to_secondline = list("NO" = "LITTERING","YOU ARE" = "BEING WATCHED", "DO NOT TOUCH" = "THE EXHIBITS"); + pixel_x = 32 + }, +/turf/open/floor/carpet, +/area/awaymission/museum) +"UU" = ( +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"UV" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/item/storage/toolbox/emergency/old, +/turf/open/floor/engine, +/area/awaymission/museum) +"UY" = ( +/obj/effect/spawner/random/trash/mess, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"Vc" = ( +/obj/machinery/light/warm/directional/east, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Vh" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing/corner, +/obj/machinery/light/small/directional/east, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Vk" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Vq" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/fluff/fokoff_sign, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Vz" = ( +/obj/structure/grille/broken, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"VA" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"VD" = ( +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = 30 + }, +/turf/open/mirage{ + target_turf_y = 29 + }, +/area/awaymission/museum) +"VE" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing/corner, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"VH" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/server, +/turf/open/floor/holofloor/beach, +/area/awaymission/museum) +"VK" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_camera{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"VL" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"VM" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/item/clothing/under/rank/medical/scrubs/coroner, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"VS" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"VT" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"VW" = ( +/turf/open/floor/holofloor/beach/water, +/area/awaymission/museum) +"VZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"Wc" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + dir = 4; + id = "nothing" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"We" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Wf" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/awaymission/museum) +"Wg" = ( +/mob/living/basic/mothroach, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/east, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/awaymission/museum) +"Wj" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"Wo" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Wr" = ( +/obj/effect/light_emitter{ + light_color = "#FFF4AA"; + set_cap = 1 + }, +/turf/closed/indestructible/rock, +/area/awaymission/museum) +"Wt" = ( +/obj/machinery/computer/old{ + name = "replica computer"; + dir = 8 + }, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/circuit/green, +/area/awaymission/museum) +"Wu" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/turf_decal/stripes/end, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/museum) +"Wy" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"WB" = ( +/obj/structure/chair/stool/bar/directional/east, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"WD" = ( +/obj/effect/mob_spawn/corpse/human/assistant, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"WE" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/structure/fluff/fake_scrubber, +/turf/open/floor/iron, +/area/awaymission/museum) +"WH" = ( +/obj/structure/fluff/divine/defensepylon, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/cult, +/area/awaymission/museum) +"WJ" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic, +/obj/effect/spawner/random/maintenance/no_decals/seven, +/obj/item/storage/pill_bottle/maintenance_pill/full, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"WM" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/awaymission/museum) +"WQ" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/awaymission/museum) +"WT" = ( +/obj/machinery/computer/terminal/museum{ + content = list("2008 - Nanotrasen would buy out and merge with the Wulfe Group, a German company known for their manufacture of industrial equipment. Rebranding the company as Nanotrasen Heavy Industry (or NTHI), this would be Nanotrasen’s first step towards new horizons beyond computing. In a series of purchases, Nanotrasen would expand its range of products considerably, acquiring a chemical and oil subsidiary in Texas Chemical (now Nanotrasen Chemical Supply), a consumer goods subsidiary in Seowon Appliances (now Nanotrasen Consumer Goods)") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"WU" = ( +/obj/machinery/light/warm/directional/south, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"WX" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Xa" = ( +/obj/structure/broken_flooring/corner/always_floorplane{ + dir = 2 + }, +/obj/structure/lattice, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Xc" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/plate, +/obj/item/food/kitzushi, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Xh" = ( +/turf/closed/indestructible/fakedoor/maintenance, +/area/awaymission/museum) +"Xo" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing, +/obj/structure/table, +/obj/item/pen/red, +/obj/item/paper/fluff/museum/noend, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Xs" = ( +/obj/structure/fluff/broken_canister_frame, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Xt" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/contraband/cannabis, +/turf/open/floor/iron, +/area/awaymission/museum) +"XB" = ( +/obj/effect/turf_decal/bot/right, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/museum) +"XC" = ( +/obj/structure/plaque/static_plaque/golden/commission/mini, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"XD" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = 14 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"XF" = ( +/obj/structure/fluff/fake_vent, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"XK" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"XM" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/stripes/red/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"XP" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "nothing" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"XR" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/corner/always_floorplane, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"XW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Yb" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/plate/large, +/obj/item/food/khachapuri, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Yd" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/side/directional/east, +/obj/machinery/door/airlock/atmos/glass, +/obj/structure/barricade/wooden, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/access/all/away/generic3, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Ye" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/indestructible/reinforced/titanium/nodiagonal, +/area/awaymission/museum) +"Yg" = ( +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/basic/cockroach, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Yk" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "museum_secret" + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Yr" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/dark_blue, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/spawner/random/entertainment/toy, +/obj/item/reagent_containers/cup/glass/mug/nanotrasen, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Yz" = ( +/obj/effect/turf_decal/siding, +/mob/living/basic/statue/mannequin{ + dir = 8; + held_item = /obj/item/pickaxe; + hat = /obj/item/clothing/suit/hooded/explorer + }, +/obj/structure/railing, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"YC" = ( +/obj/item/storage/box/mothic_cans_sauces, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"YD" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"YF" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"YP" = ( +/obj/structure/broken_flooring/singular/always_floorplane{ + dir = 1 + }, +/turf/open/floor/black, +/area/awaymission/museum) +"YY" = ( +/turf/open/floor/iron/stairs/left{ + dir = 8 + }, +/area/awaymission/museum) +"YZ" = ( +/obj/machinery/light/warm/dim/directional/south, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green, +/obj/structure/table, +/obj/item/coffee_cartridge/bootleg, +/obj/item/reagent_containers/cup/glass/coffee/no_lid{ + pixel_x = 12 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Zf" = ( +/obj/structure/plaque/static_plaque/golden/commission/donut, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"Zg" = ( +/obj/machinery/light/warm/directional/west, +/turf/open/floor/holofloor/beach/water, +/area/awaymission/museum) +"Zk" = ( +/obj/effect/decal/cleanable/fuel_pool/hivis, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Zn" = ( +/obj/structure/lattice, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Zp" = ( +/obj/structure/plaque/static_plaque/golden/commission/icebox, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"Zr" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = 14 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Zw" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/chair/sofa/bench{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"ZB" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/obj/structure/broken_flooring/side/always_floorplane/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/airlock/access/all/away/generic3, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"ZF" = ( +/mob/living/basic/mothroach, +/turf/open/misc/beach/coast/corner{ + dir = 1 + }, +/area/awaymission/museum/mothroachvoid) +"ZH" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"ZI" = ( +/obj/structure/railing, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"ZP" = ( +/obj/structure/statue/gold/ce{ + anchored = 1 + }, +/turf/open/floor/mineral/diamond, +/area/awaymission/museum/mothroachvoid) +"ZW" = ( +/obj/machinery/door/airlock/wood/glass, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"ZY" = ( +/obj/structure/window/bronze/spawner/directional/south, +/obj/structure/window/bronze/spawner/directional/east, +/obj/structure/window/bronze/spawner/directional/north, +/obj/structure/grille, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"ZZ" = ( +/obj/item/stack/rods, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) + +(1,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(2,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(3,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(4,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(5,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(6,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(7,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(8,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(9,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(10,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(11,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(12,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(13,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(14,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(15,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(16,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(17,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(18,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(19,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(20,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(21,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(22,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(23,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(24,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(25,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(26,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(27,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(28,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(29,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(30,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(31,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(32,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(33,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(34,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(35,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(36,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(37,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(38,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(39,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(40,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(41,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(42,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(43,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(44,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(45,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(46,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(47,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(48,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(49,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(50,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(51,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(52,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(53,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(54,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(55,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(56,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(57,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(58,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(59,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(60,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(61,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(62,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(63,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(64,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(65,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(66,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(67,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(68,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(69,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(70,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(71,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(72,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(73,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(74,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(75,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(76,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(77,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(78,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Lm +Lm +Lm +Lm +Qe +Lm +Qe +Lm +Lm +Lm +Lm +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(79,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Lm +Lm +Lm +Qe +Lm +Qe +Lm +YP +Lm +Lm +Lm +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(80,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Lm +Lm +Lm +Lm +Qe +Lm +JW +Lm +Lm +Lm +sj +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(81,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +yS +yS +yS +yS +yS +re +re +re +re +re +re +re +re +re +re +re +re +FK +DT +DT +DT +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(82,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +yS +yS +fn +kQ +fn +yS +yS +re +re +re +re +re +FK +FK +FK +FK +FK +re +FK +xx +TM +Wy +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(83,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +yS +fn +fn +fn +fn +kQ +yS +re +re +re +FK +FK +FK +IP +Zg +fJ +FK +FK +FK +Hs +eN +Wc +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(84,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +yS +fn +Ut +hE +dY +fn +yS +re +re +re +FK +jH +mX +IP +VW +oQ +br +NV +FK +aa +qj +fy +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(85,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +yS +yq +fn +fn +fn +fn +yS +re +re +re +FK +UY +zG +IP +VW +oQ +GG +rr +FK +lb +TM +tD +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(86,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +yS +fe +uT +uT +uT +fe +yS +re +re +re +FK +cs +rO +lk +oA +eX +zK +IF +FK +lb +uY +tD +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(87,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +MF +MF +MF +MF +MF +MF +MF +MF +MF +MF +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +fe +fe +Mx +Ni +lC +fe +fe +FK +FK +FK +FK +GQ +yx +xR +hC +xR +GS +GQ +FK +lb +uY +tD +FK +HA +FK +FK +FK +FK +FK +FK +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(88,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +Ns +yi +Er +EM +yi +Se +Cy +yi +Ns +MF +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +fe +fe +fe +fe +HL +Iu +Uu +Iu +uM +iz +VL +hV +LS +hV +hV +hV +VL +hV +hV +hV +hV +hV +zg +uY +nh +hV +hV +hV +hV +VK +im +hV +hV +VL +CF +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(89,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +rA +gM +gM +gM +gM +gM +gM +gM +rA +MF +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +fe +FA +Ef +zc +Iu +Uu +Hi +Uu +Iu +EA +uY +TM +uY +uY +uY +uY +uY +uY +uY +qj +od +qj +uY +HY +qj +qj +qj +uY +uY +uY +uY +uY +TM +qj +bI +re +re +re +re +re +re +re +re +re +re +Uq +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(90,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +MF +MF +MF +MF +MF +WB +WB +WB +WB +WB +WB +gM +gM +wO +MF +re +re +re +re +Ma +Ma +re +re +re +re +re +re +re +re +re +re +re +re +fe +xg +lT +IV +da +jn +jn +jn +gG +AC +bV +gW +bV +RC +uY +DV +bV +bV +bV +Gh +uY +lf +bV +bV +bV +bV +bV +bV +bV +RC +qj +Ok +bV +es +XP +re +re +re +re +re +re +re +re +re +re +FK +yM +FK +FK +FK +FK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(91,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +ml +Pf +Lg +Lg +MF +fi +fi +fi +fi +fi +fi +pp +gM +IZ +MF +re +re +re +re +Zn +Ma +Ma +re +re +re +re +re +re +re +re +re +re +re +fe +ab +lM +IV +Fi +iW +go +iW +TN +Ye +FK +FK +FK +GY +uY +tD +am +kX +Rl +lb +uY +sy +FK +FK +PR +tI +iK +ea +FK +lb +uY +tD +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +aG +FK +Gv +ek +Gv +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(92,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +gB +HP +HP +HP +MF +fW +rr +rr +rr +rr +Ek +pp +gM +EM +MF +re +re +re +DS +wh +Ma +Ma +Ma +re +re +re +re +re +re +re +re +re +re +fe +jo +jo +Lp +vZ +Ag +VT +Ag +HE +fe +FK +cW +Lv +lb +qj +tD +cn +Mv +tv +lb +uY +ZI +rU +FK +UU +fa +Gi +Yz +Sr +lb +uY +pb +FK +EE +Yg +vj +SA +FK +Ma +Ma +DA +Ma +Ma +as +PK +EK +yo +Kh +Gv +sN +Gv +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(93,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +AG +HP +HP +HP +mZ +rr +Oo +zC +dH +rr +dV +gM +gM +rA +MF +MF +re +re +DS +Re +wh +Ma +Ma +Zn +re +re +re +re +re +re +re +re +re +fe +eg +eg +fe +Jn +nS +xI +xI +eD +fe +FK +hX +Lv +lb +uY +tD +Kv +jy +lh +lb +uY +ZI +hT +FK +xj +PF +tN +Sh +WT +lb +uY +xf +FK +xr +XK +Yg +XK +FD +ZH +Qk +Ma +Ma +Ma +tK +FK +FK +Kh +Kh +ix +ix +ix +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(94,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +wk +jL +HP +bC +MF +dL +rr +rr +hp +rr +kr +pp +gM +gM +aW +MF +MF +MF +MF +Re +PZ +Ma +Ma +dZ +re +re +re +re +re +re +re +re +re +fe +hM +iF +ro +Fi +DU +iW +iW +Ny +Ye +FK +FK +FK +Hw +uY +tD +Wt +EQ +US +lb +uY +xJ +FK +FK +nH +th +lB +UB +FK +lb +qj +xf +FK +FK +bF +FK +We +tK +Ma +VE +zr +Ma +Ma +Ri +nT +Dx +XK +XK +XK +uR +SU +Xh +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(95,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +MF +MF +MF +MF +Sa +MF +MF +MF +tx +tx +tx +tx +tx +pp +gM +jf +gM +bj +TY +cH +cH +vs +cR +Ma +Ma +Zn +re +re +re +re +re +re +re +re +re +fe +yl +NT +MB +tt +sm +sm +sm +Bu +iz +hV +hV +hV +zg +uY +nv +hV +JU +hV +wE +uY +nh +hV +hV +hV +hV +hV +hV +hV +zg +uY +xf +FK +Na +ow +FK +FK +FK +Ma +do +Ma +Ma +Ma +tK +FK +FK +Kh +Kh +FK +FK +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(96,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +cF +cF +cF +cF +cF +KI +Ci +MF +ex +ex +ex +ex +ex +gM +gM +gM +FM +MF +nr +TY +cH +vs +cR +Ma +Ma +re +re +re +re +re +re +re +re +re +re +fe +nz +tj +UR +Iu +Uu +Le +Uu +Iu +EA +uY +TM +uY +qj +Uo +uY +uY +uY +uY +uY +uY +uY +uY +oI +uY +uY +uY +qj +qj +qj +Uo +xf +FK +XK +XK +pX +bF +kh +sD +at +Ma +Ma +Ma +kA +PK +EK +EK +zh +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(97,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +YY +LB +Am +iN +uc +Jb +Ps +eA +gM +gM +gM +gM +gM +gM +gM +gM +Mn +MF +CV +TY +gA +MF +Zn +Ma +Ma +re +re +re +re +re +re +re +re +re +re +fe +fe +fe +fe +Lk +Uu +Uu +Uu +Iu +AC +bV +es +bV +OD +bV +bV +RC +qj +lf +bV +bV +ox +bV +es +es +bV +bV +yN +bV +bV +bV +Wo +FK +QI +XK +XK +Xh +dZ +dZ +yG +Ma +Ma +Ma +VM +PK +EK +zh +gC +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(98,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +qp +Ls +Ec +uc +CT +Jb +xT +MF +Jd +Kd +OS +Kd +OS +OS +Kd +gM +gM +MF +MF +up +MF +MF +Zn +Ma +Ma +re +re +re +re +re +re +re +re +re +re +re +re +re +fe +VH +sC +mA +OZ +xD +fe +FK +FK +EX +EX +EX +yn +lb +uY +tD +yn +eH +kO +kO +FK +AR +BK +DL +ai +rX +ai +ai +TJ +FK +HU +AP +HU +FK +Kh +Kh +FK +Kh +Kh +FK +FK +FK +FK +yM +yM +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(99,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +ct +Bo +wI +Rs +mK +QX +MF +MF +MF +Pq +ya +Yb +Xc +GO +fz +la +la +MF +Fh +la +ht +MF +qS +Ma +Ma +re +re +re +re +re +re +FK +FK +FK +FK +FK +FK +re +fe +qY +qY +qY +qY +qY +fe +ap +FK +Hn +eF +As +ud +lb +uY +fy +ud +pi +MC +bQ +FK +Eo +Iz +fo +yu +yu +yu +Dk +BQ +ll +BX +BX +BX +hl +EK +EK +EK +qM +EK +hl +EK +kg +EK +EK +EK +yM +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(100,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +qp +az +Jc +Pb +FG +Jb +MF +eP +eP +eP +nb +Ar +Ar +Ar +wZ +eP +eP +mV +mV +mV +mV +mV +qS +qS +Ko +re +re +re +re +re +re +FK +Ov +Ov +Ov +tB +FK +re +FK +sA +XK +bG +XK +XK +FK +ap +FK +RD +oZ +hY +FK +lb +TM +qL +FK +oo +bJ +CK +FK +QD +Xs +fo +MV +dS +MV +MV +UV +ll +BX +BX +BX +hl +EK +qM +AI +EK +EK +hl +EK +EK +EK +EK +EK +yM +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(101,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +TF +vO +Wg +TR +Pb +Jb +vU +eP +gu +nb +ff +Ar +Ar +hb +Dl +eP +SQ +mV +mV +mV +mV +SQ +MF +MF +MF +MF +MF +re +re +re +re +FK +Ov +rB +Ov +tB +FK +re +FK +FK +iT +FK +UD +uu +FK +FK +FK +FK +FK +FK +FK +Jx +gj +uf +FK +FK +FK +FK +FK +FK +FK +DY +Ij +DY +Ij +DY +DY +FK +TB +ZZ +XK +tK +Kh +Kh +FK +Kh +Kh +FK +FK +lU +lU +lU +tK +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(102,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +Qv +Qv +Qv +Qv +Qv +pc +MF +oC +nb +BF +Ar +GU +Ar +wZ +gu +eP +mV +mV +mC +jG +mV +mV +ZW +gM +wO +Bj +MF +re +re +re +re +FK +Ov +Ov +Ov +tB +FK +re +FK +iB +Ol +FK +FK +FK +FK +Cc +eO +cf +mg +Cc +FK +lb +uY +tD +FK +Cc +Cc +Cc +Cc +Cc +FK +FK +XK +XK +XK +FK +re +FK +TO +wG +XK +VA +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Cb +ED +bk +Ue +tU +PB +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(103,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +MF +MF +MF +MF +MF +MF +MF +eP +xm +Ar +Ar +Ar +hb +Dl +eP +oC +mV +mV +Fc +jG +mV +tC +MF +gM +gM +gM +MF +re +re +re +re +FK +FK +FK +FK +FK +FK +re +FK +IH +XK +Hk +MI +FK +pF +Cc +DI +Zw +Hj +VL +Un +qA +uY +nh +iE +xb +Co +Co +qR +Cc +Cc +FK +YC +dN +tf +FK +re +FK +sh +ts +Pd +Fj +Ma +Ma +Ma +Ma +Ma +Ma +Ma +bk +bW +IB +Ah +tU +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(104,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +os +eP +eP +mV +mV +jG +qt +mV +mV +jB +gM +GT +sp +MF +re +re +re +re +re +re +re +re +re +re +re +FK +TQ +QU +sd +Xt +FK +fK +VS +zg +qj +uY +qj +qj +uY +uY +uY +uY +uY +uY +qj +nh +Pi +Cc +FK +FK +FK +FK +FK +re +FK +jW +EO +ME +zM +Ma +jU +Ma +Ma +Ma +Ma +Ma +bk +lV +PX +nc +tU +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(105,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +xu +xu +xu +dx +xm +Ar +Ar +Ar +wZ +eP +eP +eP +mV +mV +SQ +mV +mV +mV +jB +yr +nq +kd +MF +re +re +re +re +re +re +re +re +re +re +re +FK +pM +XR +xB +lS +FK +vc +lb +uY +od +qj +uY +uY +uY +uY +uY +uY +uY +uY +Uo +uY +aR +HJ +FK +re +re +re +re +re +FK +zL +qj +qj +Ms +Ma +Ma +Ma +Ma +Ma +Ma +Ma +RU +ED +WJ +Ai +tU +PB +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(106,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +xu +xu +mV +eP +xm +GU +Ar +Ar +wZ +eP +eP +mV +mV +mV +mV +mV +mV +mV +jB +gM +il +gM +MF +re +re +re +re +re +re +re +re +re +re +re +FK +FK +FK +FK +FK +FK +jN +lb +uY +uY +Gx +uE +ev +VZ +VZ +LY +ev +Lq +WQ +uY +uY +aR +Cc +FK +re +re +re +re +re +FK +FK +FK +FK +tK +FK +FK +FK +FK +FK +FK +FK +FK +PB +PB +tK +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(107,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +xu +xu +mV +eP +xm +Ar +Ar +Ar +wZ +gu +eP +zE +Wr +zE +zE +zE +zE +zE +MF +MF +MF +MF +MF +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +fK +lb +uY +uY +uE +QF +uN +WM +uN +uN +uN +Fg +Lq +uY +uY +nW +Cc +FK +re +re +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(108,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +xu +mV +eP +xm +Ar +Ar +Ar +wZ +eP +NB +zE +FK +Fv +re +re +re +re +zE +re +re +re +re +re +re +re +re +re +re +re +re +AS +FK +FK +FK +FK +FK +FK +FK +FK +FK +zY +uY +uY +IC +Qw +wL +Qw +Pc +WM +uN +uN +Qj +qj +uY +AZ +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(109,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +mV +eP +xm +Ar +Ar +Ar +wZ +eP +CC +QP +nh +PW +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +JK +hV +hV +hV +hV +hV +hV +hV +sE +VK +zg +uY +uY +wC +XB +QG +cv +KN +zd +zd +WM +At +qj +uY +nh +CD +st +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +gQ +XD +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +iZ +Vq +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(110,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +mV +eP +ZF +Cu +Ar +Ar +wZ +lG +CC +QP +TM +PW +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +JK +uY +TM +uY +uY +uY +TM +uY +Yk +qj +uY +uY +Rq +FK +nE +JF +QG +KN +lz +zd +uN +Wf +qj +qj +uY +uY +zX +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +gQ +Cd +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +cS +rP +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(111,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +xu +mV +dx +eP +xm +Ar +Ar +wZ +eP +CC +QP +lf +PW +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +JK +bV +bV +bV +bV +bV +bV +bV +ec +es +yA +uY +uY +wC +cv +QG +XB +KN +zd +lz +WM +At +qj +uY +lf +Um +UK +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +gQ +Zr +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +nF +yK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(112,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +mV +eP +gu +xm +Ar +Ar +wZ +dx +dR +zE +FK +Fv +re +re +re +re +zE +zE +re +re +re +re +re +re +re +re +re +re +re +AS +FK +FK +FK +FK +FK +FK +of +FK +FK +zY +qj +uY +uE +QK +VZ +VZ +Wj +uN +uN +uN +Qj +qj +uY +sX +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +re +re +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(113,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +JY +iV +eP +oC +xm +Ar +Ar +wZ +eP +eP +zE +Wr +zE +zE +zE +zE +zE +zE +zE +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +iI +aa +qj +uY +IC +YF +WM +uN +WM +WM +uN +mQ +xv +qj +uY +fy +Cc +Sv +Nd +Cj +cA +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +FK +FK +FK +re +re +re +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(114,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +hj +tc +eP +eP +xm +Ar +Ar +wZ +eP +oC +SQ +mV +SQ +mV +SQ +mV +mV +mV +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +FK +Xh +FK +FK +FK +wN +lb +uY +uY +nQ +IC +Tz +Qw +Qw +Qw +Tz +xv +Gx +uY +uY +fy +el +Yr +kw +UI +eQ +FK +FK +FK +FK +FK +FK +FK +FK +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +FK +QN +fC +tM +FK +FK +tG +tG +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(115,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +xu +mV +eP +nb +BF +Ar +Ar +wZ +eP +eP +mV +SQ +mV +SQ +mV +jm +bs +bs +xu +zE +zE +re +re +re +re +re +re +re +re +re +re +re +FK +qw +XK +PP +PP +xP +FK +hi +lb +uY +Uo +uY +uY +uY +uY +uY +uY +uY +uY +uY +od +uY +fy +el +rW +ET +WE +YZ +FK +en +Vk +CB +FK +tS +dZ +Xo +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +FK +Hf +Ab +XW +FK +xt +wy +wy +yF +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(116,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +zE +xu +mV +eP +xm +Ar +Ar +Ar +wZ +eP +gu +mV +SQ +ZP +Jj +zR +xE +eM +bs +xu +xu +zE +re +re +re +re +re +re +re +re +re +re +re +FK +FK +YD +Vz +PP +Qo +FK +iI +WX +RC +uY +qj +qj +uY +uY +uY +uY +uY +uY +uY +uY +Ok +bK +el +AY +kw +cB +Qf +FK +ue +rq +FJ +FK +yf +vC +ND +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +ud +qQ +Dr +qQ +kq +qQ +Dr +sz +Qb +tG +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(117,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +eP +xm +Ar +GU +Ar +wZ +oC +eP +mV +mV +xE +cC +cC +cC +xE +bs +mV +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +FK +XK +XK +PP +kY +FK +pF +Cc +Tu +hA +Ak +es +Bq +RC +uY +lf +Bq +bV +bV +bV +bK +Cc +Cc +FK +vE +NY +pg +FK +hw +Be +XM +FK +dZ +dZ +PC +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +ud +nx +qQ +Pl +FK +Ea +xI +xI +RL +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(118,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +oC +xm +Ar +Ar +Ar +wZ +eP +eP +mV +mV +xE +cC +cC +cC +xE +mV +mV +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +FK +ls +XK +qx +FK +FK +FK +Cc +Oi +cN +vh +Cc +FK +lb +uY +qX +FK +Cc +Cc +bn +Cc +Cc +FK +FK +FK +NK +FK +FK +FK +FK +Yd +FK +NO +dZ +mn +yw +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +FK +FK +FK +FK +FK +vx +nu +FK +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(119,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +eP +xm +Ar +Ar +Ar +wZ +eP +UG +mV +mV +gm +xE +ke +xE +Cq +mV +xu +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +vg +bF +FK +gR +FK +FK +FK +FK +FK +FK +FK +EU +vy +El +FK +FK +FK +FK +FK +FK +FK +Ks +aw +XK +aK +Du +bF +dl +CI +tq +jI +dZ +dZ +mn +rL +sD +sD +sD +gN +gN +gN +sD +Ma +Ma +dZ +Ma +sD +Ma +dZ +Ma +Ma +Ma +Ma +Ma +sD +sD +Ma +sD +Ma +sD +dZ +FK +So +PU +So +FK +qQ +xI +gT +Qb +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(120,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +gu +xm +Ar +Ar +Ar +wZ +gu +oC +mV +mV +mV +mV +mV +mV +mV +mV +xu +zE +zE +re +re +re +re +re +re +re +re +re +re +re +re +FK +Kt +qj +pD +FK +XK +RJ +Kx +FK +Fa +OP +pf +ud +lb +uY +tD +ud +Jg +Jg +mN +FK +tl +Jk +CL +rm +Zk +EG +XK +bF +qU +CI +tq +jI +dZ +dZ +dZ +ve +dZ +Ko +dZ +dZ +dZ +dZ +Ko +dZ +Ma +dZ +OT +dZ +Ma +dZ +Ko +dZ +dZ +dZ +Ko +dZ +dZ +dZ +Ko +Ma +Ma +dZ +cm +jV +jV +qJ +Wu +qQ +xI +xd +ns +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(121,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +eP +xm +Ar +Ar +Ar +wZ +eP +eP +mV +mV +mV +mV +Tt +Tt +Tt +Tt +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +qj +wH +mS +FK +xc +FK +FK +FK +Fw +Qs +xF +ud +lb +TM +tD +ud +wA +ty +sG +FK +lg +FE +rp +rm +PP +zU +XK +bF +PP +CI +tq +de +dZ +dZ +Fr +Im +zr +zr +zr +zr +zr +zr +zr +zr +zr +dZ +zr +zr +zr +dZ +zr +zr +Ma +Ma +Ma +Ma +zr +Ma +zr +zr +zr +dZ +FK +RR +pI +jF +FK +qp +xI +cM +BO +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(122,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +xu +xu +xu +xu +yE +mV +pY +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +ZB +FK +FK +FK +Ux +Op +wJ +FK +em +Qt +iD +Rz +lb +uY +tD +Rz +gf +Ly +Ly +FK +GQ +GQ +FK +FK +vb +FK +FK +FK +PP +CI +tq +jI +dZ +dZ +PC +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +FK +FK +FK +FK +FK +LN +Nc +FK +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(123,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +xu +xn +ul +qo +qo +qo +De +xn +xn +xu +zE +zE +zE +xu +xu +xu +xu +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +zz +pL +PN +ZY +VS +hV +hV +DE +hV +pv +hV +hV +zg +uY +nh +hV +hV +bi +hV +CW +hV +hV +LC +FK +cy +PP +PP +vb +PP +CI +Aq +nl +dZ +Vh +ce +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Zn +Zn +fT +Qc +FK +rY +xI +xI +pw +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(124,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +gu +xm +Ar +Ar +Ar +wZ +gu +oC +xu +zE +re +zE +zE +zE +zE +zE +zE +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +Ng +OI +JV +zI +lb +uY +uY +uY +uY +uY +uY +uY +uY +od +uY +uY +uY +uY +uY +uY +uY +uY +tD +FK +FK +FK +FK +FK +FK +FK +FK +FK +PB +FK +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Zn +Ma +Ma +fT +bE +qQ +XF +xI +Qb +tG +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(125,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +UP +vM +TI +vw +lb +uY +lf +Vc +bV +bV +bV +bV +RC +uY +lf +bV +bV +bV +bV +Vc +RC +uY +tD +HA +re +re +re +FK +re +re +re +re +re +FK +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Zn +rJ +rJ +Xa +FK +bM +Kb +Kb +yF +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(126,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +hk +FK +FK +FK +FK +FK +lb +uY +tD +FK +GQ +GQ +GQ +FK +Fq +uY +WU +FK +GQ +GQ +GQ +FK +lb +uY +tD +FK +FK +FK +FK +FK +lI +re +re +re +re +FK +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +FK +vp +WD +vp +FK +FK +tG +tG +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(127,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +AM +Sr +Sr +Sr +Sr +Sr +lb +Uo +tD +sq +Lw +Lw +Lw +qP +lb +uY +tD +XC +Lw +tk +Lw +FH +lb +Uo +tD +Sr +Sr +Sr +Sr +Sr +VD +re +re +re +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +ot +rc +TV +FK +re +re +re +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(128,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +gu +xm +Ar +Ar +Ar +wZ +gu +oC +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +hk +FK +FK +FK +FK +FK +lb +uY +tD +GV +Lw +Tr +Lw +ud +lb +uY +tD +ud +Lw +Jz +Lw +QB +lb +uY +tD +FK +FK +FK +FK +FK +lI +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +FK +FK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(129,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +HA +lb +uY +tD +Zf +Lw +Lw +Lw +Mg +lb +uY +tD +eR +Lw +GE +Lw +Nm +lb +uY +tD +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Uq +re +re +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(130,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +gJ +Vc +Qa +FK +Zp +nD +lH +FK +lb +uY +qL +FK +Lt +lZ +cX +FK +gJ +Vc +Ay +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(131,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +FK +FK +FK +EY +hV +hV +hV +zg +uY +nh +hV +hV +hV +Cf +FK +FK +FK +FK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(132,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +gu +xm +Ar +Ar +Ar +wZ +gu +oC +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +Pp +uY +uY +uY +uY +Uo +uY +uY +uY +av +dF +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(133,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +jP +bV +Js +bV +RC +uY +lf +bV +nw +bV +oe +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(134,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +xu +xu +xu +xu +xu +xu +xu +xu +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +pt +pt +Je +lb +uY +tD +jt +WH +AE +FK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(135,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +zE +zE +zE +zE +zE +zE +zE +zE +zE +zE +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +Ic +ne +nC +lb +uY +tD +nJ +cZ +Jv +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(136,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +dn +UT +nC +lb +uY +tD +SN +MZ +Ho +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(137,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +FK +FK +FK +lb +uY +rQ +FK +FK +FK +FK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(138,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +re +re +dK +Qi +lb +uY +tD +Qi +mj +re +re +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(139,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +re +re +dK +Qi +lb +TM +tD +Qi +mj +re +re +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(140,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +re +re +dK +Qi +lb +uY +tD +Qi +mj +re +re +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(141,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +re +re +dK +Qi +lb +uY +tD +Qi +mj +re +re +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(142,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +re +re +dK +Qi +lb +TM +tD +Qi +mj +re +re +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(143,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +re +re +dK +Qi +lb +uY +tD +Qi +mj +re +re +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(144,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +FK +FK +FK +lb +uY +qX +FK +FK +FK +FK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(145,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +HD +wi +ST +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(146,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Uq +re +re +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(147,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(148,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(149,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(150,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(151,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(152,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(153,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(154,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(155,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(156,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(157,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(158,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(159,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(160,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(161,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(162,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(163,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(164,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(165,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(166,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(167,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(168,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(169,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(170,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(171,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(172,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(173,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(174,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(175,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(176,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(177,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(178,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(179,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(180,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(181,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(182,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(183,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(184,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(185,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(186,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(187,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(188,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(189,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(190,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(191,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(192,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(193,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(194,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(195,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(196,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(197,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(198,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(199,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(200,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(201,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(202,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(203,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(204,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(205,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(206,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(207,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(208,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(209,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(210,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(211,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(212,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(213,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(214,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(215,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(216,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(217,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(218,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(219,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(220,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(221,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(222,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(223,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(224,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(225,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(226,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(227,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(228,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(229,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(230,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(231,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(232,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(233,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(234,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(235,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(236,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(237,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(238,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(239,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(240,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(241,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(242,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(243,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(244,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(245,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(246,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(247,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(248,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(249,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(250,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(251,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(252,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +bg +DD +fu +re +"} +(253,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +DD +Ov +zA +re +"} +(254,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +iU +DD +Sc +re +"} +(255,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} diff --git a/_maps/map_files/Basketball/beach_bums.dmm b/_maps/map_files/Basketball/beach_bums.dmm index aa5948a34e6d2..517e70f2b630a 100644 --- a/_maps/map_files/Basketball/beach_bums.dmm +++ b/_maps/map_files/Basketball/beach_bums.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "af" = ( -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ pixel_x = 6; pixel_y = 11 }, @@ -344,7 +344,7 @@ /turf/open/misc/beach/sand, /area/centcom/basketball) "Jb" = ( -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ pixel_x = 6; pixel_y = 11 }, @@ -360,7 +360,7 @@ /turf/open/misc/beach/sand, /area/centcom/basketball) "Lu" = ( -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ pixel_x = 6; pixel_y = 11 }, diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 09563ab18686e..7f2a071eec9bd 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -338,6 +338,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/atmos/project) +"agF" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/sofa/bamboo/right{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/service/chapel) "agI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ @@ -567,8 +574,9 @@ /turf/open/floor/iron, /area/station/hallway/primary/starboard) "alg" = ( -/obj/structure/altar_of_gods, -/obj/item/book/bible, +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, /turf/open/floor/carpet/lone, /area/station/service/chapel/office) "alh" = ( @@ -2383,7 +2391,7 @@ /obj/structure/flora/bush/sunny/style_random, /obj/machinery/light/small/directional/west, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "aWC" = ( /obj/machinery/computer/department_orders/engineering{ dir = 8 @@ -4591,7 +4599,7 @@ "bOl" = ( /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "bOp" = ( /obj/effect/spawner/random/vending/snackvend, /obj/effect/turf_decal/tile/blue{ @@ -5456,10 +5464,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/security/tram) -"cgb" = ( -/obj/machinery/duct, -/turf/open/floor/iron/kitchen/small, -/area/station/security/prison/mess) "cgy" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -6021,7 +6025,7 @@ }, /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "css" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 10 @@ -7252,7 +7256,7 @@ }, /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "cPi" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -8814,10 +8818,9 @@ "dty" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/wood, /obj/machinery/light/floor, /turf/open/floor/wood/large, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "dtC" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/purple{ @@ -9299,7 +9302,7 @@ /area/station/maintenance/department/medical/central) "dBA" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/light/small/directional/east, /turf/open/floor/carpet/royalblack, /area/station/commons/dorms) @@ -11067,7 +11070,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/machinery/light/small/directional/west, @@ -11344,7 +11347,9 @@ /area/station/maintenance/starboard/aft) "ena" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/plumbed, +/obj/structure/reagent_dispensers/plumbed{ + dir = 1 + }, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) "enb" = ( @@ -14096,7 +14101,6 @@ "fls" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/glass/plastitanium, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16053,6 +16057,12 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"fRZ" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "fSe" = ( /turf/closed/wall/rust, /area/station/cargo/miningfoundry) @@ -17810,7 +17820,6 @@ /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, -/obj/machinery/duct, /obj/machinery/power/apc/auto_name/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18462,10 +18471,10 @@ /obj/machinery/door/airlock/maintenance{ name = "Maintenance" }, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, /obj/effect/mapping_helpers/airlock/unres{ dir = 1 }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) "gKL" = ( @@ -19620,13 +19629,9 @@ /obj/effect/turf_decal/siding/wood{ dir = 9 }, -/obj/structure/rack{ - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, /obj/item/storage/fancy/candle_box, /obj/machinery/light_switch/directional/west, +/obj/structure/rack/skeletal, /turf/open/floor/iron/grimy, /area/station/service/library) "hei" = ( @@ -20391,7 +20396,7 @@ }, /obj/structure/flora/tree/jungle/small/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "hpQ" = ( /obj/structure/closet/crate/coffin, /obj/structure/window/spawner/directional/south, @@ -21686,7 +21691,7 @@ }, /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "hNY" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -22243,7 +22248,7 @@ /obj/machinery/conveyor{ id = "mining" }, -/obj/machinery/bouldertech/brm, +/obj/machinery/brm, /turf/open/floor/iron, /area/station/cargo/miningfoundry) "hZP" = ( @@ -24628,6 +24633,9 @@ "iSW" = ( /obj/structure/rack, /obj/item/clothing/gloves/boxing/yellow, +/obj/item/clothing/gloves/boxing/green{ + pixel_y = 4 + }, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "iTn" = ( @@ -24701,8 +24709,7 @@ /turf/open/floor/plating, /area/station/engineering/atmos) "iUy" = ( -/obj/structure/rack, -/obj/item/clothing/gloves/boxing/green, +/obj/structure/reagent_dispensers/plumbed, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "iUz" = ( @@ -25955,7 +25962,7 @@ }, /obj/structure/flora/tree/jungle/small/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "jsc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/red/line{ @@ -26693,6 +26700,13 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"jEU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/landmark/start/chaplain, +/turf/open/floor/wood/large, +/area/station/service/chapel) "jEZ" = ( /obj/structure/hedge, /obj/effect/decal/cleanable/dirt, @@ -27374,7 +27388,6 @@ "jPr" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28486,6 +28499,12 @@ /obj/item/storage/backpack/duffelbag, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"kld" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron/kitchen/small, +/area/station/security/prison/mess) "klf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair{ @@ -30612,7 +30631,6 @@ "kZo" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, /obj/effect/spawner/random/trash, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -32657,6 +32675,12 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/carpet/donk, /area/station/command/heads_quarters/qm) +"lHi" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/iron/kitchen/small, +/area/station/security/prison/mess) "lHk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35810,10 +35834,7 @@ location = "QM #1" }, /obj/effect/turf_decal/delivery, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/storage) "mKD" = ( @@ -36537,7 +36558,7 @@ /obj/machinery/camera/autoname/directional/north, /obj/machinery/light/small/directional/north, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "mYT" = ( /obj/structure/table, /obj/item/assembly/igniter{ @@ -39810,7 +39831,7 @@ /area/station/security/checkpoint/customs) "ohO" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/light/small/directional/east, /turf/open/floor/carpet/red, /area/station/commons/dorms) @@ -40239,7 +40260,7 @@ }, /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "oqI" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -43253,7 +43274,7 @@ }, /obj/machinery/airalarm/directional/north, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "pug" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -44153,7 +44174,7 @@ /obj/structure/flora/bush/sunny/style_random, /obj/machinery/newscaster/directional/south, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "pHQ" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -44435,7 +44456,7 @@ dir = 9 }, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "pMr" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance/two, @@ -44452,7 +44473,7 @@ dir = 1 }, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "pMA" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/catwalk_floor/iron_dark, @@ -45267,7 +45288,7 @@ /obj/structure/flora/bush/flowers_yw/style_random, /obj/effect/landmark/start/hangover, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "pYG" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -45338,9 +45359,11 @@ /area/station/cargo/storage) "qaA" = ( /obj/structure/disposalpipe/segment, -/obj/structure/flora/bush/flowers_br/style_random, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/service/chapel) "qaH" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/dark_red/corner{ @@ -45401,8 +45424,11 @@ "qbr" = ( /obj/structure/flora/bush/flowers_pp/style_random, /obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "qbw" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -46044,19 +46070,13 @@ /area/station/maintenance/starboard/greater) "qkv" = ( /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, /obj/machinery/light/floor, /turf/open/floor/wood/large, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "qkw" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, /obj/machinery/light/floor, /turf/open/floor/wood/large, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "qkF" = ( /turf/open/floor/iron, /area/station/commons) @@ -46626,10 +46646,10 @@ /area/station/maintenance/aft) "quJ" = ( /obj/effect/turf_decal/siding/wood, -/obj/structure/flora/tree/stump, /obj/machinery/light/small/directional/south, +/obj/structure/flora/tree/jungle/small/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "quS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47124,15 +47144,11 @@ }, /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "qCi" = ( /obj/structure/disposalpipe/segment, -/obj/structure/chair/sofa/bamboo/right{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, /turf/open/floor/wood/large, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "qCq" = ( /obj/structure/cable, /obj/structure/window/reinforced/spawner/directional/north, @@ -47163,12 +47179,8 @@ /turf/open/floor/iron/large, /area/station/command/heads_quarters/hop) "qCR" = ( -/obj/structure/chair/sofa/bamboo/left{ - dir = 4 - }, -/obj/effect/landmark/start/assistant, /turf/open/floor/wood/large, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "qCU" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/table/reinforced, @@ -47804,6 +47816,11 @@ }, /turf/open/floor/plating, /area/station/commons/storage/tools) +"qOp" = ( +/obj/structure/table/wood, +/obj/item/book/bible, +/turf/open/floor/wood/large, +/area/station/service/chapel) "qOt" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -48546,7 +48563,7 @@ dir = 4 }, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "qZG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/corner/directional/south, @@ -48595,7 +48612,7 @@ "ram" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood/large, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "raz" = ( /obj/machinery/door/airlock/public/glass{ name = "Lavatorie" @@ -48605,12 +48622,12 @@ /area/station/commons/toilet/restrooms) "raC" = ( /obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/assistant, /obj/structure/chair/sofa/bamboo/left{ - dir = 8 + dir = 1 }, -/obj/effect/landmark/start/assistant, /turf/open/floor/wood/large, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "raE" = ( /obj/machinery/duct, /turf/open/floor/iron, @@ -48630,16 +48647,16 @@ /turf/open/floor/iron, /area/station/hallway/secondary/dock) "raX" = ( +/obj/effect/landmark/start/assistant, /obj/structure/chair/sofa/bamboo/right{ - dir = 4 + dir = 1 }, -/obj/effect/landmark/start/chaplain, /turf/open/floor/wood/large, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "rba" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood/large, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "rbc" = ( /obj/structure/transport/linear/tram, /obj/structure/tram, @@ -48655,7 +48672,7 @@ }, /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "rbo" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, @@ -49398,7 +49415,9 @@ /area/station/maintenance/port/lesser) "row" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/plumbed, +/obj/structure/reagent_dispensers/plumbed{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/central/greater) "roz" = ( @@ -50058,7 +50077,7 @@ dir = 5 }, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "ryt" = ( /obj/machinery/light/dim/directional/north, /obj/effect/turf_decal/tile/neutral{ @@ -50101,10 +50120,9 @@ /area/station/science/breakroom) "rzu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/wood, /obj/machinery/light/floor, /turf/open/floor/wood/large, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "rzG" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/dark_red/half/contrasted{ @@ -50148,7 +50166,7 @@ dir = 9 }, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "rAg" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -50918,7 +50936,7 @@ /obj/effect/turf_decal/siding/wood/corner, /obj/structure/flora/tree/jungle/small/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "rMa" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -52059,7 +52077,7 @@ dir = 4 }, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "sdm" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -53387,9 +53405,8 @@ /area/station/security/warden) "syv" = ( /obj/structure/disposalpipe/segment, -/obj/structure/flora/tree/jungle/small/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "syx" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -53415,7 +53432,7 @@ "syG" = ( /obj/effect/spawner/xmastree, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "syN" = ( /obj/effect/spawner/random/trash, /turf/open/floor/plating, @@ -53441,7 +53458,7 @@ "szy" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "szz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54144,7 +54161,7 @@ }, /obj/effect/decal/cleanable/cobweb, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "sMq" = ( /obj/machinery/light/warm/directional/west, /turf/open/floor/iron, @@ -54878,14 +54895,14 @@ dir = 4 }, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "sYK" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 }, /obj/structure/flora/bush/sunny/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "sZn" = ( /obj/structure/table, /obj/effect/turf_decal/siding/wood{ @@ -55120,7 +55137,7 @@ /obj/effect/turf_decal/siding/wood, /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "tdh" = ( /obj/structure/chair/sofa/corp/right{ dir = 4 @@ -56410,7 +56427,7 @@ "tzJ" = ( /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "tAq" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -56576,7 +56593,7 @@ }, /obj/machinery/light/directional/east, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "tCm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/red{ @@ -56735,7 +56752,7 @@ }, /obj/machinery/light/small/directional/east, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "tEW" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -57569,7 +57586,7 @@ /obj/structure/flora/bush/flowers_pp/style_random, /obj/machinery/firealarm/directional/east, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "tTR" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, @@ -58004,7 +58021,7 @@ dir = 6 }, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "uab" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58023,7 +58040,7 @@ }, /obj/structure/flora/tree/stump, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "uax" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58039,7 +58056,7 @@ }, /obj/structure/flora/tree/jungle/small/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "uaP" = ( /obj/structure/mirror/directional/east, /obj/structure/chair/stool/bar/directional/east, @@ -59109,7 +59126,7 @@ /obj/structure/flora/bush/flowers_yw/style_random, /obj/machinery/light/small/directional/east, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "utD" = ( /obj/machinery/light_switch/directional/west, /obj/effect/turf_decal/stripes/corner{ @@ -60497,7 +60514,7 @@ /obj/structure/flora/tree/jungle/small/style_random, /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "uSi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60526,8 +60543,13 @@ /turf/open/floor/iron, /area/station/science/lower) "uSC" = ( -/turf/closed/wall/mineral/wood/nonmetal, -/area/station/service/hydroponics/garden/monastery) +/obj/effect/landmark/start/assistant, +/obj/effect/landmark/start/assistant, +/obj/structure/chair/sofa/bamboo/left{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/service/chapel) "uSG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60855,11 +60877,9 @@ /turf/closed/wall, /area/station/science/lower) "uXN" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, +/obj/structure/altar_of_gods, /turf/open/floor/wood/large, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "uXU" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, @@ -61170,6 +61190,21 @@ dir = 1 }, /area/station/command/heads_quarters/hop) +"vdl" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/door/directional/east{ + id = "qm_warehouse_aft"; + name = "Warehouse Door Control"; + pixel_x = -24; + pixel_y = -23; + req_access = list("cargo") + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "vdm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/pile/directional/east, @@ -61598,15 +61633,14 @@ /area/station/engineering/atmos) "vkz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/large, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "vkG" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 }, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "vkJ" = ( /obj/item/book/manual/wiki/security_space_law{ pixel_x = 9; @@ -62657,7 +62691,7 @@ dir = 8 }, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "vzV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62668,13 +62702,18 @@ /area/station/security/tram) "vzW" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/sofa/bamboo/left{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/service/chapel) "vzX" = ( /obj/machinery/door/airlock/command{ name = "Centcom Dock" }, -/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/effect/mapping_helpers/airlock/access/any/command/general, +/obj/effect/mapping_helpers/airlock/access/any/admin/general, /turf/open/floor/iron/textured_half, /area/station/command/corporate_dock) "vzY" = ( @@ -62728,8 +62767,12 @@ /area/station/security/tram) "vAA" = ( /obj/effect/landmark/start/hangover, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/sofa/bamboo/left{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/service/chapel) "vAC" = ( /obj/structure/flora/bush/large/style_random{ pixel_y = -3 @@ -62755,8 +62798,11 @@ "vAR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "vAT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62890,6 +62936,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, +/obj/machinery/duct, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) "vEe" = ( @@ -63774,7 +63821,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "vSL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral{ @@ -63798,7 +63845,7 @@ "vSX" = ( /obj/structure/flora/bush/sunny/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "vSY" = ( /obj/structure/table, /obj/item/chisel{ @@ -64886,7 +64933,7 @@ }, /obj/structure/flora/bush/sunny/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "wjM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -64978,7 +65025,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/siding/wood, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "wlJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64997,7 +65044,7 @@ /obj/effect/turf_decal/siding/wood, /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "wme" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -65168,7 +65215,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/wood, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "woD" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -66400,10 +66447,11 @@ }, /area/station/science/xenobiology) "wIm" = ( -/obj/effect/mapping_helpers/airlock/access/all/command/general, /obj/machinery/door/airlock/hatch{ name = "Centcom Dock" }, +/obj/effect/mapping_helpers/airlock/access/any/command/general, +/obj/effect/mapping_helpers/airlock/access/any/admin/general, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) "wIp" = ( @@ -67345,7 +67393,7 @@ /obj/structure/flora/bush/flowers_pp/style_random, /obj/effect/landmark/event_spawn, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "wWc" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -68867,7 +68915,7 @@ }, /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "xpU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -70066,7 +70114,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/machinery/light/small/directional/west, @@ -70750,7 +70798,7 @@ "xPR" = ( /obj/structure/flora/tree/jungle/small/style_random, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "xPW" = ( /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/wood/parquet, @@ -70978,7 +71026,7 @@ "xRZ" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "xSe" = ( /obj/structure/table/glass, /obj/structure/microscope, @@ -71498,7 +71546,7 @@ /area/station/maintenance/starboard/greater) "xYD" = ( /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "xYE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -71639,8 +71687,11 @@ /turf/open/floor/stone, /area/station/command/heads_quarters/hos) "yaG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, /turf/open/floor/wood/large, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "yaI" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -72339,7 +72390,7 @@ dir = 1 }, /turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) +/area/station/service/chapel) "yjE" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/engine) @@ -84949,12 +85000,12 @@ mhk mhk mhk csp -xYD +qZB uaa -yaG +qCR ram ryp -xYD +qZB xYD xRZ wBm @@ -85463,12 +85514,12 @@ rYD mhk jrZ xYD -xYD +jEU uXN -uSC -uSC +qCR +raX vkz -xYD +agF syG pHN wAW @@ -85720,9 +85771,9 @@ pbu mhk mYS xYD -xPR -uXN -uSC +yaG +qOp +qCR uSC vkz vAA @@ -85977,12 +86028,12 @@ xLO mhk ptZ sYF -tzJ +yaG qkw qCR raX rzu -xYD +agF xYD wlQ wBm @@ -86236,7 +86287,7 @@ mhk oqE qbr hNT -yaG +qCR rba rAb vAR @@ -88522,7 +88573,7 @@ pJQ wZF pqv wZF -sxA +vdl slY ueX rVQ @@ -89939,7 +89990,7 @@ qeP lrE oPV pId -ect +kld qRM vSx eGL @@ -90195,7 +90246,7 @@ uPr qeP lrE oPV -cgb +eHf vEb eHf qsR @@ -90453,7 +90504,7 @@ lub tBA oPV iNz -jDe +lHi jDe tSB eGL @@ -110114,7 +110165,7 @@ aJN tIE nFW iSW -rdh +fRZ liR jQL uwH diff --git a/_maps/map_files/Deathmatch/Maint_Mania.dmm b/_maps/map_files/Deathmatch/Maint_Mania.dmm new file mode 100644 index 0000000000000..ec04776ae8325 --- /dev/null +++ b/_maps/map_files/Deathmatch/Maint_Mania.dmm @@ -0,0 +1,1499 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aD" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"aP" = ( +/obj/machinery/door/airlock/centcom, +/turf/open/space/basic, +/area/deathmatch) +"bI" = ( +/obj/machinery/light/no_nightlight/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"cn" = ( +/turf/open/indestructible, +/area/deathmatch) +"cx" = ( +/obj/machinery/vending/wallmed/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"cy" = ( +/obj/structure/table/reinforced/ctf, +/obj/item/gun/ballistic/shotgun/riot, +/turf/open/indestructible, +/area/deathmatch) +"eX" = ( +/obj/item/ammo_casing/shotgun/frag12, +/turf/open/indestructible, +/area/deathmatch) +"fh" = ( +/obj/structure/table/reinforced/ctf, +/obj/item/storage/backpack/duffelbag/syndie/ammo, +/turf/open/indestructible, +/area/deathmatch) +"ga" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/template_noop) +"gJ" = ( +/obj/item/ammo_casing/shotgun/stunslug, +/turf/open/indestructible, +/area/deathmatch) +"ho" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/turf/open/floor/plating, +/area/deathmatch) +"hB" = ( +/turf/closed/indestructible/fakedoor, +/area/deathmatch) +"hN" = ( +/obj/structure/lattice, +/obj/effect/decal/cleanable/dirt/dust, +/turf/template_noop, +/area/template_noop) +"ih" = ( +/obj/item/reagent_containers/pill/maintenance, +/turf/open/indestructible, +/area/deathmatch) +"iC" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"jc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible, +/area/deathmatch) +"jX" = ( +/obj/machinery/light/small/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"jY" = ( +/obj/item/stack/medical/gauze{ + amount = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"ka" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible, +/area/deathmatch) +"kp" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"kx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"lA" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"lJ" = ( +/obj/item/crowbar, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"lN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/indestructible, +/area/deathmatch) +"mS" = ( +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/indestructible, +/area/deathmatch) +"mZ" = ( +/obj/structure/grille, +/turf/open/indestructible, +/area/deathmatch) +"nQ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"nS" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/indestructible, +/area/deathmatch) +"pT" = ( +/obj/structure/rack, +/obj/item/grenade/chem_grenade/cleaner, +/turf/open/indestructible, +/area/deathmatch) +"pZ" = ( +/obj/structure/sign/poster/random/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"qK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/pill/maintenance, +/turf/open/indestructible, +/area/deathmatch) +"sk" = ( +/obj/structure/sign/poster/random/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"sl" = ( +/obj/machinery/door/airlock/public/glass, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/indestructible, +/area/deathmatch) +"sF" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"sV" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"sX" = ( +/obj/structure/rack, +/obj/machinery/light/small/directional/north, +/obj/item/reagent_containers/cup/soda_cans/lemon_lime, +/turf/open/indestructible, +/area/deathmatch) +"tT" = ( +/obj/structure/rack, +/obj/item/stack/cable_coil, +/obj/item/assembly/igniter, +/turf/open/indestructible, +/area/deathmatch) +"ur" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"vB" = ( +/obj/machinery/light/small/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"wi" = ( +/obj/item/screwdriver, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"wC" = ( +/obj/item/weldingtool, +/obj/structure/rack, +/obj/item/flashlight/flare, +/turf/open/indestructible, +/area/deathmatch) +"zd" = ( +/obj/machinery/vending/medical{ + desc = "Go on, smash this vending machine. You want free healing right? Do it." + }, +/turf/open/indestructible, +/area/deathmatch) +"zF" = ( +/obj/item/ammo_casing/shotgun/improvised, +/turf/open/indestructible, +/area/deathmatch) +"AG" = ( +/obj/structure/lattice/catwalk, +/obj/item/storage/toolbox/mechanical/old/clean{ + desc = "An old, blue toolbox, it looks soulful." + }, +/turf/open/space/basic, +/area/template_noop) +"Bs" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"BU" = ( +/obj/item/chainsaw, +/turf/open/indestructible, +/area/deathmatch) +"BV" = ( +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"Dh" = ( +/obj/structure/lattice/catwalk, +/obj/effect/mob_spawn/corpse/human/engineer/mod, +/turf/template_noop, +/area/template_noop) +"Dt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Er" = ( +/obj/item/clothing/head/utility/welding, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"Ew" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/reagent_containers/pill/maintenance, +/turf/open/indestructible, +/area/deathmatch) +"EK" = ( +/obj/machinery/light/small/directional/south, +/turf/open/indestructible, +/area/deathmatch) +"EN" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/bot, +/turf/open/indestructible, +/area/deathmatch) +"EW" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"Fp" = ( +/obj/structure/rack, +/obj/item/reagent_containers/pill/maintenance, +/obj/item/spear, +/turf/open/indestructible, +/area/deathmatch) +"FH" = ( +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/indestructible, +/area/deathmatch) +"FL" = ( +/turf/template_noop, +/area/template_noop) +"Gi" = ( +/obj/effect/decal/cleanable/blood/gibs/limb, +/turf/open/indestructible, +/area/deathmatch) +"GA" = ( +/obj/item/stack/medical/mesh{ + amount = 4 + }, +/obj/item/spear, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"GF" = ( +/obj/machinery/light/small/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"Hd" = ( +/obj/machinery/light/small/directional/north, +/obj/item/soap/nanotrasen, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"Hp" = ( +/obj/item/reagent_containers/pill/maintenance, +/obj/structure/sign/poster/random/directional/north, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"HE" = ( +/obj/structure/lattice/catwalk, +/obj/structure/statue/sandstone/assistant, +/turf/template_noop, +/area/template_noop) +"Ij" = ( +/turf/open/space/basic, +/area/template_noop) +"It" = ( +/obj/item/gun/ballistic/rifle/boltaction/pipegun/prime, +/obj/effect/turf_decal/box, +/turf/open/indestructible, +/area/deathmatch) +"Kt" = ( +/obj/structure/table/reinforced/ctf, +/obj/item/weldingtool, +/turf/open/indestructible, +/area/deathmatch) +"KW" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/bot, +/turf/open/indestructible, +/area/deathmatch) +"La" = ( +/obj/structure/sign/poster/random/directional/south, +/obj/item/flashlight/flare, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"LJ" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/bot, +/turf/open/indestructible, +/area/deathmatch) +"Mt" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"MC" = ( +/obj/effect/mob_spawn/corpse/human/assistant, +/turf/template_noop, +/area/template_noop) +"Na" = ( +/obj/structure/rack, +/obj/item/reagent_containers/cup/soda_cans/starkist, +/turf/open/indestructible, +/area/deathmatch) +"Ns" = ( +/obj/item/stack/cable_coil, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"NO" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"NU" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible, +/area/deathmatch) +"NY" = ( +/obj/item/screwdriver, +/turf/open/indestructible, +/area/deathmatch) +"Ok" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/indestructible, +/area/deathmatch) +"Om" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/random/directional/south, +/turf/open/indestructible, +/area/deathmatch) +"OA" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/indestructible, +/area/deathmatch) +"OO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks, +/obj/structure/sign/poster/random/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"OR" = ( +/obj/item/stack/medical/suture{ + amount = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"Pp" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"PW" = ( +/obj/effect/decal/cleanable/blood/gibs/torso, +/turf/open/indestructible, +/area/deathmatch) +"Qr" = ( +/obj/structure/closet/wardrobe, +/turf/open/floor/plating/airless, +/area/template_noop) +"QN" = ( +/obj/item/razor, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"QQ" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/turf_decal/box, +/turf/open/indestructible, +/area/deathmatch) +"Rm" = ( +/obj/item/weldingtool, +/obj/structure/rack, +/turf/open/indestructible, +/area/deathmatch) +"Su" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/box, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"SN" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/indestructible, +/area/deathmatch) +"Tu" = ( +/obj/machinery/light/small/directional/north, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"TB" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"TP" = ( +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/door/airlock/public/glass, +/turf/open/indestructible, +/area/deathmatch) +"Un" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/indestructible, +/area/deathmatch) +"Vb" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/indestructible, +/area/deathmatch) +"Xb" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"XC" = ( +/obj/item/assembly/igniter, +/turf/open/indestructible, +/area/deathmatch) +"XD" = ( +/obj/item/holosign_creator/security, +/obj/machinery/light/small/directional/south, +/turf/open/indestructible, +/area/deathmatch) + +(1,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +ur +FL +FL +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +"} +(2,1,1) = {" +FL +FL +FL +FL +ur +ur +hN +ur +ur +ur +ur +ur +ur +ur +HE +ur +ur +ur +ur +ur +ur +ur +ur +ur +ur +ur +FL +FL +FL +"} +(3,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +ur +FL +FL +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +"} +(4,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +ur +FL +FL +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +"} +(5,1,1) = {" +FL +FL +FL +FL +FL +aD +aD +aD +aD +aD +aD +ho +ho +ho +ho +ho +ho +ho +aD +aD +aD +aD +aD +aD +aD +FL +FL +FL +FL +"} +(6,1,1) = {" +FL +FL +FL +FL +FL +aD +cn +lN +cn +pZ +nQ +zF +zF +zF +It +zF +zF +zF +jc +cn +sk +nQ +mS +cn +aD +FL +FL +FL +FL +"} +(7,1,1) = {" +FL +FL +FL +FL +FL +aD +iC +aD +aD +aD +aD +aD +aD +BV +lJ +Ns +aD +aD +aD +aD +aD +aD +aD +Tu +aD +FL +FL +FL +FL +"} +(8,1,1) = {" +FL +FL +FL +FL +FL +aD +cn +mS +nQ +cn +cn +cn +cn +cn +jc +cn +NO +cn +cn +nQ +cn +ih +mS +cn +aD +FL +FL +FL +FL +"} +(9,1,1) = {" +FL +FL +FL +FL +FL +aD +ho +aD +aD +aD +sX +cn +EN +mZ +EN +cn +EK +aD +aD +mZ +aD +aD +aD +TP +aD +FL +FL +FL +FL +"} +(10,1,1) = {" +FL +FL +FL +FL +FL +aD +Ew +mS +Mt +nQ +sk +cn +mZ +GA +mZ +cn +NU +OA +OO +EW +OA +OA +SN +Un +aD +FL +FL +FL +FL +"} +(11,1,1) = {" +FL +FL +FL +FL +FL +aD +cn +aD +aD +aD +aD +aD +aD +aD +aD +aD +nQ +aD +aD +ho +ho +aD +aD +Vb +hB +ur +Dh +FL +FL +"} +(12,1,1) = {" +aD +aD +aD +aD +aD +aD +jX +aD +Ij +Ij +Ij +ga +Ij +Ij +Ij +aD +NY +aD +TB +cn +cn +Rm +aD +Xb +aD +FL +FL +FL +FL +"} +(13,1,1) = {" +aD +bI +cy +cy +cn +ho +jY +ho +Ij +Ij +Ij +AG +Ij +Ij +Ij +ho +Ok +aD +jX +jc +cn +EK +aD +jc +aD +FL +FL +FL +FL +"} +(14,1,1) = {" +aP +cn +cn +cn +gJ +ho +ka +aD +Ij +Ij +Ij +ga +Ij +Ij +Ij +aD +jc +aD +jY +PW +nQ +cn +aD +jX +aD +FL +FL +FL +FL +"} +(15,1,1) = {" +aD +cn +cn +cn +cn +aD +kp +aD +aD +aD +aD +aD +aD +aD +aD +aD +cn +aD +sl +aD +QN +BV +aD +ih +aD +FL +FL +FL +FL +"} +(16,1,1) = {" +aD +cx +cn +cn +cn +hB +kx +mZ +cn +sk +cn +Bs +cn +cn +cn +pZ +cn +cn +nQ +cn +QQ +Su +aD +cn +aD +FL +FL +ur +FL +"} +(17,1,1) = {" +aD +cn +eX +cn +cn +aD +lA +aD +ih +aD +tT +cn +EN +aD +aD +aD +cn +aD +EN +cn +cn +cn +cn +nQ +aD +ur +ur +ur +ur +"} +(18,1,1) = {" +aP +cn +cn +cn +cn +ho +cn +aD +cn +aD +aD +aD +aD +aD +sV +GF +cn +aD +aD +ho +ho +aD +aD +Mt +aD +FL +FL +ur +FL +"} +(19,1,1) = {" +aD +bI +fh +fh +cn +ho +cn +cn +cn +hB +vB +BU +Fp +aD +Kt +cn +Om +aD +Ij +ga +Ij +Ij +aD +mZ +aD +FL +FL +ur +FL +"} +(20,1,1) = {" +aD +aD +aD +aD +aD +aD +lJ +aD +nQ +aD +aD +BV +aD +aD +KW +cn +cn +ho +ga +Qr +ga +Ij +ho +cn +ho +FL +FL +ur +FL +"} +(21,1,1) = {" +FL +FL +FL +FL +FL +aD +aD +aD +cn +aD +Mt +Dt +cn +aD +aD +aD +cn +ho +Ij +Ij +ga +ga +ho +nQ +ho +FL +FL +ur +MC +"} +(22,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +aD +cn +sl +cn +cn +FH +GF +La +aD +cn +aD +Ij +Ij +ga +Ij +aD +XC +aD +FL +FL +ur +FL +"} +(23,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +aD +cn +aD +jX +cn +cn +nQ +LJ +mZ +Mt +aD +aD +ho +ho +aD +aD +cn +aD +FL +FL +ur +FL +"} +(24,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +aD +nS +aD +wi +Er +Gi +cn +Na +aD +jX +jc +jc +cn +qK +cn +sk +XD +aD +ur +ur +ur +ur +"} +(25,1,1) = {" +FL +FL +FL +FL +ur +ur +ur +aD +cn +aD +aD +aD +aD +sl +aD +aD +cn +aD +sl +aD +aD +aD +aD +aD +aD +FL +FL +ur +FL +"} +(26,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +ho +cn +cn +pZ +nQ +cn +cn +cn +cn +cn +aD +OR +aD +FL +FL +FL +ur +FL +FL +FL +ur +FL +"} +(27,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +ho +pT +sF +Mt +mZ +aD +aD +mZ +aD +aD +aD +Pp +aD +FL +FL +FL +ur +FL +FL +FL +ur +FL +"} +(28,1,1) = {" +FL +FL +FL +FL +ur +ur +ur +aD +aD +aD +cn +cn +aD +Hd +nQ +cn +cn +cn +cn +ho +FL +FL +FL +ur +FL +FL +FL +ur +FL +"} +(29,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +FL +FL +aD +wC +EK +aD +Hp +cn +aD +aD +ho +aD +aD +FL +FL +FL +ur +FL +FL +FL +ur +FL +"} +(30,1,1) = {" +FL +FL +FL +FL +FL +FL +FL +FL +FL +aD +zd +nQ +aD +EN +cn +ho +FL +FL +FL +ur +FL +FL +FL +ur +FL +FL +FL +ur +FL +"} +(31,1,1) = {" +FL +FL +FL +FL +FL +FL +FL +FL +FL +aD +mZ +cn +cn +jc +cn +aD +FL +FL +FL +ur +FL +FL +FL +ur +FL +FL +FL +ur +FL +"} +(32,1,1) = {" +FL +FL +FL +FL +FL +FL +FL +FL +FL +aD +aD +ho +ho +ho +aD +aD +ur +ur +ur +ur +ur +ur +ur +ur +ur +ur +ur +ur +ur +"} +(33,1,1) = {" +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +ur +FL +FL +FL +ur +FL +FL +FL +ur +FL +"} diff --git a/_maps/map_files/Deathmatch/OSHA_Violator.dmm b/_maps/map_files/Deathmatch/OSHA_Violator.dmm new file mode 100644 index 0000000000000..fc8291d181449 --- /dev/null +++ b/_maps/map_files/Deathmatch/OSHA_Violator.dmm @@ -0,0 +1,2168 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ac" = ( +/obj/structure/closet/crate/medical, +/turf/open/space/basic, +/area/template_noop) +"ae" = ( +/obj/effect/mob_spawn/corpse/human/cargo_tech, +/turf/open/space/basic, +/area/template_noop) +"ai" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"aE" = ( +/turf/closed/indestructible/fakedoor, +/area/deathmatch) +"bl" = ( +/turf/closed/indestructible/fakeglass, +/area/deathmatch) +"bW" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/turf/open/indestructible, +/area/deathmatch) +"cA" = ( +/turf/open/indestructible, +/area/deathmatch) +"cR" = ( +/obj/machinery/field/generator/starts_on, +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"do" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/indestructible, +/area/deathmatch) +"dt" = ( +/obj/machinery/light/no_nightlight/directional/north, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/field/generator/starts_on, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"dy" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/turf_decal/stripes/line, +/turf/open/indestructible, +/area/deathmatch) +"er" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"fH" = ( +/obj/machinery/light/no_nightlight/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"fN" = ( +/obj/structure/sign/directions/engineering, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"gd" = ( +/obj/machinery/power/energy_accumulator/grounding_rod/anchored, +/turf/open/indestructible, +/area/deathmatch) +"go" = ( +/obj/machinery/power/energy_accumulator/grounding_rod/anchored, +/obj/machinery/light/red/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"gC" = ( +/obj/machinery/power/emitter/energycannon, +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"gG" = ( +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"gN" = ( +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"gU" = ( +/obj/structure/cable, +/obj/machinery/conveyor/auto/inverted{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"hj" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"hR" = ( +/obj/structure/cable, +/obj/machinery/conveyor/auto/inverted{ + dir = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"hU" = ( +/obj/machinery/light/no_nightlight/directional/east, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"ig" = ( +/obj/structure/cable, +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"iE" = ( +/obj/structure/cable, +/obj/effect/turf_decal/loading_area, +/turf/open/indestructible, +/area/deathmatch) +"je" = ( +/turf/open/space/basic, +/area/template_noop) +"jn" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/cable, +/turf/open/floor/plating, +/area/deathmatch) +"jC" = ( +/obj/structure/cable, +/obj/structure/sign/poster/official/random/directional/east, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"kh" = ( +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/indestructible, +/area/deathmatch) +"kB" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"kP" = ( +/obj/machinery/conveyor/auto, +/turf/open/indestructible, +/area/deathmatch) +"lu" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"ly" = ( +/obj/machinery/conveyor/auto/inverted{ + dir = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"lU" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"mg" = ( +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"mj" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/indestructible, +/area/deathmatch) +"mw" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/structure/closet, +/obj/item/soap/nanotrasen, +/turf/open/indestructible, +/area/deathmatch) +"mK" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/machinery/conveyor/auto/inverted{ + dir = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"mO" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/deathmatch) +"np" = ( +/obj/structure/reflector/double/mapping{ + dir = 6 + }, +/obj/effect/turf_decal/bot/left, +/turf/open/indestructible, +/area/deathmatch) +"nV" = ( +/obj/item/stack/cable_coil, +/turf/open/indestructible, +/area/deathmatch) +"or" = ( +/obj/machinery/conveyor/auto, +/obj/structure/closet/firecloset, +/turf/open/indestructible, +/area/deathmatch) +"oT" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/indestructible, +/area/deathmatch) +"pe" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/clothing/glasses/meson/engine/tray, +/turf/open/indestructible, +/area/deathmatch) +"pf" = ( +/obj/structure/reflector/single/mapping{ + dir = 10 + }, +/obj/effect/turf_decal/bot/left, +/turf/open/indestructible, +/area/deathmatch) +"pO" = ( +/obj/structure/table/reinforced, +/obj/item/assembly/prox_sensor, +/turf/open/indestructible, +/area/deathmatch) +"qn" = ( +/obj/structure/reflector/single/mapping{ + dir = 6 + }, +/obj/effect/turf_decal/bot/left, +/turf/open/indestructible, +/area/deathmatch) +"qo" = ( +/obj/structure/cable, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/indestructible, +/area/deathmatch) +"rz" = ( +/obj/machinery/power/emitter/energycannon{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"sa" = ( +/turf/cordon, +/area/template_noop) +"sb" = ( +/obj/structure/frame/machine/secured, +/turf/open/indestructible, +/area/deathmatch) +"sp" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"sx" = ( +/obj/item/clothing/suit/hazardvest, +/turf/open/indestructible, +/area/deathmatch) +"sP" = ( +/obj/item/stack/rods/fifty, +/obj/structure/rack, +/turf/open/indestructible, +/area/deathmatch) +"sX" = ( +/obj/machinery/conveyor/auto, +/obj/item/stack/sheet/cardboard, +/turf/open/indestructible, +/area/deathmatch) +"sZ" = ( +/obj/structure/cable, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"ta" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/utility/welding, +/turf/open/indestructible, +/area/deathmatch) +"tc" = ( +/obj/machinery/light/red/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"th" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"tT" = ( +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/structure/disposaloutlet{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"tU" = ( +/obj/item/storage/toolbox/drone{ + pixel_y = 5 + }, +/obj/item/storage/toolbox/electrical, +/obj/structure/rack, +/obj/item/crowbar, +/turf/open/indestructible, +/area/deathmatch) +"ub" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/machinery/light/no_nightlight/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"uv" = ( +/obj/structure/table/reinforced, +/obj/item/weldingtool/largetank, +/turf/open/indestructible, +/area/deathmatch) +"uY" = ( +/obj/structure/closet/crate/engineering, +/turf/open/indestructible, +/area/deathmatch) +"vD" = ( +/obj/machinery/power/energy_accumulator/tesla_coil/anchored, +/turf/open/indestructible, +/area/deathmatch) +"vG" = ( +/obj/item/tank/internals/plasma/full, +/obj/structure/rack, +/turf/open/indestructible, +/area/deathmatch) +"vK" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"vT" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/indestructible, +/area/deathmatch) +"wb" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"wy" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"wI" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"wK" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"wL" = ( +/obj/machinery/conveyor/auto, +/obj/item/shard, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"xa" = ( +/obj/machinery/conveyor/auto, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"xg" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"xj" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"xs" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/crowbar/red, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"xF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"xN" = ( +/obj/structure/rack, +/obj/item/wrench, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"xW" = ( +/obj/structure/reflector/single/mapping{ + dir = 9 + }, +/obj/effect/turf_decal/bot/left, +/turf/open/indestructible, +/area/deathmatch) +"xY" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/indestructible, +/area/deathmatch) +"yj" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/closet, +/obj/item/toy/crayon/spraycan, +/turf/open/indestructible, +/area/deathmatch) +"yo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"ys" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"yB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"yW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"yX" = ( +/obj/structure/reflector/single/mapping{ + dir = 5 + }, +/obj/effect/turf_decal/bot/left, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"yY" = ( +/obj/structure/reflector/single/mapping{ + dir = 9 + }, +/obj/effect/turf_decal/bot/left, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"zb" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/hemostat/supermatter, +/turf/open/indestructible, +/area/deathmatch) +"zj" = ( +/obj/machinery/disposal/delivery_chute, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"zl" = ( +/obj/machinery/button/door/directional/north{ + id = "deathmatch_shutter_1"; + name = "Water Vapour Shutter" + }, +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/meson/engine/tray, +/turf/open/indestructible, +/area/deathmatch) +"zw" = ( +/obj/item/kirbyplants, +/obj/machinery/light/no_nightlight/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"zL" = ( +/obj/structure/rack, +/obj/item/extinguisher/mini, +/turf/open/indestructible, +/area/deathmatch) +"Aa" = ( +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/indestructible, +/area/deathmatch) +"Am" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Room" + }, +/turf/open/indestructible, +/area/deathmatch) +"Ax" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"AF" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"AZ" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"Bf" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/plating, +/area/deathmatch) +"Bv" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/field/generator/starts_on, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"CC" = ( +/obj/machinery/vending/engineering, +/turf/open/indestructible, +/area/deathmatch) +"CH" = ( +/obj/structure/reflector/single/mapping{ + dir = 5 + }, +/obj/effect/turf_decal/bot/left, +/turf/open/indestructible, +/area/deathmatch) +"CI" = ( +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"CR" = ( +/obj/machinery/conveyor/auto, +/obj/structure/closet/crate, +/obj/item/toy/spinningtoy, +/turf/open/indestructible, +/area/deathmatch) +"DY" = ( +/obj/structure/cable, +/obj/machinery/power/rtg/advanced{ + power_gen = 50000 + }, +/turf/open/indestructible, +/area/deathmatch) +"Ea" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Eb" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/nuke_core_container/supermatter, +/obj/machinery/light/no_nightlight/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"Ec" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "deathmatch_shutter_2" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/bot, +/turf/open/indestructible, +/area/deathmatch) +"Em" = ( +/obj/structure/chair/comfy/black, +/turf/open/indestructible, +/area/deathmatch) +"EY" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Control Room" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/turf/open/indestructible, +/area/deathmatch) +"Fd" = ( +/obj/structure/reflector/box/mapping{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/turf/open/indestructible, +/area/deathmatch) +"Fv" = ( +/obj/machinery/power/supermatter_crystal/hugbox, +/turf/open/indestructible, +/area/deathmatch) +"FM" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"FV" = ( +/obj/structure/cable, +/obj/machinery/light/no_nightlight/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"Gq" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/no_nightlight/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"Gx" = ( +/obj/machinery/conveyor/auto, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Gz" = ( +/obj/machinery/conveyor/auto, +/obj/item/multitool, +/turf/open/indestructible, +/area/deathmatch) +"GB" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/tank/internals/oxygen, +/turf/open/indestructible, +/area/deathmatch) +"GH" = ( +/obj/structure/reflector/single/mapping{ + dir = 6 + }, +/obj/effect/turf_decal/bot/right, +/turf/open/indestructible, +/area/deathmatch) +"GP" = ( +/obj/structure/reflector/single/mapping{ + dir = 10 + }, +/obj/effect/turf_decal/bot/right, +/turf/open/indestructible, +/area/deathmatch) +"GT" = ( +/obj/structure/cable, +/obj/item/clothing/suit/hazardvest, +/turf/open/indestructible, +/area/deathmatch) +"GV" = ( +/obj/structure/cable, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"Hn" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/scalpel/supermatter, +/turf/open/indestructible, +/area/deathmatch) +"HL" = ( +/obj/item/clothing/gloves/color/yellow{ + desc = "This is it. The only reason of your existence. Grab it, put them on and enjoy your newfound godhood!" + }, +/obj/structure/rack, +/turf/open/indestructible, +/area/deathmatch) +"HP" = ( +/obj/machinery/computer/operating{ + desc = "You start to get the feeling this is the wrong operating console...."; + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"HY" = ( +/obj/structure/reflector/single/mapping{ + dir = 9 + }, +/obj/effect/turf_decal/bot/right, +/turf/open/indestructible, +/area/deathmatch) +"Js" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/pill/patch/aiuri, +/turf/open/indestructible, +/area/deathmatch) +"JF" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/indestructible, +/area/deathmatch) +"Kd" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line, +/turf/open/indestructible, +/area/deathmatch) +"KY" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"LK" = ( +/obj/structure/reflector/single/mapping{ + dir = 10 + }, +/obj/effect/turf_decal/bot/right, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"Mm" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/item/clothing/suit/armor/vest, +/turf/open/indestructible, +/area/deathmatch) +"Mp" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"Mu" = ( +/obj/structure/cable, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"My" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"MC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"MP" = ( +/obj/structure/cable, +/obj/machinery/power/floodlight, +/turf/open/indestructible, +/area/deathmatch) +"MV" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/disposaloutlet, +/turf/open/indestructible, +/area/deathmatch) +"NJ" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/delivery_chute, +/turf/open/indestructible, +/area/deathmatch) +"NY" = ( +/obj/machinery/power/emitter/energycannon{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"OL" = ( +/obj/machinery/conveyor/auto/inverted{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"Pg" = ( +/obj/machinery/field/generator/starts_on, +/obj/machinery/light/no_nightlight/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"Pu" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Px" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"QA" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"QG" = ( +/obj/structure/rack, +/obj/item/reagent_containers/cup/bucket, +/obj/item/pen, +/turf/open/indestructible, +/area/deathmatch) +"QQ" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "deathmatch_shutter_1" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/bot, +/turf/open/indestructible, +/area/deathmatch) +"Rj" = ( +/obj/machinery/portable_atmospherics/canister/water_vapor{ + desc = "You monster." + }, +/obj/machinery/button/door/directional/east{ + id = "deathmatch_shutter_2"; + name = "Supermatter Sampling Shutter" + }, +/turf/open/indestructible, +/area/deathmatch) +"Rk" = ( +/obj/effect/mob_spawn/corpse/human/assistant, +/turf/open/indestructible, +/area/deathmatch) +"Rv" = ( +/obj/structure/table/reinforced, +/obj/item/weldingtool/mini, +/turf/open/indestructible, +/area/deathmatch) +"RF" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/closet/crate, +/obj/item/stack/medical/suture{ + amount = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"Sc" = ( +/obj/structure/reflector/double/mapping{ + dir = 5 + }, +/obj/effect/turf_decal/bot/right, +/turf/open/indestructible, +/area/deathmatch) +"Sh" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/indestructible/plating, +/area/deathmatch) +"Si" = ( +/obj/item/clothing/head/utility/welding, +/turf/open/indestructible, +/area/deathmatch) +"SR" = ( +/obj/machinery/conveyor/auto, +/obj/item/tank/internals/oxygen, +/turf/open/indestructible, +/area/deathmatch) +"SW" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/closet/cardboard, +/obj/item/dualsaber/toy, +/turf/open/indestructible, +/area/deathmatch) +"Tu" = ( +/obj/structure/table/reinforced, +/obj/item/bodypart/arm/left/robot, +/turf/open/indestructible, +/area/deathmatch) +"TO" = ( +/obj/structure/reflector/single/mapping{ + dir = 5 + }, +/obj/effect/turf_decal/bot/right, +/turf/open/indestructible, +/area/deathmatch) +"TY" = ( +/obj/structure/cable, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Ue" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/mask/gas/welding/up, +/turf/open/indestructible, +/area/deathmatch) +"Uu" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/closet, +/obj/item/pizzabox/meat{ + desc = "In honor of those who fell during the infamous Pizza Riot." + }, +/turf/open/indestructible, +/area/deathmatch) +"UI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/field/generator/starts_on, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Vr" = ( +/obj/machinery/conveyor/auto/inverted{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"Vu" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"VC" = ( +/obj/machinery/conveyor/auto/inverted{ + dir = 10 + }, +/turf/open/indestructible, +/area/deathmatch) +"VG" = ( +/obj/item/wrench, +/turf/open/indestructible, +/area/deathmatch) +"WI" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/machinery/conveyor/auto/inverted{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"Xp" = ( +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/item/clothing/suit/armor/vest, +/turf/open/indestructible, +/area/deathmatch) +"XU" = ( +/obj/structure/cable, +/obj/machinery/conveyor/auto/inverted{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"Yn" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Yz" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/structure/cable, +/obj/item/clothing/glasses/meson/engine/tray, +/turf/open/indestructible, +/area/deathmatch) +"YA" = ( +/obj/structure/cable, +/turf/closed/indestructible/fakeglass, +/area/deathmatch) +"YJ" = ( +/obj/structure/cable, +/obj/machinery/conveyor/auto/inverted{ + dir = 10 + }, +/turf/open/indestructible, +/area/deathmatch) +"YU" = ( +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"YY" = ( +/obj/machinery/light/no_nightlight/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/field/generator/starts_on, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Zi" = ( +/obj/structure/sign/poster/official/random/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"Zr" = ( +/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle, +/turf/open/space/basic, +/area/template_noop) +"Zz" = ( +/obj/machinery/power/singularity_beacon/syndicate, +/turf/open/space/basic, +/area/template_noop) +"ZD" = ( +/obj/item/storage/toolbox/syndicate, +/turf/open/space/basic, +/area/template_noop) + +(1,1,1) = {" +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +"} +(2,1,1) = {" +sa +je +je +je +je +je +je +je +je +je +ai +ai +ai +ai +ai +je +je +je +je +je +je +je +je +je +sa +"} +(3,1,1) = {" +sa +je +ai +ai +fN +ai +ai +ai +ai +ai +ai +zb +Eb +Hn +ai +ai +ai +ai +je +je +je +je +je +je +sa +"} +(4,1,1) = {" +sa +je +ai +bW +cA +cA +cA +cA +tc +cA +aE +cA +cA +cA +aE +cA +cA +aE +je +je +je +je +je +je +sa +"} +(5,1,1) = {" +sa +je +ai +cA +cA +sb +cA +sb +cA +cA +er +zj +cA +cA +ai +cA +cA +aE +je +je +je +je +je +je +sa +"} +(6,1,1) = {" +sa +je +aE +cA +sb +sb +sb +sb +cA +uY +ys +ai +Ec +ai +ai +cA +cA +ai +je +je +je +je +je +je +sa +"} +(7,1,1) = {" +sa +je +aE +cA +cA +cA +cA +sb +cA +vD +ys +zl +cA +HL +ai +cA +Rk +ai +ai +ai +ai +ai +ai +je +sa +"} +(8,1,1) = {" +sa +je +ai +cA +gd +cA +cA +cA +cA +vD +ys +zw +Em +HP +ai +Pg +cA +cA +cA +cA +cA +cA +aE +je +sa +"} +(9,1,1) = {" +sa +je +ai +cA +go +kh +kh +bW +cA +vG +ys +zL +cA +Js +ai +vG +cA +bW +kh +kh +cA +cA +aE +je +sa +"} +(10,1,1) = {" +sa +je +ai +aE +ai +bl +bl +bl +aE +bl +ys +bl +EY +bl +ai +bl +aE +bl +bl +bl +ai +aE +ai +je +sa +"} +(11,1,1) = {" +sa +je +ai +cR +ai +gN +gN +sp +th +vK +wK +gN +gN +gN +Mu +sp +th +vK +gN +gN +ai +cR +ai +je +sa +"} +(12,1,1) = {" +sa +je +ai +YA +ai +gN +cA +np +cA +vT +yB +Aa +Fd +Aa +My +Pu +cA +Sc +cA +gN +ai +YA +ai +je +sa +"} +(13,1,1) = {" +sa +je +ai +Ea +gG +gN +cA +cA +tT +wb +mO +Am +oT +Am +Bf +Px +cA +cA +nV +gN +Xp +yo +ai +je +sa +"} +(14,1,1) = {" +sa +je +ai +do +gN +kB +cA +sx +cA +wy +mO +Ax +th +JF +Bf +Px +cA +cA +cA +kB +gN +Px +ai +je +sa +"} +(15,1,1) = {" +sa +je +ai +dt +gN +cA +np +cA +cA +wy +mO +AF +Fv +Kd +Bf +Px +cA +cA +Sc +cA +gN +YY +ai +je +sa +"} +(16,1,1) = {" +sa +je +ai +do +gN +cA +cA +cA +cA +wy +mO +AZ +FM +KY +Bf +Px +cA +Si +cA +cA +gN +Px +ai +je +sa +"} +(17,1,1) = {" +sa +je +ai +do +gN +cA +nV +cA +cA +wy +mO +Bf +jn +Bf +Bf +Px +cA +cA +cA +cA +gN +Px +ai +je +sa +"} +(18,1,1) = {" +sa +je +ai +dy +gN +kB +cA +sP +tU +wI +yW +MC +Gq +MC +MC +QA +tU +sP +cA +cA +gN +Px +ai +je +sa +"} +(19,1,1) = {" +sa +je +bl +do +gN +gN +gN +gN +gN +wK +wK +gN +sZ +gN +gN +gN +gN +gN +TY +TY +gN +Px +bl +je +sa +"} +(20,1,1) = {" +sa +je +bl +do +gU +kP +or +kP +kP +wL +xa +kP +Gx +kP +kP +kP +kP +SR +kP +kP +XU +Px +bl +Zr +sa +"} +(21,1,1) = {" +sa +je +bl +do +hj +OL +kP +sX +kP +xa +xa +kP +Gz +kP +kP +kP +kP +kP +kP +Vr +Yn +Px +bl +Zz +sa +"} +(22,1,1) = {" +sa +je +bl +Bv +hj +lu +Sh +Sh +Sh +xg +xg +Sh +Sh +Sh +Sh +Sh +Sh +Sh +Sh +Vu +Yn +UI +bl +je +sa +"} +(23,1,1) = {" +sa +je +bl +do +hj +ly +pe +lU +ub +xj +xj +lU +GB +lU +lU +lU +ub +SW +lU +VC +Yz +Px +bl +je +sa +"} +(24,1,1) = {" +sa +je +bl +do +hR +lU +lU +lU +lU +xs +xj +lU +lU +lU +lU +lU +lU +lU +lU +lU +YJ +Px +bl +ZD +sa +"} +(25,1,1) = {" +sa +ac +bl +do +ig +mg +pf +cA +cA +xF +yX +CC +kB +GH +cA +cA +cA +cA +HY +VG +gN +Px +bl +je +sa +"} +(26,1,1) = {" +sa +ae +ai +do +gN +cA +cA +pf +cA +xF +xF +CH +GH +cA +cA +cA +cA +HY +cA +cA +gN +Px +ai +je +sa +"} +(27,1,1) = {" +sa +je +ai +do +gN +gN +gN +sZ +gN +wK +wK +gN +gN +gN +gN +gN +gN +sZ +gN +gN +gN +Zi +ai +je +sa +"} +(28,1,1) = {" +sa +je +ai +do +gN +mj +pO +ta +uv +xN +xF +cA +cA +cA +MP +QG +Rv +Tu +Ue +mj +gN +Px +ai +je +sa +"} +(29,1,1) = {" +sa +je +ai +dt +gN +cA +cA +cA +cA +xF +xY +CI +CI +CI +MV +cA +nV +cA +cA +cA +gN +YY +ai +je +sa +"} +(30,1,1) = {" +sa +je +ai +do +gN +OL +kP +kP +kP +xa +kP +CR +kP +kP +kP +or +kP +kP +kP +WI +gN +Px +ai +je +sa +"} +(31,1,1) = {" +sa +je +ai +do +iE +mw +qn +cA +cA +xY +yY +CI +CI +LK +cA +cA +cA +cA +TO +Vu +ig +Px +ai +je +sa +"} +(32,1,1) = {" +sa +je +ai +do +iE +Mm +cA +qn +cA +cA +cA +xW +GP +xF +cA +cA +cA +TO +cA +Vu +ig +Px +ai +je +sa +"} +(33,1,1) = {" +sa +je +ai +do +gN +mK +lU +lU +lU +yj +lU +lU +lU +xj +lU +lU +RF +lU +Uu +VC +gN +Px +ai +je +sa +"} +(34,1,1) = {" +sa +je +ai +do +YU +gN +qo +qo +FV +gN +gN +jC +GT +wK +gN +gN +FV +qo +qo +gN +YU +Px +ai +je +sa +"} +(35,1,1) = {" +sa +je +ai +bl +ai +ai +Bf +Bf +ai +ai +ai +ai +GV +ys +ai +QQ +ai +Bf +Bf +ai +ai +bl +ai +je +sa +"} +(36,1,1) = {" +sa +je +ai +cR +NY +ai +rz +rz +ai +gN +DY +DY +gN +Mp +NJ +Rj +ai +rz +rz +ai +gC +cR +ai +je +sa +"} +(37,1,1) = {" +sa +je +aE +cA +gN +ai +ai +GV +ai +gN +cA +cA +gN +ai +ai +ai +ai +GV +ai +ai +gN +cA +aE +je +sa +"} +(38,1,1) = {" +sa +je +ai +fH +gN +gN +gN +hU +gN +gN +cA +cA +hU +gN +gN +gN +gN +hU +gN +gN +gN +fH +ai +je +sa +"} +(39,1,1) = {" +sa +je +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +je +sa +"} +(40,1,1) = {" +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +"} diff --git a/_maps/map_files/Deathmatch/SecuRing.dmm b/_maps/map_files/Deathmatch/SecuRing.dmm new file mode 100644 index 0000000000000..615103813faab --- /dev/null +++ b/_maps/map_files/Deathmatch/SecuRing.dmm @@ -0,0 +1,567 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"e" = ( +/obj/structure/barricade/security/ctf, +/turf/open/floor/mineral/plastitanium/red, +/area/deathmatch) +"l" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/deathmatch) +"n" = ( +/turf/open/floor/pod/light, +/area/deathmatch) +"o" = ( +/obj/machinery/recharger, +/turf/open/floor/pod/light, +/area/deathmatch) +"t" = ( +/obj/structure/barricade/security/ctf, +/turf/open/floor/pod/light, +/area/deathmatch) +"u" = ( +/turf/open/floor/pod, +/area/deathmatch) +"G" = ( +/obj/structure/barricade/security/ctf, +/turf/open/floor/pod/dark, +/area/deathmatch) +"H" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/pod, +/area/deathmatch) +"I" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"M" = ( +/obj/machinery/light, +/turf/open/floor/pod, +/area/deathmatch) +"N" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/pod, +/area/deathmatch) +"O" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/deathmatch) +"R" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/pod, +/area/deathmatch) +"S" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/deathmatch) +"T" = ( +/obj/machinery/light, +/turf/open/floor/mineral/plastitanium/red, +/area/deathmatch) +"W" = ( +/turf/open/floor/pod/dark, +/area/deathmatch) +"X" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/deathmatch) +"Y" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/mineral/plastitanium/red, +/area/deathmatch) + +(1,1,1) = {" +a +a +a +a +a +a +a +I +I +I +I +I +I +I +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +I +I +I +X +X +O +X +X +I +I +I +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +I +I +X +X +X +X +Y +X +X +X +X +I +I +a +a +a +a +"} +(4,1,1) = {" +a +a +a +I +I +X +X +X +X +n +o +n +X +X +X +X +I +I +a +a +a +"} +(5,1,1) = {" +a +a +I +I +e +X +X +n +n +t +t +t +n +n +X +X +e +I +I +a +a +"} +(6,1,1) = {" +a +I +I +X +X +e +n +n +t +n +W +n +t +n +n +e +X +X +I +I +a +"} +(7,1,1) = {" +a +I +X +X +X +n +o +n +W +W +W +W +W +n +o +n +X +X +X +I +a +"} +(8,1,1) = {" +I +I +X +X +n +n +n +W +W +G +G +G +W +W +n +n +n +X +X +I +I +"} +(9,1,1) = {" +I +X +X +X +n +t +W +W +W +u +u +u +W +W +W +t +n +X +X +X +I +"} +(10,1,1) = {" +I +X +X +n +t +n +W +G +u +u +N +u +u +G +W +n +t +n +X +X +I +"} +(11,1,1) = {" +I +l +Y +o +t +W +W +G +u +M +I +R +u +G +W +W +t +o +Y +T +I +"} +(12,1,1) = {" +I +X +X +n +t +n +W +G +u +u +H +u +u +G +W +n +t +n +X +X +I +"} +(13,1,1) = {" +I +X +X +X +n +t +W +W +W +u +u +u +W +W +W +t +n +X +X +X +I +"} +(14,1,1) = {" +I +I +X +X +n +n +n +W +W +G +G +G +W +W +n +n +n +X +X +I +I +"} +(15,1,1) = {" +a +I +X +X +X +n +o +n +W +W +W +W +W +n +o +n +X +X +X +I +a +"} +(16,1,1) = {" +a +I +I +X +X +e +n +n +t +n +W +n +t +n +n +e +X +X +I +I +a +"} +(17,1,1) = {" +a +a +I +I +e +X +X +n +n +t +t +t +n +n +X +X +e +I +I +a +a +"} +(18,1,1) = {" +a +a +a +I +I +X +X +X +X +n +o +n +X +X +X +X +I +I +a +a +a +"} +(19,1,1) = {" +a +a +a +a +I +I +X +X +X +X +Y +X +X +X +X +I +I +a +a +a +a +"} +(20,1,1) = {" +a +a +a +a +a +I +I +I +X +X +S +X +X +I +I +I +a +a +a +a +a +"} +(21,1,1) = {" +a +a +a +a +a +a +a +I +I +I +I +I +I +I +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/Deathmatch/Sniper_elite.dmm b/_maps/map_files/Deathmatch/Sniper_elite.dmm new file mode 100644 index 0000000000000..3882bd4a8140d --- /dev/null +++ b/_maps/map_files/Deathmatch/Sniper_elite.dmm @@ -0,0 +1,802 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"b" = ( +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"c" = ( +/turf/open/floor/fake_snow, +/area/deathmatch) +"e" = ( +/obj/structure/statue/snow/snowman, +/obj/item/toy/balloon/syndicate{ + pixel_y = 11; + pixel_x = 5 + }, +/turf/open/floor/fake_snow, +/area/deathmatch) +"f" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"g" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"i" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"k" = ( +/obj/structure/rack, +/obj/item/ammo_box/magazine/sniper_rounds/penetrator, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"n" = ( +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"o" = ( +/obj/item/stack/medical/suture, +/turf/open/floor/fake_snow, +/area/deathmatch) +"p" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"q" = ( +/obj/item/crowbar, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"r" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/barricade/wooden, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"t" = ( +/obj/structure/barricade/wooden, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"u" = ( +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"v" = ( +/obj/structure/rack, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"x" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"y" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"z" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"A" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"B" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/fakeice/slippery, +/area/deathmatch) +"C" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/chasm, +/area/deathmatch) +"D" = ( +/turf/open/floor/fakeice/slippery, +/area/deathmatch) +"F" = ( +/obj/structure/closet/crate/secure/science, +/obj/item/toy/plush/lizard_plushie/green, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"H" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"J" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"K" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/fake_snow, +/area/deathmatch) +"L" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/fakeice/slippery, +/area/deathmatch) +"M" = ( +/obj/machinery/door/airlock/freezer, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/iron/freezer, +/area/deathmatch) +"N" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"O" = ( +/obj/machinery/door/airlock/freezer, +/turf/open/floor/iron/freezer, +/area/deathmatch) +"P" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"Q" = ( +/obj/structure/rack, +/obj/item/reagent_containers/hypospray/medipen/stimulants, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"R" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"U" = ( +/obj/structure/barricade/wooden, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"V" = ( +/obj/structure/rack, +/obj/item/ammo_box/magazine/sniper_rounds/penetrator, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"W" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/freezer, +/area/deathmatch) +"Y" = ( +/turf/open/floor/carpet/neon, +/area/deathmatch) +"Z" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +F +r +Y +p +Y +Y +Y +z +H +Y +Y +p +Y +H +Y +z +Y +Y +i +Y +H +Y +Y +Y +Y +z +Y +Y +Y +a +"} +(3,1,1) = {" +a +p +H +Y +i +Y +H +Y +i +Y +Y +Y +p +Y +Y +Y +i +Y +Y +p +Y +Y +i +Y +Y +H +Y +Y +J +n +a +"} +(4,1,1) = {" +a +Y +Y +H +p +Y +Y +Y +i +Y +Y +Y +i +Y +H +Y +i +H +Y +p +Y +Y +i +H +Y +Y +i +Y +P +P +a +"} +(5,1,1) = {" +a +i +i +Y +a +Y +H +Y +p +Y +H +Y +i +Y +Y +Y +p +Y +Y +a +Y +Y +a +n +J +n +p +n +Y +H +a +"} +(6,1,1) = {" +a +Y +Y +Y +a +n +R +J +a +n +n +n +N +n +n +n +p +b +b +y +b +x +a +b +b +x +p +Y +H +Y +a +"} +(7,1,1) = {" +a +a +p +i +a +P +P +U +a +a +P +P +p +p +P +P +a +a +P +P +P +U +a +f +f +t +a +a +p +a +a +"} +(8,1,1) = {" +a +n +J +n +U +c +c +c +c +e +c +c +c +c +c +c +L +D +D +c +c +c +c +c +D +D +P +J +Y +H +a +"} +(9,1,1) = {" +a +A +n +n +P +c +c +D +D +c +o +D +D +D +c +D +D +D +D +D +D +c +D +D +D +D +P +n +Y +v +a +"} +(10,1,1) = {" +a +k +n +n +P +D +D +D +D +D +D +D +D +D +D +D +D +c +D +D +D +D +D +D +D +c +a +A +H +V +a +"} +(11,1,1) = {" +a +Q +n +J +U +D +D +c +K +D +D +c +c +D +D +c +c +c +c +c +D +D +B +c +c +c +p +Y +Y +Y +a +"} +(12,1,1) = {" +a +p +p +a +U +U +P +P +a +U +P +P +p +P +P +P +a +U +P +P +P +P +a +p +i +i +a +a +p +a +a +"} +(13,1,1) = {" +a +Y +Y +Y +n +n +R +n +p +n +n +n +R +n +n +n +p +x +n +n +n +n +a +Z +u +u +p +Y +Y +H +a +"} +(14,1,1) = {" +a +Y +Y +H +Y +Y +Y +Y +a +Y +Y +Y +Y +Y +Y +H +a +Y +Y +H +Y +Y +i +Y +Y +H +p +p +i +Y +a +"} +(15,1,1) = {" +a +q +Y +Y +a +Y +Y +Y +i +Y +Y +H +a +Y +Y +Y +Y +Y +Y +Y +Y +Y +p +Y +Y +Y +i +Y +H +Y +a +"} +(16,1,1) = {" +a +M +a +O +a +Y +Y +H +i +Y +Y +Y +i +Y +Y +Y +g +Y +Y +i +Y +Y +H +Y +Y +Y +g +Y +i +i +a +"} +(17,1,1) = {" +a +C +a +W +p +Y +Y +Y +g +Y +Y +Y +i +Y +H +Y +a +Y +Y +i +Y +Y +Y +Y +H +Y +a +Y +Y +Y +a +"} +(18,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/Deathmatch/The_Brig.dmm b/_maps/map_files/Deathmatch/The_Brig.dmm new file mode 100644 index 0000000000000..208b2c994737d --- /dev/null +++ b/_maps/map_files/Deathmatch/The_Brig.dmm @@ -0,0 +1,4745 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/machinery/door/poddoor/shutters{ + id = "dm16"; + name = "Visitation Shutters" + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/table, +/turf/open/indestructible, +/area/deathmatch) +"ad" = ( +/obj/structure/rack, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"al" = ( +/obj/structure/marker_beacon/burgundy, +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/template_noop) +"an" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/space) +"ao" = ( +/obj/structure/rack, +/obj/machinery/camera/motion{ + c_tag = "Armory - Internal"; + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/obj/item/reagent_containers/cup/bucket, +/turf/open/indestructible/dark, +/area/deathmatch) +"aw" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"aB" = ( +/obj/structure/table, +/obj/item/flashlight, +/turf/open/indestructible/dark, +/area/deathmatch) +"aE" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/carpet, +/area/deathmatch) +"aH" = ( +/obj/structure/table/wood, +/obj/item/folder/red, +/obj/item/hand_labeler, +/obj/item/camera/detective, +/turf/open/floor/carpet, +/area/deathmatch) +"aI" = ( +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"aR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark, +/area/deathmatch) +"aZ" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"bc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"bh" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"bj" = ( +/obj/structure/closet{ + name = "Evidence Closet 2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible/dark, +/area/deathmatch) +"bp" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white, +/area/deathmatch) +"br" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/indestructible, +/area/deathmatch) +"by" = ( +/obj/machinery/photocopier{ + pixel_y = 3 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"bA" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/indestructible/dark, +/area/deathmatch) +"bI" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"bM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"cf" = ( +/obj/structure/cable, +/turf/open/floor/carpet, +/area/deathmatch) +"cl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"cs" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"ct" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"cN" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/indestructible, +/area/deathmatch) +"cW" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"cX" = ( +/obj/structure/cable, +/obj/machinery/power/rtg/debug, +/turf/open/indestructible/dark, +/area/deathmatch) +"da" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"dl" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"dp" = ( +/turf/open/floor/carpet, +/area/deathmatch) +"dq" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable, +/obj/item/shield/riot{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/shield/riot, +/obj/item/shield/riot{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"du" = ( +/turf/closed/indestructible/fakedoor, +/area/deathmatch) +"dA" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"dN" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/indestructible/dark, +/area/deathmatch) +"ew" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"eB" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/bodycontainer/morgue, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"eC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"eD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"eT" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"eU" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/vehicle/ridden/secway, +/obj/item/spear, +/turf/open/indestructible, +/area/deathmatch) +"eZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"fB" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"fE" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"fL" = ( +/obj/structure/cable, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/indestructible/dark, +/area/deathmatch) +"fO" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/suit_storage_unit, +/turf/open/indestructible/dark, +/area/deathmatch) +"gd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"gf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"gC" = ( +/obj/machinery/suit_storage_unit, +/turf/open/indestructible/dark, +/area/deathmatch) +"gE" = ( +/obj/structure/table/wood, +/obj/item/folder/red{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/folder/red{ + pixel_x = -7 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"gI" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"hi" = ( +/turf/open/floor/plating, +/area/deathmatch) +"hv" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/obj/structure/rack, +/turf/open/indestructible, +/area/deathmatch) +"hw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Shutters" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/deathmatch) +"hx" = ( +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible/dark, +/area/deathmatch) +"hG" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate, +/turf/open/floor/carpet, +/area/deathmatch) +"hK" = ( +/obj/structure/table, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"hS" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching Prison Wing holding areas."; + name = "Prison Monitor"; + network = list("prison"); + pixel_y = 30 + }, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/carpet, +/area/deathmatch) +"hY" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"iy" = ( +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/sec{ + pixel_y = 7 + }, +/obj/item/storage/backpack/duffelbag/sec, +/turf/open/indestructible/dark, +/area/deathmatch) +"iB" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security E.V.A. Storage" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/indestructible, +/area/deathmatch) +"iI" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/computer/old{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"ja" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"je" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"jr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"jN" = ( +/obj/structure/table, +/obj/machinery/light/small/directional/north, +/obj/item/folder/red{ + pixel_x = 3 + }, +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/healthanalyzer, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"jQ" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/wooden_tv{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/machinery/button/door/directional/north{ + id = "dm7"; + name = "detective's office shutters control" + }, +/turf/open/floor/carpet, +/area/deathmatch) +"jT" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible, +/area/deathmatch) +"jX" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible, +/area/deathmatch) +"kf" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"ki" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"kj" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/chair/stool/directional/south, +/turf/open/indestructible, +/area/deathmatch) +"ku" = ( +/obj/structure/table, +/obj/item/wirecutters, +/obj/item/screwdriver{ + pixel_x = -2; + pixel_y = 10 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/syndicatebomb/training, +/turf/open/indestructible, +/area/deathmatch) +"kU" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/indestructible, +/area/deathmatch) +"kV" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/structure/bed/dogbed/mcgriff, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"la" = ( +/obj/machinery/vending/wardrobe/sec_wardrobe{ + active = 0 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"lf" = ( +/turf/closed/indestructible/fakedoor/glass_airlock, +/area/deathmatch) +"li" = ( +/obj/structure/table, +/obj/item/clothing/mask/surgical, +/obj/item/reagent_containers/spray/cleaner, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"lj" = ( +/obj/item/paper_bin/carbon, +/obj/item/pen/fountain, +/obj/structure/table, +/turf/open/indestructible/dark, +/area/deathmatch) +"lC" = ( +/obj/structure/filingcabinet, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"lT" = ( +/obj/machinery/button/flasher{ + id = "dm1"; + name = "Brig Entrance Flasher"; + pixel_x = -6; + pixel_y = -38 + }, +/obj/machinery/button/flasher{ + id = "dm2"; + name = "Holding Cell Flasher"; + pixel_x = 6; + pixel_y = -38 + }, +/turf/open/indestructible, +/area/deathmatch) +"lV" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"ma" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Shutters" + }, +/turf/open/floor/plating, +/area/deathmatch) +"mc" = ( +/obj/structure/closet/bombcloset/security, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"mi" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"mn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/brig{ + id = "Cell 3"; + name = "Cell 3 Locker" + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"mC" = ( +/obj/effect/turf_decal/bot, +/obj/structure/plasticflaps/opaque{ + name = "Security Deliveries" + }, +/turf/open/indestructible, +/area/deathmatch) +"mE" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"mG" = ( +/obj/structure/chair/comfy/black, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark, +/area/deathmatch) +"mJ" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Security Maintenance" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plating, +/area/deathmatch) +"mR" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"mS" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"mW" = ( +/obj/structure/cable, +/obj/machinery/button/door/directional/south{ + id = "dm4"; + name = "Armory Shutters" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"ne" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"nf" = ( +/obj/machinery/light/directional/south, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"nh" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/flasher/directional/east{ + id = "dm1" + }, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible, +/area/deathmatch) +"nq" = ( +/obj/structure/cable, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"nx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"nz" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets{ + pixel_x = -13; + pixel_y = 9 + }, +/obj/item/storage/fancy/donut_box{ + pixel_x = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"nB" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"nH" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"nI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"nN" = ( +/obj/structure/table, +/obj/item/flashlight/lamp, +/turf/open/indestructible/dark, +/area/deathmatch) +"nY" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/west, +/obj/machinery/button/door/directional/west{ + id = "dm6"; + name = "Privacy Shutters Control" + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"ob" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"os" = ( +/obj/structure/sign/warning/pods{ + pixel_x = 32 + }, +/turf/open/indestructible, +/area/deathmatch) +"oA" = ( +/obj/machinery/light/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"oB" = ( +/obj/structure/closet/secure_closet/evidence, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/spawner/random/contraband/narcotics, +/turf/open/indestructible/dark, +/area/deathmatch) +"oD" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 4; + name = "Cargo Deliveries" + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"oN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/indestructible/dark, +/area/deathmatch) +"oQ" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/cable, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"oY" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"pa" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light/directional/east, +/obj/structure/closet/secure_closet/security/sec{ + anchored = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"pc" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"pe" = ( +/obj/effect/turf_decal/bot, +/turf/open/indestructible/dark, +/area/deathmatch) +"pg" = ( +/obj/machinery/door/poddoor/shutters{ + id = "dm16"; + name = "Visitation Shutters" + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/deathmatch) +"ph" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"pr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "dm6"; + name = "Privacy Shutters" + }, +/turf/open/floor/plating, +/area/deathmatch) +"pC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"pF" = ( +/obj/structure/rack, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -5; + pixel_y = 7 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_y = 4 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 5; + pixel_y = 2 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"pM" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"pV" = ( +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/deathmatch) +"pY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/indestructible, +/area/deathmatch) +"qd" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/deathmatch) +"qf" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"qk" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/gibs/body, +/turf/open/indestructible, +/area/deathmatch) +"qv" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"qy" = ( +/obj/structure/table, +/obj/item/folder/blue{ + pixel_x = -2; + pixel_y = 3 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"qC" = ( +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible, +/area/deathmatch) +"qE" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"qP" = ( +/obj/machinery/light/directional/east, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"qS" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/bottle/epinephrine, +/obj/item/reagent_containers/cup/bottle/multiver, +/obj/item/reagent_containers/syringe, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"ri" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible, +/area/deathmatch) +"rl" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/indestructible, +/area/deathmatch) +"sb" = ( +/obj/structure/closet{ + name = "Evidence Closet 4" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/storage/toolbox/emergency/old, +/turf/open/indestructible/dark, +/area/deathmatch) +"sg" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"sr" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"st" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"sw" = ( +/obj/item/target, +/obj/item/target, +/obj/item/target/alien, +/obj/item/target/alien, +/obj/item/target/clown, +/obj/item/target/clown, +/obj/item/target/syndicate, +/obj/item/target/syndicate, +/obj/structure/closet/crate/secure{ + desc = "A secure crate containing various materials for building a customised test-site."; + name = "Firing Range Gear Crate" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"sA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 1 + }, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"sG" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"sJ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"sL" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"sR" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"sZ" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/indestructible, +/area/deathmatch) +"th" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/deathmatch) +"tl" = ( +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"tn" = ( +/obj/structure/chair, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"tH" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"tQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible, +/area/deathmatch) +"tR" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"ua" = ( +/obj/machinery/door/poddoor/preopen{ + id = "dm10"; + name = "Brig Shutters" + }, +/obj/structure/cable, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/deathmatch) +"ue" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible, +/area/deathmatch) +"us" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible, +/area/deathmatch) +"uD" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"uF" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"uI" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/indestructible, +/area/deathmatch) +"uN" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/carpet, +/area/deathmatch) +"uQ" = ( +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/restraints/handcuffs/fake{ + desc = "Commonly used for stopping criminals."; + name = "handcuffs" + }, +/turf/open/indestructible, +/area/deathmatch) +"uT" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Cell 2" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"vf" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/iron/white, +/area/deathmatch) +"vl" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"vo" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/closet/secure_closet/security/sec{ + anchored = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"vt" = ( +/obj/item/storage/box/deputy, +/obj/structure/table, +/turf/open/indestructible/dark, +/area/deathmatch) +"vC" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"vD" = ( +/obj/structure/table, +/obj/structure/cable, +/obj/machinery/button/flasher{ + id = "dm1"; + name = "Brig Entrance Flasher"; + pixel_y = -3 + }, +/turf/open/indestructible, +/area/deathmatch) +"vJ" = ( +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"vL" = ( +/obj/machinery/light/small/directional/east, +/obj/item/toy/plush/beeplushie, +/turf/open/indestructible/dark, +/area/deathmatch) +"vU" = ( +/obj/structure/rack, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate, +/turf/open/indestructible/dark, +/area/deathmatch) +"vZ" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"wc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/indestructible, +/area/deathmatch) +"wm" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/indestructible/dark, +/area/deathmatch) +"wn" = ( +/obj/structure/fluff/fake_camera{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"wR" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/machinery/disposal/delivery_chute{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"wT" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/gibs/limb, +/turf/open/indestructible, +/area/deathmatch) +"wX" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"xi" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/spawner/random/contraband/plus, +/turf/open/indestructible/dark, +/area/deathmatch) +"xk" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/closet/secure_closet/security/sec{ + anchored = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"xm" = ( +/obj/structure/table, +/obj/item/implanter{ + pixel_x = 5; + pixel_y = 12 + }, +/obj/item/storage/box/evidence{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/toy/crayon/white{ + pixel_y = -4 + }, +/obj/item/toy/crayon/white{ + pixel_x = -5; + pixel_y = -4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"xu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"xD" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"xS" = ( +/obj/machinery/button/door/directional/north{ + id = "dm5"; + name = "Space Shutters Control"; + pixel_x = -24 + }, +/obj/machinery/computer/old{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"yy" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"yH" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"yN" = ( +/turf/cordon, +/area/template_noop) +"yO" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"yR" = ( +/obj/structure/chair/stool/directional/east, +/obj/effect/turf_decal/trimline/red/warning{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"yS" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Brig Control Desk" + }, +/obj/item/folder/red, +/obj/item/folder/red, +/obj/item/poster/random_official, +/obj/structure/cable, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/iron/showroomfloor, +/area/deathmatch) +"yT" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"yY" = ( +/obj/structure/cable, +/obj/machinery/computer/old{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"zg" = ( +/obj/machinery/light/directional/south, +/turf/open/indestructible, +/area/deathmatch) +"zh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"zj" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"zm" = ( +/obj/machinery/light/small/directional/east, +/turf/open/indestructible/dark, +/area/deathmatch) +"zq" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"zu" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"zG" = ( +/obj/machinery/light/directional/south, +/obj/machinery/firealarm/directional/south, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"zU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ae" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Am" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/restraints/handcuffs/fake{ + desc = "Commonly used for stopping criminals."; + name = "handcuffs" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"An" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/frame/machine/secured, +/turf/open/indestructible/dark, +/area/deathmatch) +"As" = ( +/obj/machinery/vending/wardrobe/det_wardrobe, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Ay" = ( +/obj/structure/table, +/obj/item/inspector{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/inspector{ + pixel_x = 5 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"AF" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"AS" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Bf" = ( +/obj/machinery/light/directional/west, +/turf/open/indestructible/dark, +/area/deathmatch) +"Bt" = ( +/obj/machinery/computer/old{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"By" = ( +/obj/machinery/vending/security{ + active = 0 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Bz" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"BK" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"BM" = ( +/obj/structure/table, +/obj/item/poster/random_official{ + pixel_y = 13 + }, +/obj/item/poster/random_official{ + pixel_y = 5 + }, +/obj/item/poster/random_official, +/turf/open/indestructible/dark, +/area/deathmatch) +"Cc" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Weapon Distribution"; + req_access = list("armory") + }, +/obj/item/paper, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/item/pen, +/turf/open/indestructible/dark, +/area/deathmatch) +"Cx" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/structure/disposaloutlet, +/turf/open/indestructible/dark, +/area/deathmatch) +"CH" = ( +/obj/structure/table, +/obj/item/folder/red, +/obj/item/taperecorder, +/turf/open/indestructible/dark, +/area/deathmatch) +"CM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"CP" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/weldingtool, +/turf/open/indestructible/dark, +/area/deathmatch) +"CS" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Dd" = ( +/obj/structure/filingcabinet/security{ + pixel_x = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Dk" = ( +/obj/structure/cable, +/obj/machinery/computer/old{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Dm" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Dp" = ( +/obj/machinery/door/poddoor{ + name = "Lockdown Door" + }, +/turf/open/floor/plating, +/area/deathmatch) +"Dz" = ( +/obj/machinery/door/poddoor/shutters{ + id = "dm16"; + name = "Visitation Shutters" + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/table, +/turf/open/indestructible, +/area/deathmatch) +"DD" = ( +/obj/structure/table/wood, +/obj/item/paper_bin/carbon{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/item/book/manual/wiki/security_space_law, +/turf/open/floor/carpet, +/area/deathmatch) +"DL" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"DR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/grille/broken, +/turf/open/indestructible/dark, +/area/deathmatch) +"Eb" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Cell 3" + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible, +/area/deathmatch) +"Ee" = ( +/obj/structure/cable, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Ef" = ( +/obj/effect/turf_decal/box, +/obj/structure/cable, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ep" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable, +/obj/machinery/door/poddoor{ + name = "Prison Lockdown" + }, +/turf/open/indestructible, +/area/deathmatch) +"Et" = ( +/obj/structure/table, +/obj/item/storage/box/evidence{ + pixel_x = 9; + pixel_y = 8 + }, +/obj/item/hand_labeler{ + pixel_x = -8; + pixel_y = 10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/storage/box/evidence{ + pixel_x = 9; + pixel_y = 8 + }, +/obj/item/storage/box/evidence{ + pixel_x = 9; + pixel_y = 8 + }, +/obj/item/storage/box/prisoner{ + pixel_x = 9 + }, +/obj/machinery/recharger{ + pixel_x = -5; + pixel_y = -3 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"EA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"EJ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"EP" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/reagent_containers/cup/bucket, +/turf/open/indestructible/dark, +/area/deathmatch) +"EX" = ( +/obj/machinery/light/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"Fi" = ( +/turf/template_noop, +/area/space) +"Fj" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/closet/secure_closet/security/sec{ + anchored = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Fr" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Fx" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"FK" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/flasher/directional/east{ + id = "dm2" + }, +/turf/open/indestructible, +/area/deathmatch) +"FQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"FY" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/deathmatch) +"Gi" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Gm" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"Gs" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark, +/area/deathmatch) +"GM" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"GO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"GR" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"GU" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible, +/area/deathmatch) +"GY" = ( +/obj/structure/table/wood, +/obj/item/phone{ + desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 5; + pixel_y = -1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Hd" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"He" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ho" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"Hp" = ( +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/structure/table, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Hv" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/indestructible, +/area/deathmatch) +"Hz" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"HK" = ( +/turf/closed/indestructible/fakeglass, +/area/deathmatch) +"HV" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/gun/ballistic/shotgun/riot, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_y = 3 + }, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_y = 6 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ik" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/turf/open/indestructible, +/area/deathmatch) +"Iy" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible, +/area/deathmatch) +"IJ" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"IL" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"IS" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"IU" = ( +/obj/structure/sign/warning/pods, +/turf/closed/wall/r_wall, +/area/deathmatch) +"Jb" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Jo" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/carpet, +/area/deathmatch) +"Jp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/window/preopen{ + id = "dm4"; + name = "Armory Shutters" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Jv" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/machinery/button/door/directional/west{ + id = "dm8"; + name = "Labor Camp Shuttle Lockdown" + }, +/obj/machinery/disposal/delivery_chute{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"Jw" = ( +/obj/vehicle/ridden/secway, +/obj/effect/turf_decal/bot, +/turf/open/indestructible/dark, +/area/deathmatch) +"JC" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"JF" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Brig Control Desk" + }, +/obj/item/paper, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/item/storage/fancy/donut_box, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "dm11"; + name = "Warden Desk Shutters" + }, +/turf/open/floor/iron/showroomfloor, +/area/deathmatch) +"JM" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/soap/nanotrasen, +/turf/open/indestructible/dark, +/area/deathmatch) +"JU" = ( +/obj/structure/table, +/obj/item/folder/red, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"JZ" = ( +/obj/machinery/door/poddoor/preopen{ + id = "dm8"; + name = "Prisoner Processing" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/button/door/directional/west{ + id = "dm8"; + name = "Labor Camp Shuttle Lockdown" + }, +/turf/open/indestructible, +/area/deathmatch) +"Ke" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Kh" = ( +/obj/structure/cable, +/turf/closed/indestructible/fakeglass, +/area/deathmatch) +"Ki" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Km" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Ku" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible, +/area/deathmatch) +"Kz" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/computer/old{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"KO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"KQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"Lk" = ( +/obj/structure/chair, +/obj/structure/cable, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Lp" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor{ + name = "Prison Lockdown" + }, +/turf/open/indestructible, +/area/deathmatch) +"Ls" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"Lz" = ( +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = 8 + }, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"LL" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/deathmatch) +"LU" = ( +/obj/machinery/photocopier, +/turf/open/indestructible/dark, +/area/deathmatch) +"LX" = ( +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/structure/table/wood, +/obj/item/taperecorder{ + pixel_x = 8; + pixel_y = -1 + }, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Ma" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible, +/area/deathmatch) +"Mb" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/machinery/light/small/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"Mk" = ( +/obj/item/phone{ + desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 5; + pixel_y = -1 + }, +/obj/structure/table/wood, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Mx" = ( +/obj/structure/table, +/obj/item/clothing/mask/gas/sechailer{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/clothing/mask/gas/sechailer{ + pixel_x = -6; + pixel_y = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"MG" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"MN" = ( +/obj/structure/table, +/obj/item/folder/red{ + pixel_x = -5 + }, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate, +/turf/open/indestructible/dark, +/area/deathmatch) +"MP" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"MS" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"MV" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"MX" = ( +/obj/structure/table, +/obj/item/folder/blue{ + pixel_x = -18; + pixel_y = 3 + }, +/obj/item/paper_bin{ + pixel_x = 3; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = 3; + pixel_y = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ni" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Nw" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"ND" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"NW" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 8 + }, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"NZ" = ( +/turf/open/floor/iron/white, +/area/deathmatch) +"Oi" = ( +/obj/structure/closet{ + name = "Evidence Closet 3" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible/dark, +/area/deathmatch) +"Os" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Ox" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/brig{ + id = "Cell 2"; + name = "Cell 2 Locker" + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Oy" = ( +/obj/effect/decal/cleanable/blood/gibs/torso, +/turf/open/indestructible, +/area/deathmatch) +"Oz" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible/dark, +/area/deathmatch) +"OF" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"OJ" = ( +/obj/item/target/syndicate, +/obj/structure/training_machine, +/turf/open/indestructible, +/area/deathmatch) +"OK" = ( +/obj/structure/chair/office, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/indestructible, +/area/deathmatch) +"OU" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Pj" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Secure Gear Storage" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/indestructible/dark, +/area/deathmatch) +"Pn" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = -2; + pixel_y = -3 + }, +/obj/item/reagent_containers/cup/glass/bottle/amaretto{ + pixel_x = -10; + pixel_y = 10 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Pt" = ( +/turf/open/floor/iron/grimy, +/area/deathmatch) +"PM" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/cable, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"PO" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Prison Wing" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/indestructible, +/area/deathmatch) +"PT" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"PV" = ( +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching Prison Wing holding areas."; + dir = 1; + name = "Prison Monitor"; + network = list("prison"); + pixel_y = -30 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"Qd" = ( +/obj/structure/table, +/obj/item/clothing/glasses/sunglasses{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_y = 7 + }, +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Qe" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible/dark, +/area/deathmatch) +"Qp" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 10 + }, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"Qt" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/delivery_chute{ + dir = 4 + }, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Qz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "dm10"; + name = "Brig Shutters" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/deathmatch) +"QG" = ( +/obj/machinery/door/window/left/directional/north, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Rd" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/indestructible, +/area/deathmatch) +"Rp" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Rq" = ( +/obj/structure/cable, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"Rv" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"Rx" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/deathmatch) +"Ry" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable, +/obj/item/crowbar, +/turf/open/indestructible, +/area/deathmatch) +"RR" = ( +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "dm5"; + name = "Space Shutters" + }, +/turf/closed/indestructible/fakeglass, +/area/deathmatch) +"RY" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"Se" = ( +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/indestructible, +/area/deathmatch) +"Sg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"St" = ( +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"Sz" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/photocopier{ + pixel_y = 3 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"SA" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"SB" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white, +/area/deathmatch) +"SF" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/light/directional/north, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/indestructible, +/area/deathmatch) +"SG" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"SI" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"SO" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible, +/area/deathmatch) +"SR" = ( +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"Tx" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/light/directional/north, +/obj/structure/cable, +/turf/open/floor/carpet, +/area/deathmatch) +"TK" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible, +/area/deathmatch) +"TY" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ub" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "dm11"; + name = "Brig Shutters" + }, +/turf/open/floor/plating, +/area/deathmatch) +"Uc" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible, +/area/deathmatch) +"Ue" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/corner, +/turf/open/indestructible, +/area/deathmatch) +"Ui" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/storage/toolbox/mechanical/old{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/toolbox/mechanical/old, +/obj/item/storage/toolbox/mechanical/old{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ux" = ( +/turf/open/indestructible/dark, +/area/deathmatch) +"Uz" = ( +/obj/structure/table, +/obj/item/folder/red{ + pixel_x = 14 + }, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = -3; + pixel_y = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"UD" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/spawner/random/contraband/armory, +/turf/open/indestructible/dark, +/area/deathmatch) +"UQ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"UU" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"Vg" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/turf/open/indestructible/dark, +/area/deathmatch) +"Vr" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"Vu" = ( +/obj/structure/cable, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark, +/area/deathmatch) +"Vv" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"VG" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"VI" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Labor Camp Shuttle Airlock" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/indestructible/dark, +/area/deathmatch) +"VL" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/deathmatch) +"VO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible, +/area/deathmatch) +"VR" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"Wd" = ( +/obj/machinery/door/airlock/command{ + name = "Head of Security's Office" + }, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Wg" = ( +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Wo" = ( +/obj/structure/cable, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/deathmatch) +"Wp" = ( +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/indestructible, +/area/deathmatch) +"Wv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"Wz" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"WD" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"WI" = ( +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"WO" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"WR" = ( +/obj/structure/closet{ + name = "Evidence Closet 1" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible/dark, +/area/deathmatch) +"WV" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Cell 1" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"WW" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/table, +/obj/machinery/button/door{ + desc = "Controls the shutters over the cell windows."; + id = "dm10"; + name = "Cell Window Control"; + pixel_x = -6; + pixel_y = 7; + specialfunctions = 4 + }, +/obj/machinery/button/door{ + desc = "Controls the shutters over the brig windows."; + id = "dm11"; + name = "Brig Lockdown Control"; + pixel_x = 6; + pixel_y = 7 + }, +/obj/item/key/security, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"WX" = ( +/obj/machinery/light/small/directional/south, +/turf/open/indestructible, +/area/deathmatch) +"XA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"XI" = ( +/turf/open/indestructible, +/area/deathmatch) +"XK" = ( +/turf/closed/wall, +/area/deathmatch) +"XL" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/indestructible, +/area/deathmatch) +"XS" = ( +/obj/machinery/light/directional/east, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/paper_bin{ + pixel_x = -11; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = -11; + pixel_y = 7 + }, +/obj/item/hand_labeler{ + pixel_x = -10; + pixel_y = -6 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"XX" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Yg" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible, +/area/deathmatch) +"Yh" = ( +/turf/closed/wall/r_wall, +/area/deathmatch) +"Yz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"YI" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/suit_storage_unit, +/turf/open/indestructible/dark, +/area/deathmatch) +"YN" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/carpet, +/area/deathmatch) +"YQ" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/deathmatch) +"YS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"YU" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"YW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/deathmatch) +"YY" = ( +/obj/structure/rack, +/obj/item/gun/energy/laser/practice{ + pixel_x = 2; + pixel_y = 5 + }, +/obj/item/gun/energy/laser/practice{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/item/gun/energy/laser/practice{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"YZ" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/rack, +/obj/item/healthanalyzer{ + pixel_y = -2 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"Zj" = ( +/obj/machinery/door/window/brigdoor/security/holding{ + id = "Holding Cell"; + name = "Holding Cell" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Zq" = ( +/turf/template_noop, +/area/template_noop) +"Zr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/indestructible, +/area/deathmatch) +"Zv" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "dm7"; + name = "Detective's Office Shutters" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/deathmatch) +"Zz" = ( +/obj/structure/table/wood, +/obj/item/taperecorder{ + pixel_x = 3 + }, +/obj/item/storage/box/evidence, +/obj/item/flashlight/seclite, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"ZC" = ( +/obj/structure/chair, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"ZF" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"ZJ" = ( +/obj/structure/closet/l3closet/security, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"ZO" = ( +/obj/effect/decal/cleanable/robot_debris/down, +/turf/open/floor/plating, +/area/deathmatch) + +(1,1,1) = {" +Zq +IJ +Yh +Yh +Yh +yN +yN +yN +IJ +IJ +IJ +IJ +du +IJ +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +"} +(2,1,1) = {" +Zq +IJ +YI +ZF +Yh +aa +pg +Dz +Yh +li +qS +eB +VR +Yh +HK +HK +lf +HK +Zq +HK +lf +HK +IJ +IJ +Kh +Yh +"} +(3,1,1) = {" +Zq +IJ +He +MV +XK +yR +YW +yR +XK +jN +NZ +NZ +bp +Yh +iI +HK +Ux +HK +Zq +XK +zm +VI +JZ +zj +eC +IJ +"} +(4,1,1) = {" +Zq +IJ +fO +ZF +ZO +XI +WI +WX +XK +MS +NZ +vf +SB +XK +oA +XK +VI +XK +XK +Yh +Yh +Yh +XK +Mb +eC +Kh +"} +(5,1,1) = {" +Zq +IJ +XK +iB +XK +YW +YW +jX +XK +hK +ph +ph +YZ +XK +XI +Wz +Vr +Jv +YW +GR +Zr +Qz +kj +Wp +eC +IJ +"} +(6,1,1) = {" +Zq +du +Lp +Ki +PO +GM +ND +GM +bI +Fx +Fx +Fx +XX +sZ +XI +Yz +WI +WI +WV +nI +nI +ua +Ho +XI +ki +IJ +"} +(7,1,1) = {" +Zq +Kh +Ep +Ki +YW +WI +WI +nq +WI +WI +WI +WI +WI +WI +WI +Rd +Ku +zg +XK +YW +Wo +Yh +Ho +XI +eC +IJ +"} +(8,1,1) = {" +Zq +du +Lp +VG +PO +os +EX +Ik +Os +yy +XI +XI +XI +XI +XI +XI +wc +XI +YW +GR +Zr +Qz +kj +XI +eC +IJ +"} +(9,1,1) = {" +Zq +IJ +Yh +Yh +Yh +XK +XK +XK +YU +XK +Et +FQ +IS +An +Sz +IU +Sg +WI +uT +nI +Ox +Qz +Ho +XI +eC +IJ +"} +(10,1,1) = {" +Zq +Zq +Zq +Zq +Yh +Oi +bj +WR +zU +Yh +Yh +YW +Yh +mc +ZJ +YW +Sg +zg +XK +Wo +YW +Yh +Ho +nq +je +IJ +"} +(11,1,1) = {" +Zq +Zq +Zq +Zq +Yh +vZ +aR +MG +zU +YW +vU +SR +Jp +Ho +cN +XI +Sg +XI +YW +GR +Zr +Qz +kj +WI +Wv +IJ +"} +(12,1,1) = {" +vC +vC +vC +vC +Yh +oB +pC +sb +Dd +Yh +JM +SR +Jp +Ho +Ue +Rp +da +UQ +Eb +nI +mn +Qz +Ho +WI +oD +IJ +"} +(13,1,1) = {" +vC +Zq +Zq +Zq +Yh +Yh +DR +Yh +Yh +Yh +nH +mW +Yh +SI +PT +Yh +qd +YW +Yh +Wo +YW +Yh +tR +cs +sA +Kh +"} +(14,1,1) = {" +vC +Zq +Zq +Zq +Yh +Ui +OF +UD +CP +ao +pe +SR +Yh +wn +PM +Rx +kV +eU +WW +Vr +wR +Yh +xD +WI +uI +IJ +"} +(15,1,1) = {" +al +Zq +Zq +Zq +Yh +Ux +Vg +TY +dN +TY +Vg +Gm +Cc +yy +PT +YW +DL +wX +XI +XI +Kz +ma +xD +WI +Wv +Dp +"} +(16,1,1) = {" +vC +Zq +Zq +Zq +Yh +Ux +qE +Dm +qE +Dm +qE +Dm +Ke +Hv +PT +SO +DL +WI +vD +WI +OK +JF +xD +WI +WI +Dp +"} +(17,1,1) = {" +vC +Zq +Zq +Zq +Yh +oN +tH +tH +xi +Am +EP +tH +Kh +Rv +UU +YW +oY +Vv +XS +ja +EJ +hw +JC +WI +qC +Dp +"} +(18,1,1) = {" +IJ +Kh +Kh +IJ +Yh +Yh +VL +VL +Yh +Yh +Yh +Yh +Yh +oA +UU +Yh +yS +YW +Yh +YW +YW +Yh +Ae +WI +qC +Lz +"} +(19,1,1) = {" +IJ +HV +dq +MP +IJ +vo +yH +uD +xk +Bf +Ux +JU +YW +yy +SA +RY +rl +Ls +zu +sr +kf +sR +mR +XI +qC +IJ +"} +(20,1,1) = {" +aw +Ux +SR +SR +Pj +SR +SR +Vu +SR +SR +SR +SR +oQ +Ho +WI +Hd +nq +XI +qd +nx +pY +Ub +DL +XI +qC +IJ +"} +(21,1,1) = {" +IJ +dA +gd +IL +IJ +pa +pM +eT +SR +By +Fj +la +YW +NW +Qp +bh +WI +WI +Yg +jr +XA +nh +sG +EX +SG +IJ +"} +(22,1,1) = {" +IJ +Kh +Kh +IJ +Yh +Yh +Yh +YW +oQ +XK +YW +XK +XK +YW +XK +SF +wT +lT +Yh +YW +Wo +Yh +Rq +Rq +IJ +IJ +"} +(23,1,1) = {" +Yh +sw +sJ +wm +YW +nB +GM +GM +Jb +GM +GM +ku +XK +Jw +XK +Se +TK +Oy +YW +KQ +GR +uQ +Yh +cX +Ux +IJ +"} +(24,1,1) = {" +Kh +YY +Ef +ct +lV +sG +XL +Ni +ob +ob +tQ +mS +yT +Ux +YW +yy +qk +XI +YW +tn +GR +st +Yh +cX +Ux +IJ +"} +(25,1,1) = {" +Yh +Bz +fB +Qd +XK +XK +uF +vl +xm +BM +qy +hY +Iy +Oz +AS +Nw +pc +WI +Zj +xu +bM +nI +Rq +SR +Ux +IJ +"} +(26,1,1) = {" +Yh +cl +bc +KO +XK +pe +Ma +Ux +Ux +Ux +MX +GO +br +Ux +WD +DL +Hz +XI +YW +KQ +EA +st +Yh +vL +Ux +IJ +"} +(27,1,1) = {" +Yh +YS +XI +kU +XK +pe +Ma +by +Qe +CS +aB +GO +VO +Ux +YW +Rv +Hz +XI +YW +KQ +FK +Yh +IJ +IJ +IJ +IJ +"} +(28,1,1) = {" +Yh +YS +XI +kU +XK +pe +Ma +mG +vt +CS +bA +GU +PV +XK +XK +XI +Hz +nf +Yh +Yh +Yh +Yh +Qt +zq +Zz +IJ +"} +(29,1,1) = {" +Kh +YS +OJ +kU +XK +pe +Ma +vJ +lj +Ux +Uz +GO +WI +Dk +qd +XI +Hz +Ik +Zv +ad +Pt +Pt +eD +QG +lC +IJ +"} +(30,1,1) = {" +Yh +ew +gf +eZ +XK +XK +AF +Ux +Ux +Ux +MN +GO +XL +Km +qd +XI +Rd +jT +Uc +YQ +YQ +uN +qv +zq +Fr +IJ +"} +(31,1,1) = {" +Yh +Kh +Yh +Kh +Yh +hx +Wv +ue +iy +Mx +Ay +zh +zG +XK +XK +XI +XI +hv +Zv +hG +aH +DD +sg +IJ +IJ +IJ +"} +(32,1,1) = {" +an +Fi +Fi +Fi +Kh +nz +WI +eC +BK +dl +us +aZ +WI +Ry +YW +Ik +Os +mE +Yh +hS +FY +dp +Pt +du +Zq +Zq +"} +(33,1,1) = {" +Yh +Yh +RR +Yh +Yh +Cx +ri +yO +cW +Os +Os +Hp +UQ +fE +Yh +Yh +mi +Yh +Yh +jQ +pV +pV +As +IJ +Zq +Zq +"} +(34,1,1) = {" +Yh +xS +yY +Bt +Yh +pr +Yh +pF +ne +Yh +St +Yh +OU +Yh +Yh +Ux +Ux +Ux +IJ +IJ +IJ +IJ +IJ +IJ +Zq +Zq +"} +(35,1,1) = {" +RR +Wg +Ee +WO +nY +Wg +Yh +Lk +Wg +Yh +mC +Yh +Pt +ZC +th +Ux +Gs +sL +IJ +Zq +Zq +Zq +Zq +Zq +Zq +Zq +"} +(36,1,1) = {" +RR +CM +GY +Pn +tl +Gi +Wd +Ee +Wg +mJ +hi +XK +aI +ZC +LL +Ux +nN +CH +IJ +Zq +Zq +Zq +Zq +Zq +Zq +Zq +"} +(37,1,1) = {" +RR +cf +cf +YN +aE +cf +Yh +Wg +qP +Yh +hi +XK +gI +ZC +LL +Ux +qf +qf +IJ +Zq +Zq +Zq +Zq +Zq +Zq +Zq +"} +(38,1,1) = {" +Yh +Tx +dp +dp +dp +Jo +Yh +Yh +Yh +Yh +du +XK +Mk +LX +XK +Ux +Ux +Ux +IJ +Zq +Zq +Zq +Zq +Zq +Zq +Zq +"} +(39,1,1) = {" +Yh +fL +gC +gE +LU +Yh +Yh +Zq +Zq +Zq +Zq +IJ +IJ +IJ +IJ +IJ +IJ +IJ +IJ +Zq +Zq +Zq +Zq +Zq +Zq +Zq +"} +(40,1,1) = {" +Yh +RR +Yh +Yh +Yh +Yh +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +"} diff --git a/_maps/map_files/Deathmatch/arena.dmm b/_maps/map_files/Deathmatch/arena.dmm new file mode 100644 index 0000000000000..d407234f0ab2f --- /dev/null +++ b/_maps/map_files/Deathmatch/arena.dmm @@ -0,0 +1,1978 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aj" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/vault, +/area/deathmatch) +"ao" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"aD" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/machinery/light/floor, +/turf/open/indestructible/vault, +/area/deathmatch) +"aI" = ( +/turf/open/chasm/true, +/area/deathmatch) +"bg" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"bw" = ( +/obj/item/gun/ballistic/automatic/wt550, +/obj/structure/table/reinforced, +/obj/item/ammo_box/magazine/wt550m9, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"bC" = ( +/obj/structure/barricade/wooden, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"cf" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/donkpockets/donkpocketpizza, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"cw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/light/floor, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"cM" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/plating, +/area/deathmatch) +"cY" = ( +/obj/structure/barricade/security/murderdome, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"dp" = ( +/obj/structure/lattice/catwalk, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/chasm/true, +/area/deathmatch) +"dN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"dU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"ek" = ( +/obj/item/gun/ballistic/shotgun/sc_pump, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"eC" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/vault, +/area/deathmatch) +"fp" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/storage/medkit/tactical/premium, +/obj/structure/table/reinforced, +/obj/structure/window/spawner/directional/south, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"fX" = ( +/obj/structure/railing, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"hb" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"hG" = ( +/obj/effect/spawner/structure/window, +/turf/open/indestructible/plating, +/area/deathmatch) +"ir" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/indestructible/vault, +/area/deathmatch) +"jA" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 8 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"kk" = ( +/turf/open/indestructible/vault, +/area/deathmatch) +"lv" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"lQ" = ( +/obj/item/gun/ballistic/revolver/reverse, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"lS" = ( +/obj/structure/table/reinforced, +/obj/item/grenade/frag/mega, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"lT" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/structure/bed/maint, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"mz" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"mI" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/vault, +/area/deathmatch) +"mV" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/plating, +/area/deathmatch) +"ns" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"nI" = ( +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"nT" = ( +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"pt" = ( +/obj/item/clothing/suit/armor/swat, +/obj/item/clothing/head/helmet/swat/nanotrasen, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/melee/energy/sword, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/plating, +/area/deathmatch) +"pR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"qa" = ( +/turf/closed/indestructible/riveted, +/area/deathmatch) +"qH" = ( +/obj/item/food/roast_dinner, +/obj/structure/table/reinforced, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"qP" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/vault, +/area/deathmatch) +"rc" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"sd" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"sk" = ( +/obj/item/gun/ballistic/rifle/rebarxbow/syndie, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"st" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/shield/roman, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/indestructible/vault, +/area/deathmatch) +"sK" = ( +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"tc" = ( +/obj/item/stack/rods/ten, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/indestructible/vault, +/area/deathmatch) +"tF" = ( +/obj/structure/mystery_box/tdome, +/turf/open/indestructible/vault, +/area/deathmatch) +"tT" = ( +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"ud" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"un" = ( +/obj/structure/barricade/security/murderdome, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"vm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"vM" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/spray/waterflower/superlube, +/obj/structure/window/plasma/spawner/directional/east, +/obj/structure/window/plasma/spawner/directional/north, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"vW" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/item/gun/ballistic/automatic/m90/unrestricted, +/turf/open/indestructible/vault, +/area/deathmatch) +"wg" = ( +/obj/structure/table/reinforced, +/obj/item/ammo_casing/shotgun/frag12, +/obj/item/ammo_casing/shotgun/frag12, +/obj/item/ammo_casing/shotgun/frag12, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"wz" = ( +/obj/effect/spawner/random/contraband/armory, +/obj/item/clothing/suit/armor/bone, +/turf/open/indestructible/vault, +/area/deathmatch) +"xD" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"xG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/obj/machinery/conveyor/auto, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"xJ" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"xK" = ( +/obj/effect/spawner/random/contraband/grenades/cluster, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"yb" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"yA" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"zd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"zy" = ( +/obj/structure/mystery_box/tdome, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"An" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/suit/armor/vest/alt, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"As" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"Bl" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/obj/item/kitchen/fork, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/indestructible/vault, +/area/deathmatch) +"Br" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 4 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"BH" = ( +/obj/structure/lattice/catwalk, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/chasm/true, +/area/deathmatch) +"Db" = ( +/obj/item/gun/ballistic/revolver/nagant, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"Dp" = ( +/obj/item/gun/ballistic/automatic/pistol/m1911, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"DC" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"DF" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"Ef" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"En" = ( +/turf/cordon, +/area/deathmatch) +"EA" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"EQ" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"Gb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Go" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"Gz" = ( +/obj/item/gun/ballistic/rifle/boltaction/prime, +/obj/structure/table/reinforced, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"GY" = ( +/obj/structure/table/reinforced, +/obj/item/grenade/mirage, +/obj/item/grenade/mirage, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"HD" = ( +/obj/lightning_thrower, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"Ig" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"Ih" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/vault, +/area/deathmatch) +"In" = ( +/obj/structure/mystery_box/tdome, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"IJ" = ( +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 2 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Jm" = ( +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Jq" = ( +/obj/structure/lattice/catwalk, +/turf/open/chasm/true, +/area/deathmatch) +"JN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Kb" = ( +/obj/structure/table/reinforced, +/obj/item/ammo_box/strilka310/surplus, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Kr" = ( +/obj/item/stack/rods/ten, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/indestructible/vault, +/area/deathmatch) +"KT" = ( +/obj/structure/chair/office/tactical{ + dir = 1 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"KX" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/indestructible/vault, +/area/deathmatch) +"Lh" = ( +/obj/item/clothing/suit/armor/vest/russian_coat, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"LA" = ( +/obj/effect/spawner/random/medical/medkit_rare, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/vault, +/area/deathmatch) +"Ml" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/vault, +/area/deathmatch) +"Mq" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"ML" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Om" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/remains/human, +/turf/open/indestructible/plating, +/area/deathmatch) +"OK" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/vault, +/area/deathmatch) +"OU" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"PU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/spawner/random/contraband/grenades/cluster, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Qd" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/tactical/premium, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"QQ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/plating, +/area/deathmatch) +"QY" = ( +/obj/structure/table/reinforced, +/obj/item/gun/ballistic/automatic/pistol/m1911, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Rq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"RE" = ( +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 2 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"Sy" = ( +/obj/machinery/light/floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"SZ" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 2 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"TC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing/corner/end, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"TQ" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/light/floor, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Uk" = ( +/obj/structure/lattice/catwalk, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/chasm/true, +/area/deathmatch) +"Uv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"UU" = ( +/obj/structure/table/reinforced, +/obj/structure/window/plasma/spawner/directional/north, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"UV" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/machinery/deployable_turret, +/turf/open/indestructible/vault, +/area/deathmatch) +"Vl" = ( +/obj/structure/mystery_box/tdome, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Vx" = ( +/obj/structure/barricade/security/murderdome, +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"VA" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/gun/ballistic/revolver/c38, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"Wd" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/vault, +/area/deathmatch) +"We" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"Ws" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 8 + }, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/vault, +/area/deathmatch) +"WE" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/indestructible/vault, +/area/deathmatch) +"WP" = ( +/obj/structure/table/reinforced, +/obj/item/gun/ballistic/revolver/c38, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"WQ" = ( +/obj/effect/spawner/random/entertainment/drugs, +/obj/effect/spawner/random/entertainment/drugs, +/obj/effect/spawner/random/entertainment/drugs, +/obj/effect/spawner/random/entertainment/drugs, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Xc" = ( +/obj/effect/spawner/random/contraband/armory, +/obj/item/clothing/suit/armor/bone, +/obj/structure/table/reinforced, +/turf/open/indestructible/vault, +/area/deathmatch) +"XG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"XP" = ( +/obj/machinery/light/floor, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"XR" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"XT" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/mystery_box/tdome, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"Yc" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/vault, +/area/deathmatch) +"YI" = ( +/obj/structure/lattice/catwalk, +/obj/item/storage/toolbox/guncase/rocketlauncher{ + weapon_to_spawn = /obj/item/gun/ballistic/rocketlauncher/unrestricted + }, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 2 + }, +/turf/open/chasm/true, +/area/deathmatch) +"ZO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"ZR" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"ZZ" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/vault, +/area/deathmatch) + +(1,1,1) = {" +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +"} +(2,1,1) = {" +En +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +En +"} +(3,1,1) = {" +En +qa +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +qa +En +"} +(4,1,1) = {" +En +qa +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +qa +En +"} +(5,1,1) = {" +En +qa +aI +aI +qa +PU +zd +XG +qa +qa +qa +XG +zd +vm +TC +dU +JN +ZO +cw +dN +zd +qa +qa +qa +XG +zd +qa +qa +aI +aI +qa +En +"} +(6,1,1) = {" +En +qa +aI +aI +EQ +nI +nI +nI +Vl +qa +Vl +nI +nI +yA +nI +nI +nI +yA +yA +yA +yA +Vl +qa +Vl +nI +nI +vM +qa +aI +aI +qa +En +"} +(7,1,1) = {" +En +qa +aI +aI +EQ +nI +XP +nI +nI +qa +nI +nI +nI +qa +qa +hG +hG +qa +qa +nI +nI +nI +qa +nI +XP +XP +yA +qa +aI +aI +qa +En +"} +(8,1,1) = {" +En +qa +aI +aI +EQ +nI +Jq +nI +nI +rc +nI +nI +yA +qa +tF +kk +LA +wz +qa +nI +nI +yA +rc +nI +Jq +Jq +yA +qa +aI +aI +qa +En +"} +(9,1,1) = {" +En +qa +aI +aI +EQ +nI +Uk +nI +nI +OK +nI +ud +nI +aj +kk +Wd +sK +Ih +ir +nI +lQ +yA +OK +yA +Jq +Uk +nI +qa +aI +aI +qa +En +"} +(10,1,1) = {" +En +qa +aI +aI +EQ +nI +BH +nI +nI +rc +nI +nI +nI +qa +Xc +KT +Ih +tF +qa +Uv +nI +nI +rc +nI +Jq +BH +An +qa +aI +aI +qa +En +"} +(11,1,1) = {" +En +qa +aI +aI +qa +nI +XP +nI +WP +qa +Qd +EA +nI +qa +qa +hG +hG +qa +qa +Uv +Uv +nI +qa +nI +XP +XP +bw +qa +aI +aI +qa +En +"} +(12,1,1) = {" +En +qa +aI +aI +qa +nI +nI +nI +An +qa +An +nI +nI +nI +nI +nI +ek +nI +nI +yA +nI +lS +qa +qa +bC +bC +qa +qa +aI +aI +qa +En +"} +(13,1,1) = {" +En +qa +aI +aI +XR +We +We +We +We +mI +We +We +We +KX +sd +yA +nI +nI +TQ +yA +EA +wg +qa +Vl +EA +nI +GY +qa +aI +aI +qa +En +"} +(14,1,1) = {" +En +qa +aI +aI +aI +aI +Jq +aI +aI +aI +aI +Jq +aI +aI +jA +We +We +qP +sd +nI +nI +QY +qa +nI +nI +nT +nI +fX +aI +aI +qa +En +"} +(15,1,1) = {" +En +qa +aI +aI +aI +aI +Uk +aI +aI +aI +aI +Uk +aI +aI +Jq +Jq +Jq +aI +jA +We +We +We +Ml +nI +yA +nI +nI +xK +aI +aI +qa +En +"} +(16,1,1) = {" +En +qa +aI +aI +aI +aI +Jq +aI +aI +aI +aI +Jq +aI +aI +Jq +dp +Jq +aI +aI +aI +aI +aI +Ws +We +We +We +qP +sd +aI +aI +qa +En +"} +(17,1,1) = {" +En +qa +aI +aI +UV +ZZ +Ig +Ig +vW +eC +Ig +eC +Br +aI +Jq +Jq +Jq +aI +aI +YI +aI +aI +aI +aI +aI +Jq +aI +aI +aI +aI +qa +En +"} +(18,1,1) = {" +En +qa +aI +aI +qa +qa +Uv +nI +SZ +nI +nI +nI +Ef +Ig +Ig +Ig +Br +aI +aI +Jq +aI +aI +aI +aI +aI +Uk +aI +aI +aI +aI +qa +En +"} +(19,1,1) = {" +En +qa +aI +aI +qa +fp +Uv +yA +nI +yA +nI +nI +yA +nI +Uv +yA +Ef +Ig +eC +hb +bg +aI +aI +aI +aI +Jq +aI +aI +aI +aI +qa +En +"} +(20,1,1) = {" +En +qa +aI +aI +qa +qa +qa +tT +Uv +nI +tT +tT +nI +Uv +Uv +IJ +nI +nI +nI +Uv +aD +Ig +Ig +Ig +Ig +Ig +Ig +mz +aI +aI +qa +En +"} +(21,1,1) = {" +En +qa +aI +aI +Bl +cf +qa +Jm +Uv +yA +zy +tT +OU +qa +qa +DC +DC +mV +DC +mV +qa +qa +xJ +UU +qa +nT +yA +qa +aI +aI +qa +En +"} +(22,1,1) = {" +En +qa +aI +aI +WE +yA +rc +Uv +Uv +nI +Uv +nI +nI +Kb +qa +As +HD +Om +HD +As +qa +lT +Sy +lv +qa +cY +yA +qa +aI +aI +qa +En +"} +(23,1,1) = {" +En +qa +aI +aI +WE +nI +rc +Dp +nI +Uv +Uv +nI +nI +Gz +qa +As +As +pt +Om +As +qa +WQ +xD +In +qa +nI +nI +qa +aI +aI +qa +En +"} +(24,1,1) = {" +En +qa +aI +aI +Kr +nI +qa +ML +nI +Uv +zy +tT +nI +SZ +qa +Om +HD +As +HD +QQ +qa +qa +qa +qa +qa +nI +cY +qa +aI +aI +qa +En +"} +(25,1,1) = {" +En +qa +aI +aI +tc +yA +qa +qa +bC +bC +tT +tT +nI +nI +qa +ao +cM +ao +ao +ao +qa +Lh +yA +nI +nI +sk +nI +xG +aI +aI +qa +En +"} +(26,1,1) = {" +En +qa +aI +aI +st +nI +qH +qa +ZR +Db +qa +nI +yA +nI +Yc +nI +nI +nI +nI +yA +rc +nT +tT +nI +un +ML +nI +xG +aI +aI +qa +En +"} +(27,1,1) = {" +En +qa +aI +aI +qa +XP +yA +Go +RE +DF +Vx +nI +yA +XP +rc +nI +nI +ML +yA +nI +rc +nI +nI +yA +nI +nI +Vl +qa +aI +aI +qa +En +"} +(28,1,1) = {" +En +qa +aI +aI +qa +qa +pR +qa +Mq +yb +qa +Rq +Rq +qa +qa +qa +VA +ns +XT +qa +qa +qa +Gb +Gb +Gb +Gb +qa +qa +aI +aI +qa +En +"} +(29,1,1) = {" +En +qa +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +qa +En +"} +(30,1,1) = {" +En +qa +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +qa +En +"} +(31,1,1) = {" +En +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +En +"} +(32,1,1) = {" +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +"} diff --git a/_maps/map_files/Deathmatch/chinatown.dmm b/_maps/map_files/Deathmatch/chinatown.dmm new file mode 100644 index 0000000000000..78cb949235daa --- /dev/null +++ b/_maps/map_files/Deathmatch/chinatown.dmm @@ -0,0 +1,1417 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"bd" = ( +/turf/open/floor/wood/parquet, +/area/deathmatch) +"ce" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/obj/item/spear/bamboospear, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"ch" = ( +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/bamboo, +/area/deathmatch) +"cr" = ( +/obj/item/stack/sheet/mineral/bamboo, +/turf/open/misc/grass, +/area/deathmatch) +"dm" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/fishing_rod/bone, +/obj/item/fishing_hook/bone, +/obj/item/fishing_line/sinew, +/obj/structure/fermenting_barrel/gunpowder, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"dp" = ( +/obj/item/food/grown/wheat{ + pixel_y = 4; + pixel_x = 7 + }, +/obj/item/food/grown/wheat{ + pixel_y = 17; + pixel_x = -12 + }, +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = -1; + pixel_x = -9 + }, +/turf/open/misc/dirt, +/area/deathmatch) +"dr" = ( +/obj/structure/closet/crate/wooden, +/obj/item/throwing_star, +/obj/item/stack/medical/suture, +/obj/machinery/light, +/turf/open/floor/wood/large, +/area/deathmatch) +"dy" = ( +/obj/structure/headpike/bamboo, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"dI" = ( +/obj/machinery/light/floor{ + pixel_x = 16; + pixel_y = -17 + }, +/turf/open/water, +/area/deathmatch) +"el" = ( +/obj/structure/flora/bush/flowers_yw, +/turf/open/misc/grass, +/area/deathmatch) +"fk" = ( +/obj/item/storage/box/matches, +/turf/open/floor/bamboo, +/area/deathmatch) +"fn" = ( +/obj/structure/flora/tree/jungle/style_random, +/turf/open/misc/grass, +/area/deathmatch) +"fs" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/obj/item/gun/syringe/blowgun, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"fD" = ( +/obj/structure/flora/bush/stalky/style_random, +/turf/open/misc/grass, +/area/deathmatch) +"gH" = ( +/turf/open/floor/engine/cult, +/area/deathmatch) +"ha" = ( +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/bamboo/tatami/purple, +/area/deathmatch) +"iq" = ( +/turf/open/floor/carpet/green, +/area/deathmatch) +"iI" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/mortar, +/obj/item/pestle, +/turf/open/floor/wood/large, +/area/deathmatch) +"iL" = ( +/obj/structure/flora/bush/leavy/style_2, +/turf/open/misc/grass, +/area/deathmatch) +"jc" = ( +/obj/structure/table/wood, +/obj/item/food/fishmeat/carp{ + pixel_y = 8 + }, +/obj/item/food/fishmeat/carp, +/turf/open/floor/stone, +/area/deathmatch) +"kY" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/misc/grass, +/area/deathmatch) +"lr" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/deathmatch) +"lA" = ( +/obj/structure/statue/bone/skull, +/obj/item/clothing/suit/hooded/cultrobes/hardened, +/turf/open/floor/engine/cult, +/area/deathmatch) +"lD" = ( +/obj/structure/table/wood, +/obj/item/food/vegetariansushislice{ + pixel_y = 9; + pixel_x = 5 + }, +/obj/item/food/vegetariansushislice{ + pixel_y = 5 + }, +/obj/item/food/vegetariansushislice{ + pixel_x = -5 + }, +/obj/item/throwing_star{ + pixel_x = 8; + pixel_y = -2 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"lO" = ( +/obj/structure/flora/bush/generic, +/turf/open/misc/grass, +/area/deathmatch) +"ma" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"mb" = ( +/obj/structure/flora/bush/sparsegrass, +/turf/open/misc/grass, +/area/deathmatch) +"mf" = ( +/obj/structure/flora/tree/jungle/style_3, +/turf/open/misc/grass, +/area/deathmatch) +"mt" = ( +/obj/structure/flora/tree/jungle/style_2, +/turf/open/misc/grass, +/area/deathmatch) +"mC" = ( +/obj/structure/table/wood, +/obj/item/food/sashimi, +/turf/open/floor/wood/tile, +/area/deathmatch) +"mT" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/engine/cult, +/area/deathmatch) +"nE" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/bamboo/tatami, +/area/deathmatch) +"nU" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/barricade/wooden, +/turf/open/floor/wood/large, +/area/deathmatch) +"of" = ( +/obj/structure/flora/rock/pile/jungle, +/turf/open/water, +/area/deathmatch) +"oo" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/engine/cult, +/area/deathmatch) +"oy" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/bottle/potassium{ + pixel_y = 8; + pixel_x = 10 + }, +/obj/item/reagent_containers/cup/bottle/iron{ + pixel_y = 12; + pixel_x = -4 + }, +/obj/item/reagent_containers/cup/bottle/frostoil, +/turf/open/floor/bamboo, +/area/deathmatch) +"oN" = ( +/obj/item/stack/sheet/bone, +/turf/open/floor/bamboo, +/area/deathmatch) +"oR" = ( +/obj/structure/table/bronze, +/obj/item/nullrod/claymore/bostaff, +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/west, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/stone, +/area/deathmatch) +"oX" = ( +/obj/structure/closet/crate/wooden, +/obj/item/stack/medical/bruise_pack{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/food/grown/banana, +/turf/open/floor/wood/large, +/area/deathmatch) +"oY" = ( +/obj/item/food/grown/wheat{ + pixel_y = 4; + pixel_x = 7 + }, +/obj/item/food/grown/wheat{ + pixel_x = -8; + pixel_y = 10 + }, +/obj/item/food/grown/wheat{ + pixel_x = -10 + }, +/turf/open/misc/dirt, +/area/deathmatch) +"pG" = ( +/turf/open/floor/wood/large, +/area/deathmatch) +"pV" = ( +/obj/structure/fermenting_barrel/gunpowder, +/turf/open/floor/wood/large, +/area/deathmatch) +"qo" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/misc/grass, +/area/deathmatch) +"qu" = ( +/obj/structure/table/wood, +/obj/item/retractor, +/obj/item/stack/medical/gauze{ + pixel_x = 4; + pixel_y = 1 + }, +/turf/open/floor/wood/large, +/area/deathmatch) +"qI" = ( +/obj/item/knife/ritual, +/turf/open/floor/engine/cult, +/area/deathmatch) +"rl" = ( +/obj/structure/table/wood/fancy, +/obj/item/clothing/head/costume/crown, +/turf/open/floor/carpet, +/area/deathmatch) +"rP" = ( +/obj/structure/table/bronze, +/obj/item/flashlight/lantern{ + light_on = 1 + }, +/obj/machinery/light, +/turf/open/floor/stone, +/area/deathmatch) +"rU" = ( +/obj/item/food/meat/slab/human{ + pixel_x = -7; + pixel_y = -5 + }, +/obj/item/food/meat/slab/gondola, +/obj/structure/bonfire/prelit, +/turf/open/indestructible/necropolis, +/area/deathmatch) +"sa" = ( +/obj/item/clothing/head/costume/rice_hat, +/obj/item/hatchet/wooden, +/obj/structure/bed/maint, +/turf/open/floor/wood/large, +/area/deathmatch) +"so" = ( +/obj/machinery/light, +/turf/open/floor/bamboo, +/area/deathmatch) +"tM" = ( +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/misc/grass, +/area/deathmatch) +"tT" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/turf/open/floor/bamboo/tatami, +/area/deathmatch) +"uc" = ( +/obj/structure/flora/bush/leafy, +/turf/open/misc/grass, +/area/deathmatch) +"ui" = ( +/turf/open/floor/bamboo/tatami, +/area/deathmatch) +"ut" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/clothing/shoes/cult/alt, +/turf/open/floor/engine/cult, +/area/deathmatch) +"uP" = ( +/mob/living/basic/cow, +/obj/machinery/light, +/turf/open/misc/dirt, +/area/deathmatch) +"vC" = ( +/obj/structure/mineral_door/paperframe, +/turf/open/floor/wood/large, +/area/deathmatch) +"wF" = ( +/obj/structure/flora/bush/flowers_yw/style_2, +/turf/open/misc/grass, +/area/deathmatch) +"xk" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/bamboo, +/area/deathmatch) +"xm" = ( +/obj/machinery/light, +/turf/open/water, +/area/deathmatch) +"xz" = ( +/turf/open/lava/smooth, +/area/deathmatch) +"xJ" = ( +/obj/structure/table/wood, +/obj/item/stack/medical/poultice, +/obj/item/stack/medical/poultice{ + pixel_x = 8; + pixel_y = -3 + }, +/obj/item/stack/medical/aloe{ + pixel_x = -9; + pixel_y = 8 + }, +/obj/item/stack/medical/aloe{ + pixel_x = -10; + pixel_y = 12 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/bamboo, +/area/deathmatch) +"yl" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/obj/item/reagent_containers/syringe/crude{ + pixel_y = -1 + }, +/obj/item/reagent_containers/syringe/crude{ + pixel_y = 3 + }, +/obj/item/reagent_containers/syringe/crude{ + pixel_y = -4 + }, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"yz" = ( +/obj/structure/flora/bush/flowers_pp, +/obj/item/food/pie/cream, +/obj/item/clothing/mask/gas/clown_hat, +/turf/open/misc/grass, +/area/deathmatch) +"yA" = ( +/obj/structure/flora/rock/pile/jungle/large, +/obj/machinery/light/floor, +/turf/open/water, +/area/deathmatch) +"yE" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"yI" = ( +/obj/structure/barricade/wooden/crude, +/obj/structure/mineral_door/paperframe, +/turf/open/floor/engine/cult, +/area/deathmatch) +"yL" = ( +/obj/structure/table/bronze, +/obj/item/throwing_star{ + pixel_x = 2 + }, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/north, +/obj/item/throwing_star{ + pixel_x = -9; + pixel_y = 3 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/stone, +/area/deathmatch) +"zb" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/bedsheet/cult, +/turf/open/floor/engine/cult, +/area/deathmatch) +"zu" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/wood/large, +/area/deathmatch) +"zE" = ( +/obj/structure/table/wood, +/obj/item/stack/medical/ointment{ + pixel_y = 6; + pixel_x = 12 + }, +/obj/item/stack/medical/ointment{ + pixel_y = 2; + pixel_x = 12 + }, +/obj/item/stack/medical/suture/medicated, +/obj/item/stack/medical/suture/medicated{ + pixel_y = -4 + }, +/turf/open/floor/bamboo, +/area/deathmatch) +"zG" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/bamboo, +/area/deathmatch) +"zV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Az" = ( +/obj/structure/flora/bush/reed, +/turf/open/water, +/area/deathmatch) +"Bn" = ( +/obj/structure/mineral_door/paperframe, +/obj/structure/barricade/wooden/crude, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/engine/cult, +/area/deathmatch) +"Cr" = ( +/obj/item/sharpener, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/west, +/turf/open/water, +/area/deathmatch) +"DD" = ( +/obj/structure/closet/cabinet, +/obj/item/throwing_star{ + pixel_x = 2 + }, +/obj/item/clothing/suit/hooded/chaplainsuit/monkhabit, +/turf/open/floor/wood/large, +/area/deathmatch) +"Ea" = ( +/obj/structure/table/wood, +/obj/item/knife/butcher, +/turf/open/floor/stone, +/area/deathmatch) +"EJ" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/obj/machinery/light, +/turf/open/misc/grass, +/area/deathmatch) +"Fl" = ( +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/west, +/turf/open/water, +/area/deathmatch) +"Fu" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/deathmatch) +"FV" = ( +/obj/structure/table/wood, +/obj/item/food/nigiri_sushi{ + pixel_y = 5; + pixel_x = -7 + }, +/obj/item/food/nigiri_sushi, +/turf/open/floor/wood/tile, +/area/deathmatch) +"Gf" = ( +/obj/structure/flora/bush/flowers_pp, +/turf/open/misc/grass, +/area/deathmatch) +"Gv" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/obj/item/clothing/suit/armor/bone, +/obj/item/clothing/accessory/talisman, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"GQ" = ( +/obj/structure/closet/crate/coffin, +/obj/item/toy/plush/lizard_plushie/green, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/west, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/carpet, +/area/deathmatch) +"GX" = ( +/turf/open/misc/grass/jungle, +/area/deathmatch) +"JP" = ( +/obj/structure/table/bronze, +/obj/item/restraints/legcuffs/bola/tactical, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/stone, +/area/deathmatch) +"Kd" = ( +/turf/open/floor/bamboo, +/area/deathmatch) +"Kx" = ( +/obj/structure/fermenting_barrel/gunpowder, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/deathmatch) +"KM" = ( +/obj/item/flashlight/lantern{ + light_on = 1 + }, +/obj/structure/table/bronze, +/obj/machinery/light, +/turf/open/floor/stone, +/area/deathmatch) +"KN" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"LN" = ( +/obj/structure/closet/cabinet, +/mob/living/carbon/human/species/monkey/angry, +/obj/item/nullrod/tribal_knife, +/turf/open/floor/wood/large, +/area/deathmatch) +"MN" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/misc/grass, +/area/deathmatch) +"Na" = ( +/turf/open/misc/dirt, +/area/deathmatch) +"Nn" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/obj/item/cultivator/rake, +/turf/open/misc/grass, +/area/deathmatch) +"No" = ( +/turf/open/water, +/area/deathmatch) +"NJ" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/armor/riot/knight, +/obj/item/clothing/head/helmet/knight, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/stone, +/area/deathmatch) +"Op" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/wood/large, +/area/deathmatch) +"OA" = ( +/obj/item/clothing/shoes/cowboy, +/turf/open/misc/dirt, +/area/deathmatch) +"OV" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/bamboo/tatami, +/area/deathmatch) +"Pk" = ( +/obj/structure/flora/bush/leavy/style_random, +/turf/open/misc/grass, +/area/deathmatch) +"Py" = ( +/obj/structure/flora/rock/pile/jungle/style_random{ + pixel_x = -12; + pixel_y = 15 + }, +/turf/open/water, +/area/deathmatch) +"PE" = ( +/obj/structure/water_source/puddle, +/turf/open/misc/dirt, +/area/deathmatch) +"PF" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/structure/statue/bone/rib{ + dir = 8 + }, +/obj/machinery/light/floor{ + pixel_y = -8; + pixel_x = -4 + }, +/turf/open/floor/engine/cult, +/area/deathmatch) +"PN" = ( +/obj/effect/mob_spawn/corpse/human, +/obj/structure/bonfire/prelit, +/turf/open/indestructible/necropolis, +/area/deathmatch) +"PP" = ( +/turf/open/misc/grass, +/area/deathmatch) +"Qb" = ( +/turf/open/floor/stone, +/area/deathmatch) +"Qp" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/misc/grass, +/area/deathmatch) +"QC" = ( +/turf/open/floor/wood/tile, +/area/deathmatch) +"QG" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/bottle/sake{ + pixel_x = -6; + pixel_y = 17 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 3; + pixel_x = 7 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = -1; + pixel_x = -3 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"RI" = ( +/obj/structure/punji_sticks, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"RR" = ( +/obj/item/stack/sheet/bone, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"Su" = ( +/obj/structure/flora/rock/pile/jungle/style_3, +/obj/machinery/light/floor, +/turf/open/water, +/area/deathmatch) +"SJ" = ( +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/bamboo/tatami/purple, +/area/deathmatch) +"SO" = ( +/obj/item/grown/bananapeel, +/turf/open/floor/wood/large, +/area/deathmatch) +"TW" = ( +/obj/structure/table/bronze, +/obj/item/flashlight/lantern{ + light_on = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/stone, +/area/deathmatch) +"Uk" = ( +/obj/structure/closet/crate/coffin, +/obj/item/organ/internal/cyberimp/arm/shard/katana, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/west, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/carpet, +/area/deathmatch) +"UO" = ( +/turf/open/floor/carpet, +/area/deathmatch) +"UU" = ( +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"UY" = ( +/obj/structure/flora/bush/leavy, +/turf/open/misc/grass, +/area/deathmatch) +"Vi" = ( +/obj/item/food/grown/wheat{ + pixel_y = 10; + pixel_x = -6 + }, +/obj/item/food/grown/wheat{ + pixel_x = 4 + }, +/obj/item/food/grown/wheat{ + pixel_x = -10 + }, +/turf/open/misc/dirt, +/area/deathmatch) +"Vm" = ( +/obj/structure/table/wood, +/obj/item/food/vegetariansushiroll{ + pixel_y = 2; + pixel_x = 4 + }, +/obj/item/food/vegetariansushiroll, +/turf/open/floor/stone, +/area/deathmatch) +"Vt" = ( +/turf/closed/indestructible/wood, +/area/deathmatch) +"VA" = ( +/obj/structure/table/wood/fancy, +/obj/item/clothing/mask/gas/tiki_mask, +/obj/item/flashlight/flare/torch, +/turf/open/floor/carpet, +/area/deathmatch) +"We" = ( +/obj/structure/statue/bone/rib{ + dir = 8 + }, +/turf/open/floor/engine/cult, +/area/deathmatch) +"Ya" = ( +/obj/structure/table/wood, +/obj/structure/chem_separator, +/turf/open/floor/bamboo, +/area/deathmatch) +"Yo" = ( +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/stone, +/area/deathmatch) +"Zm" = ( +/obj/item/toy/plush/carpplushie/dehy_carp, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/west, +/turf/open/water, +/area/deathmatch) +"Zu" = ( +/obj/structure/statue/bone/rib, +/turf/open/floor/engine/cult, +/area/deathmatch) + +(1,1,1) = {" +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +"} +(2,1,1) = {" +Vt +UU +Cr +Zm +Fl +UU +Vt +oX +Kx +Vt +dy +ce +Gv +yl +fs +dy +Vt +Fu +pG +Vt +pG +pG +nU +Na +OA +Vt +"} +(3,1,1) = {" +Vt +QC +QC +QC +QC +QC +vC +pG +pG +bd +RI +Kd +Kd +Kd +oN +yE +bd +pG +pG +vC +pG +pG +nU +Na +uP +Vt +"} +(4,1,1) = {" +Vt +zG +Kd +Kd +Kd +so +Vt +pG +pG +bd +GX +Kd +PN +rU +Kd +GX +bd +pG +pG +Vt +Fu +pG +Vt +Vt +Vt +Vt +"} +(5,1,1) = {" +Vt +Kd +Ea +jc +Vm +Kd +zu +pG +pG +bd +RR +fk +Kd +Kd +Kd +RI +bd +pG +pG +Vt +pG +pG +pG +pG +dr +Vt +"} +(6,1,1) = {" +Vt +Kd +Kd +xk +Kd +Kd +Vt +pG +pG +Vt +dy +GX +GX +GX +GX +dy +Vt +Fu +pG +zu +pG +Op +pG +pV +sa +Vt +"} +(7,1,1) = {" +Vt +QG +FV +QG +lD +mC +Vt +Kd +Kd +Vt +Vt +zu +Vt +Vt +zu +Vt +Vt +Kd +Kd +Vt +vC +Vt +Vt +zu +Vt +Vt +"} +(8,1,1) = {" +Vt +ui +tT +ui +OV +ui +ha +ui +ui +ha +ui +ui +ui +ui +ui +ui +ha +ui +ui +ha +ui +ui +ui +ui +ui +Vt +"} +(9,1,1) = {" +Vt +MN +PP +wF +Gf +PP +tM +PP +PP +PP +PP +Gf +PP +cr +PP +Qp +PP +PP +PP +mb +PP +Nn +Vi +dp +PE +Vt +"} +(10,1,1) = {" +Vt +No +No +PP +tM +fn +fD +zV +KN +mb +Az +No +No +No +No +cr +el +zV +KN +lO +kY +oY +No +No +xm +Vt +"} +(11,1,1) = {" +Vt +No +No +No +No +yz +No +zV +KN +No +No +No +No +of +Su +No +No +ma +KN +No +No +No +No +No +No +Vt +"} +(12,1,1) = {" +Vt +fD +tM +Az +dI +No +No +zV +KN +No +No +kY +No +No +yA +No +No +dm +KN +No +No +No +cr +PP +PP +Vt +"} +(13,1,1) = {" +Vt +el +UY +PP +No +Py +No +zV +KN +PP +Gf +Gf +mt +No +No +No +mb +zV +KN +PP +PP +PP +PP +mf +EJ +Vt +"} +(14,1,1) = {" +Vt +qo +PP +Qp +iL +cr +mb +PP +PP +PP +PP +PP +PP +uc +Pk +PP +kY +PP +PP +PP +PP +PP +PP +kY +PP +Vt +"} +(15,1,1) = {" +Vt +ui +ui +ui +ui +ui +SJ +ui +ui +SJ +ui +ui +nE +ui +ui +ui +SJ +ui +ui +SJ +ui +ui +ui +ui +ui +Vt +"} +(16,1,1) = {" +Vt +Vt +zu +vC +vC +vC +Vt +Kd +Kd +Vt +Vt +zu +Vt +Vt +zu +Vt +Vt +Kd +Kd +Vt +Vt +Vt +Bn +Vt +Vt +Vt +"} +(17,1,1) = {" +Vt +zE +pG +pG +pG +pG +Vt +pG +pG +Vt +TW +Qb +yL +NJ +Yo +KM +Vt +pG +Op +Vt +xz +mT +gH +ut +xz +Vt +"} +(18,1,1) = {" +Vt +xJ +pG +Kd +Kd +pG +Vt +pG +pG +Kd +iq +iq +iq +iq +iq +iq +Kd +pG +pG +Vt +gH +PF +gH +We +gH +Vt +"} +(19,1,1) = {" +Vt +Ya +pG +iI +qu +pG +vC +pG +Op +Kd +UO +VA +GQ +Uk +rl +UO +Kd +pG +pG +yI +gH +gH +qI +gH +gH +Vt +"} +(20,1,1) = {" +Vt +ch +pG +Kd +Kd +pG +Vt +pG +pG +Kd +iq +iq +iq +iq +iq +iq +Kd +SO +pG +Vt +gH +Zu +gH +lA +oo +Vt +"} +(21,1,1) = {" +Vt +oy +pG +lr +pG +pG +zu +lr +pG +Vt +TW +Qb +JP +oR +Qb +rP +Vt +LN +DD +Vt +xz +zb +gH +mT +xz +Vt +"} +(22,1,1) = {" +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +"} diff --git a/_maps/map_files/Deathmatch/instagib.dmm b/_maps/map_files/Deathmatch/instagib.dmm new file mode 100644 index 0000000000000..915aa9338da39 --- /dev/null +++ b/_maps/map_files/Deathmatch/instagib.dmm @@ -0,0 +1,808 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/mineral/titanium, +/area/deathmatch/fullbright) +"c" = ( +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/deathmatch/fullbright) +"e" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/circuit/green, +/area/deathmatch/fullbright) +"q" = ( +/obj/machinery/door/airlock/titanium/glass, +/turf/open/floor/mineral/abductor, +/area/deathmatch/fullbright) +"u" = ( +/turf/template_noop, +/area/template_noop) +"v" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/circuit/green, +/area/deathmatch/fullbright) +"y" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/circuit/green, +/area/deathmatch/fullbright) +"A" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/vault/alien, +/area/deathmatch/fullbright) +"B" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/vault/alien, +/area/deathmatch/fullbright) +"C" = ( +/turf/open/floor/circuit/green, +/area/deathmatch/fullbright) +"D" = ( +/turf/closed/indestructible/alien, +/area/deathmatch/fullbright) +"E" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/vault/alien, +/area/deathmatch/fullbright) +"F" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/machinery/light/floor, +/turf/open/floor/vault/alien, +/area/deathmatch/fullbright) +"H" = ( +/turf/open/floor/vault/alien, +/area/deathmatch/fullbright) +"I" = ( +/obj/machinery/light, +/turf/open/floor/vault/alien, +/area/deathmatch/fullbright) +"L" = ( +/obj/machinery/light, +/turf/open/floor/circuit/green, +/area/deathmatch/fullbright) +"N" = ( +/obj/machinery/door/airlock/titanium/glass, +/turf/open/floor/plating/abductor2, +/area/deathmatch/fullbright) +"Y" = ( +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/deathmatch/fullbright) + +(1,1,1) = {" +u +u +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +u +u +"} +(2,1,1) = {" +u +D +D +H +H +H +H +H +H +H +N +Y +Y +Y +Y +N +H +H +H +H +H +H +H +D +D +u +"} +(3,1,1) = {" +D +D +H +H +H +H +H +H +H +H +N +Y +Y +Y +Y +N +H +H +H +H +H +H +H +H +D +D +"} +(4,1,1) = {" +D +H +H +F +H +a +a +H +H +I +a +Y +Y +Y +Y +a +E +H +H +a +a +H +F +H +H +D +"} +(5,1,1) = {" +D +H +H +H +H +H +B +H +H +H +H +a +Y +Y +a +H +H +H +H +B +H +H +H +H +H +D +"} +(6,1,1) = {" +D +H +H +a +H +H +H +H +H +H +H +H +a +a +H +H +H +H +H +H +H +H +a +H +H +D +"} +(7,1,1) = {" +D +H +H +a +E +H +H +H +a +H +H +H +H +H +H +H +H +a +H +H +H +I +a +H +H +D +"} +(8,1,1) = {" +D +H +H +H +H +H +H +a +E +H +H +v +C +C +v +H +H +I +a +H +H +H +H +H +H +D +"} +(9,1,1) = {" +D +H +H +H +H +H +a +B +F +C +C +a +q +q +a +C +H +F +B +a +H +H +H +H +H +D +"} +(10,1,1) = {" +D +H +H +A +H +H +H +H +H +C +a +c +c +c +c +a +C +C +H +H +H +H +A +H +H +D +"} +(11,1,1) = {" +D +N +N +a +H +H +H +H +C +a +c +c +c +c +c +c +a +C +H +H +H +H +a +N +N +D +"} +(12,1,1) = {" +D +Y +Y +Y +a +H +H +L +a +c +c +c +c +c +c +c +c +a +y +H +H +a +Y +Y +Y +D +"} +(13,1,1) = {" +D +Y +Y +Y +Y +a +H +C +q +c +c +c +c +c +c +c +c +q +C +H +a +Y +Y +Y +Y +D +"} +(14,1,1) = {" +D +Y +Y +Y +Y +a +H +C +q +c +c +c +c +c +c +c +c +q +C +H +a +Y +Y +Y +Y +D +"} +(15,1,1) = {" +D +Y +Y +Y +a +H +H +L +a +c +c +c +c +c +c +c +c +a +y +H +H +a +Y +Y +Y +D +"} +(16,1,1) = {" +D +N +N +a +H +H +H +H +C +a +c +c +c +c +c +c +a +C +H +H +H +H +a +N +N +D +"} +(17,1,1) = {" +D +H +H +B +H +H +H +H +H +C +a +c +c +c +c +a +C +H +H +H +H +H +B +H +H +D +"} +(18,1,1) = {" +D +H +H +H +H +H +a +A +F +C +C +a +q +q +a +C +C +F +A +a +H +H +H +H +H +D +"} +(19,1,1) = {" +D +H +H +H +H +H +H +a +E +H +H +e +C +C +e +H +H +I +a +H +H +H +H +H +H +D +"} +(20,1,1) = {" +D +H +H +a +E +H +H +H +a +H +H +H +H +H +H +H +H +a +H +H +H +I +a +H +H +D +"} +(21,1,1) = {" +D +H +H +a +H +H +H +H +H +H +H +H +a +a +H +H +H +H +H +H +H +H +a +H +H +D +"} +(22,1,1) = {" +D +H +H +H +H +H +A +H +H +H +H +a +Y +Y +a +H +H +H +H +A +H +H +H +H +H +D +"} +(23,1,1) = {" +D +H +H +F +H +a +a +H +H +I +a +Y +Y +Y +Y +a +E +H +H +a +a +H +F +H +H +D +"} +(24,1,1) = {" +D +D +H +H +H +H +H +H +H +H +N +Y +Y +Y +Y +N +H +H +H +H +H +H +H +H +D +D +"} +(25,1,1) = {" +u +D +D +H +H +H +H +H +H +H +N +Y +Y +Y +Y +N +H +H +H +H +H +H +H +D +D +u +"} +(26,1,1) = {" +u +u +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +u +u +"} diff --git a/_maps/map_files/Deathmatch/meatower.dmm b/_maps/map_files/Deathmatch/meatower.dmm new file mode 100644 index 0000000000000..47613f8988554 --- /dev/null +++ b/_maps/map_files/Deathmatch/meatower.dmm @@ -0,0 +1,1105 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aD" = ( +/obj/machinery/conveyor/auto, +/obj/item/food/meat/slab/human/mutant/skeleton, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"db" = ( +/obj/machinery/griddle, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"et" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/item/food/meat/slab/corgi, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"eB" = ( +/obj/machinery/light{ + dir = 4 + }, +/mob/living/basic/goat/pete, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"eH" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"fq" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"fU" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"gh" = ( +/obj/machinery/deepfryer, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"gk" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/food/pizza/meat, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"gD" = ( +/obj/structure/table, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"gS" = ( +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"hz" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/food/meat/slab/human/mutant/skeleton, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"ip" = ( +/obj/structure/table, +/obj/item/food/pizza/donkpocket, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"iZ" = ( +/obj/item/food/pizza/pineapple, +/turf/open/lava/smooth, +/area/deathmatch) +"jq" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/item/knife/butcher, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"jT" = ( +/obj/machinery/gibber, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"jZ" = ( +/obj/structure/sign/poster/contraband/moffuchis_pizza, +/turf/closed/indestructible/necropolis, +/area/deathmatch) +"kn" = ( +/obj/item/food/pizzaslice/sassysage, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"kL" = ( +/obj/machinery/light, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"lu" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/siding/dark, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"me" = ( +/obj/machinery/conveyor/auto, +/obj/item/pizzabox/bomb, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"mu" = ( +/obj/item/stack/sheet/pizza/five, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"nl" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/pizzabox/mushroom, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"nr" = ( +/obj/structure/table, +/obj/item/pizzabox/bomb/armed, +/obj/item/knife/butcher, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"nt" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/item/pizzabox/bomb/armed, +/obj/effect/turf_decal/siding/dark, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"oB" = ( +/obj/machinery/conveyor/auto, +/obj/item/food/meat/slab/human, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"oH" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/effect/turf_decal/siding/dark, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"pg" = ( +/obj/machinery/vending/dinnerware, +/obj/machinery/light, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"pE" = ( +/obj/structure/table, +/obj/item/knife/butcher, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"pL" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/item/pizzabox/margherita/robo, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"qa" = ( +/obj/structure/table, +/obj/item/stack/sheet/animalhide/corgi, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"qg" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"qL" = ( +/obj/machinery/conveyor/auto{ + dir = 6 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"rb" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"sf" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"sQ" = ( +/obj/structure/closet/crate/coffin, +/obj/item/gun/magic/hook, +/obj/item/book/manual/wiki/cooking_to_serve_man, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"tB" = ( +/turf/open/indestructible/kitchen, +/area/deathmatch) +"uJ" = ( +/obj/item/food/meat/slab/corgi, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"uM" = ( +/obj/item/food/meat/slab/corgi, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"uV" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"uW" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"wF" = ( +/obj/structure/kitchenspike, +/obj/item/food/pizza/arnold, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"zB" = ( +/obj/item/food/pizzaslice/meat, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"zH" = ( +/obj/structure/table, +/obj/item/pizzabox/margherita, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"zR" = ( +/obj/structure/table, +/obj/item/pizzabox/bomb/armed, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Ce" = ( +/obj/machinery/conveyor/auto{ + dir = 9 + }, +/obj/item/food/meat/slab/human, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Ch" = ( +/obj/structure/table, +/obj/item/pizzabox, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"DJ" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/item/food/meat/slab/human/mutant/slime, +/obj/effect/turf_decal/siding/dark, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"DU" = ( +/obj/machinery/conveyor/auto, +/obj/item/food/meat/slab/corgi, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"EC" = ( +/obj/machinery/conveyor/auto, +/obj/item/food/pizzaslice/arnold, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"EU" = ( +/obj/item/food/pizzaslice/moldy/bacteria, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Fs" = ( +/obj/structure/barricade/wooden/crude, +/obj/structure/barricade/wooden, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"FA" = ( +/turf/open/lava/smooth, +/area/deathmatch) +"Ge" = ( +/obj/machinery/conveyor/auto{ + dir = 10 + }, +/obj/item/food/meat/slab/human, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"GS" = ( +/obj/item/food/pizzaslice/ants, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Hg" = ( +/obj/machinery/oven, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Hj" = ( +/obj/machinery/conveyor/auto, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Hx" = ( +/obj/structure/table, +/obj/item/food/pizzaslice/mothic_garlic, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"HR" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/item/food/meat/slab/gorilla, +/obj/effect/turf_decal/siding/dark, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Io" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/item/food/meat/slab/gorilla, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Jo" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"KO" = ( +/obj/machinery/vending/dinnerware, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"KP" = ( +/obj/structure/table, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"KW" = ( +/obj/structure/sign/poster/contraband/pizza_imperator, +/turf/closed/indestructible/necropolis, +/area/deathmatch) +"KZ" = ( +/obj/machinery/griddle, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"La" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/item/food/meat/slab/gondola, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Lg" = ( +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"Lo" = ( +/obj/machinery/conveyor/auto, +/obj/item/pizzabox/vegetable, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Mn" = ( +/obj/machinery/conveyor/auto{ + dir = 5 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Mr" = ( +/obj/machinery/deepfryer, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"NF" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/food/meat/slab/human/mutant/slime, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"NG" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/item/pizzabox/bomb/armed, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Oq" = ( +/turf/closed/indestructible/necropolis, +/area/deathmatch) +"Tn" = ( +/obj/item/pizzabox/infinite, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"Ue" = ( +/obj/item/food/pizzaslice/sassysage, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"Up" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"XA" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = -9 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"XQ" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/structure/closet/secure_closet/freezer/meat, +/obj/item/toy/plush/lizard_plushie/green, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"XU" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/machinery/light/floor, +/turf/open/indestructible/kitchen, +/area/deathmatch) + +(1,1,1) = {" +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +"} +(2,1,1) = {" +qg +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +iZ +qg +"} +(3,1,1) = {" +qg +FA +Mn +sf +sf +NF +sf +sf +sf +sf +sf +gk +sf +sf +sf +hz +sf +nl +sf +sf +Ce +FA +qg +"} +(4,1,1) = {" +qg +FA +pL +tB +zR +gD +db +tB +uJ +tB +tB +tB +tB +GS +tB +zR +Up +db +tB +uW +oH +FA +qg +"} +(5,1,1) = {" +qg +FA +fU +tB +tB +XU +tB +tB +tB +tB +tB +tB +tB +tB +tB +tB +tB +tB +XU +qa +nt +FA +qg +"} +(6,1,1) = {" +qg +FA +Io +tB +tB +tB +tB +tB +Mr +Up +KP +tB +tB +tB +Mr +tB +tB +tB +tB +zR +oH +FA +qg +"} +(7,1,1) = {" +qg +FA +XQ +gh +tB +tB +tB +tB +Oq +Oq +Oq +gS +Oq +Oq +Oq +Ch +tB +tB +tB +tB +oH +FA +qg +"} +(8,1,1) = {" +qg +FA +fU +fq +tB +GS +pg +Oq +Oq +gS +gS +zB +gS +mu +Oq +Oq +db +tB +EU +tB +oH +FA +qg +"} +(9,1,1) = {" +qg +FA +fU +nr +tB +tB +Oq +Oq +eH +gS +Oq +gS +Oq +gS +jT +Oq +Oq +rb +tB +XA +HR +FA +qg +"} +(10,1,1) = {" +qg +FA +La +db +tB +tB +Oq +mu +gS +gS +gS +gS +gS +gS +gS +gS +Oq +gh +tB +pE +oH +FA +qg +"} +(11,1,1) = {" +qg +FA +fU +tB +tB +tB +Oq +gS +Oq +gS +KW +Lg +Oq +gS +Oq +uM +Oq +tB +tB +tB +oH +FA +qg +"} +(12,1,1) = {" +qg +FA +uV +kn +tB +tB +gS +gS +gS +Tn +Fs +sQ +Fs +gS +gS +gS +gS +tB +tB +tB +lu +FA +qg +"} +(13,1,1) = {" +qg +FA +fU +tB +tB +tB +Oq +gS +Oq +gS +Oq +Lg +jZ +gS +Oq +gS +Oq +Hx +tB +tB +DJ +FA +qg +"} +(14,1,1) = {" +qg +FA +jq +tB +tB +tB +Oq +gS +gS +Ue +gS +gS +gS +gS +gS +gS +Oq +zH +tB +tB +oH +FA +qg +"} +(15,1,1) = {" +qg +FA +fU +tB +tB +kL +Oq +Oq +eB +gS +Oq +gS +Oq +gS +wF +Oq +Oq +KZ +tB +tB +oH +FA +qg +"} +(16,1,1) = {" +qg +FA +NG +tB +tB +tB +gh +Oq +Oq +mu +gS +gS +gS +gS +Oq +Oq +gh +tB +tB +tB +oH +FA +qg +"} +(17,1,1) = {" +qg +FA +fU +tB +fq +tB +tB +Hg +Oq +Oq +Oq +gS +Oq +Oq +Oq +tB +tB +tB +tB +KO +oH +FA +qg +"} +(18,1,1) = {" +qg +FA +et +tB +ip +tB +tB +tB +Jo +tB +tB +tB +tB +GS +Jo +tB +Hg +tB +tB +KP +oH +FA +qg +"} +(19,1,1) = {" +qg +FA +fU +tB +tB +XU +tB +tB +tB +tB +tB +tB +tB +tB +tB +tB +db +tB +XU +pE +oH +FA +qg +"} +(20,1,1) = {" +qg +FA +fU +tB +tB +tB +tB +tB +tB +tB +db +zR +Up +tB +tB +tB +KP +tB +tB +tB +oH +FA +qg +"} +(21,1,1) = {" +qg +FA +qL +Hj +Hj +aD +Hj +EC +Hj +DU +Hj +Lo +Hj +Hj +oB +Hj +Hj +me +Hj +Hj +Ge +FA +qg +"} +(22,1,1) = {" +qg +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +qg +"} +(23,1,1) = {" +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +"} diff --git a/_maps/map_files/Deathmatch/mech_madness.dmm b/_maps/map_files/Deathmatch/mech_madness.dmm new file mode 100644 index 0000000000000..d36ccfb16cc20 --- /dev/null +++ b/_maps/map_files/Deathmatch/mech_madness.dmm @@ -0,0 +1,1649 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ac" = ( +/turf/closed/indestructible/alien, +/area/deathmatch) +"ad" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_ammo/lmg, +/obj/item/mecha_ammo/lmg{ + pixel_y = 12 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 18 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 24 + }, +/turf/open/floor/carpet/neon/simple/yellow, +/area/deathmatch) +"ae" = ( +/obj/machinery/door/poddoor/shutters{ + id = "dm4" + }, +/turf/open/floor/engine, +/area/deathmatch) +"af" = ( +/obj/machinery/button/door{ + id = "dm3"; + pixel_y = 24 + }, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"aj" = ( +/turf/open/floor/engine, +/area/deathmatch) +"am" = ( +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"an" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/utility/welding, +/obj/machinery/light/directional/west, +/obj/item/inducer, +/obj/item/weldingtool/largetank, +/turf/open/floor/carpet/neon/simple/yellow, +/area/deathmatch) +"ao" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg{ + pixel_y = -8 + }, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot{ + pixel_y = 8 + }, +/turf/open/floor/carpet/neon/simple/yellow, +/area/deathmatch) +"as" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/box, +/obj/machinery/button/door{ + id = "dm1"; + pixel_x = 24 + }, +/turf/open/floor/carpet/neon/simple/yellow, +/area/deathmatch) +"at" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/box, +/obj/machinery/button/door{ + id = "dm4"; + pixel_y = 0; + pixel_x = -24 + }, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"aw" = ( +/turf/open/floor/carpet/neon/simple/purple, +/area/deathmatch) +"ax" = ( +/turf/closed/wall/mineral/plastitanium, +/area/deathmatch) +"az" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/carpet/neon/simple/red, +/area/deathmatch) +"aA" = ( +/obj/vehicle/sealed/mecha/gygax, +/turf/open/floor/carpet/neon/simple/yellow, +/area/deathmatch) +"aB" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4; + icon_state = "trimline_warn_fill" + }, +/turf/open/floor/engine, +/area/deathmatch) +"aC" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/engine, +/area/deathmatch) +"aE" = ( +/mob/living/carbon/human/species/monkey/angry, +/turf/open/floor/engine, +/area/deathmatch) +"aG" = ( +/turf/open/lava, +/area/deathmatch) +"aH" = ( +/obj/vehicle/sealed/mecha/gygax, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"aI" = ( +/turf/open/floor/carpet/neon/simple/lime, +/area/deathmatch) +"aJ" = ( +/turf/open/floor/carpet/neon/simple/red, +/area/deathmatch) +"aK" = ( +/turf/open/floor/carpet/neon/simple/violet, +/area/deathmatch) +"aL" = ( +/obj/item/chair, +/turf/open/floor/engine, +/area/deathmatch) +"aN" = ( +/obj/structure/table/reinforced, +/obj/item/gun/energy/laser, +/turf/open/floor/engine, +/area/deathmatch) +"aP" = ( +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/deathmatch) +"aQ" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/engine, +/area/deathmatch) +"aR" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/engine, +/area/deathmatch) +"aS" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy, +/turf/open/floor/engine, +/area/deathmatch) +"aV" = ( +/obj/structure/barricade/security, +/turf/open/floor/carpet/neon/simple/red, +/area/deathmatch) +"aW" = ( +/obj/structure/table, +/turf/open/floor/engine, +/area/deathmatch) +"aY" = ( +/obj/structure/closet/crate/trashcart/filled, +/obj/item/weldingtool, +/turf/open/floor/engine, +/area/deathmatch) +"aZ" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/engine, +/area/deathmatch) +"ba" = ( +/obj/structure/closet/crate/trashcart/filled, +/obj/machinery/light/directional/west, +/turf/open/floor/engine, +/area/deathmatch) +"bb" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/engine, +/area/deathmatch) +"bc" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/engine, +/area/deathmatch) +"bd" = ( +/obj/item/gun/energy/laser/hellgun, +/obj/structure/closet/crate/trashcart/filled, +/turf/open/floor/engine, +/area/deathmatch) +"be" = ( +/obj/machinery/stasis, +/turf/open/floor/engine, +/area/deathmatch) +"bf" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/carpet/neon/simple/purple, +/area/deathmatch) +"bh" = ( +/turf/open/floor/carpet/neon/simple/orange, +/area/deathmatch) +"bi" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1; + icon_state = "trimline_warn_fill" + }, +/turf/open/floor/engine, +/area/deathmatch) +"bj" = ( +/obj/machinery/sleeper{ + dir = 4; + icon_state = "sleeper" + }, +/turf/open/floor/engine, +/area/deathmatch) +"bk" = ( +/obj/vehicle/ridden/atv, +/obj/item/key/atv, +/turf/open/floor/engine, +/area/deathmatch) +"bl" = ( +/obj/machinery/sleeper{ + dir = 8; + icon_state = "sleeper" + }, +/turf/open/floor/engine, +/area/deathmatch) +"bm" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/engine, +/area/deathmatch) +"bn" = ( +/obj/machinery/vending/assist, +/turf/open/floor/engine, +/area/deathmatch) +"bo" = ( +/obj/machinery/vending/sustenance, +/turf/open/floor/engine, +/area/deathmatch) +"bp" = ( +/obj/item/grenade/smokebomb, +/turf/open/floor/engine, +/area/deathmatch) +"bq" = ( +/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster, +/turf/open/floor/engine, +/area/deathmatch) +"br" = ( +/obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster, +/turf/open/floor/engine, +/area/deathmatch) +"bs" = ( +/turf/open/floor/carpet/neon/simple/blue, +/area/deathmatch) +"bt" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/box, +/obj/machinery/button/door{ + id = "dm2"; + pixel_x = 24 + }, +/turf/open/floor/carpet/neon/simple/orange, +/area/deathmatch) +"bu" = ( +/turf/open/floor/carpet/neon/simple/yellow, +/area/deathmatch) +"bv" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/utility/welding, +/obj/machinery/light/directional/east, +/obj/item/inducer, +/obj/item/weldingtool/largetank, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"bw" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"bx" = ( +/obj/machinery/door/poddoor/shutters{ + id = "dm1" + }, +/turf/open/floor/engine, +/area/deathmatch) +"by" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg{ + pixel_y = -8 + }, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot{ + pixel_y = 8 + }, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"bz" = ( +/obj/machinery/vending/medical, +/turf/open/floor/engine, +/area/deathmatch) +"bB" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/turf/open/floor/engine, +/area/deathmatch) +"bF" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8; + icon_state = "trimline_warn_fill" + }, +/turf/open/floor/engine, +/area/deathmatch) +"bG" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_ammo/lmg, +/obj/item/mecha_ammo/lmg{ + pixel_y = 12 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 18 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 24 + }, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"bH" = ( +/obj/structure/table_frame, +/turf/open/floor/carpet/neon/simple/violet, +/area/deathmatch) +"bJ" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/engine, +/area/deathmatch) +"bL" = ( +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/engine, +/area/deathmatch) +"bM" = ( +/obj/structure/window/fulltile, +/turf/open/floor/engine, +/area/deathmatch) +"bN" = ( +/obj/structure/showcase/horrific_experiment, +/turf/open/floor/engine, +/area/deathmatch) +"bO" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/engine, +/area/deathmatch) +"bP" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"bR" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/engine, +/area/deathmatch) +"bS" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/engine, +/area/deathmatch) +"bT" = ( +/obj/item/shard, +/turf/open/floor/engine, +/area/deathmatch) +"bV" = ( +/turf/open/floor/noslip, +/area/deathmatch) +"bW" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"bY" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"bZ" = ( +/obj/machinery/recharger, +/obj/structure/table, +/turf/open/floor/engine, +/area/deathmatch) +"ca" = ( +/obj/structure/table, +/obj/item/storage/briefcase, +/turf/open/floor/engine, +/area/deathmatch) +"cc" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/engine, +/area/deathmatch) +"cd" = ( +/obj/item/grenade/smokebomb, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"ce" = ( +/obj/structure/chair{ + dir = 1; + icon_state = "chair" + }, +/turf/open/floor/engine, +/area/deathmatch) +"cg" = ( +/obj/structure/showcase/machinery/cloning_pod, +/turf/open/floor/engine, +/area/deathmatch) +"ch" = ( +/obj/structure/chair/office, +/turf/open/floor/engine, +/area/deathmatch) +"ci" = ( +/obj/structure/cannon{ + dir = 8; + icon_state = "falconet_patina" + }, +/turf/open/floor/sepia, +/area/deathmatch) +"ck" = ( +/turf/open/floor/sepia, +/area/deathmatch) +"cl" = ( +/obj/item/reagent_containers/syringe, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/deathmatch) +"cm" = ( +/obj/item/gun/ballistic/revolver/c38/detective, +/obj/structure/table/wood, +/turf/open/floor/sepia, +/area/deathmatch) +"cn" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/sepia, +/area/deathmatch) +"cp" = ( +/obj/structure/window/spawner/directional/south, +/turf/open/floor/sepia, +/area/deathmatch) +"cq" = ( +/obj/item/gun/ballistic/rifle/boltaction/pipegun, +/obj/structure/table/wood, +/turf/open/floor/sepia, +/area/deathmatch) +"cr" = ( +/obj/item/gun/ballistic/rifle/boltaction, +/obj/structure/table/wood, +/turf/open/floor/sepia, +/area/deathmatch) +"ct" = ( +/obj/structure/window/spawner/directional/west{ + icon_state = "window" + }, +/obj/item/lighter, +/turf/open/floor/sepia, +/area/deathmatch) +"cv" = ( +/obj/item/reagent_containers/cup/bucket/wooden, +/obj/machinery/light/directional/south, +/turf/open/floor/sepia, +/area/deathmatch) +"cw" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"cx" = ( +/obj/structure/fermenting_barrel/gunpowder, +/turf/open/floor/sepia, +/area/deathmatch) +"cy" = ( +/obj/structure/toilet{ + dir = 8; + icon_state = "toilet00" + }, +/turf/open/floor/light, +/area/deathmatch) +"cz" = ( +/obj/item/stack/cannonball/fourteen, +/obj/structure/table/wood, +/turf/open/floor/sepia, +/area/deathmatch) +"cA" = ( +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/nuka_cola, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/deathmatch) +"cB" = ( +/obj/item/reagent_containers/pill/stimulant, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/deathmatch) +"cC" = ( +/obj/machinery/recharge_station, +/turf/open/floor/engine, +/area/deathmatch) +"cD" = ( +/obj/structure/barricade/security, +/turf/open/floor/engine, +/area/deathmatch) +"cE" = ( +/obj/structure/table, +/turf/open/floor/carpet/neon/simple/violet, +/area/deathmatch) +"cF" = ( +/obj/structure/barricade/security, +/turf/open/floor/carpet/neon/simple/violet, +/area/deathmatch) +"cG" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/utility/welding, +/obj/machinery/light/directional/east, +/obj/item/inducer, +/obj/item/weldingtool/largetank, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"cH" = ( +/obj/machinery/sheetifier, +/turf/open/floor/engine, +/area/deathmatch) +"cI" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/carpet/neon/simple/lime, +/area/deathmatch) +"cK" = ( +/obj/structure/table, +/obj/item/mecha_parts/mecha_equipment/repair_droid, +/turf/open/floor/engine, +/area/deathmatch) +"cL" = ( +/obj/structure/table, +/obj/item/grenade/smokebomb, +/turf/open/floor/engine, +/area/deathmatch) +"cM" = ( +/obj/item/reagent_containers/pill/happinesspsych, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/deathmatch) +"cN" = ( +/obj/item/fireaxe, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/deathmatch) +"cO" = ( +/obj/structure/table_frame, +/turf/open/floor/engine, +/area/deathmatch) +"cP" = ( +/obj/structure/urinal{ + pixel_y = 24 + }, +/turf/open/floor/noslip, +/area/deathmatch) +"cQ" = ( +/obj/item/reagent_containers/pill/lsd, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/deathmatch) +"cR" = ( +/obj/item/reagent_containers/pill/probital, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/deathmatch) +"cS" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/turf/open/floor/engine, +/area/deathmatch) +"cT" = ( +/obj/item/inducer, +/obj/item/weldingtool, +/turf/open/floor/engine, +/area/deathmatch) +"cU" = ( +/obj/machinery/door/poddoor/shutters{ + id = "dm2" + }, +/turf/open/floor/engine, +/area/deathmatch) +"cV" = ( +/obj/item/mecha_ammo/scattershot, +/turf/open/floor/engine, +/area/deathmatch) +"cW" = ( +/obj/machinery/grill, +/turf/open/floor/engine, +/area/deathmatch) +"cX" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/box, +/obj/machinery/button/door{ + id = "dm3"; + pixel_x = -24 + }, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"cY" = ( +/obj/machinery/door/poddoor/shutters{ + id = "dm3" + }, +/turf/open/floor/engine, +/area/deathmatch) +"cZ" = ( +/obj/machinery/sheetifier, +/obj/machinery/light/directional/east, +/turf/open/floor/engine, +/area/deathmatch) +"da" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/engine, +/area/deathmatch) +"db" = ( +/obj/vehicle/sealed/mecha/gygax, +/turf/open/floor/carpet/neon/simple/orange, +/area/deathmatch) +"dc" = ( +/obj/machinery/grill, +/obj/machinery/light/directional/west, +/turf/open/floor/engine, +/area/deathmatch) +"dd" = ( +/obj/structure/table, +/obj/item/food/meat/rawcutlet, +/turf/open/floor/engine, +/area/deathmatch) +"df" = ( +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"dg" = ( +/obj/vehicle/sealed/mecha/gygax, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"dh" = ( +/obj/structure/closet/l3closet/janitor, +/turf/open/floor/engine, +/area/deathmatch) +"di" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/utility/welding, +/obj/item/weldingtool/largetank, +/obj/machinery/light/directional/west, +/obj/item/inducer, +/turf/open/floor/carpet/neon/simple/orange, +/area/deathmatch) +"dk" = ( +/obj/structure/table, +/obj/item/storage/belt/janitor, +/turf/open/floor/engine, +/area/deathmatch) +"eK" = ( +/obj/structure/table, +/obj/item/food/meat/slab/bear, +/turf/open/floor/engine, +/area/deathmatch) +"gg" = ( +/obj/structure/table, +/obj/item/mop, +/turf/open/floor/engine, +/area/deathmatch) +"go" = ( +/turf/open/floor/carpet/neon/simple/pink, +/area/deathmatch) +"gF" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_ammo/lmg, +/obj/item/mecha_ammo/lmg{ + pixel_y = 12 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 18 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 24 + }, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"nE" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg{ + pixel_y = -8 + }, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot{ + pixel_y = 8 + }, +/turf/open/floor/carpet/neon/simple/orange, +/area/deathmatch) +"ot" = ( +/obj/structure/mop_bucket/janitorialcart{ + dir = 4 + }, +/turf/open/floor/engine, +/area/deathmatch) +"pD" = ( +/obj/machinery/button/door{ + id = "dm1"; + pixel_y = -24 + }, +/turf/open/floor/carpet/neon/simple/yellow, +/area/deathmatch) +"sc" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_ammo/lmg, +/obj/item/mecha_ammo/lmg{ + pixel_y = 12 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 18 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 24 + }, +/turf/open/floor/carpet/neon/simple/orange, +/area/deathmatch) +"tY" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/engine, +/area/deathmatch) +"yI" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/light/directional/south, +/turf/open/floor/engine, +/area/deathmatch) +"Br" = ( +/obj/machinery/button/door{ + id = "dm4"; + pixel_y = -24 + }, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"ES" = ( +/obj/item/storage/bag/trash, +/turf/open/floor/engine, +/area/deathmatch) +"Ij" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/bucket, +/turf/open/floor/engine, +/area/deathmatch) +"Jo" = ( +/obj/machinery/vending/wardrobe/jani_wardrobe, +/turf/open/floor/engine, +/area/deathmatch) +"ME" = ( +/obj/structure/table, +/obj/item/food/meat/slab/pig, +/turf/open/floor/engine, +/area/deathmatch) +"PK" = ( +/obj/item/storage/medkit/regular, +/turf/open/floor/noslip, +/area/deathmatch) +"RN" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/deathmatch) +"XP" = ( +/obj/machinery/button/door{ + id = "dm2"; + pixel_y = 24 + }, +/turf/open/floor/carpet/neon/simple/orange, +/area/deathmatch) +"Zw" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg{ + pixel_y = -8 + }, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot{ + pixel_y = 8 + }, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) + +(1,1,1) = {" +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +"} +(2,1,1) = {" +ac +ad +an +bu +bx +aj +ax +aQ +bM +aj +ax +be +bj +bj +br +ax +aQ +bb +aj +ax +cC +aQ +cU +bh +di +sc +ac +"} +(3,1,1) = {" +ac +ao +aJ +pD +ac +aj +ax +aj +bM +aZ +bP +bY +aj +aj +aj +ax +aj +bb +aj +ax +cC +aj +ac +XP +bs +nE +ac +"} +(4,1,1) = {" +ac +bu +as +aA +ac +aj +da +aj +bM +aj +ax +df +df +df +bw +ax +aj +bb +aj +ax +aj +aj +ac +db +bt +bh +ac +"} +(5,1,1) = {" +ac +bx +ac +ac +ac +aj +ax +aj +bM +aj +ax +bR +aj +aj +bY +cw +bW +am +am +cw +aj +aj +ac +ac +ac +cU +ac +"} +(6,1,1) = {" +ac +aj +aj +aj +aj +aj +ax +aj +bM +aj +ax +aj +bk +aj +aj +ax +aj +cd +aj +ax +aj +aj +aj +aj +aj +aj +ac +"} +(7,1,1) = {" +ac +aj +aj +aj +aj +aj +ax +aj +bM +bc +ax +bZ +bl +bl +bz +ax +aj +am +bc +ax +aj +cH +cH +cZ +aj +aj +ac +"} +(8,1,1) = {" +ac +ax +ax +da +ax +ax +ax +ax +ax +ax +ax +ax +ax +ax +ax +ax +ax +cw +ax +ax +ax +ax +ax +ax +ax +da +ac +"} +(9,1,1) = {" +ac +az +aJ +aJ +aJ +aJ +aJ +aJ +aJ +aJ +az +ax +bm +aj +aQ +bO +aj +aK +aj +aj +aQ +aj +aj +ax +dk +aj +ac +"} +(10,1,1) = {" +ac +aJ +cD +cD +cD +aj +aj +aj +aj +aj +aJ +ax +bn +aj +aK +aK +aK +aK +cD +cD +cE +cK +aj +ax +Ij +aj +ac +"} +(11,1,1) = {" +ac +aJ +aj +aB +aB +aj +aj +aB +aB +aj +aJ +ax +bo +aj +aK +aj +aj +aj +aj +aj +aK +cL +aj +ax +gg +yI +ac +"} +(12,1,1) = {" +ac +aJ +bB +aG +aG +bi +bB +aG +aG +bi +aJ +aC +aj +aj +aK +aj +ca +ce +aj +aj +aK +aj +aj +ax +aj +aj +ac +"} +(13,1,1) = {" +ac +aJ +aj +bF +bF +aj +aj +bF +bF +aj +aJ +bf +aK +aK +aK +ch +aW +ce +aj +aj +aK +aK +aK +bf +aj +aj +ac +"} +(14,1,1) = {" +ac +aJ +aj +aj +aj +aj +aj +aj +aj +cD +aV +aC +aj +cD +aK +aj +cc +ce +aj +aj +aK +aj +aj +ax +ot +aj +ac +"} +(15,1,1) = {" +ac +aV +cD +aj +aJ +aJ +aJ +aJ +aj +aj +aJ +ax +aj +cD +aK +aj +aj +aj +aj +aj +cF +cD +aj +ax +ES +tY +ac +"} +(16,1,1) = {" +ac +aJ +aj +aj +aJ +aN +aS +aJ +aj +aj +aJ +ax +aj +cD +bH +aK +aK +aK +aK +aK +cF +cO +aL +ax +dh +aj +ac +"} +(17,1,1) = {" +ac +aJ +aj +aj +aJ +bJ +aN +aJ +aj +aj +aJ +ax +aj +aL +bc +aj +aj +aK +aj +aj +bc +aj +cV +ax +Jo +aj +ac +"} +(18,1,1) = {" +ac +aJ +aj +aj +aJ +aJ +aJ +aJ +aj +aj +aJ +ax +ax +ax +ax +ax +RN +da +ax +ax +ax +ax +ax +ax +ax +da +ac +"} +(19,1,1) = {" +ac +aJ +aj +aj +aj +aj +aj +aj +aj +aj +aJ +ax +aj +bq +aj +aj +ax +ck +cp +cm +ax +cP +bV +bV +PK +bV +ac +"} +(20,1,1) = {" +ac +aJ +aj +aB +aB +aj +aj +aB +aB +aj +aV +ax +aj +cg +cg +aj +ax +ck +cp +cq +ax +cP +cy +cy +bV +bV +ac +"} +(21,1,1) = {" +ac +aJ +bB +aG +aG +bi +bB +aG +aG +bi +aJ +ax +aj +aj +aj +aE +ax +ck +cp +cr +ax +ax +ax +ax +ax +da +ac +"} +(22,1,1) = {" +ac +aJ +aj +bF +bF +aj +aj +bF +bF +aj +aJ +ax +bp +cg +cg +aj +ax +cn +ck +ct +ax +cS +cW +dc +aj +aj +ac +"} +(23,1,1) = {" +ac +aJ +cD +cD +cD +aj +aj +aj +aj +aj +aJ +cI +aI +aI +aI +aI +cI +ck +ck +ck +da +aj +aj +aj +aj +aj +ac +"} +(24,1,1) = {" +ac +az +aJ +aJ +aJ +aJ +aJ +aJ +aJ +aJ +az +ax +aj +aE +bL +aj +ax +ck +ck +cv +ax +cT +aj +dd +ME +eK +ac +"} +(25,1,1) = {" +ac +ax +ax +da +ax +ax +ax +ax +ax +ax +ax +ax +aj +cg +bN +bS +ax +ci +ck +cx +ax +ax +da +ax +ax +ax +ac +"} +(26,1,1) = {" +ac +aj +aj +aj +aj +aQ +aj +ax +aY +ba +bd +ax +aE +aj +aR +bT +ax +ck +ck +cz +ax +aj +aj +aQ +aj +aj +ac +"} +(27,1,1) = {" +ac +ae +ac +ac +ac +aj +aj +da +aj +aj +aj +ax +aj +cg +cg +aE +ax +ax +da +ax +ax +aj +ac +ac +ac +cY +ac +"} +(28,1,1) = {" +ac +am +at +aH +ac +aj +aj +ax +aj +bb +aj +ax +ax +ax +ax +ax +RN +aP +cl +cA +ax +aj +ac +dg +cX +df +ac +"} +(29,1,1) = {" +ac +by +aw +Br +ac +aj +aj +ax +aj +bb +aj +aj +bb +aj +aj +aj +da +cM +cQ +cB +ax +aj +ac +af +go +Zw +ac +"} +(30,1,1) = {" +ac +bG +cG +am +ae +aj +aj +ax +aj +bb +aj +bc +aj +aj +bb +aj +ax +cN +cR +cQ +da +aj +cY +df +bv +gF +ac +"} +(31,1,1) = {" +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +"} diff --git a/_maps/map_files/Deathmatch/ragecage.dmm b/_maps/map_files/Deathmatch/ragecage.dmm new file mode 100644 index 0000000000000..b5871e89c24f1 --- /dev/null +++ b/_maps/map_files/Deathmatch/ragecage.dmm @@ -0,0 +1,575 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/item/melee/baseball_bat, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"b" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"c" = ( +/obj/item/cardboard_cutout/adaptive{ + starting_cutout = "Private Security Officer" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/cardboard_cutout/adaptive{ + starting_cutout = "Private Security Officer" + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"d" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/indestructible/plating, +/area/deathmatch) +"f" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"g" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/indestructible/plating, +/area/deathmatch) +"i" = ( +/obj/effect/spawner/random/trash/mess, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"k" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"l" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"m" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/cardboard_cutout/adaptive{ + starting_cutout = "Private Security Officer" + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"o" = ( +/turf/closed/indestructible/grille, +/area/deathmatch) +"p" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/power/rtg/debug{ + power_gen = 50000; + name = "dumb idiot shocker powerer"; + desc = "Dont touch the grilles idiot" + }, +/obj/structure/cable, +/turf/open/indestructible/plating, +/area/deathmatch) +"q" = ( +/turf/closed/indestructible/fakedoor/engineering, +/area/deathmatch) +"t" = ( +/obj/effect/spawner/random/trash/graffiti, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"u" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/turf/open/indestructible/plating, +/area/deathmatch) +"w" = ( +/obj/effect/decal/cleanable/blood/gibs/limb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"x" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/spawner/structure/electrified_grille, +/turf/open/indestructible/plating, +/area/deathmatch) +"z" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/indestructible/plating, +/area/deathmatch) +"A" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/indestructible/plating, +/area/deathmatch) +"B" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/cardboard_cutout/adaptive{ + starting_cutout = "Private Security Officer" + }, +/obj/structure/cable, +/turf/open/indestructible/plating, +/area/deathmatch) +"C" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"D" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/clothing/mask/gas, +/turf/open/indestructible/plating, +/area/deathmatch) +"G" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"H" = ( +/turf/closed/indestructible/fakedoor/maintenance, +/area/deathmatch) +"I" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/spear, +/turf/open/indestructible/plating, +/area/deathmatch) +"K" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/indestructible/plating, +/area/deathmatch) +"L" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/indestructible/plating, +/area/deathmatch) +"M" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/flashlight/flare{ + start_on = 1; + icon_state = "flare-on" + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"N" = ( +/obj/effect/decal/cleanable/blood/gibs/down, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"P" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/indestructible/plating, +/area/deathmatch) +"Q" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"R" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/indestructible/plating, +/area/deathmatch) +"S" = ( +/obj/effect/decal/cleanable/blood/gibs/torso, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"U" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"V" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/cardboard_cutout/adaptive{ + starting_cutout = "Private Security Officer" + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"X" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/storage/toolbox/mechanical/old, +/turf/open/indestructible/plating, +/area/deathmatch) +"Z" = ( +/turf/cordon, +/area/deathmatch) + +(1,1,1) = {" +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +"} +(2,1,1) = {" +Z +G +G +H +G +o +G +H +G +H +G +o +G +H +G +G +Z +"} +(3,1,1) = {" +Z +G +p +u +U +U +U +D +U +U +U +I +U +U +f +G +Z +"} +(4,1,1) = {" +Z +G +U +B +V +V +V +V +V +V +V +c +V +V +X +G +Z +"} +(5,1,1) = {" +Z +G +U +L +A +A +A +A +A +A +A +A +A +g +U +G +Z +"} +(6,1,1) = {" +Z +G +U +d +U +U +U +l +C +Q +t +U +U +x +U +G +Z +"} +(7,1,1) = {" +Z +G +X +d +U +M +U +U +b +k +U +U +U +x +U +q +Z +"} +(8,1,1) = {" +Z +G +U +d +U +U +t +U +U +k +U +M +U +R +U +G +Z +"} +(9,1,1) = {" +Z +G +U +d +U +U +U +i +a +U +N +U +U +R +U +o +Z +"} +(10,1,1) = {" +Z +G +D +d +U +b +U +a +U +a +U +b +t +R +D +o +Z +"} +(11,1,1) = {" +Z +G +U +d +t +U +S +U +a +U +U +U +U +R +U +o +Z +"} +(12,1,1) = {" +Z +G +I +d +U +U +U +M +U +U +U +U +U +R +U +G +Z +"} +(13,1,1) = {" +Z +G +U +d +U +U +U +U +b +t +U +U +i +R +I +q +Z +"} +(14,1,1) = {" +Z +G +U +d +U +U +w +U +U +U +U +U +M +R +U +G +Z +"} +(15,1,1) = {" +Z +G +U +z +P +P +P +P +P +P +P +P +P +K +U +G +Z +"} +(16,1,1) = {" +Z +G +U +m +m +m +m +m +m +m +m +m +m +m +U +G +Z +"} +(17,1,1) = {" +Z +G +f +U +U +X +U +U +U +U +I +U +U +U +f +G +Z +"} +(18,1,1) = {" +Z +G +G +H +G +o +G +H +G +H +G +o +G +H +G +G +Z +"} +(19,1,1) = {" +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +"} diff --git a/_maps/map_files/Deathmatch/raidthebase.dmm b/_maps/map_files/Deathmatch/raidthebase.dmm new file mode 100644 index 0000000000000..99e501a1b3aea --- /dev/null +++ b/_maps/map_files/Deathmatch/raidthebase.dmm @@ -0,0 +1,1250 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"bc" = ( +/obj/machinery/door/poddoor/shutters/indestructible/preopen{ + dir = 1 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"bw" = ( +/obj/machinery/griddle, +/turf/open/indestructible/stone, +/area/deathmatch) +"bR" = ( +/obj/effect/turf_decal/caution, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"cF" = ( +/obj/structure/sign/poster/contraband/donk_co/directional/south, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"cH" = ( +/obj/structure/table, +/obj/item/food/meatball{ + pixel_y = 6; + pixel_x = -5 + }, +/obj/item/food/meatball{ + pixel_y = 1; + pixel_x = 4 + }, +/obj/item/food/meatball{ + pixel_y = 8; + pixel_x = 4 + }, +/obj/item/food/meatball{ + pixel_y = -4; + pixel_x = -6 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"cP" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/obj/item/clothing/gloves/tackler/offbrand, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"df" = ( +/obj/structure/mystery_box/tdome{ + pixel_y = 0 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"fu" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/obj/item/claymore, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"fv" = ( +/obj/structure/rack, +/obj/item/grenade/chem_grenade/clf3{ + pixel_y = 6; + pixel_x = -1 + }, +/obj/item/grenade/chem_grenade/clf3{ + pixel_x = 7 + }, +/obj/item/grenade/frag, +/obj/item/grenade/frag{ + pixel_y = 6; + pixel_x = 9 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"fx" = ( +/obj/structure/closet/crate/trashcart/filled, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"fE" = ( +/obj/machinery/door/poddoor/shutters/indestructible/preopen{ + dir = 1 + }, +/obj/structure/barricade/sandbags, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"fI" = ( +/obj/structure/table, +/obj/item/food/bbqribs{ + pixel_y = 8; + pixel_x = -1 + }, +/obj/item/food/bbqribs{ + pixel_y = 5 + }, +/obj/item/food/bbqribs{ + pixel_y = 2; + pixel_x = -2 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"fT" = ( +/obj/structure/shipping_container/nakamura, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"fU" = ( +/obj/structure/table, +/turf/open/indestructible/dark, +/area/deathmatch) +"gg" = ( +/obj/structure/closet/crate/cardboard, +/obj/item/storage/toolbox/mechanical, +/obj/item/storage/toolbox/emergency/turret, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"gG" = ( +/obj/structure/barricade/sandbags, +/turf/open/indestructible/stone, +/area/deathmatch) +"hC" = ( +/obj/item/stack/spacecash/c1000, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"hN" = ( +/turf/open/indestructible/stone, +/area/deathmatch) +"im" = ( +/obj/structure/closet/crate/medical, +/obj/item/storage/medkit/advanced, +/turf/open/indestructible/dark, +/area/deathmatch) +"in" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/structure/sign/departments/med/directional/west, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"iQ" = ( +/obj/structure/barricade/sandbags, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"iS" = ( +/obj/structure/rack, +/obj/item/storage/medkit/advanced, +/turf/open/indestructible/dark, +/area/deathmatch) +"jy" = ( +/obj/structure/sign/poster/contraband/donk_co/directional/north, +/obj/structure/mystery_box/tdome{ + pixel_y = 0 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"jH" = ( +/turf/open/indestructible/dark, +/area/deathmatch) +"kc" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"kU" = ( +/obj/machinery/light/cold/directional/west, +/turf/open/indestructible/dark, +/area/deathmatch) +"mg" = ( +/obj/machinery/oven, +/turf/open/indestructible/stone, +/area/deathmatch) +"ms" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/obj/item/gun/ballistic/automatic/pistol/m1911, +/obj/item/clothing/suit/armor/vest/alt, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"mB" = ( +/obj/structure/fence/door/opened{ + dir = 4 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"nS" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/guncase/doublesword, +/obj/structure/window/reinforced/unanchored/spawner/directional/south, +/obj/structure/window/reinforced/unanchored/spawner/directional/east, +/turf/open/indestructible/stone, +/area/deathmatch) +"oU" = ( +/turf/closed/indestructible/fakedoor/maintenance, +/area/deathmatch) +"pc" = ( +/obj/structure/plasticflaps/opaque, +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"re" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"sR" = ( +/obj/structure/closet/crate/cardboard, +/obj/item/storage/toolbox/ammobox/strilka310, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"tQ" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 5; + pixel_x = -1 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"ub" = ( +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/stone, +/area/deathmatch) +"uB" = ( +/obj/structure/fence/end, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"uW" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/turf/open/indestructible/stone, +/area/deathmatch) +"uY" = ( +/obj/structure/fence/door{ + dir = 4 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"vV" = ( +/obj/machinery/light/floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"wt" = ( +/obj/structure/fence, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"wR" = ( +/obj/structure/table, +/obj/item/food/bun{ + pixel_y = 8; + pixel_x = -2 + }, +/obj/item/food/bun{ + pixel_y = 5; + pixel_x = 3 + }, +/obj/item/food/bun{ + pixel_y = -1 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"xi" = ( +/obj/effect/spawner/random/trash/garbage, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"xp" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/window{ + dir = 8; + id = "outskirtshutter" + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"xy" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/indestructible/plating, +/area/deathmatch) +"zl" = ( +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"zr" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/turf/open/indestructible/stone, +/area/deathmatch) +"zP" = ( +/obj/structure/table, +/obj/item/food/cheese/wheel{ + pixel_y = 4 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"zQ" = ( +/obj/effect/mine/stun, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"AZ" = ( +/obj/machinery/door/poddoor/shutters/indestructible/preopen{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Bf" = ( +/obj/item/clothing/suit/armor/vest/alt, +/obj/item/gun/ballistic/revolver/nagant, +/obj/item/suppressor, +/obj/structure/closet/crate/cardboard, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"BC" = ( +/obj/structure/table, +/obj/item/stack/medical/suture, +/turf/open/indestructible/dark, +/area/deathmatch) +"Cd" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_y = 2; + pixel_x = 5 + }, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_y = 9; + pixel_x = -5 + }, +/obj/machinery/light/directional/east, +/turf/open/indestructible/stone, +/area/deathmatch) +"Ce" = ( +/obj/structure/table, +/obj/item/food/dough{ + pixel_y = 7; + pixel_x = -2 + }, +/obj/item/food/dough{ + pixel_x = 5 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"CJ" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/replica_spawner{ + obvious_replica = 0; + target_path = /obj/machinery/exoscanner + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"CP" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/obj/item/reagent_containers/hypospray/medipen/stimulants, +/obj/item/spear, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Dq" = ( +/obj/effect/turf_decal/caution{ + dir = 1 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"DJ" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/indestructible/white/textured, +/area/deathmatch) +"Ea" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/turf/open/indestructible/white/textured, +/area/deathmatch) +"Eb" = ( +/obj/structure/mystery_box/tdome{ + pixel_y = 0 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"Ei" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/light_emitter/fake_outdoors, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"EL" = ( +/obj/structure/rack, +/obj/item/gun/ballistic/shotgun/lethal, +/obj/item/storage/box/lethalshot, +/obj/item/gun/ballistic/shotgun/lethal, +/obj/item/storage/box/lethalshot, +/turf/open/indestructible/stone, +/area/deathmatch) +"EZ" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"FF" = ( +/obj/item/wirecutters/caravan, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"FP" = ( +/obj/effect/turf_decal/arrows{ + dir = 8 + }, +/obj/item/stack/spacecash/c1000{ + pixel_y = 10 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Ip" = ( +/obj/item/shard{ + pixel_y = -5; + pixel_x = 7 + }, +/obj/item/shard{ + pixel_y = 5; + pixel_x = -4 + }, +/obj/effect/mine/shrapnel, +/turf/open/indestructible/plating, +/area/deathmatch) +"IR" = ( +/obj/structure/mystery_box/tdome{ + pixel_y = 0 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"JD" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/item/weldingtool, +/turf/open/indestructible/plating, +/area/deathmatch) +"JR" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/obj/effect/mapping_helpers/airlock/welded, +/turf/open/indestructible/stone, +/area/deathmatch) +"Kp" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/white/textured, +/area/deathmatch) +"KL" = ( +/obj/structure/barricade/security/murderdome, +/obj/effect/turf_decal/siding/thinplating/light{ + dir = 8 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Mh" = ( +/obj/structure/shipping_container/gorlex, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"MF" = ( +/mob/living/basic/bot/medbot, +/obj/structure/closet/crate/medical, +/turf/open/indestructible/dark, +/area/deathmatch) +"MJ" = ( +/obj/effect/turf_decal/caution{ + dir = 8 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Nn" = ( +/turf/open/indestructible/white/textured, +/area/deathmatch) +"NT" = ( +/obj/effect/spawner/random/structure/crate_abandoned, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"NZ" = ( +/obj/structure/fence{ + dir = 4 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Oc" = ( +/obj/effect/mine/explosive, +/turf/open/indestructible/plating, +/area/deathmatch) +"Ol" = ( +/obj/machinery/light/floor, +/turf/open/indestructible/stone, +/area/deathmatch) +"Oz" = ( +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Pi" = ( +/obj/structure/closet/crate/wooden, +/obj/effect/spawner/random/maintenance/four, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Ps" = ( +/obj/structure/fence/corner, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"PB" = ( +/obj/structure/fermenting_barrel/gunpowder, +/turf/open/indestructible/stone, +/area/deathmatch) +"PN" = ( +/obj/structure/fence/corner{ + dir = 8 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"PP" = ( +/obj/machinery/light/directional/south, +/turf/open/indestructible/stone, +/area/deathmatch) +"Qa" = ( +/turf/closed/indestructible/riveted, +/area/deathmatch) +"Qb" = ( +/obj/structure/sign/departments/exam_room/directional/south, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/indestructible/white/textured, +/area/deathmatch) +"Re" = ( +/obj/structure/reagent_dispensers/fueltank/large, +/turf/open/indestructible/plating, +/area/deathmatch) +"RE" = ( +/obj/machinery/griddle, +/obj/item/storage/box/syndie_kit/throwing_weapons{ + pixel_y = 7 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"RX" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/stone, +/area/deathmatch) +"Sv" = ( +/obj/structure/table, +/obj/item/stack/medical/mesh, +/turf/open/indestructible/dark, +/area/deathmatch) +"SG" = ( +/obj/machinery/button/door/directional/west{ + id = "outskirtshutter" + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"Tr" = ( +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"TE" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/siding/thinplating/light{ + dir = 8 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"TK" = ( +/obj/structure/sign/departments/med/directional/west, +/obj/structure/closet/crate/trashcart/filled, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Vh" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/obj/item/melee/baseball_bat, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Wa" = ( +/obj/structure/showcase/machinery/tv, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"WB" = ( +/obj/structure/closet/crate/trashcart/filled, +/obj/effect/light_emitter/fake_outdoors, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"XD" = ( +/obj/structure/rack, +/turf/open/indestructible/dark, +/area/deathmatch) +"Yf" = ( +/obj/effect/light_emitter/fake_outdoors, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Yg" = ( +/obj/structure/sign/poster/contraband/donk_co/directional/north, +/turf/open/indestructible/stone, +/area/deathmatch) +"YU" = ( +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/turf/open/indestructible/plating, +/area/deathmatch) +"YV" = ( +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/obj/item/reagent_containers/condiment/bbqsauce, +/obj/item/reagent_containers/condiment/bbqsauce, +/turf/open/indestructible/stone, +/area/deathmatch) +"Ze" = ( +/obj/structure/chair/stool/directional/west, +/turf/open/indestructible/stone, +/area/deathmatch) + +(1,1,1) = {" +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +"} +(2,1,1) = {" +Qa +jH +jH +jH +jH +kU +jH +im +MF +Qa +fu +Oz +Oz +xi +Oz +iQ +Oz +Oz +Oz +Oz +iQ +Oz +Vh +Qa +"} +(3,1,1) = {" +Qa +jH +jH +iS +XD +jH +jH +jH +jH +Qa +xi +Oz +Yf +Oz +Oz +Oz +Yf +IR +Oz +Oz +Yf +EZ +Oz +Qa +"} +(4,1,1) = {" +Qa +jH +jH +Qa +Qa +BC +Sv +fU +Qa +Qa +fx +xi +Oz +Oz +xi +fx +xi +Oz +Oz +Oz +Wa +Oz +Oz +Qa +"} +(5,1,1) = {" +Qa +jH +jH +Qa +Nn +Nn +Nn +Nn +Ea +Qa +IR +Oz +MJ +Oz +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +"} +(6,1,1) = {" +Qa +jH +jH +oU +Nn +DJ +Kp +DJ +Qb +Qa +EZ +Dq +CJ +bR +Oz +Qa +Oz +Oz +Oz +Oz +Yf +xi +Oz +Qa +"} +(7,1,1) = {" +Qa +df +jH +Qa +Nn +Nn +Nn +Nn +DJ +Qa +re +Oz +Tr +Oz +xi +Oz +Yf +Oz +Qa +IR +Oz +iQ +Oz +Qa +"} +(8,1,1) = {" +Qa +Qa +Qa +Qa +Qa +KL +TE +KL +Qa +Qa +Qa +wt +wt +mB +Qa +Qa +pc +Qa +Qa +Qa +Qa +Oz +Oz +Qa +"} +(9,1,1) = {" +Qa +Oz +ms +xi +in +Oz +Oz +Oz +TK +xi +Oz +Oz +zl +Oz +Qa +Re +Oc +Re +Re +Re +Qa +kc +Oz +Qa +"} +(10,1,1) = {" +Qa +Oz +Yf +EZ +NZ +Oz +Oz +Yf +Oz +Oz +zl +Oz +Yf +Oz +Qa +Qa +pc +Qa +Qa +Qa +Qa +Oz +Oz +Qa +"} +(11,1,1) = {" +Qa +Oz +Oz +FF +NZ +Oz +xi +cP +Oz +Oz +Oz +Oz +Oz +Oz +Oz +hC +FP +zl +IR +Oz +Oz +Oz +iQ +Qa +"} +(12,1,1) = {" +Qa +Oz +Oz +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +kc +Oz +Oz +zl +Oz +Yf +Oz +Oz +Oz +Yf +xi +fx +Qa +"} +(13,1,1) = {" +Qa +Oz +xi +Qa +nS +Eb +hN +Qa +EZ +Oz +Oz +Oz +Oz +Oz +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +"} +(14,1,1) = {" +Qa +Oz +WB +Qa +hN +Ol +hN +xy +Oz +PN +uY +uB +Mh +Oz +Qa +hN +zr +hN +hN +hN +hN +hN +hN +Qa +"} +(15,1,1) = {" +Qa +Oz +xi +Qa +hN +hN +hN +xy +Oz +NZ +Pi +Oz +Oz +Oz +Qa +hN +hN +hN +fI +wR +hN +YV +PP +Qa +"} +(16,1,1) = {" +Qa +zl +Oz +Qa +oU +Ip +Qa +Qa +Oz +NZ +Bf +Oz +Oz +cF +Qa +jy +hN +RX +hN +hN +hN +hN +hN +Qa +"} +(17,1,1) = {" +Qa +Oz +Oz +iQ +Oz +Oz +kc +iQ +Oz +Ps +fT +Oz +sR +Oz +bc +gG +hN +ub +RE +bw +hN +ub +hN +Qa +"} +(18,1,1) = {" +Qa +Oz +Oz +zQ +Oz +Yf +Oz +zQ +Oz +Oz +Oz +gg +Yf +iQ +AZ +hN +hN +hN +hN +hN +hN +hN +hN +Qa +"} +(19,1,1) = {" +Qa +Oz +zl +Qa +Qa +YU +Qa +Qa +Oz +Oz +Oz +NT +Oz +Oz +AZ +hN +ub +hN +hN +hN +ub +hN +hN +Qa +"} +(20,1,1) = {" +Qa +Oz +Oz +Qa +JD +vV +JD +Qa +Oz +Oz +Oz +Oz +zl +Oz +fE +hN +hN +hN +mg +mg +hN +Eb +hN +Qa +"} +(21,1,1) = {" +Qa +Oz +Oz +Qa +Qa +Qa +Qa +Qa +xp +xp +Qa +Oz +Oz +cF +Qa +Yg +uW +hN +hN +hN +hN +cH +hN +Qa +"} +(22,1,1) = {" +Qa +Oz +Oz +Qa +hN +Eb +hN +SG +Ze +hN +Qa +Oz +Oz +zl +Qa +hN +zP +hN +hN +RX +hN +Ce +PP +Qa +"} +(23,1,1) = {" +Qa +xi +Yf +JR +hN +hN +hN +hN +hN +hN +Qa +CP +Ei +Oz +Qa +hN +hN +hN +tQ +uW +hN +PB +hN +Qa +"} +(24,1,1) = {" +Qa +fx +xi +Qa +hN +hN +Cd +hN +EL +fv +Qa +Oz +Oz +Oz +Qa +hN +hN +hN +hN +hN +hN +hN +hN +Qa +"} +(25,1,1) = {" +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +"} diff --git a/_maps/map_files/Deathmatch/shooting_range.dmm b/_maps/map_files/Deathmatch/shooting_range.dmm new file mode 100644 index 0000000000000..e6d04007ebd6d --- /dev/null +++ b/_maps/map_files/Deathmatch/shooting_range.dmm @@ -0,0 +1,750 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/wood, +/area/deathmatch) +"b" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/wood/large, +/area/deathmatch) +"c" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/wood/large, +/area/deathmatch) +"d" = ( +/obj/item/ammo_box/magazine/m9mm/ap, +/turf/open/floor/wood, +/area/deathmatch) +"e" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/wood, +/area/deathmatch) +"f" = ( +/obj/machinery/light/directional/west, +/obj/structure/barricade/sandbags, +/turf/open/floor/wood, +/area/deathmatch) +"g" = ( +/turf/closed/indestructible/iron, +/area/deathmatch) +"h" = ( +/obj/structure/barricade/wooden, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"i" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/wood, +/area/deathmatch) +"j" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"k" = ( +/obj/structure/table/reinforced, +/obj/item/ammo_box/magazine/m9mm/fire, +/turf/open/floor/wood/large, +/area/deathmatch) +"l" = ( +/obj/structure/table/reinforced, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/turf/open/floor/wood/large, +/area/deathmatch) +"m" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"n" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/wood, +/area/deathmatch) +"o" = ( +/obj/item/ammo_box/magazine/m9mm/ap, +/obj/structure/closet/crate/secure/weapon{ + locked = 0 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"p" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"q" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"r" = ( +/obj/item/flashlight/flare, +/turf/open/floor/wood, +/area/deathmatch) +"s" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/deathmatch) +"t" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"u" = ( +/obj/structure/barricade/sandbags, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/wood, +/area/deathmatch) +"v" = ( +/obj/item/reagent_containers/hypospray/medipen, +/turf/open/floor/wood, +/area/deathmatch) +"x" = ( +/obj/item/ammo_box/magazine/m9mm/fire, +/turf/open/floor/wood, +/area/deathmatch) +"y" = ( +/obj/item/ammo_box/magazine/m9mm/fire, +/obj/structure/closet/crate/secure/weapon{ + locked = 0 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"z" = ( +/turf/open/floor/wood, +/area/deathmatch) +"A" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"B" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/deathmatch) +"C" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp, +/turf/open/floor/wood/large, +/area/deathmatch) +"D" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"E" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/tile, +/area/deathmatch) +"F" = ( +/obj/structure/barricade/wooden, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/tile, +/area/deathmatch) +"I" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/tile, +/area/deathmatch) +"K" = ( +/turf/closed/wall, +/area/deathmatch) +"M" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/wood, +/area/deathmatch) +"O" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/wood, +/area/deathmatch) +"Q" = ( +/obj/item/ammo_box/magazine/m9mm/hp, +/obj/structure/closet/crate/secure/weapon{ + locked = 0 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"T" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/wood, +/area/deathmatch) +"U" = ( +/turf/open/floor/wood/large, +/area/deathmatch) +"W" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/deathmatch) +"X" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/deathmatch) +"Y" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/wood, +/area/deathmatch) + +(1,1,1) = {" +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +"} +(2,1,1) = {" +g +E +j +q +q +h +q +q +q +q +q +q +Q +q +q +q +j +q +q +q +o +g +"} +(3,1,1) = {" +g +I +z +z +T +K +z +z +M +z +z +z +z +z +z +i +z +z +z +z +m +g +"} +(4,1,1) = {" +g +I +z +z +z +K +M +M +M +z +z +z +z +z +O +K +z +z +K +O +m +g +"} +(5,1,1) = {" +g +I +z +a +z +K +z +z +z +z +z +z +e +z +O +z +z +z +z +K +m +g +"} +(6,1,1) = {" +g +F +O +K +z +n +z +z +z +a +z +e +z +z +K +W +e +z +z +z +t +g +"} +(7,1,1) = {" +g +I +z +f +e +z +r +K +K +K +O +O +K +z +K +z +z +T +z +z +m +g +"} +(8,1,1) = {" +g +I +z +M +M +M +z +c +U +U +U +U +X +z +O +z +z +z +z +K +m +g +"} +(9,1,1) = {" +g +I +e +z +v +z +z +K +U +l +b +U +X +z +O +K +K +K +K +O +m +g +"} +(10,1,1) = {" +g +I +z +z +z +z +z +K +U +C +k +U +K +z +z +z +z +M +z +z +m +g +"} +(11,1,1) = {" +g +I +z +z +z +z +z +c +U +U +U +U +O +e +v +z +z +M +x +z +m +g +"} +(12,1,1) = {" +g +I +z +M +M +z +z +K +O +O +K +K +K +z +z +z +z +M +M +z +t +g +"} +(13,1,1) = {" +g +I +z +e +M +z +z +B +z +z +z +u +d +z +z +r +z +z +z +z +m +g +"} +(14,1,1) = {" +g +I +z +z +M +z +z +z +z +M +z +M +z +z +s +K +K +O +O +K +m +g +"} +(15,1,1) = {" +g +I +K +O +O +K +O +z +z +M +z +z +z +z +z +K +T +z +z +K +m +g +"} +(16,1,1) = {" +g +I +z +z +z +z +O +z +K +K +z +K +O +z +z +O +z +z +s +K +m +g +"} +(17,1,1) = {" +g +I +e +z +T +s +K +z +K +z +z +z +O +z +z +O +e +z +z +K +m +g +"} +(18,1,1) = {" +g +I +z +z +z +z +K +Y +K +W +z +z +O +z +z +K +z +z +z +z +m +g +"} +(19,1,1) = {" +g +I +z +z +z +z +K +e +K +z +e +z +K +z +z +K +K +K +K +K +m +g +"} +(20,1,1) = {" +g +I +z +K +K +z +K +z +K +K +z +z +K +e +z +z +z +z +z +z +m +g +"} +(21,1,1) = {" +g +y +D +D +D +D +D +D +D +A +D +D +D +D +D +D +D +D +D +D +p +g +"} +(22,1,1) = {" +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +"} diff --git a/_maps/map_files/Deathmatch/starwars.dmm b/_maps/map_files/Deathmatch/starwars.dmm new file mode 100644 index 0000000000000..c1f005461073a --- /dev/null +++ b/_maps/map_files/Deathmatch/starwars.dmm @@ -0,0 +1,2040 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ai" = ( +/obj/effect/turf_decal/tile/brown/half, +/obj/item/stack/package_wrap, +/turf/open/indestructible/large, +/area/deathmatch) +"ay" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"aM" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/large, +/area/deathmatch) +"aY" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/item/reagent_containers/syringe, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"bE" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"bR" = ( +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"ch" = ( +/obj/effect/turf_decal/bot, +/obj/structure/tank_holder/extinguisher, +/turf/open/indestructible/large, +/area/deathmatch) +"cj" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"cp" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 8 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"cs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/blood/gibs/down, +/turf/open/indestructible/plating, +/area/deathmatch) +"cL" = ( +/obj/machinery/door/poddoor/shutters/indestructible/preopen{ + id = "Starwars" + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"cM" = ( +/obj/effect/turf_decal/bot, +/turf/open/indestructible/large, +/area/deathmatch) +"dc" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 1 + }, +/obj/machinery/computer, +/turf/open/indestructible/large, +/area/deathmatch) +"dg" = ( +/obj/effect/turf_decal/tile/brown/half, +/turf/open/indestructible/large, +/area/deathmatch) +"dw" = ( +/obj/structure/closet/crate/cardboard, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/item/mail/junkmail, +/obj/item/ammo_casing/a357, +/obj/item/reagent_containers/syringe/plasma, +/turf/open/indestructible, +/area/deathmatch) +"dF" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"dV" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/stack/medical/mesh, +/turf/open/indestructible/white, +/area/deathmatch) +"ep" = ( +/obj/effect/turf_decal/tile/dark_red/anticorner{ + dir = 4 + }, +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"ew" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/fake_scrubber, +/turf/open/indestructible/plating, +/area/deathmatch) +"eH" = ( +/obj/effect/turf_decal/delivery, +/turf/open/indestructible/large, +/area/deathmatch) +"eJ" = ( +/obj/effect/turf_decal/tile/red/full, +/obj/machinery/door/poddoor/shutters/indestructible/preopen{ + id = "Starwars" + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"eV" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/epinephrine, +/turf/open/indestructible/white, +/area/deathmatch) +"fe" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 8 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"fs" = ( +/obj/structure/ore_box, +/turf/open/indestructible/large, +/area/deathmatch) +"fy" = ( +/obj/structure/table/glass, +/obj/item/retractor, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"fD" = ( +/obj/effect/turf_decal/tile/dark_red/half{ + dir = 1 + }, +/obj/machinery/computer, +/turf/open/indestructible/large, +/area/deathmatch) +"fN" = ( +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"fU" = ( +/obj/structure/chair, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"gf" = ( +/obj/structure/closet/crate/cardboard, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/delivery, +/obj/item/mail/junkmail, +/obj/effect/spawner/random/maintenance, +/obj/item/assembly/igniter, +/turf/open/indestructible, +/area/deathmatch) +"gE" = ( +/obj/effect/turf_decal/box, +/turf/open/indestructible/large, +/area/deathmatch) +"gJ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/trash/grille_or_waste, +/turf/open/indestructible/plating, +/area/deathmatch) +"gN" = ( +/obj/machinery/button/door{ + id = "Starwars" + }, +/obj/structure/table/reinforced, +/obj/structure/window/spawner/directional/north, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"gR" = ( +/obj/structure/closet/crate/large, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/delivery, +/obj/item/mail/junkmail, +/obj/item/stack/cable_coil, +/turf/open/indestructible, +/area/deathmatch) +"ht" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"hJ" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "Starwars" + }, +/obj/structure/window/spawner/directional/south, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"hV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/insectguts, +/turf/open/indestructible/plating, +/area/deathmatch) +"il" = ( +/obj/structure/table/glass, +/obj/effect/spawner/random/medical/surgery_tool, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"in" = ( +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/bot, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"iq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/effect/spawner/random/maintenance/two, +/turf/open/indestructible/plating, +/area/deathmatch) +"ir" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"iz" = ( +/obj/structure/rack, +/obj/item/shield/riot, +/turf/open/indestructible/vault, +/area/deathmatch) +"iH" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/light/directional/west, +/obj/structure/table/glass, +/obj/item/stack/medical/suture, +/turf/open/indestructible/white, +/area/deathmatch) +"jh" = ( +/obj/machinery/stasis{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/full, +/obj/item/reagent_containers/cup/beaker/large, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"jK" = ( +/obj/effect/turf_decal/tile/dark_red/anticorner, +/turf/open/indestructible/large, +/area/deathmatch) +"ks" = ( +/obj/structure/table/glass, +/obj/item/storage/medkit/toxin, +/obj/machinery/light/directional/north, +/turf/open/indestructible/white, +/area/deathmatch) +"kz" = ( +/obj/item/storage/medkit/fire, +/obj/structure/table/glass, +/turf/open/indestructible/white, +/area/deathmatch) +"kA" = ( +/obj/effect/spawner/random/maintenance/three, +/obj/structure/table, +/turf/open/indestructible/plating, +/area/deathmatch) +"kC" = ( +/obj/structure/rack, +/obj/item/gun/energy/e_gun/mini, +/turf/open/indestructible/vault, +/area/deathmatch) +"kD" = ( +/obj/item/reagent_containers/syringe/multiver, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"kF" = ( +/obj/effect/turf_decal/tile/red/full, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"kG" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"mu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass, +/turf/open/indestructible/plating, +/area/deathmatch) +"my" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/contraband/krokodil, +/turf/open/indestructible/white, +/area/deathmatch) +"mz" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/contraband/morphine, +/turf/open/indestructible/white, +/area/deathmatch) +"mK" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/indestructible/white, +/area/deathmatch) +"nl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/insectguts, +/turf/open/indestructible/plating, +/area/deathmatch) +"nG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/grille_or_waste, +/turf/open/indestructible/plating, +/area/deathmatch) +"nT" = ( +/obj/structure/fluff/fake_scrubber, +/turf/open/indestructible/plating, +/area/deathmatch) +"nV" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/spawner/random/trash/bin, +/obj/item/reagent_containers/cup/glass/drinkingglass, +/turf/open/indestructible/plating, +/area/deathmatch) +"oo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/grille_or_waste, +/turf/open/indestructible/plating, +/area/deathmatch) +"oq" = ( +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/contraband/space_drugs, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"oC" = ( +/obj/effect/turf_decal/tile/red/anticorner, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"oL" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/spawner/random/medical/surgery_tool, +/turf/open/indestructible/white, +/area/deathmatch) +"pU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/multiver, +/turf/open/indestructible/white, +/area/deathmatch) +"pX" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 8 + }, +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"qf" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"qm" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/clothing/mask/gas/sechailer/swat, +/obj/machinery/light/floor, +/obj/item/dualsaber/red, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"qs" = ( +/obj/machinery/computer, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/west, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"qR" = ( +/obj/machinery/computer{ + dir = 1 + }, +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/east, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"qT" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"qU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"rc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"rj" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/indestructible, +/area/deathmatch) +"rk" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/item/knife/kitchen, +/turf/open/indestructible, +/area/deathmatch) +"rw" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/vehicle/ridden/wheelchair{ + dir = 1 + }, +/turf/open/indestructible/white, +/area/deathmatch) +"rA" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"rO" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/dropper, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"rR" = ( +/obj/structure/closet/crate/large, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/item/stack/medical/mesh, +/turf/open/indestructible, +/area/deathmatch) +"rU" = ( +/obj/item/storage/medkit/brute, +/obj/structure/table/glass, +/obj/machinery/light/directional/west, +/turf/open/indestructible/white, +/area/deathmatch) +"rX" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/pill/patch/synthflesh, +/turf/open/indestructible/white, +/area/deathmatch) +"sk" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass, +/turf/open/indestructible/plating, +/area/deathmatch) +"sl" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 1 + }, +/obj/item/reagent_containers/syringe/contraband/morphine, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"sx" = ( +/obj/effect/turf_decal/tile/red/full, +/obj/machinery/light/directional/west, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"sM" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"sQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/plating, +/area/deathmatch) +"sZ" = ( +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"tb" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 8 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"tl" = ( +/obj/effect/turf_decal/tile/blue/full, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"tm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/indestructible/plating, +/area/deathmatch) +"to" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"ty" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/indestructible/plating, +/area/deathmatch) +"tS" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/east, +/turf/open/indestructible/large, +/area/deathmatch) +"tU" = ( +/obj/effect/turf_decal/tile/red/full, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"tV" = ( +/turf/template_noop, +/area/template_noop) +"ub" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/structure/table/glass, +/obj/item/stack/medical/bone_gel, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"ul" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"uC" = ( +/obj/machinery/computer{ + dir = 8 + }, +/obj/structure/window/spawner/directional/east, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"vl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/heretic_rune/big, +/turf/open/indestructible/plating, +/area/deathmatch) +"vq" = ( +/obj/machinery/computer{ + dir = 4 + }, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/west, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"vz" = ( +/obj/structure/table/glass, +/turf/open/indestructible/white, +/area/deathmatch) +"vH" = ( +/obj/effect/turf_decal/tile/dark_red/half{ + dir = 8 + }, +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"vS" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/contraband/bath_salts, +/turf/open/indestructible/white, +/area/deathmatch) +"wd" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/indestructible, +/area/deathmatch) +"yA" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/indestructible/plating, +/area/deathmatch) +"yH" = ( +/obj/machinery/computer, +/turf/open/indestructible/large, +/area/deathmatch) +"zn" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/computer{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"zp" = ( +/obj/structure/closet/crate/large, +/obj/item/mail/junkmail, +/obj/item/stack/medical/suture, +/obj/item/food/pie/cream, +/turf/open/floor/glass/reinforced/plasma, +/area/deathmatch) +"zB" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/blood/gibs/up, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/indestructible/plating, +/area/deathmatch) +"zF" = ( +/obj/effect/turf_decal/bot_red, +/turf/open/indestructible/large, +/area/deathmatch) +"zH" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 4 + }, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"zK" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/indestructible/white, +/area/deathmatch) +"Ax" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/can/food, +/turf/open/indestructible/plating, +/area/deathmatch) +"AT" = ( +/turf/open/indestructible/plating, +/area/deathmatch) +"AU" = ( +/obj/machinery/light/directional/north, +/obj/structure/tank_holder/extinguisher, +/turf/open/indestructible/white, +/area/deathmatch) +"Bf" = ( +/obj/effect/turf_decal/bot/left, +/turf/open/indestructible/large, +/area/deathmatch) +"Bg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/indestructible/plating, +/area/deathmatch) +"Bm" = ( +/obj/effect/spawner/random/trash/grille_or_waste, +/turf/open/indestructible/plating, +/area/deathmatch) +"Bp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/assembly/igniter, +/turf/open/indestructible/plating, +/area/deathmatch) +"Bt" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/item/reagent_containers/cup/glass/drinkingglass, +/obj/item/reagent_containers/syringe/plasma, +/turf/open/indestructible/plating, +/area/deathmatch) +"BC" = ( +/turf/open/floor/glass/reinforced/plasma, +/area/deathmatch) +"Cf" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"Cj" = ( +/obj/effect/turf_decal/tile/dark_red, +/turf/open/indestructible/large, +/area/deathmatch) +"Co" = ( +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 1 + }, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"Cv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/north, +/turf/open/indestructible/plating, +/area/deathmatch) +"CX" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/bed/medical/emergency, +/turf/open/indestructible/white, +/area/deathmatch) +"Df" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/indestructible, +/area/deathmatch) +"DA" = ( +/obj/effect/turf_decal/tile/dark_red/anticorner{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"DD" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/south, +/obj/structure/tank_holder/extinguisher, +/turf/open/indestructible, +/area/deathmatch) +"Ef" = ( +/obj/structure/closet/crate/cardboard, +/obj/item/mail/junkmail, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/glass/reinforced/plasma, +/area/deathmatch) +"Et" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/white, +/area/deathmatch) +"Ew" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 1 + }, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"Ey" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille, +/turf/open/indestructible/plating, +/area/deathmatch) +"EG" = ( +/obj/effect/turf_decal/tile/dark_red/anticorner{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"ES" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/glass, +/turf/open/indestructible/plating, +/area/deathmatch) +"EZ" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/item/reagent_containers/syringe/plasma, +/turf/open/indestructible/white, +/area/deathmatch) +"Fg" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/structure/table/glass, +/obj/item/circular_saw, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"Gv" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"GT" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/bot, +/turf/open/indestructible/large, +/area/deathmatch) +"Hq" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/closet/crate/trashcart/filled, +/obj/item/reagent_containers/cup/glass/drinkingglass, +/turf/open/indestructible/plating, +/area/deathmatch) +"HE" = ( +/obj/structure/closet/crate/large, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/item/storage/toolbox/ammobox/strilka310, +/turf/open/indestructible/large, +/area/deathmatch) +"HL" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/indestructible/plating, +/area/deathmatch) +"Is" = ( +/obj/machinery/light/floor, +/turf/open/indestructible/vault, +/area/deathmatch) +"Iw" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/bed/medical/emergency, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/white, +/area/deathmatch) +"IC" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/turf/open/indestructible/plating, +/area/deathmatch) +"Jc" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"Js" = ( +/obj/effect/turf_decal/bot_red/left, +/turf/open/indestructible/large, +/area/deathmatch) +"Jv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/indestructible/plating, +/area/deathmatch) +"Jx" = ( +/obj/machinery/computer{ + dir = 8 + }, +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/east, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"JE" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"JF" = ( +/obj/structure/closet/crate/large, +/obj/item/mail/junkmail, +/obj/item/ammo_casing/shotgun/buckshot, +/turf/open/floor/glass/reinforced/plasma, +/area/deathmatch) +"Ke" = ( +/obj/machinery/computer{ + dir = 4 + }, +/obj/structure/window/spawner/directional/west, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Ku" = ( +/obj/effect/turf_decal/tile/red/anticorner, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Ky" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/item/reagent_containers/syringe/calomel, +/turf/open/indestructible/white, +/area/deathmatch) +"Kz" = ( +/obj/effect/spawner/random/trash/box, +/obj/item/ammo_box/a357, +/turf/open/indestructible/plating, +/area/deathmatch) +"KC" = ( +/obj/structure/closet/crate/cardboard, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/effect/spawner/random/maintenance, +/turf/open/indestructible, +/area/deathmatch) +"KJ" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/glass/reinforced/plasma, +/area/deathmatch) +"KM" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe, +/turf/open/indestructible/white, +/area/deathmatch) +"KS" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/item/spear/explosive, +/obj/effect/spawner/random/trash/box, +/turf/open/indestructible/plating, +/area/deathmatch) +"KX" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"LE" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"LM" = ( +/obj/structure/closet/crate/large, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/item/throwing_star, +/turf/open/indestructible/large, +/area/deathmatch) +"LS" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 8 + }, +/obj/machinery/computer{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"LY" = ( +/obj/structure/closet/secure_closet, +/obj/item/gun/energy/beam_rifle, +/turf/open/indestructible/vault, +/area/deathmatch) +"Mc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass, +/turf/open/indestructible/plating, +/area/deathmatch) +"Me" = ( +/obj/structure/rack, +/obj/item/throwing_star, +/turf/open/indestructible/vault, +/area/deathmatch) +"Mx" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/calomel, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"ME" = ( +/obj/effect/spawner/random/trash/soap, +/obj/machinery/door/poddoor/shutters/indestructible/preopen{ + id = "Starwars" + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"MN" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"MT" = ( +/obj/structure/grille/broken, +/turf/open/indestructible/plating, +/area/deathmatch) +"Nc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille/broken, +/obj/item/extinguisher, +/turf/open/indestructible/plating, +/area/deathmatch) +"Nv" = ( +/obj/item/reagent_containers/syringe/syriniver, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"NF" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/north, +/obj/machinery/computer, +/turf/open/indestructible/large, +/area/deathmatch) +"NL" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/box, +/turf/open/indestructible/large, +/area/deathmatch) +"NP" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/south, +/obj/machinery/computer{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"NV" = ( +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"Og" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/glass, +/turf/open/indestructible/plating, +/area/deathmatch) +"Ot" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 4 + }, +/obj/machinery/computer, +/turf/open/indestructible/large, +/area/deathmatch) +"Pj" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"Po" = ( +/obj/effect/turf_decal/tile/red/full, +/obj/machinery/light/directional/south, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Pp" = ( +/obj/structure/ore_box, +/turf/open/floor/glass/reinforced/plasma, +/area/deathmatch) +"PH" = ( +/obj/machinery/computer{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"PK" = ( +/obj/structure/holosign/barrier, +/turf/open/indestructible/vault, +/area/deathmatch) +"PV" = ( +/obj/effect/turf_decal/tile/dark_red/half{ + dir = 4 + }, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"Qd" = ( +/turf/open/indestructible/large, +/area/deathmatch) +"Qh" = ( +/obj/structure/grille/broken, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"QE" = ( +/obj/effect/turf_decal/bot_red, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"QF" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/computer, +/turf/open/indestructible/large, +/area/deathmatch) +"QG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/boritos, +/turf/open/indestructible/plating, +/area/deathmatch) +"QO" = ( +/obj/structure/closet, +/obj/item/toy/plush/lizard_plushie/green, +/turf/template_noop, +/area/template_noop) +"QS" = ( +/obj/effect/turf_decal/bot_red, +/turf/open/indestructible/plating, +/area/deathmatch) +"QU" = ( +/obj/effect/turf_decal/bot, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"Ra" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/plating, +/area/deathmatch) +"Rt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/cable_coil, +/turf/open/indestructible/plating, +/area/deathmatch) +"RJ" = ( +/obj/effect/decal/cleanable/greenglow, +/obj/item/stack/medical/suture, +/turf/open/indestructible/plating, +/area/deathmatch) +"Sh" = ( +/obj/effect/turf_decal/tile/dark_red/half, +/obj/machinery/computer{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"SI" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/structure/closet/crate/mail, +/obj/item/clothing/under/misc/mailman, +/obj/item/clothing/head/costume/mailman, +/turf/open/indestructible, +/area/deathmatch) +"SV" = ( +/obj/structure/closet/crate/cardboard, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/item/mail/junkmail, +/obj/effect/spawner/random/maintenance, +/turf/open/indestructible, +/area/deathmatch) +"Tj" = ( +/turf/open/indestructible/white, +/area/deathmatch) +"TB" = ( +/obj/effect/turf_decal/tile/dark_red/anticorner{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"UQ" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"US" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"Ve" = ( +/obj/effect/turf_decal/tile/red/full, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Vz" = ( +/obj/machinery/stasis{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"VG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"WG" = ( +/obj/structure/table, +/obj/effect/spawner/random/maintenance/four, +/turf/open/indestructible/plating, +/area/deathmatch) +"Xf" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/west, +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"Xk" = ( +/obj/effect/turf_decal/tile/blue/anticorner, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"Xn" = ( +/obj/structure/grille, +/turf/open/indestructible/plating, +/area/deathmatch) +"Xq" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/stack/medical/mesh, +/turf/open/indestructible/white, +/area/deathmatch) +"XG" = ( +/obj/effect/spawner/structure/window, +/turf/open/indestructible/plating, +/area/deathmatch) +"XV" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/item/stack/cable_coil, +/turf/open/indestructible/plating, +/area/deathmatch) +"Ye" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/structure/closet/crate/large, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/item/reagent_containers/medigel/synthflesh, +/turf/open/indestructible, +/area/deathmatch) +"Yf" = ( +/obj/effect/turf_decal/tile/red/anticorner, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Yg" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/full, +/obj/item/reagent_containers/syringe/contraband/saturnx, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"Yk" = ( +/turf/open/indestructible/vault, +/area/deathmatch) +"Ym" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass, +/obj/machinery/light/directional/east, +/turf/open/indestructible/plating, +/area/deathmatch) +"Yz" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/blood/tracks, +/obj/structure/fluff/fake_scrubber, +/turf/open/indestructible/plating, +/area/deathmatch) +"Za" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/vehicle/ridden/wheelchair{ + dir = 8 + }, +/turf/open/indestructible/white, +/area/deathmatch) +"ZC" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/obj/item/stack/package_wrap, +/turf/open/indestructible/large, +/area/deathmatch) + +(1,1,1) = {" +tV +bE +bE +bE +bE +bE +bE +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +tV +tV +tV +tV +tV +tV +tV +"} +(2,1,1) = {" +bE +QO +bE +tV +tV +IC +KX +KX +vS +iH +mK +vz +mz +KX +Ve +Ve +kF +sx +kF +KX +KX +tV +tV +tV +tV +tV +tV +"} +(3,1,1) = {" +bE +bE +tV +tV +IC +IC +US +Vz +sZ +sZ +sZ +Tj +zK +kF +sM +tb +sM +tb +Ve +kF +tU +KX +KX +tV +tV +tV +tV +"} +(4,1,1) = {" +bE +tV +tV +IC +IC +rU +KX +ub +sZ +Jc +fy +Tj +zK +kF +rA +Ku +zH +cp +tb +Ve +KX +kC +KX +KX +tV +tV +tV +"} +(5,1,1) = {" +bE +tV +IC +IC +kz +Xk +Fg +sl +sZ +sZ +sZ +Tj +Et +KX +kF +cj +tb +rA +Ku +KX +LY +Yk +Is +KX +KX +tV +tV +"} +(6,1,1) = {" +bE +IC +IC +ks +Xk +tl +Co +sZ +sZ +Nv +sZ +Xq +eV +KX +kF +rA +oC +cj +tb +KX +Yk +Yk +Yk +iz +KX +tV +tV +"} +(7,1,1) = {" +bE +KX +KX +KX +aY +Co +sZ +sZ +il +Za +CX +XG +XG +KX +KX +KX +Ve +rA +Ku +kF +PK +Yk +Me +KX +tU +KX +tV +"} +(8,1,1) = {" +KX +KX +jh +Yg +oq +sZ +sZ +sZ +pU +XG +XG +XG +eH +Xf +Cf +KX +KX +kF +sM +tb +kF +KX +KX +kF +kF +KX +KX +"} +(9,1,1) = {" +KX +my +sZ +sZ +sZ +sZ +Jc +rO +XG +XG +QF +eH +Qd +Qd +Qd +bR +bR +in +rA +Ku +sM +tb +cj +tb +Ve +kF +KX +"} +(10,1,1) = {" +KX +KM +kD +Mx +il +sZ +rw +XG +XG +eH +yH +Qd +pX +vH +LE +QU +GT +Js +in +kF +rA +Yf +rA +cp +fe +Ve +KX +"} +(11,1,1) = {" +KX +AU +sZ +sZ +sZ +sZ +Iw +XG +QF +Qd +Cj +jK +BC +BC +BC +ep +UQ +cM +PH +KX +kF +sM +tb +rA +Ku +kF +KX +"} +(12,1,1) = {" +KX +rX +Tj +Tj +Tj +Tj +XG +XG +eH +Qd +jK +BC +vq +Ke +fN +BC +TB +cM +PH +KX +KX +rA +Ku +cj +tb +Po +KX +"} +(13,1,1) = {" +KX +oL +EZ +zK +dV +Ky +XG +QF +ay +Ot +BC +qs +fN +fN +fN +fN +BC +Cj +Qd +ch +KX +kF +Ve +rA +Ku +kF +KX +"} +(14,1,1) = {" +KX +KX +ME +cL +KX +KX +KX +NF +aM +fD +BC +gN +fN +qm +fN +hJ +BC +Sh +aM +NP +KX +KX +KX +eJ +eJ +KX +KX +"} +(15,1,1) = {" +KX +nV +Jv +Yz +Bm +RJ +KX +ch +Qd +dc +BC +fN +fN +fN +fU +qR +BC +LS +Qd +zn +XG +SV +Df +Df +Df +gR +KX +"} +(16,1,1) = {" +KX +ul +mu +Ra +yA +gJ +KX +KX +Qd +zF +EG +BC +fN +uC +Jx +BC +DA +Qd +eH +XG +XG +fs +dg +BC +BC +MN +KX +"} +(17,1,1) = {" +KX +Cv +hV +rc +vl +Ey +ES +KX +yH +zF +pX +EG +BC +BC +BC +DA +Ew +Qd +eH +XG +SI +fs +ai +BC +BC +MN +KX +"} +(18,1,1) = {" +KX +XV +ul +cs +iq +Ey +nT +AT +QS +Bf +QE +zF +Cj +PV +UQ +Qd +Qd +eH +XG +XG +fs +HE +dg +BC +BC +DD +KX +"} +(19,1,1) = {" +KX +ty +Bm +Ey +zB +sk +qT +nl +qT +QS +NV +NV +Qd +Qd +Qd +JE +JE +XG +XG +wd +Qd +Qd +kG +ir +ir +gf +KX +"} +(20,1,1) = {" +KX +KX +MT +Ax +tm +Jv +Jv +Ey +mu +AT +KX +KX +Pj +tS +JE +XG +XG +XG +KC +Qd +gE +BC +KJ +LM +rj +KX +KX +"} +(21,1,1) = {" +tV +KX +Kz +AT +qT +oo +Ey +Bp +Bg +QG +Bm +KX +KX +KX +XG +XG +rR +Qd +Qd +NL +Pp +Ef +BC +fs +rj +KX +tV +"} +(22,1,1) = {" +tV +KX +KX +KS +AT +qT +qT +AT +ew +sQ +VG +kA +AT +KX +Df +fs +fs +Qd +Qd +Pp +Pp +zp +gE +rk +IC +IC +bE +"} +(23,1,1) = {" +tV +tV +KX +KX +AT +Qh +qT +mu +Mc +ul +qU +mu +Nc +KX +Df +Gv +Gv +Gv +ht +BC +BC +gE +Df +IC +IC +tV +bE +"} +(24,1,1) = {" +tV +tV +tV +KX +KX +WG +AT +Xn +nl +qT +Og +ul +ul +AT +Df +BC +KJ +BC +qf +fs +fs +dw +IC +IC +tV +tV +bE +"} +(25,1,1) = {" +tV +tV +tV +tV +KX +KX +HL +Bm +qT +Rt +Ey +ew +rc +AT +Df +JF +Pp +BC +ZC +rj +Ye +IC +IC +tV +bE +tV +bE +"} +(26,1,1) = {" +tV +tV +tV +tV +tV +KX +KX +KX +Bt +Ym +ty +nG +Hq +KX +dF +MN +MN +to +dF +KX +KX +IC +tV +tV +tV +bE +tV +"} +(27,1,1) = {" +tV +tV +tV +tV +tV +tV +tV +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +tV +bE +bE +bE +bE +tV +tV +"} diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 1ed7706202cbd..28143ce53ea8b 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -1408,7 +1408,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 1 }, /obj/item/pillow/random, @@ -30045,10 +30045,7 @@ location = "QM #1" }, /obj/effect/turf_decal/delivery, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #3"; - suffix = "#3" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/storage) "htQ" = ( @@ -55692,7 +55689,7 @@ /area/station/maintenance/department/science) "nTU" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/hangover, /obj/item/pillow/random, @@ -58795,7 +58792,7 @@ /area/station/maintenance/department/science) "oLO" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/status_display/evac/directional/east, /obj/item/pillow/random, /turf/open/floor/wood, @@ -63738,7 +63735,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 1 }, /obj/machinery/status_display/evac/directional/north, @@ -81530,10 +81527,7 @@ id = "warehouse_shutters"; name = "warehouse shutters control" }, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/storage) "upB" = ( @@ -82693,7 +82687,7 @@ /area/station/tcommsat/server) "uEo" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/machinery/status_display/evac/directional/east, /obj/effect/landmark/start/hangover, /obj/item/pillow/random, @@ -93655,7 +93649,7 @@ /area/station/science/genetics) "xso" = ( /obj/structure/bed/double, -/obj/item/bedsheet/random/double, +/obj/effect/spawner/random/bedsheet/any/double, /turf/open/floor/wood, /area/station/maintenance/port/aft) "xsp" = ( diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 5f09aa250d132..f1137f100e9c1 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -6937,7 +6937,7 @@ /area/station/engineering/atmos/project) "ccp" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/landmark/start/hangover, /obj/machinery/button/door/directional/south{ id = "Dorm5"; @@ -10057,7 +10057,7 @@ /area/station/cargo/office) "cXp" = ( /obj/structure/bed/pod, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/fore) @@ -10420,7 +10420,7 @@ "dcq" = ( /obj/structure/bed, /obj/machinery/airalarm/directional/north, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/button/door/directional/east{ id = "Dorm3"; name = "Dorm Bolt Control"; @@ -34264,7 +34264,7 @@ /area/station/hallway/secondary/service) "kzv" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "kzw" = ( @@ -41240,7 +41240,7 @@ }, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/obj/machinery/bouldertech/brm, +/obj/machinery/brm, /turf/open/floor/iron, /area/mine/production) "mHu" = ( @@ -41367,7 +41367,7 @@ "mJO" = ( /obj/structure/bed, /obj/machinery/airalarm/directional/north, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/button/door/directional/east{ id = "Dorm2"; name = "Dorm Bolt Control"; @@ -45232,7 +45232,7 @@ "nOl" = ( /obj/structure/bed, /obj/machinery/airalarm/directional/north, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/landmark/start/hangover, /obj/machinery/button/door/directional/east{ id = "Dorm4"; @@ -49799,7 +49799,7 @@ /area/station/hallway/primary/central) "piC" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/button/door/directional/south{ id = "Dorm6"; name = "Cabin Bolt Control"; @@ -58769,10 +58769,7 @@ }, /obj/effect/turf_decal/bot, /obj/machinery/light/small/directional/east, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #2"; - suffix = "#2" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/storage) "rUz" = ( @@ -63486,7 +63483,7 @@ /obj/structure/bed{ dir = 1 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 1 }, /obj/effect/spawner/random/contraband/permabrig_gear, @@ -66638,7 +66635,7 @@ /obj/structure/bed{ dir = 1 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 1 }, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -75177,10 +75174,7 @@ location = "QM #1" }, /obj/effect/turf_decal/bot, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/storage) "xaH" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index b2a9971f12f91..443f7049dea71 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -1124,7 +1124,7 @@ /area/station/maintenance/fore/lesser) "avU" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/button/door/directional/east{ id = "Cabin2"; @@ -23833,7 +23833,7 @@ /obj/machinery/conveyor{ id = "mining" }, -/obj/machinery/bouldertech/brm, +/obj/machinery/brm, /turf/open/floor/iron, /area/station/cargo/miningoffice) "iIf" = ( @@ -24819,13 +24819,9 @@ /turf/open/floor/iron/white, /area/station/science/ordnance/storage) "iWB" = ( -/obj/structure/rack{ - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, /obj/item/storage/fancy/candle_box, /obj/machinery/light/small/directional/east, +/obj/structure/rack/skeletal, /turf/open/floor/engine/cult, /area/station/service/library) "iWD" = ( @@ -31986,7 +31982,7 @@ /area/station/medical/virology) "lxf" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/button/door/directional/west{ id = "Cabin5"; @@ -41784,7 +41780,7 @@ "oYv" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/button/door/directional/west{ id = "Cabin4"; @@ -50133,7 +50129,7 @@ /area/station/commons/locker) "rUo" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, @@ -51804,7 +51800,7 @@ "sBa" = ( /obj/structure/bed, /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/button/door/directional/east{ id = "Cabin3"; @@ -56637,10 +56633,6 @@ "uhI" = ( /obj/structure/cable, /obj/effect/landmark/event_spawn, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, /turf/open/floor/iron, /area/station/security/checkpoint/customs) "uhP" = ( @@ -64199,7 +64191,7 @@ "wNp" = ( /obj/structure/bed, /obj/effect/decal/cleanable/cobweb, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/landmark/start/hangover, /obj/machinery/button/door/directional/west{ diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index e01fb546e4c3a..e83a6941c8855 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -108,13 +108,6 @@ }, /turf/open/floor/iron/white/small, /area/station/commons/fitness/recreation) -"aba" = ( -/obj/structure/railing/corner, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "abk" = ( /obj/machinery/camera/directional/east{ c_tag = "Genetics Desk" @@ -223,6 +216,10 @@ }, /turf/open/space/openspace, /area/space) +"acp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "acq" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -286,6 +283,13 @@ }, /turf/open/floor/iron/dark, /area/station/science/breakroom) +"acK" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "acL" = ( /obj/structure/table/wood, /obj/item/clothing/mask/cigarette/cigar/cohiba, @@ -295,35 +299,6 @@ /obj/effect/turf_decal/trimline/blue/line, /turf/open/floor/carpet/blue, /area/station/command/meeting_room) -"acR" = ( -/obj/effect/turf_decal/trimline/brown/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/line, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_half, -/area/station/cargo/bitrunning/den) -"adk" = ( -/obj/structure/grille, -/obj/structure/sign/directions/medical/directional/north, -/obj/structure/sign/directions/science/directional/north{ - pixel_y = 24 - }, -/obj/structure/sign/directions/upload/directional/north{ - pixel_y = 40 - }, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) "adq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -490,6 +465,21 @@ /obj/effect/turf_decal/trimline/purple, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) +"afv" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port) "afz" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 8 @@ -497,6 +487,19 @@ /obj/machinery/computer/rdconsole, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"afD" = ( +/obj/machinery/door/window/brigdoor/security/cell/left/directional/south{ + id = "cell-2"; + name = "2nd Floor Prisoner Tube" + }, +/obj/machinery/disposal/delivery_chute{ + name = "prisoner transport" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "afE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -708,6 +711,15 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor3/aft) +"ait" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/item/pillow, +/obj/effect/turf_decal/box, +/obj/machinery/flasher/directional/west{ + id = "drunktank" + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "aiw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -873,20 +885,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/wood, /area/station/commons/dorms/apartment2) -"akP" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Security - Office Fore" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/office) "akU" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/vending/cola/pwr_game, @@ -949,6 +947,12 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) +"alL" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor2/fore) "amg" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -1118,6 +1122,10 @@ dir = 4 }, /area/station/medical/pharmacy) +"aoh" = ( +/obj/structure/chair/plastic, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "aom" = ( /obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1277,16 +1285,32 @@ }, /turf/open/floor/carpet/blue, /area/station/command/meeting_room) +"apX" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "aqd" = ( /obj/structure/spider/stickyweb, /obj/structure/table, /obj/item/clothing/mask/facehugger/toy, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) -"aqw" = ( -/obj/structure/stairs/south, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor2/fore) +"aqm" = ( +/obj/machinery/door/firedoor/border_only, +/obj/structure/railing, +/obj/effect/turf_decal/box/red, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) +"aqu" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "aqx" = ( /obj/effect/spawner/structure/window/hollow/end{ dir = 1 @@ -1302,25 +1326,21 @@ /obj/item/storage/box/syringes, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"aqO" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Brig Fore Entrance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint) "aqP" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/textured_half{ dir = 1 }, /area/station/cargo/sorting) +"aqQ" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/science/robotics/lab) "aqR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1523,6 +1543,15 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood/large, /area/station/service/library/lounge) +"atA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port) "atB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, @@ -1829,6 +1858,15 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"axK" = ( +/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/hatch{ + name = "Emergency Ladder Access" + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor2/fore) "axP" = ( /obj/structure/closet/crate/large, /obj/effect/decal/cleanable/dirt, @@ -1993,15 +2031,6 @@ /obj/structure/bookcase/random/religion, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel) -"aAc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/duct, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/security/office) "aAj" = ( /turf/open/floor/iron/dark/side{ dir = 4 @@ -2031,6 +2060,19 @@ /obj/effect/turf_decal/trimline/purple/warning, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) +"aAM" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/any/medical/morgue, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port) "aAZ" = ( /obj/effect/turf_decal/siding/thinplating_new, /obj/structure/cable, @@ -2061,6 +2103,10 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/disposal/incinerator) +"aBo" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port/fore) "aBK" = ( /turf/closed/wall/r_wall, /area/station/medical/virology) @@ -2300,12 +2346,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"aEA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "aEH" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -2521,6 +2561,20 @@ }, /turf/open/floor/plating, /area/station/construction) +"aHo" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/office) "aHs" = ( /obj/structure/table, /obj/item/storage/belt/utility/full, @@ -2578,6 +2632,13 @@ }, /turf/open/floor/iron, /area/station/science/auxlab) +"aHW" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "aHX" = ( /obj/machinery/light/red/dim/directional/north, /turf/open/water/beach{ @@ -2667,6 +2728,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"aJD" = ( +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "aJE" = ( /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, @@ -2734,6 +2798,15 @@ /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, /area/station/commons/storage/primary) +"aKr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port) "aKt" = ( /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/pod/light, @@ -2799,10 +2872,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/pumproom) -"aLo" = ( -/obj/effect/landmark/start/depsec/supply, -/turf/open/floor/iron, -/area/station/cargo/lobby) "aLv" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/tile/green/full, @@ -2845,6 +2914,10 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet) +"aLO" = ( +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor2/fore) "aLP" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -2868,10 +2941,6 @@ }, /turf/open/floor/wood, /area/station/service/bar/atrium) -"aLX" = ( -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor2/aft) "aLZ" = ( /obj/structure/disposalpipe/junction{ dir = 8 @@ -2924,13 +2993,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/wood/large, /area/station/service/library/artgallery) -"aNA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "aNQ" = ( /obj/structure/transit_tube/station/dispenser{ dir = 4 @@ -3122,6 +3184,31 @@ "aQK" = ( /turf/closed/wall, /area/station/cargo/drone_bay) +"aQL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/security/brig) +"aQM" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "aQR" = ( /obj/effect/turf_decal/trimline/yellow/line, /obj/structure/railing, @@ -3175,6 +3262,12 @@ /obj/machinery/telecomms/server/presets/command, /turf/open/floor/circuit/telecomms, /area/station/tcommsat/server) +"aRd" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "aRl" = ( /obj/machinery/door/airlock/highsecurity{ name = "AI Upload" @@ -3405,11 +3498,12 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"aTK" = ( +"aTJ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, -/area/station/security/holding_cell) +/area/station/science/robotics/lab) "aTO" = ( /obj/machinery/power/shuttle_engine/propulsion/burst{ dir = 4 @@ -3499,6 +3593,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"aVc" = ( +/obj/effect/spawner/random/structure/crate, +/obj/machinery/light/directional/south, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port/aft) "aVk" = ( /obj/machinery/door/airlock/freezer{ name = "Rec Room Showers" @@ -3532,9 +3631,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, /area/station/medical/virology/isolation) -"aVJ" = ( -/turf/open/floor/iron/dark/corner, -/area/station/hallway/floor2/aft) "aVM" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "radshutsouth" @@ -3768,6 +3864,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/abandoned) +"aXW" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor3/port) "aYa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, @@ -3926,6 +4026,21 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"aZq" = ( +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "aZs" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -4048,18 +4163,6 @@ dir = 4 }, /area/station/science/robotics/mechbay) -"baN" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/cytology) "bbb" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 6 @@ -4120,15 +4223,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/ce) -"bbW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "bcb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4172,6 +4266,14 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/meeting_room) +"bcH" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/science/robotics/lab) "bcK" = ( /obj/structure/railing{ dir = 4 @@ -4404,6 +4506,15 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/science/robotics/lab) +"bfx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) "bfA" = ( /obj/effect/turf_decal/bot, /obj/structure/table/reinforced, @@ -4553,6 +4664,20 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) +"bhh" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port/aft) "bho" = ( /obj/item/statuebust, /turf/open/misc/beach/sand, @@ -4565,13 +4690,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/corner, /area/station/engineering/lobby) -"bhy" = ( -/obj/structure/sign/warning/biohazard/directional/east, -/obj/machinery/light/cold/no_nightlight/directional/east, -/turf/open/floor/engine{ - initial_gas_mix = "o2=22;bz=82;TEMP=293.15" - }, -/area/station/science/xenobiology) "bhz" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 4 @@ -5148,6 +5266,22 @@ /obj/structure/chair/office, /turf/open/floor/iron/white/side, /area/station/science/robotics/lab) +"bmN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "bmO" = ( /obj/effect/turf_decal/trimline/neutral, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -5178,6 +5312,12 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/science/robotics/lab) +"bnt" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port/aft) "bnz" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -5219,14 +5359,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/security/brig) -"bnS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "bnV" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5763,15 +5895,6 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/iron/white/smooth_large, /area/station/science/robotics/lab) -"buc" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/robotics/lab) "bun" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -5900,20 +6023,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/white, /area/station/science/lower) -"bvB" = ( -/obj/structure/sign/directions/medical/directional/north{ - dir = 2 - }, -/obj/structure/sign/directions/science/directional/north{ - dir = 2; - pixel_y = 24 - }, -/obj/structure/sign/directions/upload/directional/north{ - dir = 2; - pixel_y = 40 - }, -/turf/open/openspace, -/area/station/hallway/floor3/fore) "bvC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -6150,6 +6259,14 @@ /obj/machinery/light/directional/north, /turf/open/floor/wood/parquet, /area/station/service/lawoffice) +"bxE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "bxG" = ( /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/smooth, @@ -6174,6 +6291,14 @@ }, /turf/open/floor/iron/white, /area/station/science/robotics/lab) +"byc" = ( +/obj/machinery/door/airlock/hatch{ + name = "Elevator Shaft Access" + }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/turf/open/floor/plating, +/area/station/hallway/floor1/fore) "byi" = ( /obj/machinery/status_display/evac/directional, /obj/effect/spawner/structure/window, @@ -6241,16 +6366,6 @@ dir = 1 }, /area/station/engineering/storage/tech) -"bzf" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/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/hatch{ - name = "Maintenance Hatch" - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/port/fore) "bzm" = ( /obj/effect/decal/cleanable/blood, /turf/open/floor/iron/kitchen, @@ -6394,16 +6509,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/floor2/starboard) -"bAQ" = ( -/obj/effect/turf_decal/trimline/white/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark/side, -/area/station/hallway/secondary/entry) "bBg" = ( /obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, @@ -6411,16 +6516,6 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/white, /area/station/security/medical) -"bBw" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor4/aft) "bBx" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron, @@ -6441,15 +6536,6 @@ /obj/structure/chair/plastic, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/aft) -"bBT" = ( -/obj/effect/turf_decal/trimline/blue/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "bBV" = ( /obj/effect/turf_decal/trimline/green/arrow_cw{ dir = 8 @@ -6502,6 +6588,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/fore) +"bCr" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port) "bCz" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, @@ -6512,6 +6604,14 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"bCR" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 8 + }, +/obj/structure/grille, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/east, +/turf/open/floor/plating, +/area/station/cargo/bitrunning/den) "bCT" = ( /obj/structure/railing/corner{ dir = 8 @@ -6647,11 +6747,10 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/aft) -"bFl" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/station/science/auxlab) +"bFq" = ( +/obj/machinery/light/red/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) "bFD" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor, @@ -6881,16 +6980,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/medical/abandoned) -"bJN" = ( -/obj/structure/railing/corner{ +"bJA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer4{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard/fore) +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "bJQ" = ( /obj/structure/railing/corner{ dir = 1 @@ -7020,6 +7116,12 @@ }, /turf/open/floor/plating, /area/station/medical/virology) +"bLq" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "bLt" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -7138,13 +7240,6 @@ /obj/effect/spawner/structure/electrified_grille, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port) -"bNb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard/fore) "bNg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7273,11 +7368,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) -"bOZ" = ( -/obj/effect/turf_decal/tile/red/half, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "bPh" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 @@ -7286,10 +7376,13 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"bPm" = ( -/obj/structure/grille, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor2/fore) +"bPq" = ( +/obj/effect/spawner/random/structure/grille, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/port) "bPv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7354,6 +7447,18 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"bQn" = ( +/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/red/filled/line{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "bQv" = ( /obj/machinery/power/terminal{ dir = 4 @@ -7461,28 +7566,19 @@ }, /turf/open/floor/iron, /area/station/maintenance/floor2/starboard/aft) -"bRL" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin/carbon{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/machinery/camera/directional/north, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/item/modular_computer/laptop/preset/civilian, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "bRM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/storage) +"bRP" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "bRR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7568,6 +7664,17 @@ /obj/effect/spawner/random/medical/surgery_tool, /turf/open/floor/iron/white, /area/station/maintenance/floor3/starboard/aft) +"bSU" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "bSV" = ( /obj/machinery/door/airlock/medical{ name = "Psychologist's Office" @@ -7745,13 +7852,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint) -"bUY" = ( -/obj/structure/chair/wood, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/wood/tile, -/area/station/service/chapel/office) "bUZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7759,6 +7859,15 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"bVg" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "bVj" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7949,15 +8058,6 @@ dir = 1 }, /area/station/hallway/floor2/aft) -"bYl" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber{ - dir = 4 - }, -/turf/open/floor/engine/vacuum, -/area/station/science/ordnance/freezerchamber) "bYp" = ( /obj/structure/rack, /obj/effect/spawner/random/engineering/material, @@ -8220,6 +8320,18 @@ /obj/effect/turf_decal/trimline/yellow/warning, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/aft) +"cbT" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "cca" = ( /obj/structure/transport/linear/public, /obj/effect/landmark/transport/transport_id{ @@ -8671,6 +8783,17 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) +"che" = ( +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor/border_only, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port) "chk" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -8729,14 +8852,6 @@ "chP" = ( /turf/closed/wall/mineral/plastitanium, /area/station/maintenance/floor4/starboard/aft) -"chT" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Xenobio - Holding Pen" - }, -/turf/open/floor/engine{ - initial_gas_mix = "o2=22;bz=82;TEMP=293.15" - }, -/area/station/science/xenobiology) "chY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8749,6 +8864,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) +"cil" = ( +/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/red/filled/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "cim" = ( /obj/structure/stairs/north, /obj/structure/sign/departments/cargo/directional/east, @@ -8958,18 +9085,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/project) -"ckt" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/closet/bombcloset/security, -/obj/machinery/status_display/door_timer{ - id = "cell-1"; - name = "Floor 1 Cell"; - pixel_x = 32 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "ckv" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -9102,6 +9217,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod, /area/station/maintenance/floor4/starboard/aft) +"clU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/security/brig) "clV" = ( /obj/structure/closet{ name = "Evidence Closet 4" @@ -9286,6 +9416,15 @@ /obj/machinery/holopad, /turf/open/floor/carpet, /area/station/hallway/secondary/entry) +"cpg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/science/genetics, +/obj/machinery/door/airlock/hatch{ + name = "Genetics Maintenance" + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "cpk" = ( /obj/vehicle/ridden/janicart, /obj/machinery/power/apc/auto_name/directional/east, @@ -9337,10 +9476,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/ce) -"cpO" = ( -/obj/structure/table/wood, -/turf/open/floor/wood/tile, -/area/station/service/chapel/office) "cpW" = ( /obj/machinery/light/small/directional/west, /obj/structure/cable, @@ -9355,13 +9490,6 @@ dir = 8 }, /area/station/command/teleporter) -"cqh" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "cqm" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -9386,6 +9514,17 @@ /obj/item/healthanalyzer, /turf/open/floor/iron/dark/textured, /area/station/medical/paramedic) +"cqz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/checkpoint) "cqP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9502,11 +9641,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/pumproom) -"csg" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/holopad, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "csr" = ( /obj/structure/table/wood, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -9646,6 +9780,20 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"ctY" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/door/airlock/public/glass{ + name = "Public Airlock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/aft) "cub" = ( /obj/structure/rack, /obj/item/clothing/under/trek/command/voy, @@ -9654,6 +9802,17 @@ dir = 8 }, /area/station/command/teleporter) +"cuc" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/unres, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "cuf" = ( /obj/structure/sign/poster/contraband/eat/directional/east, /turf/open/floor/pod/light, @@ -9932,6 +10091,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/lockers) +"cxc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/security/office) "cxg" = ( /obj/machinery/door/airlock/security/glass{ name = "Gen Pop" @@ -9957,16 +10127,6 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"cxH" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/floor4/starboard/fore) "cxN" = ( /obj/structure/rack, /obj/item/clothing/gloves/boxing/blue, @@ -10098,6 +10258,19 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"cAi" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) "cAt" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -10107,6 +10280,14 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"cAJ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/security/mechbay) "cAO" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -10182,15 +10363,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/morgue) -"cBP" = ( -/obj/effect/spawner/structure/window/hollow/plasma/middle{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/turf/open/floor/engine/vacuum, -/area/station/science/ordnance/freezerchamber) "cBU" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/flora/bush/sunny/style_random, @@ -10411,13 +10583,6 @@ /obj/effect/turf_decal/trimline/brown/corner, /turf/open/floor/engine/hull, /area/space/nearstation) -"cFB" = ( -/obj/machinery/camera/autoname/directional/south, -/obj/item/kirbyplants/random, -/obj/structure/sign/poster/official/random/directional/south, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "cFF" = ( /obj/effect/turf_decal/tile/red/diagonal_edge, /obj/effect/decal/cleanable/dirt, @@ -10451,6 +10616,11 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) +"cGn" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "cGt" = ( /obj/effect/turf_decal/trimline/neutral/corner{ dir = 4 @@ -10525,6 +10695,13 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"cHb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille/broken, +/obj/structure/ladder, +/turf/open/floor/plating, +/area/station/hallway/floor1/fore) "cHd" = ( /obj/effect/turf_decal/siding/white, /obj/effect/turf_decal/trimline/purple/line{ @@ -10565,6 +10742,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor2/port/fore) +"cHy" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Second Deck Outpost" + }, +/obj/effect/mapping_helpers/airlock/access/any/security/brig, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/second) "cHz" = ( /obj/structure/railing{ dir = 8 @@ -10882,6 +11070,20 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron, /area/station/commons/dorms/room1) +"cLF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/security/brig) "cLG" = ( /obj/structure/chair/e_chair, /obj/effect/decal/cleanable/dirt, @@ -10911,6 +11113,14 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"cMb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light/small/red/directional/east, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "cMg" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -10950,6 +11160,14 @@ }, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) +"cMz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/bluespace_vendor/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/aft) "cMA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -10992,6 +11210,15 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"cNm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Science Maintenance" + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) "cNx" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -11036,23 +11263,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"cNZ" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/disposal/delivery_chute{ - dir = 8; - name = "Space Chute" - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/sign/warning/vacuum/external/directional/south{ - name = "WARNING: CHUTE LEADS DIRECTLY TO SPACE" - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "cOt" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -11160,6 +11370,10 @@ dir = 8 }, /area/station/engineering/atmos) +"cPT" = ( +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor4/aft) "cQa" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 @@ -11377,13 +11591,6 @@ /obj/structure/rack, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) -"cSN" = ( -/obj/machinery/door/airlock/hatch{ - name = "Stairwell Access" - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor1/fore) "cSQ" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow/fourcorners, @@ -11588,6 +11795,12 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port) +"cVJ" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark/corner, +/area/station/hallway/floor2/aft) "cVK" = ( /obj/machinery/vending/cigarette, /obj/structure/sign/poster/official/random/directional/west, @@ -12032,6 +12245,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/aft) +"daT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "daY" = ( /obj/machinery/door/poddoor/shutters{ id = "survhang"; @@ -12204,6 +12427,15 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"ddA" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/second) "ddH" = ( /obj/effect/turf_decal/tile/neutral/full, /obj/machinery/portable_atmospherics/scrubber, @@ -12352,6 +12584,15 @@ /obj/effect/spawner/random/trash/grime, /turf/open/floor/light/colour_cycle/dancefloor_a, /area/station/medical/abandoned) +"dfs" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor3/port) "dfw" = ( /obj/machinery/status_display/ai/directional/west, /turf/open/openspace, @@ -12370,10 +12611,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"dfD" = ( -/obj/structure/disposalpipe/trunk/multiz/down, -/turf/open/floor/plating/foam, -/area/station/maintenance/floor2/starboard/fore) "dfP" = ( /obj/structure/chair{ dir = 8 @@ -12447,13 +12684,16 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/dorms/apartment2) -"dgJ" = ( -/obj/structure/railing, -/obj/structure/cable, +"dgA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard/fore) +/obj/structure/cable, +/obj/structure/sign/warning/pods/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "dgU" = ( /obj/structure/cable, /obj/machinery/light/red/dim/directional/north, @@ -12581,6 +12821,10 @@ /obj/machinery/recharger, /turf/open/floor/iron/white/small, /area/station/security/execution/education) +"djs" = ( +/obj/structure/railing, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/port/fore) "djv" = ( /obj/effect/landmark/start/research_director, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -12743,13 +12987,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) -"dmQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "dmR" = ( /obj/structure/railing{ dir = 4 @@ -12883,11 +13120,6 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/science/genetics) -"doQ" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/trimline/blue, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "doT" = ( /obj/structure/table/reinforced, /obj/item/grenade/chem_grenade{ @@ -13014,13 +13246,6 @@ }, /turf/closed/wall, /area/station/maintenance/floor1/port/aft) -"dqs" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/catwalk_floor, -/area/station/security/mechbay) "dqB" = ( /obj/item/clothing/mask/breath{ pixel_x = -4 @@ -13289,6 +13514,20 @@ /obj/machinery/space_heater, /turf/open/floor/iron, /area/station/engineering/atmos) +"dtU" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/starboard/fore) "dtX" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -13686,10 +13925,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"dzD" = ( -/obj/structure/closet/firecloset/full, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor4/aft) "dzE" = ( /obj/effect/mapping_helpers/airlock/access/any/security/detective, /obj/machinery/door/airlock/security/glass{ @@ -14116,6 +14351,16 @@ }, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) +"dFn" = ( +/obj/structure/sign/poster/random/directional/north, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "dFq" = ( /obj/structure/cable, /obj/machinery/power/terminal, @@ -14198,6 +14443,19 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) +"dGE" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/starboard) "dGF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -14216,10 +14474,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) -"dGP" = ( -/obj/structure/lattice, -/turf/open/openspace, -/area/station/hallway/floor2/fore) "dGS" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 1 @@ -14249,6 +14503,11 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) +"dHq" = ( +/obj/structure/cable, +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "dHD" = ( /obj/structure/grille, /obj/effect/decal/cleanable/dirt, @@ -14603,22 +14862,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/hallway/secondary/exit/departure_lounge) -"dMt" = ( -/obj/structure/rack, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/white/textured_large, -/area/station/service/chapel/office) -"dMw" = ( -/obj/effect/turf_decal/trimline/red/filled/end{ - dir = 4 - }, -/obj/machinery/status_display/door_timer{ - id = "cell-3"; - name = "Floor 3 Cell"; - pixel_y = 32 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "dMA" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -14914,6 +15157,11 @@ /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/storage/tech) +"dQX" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/quantumpad, +/turf/open/floor/iron, +/area/station/science/auxlab) "dRb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/ash, @@ -15011,6 +15259,16 @@ }, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"dSm" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port/aft) "dSn" = ( /obj/structure/closet{ name = "Evidence Closet 5" @@ -15518,6 +15776,12 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) +"dXA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner, +/area/station/hallway/floor2/aft) "dXJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15613,18 +15877,6 @@ /obj/structure/railing, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"dZw" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor3/fore) "dZz" = ( /obj/structure/railing{ dir = 4 @@ -15948,13 +16200,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) -"eeq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint) "eey" = ( /obj/effect/spawner/random/structure/crate_abandoned, /obj/effect/turf_decal/bot, @@ -16036,12 +16281,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/white/smooth_large, /area/station/science/robotics/lab) -"efp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/depsec/engineering, -/obj/effect/baseturf_helper/reinforced_plating/ceiling, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "efr" = ( /obj/structure/table, /obj/item/gun/ballistic/revolver/russian, @@ -16269,20 +16508,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/side, /area/station/command/teleporter) -"ehZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/table/reinforced, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_blue/end{ - dir = 8 - }, -/obj/item/storage/toolbox/emergency, -/turf/open/floor/iron/dark, -/area/station/commons/storage/tools) "eir" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Access" @@ -16357,18 +16582,6 @@ /obj/item/knife, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) -"ejn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/machinery/duct, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "ejr" = ( /obj/effect/turf_decal/trimline/blue/warning{ dir = 8 @@ -16417,6 +16630,12 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"ejN" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 1 + }, +/turf/open/openspace, +/area/station/maintenance/floor3/port/aft) "ejP" = ( /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) @@ -16584,6 +16803,21 @@ /obj/item/reagent_containers/cup/blastoff_ampoule, /turf/open/floor/carpet/neon/simple/pink/nodots, /area/station/maintenance/floor2/port/fore) +"emr" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "emu" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -16861,6 +17095,14 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) +"epz" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "epB" = ( /obj/machinery/destructive_scanner, /turf/open/floor/iron/white, @@ -16923,6 +17165,10 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/construction) +"eqV" = ( +/obj/structure/disposalpipe/trunk/multiz/down, +/turf/open/openspace, +/area/station/maintenance/floor4/port/aft) "erp" = ( /turf/open/floor/iron/smooth, /area/station/hallway/floor4/aft) @@ -17063,13 +17309,6 @@ dir = 8 }, /area/station/hallway/floor2/fore) -"etY" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/cargo/bitrunning/den) "eub" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17092,12 +17331,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/floor4/fore) -"euv" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard/fore) "euy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -17338,10 +17571,6 @@ dir = 8 }, /area/station/security/office) -"exv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible/layer2, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "exw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17367,10 +17596,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/hallway/secondary/exit/escape_pod) -"exX" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "eyk" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -17453,6 +17678,15 @@ /obj/machinery/shower/directional/west, /turf/open/floor/catwalk_floor/iron, /area/station/hallway/secondary/entry) +"ezy" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "ezC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17920,6 +18154,14 @@ /obj/machinery/light/dim/directional/east, /turf/open/floor/carpet/red, /area/station/service/theater) +"eFz" = ( +/obj/structure/chair/wood, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/wood/tile, +/area/station/service/chapel/office) "eFC" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -17980,15 +18222,6 @@ "eGK" = ( /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"eGN" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "eGQ" = ( /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -18229,6 +18462,17 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/auxlab) +"eKe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/checkpoint) "eKf" = ( /obj/item/radio/intercom/directional/east, /obj/structure/disposalpipe/segment{ @@ -18436,6 +18680,12 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel) +"eNw" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "eNM" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/misc/snow/actually_safe{ @@ -18498,6 +18748,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/storage) +"eOC" = ( +/obj/machinery/bluespace_vendor/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "eOP" = ( /turf/closed/wall/r_wall, /area/station/hallway/floor4/aft) @@ -18518,6 +18772,10 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) +"ePs" = ( +/obj/structure/railing/corner, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/port/fore) "ePv" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18596,13 +18854,17 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"eQh" = ( -/obj/machinery/door/poddoor/preopen{ - id = "secure-gate"; - name = "Brig Shutters" +"eQi" = ( +/obj/structure/chair/plastic{ + dir = 8 }, -/obj/machinery/prisongate, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 4 + }, +/obj/machinery/flasher/directional/east{ + name = "drunktank" + }, +/turf/open/floor/iron/dark, /area/station/security/holding_cell) "eQm" = ( /obj/structure/chair/sofa/left{ @@ -18614,11 +18876,6 @@ }, /turf/open/floor/wood, /area/station/medical/psychology) -"eQA" = ( -/obj/structure/transport/linear/public, -/obj/machinery/light/directional/south, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/floor2/fore) "eQD" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/turf_decal/bot, @@ -18673,19 +18930,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/fore) -"eRw" = ( -/obj/structure/sign/poster/official/random/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/machinery/duct, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "eRZ" = ( /obj/effect/spawner/random/maintenance/two, /obj/effect/decal/cleanable/dirt, @@ -18708,6 +18952,14 @@ /obj/machinery/duct, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"eSq" = ( +/obj/structure/railing/corner, +/obj/machinery/atmospherics/pipe/smart/simple/purple, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "eSw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool/directional/south, @@ -18737,6 +18989,15 @@ }, /turf/open/floor/iron/white, /area/station/science/cytology) +"eSP" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/carpet, +/area/station/cargo/miningdock) "eSX" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -18874,6 +19135,14 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) +"eUT" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/grille, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/floor1/starboard/fore) "eUU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19084,6 +19353,13 @@ /obj/structure/lattice/catwalk, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"eYm" = ( +/obj/machinery/door/airlock/hatch{ + name = "Psych Office Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/medical/psychology, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor2/fore) "eYp" = ( /obj/structure/railing/corner{ dir = 1 @@ -19327,11 +19603,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/abandoned) -"fce" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/girder, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) "fcp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/meter, @@ -19428,6 +19699,17 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/fore) +"feH" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/science/robotics/lab) "feP" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -19468,6 +19750,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/hallway) +"ffz" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "ffA" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -19492,23 +19782,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/virology) -"ffS" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/door/window/left/directional/north{ - name = "Fitness Room" - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/floor2/fore) "ffV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19644,6 +19917,10 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port/aft) +"fhX" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor1/fore) "fhZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19911,6 +20188,11 @@ /obj/machinery/recharger, /turf/open/floor/iron/dark, /area/station/command/gateway) +"fkW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) "flf" = ( /obj/machinery/button/door/directional/east{ id = "psy"; @@ -19954,6 +20236,13 @@ /obj/structure/table/wood, /turf/open/floor/wood/tile, /area/station/service/library) +"flx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/hangover, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor2/fore) "flD" = ( /obj/machinery/smartfridge, /obj/machinery/door/firedoor/heavy, @@ -20072,6 +20361,15 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) +"fnF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port) "fnL" = ( /obj/machinery/status_display/evac/directional/north, /obj/machinery/power/terminal{ @@ -20132,6 +20430,24 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/office) +"foa" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/machinery/door/window/left/directional/north{ + name = "Fitness Room" + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/floor2/fore) "fod" = ( /obj/structure/table/wood/fancy/red, /obj/item/flashlight/flare/candle, @@ -20269,6 +20585,12 @@ "fpU" = ( /turf/open/floor/glass, /area/station/service/library) +"fpW" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/starboard/fore) "fqe" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20336,12 +20658,6 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/miningdock) -"frv" = ( -/obj/effect/turf_decal/box/corners, -/turf/open/floor/engine{ - initial_gas_mix = "o2=22;bz=82;TEMP=293.15" - }, -/area/station/science/xenobiology) "frw" = ( /obj/effect/turf_decal/siding/wideplating_new{ dir = 8 @@ -20430,6 +20746,17 @@ "fsJ" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/ai_upload) +"fsK" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "fsR" = ( /obj/item/kirbyplants/random, /obj/machinery/light/directional/east, @@ -20444,6 +20771,17 @@ dir = 1 }, /area/station/hallway/floor4/fore) +"ftl" = ( +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor/border_only, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port) "ftp" = ( /obj/structure/table, /obj/item/grenade/chem_grenade/antiweed, @@ -20632,12 +20970,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel/office) -"fvE" = ( -/obj/structure/railing, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "fvJ" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -20883,6 +21215,13 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/escape_pod) +"fAy" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port/aft) "fAz" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -20965,6 +21304,12 @@ dir = 1 }, /area/station/command/bridge) +"fBJ" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "fBM" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, @@ -20981,6 +21326,20 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"fBT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "fBX" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/spawner/random/trash/mess, @@ -21754,13 +22113,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard) -"fLX" = ( -/obj/structure/railing/corner, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "fMc" = ( /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/stripes{ @@ -21925,6 +22277,16 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/science/robotics/lab) +"fOl" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/second) "fOq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21955,11 +22317,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/cafeteria, /area/station/commons/locker) -"fOB" = ( -/obj/structure/chair/plastic, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "fOH" = ( /obj/machinery/monkey_recycler, /turf/open/floor/circuit, @@ -21975,6 +22332,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron, /area/station/maintenance/floor2/starboard/aft) +"fOR" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/hallway/floor3/fore) "fOS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4{ @@ -21991,12 +22358,6 @@ /obj/structure/flora/bush/lavendergrass/style_random, /turf/open/floor/grass, /area/station/security/courtroom) -"fPd" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "fPf" = ( /obj/effect/turf_decal/tile/blue/half, /turf/open/floor/iron/textured_edge, @@ -22166,18 +22527,6 @@ "fRo" = ( /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"fRv" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "fRx" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/structure/tank_holder, @@ -22379,12 +22728,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/cafeteria, /area/station/security/prison) -"fUf" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/floor2/fore) "fUg" = ( /obj/machinery/vending/cigarette, /turf/open/floor/iron/dark/side{ @@ -22415,6 +22758,12 @@ /obj/structure/sign/poster/official/report_crimes/directional/west, /turf/open/floor/wood, /area/station/hallway/floor4/fore) +"fUv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) "fUM" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -22428,6 +22777,11 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port) +"fUZ" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/corner, +/area/station/security/brig) "fVe" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -22453,10 +22807,6 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) -"fVw" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "fVA" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -22543,6 +22893,21 @@ /obj/structure/emergency_shield/regenerating, /turf/open/floor/plating, /area/station/cargo/miningdock) +"fWY" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/floor3/starboard/fore) "fWZ" = ( /obj/structure/table, /obj/item/stack/sheet/plasteel/fifty, @@ -22749,6 +23114,14 @@ }, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) +"fYJ" = ( +/obj/structure/chair/sofa/bench/left, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "fYM" = ( /obj/structure/table/wood/fancy/red, /obj/item/flashlight/flare/candle{ @@ -22930,6 +23303,17 @@ /obj/machinery/atmospherics/pipe/layer_manifold/supply/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"gbh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor2/aft) "gbj" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/pod/light, @@ -22945,12 +23329,18 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"gbL" = ( -/obj/structure/chair/plastic{ - dir = 4 +"gby" = ( +/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/red/filled/line{ + dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "gbR" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/bush/sunny/style_random, @@ -22963,16 +23353,6 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"gbV" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "gbW" = ( /obj/effect/turf_decal/bot, /obj/machinery/firealarm/directional/west, @@ -23133,6 +23513,22 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/wood/large, /area/station/medical/virology/isolation) +"geh" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Bulkhead" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor3/port) "gej" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/green/half, @@ -23323,6 +23719,13 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) +"gha" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/spawner/random/contraband/landmine, +/turf/open/floor/iron/dark, +/area/station/maintenance/floor2/starboard/aft) "ghg" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 10 @@ -23341,16 +23744,6 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/disposal) -"ghF" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "ghH" = ( /obj/effect/turf_decal/tile/blue/half{ dir = 4 @@ -23363,6 +23756,14 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"ghX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/port/fore) "ghZ" = ( /obj/structure/table, /obj/item/inspector{ @@ -23613,18 +24014,6 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/fore) -"glA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/fore) "glH" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -23653,12 +24042,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"glW" = ( -/obj/structure/table, -/obj/item/toy/cards/deck, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "glY" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -23750,13 +24133,6 @@ }, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) -"gnm" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/second) "gns" = ( /obj/effect/turf_decal/trimline/green/warning, /obj/effect/turf_decal/stripes, @@ -23925,11 +24301,28 @@ }, /turf/open/floor/wood/tile, /area/station/service/library/printer) +"gpW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/marker_beacon/jade, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "gpZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/camera/directional/south, +/obj/machinery/lift_indicator/directional/south{ + linked_elevator_id = "com_vator"; + pixel_y = -36 + }, +/obj/machinery/button/elevator/directional/south{ + id = "com_vator" + }, /turf/open/floor/iron/dark/side{ dir = 8 }, @@ -23952,13 +24345,17 @@ /obj/effect/turf_decal/stripes/full, /turf/open/floor/noslip, /area/station/engineering/supermatter/room) -"gqC" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" +"gqs" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard) +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/science/robotics/lab) "gqF" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -24092,6 +24489,11 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) +"gsh" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "gsn" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/structure/chair/stool/bar/directional/east, @@ -24129,6 +24531,15 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/hallway/floor2/aft) +"gsx" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/starboard/fore) "gsy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -24405,6 +24816,20 @@ dir = 6 }, /area/station/hallway/floor2/aft) +"gwE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/security/brig) "gwH" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -24487,17 +24912,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) -"gxL" = ( -/obj/structure/transport/linear/public, -/obj/effect/landmark/transport/transport_id{ - specific_transport_id = "com_vator" - }, -/obj/effect/abstract/elevator_music_zone{ - linked_elevator_id = "com_vator"; - range = 2 - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/floor2/fore) "gxP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24678,16 +25092,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) -"gAd" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/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/hatch{ - name = "Maintenance Hatch" - }, -/turf/open/floor/plating, -/area/station/maintenance/floor4/starboard) "gAe" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/filled/corner{ @@ -24750,17 +25154,6 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) -"gBk" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/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/hatch{ - name = "Maintenance Bulkhead" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/starboard) "gBo" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/barricade/wooden{ @@ -24939,16 +25332,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"gCV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/duct, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/aft) "gDe" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, @@ -24959,6 +25342,16 @@ "gDy" = ( /turf/closed/wall, /area/station/maintenance/floor4/starboard) +"gDL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/random/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "gDM" = ( /obj/effect/turf_decal/siding/wideplating, /obj/effect/turf_decal/siding/wideplating{ @@ -24992,6 +25385,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/hallway/floor3/aft) +"gEe" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Third Deck Outpost" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/security/brig, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "gEf" = ( /turf/closed/wall, /area/station/solars/port/aft) @@ -25051,6 +25458,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard) +"gET" = ( +/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/dark, +/area/station/hallway/floor2/fore) "gEW" = ( /obj/machinery/computer/communications{ dir = 1 @@ -25073,11 +25486,6 @@ "gFk" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/engine/atmos) -"gFy" = ( -/obj/structure/weightmachine, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "gFz" = ( /obj/machinery/atmospherics/components/unary/portables_connector{ dir = 1 @@ -25091,17 +25499,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) -"gFQ" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/airlock/public/glass{ - name = "Public Airlock" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/aft) "gFS" = ( /obj/structure/railing, /obj/machinery/door/firedoor/border_only, @@ -25132,16 +25529,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/commons/dorms/apartment1) -"gGr" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/line{ - dir = 8 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/aft) "gGt" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 4 @@ -25197,6 +25584,17 @@ }, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain) +"gGX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "gHi" = ( /obj/structure/table/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25223,14 +25621,6 @@ }, /turf/open/floor/pod/dark, /area/station/cargo/storage) -"gHt" = ( -/obj/effect/turf_decal/trimline/blue/corner, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "gHu" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -25270,13 +25660,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor4/aft) -"gHN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/sign/warning/pods/directional/south, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "gHO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25619,6 +26002,12 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"gLD" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) "gLE" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -25836,10 +26225,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/medical/psychology) -"gPH" = ( -/obj/machinery/camera/autoname/directional/south, -/turf/open/openspace, -/area/station/hallway/floor2/fore) "gPJ" = ( /obj/structure/railing{ dir = 4 @@ -25947,10 +26332,6 @@ initial_gas_mix = "TEMP=2.7" }, /area/station/science/ordnance/bomb) -"gRe" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "gRf" = ( /obj/machinery/door/airlock/public/glass{ name = "Public Airlock" @@ -26136,16 +26517,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/fore) -"gTM" = ( -/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/hatch{ - name = "Stairwell Access" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor4/aft) "gTR" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/decal/cleanable/dirt, @@ -26173,10 +26544,6 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/engine/cult, /area/station/service/library/private) -"gUf" = ( -/obj/effect/spawner/random/trash/grille_or_waste, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard/aft) "gUp" = ( /obj/effect/turf_decal/siding/thinplating_new{ dir = 4 @@ -26284,11 +26651,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) -"gWj" = ( -/obj/structure/weightmachine/weightlifter, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "gWv" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -26321,17 +26683,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/aft) -"gWO" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/machinery/door/window/brigdoor/security/cell/left/directional/west{ - id = "cell-3"; - name = "3rd Floor Cell" - }, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "gWU" = ( /obj/machinery/computer/security/labor, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -26518,6 +26869,21 @@ "gYS" = ( /turf/closed/wall/r_wall, /area/station/hallway/floor4/fore) +"gYX" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/machinery/door/poddoor{ + elevator_mode = 1; + transport_linked_id = "com_vator" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "gZf" = ( /obj/machinery/camera/autoname/directional/west, /obj/structure/table, @@ -26633,6 +26999,10 @@ /obj/machinery/light/cold/no_nightlight/directional/west, /turf/open/floor/grass, /area/station/science/genetics) +"haM" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "haS" = ( /obj/structure/fluff/paper/stack{ desc = "A stack of various papers, absolutely unreadable due to scorch marks and aging."; @@ -26769,6 +27139,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) +"hch" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port/aft) "hci" = ( /obj/machinery/power/terminal{ dir = 1 @@ -26782,6 +27165,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/fore) +"hcr" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/firealarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/station/science/robotics/mechbay) "hct" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/iron, @@ -26828,11 +27221,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) -"hdl" = ( -/obj/structure/cable/multilayer/multiz, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/maintenance/floor3/port/aft) "hds" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -26937,10 +27325,6 @@ }, /turf/open/floor/engine/airless, /area/station/engineering/supermatter/waste) -"heq" = ( -/obj/machinery/light/red/dim/directional/north, -/turf/open/floor/plating/foam, -/area/station/maintenance/floor2/starboard/fore) "hex" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -26965,6 +27349,12 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/iron, /area/station/service/hydroponics) +"heI" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "heR" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -26975,15 +27365,6 @@ }, /turf/open/floor/plating, /area/station/medical/pharmacy) -"heS" = ( -/obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/start/shaft_miner, -/turf/open/floor/carpet/blue, -/area/station/cargo/miningdock) "heY" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -27017,16 +27398,6 @@ "hfm" = ( /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/aft) -"hfy" = ( -/obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/landmark/start/shaft_miner, -/turf/open/floor/carpet/green, -/area/station/cargo/miningdock) "hfz" = ( /obj/effect/spawner/random/structure/chair_maintenance{ dir = 8 @@ -27090,6 +27461,15 @@ /obj/machinery/light/red/dim/directional/west, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) +"hgD" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/robotics/lab) "hgE" = ( /obj/structure/disposalpipe/segment, /obj/machinery/camera/autoname/directional/east, @@ -27209,11 +27589,6 @@ /obj/effect/spawner/random/medical/surgery_tool, /turf/open/floor/pod/light, /area/station/maintenance/department/engine/atmos) -"hid" = ( -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor4/aft) "hio" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 4 @@ -27260,6 +27635,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) +"hiU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "hjd" = ( /obj/effect/turf_decal/tile/blue/half{ dir = 8 @@ -27374,22 +27759,6 @@ dir = 1 }, /area/station/hallway/floor1/aft) -"hkk" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/fore) -"hko" = ( -/obj/effect/turf_decal/trimline/green/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/fore) "hkq" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos) @@ -27511,11 +27880,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) -"hmv" = ( -/obj/structure/table, -/obj/item/toy/cards/deck/wizoff, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "hmH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -27611,14 +27975,6 @@ /obj/structure/grille/broken, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"hnB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor2/aft) "hnC" = ( /obj/structure/bed/dogbed/ian, /mob/living/basic/pet/dog/corgi/ian, @@ -27925,6 +28281,20 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) +"hrW" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) +"hsa" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "hse" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -28077,13 +28447,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/storage) -"htZ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "hug" = ( /obj/structure/toilet{ dir = 8 @@ -28143,15 +28506,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/hallway/floor2/aft) -"huZ" = ( -/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/red/filled/line{ - dir = 1 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "hvb" = ( /obj/machinery/mech_bay_recharge_port{ dir = 2 @@ -28191,6 +28545,12 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/dark, /area/station/security/evidence) +"hvC" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "hvD" = ( /obj/machinery/camera{ c_tag = "Atmos Tank #2 - O2"; @@ -28302,6 +28662,22 @@ }, /turf/open/openspace, /area/station/ai_monitored/turret_protected/aisat/service) +"hwP" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/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/hatch{ + name = "Maintenance Bulkhead" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/starboard) "hwQ" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, @@ -28463,6 +28839,11 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, /area/station/science/lab) +"hzq" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/floor3/starboard/fore) "hzu" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -28573,6 +28954,13 @@ /obj/structure/flora/bush/style_random, /turf/open/floor/grass, /area/station/security/courtroom) +"hAH" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/purple, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "hAI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -28627,13 +29015,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"hBp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/small/red/directional/east, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "hBw" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron/textured_large, @@ -28815,6 +29196,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod, /area/station/maintenance/floor4/port/fore) +"hDU" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard) "hDZ" = ( /obj/structure/table/wood, /obj/machinery/computer/security/telescreen/entertainment/directional/east, @@ -28827,6 +29213,15 @@ }, /turf/open/floor/pod/dark, /area/station/service/kitchen/abandoned) +"hEm" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "hEo" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, @@ -28869,6 +29264,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit) +"hFb" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/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/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/port/fore) "hFc" = ( /obj/structure/table/wood, /obj/item/chisel, @@ -28877,18 +29285,6 @@ /obj/structure/cable, /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) -"hFh" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "hFi" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/green{ @@ -28970,10 +29366,6 @@ /obj/structure/bookcase/random/reference, /turf/open/floor/wood/tile, /area/station/service/library) -"hGv" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/second) "hGy" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/generic_maintenance_landmark, @@ -29002,6 +29394,14 @@ /obj/effect/landmark/blobstart, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) +"hGC" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer2{ + dir = 1 + }, +/obj/effect/spawner/structure/window/hollow/plasma/middle, +/obj/machinery/atmospherics/pipe/smart/simple/purple, +/turf/open/floor/engine/vacuum, +/area/station/science/ordnance/freezerchamber) "hGL" = ( /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, @@ -29255,13 +29655,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) -"hJP" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "hJQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29379,11 +29772,6 @@ }, /turf/open/openspace, /area/station/service/library) -"hLf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/floor2/fore) "hLg" = ( /obj/structure/closet/wardrobe/mixed, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -29472,6 +29860,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) +"hLW" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/office) "hLX" = ( /turf/open/floor/iron/white/small, /area/station/medical/chemistry) @@ -29582,6 +29984,20 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"hNO" = ( +/obj/machinery/door/window/brigdoor/security/cell/left/directional/west{ + id = "cell-3"; + name = "3rd Floor Prisoner Tube" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/delivery_chute{ + name = "prisoner transport"; + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "hNU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/neutral/warning{ @@ -29597,15 +30013,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/carpet, /area/station/service/lawoffice) -"hOs" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/duct, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port) "hOy" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 1 @@ -29659,12 +30066,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/white, /area/station/science/server) -"hPl" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Public Airlock" - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "hPq" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 @@ -29986,6 +30387,17 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood/parquet, /area/station/service/lawoffice) +"hTD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/checkpoint) "hTJ" = ( /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, @@ -29994,6 +30406,24 @@ /obj/machinery/medical_kiosk, /turf/open/floor/plating, /area/station/medical/abandoned) +"hTP" = ( +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark/smooth_half, +/area/station/cargo/bitrunning/den) "hUc" = ( /obj/structure/railing{ dir = 8 @@ -30340,13 +30770,6 @@ /obj/structure/sign/warning/docking/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) -"hYz" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/effect/landmark/start/depsec/medical, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "hYN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30354,14 +30777,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) -"hYT" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/effect/landmark/start/depsec/supply, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "hZm" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1 @@ -30505,6 +30920,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/medbay/aft) +"ibo" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 1 + }, +/turf/open/openspace, +/area/station/maintenance/floor4/starboard/fore) "ibs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30523,6 +30944,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"ibF" = ( +/obj/structure/table/wood/fancy/green, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/spawner/random/contraband/permabrig_weapon, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/hallway/floor3/fore) "ibJ" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -30776,6 +31206,13 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"ifk" = ( +/obj/structure/sign/directions/dorms/directional/north{ + dir = 2 + }, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor4/aft) "ifo" = ( /obj/structure/tank_holder/emergency_oxygen, /obj/effect/turf_decal/stripes/line{ @@ -30783,11 +31220,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard) -"ifq" = ( -/obj/structure/sign/poster/official/random/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "ift" = ( /obj/structure/closet/wardrobe/white, /obj/item/radio/intercom/directional/east, @@ -30796,6 +31228,16 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/locker) +"ifw" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/hatch{ + name = "Emergency Ladder Access" + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor4/aft) "ifx" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/closet_empty/crate/with_loot, @@ -30818,6 +31260,20 @@ }, /turf/open/floor/iron/white, /area/station/science/circuits) +"ifF" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Briefing Room" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/security/office) "ifG" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/dark/side{ @@ -30829,6 +31285,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/gravity_generator) +"ifV" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/comfy{ + dir = 8 + }, +/obj/effect/landmark/start/depsec/medical, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/second) "ifZ" = ( /obj/structure/rack, /obj/effect/turf_decal/tile/brown/opposingcorners, @@ -30836,19 +31304,6 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron/dark, /area/station/science/circuits) -"iga" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "igd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -30884,6 +31339,15 @@ "igE" = ( /turf/closed/wall, /area/station/science/robotics/mechbay) +"igI" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 8 + }, +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "igQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30970,21 +31434,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"ihQ" = ( +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor1/fore) "ihV" = ( /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/white, /area/station/science/auxlab/firing_range) -"ihW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard/fore) "iia" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -31061,19 +31520,6 @@ /obj/effect/spawner/random/maintenance/three, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/starboard/aft) -"iiT" = ( -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "iiW" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -31114,6 +31560,26 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/auxlab) +"ijT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "ijX" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/directional, @@ -31191,11 +31657,6 @@ /obj/structure/grille, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) -"ikY" = ( -/obj/structure/hedge, -/obj/machinery/light/cold/no_nightlight/directional/west, -/turf/open/floor/plating, -/area/station/science/genetics) "ilb" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -31254,11 +31715,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor2/aft) -"ilD" = ( -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) "ilG" = ( /obj/machinery/button/door/directional/north{ id = "CabinS"; @@ -31497,6 +31953,10 @@ /obj/machinery/computer/records/medical/laptop, /turf/open/floor/carpet, /area/station/security/detectives_office) +"ioG" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port) "ioL" = ( /obj/effect/decal/cleanable/ash, /turf/open/floor/plating/foam, @@ -31658,6 +32118,10 @@ /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) +"iqL" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor2/fore) "iqR" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -31797,6 +32261,15 @@ /obj/effect/landmark/navigate_destination/dockaux, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"isz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/machinery/door/airlock/hatch{ + name = "Science Maintenance" + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) "isA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -31952,16 +32425,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"iuM" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard) "iuP" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/contraband/landmine, @@ -31979,13 +32442,13 @@ /obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, /turf/open/floor/engine, /area/station/science/cytology) -"ivf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/duct, -/turf/open/floor/iron/dark/corner, -/area/station/security/office) +"iva" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/second) "ivg" = ( /obj/structure/chair/stool/bar/directional/north, /obj/effect/decal/cleanable/confetti, @@ -32017,6 +32480,13 @@ dir = 8 }, /area/station/hallway/floor3/fore) +"ivz" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/aft) "ivD" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 6 @@ -32133,15 +32603,6 @@ dir = 1 }, /area/station/hallway/secondary/exit/escape_pod) -"ixd" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "ixf" = ( /obj/structure/chair/sofa/bench/right{ dir = 1 @@ -32444,6 +32905,18 @@ }, /turf/open/floor/plastic, /area/station/security/prison/shower) +"iBn" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port) "iBo" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/folder/white, @@ -32495,6 +32968,11 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) +"iCg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) "iCh" = ( /obj/machinery/light/directional/south, /obj/machinery/newscaster/directional/south, @@ -32565,6 +33043,18 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) +"iCK" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port) "iCP" = ( /obj/structure/sign/poster/random/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -32706,6 +33196,13 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard) +"iEW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/port) "iFi" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/structure/cable, @@ -32745,6 +33242,28 @@ /obj/structure/table/wood, /turf/open/floor/glass/reinforced, /area/station/service/library) +"iFy" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) +"iGd" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/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/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor4/starboard) "iGh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33001,10 +33520,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/bridge) -"iJP" = ( -/obj/structure/hedge, -/turf/open/floor/plating, -/area/station/science/genetics) "iJX" = ( /obj/machinery/door_buttons/airlock_controller{ idExterior = "asylum_airlock_exterior"; @@ -33065,6 +33580,16 @@ "iKD" = ( /turf/open/floor/mineral/silver, /area/station/service/chapel/funeral) +"iKJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) "iKR" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/dark, @@ -33073,21 +33598,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) -"iKU" = ( -/obj/structure/railing/corner, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/fore) -"iLd" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor2/aft) "iLy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -33121,6 +33631,12 @@ }, /turf/open/floor/noslip, /area/station/medical/virology) +"iLM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "iLR" = ( /obj/structure/window/reinforced/tinted/spawner/directional/south, /obj/structure/mirror/directional/west, @@ -33383,14 +33899,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"iOE" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/filled/corner, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "iOL" = ( /obj/structure/bookcase/random, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -33400,6 +33908,13 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) +"iOQ" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/floor2/fore) "iOV" = ( /obj/effect/turf_decal/siding/blue{ dir = 4 @@ -33547,11 +34062,30 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) +"iQy" = ( +/obj/structure/railing, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) "iQB" = ( /obj/machinery/space_heater, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port) +"iQC" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/door/poddoor/preopen{ + elevator_mode = 1; + transport_linked_id = "com_vator" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "iQF" = ( /obj/machinery/hydroponics/soil, /obj/item/plant_analyzer, @@ -33561,14 +34095,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, /area/station/commons/locker) -"iQK" = ( -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/sign/warning/deathsposal/directional/south, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) "iQU" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -33739,11 +34265,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) -"iTn" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/turf/open/floor/carpet/black, -/area/station/hallway/secondary/service) "iTu" = ( /obj/machinery/shieldgen, /obj/effect/turf_decal/stripes/line{ @@ -33908,6 +34429,10 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/solars/starboard/aft) +"iWi" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/hallway/floor2/fore) "iWm" = ( /obj/structure/closet/l3closet/janitor, /turf/open/floor/iron, @@ -34046,6 +34571,14 @@ "iXF" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/security/armory) +"iXK" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side, +/area/station/security/office) "iXQ" = ( /obj/structure/railing{ dir = 1 @@ -34157,6 +34690,20 @@ /obj/item/weaponcrafting/receiver, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port) +"iZD" = ( +/obj/structure/transport/linear/public, +/obj/machinery/lift_indicator/directional/east{ + linked_elevator_id = "com_vator"; + pixel_x = 38; + pixel_y = -7 + }, +/obj/machinery/elevator_control_panel/directional/east{ + linked_elevator_id = "com_vator"; + pixel_x = 24; + preset_destination_names = list("2" = "CargEngi", "3" = "Medsci", "4" = "Service", "5" = "Command") + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/floor1/fore) "iZE" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/stripes/line{ @@ -34239,6 +34786,14 @@ /obj/structure/table, /turf/open/floor/iron/dark/side, /area/station/security/brig) +"jam" = ( +/obj/effect/turf_decal/trimline/red/filled/end{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/obj/structure/closet/bombcloset/security, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "jas" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34436,6 +34991,9 @@ /obj/structure/sign/poster/contraband/grey_tide/directional/north, /turf/open/floor/iron/dark/corner, /area/station/commons/storage/primary) +"jdc" = ( +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/starboard/fore) "jdo" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -34458,18 +35016,6 @@ dir = 1 }, /area/station/hallway/floor3/fore) -"jdv" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "jdx" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34491,6 +35037,15 @@ }, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/atmos/pumproom) +"jdM" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "jdP" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -34590,12 +35145,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) -"jfl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "jfr" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "brig-entrance-aft" @@ -34639,18 +35188,6 @@ /obj/effect/turf_decal/trimline/green/line, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"jfS" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/any/medical/morgue, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port) "jgd" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 4 @@ -34709,6 +35246,18 @@ /obj/structure/sign/departments/holy/directional/north, /turf/open/floor/grass, /area/station/hallway/floor3/aft) +"jgU" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/hatch{ + name = "Science Maintenance" + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "jgY" = ( /obj/machinery/door/airlock/external/glass, /obj/effect/turf_decal/stripes/line{ @@ -34756,12 +35305,6 @@ }, /turf/open/floor/wood/tile, /area/station/service/library) -"jhB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "jhF" = ( /obj/effect/spawner/random/trash/moisture_trap, /obj/effect/decal/cleanable/dirt, @@ -34847,17 +35390,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) -"jjh" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Bulkhead" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/port) "jjj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes{ @@ -35178,21 +35710,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"jnS" = ( -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "jnV" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -35210,6 +35727,16 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/textured_large, /area/station/medical/chemistry) +"joA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/starboard/fore) "joE" = ( /obj/structure/railing{ dir = 1 @@ -35271,6 +35798,10 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/chemistry) +"jpq" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor3/fore) "jpy" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, @@ -35363,36 +35894,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"jqm" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/obj/effect/turf_decal/arrows{ - dir = 4 - }, -/obj/structure/railing{ - layer = 3.1 - }, -/obj/effect/decal/cleanable/robot_debris, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/start/bitrunner, -/turf/open/floor/iron/dark/textured_large, -/area/station/cargo/bitrunning/den) -"jqx" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/poddoor/preopen{ - elevator_mode = 1; - transport_linked_id = "com_vator" - }, -/obj/effect/turf_decal/trimline/blue/line{ +"jqq" = ( +/obj/effect/turf_decal/trimline/green/line{ dir = 4 }, -/obj/effect/turf_decal/trimline/purple/line{ +/obj/effect/turf_decal/trimline/green/line{ dir = 8 }, +/obj/machinery/light/floor, /turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) +/area/station/hallway/floor3/fore) "jqy" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -35400,9 +35911,6 @@ "jqD" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/science/lobby) -"jqJ" = ( -/turf/open/floor/plating/foam, -/area/station/maintenance/floor2/port) "jqP" = ( /obj/machinery/camera/directional/west{ c_tag = "Xenobio - Computers Pens" @@ -35630,14 +36138,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /turf/open/floor/plating, /area/station/engineering/supermatter) -"jun" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/catwalk_floor, -/area/station/security/mechbay) "juq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35645,11 +36145,6 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) -"jut" = ( -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/station/hallway/floor2/aft) "juE" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 1 @@ -35800,6 +36295,12 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) +"jwD" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "jwG" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -35845,6 +36346,12 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) +"jxf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/baseturf_helper/reinforced_plating/ceiling, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "jxi" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -35985,14 +36492,6 @@ /obj/machinery/recharger, /turf/open/floor/iron/dark, /area/station/security/range) -"jyn" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/oil/streak, -/obj/machinery/byteforge, -/obj/effect/turf_decal/box, -/turf/open/floor/iron/dark/smooth_large, -/area/station/cargo/bitrunning/den) "jyp" = ( /obj/machinery/door/airlock/security/glass{ name = "Head of Security Office" @@ -36030,6 +36529,18 @@ dir = 1 }, /area/station/hallway/floor2/aft) +"jyL" = ( +/obj/structure/sign/poster/official/random/directional/east, +/obj/structure/sign/directions/dorms/directional/north, +/obj/structure/sign/directions/security/directional/north{ + pixel_y = 40 + }, +/obj/structure/sign/directions/command/directional/north{ + pixel_y = 24 + }, +/obj/structure/rack, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor2/fore) "jyP" = ( /obj/machinery/camera/autoname/directional/east, /turf/open/floor/catwalk_floor, @@ -36401,6 +36912,12 @@ }, /turf/open/floor/pod/dark, /area/station/hallway/secondary/entry) +"jEa" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "jEc" = ( /obj/effect/mapping_helpers/airlock/access/any/supply/mining, /obj/structure/cable, @@ -36460,14 +36977,6 @@ /obj/effect/turf_decal/siding/thinplating_new, /turf/open/floor/iron/dark/textured, /area/station/engineering/lobby) -"jEA" = ( -/obj/machinery/camera/autoname/directional/east, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/robotics/lab) "jEO" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/decal/cleanable/dirt, @@ -36540,13 +37049,6 @@ /obj/effect/turf_decal/stripes, /turf/open/floor/iron, /area/station/maintenance/floor2/starboard/aft) -"jFE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/port/fore) "jFJ" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36647,6 +37149,22 @@ /obj/item/storage/dice, /turf/open/floor/iron/white, /area/station/medical/psychology) +"jGz" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "jGF" = ( /turf/closed/wall, /area/station/service/kitchen/kitchen_backroom) @@ -36669,11 +37187,6 @@ }, /turf/open/floor/iron/dark/smooth_corner, /area/station/engineering/storage/tech) -"jGQ" = ( -/obj/effect/spawner/random/structure/table_or_rack, -/obj/effect/spawner/random/trash/soap, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) "jHc" = ( /obj/machinery/door/window/left/directional/north{ name = "Telecomms Cooling"; @@ -36752,6 +37265,16 @@ /obj/structure/cable, /turf/open/floor/wood/tile, /area/station/service/library) +"jHS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/station/security/checkpoint) "jHT" = ( /obj/structure/chair/wood{ dir = 1 @@ -36911,6 +37434,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard) +"jJM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/purple, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "jJP" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/engine, @@ -37038,13 +37566,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"jMc" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/machinery/door/window/right/directional/north, -/turf/open/misc/sandy_dirt, -/area/station/hallway/secondary/entry) "jMn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -37121,6 +37642,17 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/aft) +"jNl" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/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/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/plating, +/area/station/maintenance/floor4/starboard) "jNr" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/pod/light, @@ -37350,6 +37882,13 @@ dir = 8 }, /area/station/medical/chemistry) +"jQu" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "jQw" = ( /turf/open/floor/iron/dark/textured_corner{ dir = 8 @@ -37490,12 +38029,6 @@ /obj/machinery/vending/wardrobe/sec_wardrobe, /turf/open/floor/iron/dark, /area/station/security/checkpoint/third) -"jRW" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/floor2/starboard/aft) "jSj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/west, @@ -37700,13 +38233,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) -"jVG" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Security - Cell" - }, -/obj/structure/sign/poster/official/random/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "jVK" = ( /turf/closed/wall/r_wall, /area/station/security/prison) @@ -37852,6 +38378,16 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"jXB" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/port) "jXE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37859,16 +38395,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) -"jXH" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/obj/structure/closet/secure_closet/brig{ - name = "Prisoner Locker" - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "jXW" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -38186,6 +38712,12 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"kbZ" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "kca" = ( /turf/closed/wall/r_wall, /area/station/service/library/lounge) @@ -38285,6 +38817,10 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"kcI" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port) "kcK" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/effect/turf_decal/trimline/purple/line{ @@ -38388,6 +38924,13 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/grimy, /area/station/science/xenobiology/hallway) +"kdE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/storage) "kdK" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -38434,12 +38977,6 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"kem" = ( -/obj/structure/chair/wood, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/landmark/start/chaplain, -/turf/open/floor/carpet/orange, -/area/station/service/chapel/office) "kes" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -38608,6 +39145,11 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) +"kgn" = ( +/obj/structure/sign/departments/security/directional/east, +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor4/aft) "kgK" = ( /obj/structure/railing/corner{ dir = 8 @@ -38773,16 +39315,6 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard) -"kif" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/recharger, -/obj/item/crowbar, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/second) "kik" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/effect/landmark/start/scientist, @@ -38801,13 +39333,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"kiw" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer2{ - dir = 1 - }, -/obj/effect/spawner/structure/window/hollow/plasma/middle, -/turf/open/floor/engine/vacuum, -/area/station/science/ordnance/freezerchamber) "kiA" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38837,6 +39362,39 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, /area/station/science/lobby) +"kjd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) +"kjk" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Briefing Room" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Lockdown" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "kjo" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/science/genetics, @@ -39044,6 +39602,13 @@ "kmR" = ( /turf/closed/wall, /area/station/science/lab) +"kmV" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/west, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port/aft) "knd" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/catwalk_floor, @@ -39074,15 +39639,6 @@ }, /turf/open/floor/wood/tile, /area/station/service/library) -"knA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Stairwell Access" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/fore) "knH" = ( /turf/open/openspace, /area/station/ai_monitored/turret_protected/aisat/service) @@ -39112,19 +39668,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"knS" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Bulkhead" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor3/port/aft) "knT" = ( /obj/structure/sink/directional/north, /obj/effect/turf_decal/trimline/purple/end{ @@ -39134,6 +39677,11 @@ icon_state = "textured_dark" }, /area/station/science/robotics/lab) +"knW" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port) "knY" = ( /obj/structure/showcase/cyborg/old{ dir = 4; @@ -39259,6 +39807,12 @@ /obj/machinery/telecomms/server/presets/supply, /turf/open/floor/circuit/telecomms, /area/station/tcommsat/server) +"kpi" = ( +/obj/structure/sign/poster/official/terragov/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor3/aft) "kpl" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 4 @@ -39401,6 +39955,15 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/storage) +"kro" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor1/fore) "krq" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -39465,17 +40028,6 @@ dir = 8 }, /area/station/command/teleporter) -"krW" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/security/brig) "ksd" = ( /obj/structure/table, /obj/item/paper_bin, @@ -39732,25 +40284,35 @@ /obj/machinery/holopad, /turf/open/floor/iron/white, /area/station/science/lower) -"kvD" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 +"kvE" = ( +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/station/maintenance/floor2/port/fore) +"kvH" = ( +/obj/machinery/door/poddoor/shutters/window{ + dir = 8; + id = "armory"; + name = "Armoury Shutters" }, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/machinery/door/poddoor/preopen{ + id = "armblast"; + name = "Armory Blast Door" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/duct, /turf/open/floor/iron/dark, /area/station/security/office) -"kvE" = ( -/turf/open/floor/light/colour_cycle/dancefloor_b, -/area/station/maintenance/floor2/port/fore) +"kvO" = ( +/obj/item/wrench/medical, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/structure/table/glass, +/obj/item/gun/syringe, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/cable, +/turf/open/floor/iron/white/textured, +/area/station/medical/storage) "kvR" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -39774,10 +40336,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/service/bar) -"kwe" = ( -/obj/structure/stairs/north, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor3/fore) "kwf" = ( /obj/machinery/light/cold/no_nightlight/directional/south, /turf/open/floor/iron/dark/small, @@ -39834,20 +40392,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, /area/station/science/cytology) -"kwY" = ( -/obj/structure/transport/linear/public, -/obj/machinery/lift_indicator/directional/east{ - linked_elevator_id = "com_vator"; - pixel_x = 38; - pixel_y = -7 - }, -/obj/machinery/elevator_control_panel/directional/east{ - linked_elevator_id = "com_vator"; - pixel_x = 24; - preset_destination_names = list("3" = "Medsci", "4" = "Service", "5" = "Command") - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/floor2/fore) "kxf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -39990,19 +40534,6 @@ "kyR" = ( /turf/closed/wall, /area/station/hallway/floor1/fore) -"kzj" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/duct, -/turf/open/floor/iron/dark, -/area/station/security/office) "kzn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -40044,6 +40575,14 @@ dir = 4 }, /area/station/hallway/floor3/aft) +"kzT" = ( +/obj/item/bedsheet/double, +/obj/structure/bed/double, +/obj/machinery/light/directional/south, +/obj/effect/landmark/start/chaplain, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/wood/tile, +/area/station/service/chapel/office) "kzU" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark/side{ @@ -40089,6 +40628,15 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/smooth, /area/station/cargo/sorting) +"kAw" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/floor3/port) "kAE" = ( /obj/effect/turf_decal/siding/wideplating_new{ dir = 4 @@ -40184,17 +40732,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/detectives_office/private_investigators_office) -"kBh" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "kBi" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/machinery/computer/atmos_alert{ @@ -40252,16 +40789,6 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/hallway/floor3/aft) -"kBF" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/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/hatch{ - name = "Maintenance Hatch" - }, -/turf/open/floor/plating, -/area/station/maintenance/floor4/starboard/aft) "kBK" = ( /obj/machinery/atmospherics/pipe/layer_manifold/orange/visible, /obj/machinery/light/small/directional/east, @@ -40526,15 +41053,20 @@ "kFP" = ( /turf/open/floor/iron/textured_half, /area/station/cargo/office) -"kFR" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 +"kGa" = ( +/obj/structure/table, +/obj/item/key/security, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/item/key/security, +/obj/machinery/button/flasher{ + id = "drunktank"; + name = "Drunk Tank Flasher" }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) +/turf/open/floor/iron/dark, +/area/station/security/warden) "kGe" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/carpet, @@ -40618,12 +41150,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port/aft) -"kHa" = ( -/obj/structure/chair/plastic{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "kHc" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -41222,6 +41748,16 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"kOc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/security/office) "kOk" = ( /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/dark, @@ -41240,6 +41776,14 @@ dir = 8 }, /area/station/service/bar/atrium) +"kOx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet, +/obj/item/stack/sheet/mineral/coal, +/obj/effect/spawner/random/engineering/flashlight, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) "kOA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/green/full, @@ -41347,6 +41891,16 @@ /obj/structure/table/wood, /turf/open/floor/carpet, /area/station/security/detectives_office) +"kQu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/security/office) "kQF" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 @@ -41397,14 +41951,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/service/lawoffice) -"kQS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/checkpoint) "kQW" = ( /obj/item/trench_tool, /obj/effect/decal/cleanable/molten_object/large{ @@ -41554,6 +42100,14 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/aft) +"kSR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/starboard/fore) "kSU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -41609,10 +42163,6 @@ dir = 6 }, /area/station/security/brig) -"kTm" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "kTz" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/tile/red{ @@ -42047,6 +42597,10 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/cargo/storage) +"kYV" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port/fore) "kZe" = ( /obj/machinery/camera/autoname/directional/west, /obj/machinery/light_switch/directional/west, @@ -42183,6 +42737,15 @@ }, /turf/open/floor/iron/cafeteria, /area/station/engineering/atmos) +"lax" = ( +/obj/structure/table, +/obj/item/storage/dice, +/obj/effect/turf_decal/tile/red/anticorner, +/obj/machinery/flasher/directional/east{ + name = "drunktank" + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "laC" = ( /obj/structure/table/wood, /turf/open/floor/carpet/green, @@ -42578,6 +43141,11 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"leR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port/fore) "leY" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 6 @@ -42650,6 +43218,13 @@ /obj/structure/disposalpipe/segment, /turf/open/openspace, /area/station/maintenance/floor4/starboard/fore) +"lfQ" = ( +/obj/structure/table, +/obj/item/toy/cards/deck, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "lfU" = ( /turf/open/floor/plating/airless, /area/station/solars/starboard/aft) @@ -42831,6 +43406,15 @@ }, /turf/open/space/basic, /area/space/nearstation) +"lhU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/port) "lhW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42865,6 +43449,10 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor4/fore) +"lij" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "lik" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42873,6 +43461,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"liu" = ( +/obj/machinery/atmospherics/components/unary/bluespace_sender, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "liL" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -42884,18 +43476,6 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/floor3/port/fore) -"liX" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "ljf" = ( /obj/machinery/rnd/production/techfab/department/service, /obj/effect/turf_decal/bot, @@ -42927,6 +43507,14 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron/smooth, /area/station/cargo/office) +"ljx" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "ljE" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, @@ -42948,6 +43536,20 @@ /obj/structure/sign/poster/contraband/moffuchis_pizza, /turf/closed/wall, /area/station/maintenance/floor3/port/aft) +"lkc" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/starboard) "lkh" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -42975,6 +43577,13 @@ }, /turf/open/floor/iron, /area/station/security/office) +"lkA" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/second) "lkB" = ( /obj/machinery/shower/directional/west, /obj/structure/sign/poster/official/random/directional/east, @@ -42988,6 +43597,10 @@ dir = 1 }, /area/station/medical/chemistry) +"lkI" = ( +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor4/aft) "lkP" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -43165,11 +43778,6 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/service/hydroponics/garden/abandoned) -"lmG" = ( -/obj/effect/turf_decal/siding/thinplating_new, -/obj/machinery/door/window/right, -/turf/open/misc/beach/sand, -/area/station/hallway/secondary/entry) "lmU" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/entertainment/lighter, @@ -43213,15 +43821,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/floor1/fore) -"lnK" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/structure/closet/secure_closet/brig{ - name = "Prisoner Locker" - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/second) "lnM" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/flora/bush/sparsegrass/style_random, @@ -43334,6 +43933,9 @@ }, /turf/open/floor/iron/white, /area/station/medical/paramedic) +"loS" = ( +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/port/aft) "lpc" = ( /obj/structure/railing{ dir = 10 @@ -43449,6 +44051,17 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) +"lrp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/status_display/ai/directional/west, +/obj/machinery/light/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "lrA" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, @@ -43528,10 +44141,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) -"lsZ" = ( -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor1/fore) "ltb" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ @@ -43652,6 +44261,35 @@ dir = 9 }, /area/station/security/prison) +"luo" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/arrows{ + dir = 4 + }, +/obj/structure/railing{ + layer = 3.1 + }, +/obj/effect/decal/cleanable/robot_debris, +/obj/effect/landmark/start/bitrunner, +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/bitrunning/den) +"luv" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "luw" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/furniture_parts, @@ -43707,15 +44345,6 @@ /obj/effect/spawner/random/contraband/landmine, /turf/open/floor/engine, /area/station/maintenance/floor4/starboard/aft) -"lva" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/poddoor/preopen{ - elevator_mode = 1; - transport_linked_id = "com_vator" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "lvm" = ( /obj/structure/table, /obj/item/assembly/igniter{ @@ -43806,6 +44435,14 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/cargo/office) +"lwo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/security/checkpoint/third) "lwu" = ( /obj/structure/closet/secure_closet/engineering_chief, /turf/open/floor/wood, @@ -43858,6 +44495,15 @@ dir = 4 }, /area/station/hallway/floor1/aft) +"lxr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/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/dark/side, +/area/station/hallway/floor1/aft) "lxs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43973,11 +44619,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"lyR" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/table, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "lyS" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/bush/lavendergrass/style_random, @@ -43994,6 +44635,11 @@ /obj/machinery/chem_dispenser, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) +"lzd" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "lzf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44230,18 +44876,6 @@ /obj/item/stack/cable_coil, /turf/open/floor/plating/airless, /area/station/solars/starboard/aft) -"lDh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor3/fore) "lDi" = ( /obj/machinery/microwave{ pixel_x = -1; @@ -44257,6 +44891,21 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) +"lDo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "lDs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44266,6 +44915,15 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) +"lDA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "lDD" = ( /obj/structure/rack, /obj/item/chair/plastic, @@ -44318,6 +44976,12 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"lDX" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port/fore) "lDY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44628,6 +45292,12 @@ /obj/effect/mapping_helpers/airlock/access/any/service/theatre, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard/aft) +"lIC" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor2/fore) "lIJ" = ( /obj/structure/table/reinforced, /obj/item/flashlight/lamp{ @@ -44675,17 +45345,6 @@ dir = 10 }, /area/station/cargo/miningdock) -"lJb" = ( -/obj/structure/sign/poster/contraband/random/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "lJk" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/pod/light, @@ -44834,6 +45493,20 @@ /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/storage/tech) +"lKE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) +"lKF" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor3/port/aft) "lKQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -45043,6 +45716,16 @@ dir = 8 }, /area/station/hallway/floor1/fore) +"lNW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/cargo/bitrunning/den) "lNX" = ( /obj/structure/railing{ dir = 4 @@ -45237,15 +45920,6 @@ /obj/item/stack/cable_coil/five, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/supermatter/room) -"lPY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard/fore) "lQa" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 6 @@ -45290,11 +45964,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"lQn" = ( -/obj/machinery/computer/security, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "lQo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -45443,6 +46112,13 @@ "lRY" = ( /turf/closed/wall, /area/station/commons/vacant_room/office) +"lSd" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "lSt" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/grime, @@ -45491,27 +46167,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/warehouse) -"lSQ" = ( -/obj/item/storage/medkit/fire{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/fire{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/item/storage/medkit/regular, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/door/window/right/directional/east{ - name = "First Aid Supplies"; - req_access = list("medical") - }, -/obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/iron/white/textured, -/area/station/medical/storage) "lSY" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -45623,6 +46278,10 @@ /obj/effect/decal/cleanable/blood/footprints, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) +"lUd" = ( +/obj/structure/disposalpipe/trunk/multiz, +/turf/open/openspace, +/area/station/maintenance/floor2/port) "lUo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/table_or_rack, @@ -45722,17 +46381,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"lVP" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Third Deck Outpost" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/any/security/brig, -/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/dark, -/area/station/security/checkpoint/third) "lVR" = ( /obj/structure/chair/sofa/right{ dir = 8 @@ -45796,6 +46444,21 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) +"lWY" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + dir = 1; + name = "Prisoner Dispenser" + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/flasher/directional/west{ + id = "drunktank" + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "lXb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/gym/mirrored{ @@ -45864,13 +46527,6 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/side, /area/station/service/bar/atrium) -"lXM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/sign/poster/random/directional/west, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "lXT" = ( /obj/structure/railing, /obj/effect/decal/cleanable/dirt, @@ -45973,6 +46629,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port) +"lYE" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "lYL" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -46088,6 +46753,13 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/textured, /area/station/medical/morgue) +"maK" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/starboard/fore) "maL" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -46110,6 +46782,14 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) +"maS" = ( +/obj/effect/turf_decal/siding/thinplating_new, +/obj/machinery/door/window/right/directional/south{ + name = "Bunny Containment"; + req_access = list("hydroponics") + }, +/turf/open/misc/beach/sand, +/area/station/hallway/secondary/entry) "maW" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -46149,19 +46829,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/white, /area/station/medical/break_room) -"mbx" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron/dark, -/area/station/security/office) "mbA" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/airalarm/directional/east, @@ -46278,6 +46945,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"mcA" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "mcB" = ( /obj/effect/turf_decal/trimline/green/filled/warning{ dir = 1 @@ -46337,6 +47019,12 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/corner, /area/station/cargo/miningdock) +"mdi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/hallway/floor1/fore) "mdl" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -46572,17 +47260,21 @@ }, /turf/open/floor/iron/textured, /area/station/command/heads_quarters/qm) -"mfW" = ( -/obj/structure/cable, +"mfU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/starboard) +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "mge" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 4 @@ -46627,13 +47319,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) -"mgx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/port) "mgA" = ( /obj/structure/sign/warning/radiation/rad_area, /turf/closed/wall, @@ -46929,6 +47614,13 @@ dir = 4 }, /area/station/hallway/floor3/fore) +"mlg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "mlh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47064,14 +47756,6 @@ dir = 1 }, /area/station/hallway/floor2/fore) -"mmK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/security/checkpoint) "mmL" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -47192,10 +47876,6 @@ /obj/item/food/grown/coffee, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) -"moj" = ( -/obj/effect/turf_decal/trimline/red/filled/corner, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "mom" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47440,13 +48120,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/warden) -"mrc" = ( -/obj/structure/chair/sofa/bench/corner{ - dir = 4 - }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "mrd" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -47684,14 +48357,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor1/starboard/aft) -"mun" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor1/fore) "mus" = ( /obj/structure/closet/firecloset/full, /turf/open/floor/pod/dark, @@ -47819,12 +48484,19 @@ /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port) -"mwr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard/fore) +"mwz" = ( +/obj/structure/table, +/obj/item/disk/data{ + pixel_x = 5 + }, +/obj/item/disk/data{ + pixel_x = -6 + }, +/obj/item/disk/data{ + pixel_y = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "mwB" = ( /obj/structure/railing{ dir = 4 @@ -48019,11 +48691,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) -"mza" = ( -/obj/machinery/computer/records/security, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "mzb" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, @@ -48316,6 +48983,13 @@ }, /turf/open/floor/wood/tile, /area/station/service/library/lounge) +"mCU" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber, +/turf/open/floor/engine/vacuum, +/area/station/science/ordnance/freezerchamber) "mDe" = ( /obj/structure/lattice, /turf/open/openspace, @@ -48549,6 +49223,13 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/carpet/red, /area/station/commons/dorms/apartment1) +"mFJ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor4/aft) "mFP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48580,6 +49261,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"mGt" = ( +/obj/structure/chair/sofa/bench/right, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "mGy" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/mining, @@ -48816,6 +49504,11 @@ dir = 8 }, /area/station/hallway/floor2/fore) +"mJr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "mJt" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/smooth, @@ -48965,6 +49658,20 @@ }, /turf/open/floor/wood/large, /area/station/service/library/artgallery) +"mLS" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/maintenance, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port/aft) "mLY" = ( /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron/dark, @@ -48992,21 +49699,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/office) -"mMj" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Brig Fore Entrance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint) "mMk" = ( /obj/machinery/door/airlock/command{ name = "Abandoned Hangar" @@ -49115,11 +49807,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/hallway/floor4/aft) -"mMV" = ( -/obj/structure/rack, -/obj/item/stack/sheet/leather, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) "mNb" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -49147,6 +49834,10 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"mNr" = ( +/obj/structure/ladder, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "mNI" = ( /obj/machinery/vending/snack/orange, /obj/effect/turf_decal/siding/wood{ @@ -49161,6 +49852,10 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lab) +"mNW" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/station/hallway/floor3/fore) "mNY" = ( /obj/structure/railing{ dir = 8 @@ -49180,6 +49875,10 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard) +"mOe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "mOh" = ( /obj/structure/reagent_dispensers/watertank/high, /obj/effect/turf_decal/tile/green/full, @@ -49279,23 +49978,17 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/pumproom) +"mPH" = ( +/obj/structure/weightmachine, +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "mPJ" = ( /obj/machinery/gibber, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"mPO" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Briefing Room" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/security/office) "mPW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49357,15 +50050,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/engineering/atmos) -"mQz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/genetics, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "mQF" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ @@ -49496,11 +50180,6 @@ /obj/item/radio/intercom/prison/directional/west, /turf/open/floor/plating, /area/station/security/prison/work) -"mSP" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/cable, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "mSR" = ( /obj/item/bodybag, /turf/open/floor/iron/dark, @@ -49572,16 +50251,8 @@ dir = 1 }, /obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/landmark/start/depsec/supply, /turf/open/floor/iron/dark, /area/station/security/checkpoint/first) -"mTN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "mTQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -49634,13 +50305,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) -"mUq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard/fore) "mUs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49719,24 +50383,6 @@ /obj/effect/turf_decal/tile/green/half, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit/escape_pod) -"mVm" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/turf_decal/siding/white, -/obj/structure/cable, -/obj/structure/table/reinforced/rglass, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/storage/pill_bottle/mannitol, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = -6; - pixel_y = 10 - }, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) "mVp" = ( /obj/structure/railing/corner{ dir = 4 @@ -49748,12 +50394,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard/fore) -"mVq" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "mVy" = ( /obj/structure/closet/emcloset/anchored, /turf/open/floor/plating, @@ -49899,19 +50539,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/hallway/floor3/fore) -"mXh" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/obj/machinery/airalarm/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "mXn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50545,12 +51172,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"nfJ" = ( -/obj/structure/cable, -/obj/machinery/holopad, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) +"nfI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/cargo/bitrunning/den) "nfR" = ( /obj/machinery/shower/directional/west, /turf/open/floor/noslip, @@ -50655,6 +51285,17 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) +"ngL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/port/fore) "ngT" = ( /obj/structure/dresser, /turf/open/floor/wood/tile, @@ -50797,6 +51438,17 @@ dir = 5 }, /area/station/hallway/floor4/aft) +"nhX" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/robotics/lab) "nhZ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/table, @@ -50812,6 +51464,12 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) +"nik" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "nir" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 8 @@ -50992,6 +51650,12 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"njU" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "nkh" = ( /obj/machinery/power/tracker, /obj/structure/cable, @@ -51064,12 +51728,8 @@ /area/station/maintenance/floor3/starboard) "nln" = ( /obj/effect/turf_decal/trimline/red/line, -/obj/machinery/camera{ - c_tag = "Engineering Foyer #1"; - dir = 5; - network = list("ss13","engine") - }, /obj/structure/disposalpipe/segment, +/obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/engineering/lobby) "nlu" = ( @@ -51108,6 +51768,14 @@ "nlN" = ( /turf/closed/wall, /area/station/maintenance/floor2/port/aft) +"nmk" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/trimline/blue, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "nmq" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -51375,6 +52043,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) +"npT" = ( +/obj/structure/weightmachine/weightlifter, +/obj/effect/turf_decal/bot, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "npZ" = ( /obj/effect/turf_decal/trimline/green/warning, /turf/open/floor/pod/light, @@ -51465,13 +52140,6 @@ initial_gas_mix = "TEMP=2.7" }, /area/station/science/ordnance/bomb) -"nqV" = ( -/obj/structure/ladder, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port) "nqX" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/brown{ @@ -51613,19 +52281,6 @@ /obj/structure/table, /turf/open/floor/eighties, /area/station/commons/dorms/room2) -"nsO" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/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/hatch{ - name = "Maintenance Bulkhead" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/starboard) "ntl" = ( /obj/effect/spawner/structure/window/hollow/reinforced/end, /turf/open/floor/plating, @@ -51741,17 +52396,6 @@ }, /turf/open/floor/grass, /area/station/science/cytology) -"nuw" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/start/hangover, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor4/aft) "nuE" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -51875,6 +52519,12 @@ /obj/structure/sign/warning/vacuum/external/directional/south, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) +"nwf" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/medical/abandoned) "nwh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/corner{ @@ -51913,17 +52563,6 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat) -"nwV" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "nwW" = ( /obj/machinery/camera/directional/south{ c_tag = "AI Chamber - Port"; @@ -52149,17 +52788,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/station/commons/dorms/apartment1) -"nzx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/security/brig) "nzJ" = ( /obj/machinery/portable_atmospherics/canister/anesthetic_mix, /turf/open/floor/iron/dark/textured, @@ -52181,6 +52809,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"nzO" = ( +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor2/fore) "nzV" = ( /obj/structure/rack, /obj/effect/turf_decal/bot, @@ -52312,18 +52944,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/floor2/starboard/aft) -"nBT" = ( -/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/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "nBV" = ( /obj/structure/railing/corner{ dir = 1 @@ -52409,14 +53029,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/floor3/port) -"nDm" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/engine{ - initial_gas_mix = "o2=22;bz=82;TEMP=293.15" - }, -/area/station/science/xenobiology) "nDn" = ( /obj/effect/turf_decal/trimline/green/warning, /obj/effect/turf_decal/stripes/line{ @@ -52474,14 +53086,6 @@ dir = 4 }, /area/station/engineering/lobby) -"nDZ" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "nEa" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green, @@ -52660,6 +53264,12 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"nGD" = ( +/obj/structure/rack, +/obj/machinery/light/small/directional/west, +/obj/item/book/granter/action/spell/smoke/lesser, +/turf/open/floor/iron/white/textured_large, +/area/station/service/chapel/office) "nGG" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/beebox, @@ -52674,14 +53284,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) -"nGK" = ( -/obj/effect/landmark/start/hangover, -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/light/floor, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) "nGL" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/chapel, @@ -52816,6 +53418,11 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) +"nIl" = ( +/obj/structure/table/wood, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/wood/tile, +/area/station/service/chapel/office) "nIr" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -52876,6 +53483,20 @@ }, /turf/open/floor/engine/airless, /area/station/engineering/supermatter/waste) +"nIN" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) +"nIO" = ( +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor1/fore) "nIQ" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -53007,6 +53628,22 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"nKs" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/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/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor4/starboard/fore) "nKA" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -53093,6 +53730,12 @@ }, /turf/open/floor/iron/dark, /area/station/service/library/garden) +"nLM" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) "nLY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -53115,7 +53758,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/depsec/engineering, /turf/open/floor/iron/dark, /area/station/security/checkpoint/first) "nMz" = ( @@ -53355,6 +53997,11 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured, /area/station/science/ordnance/storage) +"nQl" = ( +/obj/machinery/light/cold/no_nightlight/directional/west, +/obj/machinery/vending/wardrobe/gene_wardrobe, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "nQo" = ( /obj/structure/table, /obj/item/storage/pill_bottle/lsd{ @@ -53382,23 +54029,6 @@ dir = 1 }, /area/station/security/prison) -"nQN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/office) "nQO" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -53412,6 +54042,15 @@ /obj/machinery/shower/directional/west, /turf/open/floor/noslip, /area/station/commons/fitness) +"nQR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/port) "nQS" = ( /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, @@ -53426,10 +54065,6 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) -"nQU" = ( -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "nQX" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 1 @@ -53460,6 +54095,17 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"nRe" = ( +/obj/structure/transport/linear/public, +/obj/effect/landmark/transport/transport_id{ + specific_transport_id = "com_vator" + }, +/obj/effect/abstract/elevator_music_zone{ + linked_elevator_id = "com_vator"; + range = 2 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/floor1/fore) "nRn" = ( /obj/structure/railing/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53487,6 +54133,46 @@ /obj/item/paper_bin, /turf/open/floor/iron/smooth, /area/station/cargo/office) +"nRF" = ( +/obj/structure/rack, +/obj/effect/spawner/random/engineering/tool, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor1/fore) +"nRI" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/office) +"nRK" = ( +/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/hatch{ + name = "Emergency Ladder Access" + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor3/fore) +"nRL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "nRP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53496,6 +54182,28 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) +"nRQ" = ( +/obj/item/storage/medkit/fire{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/item/storage/medkit/regular, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/door/window/right/directional/east{ + name = "First Aid Supplies"; + req_access = list("medical") + }, +/obj/structure/sign/poster/official/random/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/white/textured, +/area/station/medical/storage) "nRU" = ( /obj/structure/chair{ dir = 1 @@ -53503,18 +54211,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"nSg" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "nSn" = ( /obj/machinery/blackbox_recorder, /turf/open/floor/circuit/green/telecomms, @@ -53585,12 +54281,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) -"nTF" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "nTI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53798,14 +54488,6 @@ "nWe" = ( /turf/closed/wall, /area/station/commons/fitness) -"nWf" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "nWk" = ( /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -53893,6 +54575,13 @@ dir = 1 }, /area/station/command/gateway) +"nWS" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "nWW" = ( /turf/closed/wall, /area/station/hallway/floor4/aft) @@ -53950,6 +54639,14 @@ }, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) +"nXs" = ( +/obj/structure/rack, +/obj/item/stack/sheet/leather, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/starboard/fore) "nXw" = ( /obj/structure/sign/poster/official/random/directional/south, /obj/machinery/camera/directional/south{ @@ -54003,6 +54700,15 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) +"nYt" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/door/poddoor{ + elevator_mode = 1; + transport_linked_id = "com_vator" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "nYE" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/carpet/royalblack, @@ -54171,13 +54877,6 @@ dir = 1 }, /area/station/engineering/lobby) -"obC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "obH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54204,6 +54903,13 @@ }, /turf/open/floor/plating, /area/station/security/brig) +"obV" = ( +/obj/machinery/door/airlock/hatch{ + name = "Emergency Ladder Access" + }, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor1/fore) "obX" = ( /obj/machinery/portable_atmospherics/canister/anesthetic_mix, /obj/machinery/door/window/brigdoor/right/directional/east{ @@ -54220,21 +54926,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/wood, /area/station/service/theater) -"och" = ( -/obj/structure/sign/poster/official/random/directional/east, -/obj/structure/sign/directions/dorms/directional/north, -/obj/structure/sign/directions/security/directional/north{ - pixel_y = 40 - }, -/obj/structure/sign/directions/command/directional/north{ - pixel_y = 24 - }, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/light/floor, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor2/fore) "ocl" = ( /obj/machinery/portable_atmospherics/canister, /turf/open/floor/engine, @@ -54390,6 +55081,16 @@ /obj/effect/mapping_helpers/airlock/access/any/service/general, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) +"oee" = ( +/obj/effect/turf_decal/trimline/green/warning{ + dir = 4 + }, +/obj/effect/spawner/random/engineering/atmospherics_portable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor3/port) "oet" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54492,9 +55193,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall, /area/station/hallway/floor1/fore) -"ogl" = ( -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "ogp" = ( /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/pod/light, @@ -54589,6 +55287,20 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/lobby) +"ohu" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor4/fore) +"ohz" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/floor2/aft) "ohF" = ( /obj/effect/mapping_helpers/airlock/access/any/medical/general, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -54612,13 +55324,6 @@ "oic" = ( /turf/closed/wall, /area/station/maintenance/floor1/starboard/fore) -"oid" = ( -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) "oig" = ( /obj/effect/turf_decal/siding/purple, /obj/structure/chair/office/light{ @@ -54777,6 +55482,20 @@ }, /turf/open/floor/iron/dark, /area/station/service/library/lounge) +"ojB" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Brig Fore Entrance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint) "ojM" = ( /obj/structure/chair/comfy{ dir = 4 @@ -54825,14 +55544,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) -"okJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/checkpoint) "okK" = ( /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron/dark, @@ -54851,6 +55562,21 @@ dir = 8 }, /area/station/medical/chemistry) +"okN" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/door/poddoor/preopen{ + elevator_mode = 1; + transport_linked_id = "com_vator" + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "okT" = ( /obj/structure/railing{ dir = 1 @@ -54897,17 +55623,6 @@ }, /turf/open/floor/engine, /area/station/science/cytology) -"olH" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/obj/effect/turf_decal/arrows{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/disposalpipe/trunk/multiz, -/turf/open/floor/iron/dark/textured_large, -/area/station/cargo/bitrunning/den) "olM" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 9 @@ -55050,11 +55765,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"onk" = ( -/obj/structure/table, -/obj/item/storage/dice, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "onl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55185,16 +55895,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"ooW" = ( -/obj/structure/table, -/obj/item/key/security, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/item/key/security, -/turf/open/floor/iron/dark, -/area/station/security/warden) "ooY" = ( /obj/effect/turf_decal/stripes{ dir = 8 @@ -55296,6 +55996,21 @@ }, /turf/open/floor/wood/tile, /area/station/service/library) +"oqk" = ( +/obj/structure/sign/directions/medical/directional/north{ + dir = 2 + }, +/obj/structure/sign/directions/science/directional/north{ + dir = 2; + pixel_y = 24 + }, +/obj/structure/sign/directions/upload/directional/north{ + dir = 2; + pixel_y = 40 + }, +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor3/fore) "oqq" = ( /obj/structure/table, /obj/item/stamp, @@ -55331,6 +56046,14 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron/textured_large, /area/station/maintenance/solars/starboard/fore) +"oqH" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "oqK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55422,6 +56145,16 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/carpet/red, /area/station/service/theater) +"osq" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/starboard/fore) "osu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55434,6 +56167,12 @@ /obj/effect/mapping_helpers/mail_sorting/engineering/general, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"osC" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/grille, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/floor1/starboard/fore) "osI" = ( /obj/machinery/light/red/dim/directional/east, /turf/open/floor/pod/dark, @@ -55442,6 +56181,10 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) +"osS" = ( +/obj/effect/spawner/structure/window/hollow/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor4/starboard) "osX" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -55581,16 +56324,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"ovc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/floor3/starboard/fore) "ovB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55632,6 +56365,15 @@ /obj/item/reagent_containers/dropper, /turf/open/floor/iron/white, /area/station/medical/virology) +"ovZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/security/checkpoint) "owb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -55652,6 +56394,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) +"owr" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Bulkhead" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/security/mechbay) "owB" = ( /turf/open/floor/catwalk_floor, /area/station/science/xenobiology/hallway) @@ -55761,13 +56515,14 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark, /area/station/cargo/drone_bay) -"oyf" = ( -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor1/fore) "oyh" = ( /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"oyt" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "oyv" = ( /obj/machinery/light_switch/directional/east, /obj/effect/turf_decal/siding/purple{ @@ -55886,6 +56641,16 @@ /obj/machinery/light/cold/no_nightlight/directional/north, /turf/open/floor/iron/dark, /area/station/security/detectives_office/private_investigators_office) +"ozA" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) "ozJ" = ( /obj/structure/disposalpipe/junction/yjunction{ dir = 8 @@ -55903,6 +56668,13 @@ /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white, /area/station/medical/office) +"ozM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/bluespace_vendor/directional/north, +/turf/open/floor/iron, +/area/station/hallway/floor1/aft) "ozO" = ( /turf/closed/wall, /area/station/security/prison) @@ -56034,6 +56806,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) +"oBP" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/structure/chair/comfy/beige{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/hallway/floor3/fore) "oBQ" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -56086,15 +56868,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"oCw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/duct, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/security/office) "oCx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -56163,12 +56936,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) -"oDL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) "oDS" = ( /obj/machinery/holopad, /obj/machinery/duct, @@ -56620,14 +57387,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/heads_quarters/cmo) -"oJH" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/turf/open/floor/engine{ - initial_gas_mix = "o2=22;bz=82;TEMP=293.15" - }, -/area/station/science/xenobiology) "oJO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/pod/dark, @@ -56882,6 +57641,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) +"oNK" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor1/fore) "oNP" = ( /turf/open/floor/iron/dark/side{ dir = 10 @@ -57476,6 +58239,12 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron, /area/station/cargo/storage) +"oUW" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "oVa" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -57485,6 +58254,15 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) +"oVg" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/science/robotics/lab) "oVj" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 5 @@ -57584,10 +58362,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/tile, /area/station/commons/fitness/recreation) -"oWR" = ( -/obj/structure/chair/sofa/bench, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "oWS" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/pod/dark, @@ -57619,6 +58393,16 @@ /obj/structure/railing/corner, /turf/open/space/openspace, /area/space/nearstation) +"oXp" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "oXE" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron, @@ -57870,6 +58654,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/cytology) +"pbm" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/robotics/lab) "pbr" = ( /obj/machinery/light/directional/east, /obj/machinery/deepfryer, @@ -57881,19 +58677,6 @@ /obj/structure/grille/broken, /turf/open/floor/plating, /area/station/hallway/floor3/fore) -"pbv" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor3/fore) "pbx" = ( /obj/effect/landmark/start/prisoner, /obj/structure/sign/poster/official/random/directional/west, @@ -58021,6 +58804,14 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port/fore) +"pdK" = ( +/obj/structure/railing, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor/border_only, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "pdO" = ( /obj/effect/turf_decal/siding/wood/end{ dir = 4 @@ -58095,14 +58886,6 @@ /obj/item/stock_parts/cell/high, /turf/open/floor/iron/white, /area/station/science/circuits) -"pfc" = ( -/obj/machinery/camera/autoname/directional/south, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/machinery/light/floor, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor3/fore) "pfd" = ( /obj/structure/cable, /obj/effect/decal/cleanable/blood/old, @@ -58156,21 +58939,6 @@ dir = 8 }, /area/station/security/prison/garden) -"pfN" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/obj/effect/spawner/random/structure/crate_abandoned, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) -"pfX" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/station/science/robotics/mechbay) "pgi" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/bush/lavendergrass/style_random, @@ -58315,6 +59083,10 @@ /obj/effect/turf_decal/trimline/neutral/end, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) +"pix" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "piz" = ( /obj/machinery/door/firedoor/heavy, /obj/structure/table/reinforced, @@ -58354,11 +59126,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"piJ" = ( -/turf/open/floor/engine{ - initial_gas_mix = "o2=22;bz=82;TEMP=293.15" - }, -/area/station/science/xenobiology) "piO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58902,6 +59669,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard) +"pqt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/official/love_ian/directional/south, +/turf/open/floor/iron/white/textured_large, +/area/station/service/chapel/office) "pqy" = ( /obj/machinery/camera{ c_tag = "Power Storage"; @@ -58920,6 +59694,12 @@ dir = 4 }, /area/station/hallway/secondary/exit/departure_lounge) +"pqB" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor3/fore) "pqH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ @@ -58958,13 +59738,23 @@ /obj/item/clothing/suit/toggle/labcoat, /turf/open/floor/iron, /area/station/maintenance/floor3/starboard/aft) +"prd" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "pre" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor2/fore) -"prf" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "pri" = ( /obj/item/shard, /obj/effect/decal/cleanable/glass, @@ -59026,6 +59816,16 @@ }, /turf/open/floor/carpet/red, /area/station/service/theater) +"prS" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/robotics/lab) "prZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -59060,17 +59860,19 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) -"psi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/security/checkpoint) +"psn" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor2/fore) "psq" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/wood, /area/station/service/kitchen/diner) +"psF" = ( +/obj/structure/chair/wood, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/carpet/orange, +/area/station/service/chapel/office) "psJ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -59113,6 +59915,12 @@ dir = 1 }, /area/station/hallway/floor4/aft) +"ptl" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 4 + }, +/turf/open/openspace, +/area/station/maintenance/floor2/port) "ptu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59139,12 +59947,6 @@ "pui" = ( /turf/open/floor/iron, /area/station/engineering/atmos/project) -"puj" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/holopad, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/second) "pum" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/engineering/flashlight, @@ -59271,6 +60073,12 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/office) +"pvX" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) "pvZ" = ( /obj/structure/chair/sofa/bench/left, /obj/structure/flora/bush/sparsegrass/style_random, @@ -59342,7 +60150,6 @@ /area/station/command/heads_quarters/cmo) "pwY" = ( /obj/effect/turf_decal/trimline/red/filled/line, -/obj/effect/landmark/start/depsec/supply, /turf/open/floor/iron/dark, /area/station/security/checkpoint/first) "pxb" = ( @@ -59483,6 +60290,16 @@ }, /turf/open/floor/wood/large, /area/station/service/library/artgallery) +"pyE" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/starboard) "pyL" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -59579,13 +60396,6 @@ }, /turf/open/floor/engine/cult, /area/station/service/library/private) -"pzw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "pzx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59641,6 +60451,15 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/smooth, /area/station/cargo/sorting) +"pAk" = ( +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "pAn" = ( /obj/effect/mapping_helpers/airlock/access/any/medical/general, /obj/machinery/door/airlock/medical{ @@ -59662,6 +60481,17 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/misc/dirt/jungle, /area/station/service/hydroponics/garden/abandoned) +"pAK" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/north, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/port) "pAL" = ( /obj/machinery/light_switch/directional/east, /obj/machinery/space_heater, @@ -59695,15 +60525,25 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 }, -/obj/effect/landmark/start/depsec/supply, /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/station/security/checkpoint/first) -"pBy" = ( -/obj/machinery/light/broken/directional/south, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port/aft) +"pBv" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/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/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor3/starboard/fore) "pBJ" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=1-7"; @@ -59711,6 +60551,16 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/fore) +"pBQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor1/fore) "pBS" = ( /obj/machinery/deepfryer, /turf/open/floor/iron/kitchen, @@ -59905,6 +60755,12 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) +"pEu" = ( +/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/catwalk_floor, +/area/station/hallway/floor2/fore) "pEv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -59945,6 +60801,17 @@ dir = 8 }, /area/station/hallway/floor2/fore) +"pEO" = ( +/obj/effect/turf_decal/trimline/blue/corner, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "pEQ" = ( /obj/structure/closet/firecloset, /turf/open/floor/pod/dark, @@ -59985,6 +60852,22 @@ /obj/structure/closet/crate/trashcart, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/aft) +"pFT" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/quantumpad, +/turf/open/floor/iron/smooth, +/area/station/science/robotics/mechbay) +"pFW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor2/aft) "pGb" = ( /obj/structure/table/glass, /obj/item/camera_film{ @@ -60060,10 +60943,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) -"pGT" = ( -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port) "pGW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -60154,6 +61033,13 @@ name = "bathroom tiles" }, /area/station/security/lockers) +"pIm" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/aft) "pIq" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/pod/light, @@ -60164,6 +61050,12 @@ }, /turf/open/floor/pod, /area/station/maintenance/floor3/starboard) +"pIv" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/openspace, +/area/station/maintenance/floor4/port/aft) "pIG" = ( /obj/effect/turf_decal/tile/red/half, /turf/open/floor/iron/dark/side, @@ -60174,17 +61066,6 @@ }, /turf/open/floor/wood, /area/station/hallway/secondary/entry) -"pIP" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Bulkhead" - }, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/turf/open/floor/catwalk_floor, -/area/station/security/mechbay) "pIS" = ( /obj/machinery/requests_console/directional/east{ department = "Captain's Desk"; @@ -60540,9 +61421,27 @@ /obj/effect/turf_decal/trimline/green/end, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) +"pNe" = ( +/obj/structure/chair/plastic, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/red/half{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "pNj" = ( /turf/open/floor/carpet/red, /area/station/service/library) +"pNs" = ( +/obj/effect/spawner/structure/window/hollow/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor3/starboard/aft) +"pNA" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 1 + }, +/turf/open/openspace, +/area/station/maintenance/floor3/starboard/fore) "pNH" = ( /turf/open/floor/carpet, /area/station/service/lawoffice) @@ -60633,15 +61532,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) -"pOP" = ( -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/brig) "pOQ" = ( /obj/effect/turf_decal/caution/white{ dir = 8 @@ -60743,13 +61633,6 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) -"pPL" = ( -/obj/machinery/door/window/brigdoor/security/cell/left/directional/south{ - id = "cell-2"; - name = "2nd Floor Cell" - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "pPP" = ( /obj/effect/decal/cleanable/oil/streak, /turf/open/floor/iron/smooth, @@ -60890,11 +61773,6 @@ /obj/structure/cable, /turf/open/floor/carpet/red, /area/station/commons/dorms/room1) -"pRW" = ( -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/hallway/floor2/aft) "pRY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60922,6 +61800,14 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"pSp" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "pSz" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -61073,6 +61959,20 @@ /obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/commons/dorms/room2) +"pUK" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/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/hatch{ + name = "Maintenance Bulkhead" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/starboard) "pUV" = ( /turf/open/floor/plating/airless, /area/station/solars/port/aft) @@ -61106,6 +62006,21 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/dark, /area/station/service/library/lounge) +"pVj" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "pVk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -61123,6 +62038,13 @@ /obj/effect/mapping_helpers/airlock/access/any/service/kitchen, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/fore) +"pVD" = ( +/obj/structure/chair/sofa/bench, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "pVK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -61165,6 +62087,13 @@ }, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) +"pWA" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/storage) "pWD" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/item/beacon, @@ -61194,6 +62123,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"pXg" = ( +/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, +/obj/machinery/door/airlock/hatch{ + name = "Science Maintenance" + }, +/turf/open/floor/plating, +/area/station/science/cytology) "pXh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -61395,6 +62331,19 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/fore) +"pZK" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/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/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor4/starboard/aft) "pZL" = ( /obj/effect/spawner/random/trash/garbage{ spawn_loot_count = 3; @@ -61410,6 +62359,16 @@ /obj/effect/baseturf_helper/reinforced_plating/ceiling, /turf/open/floor/wood/large, /area/station/command/heads_quarters/qm) +"pZV" = ( +/obj/machinery/door/airlock/hatch{ + name = "Elevator Shaft Access" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "pZW" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/second) @@ -61467,11 +62426,14 @@ dir = 1 }, /area/station/cargo/sorting) -"qaN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/fourcorners, +"qaJ" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Security - Cell" + }, +/obj/structure/sign/poster/official/random/directional/east, +/obj/effect/turf_decal/tile/red/half{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/station/security/holding_cell) "qaS" = ( @@ -61499,10 +62461,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/wood, /area/station/service/kitchen/diner) -"qbg" = ( -/obj/machinery/camera/autoname/directional/south, -/turf/open/openspace, -/area/station/hallway/floor4/aft) "qbh" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/aicard, @@ -61730,6 +62688,21 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"qdF" = ( +/obj/machinery/bluespace_vendor/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) +"qdS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "qdV" = ( /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) @@ -61840,6 +62813,16 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/starboard/aft) +"qfm" = ( +/obj/machinery/newscaster/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "qfn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -61954,6 +62937,16 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/manifold, /turf/open/space/basic, /area/space/nearstation) +"qgU" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "qgV" = ( /obj/structure/railing{ dir = 1 @@ -62089,15 +63082,6 @@ /obj/structure/sign/departments/restroom/directional/west, /turf/open/openspace, /area/station/hallway/floor3/aft) -"qjN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/stack/sheet/mineral/coal, -/obj/effect/spawner/random/engineering/flashlight, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) "qkr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -62300,6 +63284,11 @@ /obj/structure/cable, /turf/open/floor/carpet/neon/simple/white, /area/station/commons/dorms/room3) +"qmN" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet/any, +/turf/open/floor/wood, +/area/station/medical/psychology) "qnc" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -62347,6 +63336,10 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"qnA" = ( +/mob/living/simple_animal/slime, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "qnB" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -62389,6 +63382,10 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"qoq" = ( +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/aft) "qos" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -62467,11 +63464,34 @@ /obj/machinery/light/directional/west, /turf/open/floor/wood, /area/station/service/kitchen/diner) +"qpa" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin/carbon{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/machinery/camera/directional/north, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/item/modular_computer/laptop/preset/civilian, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "qpb" = ( /obj/structure/window/reinforced/plasma/spawner/directional/south, /obj/structure/foamedmetal, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) +"qpp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "qpt" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -62724,6 +63744,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, /area/station/medical/abandoned) +"qsW" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "qtf" = ( /obj/effect/turf_decal/siding/thinplating_new, /obj/machinery/door/airlock/external, @@ -62757,6 +63785,10 @@ }, /turf/open/floor/iron, /area/station/science/genetics) +"qtw" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor3/starboard) "qty" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -62793,21 +63825,6 @@ /obj/item/storage/pill_bottle/mining, /turf/open/floor/iron/white, /area/station/command/heads_quarters/captain/private) -"qtL" = ( -/obj/structure/sign/directions/evac/directional/north{ - dir = 2; - pixel_y = 40 - }, -/obj/structure/sign/directions/engineering/directional/north{ - dir = 2 - }, -/obj/structure/sign/directions/supply/directional/north{ - dir = 2; - pixel_y = 24 - }, -/obj/structure/railing/corner, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor2/fore) "qtM" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62844,6 +63861,24 @@ dir = 1 }, /area/station/hallway/floor3/fore) +"qtW" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/disposal/delivery_chute{ + dir = 8; + name = "Space Chute" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/sign/warning/vacuum/external/directional/south{ + name = "WARNING: CHUTE LEADS DIRECTLY TO SPACE" + }, +/obj/machinery/light/small/directional/east, +/obj/structure/sign/warning/deathsposal/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "qun" = ( /turf/closed/wall/r_wall, /area/station/science/genetics) @@ -62984,12 +64019,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/commons/storage/primary) -"qvB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "qvE" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -63148,6 +64177,17 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/wood/tile, /area/station/science/xenobiology/hallway) +"qxN" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/light/directional/south, +/obj/effect/decal/cleanable/oil/streak, +/obj/machinery/byteforge, +/obj/effect/turf_decal/box, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/cargo/bitrunning/den) "qxQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, @@ -63176,6 +64216,21 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard) +"qxY" = ( +/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/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "qxZ" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/computer/crew, @@ -63495,15 +64550,11 @@ /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, /area/station/science/genetics) -"qBh" = ( -/obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/start/shaft_miner, -/turf/open/floor/carpet, -/area/station/cargo/miningdock) +"qBk" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/turf/open/floor/carpet/black, +/area/station/hallway/secondary/service) "qBm" = ( /obj/machinery/light/small/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63523,6 +64574,12 @@ "qBx" = ( /turf/closed/wall, /area/station/service/hydroponics) +"qBJ" = ( +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/openspace, +/area/station/maintenance/floor3/port) "qBP" = ( /obj/effect/turf_decal/tile/green/half, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63551,11 +64608,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness) -"qCn" = ( -/obj/structure/bed, -/obj/item/bedsheet/random, -/turf/open/floor/wood, -/area/station/medical/psychology) "qCo" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -63579,16 +64631,6 @@ }, /turf/open/floor/plating/elevatorshaft, /area/station/hallway/floor1/fore) -"qCq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor4/aft) "qCr" = ( /obj/effect/spawner/random/trash/grille_or_waste, /obj/effect/turf_decal/trimline/red/line{ @@ -63803,14 +64845,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) -"qEA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/checkpoint) "qEB" = ( /obj/effect/turf_decal/trimline/green/corner{ dir = 8 @@ -63942,11 +64976,6 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/general, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) -"qFU" = ( -/obj/structure/closet/secure_closet/security, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "qFX" = ( /obj/structure/cable, /obj/structure/firelock_frame/heavy, @@ -64115,6 +65144,10 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"qIH" = ( +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "qIM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64145,13 +65178,6 @@ /obj/structure/table, /turf/open/floor/iron, /area/station/cargo/miningdock) -"qJj" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/aft) "qJq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -64368,6 +65394,13 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/science/genetics) +"qNI" = ( +/obj/machinery/light/floor, +/obj/machinery/bluespace_vendor/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor4/aft) "qNK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64402,19 +65435,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"qOf" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/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/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor3/starboard/fore) "qOh" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -64454,17 +65474,6 @@ /obj/effect/turf_decal/trimline/blue/filled/corner, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) -"qOJ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/security/brig) "qON" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/airalarm/directional/south, @@ -64559,13 +65568,12 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) -"qPI" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) +"qPG" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 1 + }, +/turf/open/openspace, +/area/station/maintenance/floor3/port) "qPM" = ( /obj/effect/turf_decal/tile/green/full, /obj/machinery/camera/autoname/directional/west, @@ -64752,12 +65760,6 @@ }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) -"qRM" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "qRS" = ( /obj/structure/railing/corner{ dir = 8 @@ -64775,13 +65777,6 @@ /obj/structure/musician/piano/minimoog, /turf/open/floor/wood/tile, /area/station/commons/fitness/recreation) -"qSg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/marker_beacon/jade, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "qSl" = ( /turf/closed/wall, /area/station/maintenance/department/engine/atmos) @@ -64955,6 +65950,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"qVh" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/station/hallway/floor2/aft) "qVl" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -65741,6 +66744,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor4/port/fore) +"rek" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/corner, +/area/station/security/office) "rem" = ( /obj/machinery/door/airlock/public/glass{ name = "Chapel Office" @@ -65805,15 +66816,6 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron/dark/textured_large, /area/station/security/checkpoint/escape) -"reN" = ( -/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/red/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "reW" = ( /obj/effect/turf_decal/trimline/green/line{ dir = 1 @@ -66011,6 +67013,14 @@ /obj/machinery/light/cold/no_nightlight/directional/east, /turf/open/floor/engine, /area/station/command/heads_quarters/rd) +"rhI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/marker_beacon/jade, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "rhJ" = ( /obj/structure/railing{ dir = 4 @@ -66105,16 +67115,6 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/medical/virology) -"riO" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/starboard/fore) "riT" = ( /obj/effect/decal/cleanable/ash/large, /turf/open/floor/plating, @@ -66143,6 +67143,11 @@ /obj/structure/railing/corner/end, /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) +"rjB" = ( +/obj/structure/sign/warning/biohazard/directional/east, +/obj/machinery/light/cold/no_nightlight/directional/east, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "rjD" = ( /turf/closed/wall, /area/station/hallway/floor1/aft) @@ -66370,17 +67375,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/kitchen/diner) -"rny" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/office) "rnE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66426,6 +67420,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) +"rof" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "rog" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66435,6 +67438,15 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/hallway/floor2/aft) +"roj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "rom" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/effect/turf_decal/stripes/line{ @@ -66535,17 +67547,6 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"rqa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/security/brig) "rqc" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -66863,6 +67864,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/service/hydroponics) +"ruU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/sign/poster/random/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "rve" = ( /obj/effect/spawner/structure/window/hollow/reinforced/end{ dir = 8 @@ -66880,12 +67891,6 @@ "rvL" = ( /turf/closed/wall/r_wall, /area/station/maintenance/floor2/port/fore) -"rvZ" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 8 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "rwc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/moisture_trap, @@ -67002,6 +68007,15 @@ "rxn" = ( /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"rxq" = ( +/obj/effect/turf_decal/trimline/white/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/secondary/entry) "rxu" = ( /obj/item/radio/intercom/directional/north{ broadcasting = 1; @@ -67038,6 +68052,14 @@ /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, /area/station/science/genetics) +"rxS" = ( +/obj/effect/spawner/random/structure/table_or_rack, +/obj/effect/spawner/random/trash/soap, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/starboard/fore) "rxZ" = ( /obj/item/storage/toolbox/maint_kit, /obj/item/ammo_casing/shotgun/improvised, @@ -67106,12 +68128,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor4/fore) -"ryK" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor3/fore) "ryQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/hydroponics/constructable, @@ -67324,6 +68340,12 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/atmos) +"rCc" = ( +/obj/machinery/computer/records/security, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "rCe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67385,6 +68407,19 @@ }, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) +"rCM" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/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/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/port/fore) "rCN" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/layer2{ dir = 4 @@ -67426,28 +68461,12 @@ dir = 4 }, /area/station/security/office) -"rDC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/depsec/engineering, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "rDD" = ( /obj/structure/transit_tube/curved/flipped{ dir = 8 }, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) -"rDE" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/duct, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/aft) "rDF" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -67493,6 +68512,11 @@ }, /turf/open/floor/plating, /area/station/security/brig) +"rEa" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "rEm" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=1-2"; @@ -67659,6 +68683,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/engineering/atmos/office) +"rHr" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) "rHy" = ( /obj/machinery/vending/wardrobe/atmos_wardrobe, /turf/open/floor/iron, @@ -67671,12 +68703,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/maintenance/floor2/port/aft) -"rHH" = ( -/obj/item/bedsheet/double, -/obj/structure/bed/double, -/obj/machinery/light/directional/south, -/turf/open/floor/wood/tile, -/area/station/service/chapel/office) "rHI" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -67752,14 +68778,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/cargo/storage) -"rIL" = ( -/obj/structure/rack, -/obj/effect/spawner/random/engineering/tool, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) "rIS" = ( /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) @@ -67903,6 +68921,10 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/aft) +"rKV" = ( +/obj/machinery/bluespace_vendor/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "rKX" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -67929,6 +68951,16 @@ /obj/structure/bookcase/random, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"rLl" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "rLs" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, @@ -67987,12 +69019,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/fore) -"rMl" = ( -/obj/structure/chair/sofa/bench{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "rMo" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/west, @@ -68171,6 +69197,14 @@ "rPi" = ( /turf/closed/wall, /area/station/cargo/office) +"rPr" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/hangover, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor4/aft) "rPw" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -68208,7 +69242,6 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 }, -/obj/effect/landmark/start/depsec/supply, /turf/open/floor/iron/dark, /area/station/security/checkpoint/first) "rPK" = ( @@ -68561,13 +69594,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/engine/cult, /area/station/service/library/private) -"rUa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) "rUh" = ( /obj/effect/turf_decal/stripes{ dir = 10 @@ -68686,13 +69712,6 @@ "rVQ" = ( /turf/closed/wall, /area/station/service/library/private) -"rVS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron/dark/side, -/area/station/security/office) "rVY" = ( /obj/structure/chair{ dir = 8 @@ -68700,6 +69719,13 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron/checker, /area/station/service/bar/atrium) +"rWa" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "rWm" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, @@ -68828,10 +69854,6 @@ dir = 4 }, /area/station/hallway/floor3/aft) -"rYa" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port) "rYf" = ( /obj/structure/closet/secure_closet/security/sec, /obj/effect/turf_decal/tile/red/fourcorners, @@ -68990,6 +70012,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) +"sav" = ( +/obj/effect/turf_decal/box/corners, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "saA" = ( /obj/effect/turf_decal/siding/thinplating_new{ dir = 1 @@ -69150,14 +70176,15 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/maintenance/floor2/starboard/aft) -"sdg" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/engine{ - initial_gas_mix = "o2=22;bz=82;TEMP=293.15" +"sda" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 8 }, -/area/station/science/xenobiology) +/area/station/hallway/floor2/aft) "sdh" = ( /obj/structure/cable, /obj/effect/spawner/random/structure/grille, @@ -69221,6 +70248,21 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/ai_monitored/command/storage/eva) +"sdI" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "sdL" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Engineering" @@ -69725,6 +70767,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/treatment_center) +"slQ" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=2-13"; + location = "2-12" + }, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/hallway/floor2/aft) "smi" = ( /turf/open/floor/grass, /area/station/service/hydroponics) @@ -69845,14 +70897,6 @@ /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/pod, /area/station/maintenance/floor4/port/fore) -"soy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "soz" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -70013,6 +71057,16 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) +"srl" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/machinery/door/window/right/directional/north{ + name = "Butterfly Garden"; + req_access = list("hydroponics") + }, +/turf/open/misc/sandy_dirt, +/area/station/hallway/secondary/entry) "srz" = ( /obj/machinery/door/airlock/atmos{ name = "Atmospherics" @@ -70171,17 +71225,6 @@ dir = 8 }, /area/station/hallway/secondary/exit) -"stk" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/starboard) "stl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70211,6 +71254,13 @@ /obj/structure/girder/displaced, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"stZ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/grille, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/south, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/floor1/starboard/fore) "sua" = ( /obj/machinery/light/red/dim/directional/north, /obj/effect/decal/cleanable/dirt, @@ -70261,6 +71311,15 @@ /obj/effect/spawner/random/trash/grime, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) +"suu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "suv" = ( /obj/machinery/processor/slime, /obj/structure/cable, @@ -70305,6 +71364,20 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) +"suT" = ( +/obj/machinery/status_display/door_timer{ + id = "cell-3"; + name = "Floor 3 Cell"; + pixel_y = 32 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "suZ" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 4 @@ -70421,6 +71494,15 @@ "swT" = ( /turf/closed/wall/r_wall, /area/station/science/circuits) +"sxb" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/arrows{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/bitrunning/den) "sxe" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -70631,6 +71713,12 @@ /obj/machinery/telecomms/bus/preset_two, /turf/open/floor/circuit/telecomms, /area/station/tcommsat/server) +"szC" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/openspace, +/area/station/maintenance/floor2/port) "szD" = ( /obj/structure/table, /obj/item/storage/box/evidence{ @@ -70919,20 +72007,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/mineral/plastitanium/red, /area/station/maintenance/floor4/starboard/aft) -"sDK" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/station/maintenance/floor3/starboard/fore) "sDL" = ( /obj/structure/table, /obj/item/storage/medkit/emergency, @@ -70948,17 +72022,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) -"sEb" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/floor4/port/fore) "sEd" = ( /obj/effect/turf_decal/trimline/blue/line, /obj/effect/decal/cleanable/dirt, @@ -71022,6 +72085,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) +"sEE" = ( +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/light/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "sEK" = ( /obj/item/chair/stool/bar, /obj/effect/decal/cleanable/dirt, @@ -71088,6 +72159,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/paramedic) +"sFJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/station/hallway/floor1/fore) "sFQ" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 @@ -71105,13 +72182,6 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, /area/station/command/bridge) -"sGh" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, -/turf/open/floor/plating, -/area/station/science/cytology) "sGu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -71120,6 +72190,19 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron, /area/station/hallway/floor2/aft) +"sGw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "sGB" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/wood/tile, @@ -71177,12 +72260,6 @@ /obj/machinery/light/red/dim/directional/north, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard/fore) -"sHs" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "sHv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71242,6 +72319,17 @@ /obj/item/pipe_dispenser, /turf/open/floor/iron/dark, /area/station/engineering/supermatter) +"sHN" = ( +/obj/structure/sign/directions/medical/directional/north, +/obj/structure/sign/directions/science/directional/north{ + pixel_y = 24 + }, +/obj/structure/sign/directions/upload/directional/north{ + pixel_y = 40 + }, +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor1/fore) "sHP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71697,6 +72785,10 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/office) +"sMD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "sMI" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -71810,6 +72902,20 @@ /obj/effect/turf_decal/box, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/office) +"sOO" = ( +/obj/structure/sign/directions/security/directional/north{ + pixel_y = 40 + }, +/obj/structure/sign/directions/command/directional/north{ + pixel_y = 24 + }, +/obj/structure/sign/directions/vault/directional/north, +/obj/structure/chair/comfy/beige, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/hallway/floor3/fore) "sOT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/camera/autoname/directional/north, @@ -71890,6 +72996,20 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) +"sPR" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Bulkhead" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/port) "sPZ" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -71967,6 +73087,20 @@ /obj/machinery/duct, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) +"sRf" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/security/brig) "sRh" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -72081,6 +73215,10 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/service/library/lounge) +"sSY" = ( +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "sTq" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, @@ -72102,6 +73240,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/hfr_room) +"sTE" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "sTG" = ( /obj/machinery/chem_dispenser/drinks, /obj/structure/table/glass, @@ -72295,11 +73443,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"sVV" = ( -/obj/structure/chair/plastic, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "sVW" = ( /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, @@ -72333,6 +73476,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/range) +"sWp" = ( +/obj/effect/spawner/structure/window/hollow/middle, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port/fore) "sWs" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/burgundy, @@ -72400,16 +73547,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"sWU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/railing/corner, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/fore) "sWW" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -72590,6 +73727,21 @@ }, /turf/open/floor/iron/dark, /area/station/service/library/printer) +"sYK" = ( +/obj/structure/railing{ + dir = 4 + }, +/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/border_only{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port/aft) "sYN" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -72720,6 +73872,15 @@ dir = 4 }, /area/station/commons/storage/primary) +"sZN" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/machinery/airalarm/directional/west, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/security/mechbay) "sZO" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -72782,18 +73943,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"taR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/sign/directions/evac/directional/south, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "taW" = ( /obj/structure/table/wood, /obj/effect/spawner/random/entertainment/musical_instrument, /turf/open/floor/wood/tile, /area/station/commons/fitness/recreation) +"tbb" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/security/general, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/security/checkpoint/first) "tbd" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -72890,6 +74056,12 @@ /obj/effect/landmark/start/warden, /turf/open/floor/iron/dark, /area/station/security/warden) +"tcs" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor3/fore) "tcA" = ( /obj/machinery/telecomms/server/presets/engineering, /turf/open/floor/circuit/telecomms, @@ -73027,6 +74199,22 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/white, /area/station/science/lower) +"tdN" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Bulkhead" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor3/port/aft) "tec" = ( /obj/machinery/door/airlock/public{ id_tag = "public_toilets_b"; @@ -73291,15 +74479,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/detectives_office/private_investigators_office) -"thH" = ( -/obj/structure/cable, -/obj/machinery/bouldertech/brm, -/obj/machinery/conveyor{ - dir = 4; - id = "mining" - }, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "thM" = ( /obj/structure/railing{ dir = 1 @@ -73392,10 +74571,6 @@ /obj/effect/spawner/random/engineering/flashlight, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/starboard/aft) -"tjC" = ( -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "tjF" = ( /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/chapel{ @@ -73436,13 +74611,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"tjS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor2/aft) "tjV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -73453,16 +74621,6 @@ /obj/machinery/incident_display/delam/directional/north, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"tkb" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/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/hatch{ - name = "Maintenance Hatch" - }, -/turf/open/floor/plating, -/area/station/maintenance/floor4/starboard/fore) "tkq" = ( /turf/closed/wall, /area/station/solars/starboard/aft) @@ -73505,18 +74663,6 @@ }, /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) -"tkM" = ( -/obj/structure/railing{ - dir = 4 - }, -/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/border_only{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/aft) "tkZ" = ( /obj/structure/cable, /obj/machinery/conveyor/inverted{ @@ -73524,12 +74670,6 @@ }, /turf/open/floor/iron/checker, /area/station/cargo/miningdock) -"tlb" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/engine{ - initial_gas_mix = "o2=22;bz=82;TEMP=293.15" - }, -/area/station/science/xenobiology) "tld" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/mineral/plasma/five, @@ -73586,19 +74726,6 @@ "tlt" = ( /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) -"tlx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/obj/machinery/door/poddoor/shutters{ - id = "secmechbay"; - name = "Security Mech Bay Shutters" - }, -/obj/effect/turf_decal/caution/stand_clear, -/obj/effect/turf_decal/box, -/turf/open/floor/iron/dark, -/area/station/security/mechbay) "tlJ" = ( /obj/machinery/camera/autoname/directional/east, /turf/open/space/openspace, @@ -73633,6 +74760,10 @@ /obj/effect/landmark/start/lawyer, /turf/open/floor/carpet, /area/station/service/lawoffice) +"tmk" = ( +/obj/structure/disposalpipe/segment, +/turf/open/openspace, +/area/station/maintenance/floor4/port/aft) "tml" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -73661,6 +74792,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"tmH" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor1/fore) "tmM" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -73776,6 +74911,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) +"tnR" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Brig Fore Entrance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint) "tnS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73867,6 +75018,11 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/aft) +"toM" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "toO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -73898,6 +75054,12 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white/textured, /area/station/medical/storage) +"tpw" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/openspace, +/area/station/maintenance/floor3/port) "tpy" = ( /obj/machinery/holopad, /obj/effect/turf_decal/tile/red{ @@ -73933,7 +75095,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/depsec/supply, /turf/open/floor/iron/dark, /area/station/security/checkpoint/first) "tpS" = ( @@ -73994,6 +75155,17 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port) +"tqu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) "tqw" = ( /turf/open/openspace, /area/station/maintenance/floor2/starboard/fore) @@ -74080,10 +75252,29 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/fore) +"trF" = ( +/obj/machinery/door/airlock/hatch{ + name = "Elevator Shaft Access" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/turf/open/floor/plating, +/area/station/hallway/floor1/fore) "trH" = ( /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) +"trM" = ( +/obj/machinery/door/poddoor/preopen{ + id = "secure-gate"; + name = "Brig Shutters" + }, +/obj/machinery/prisongate, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "trP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -74498,9 +75689,6 @@ /obj/effect/spawner/random/decoration/glowstick, /turf/open/floor/pod, /area/station/maintenance/floor4/starboard/aft) -"txA" = ( -/turf/open/floor/plating/foam, -/area/station/maintenance/floor2/starboard/fore) "txB" = ( /obj/effect/turf_decal/siding/white, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -74692,19 +75880,6 @@ dir = 1 }, /area/station/hallway/floor4/aft) -"tAb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/obj/structure/disposalpipe/segment, -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/fore) "tAc" = ( /obj/machinery/door/poddoor/shutters{ id = "maint-shut"; @@ -74785,6 +75960,12 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/showroomfloor, /area/station/service/theater) +"tBq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "tBr" = ( /obj/machinery/camera/autoname/directional/south, /obj/effect/turf_decal/siding/wood{ @@ -74954,6 +76135,15 @@ dir = 1 }, /area/station/engineering/atmos/office) +"tDO" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "tDV" = ( /obj/machinery/rnd/production/circuit_imprinter/department/science, /obj/effect/turf_decal/bot, @@ -75001,6 +76191,14 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) +"tEv" = ( +/obj/effect/turf_decal/tile/red/half, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "tEG" = ( /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) @@ -75166,6 +76364,18 @@ }, /turf/open/floor/pod, /area/station/maintenance/floor4/starboard/aft) +"tHk" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "tHn" = ( /obj/machinery/atmospherics/components/binary/pump/layer4{ dir = 1 @@ -75192,10 +76402,6 @@ "tHL" = ( /turf/open/floor/iron/textured_large, /area/station/cargo/storage) -"tHM" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "tHZ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/washing_machine, @@ -75219,6 +76425,21 @@ }, /turf/open/floor/carpet/blue, /area/station/command/meeting_room) +"tIe" = ( +/obj/structure/sign/directions/evac/directional/north{ + dir = 2; + pixel_y = 40 + }, +/obj/structure/sign/directions/engineering/directional/north{ + dir = 2 + }, +/obj/structure/sign/directions/supply/directional/north{ + dir = 2; + pixel_y = 24 + }, +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor2/fore) "tIj" = ( /obj/structure/railing, /obj/structure/chair, @@ -75335,11 +76556,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"tJu" = ( -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/hallway/floor2/aft) "tJE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/canister/oxygen, @@ -75566,13 +76782,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/locker) -"tMB" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "tMK" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -75815,6 +77024,15 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"tPy" = ( +/obj/structure/cable, +/obj/machinery/brm, +/obj/machinery/conveyor{ + dir = 4; + id = "mining" + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "tPB" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -75825,6 +77043,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/blue, /area/station/command/heads_quarters/hop) +"tPI" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/brig) "tPK" = ( /obj/structure/sign/warning{ pixel_y = 32 @@ -75834,6 +77062,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard) +"tPL" = ( +/obj/structure/disposalpipe/segment, +/turf/open/openspace, +/area/station/maintenance/floor3/port/aft) "tPO" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/decal/cleanable/dirt, @@ -76098,10 +77330,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/hallway/floor2/fore) -"tTU" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port) "tTV" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -76152,18 +77380,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/floor2/aft) -"tUF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/office) "tUG" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -76177,6 +77393,23 @@ }, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"tUW" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Security - Office Fore" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "tVa" = ( /obj/structure/table, /obj/item/folder/red{ @@ -76507,6 +77740,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/starboard) +"tZO" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/cable, +/turf/open/floor/iron/white/textured, +/area/station/medical/storage) "tZX" = ( /obj/machinery/door/airlock/security{ name = "Permabrig Visitation" @@ -76631,11 +77869,6 @@ "ubR" = ( /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) -"ubU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "ubW" = ( /obj/structure/table/reinforced, /turf/open/floor/iron, @@ -76724,6 +77957,16 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"udw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/structure/cable, +/obj/machinery/door/airlock/hatch{ + name = "Science Maintenance" + }, +/turf/open/floor/plating, +/area/station/maintenance/floor3/starboard/fore) "udx" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/engine, @@ -76765,12 +78008,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, /area/station/service/library/lounge) -"uea" = ( -/obj/structure/disposalpipe/trunk/multiz{ - dir = 1 - }, -/turf/open/floor/plating/foam, -/area/station/maintenance/floor2/starboard/fore) "uek" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -76903,17 +78140,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"ufV" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/window/brigdoor/security/cell/left/directional/north{ - id = "cell-1"; - name = "1st Floor Cell" - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "ufW" = ( /obj/item/stack/sheet/paperframes/fifty, /obj/structure/table/wood, @@ -77000,6 +78226,21 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) +"uhj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/table/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/end{ + dir = 8 + }, +/obj/item/storage/toolbox/emergency, +/obj/machinery/bluespace_vendor/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/storage/tools) "uhl" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/spawner/random/structure/crate, @@ -77087,17 +78328,6 @@ /obj/structure/closet/crate/mod, /turf/open/floor/iron/dark/smooth_large, /area/station/science/robotics/lab) -"uit" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) "uiv" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -77125,13 +78355,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) -"uiH" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "uiM" = ( /obj/structure/table/wood, /obj/item/lighter, @@ -77271,13 +78494,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"ukr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/aft) "ukC" = ( /obj/structure/grille, /turf/open/floor/catwalk_floor, @@ -77553,11 +78769,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) -"uoE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "uoS" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -77620,6 +78831,18 @@ "uqc" = ( /turf/closed/wall/r_wall, /area/station/command/teleporter) +"uqd" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor2/aft) "uqi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -77686,6 +78909,11 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"ure" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/aft) "urf" = ( /obj/effect/turf_decal/tile/blue/anticorner{ dir = 8 @@ -77694,26 +78922,12 @@ dir = 10 }, /area/station/ai_monitored/turret_protected/ai) -"urn" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Briefing Room" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "briglockdown"; - name = "Brig Lockdown" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/turf/open/floor/iron/dark/side{ - dir = 1 +"urv" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Xenobio - Holding Pen" }, -/area/station/security/office) +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "urO" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible/layer2{ @@ -77841,15 +79055,6 @@ dir = 4 }, /area/station/hallway/floor3/aft) -"usO" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin/carbon{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "usS" = ( /turf/open/floor/iron/dark/side{ dir = 8 @@ -78016,6 +79221,15 @@ /obj/structure/sign/departments/medbay/alt/directional/east, /turf/open/openspace, /area/station/hallway/floor2/fore) +"uvG" = ( +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor/border_only, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/port) "uvJ" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -78082,14 +79296,6 @@ }, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/atmos) -"uww" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard/fore) "uwA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/red, @@ -78199,20 +79405,17 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/service/hydroponics) -"uya" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "uyf" = ( /obj/machinery/light/cold/no_nightlight/directional/west, /turf/open/floor/iron/dark/side{ dir = 8 }, /area/station/hallway/floor3/fore) +"uyg" = ( +/obj/effect/spawner/random/structure/grille, +/obj/structure/disposalpipe/segment, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) "uyh" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/pod/light, @@ -78236,6 +79439,17 @@ "uyD" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter) +"uyH" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "uyK" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 @@ -78273,14 +79487,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"uzl" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/obj/item/storage/dice, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "uzn" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 4 @@ -78354,6 +79560,17 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/atmos) +"uAg" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin/carbon{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen, +/obj/effect/turf_decal/trimline/red/filled, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "uAi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/green/half{ @@ -78365,12 +79582,32 @@ dir = 1 }, /area/station/hallway/secondary/exit/escape_pod) +"uAo" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor4/starboard/fore) "uAW" = ( /obj/structure/closet/secure_closet/medical2, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) +"uBi" = ( +/obj/structure/cable/multilayer/multiz, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/port/aft) "uBr" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -78800,6 +80037,13 @@ /obj/machinery/vending/coffee, /turf/open/floor/iron/dark, /area/station/science/breakroom) +"uGS" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/machinery/bluespace_vendor/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "uHa" = ( /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/dark/side, @@ -78816,15 +80060,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white, /area/station/science/lower) -"uHg" = ( -/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/hatch{ - name = "Stairwell Access" - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor3/fore) "uHq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -79150,14 +80385,20 @@ /obj/structure/stairs/north, /turf/open/floor/plating, /area/station/science/lobby) -"uKp" = ( +"uKs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/security/general, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" +/obj/effect/turf_decal/tile/red/half{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "uKt" = ( /obj/structure/cable/multilayer/multiz, /obj/machinery/digital_clock/directional/north, @@ -79232,13 +80473,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"uLi" = ( -/obj/effect/turf_decal/trimline/green/warning{ - dir = 4 - }, -/obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor3/port) "uLj" = ( /obj/structure/railing/corner, /obj/effect/decal/cleanable/dirt, @@ -79853,21 +81087,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/iron, /area/station/security/prison) -"uTe" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line, -/obj/item/assembly/flash, -/obj/item/restraints/handcuffs, -/obj/machinery/camera/directional/east{ - name = "Checkpoint - Engineering Deck" - }, -/obj/machinery/recharger, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "uTh" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, @@ -80024,12 +81243,6 @@ }, /turf/open/floor/iron/checker, /area/station/service/bar/atrium) -"uUY" = ( -/obj/structure/table/reinforced, -/obj/machinery/microwave, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/robotics/lab) "uVh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -80097,6 +81310,15 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/catwalk_floor, /area/station/hallway/floor2/aft) +"uVU" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/starboard/fore) "uVV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -80218,10 +81440,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) -"uXB" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/robotics/lab) "uXG" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -80364,16 +81582,6 @@ "uZF" = ( /turf/closed/wall/r_wall, /area/station/maintenance/floor2/starboard/aft) -"uZV" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port) "uZY" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -80433,6 +81641,16 @@ /obj/structure/sign/poster/random/directional/south, /turf/open/floor/iron/white, /area/station/cargo/miningdock) +"vaz" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/carpet/green, +/area/station/cargo/miningdock) "vaA" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -80599,6 +81817,21 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/cafeteria, /area/station/service/theater) +"vcy" = ( +/obj/structure/sign/poster/contraband/random/directional/south, +/obj/machinery/door/window/brigdoor/security/cell/left/directional/north{ + id = "cell-1"; + name = "1st Floor Prisoner Tube" + }, +/obj/machinery/disposal/delivery_chute{ + dir = 1; + name = "prisoner transport" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "vcM" = ( /obj/machinery/duct, /obj/structure/sink/kitchen/directional/west, @@ -80615,6 +81848,16 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) +"vcY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "vdb" = ( /obj/effect/turf_decal/trimline/white/arrow_cw{ dir = 8 @@ -80719,6 +81962,13 @@ dir = 4 }, /area/station/hallway/floor2/fore) +"veI" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "veQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -81293,23 +82543,12 @@ }, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"vmZ" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/effect/mapping_helpers/airlock/access/any/medical/psychology, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/fore) "vnd" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 }, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"vni" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) "vnp" = ( /obj/machinery/door/airlock/maintenance{ name = "Maintenance" @@ -81597,6 +82836,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/hydroponics) +"vqv" = ( +/obj/structure/chair/plastic{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "vqx" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -81861,6 +83109,14 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/grass, /area/station/service/hydroponics/garden/abandoned) +"vsO" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard) "vsP" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron, @@ -82031,15 +83287,18 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/security/office) -"vuV" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=2-13"; - location = "2-12" - }, -/turf/open/floor/iron/dark/side{ - dir = 6 +"vuU" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/area/station/hallway/floor2/aft) +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) +"vuW" = ( +/obj/effect/spawner/random/structure/crate, +/obj/structure/disposalpipe/segment, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) "vuZ" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o{ dir = 8 @@ -82130,14 +83389,6 @@ dir = 6 }, /area/station/hallway/floor4/aft) -"vvZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/security/office) "vwc" = ( /obj/item/radio/intercom/directional/north, /obj/machinery/disposal/bin, @@ -82421,6 +83672,15 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/aft) +"vzM" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) "vzN" = ( /obj/structure/chair/sofa/middle/brown{ dir = 1 @@ -82568,6 +83828,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"vBw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "vBA" = ( /obj/machinery/door/airlock/medical{ name = "Safe Habitation B" @@ -82643,6 +83907,21 @@ /obj/machinery/door/window/right/directional/west, /turf/open/floor/grass, /area/station/security/courtroom) +"vCP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/security/brig) "vDf" = ( /obj/effect/spawner/random/trash/grille_or_waste, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -82653,12 +83932,6 @@ /obj/machinery/rnd/server, /turf/open/floor/circuit/telecomms, /area/station/science/server) -"vDk" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/science/robotics/mechbay) "vDo" = ( /turf/open/floor/plating/foam, /area/station/maintenance/floor3/starboard/fore) @@ -82774,6 +84047,19 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/dark, /area/station/security/brig) +"vFw" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/robotics/lab) "vFC" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -82977,6 +84263,14 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"vIn" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "vIp" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 8 @@ -83120,15 +84414,6 @@ /obj/structure/rack, /turf/open/floor/iron/textured_large, /area/station/medical/chemistry) -"vKw" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port) "vKz" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -83181,6 +84466,10 @@ /obj/effect/decal/cleanable/xenoblood, /turf/open/floor/engine, /area/station/science/cytology) +"vLv" = ( +/obj/structure/hedge, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "vLx" = ( /obj/machinery/ai_slipper{ uses = 8 @@ -83571,6 +84860,15 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) +"vQi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "vQs" = ( /obj/effect/turf_decal/siding/white/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83709,6 +85007,16 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) +"vSB" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port/aft) "vSE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/blue/line{ @@ -83810,6 +85118,12 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) +"vTV" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "vTY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -84307,12 +85621,34 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"vZJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/sign/directions/evac/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "vZK" = ( /obj/effect/spawner/structure/window/hollow/end{ dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) +"vZU" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/plating, +/area/station/maintenance/floor4/port/fore) "wat" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 8 @@ -84720,13 +86056,6 @@ }, /turf/open/floor/wood/parquet, /area/station/service/lawoffice) -"weT" = ( -/obj/structure/stairs/north, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) "weY" = ( /obj/effect/turf_decal/trimline/purple/arrow_ccw, /obj/machinery/door/firedoor/heavy, @@ -84831,6 +86160,15 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark/smooth_half, /area/station/engineering/storage/tech) +"wgr" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "wgu" = ( /obj/structure/cable, /obj/machinery/conveyor{ @@ -85193,6 +86531,9 @@ /obj/item/book/manual/chef_recipes, /turf/open/floor/iron, /area/station/security/prison) +"wkX" = ( +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor2/fore) "wll" = ( /obj/effect/turf_decal/delivery, /obj/structure/sign/departments/science/alt/directional/north, @@ -85262,17 +86603,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/floor2/aft) -"wmb" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/comfy{ - dir = 8 - }, -/obj/effect/landmark/start/depsec/medical, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/second) "wmj" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor, @@ -85584,11 +86914,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/fore) -"wpV" = ( -/obj/structure/chair/sofa/bench/left, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "wpY" = ( /obj/machinery/light/red/dim/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -85737,6 +87062,12 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron, /area/station/engineering/atmos) +"wsb" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port) "wsh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -86395,6 +87726,14 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"wzp" = ( +/obj/structure/table, +/obj/item/toy/cards/deck/wizoff, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "wzt" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/white/textured_large, @@ -86540,6 +87879,13 @@ /obj/structure/closet/secure_closet/courtroom, /turf/open/floor/iron, /area/station/security/courtroom) +"wBG" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "wBO" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 10 @@ -86673,14 +88019,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"wDs" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/end{ - dir = 1 - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "wDy" = ( /obj/structure/cable, /turf/open/floor/iron/dark/side, @@ -86769,10 +88107,6 @@ dir = 8 }, /area/station/hallway/floor2/aft) -"wFr" = ( -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor2/aft) "wFy" = ( /obj/machinery/computer/cargo, /obj/structure/sign/poster/random/directional/north, @@ -86879,13 +88213,6 @@ /obj/item/stack/cable_coil/cut, /turf/open/floor/catwalk_floor/iron, /area/station/hallway/floor1/aft) -"wGI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "wGK" = ( /obj/structure/fluff/paper/stack{ desc = "A stack of various papers, absolutely unreadable due to scorch marks and aging." @@ -87773,17 +89100,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) -"wQK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/maintenance, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/duct, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/aft) "wQN" = ( /obj/structure/hedge/opaque, /obj/structure/window/reinforced/spawner/directional/west, @@ -87794,11 +89110,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"wQU" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) "wQX" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 4 @@ -88115,10 +89426,6 @@ }, /turf/open/floor/engine, /area/station/command/heads_quarters/rd) -"wVl" = ( -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "wVm" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -88206,10 +89513,6 @@ "wVY" = ( /turf/closed/wall, /area/station/medical/break_room) -"wWa" = ( -/obj/structure/transport/linear/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/floor2/fore) "wWf" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -88264,6 +89567,24 @@ /obj/item/storage/briefcase/secure, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"wWY" = ( +/obj/effect/spawner/structure/window/hollow/plasma/middle{ + dir = 4 + }, +/turf/open/floor/engine/vacuum, +/area/station/science/ordnance/freezerchamber) +"wXc" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/fore) +"wXg" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor4/aft) "wXi" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, @@ -88418,17 +89739,6 @@ dir = 8 }, /area/station/security/brig) -"wZt" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "wZu" = ( /obj/machinery/computer/exoscanner_control, /turf/open/floor/iron/dark, @@ -88468,16 +89778,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"wZZ" = ( -/obj/item/wrench/medical, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/structure/table/glass, -/obj/item/gun/syringe, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white/textured, -/area/station/medical/storage) "xad" = ( /obj/machinery/door/airlock/research{ name = "Research Director's Office" @@ -88524,26 +89824,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/misc/dirt/jungle, /area/station/security/prison/garden) -"xbj" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) -"xbk" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "xbr" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -88735,6 +90015,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) +"xdC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/checkpoint) "xdE" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/stripes/end{ @@ -88786,13 +90077,6 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark, /area/station/command/bridge) -"xee" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) "xel" = ( /obj/item/folder/blue, /obj/item/paper/monitorkey, @@ -88832,6 +90116,12 @@ /obj/structure/sign/departments/rndserver/directional/west, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) +"xeF" = ( +/obj/effect/turf_decal/arrows{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "xeM" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 1 @@ -88897,18 +90187,6 @@ /obj/machinery/power/tracker, /turf/open/floor/iron/solarpanel/airless, /area/station/solars/port/aft) -"xfF" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/office) "xfI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/public/glass{ @@ -88916,17 +90194,6 @@ }, /turf/open/floor/wood, /area/station/service/theater) -"xfQ" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/robotics/lab) "xfT" = ( /turf/open/floor/plating, /area/station/maintenance/floor1/port) @@ -88958,15 +90225,6 @@ icon_state = "textured_dark" }, /area/station/medical/office) -"xgo" = ( -/obj/machinery/door/firedoor/border_only, -/obj/structure/railing, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/box/red, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "xgC" = ( /obj/structure/railing/corner{ dir = 8 @@ -89057,6 +90315,13 @@ dir = 1 }, /area/station/command/teleporter) +"xhx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "xhz" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Access" @@ -89175,6 +90440,11 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"xiW" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard/aft) "xjc" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/red/anticorner{ @@ -89337,15 +90607,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/commons/toilet) -"xkX" = ( -/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/red/filled/corner{ - dir = 1 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "xkY" = ( /obj/structure/sign/poster/official/random/directional/west, /obj/item/radio/intercom/directional/north, @@ -89407,6 +90668,13 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/hallway/floor2/aft) +"xmi" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/hangover, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor3/fore) "xmk" = ( /obj/structure/railing/corner{ dir = 1 @@ -89478,6 +90746,16 @@ }, /turf/open/floor/wood/tile, /area/station/science/xenobiology/hallway) +"xnY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "xob" = ( /obj/structure/frame/computer{ dir = 4 @@ -90055,17 +91333,6 @@ dir = 8 }, /area/station/engineering/storage/tech) -"xvX" = ( -/obj/structure/grille, -/obj/structure/sign/directions/security/directional/north{ - pixel_y = 40 - }, -/obj/structure/sign/directions/command/directional/north{ - pixel_y = 24 - }, -/obj/structure/sign/directions/vault/directional/north, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor3/fore) "xwa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -90220,14 +91487,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"xxV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "xyb" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -90250,6 +91509,19 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/medical/virology) +"xyi" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) +"xyw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint) "xyz" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/pod/light, @@ -90499,11 +91771,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/space/nearstation) -"xBU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "xCg" = ( /obj/structure/curtain, /turf/open/floor/iron/showroomfloor, @@ -90655,6 +91922,15 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) +"xDM" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/crowbar, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/second) "xDQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -90938,14 +92214,6 @@ /obj/machinery/suit_storage_unit/engine, /turf/open/floor/iron/dark/textured_corner, /area/station/engineering/lobby) -"xGh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/north, -/obj/machinery/duct, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/port) "xGl" = ( /turf/open/floor/plating/foam, /area/station/maintenance/floor1/port/aft) @@ -91078,6 +92346,15 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) +"xIx" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/carpet/blue, +/area/station/cargo/miningdock) "xID" = ( /obj/structure/closet/crate/freezer/blood, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -91115,6 +92392,20 @@ }, /turf/open/floor/plating, /area/station/security/brig) +"xIR" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/starboard) "xJk" = ( /obj/machinery/seed_extractor, /obj/effect/turf_decal/tile/green/full, @@ -91245,10 +92536,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) -"xKG" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/port) "xKZ" = ( /obj/machinery/light_switch/directional/north, /obj/machinery/shower/directional/west, @@ -91301,6 +92588,21 @@ dir = 1 }, /area/station/service/chapel) +"xLy" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/assembly/flash, +/obj/item/restraints/handcuffs, +/obj/machinery/camera/directional/east{ + name = "Checkpoint - Engineering Deck" + }, +/obj/machinery/recharger, +/obj/machinery/light/small/directional/east, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "xLG" = ( /obj/machinery/door/airlock/hatch{ name = "Elevator Shaft Access" @@ -91423,6 +92725,10 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/medical/virology) +"xNC" = ( +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor3/fore) "xND" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -91488,6 +92794,12 @@ /obj/machinery/light/cold/no_nightlight/directional/north, /turf/open/floor/engine, /area/station/science/explab) +"xOr" = ( +/obj/structure/closet/secure_closet/security, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "xOs" = ( /obj/structure/railing{ dir = 8 @@ -91508,6 +92820,20 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark, /area/station/security/prison) +"xOI" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/machinery/door/poddoor/shutters{ + id = "secmechbay"; + name = "Security Mech Bay Shutters" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/box, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/mechbay) "xOY" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -91596,6 +92922,12 @@ /obj/effect/decal/cleanable/oil/streak, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) +"xPZ" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 4 + }, +/turf/open/openspace, +/area/station/maintenance/floor3/port) "xQg" = ( /obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/turf_decal/bot, @@ -91872,6 +93204,12 @@ }, /turf/open/space/openspace, /area/space) +"xUB" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor3/fore) "xUI" = ( /obj/structure/cable, /obj/structure/chair/sofa/bench/left, @@ -91900,6 +93238,12 @@ }, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/miningdock) +"xUT" = ( +/obj/machinery/computer/security, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "xUU" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -92187,18 +93531,6 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/hallway) -"xYz" = ( -/obj/machinery/door/poddoor/shutters/window{ - dir = 8; - id = "armory"; - name = "Armoury Shutters" - }, -/obj/machinery/door/poddoor/preopen{ - id = "armblast"; - name = "Armory Blast Door" - }, -/turf/open/floor/iron/dark, -/area/station/security/office) "xYB" = ( /obj/effect/spawner/random/engineering/tank, /turf/open/floor/pod/light, @@ -92245,10 +93577,6 @@ /obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/hallway/floor1/aft) -"xYO" = ( -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "xYQ" = ( /obj/structure/railing/corner{ dir = 1 @@ -92277,16 +93605,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"xZc" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Second Deck Outpost" - }, -/obj/effect/mapping_helpers/airlock/access/any/security/brig, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/second) "xZg" = ( /obj/effect/turf_decal/tile/green/half{ dir = 4 @@ -92489,18 +93807,6 @@ }, /turf/open/floor/iron/checker, /area/station/service/bar/atrium) -"ybZ" = ( -/obj/structure/sign/poster/official/random/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/office) "ycg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /turf/open/floor/circuit/telecomms, @@ -92556,6 +93862,25 @@ "ydm" = ( /turf/open/floor/plating, /area/station/construction/mining/aux_base) +"ydn" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/turf_decal/siding/white, +/obj/structure/cable, +/obj/structure/table/reinforced/rglass, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/storage/pill_bottle/mannitol, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/wrench/medical, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) "ydt" = ( /turf/closed/wall/r_wall, /area/station/cargo/miningoffice) @@ -92703,13 +94028,6 @@ dir = 10 }, /area/station/security/prison/garden) -"yfs" = ( -/obj/structure/sign/directions/dorms/directional/north{ - dir = 2 - }, -/obj/structure/railing/corner, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor4/aft) "yft" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -92790,6 +94108,12 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron, /area/station/engineering/atmos) +"ygw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "ygH" = ( /obj/machinery/door/firedoor/heavy, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -93009,6 +94333,15 @@ dir = 4 }, /area/station/hallway/floor3/aft) +"ykw" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Public Airlock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "ykC" = ( /obj/structure/closet/crate/internals, /obj/effect/turf_decal/trimline/dark_blue/end{ @@ -93096,6 +94429,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) +"ylD" = ( +/obj/effect/spawner/structure/window/hollow/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor3/port/aft) "ylE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -93131,12 +94470,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/white/herringbone, /area/station/medical/patients_rooms) -"ymj" = ( -/obj/structure/railing/corner, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) (1,1,1) = {" owI @@ -110490,7 +111823,7 @@ nVw vZC tKe voj -hJy +sPJ xtY oWA xtY @@ -110746,8 +112079,8 @@ lnG grg grg qaj -nQU -hJy +gVw +sPJ xtY xtY iDP @@ -111006,7 +112339,7 @@ aEj ejE hJy hJy -hJy +sPJ hJy hJy hJy @@ -111262,7 +112595,7 @@ aYd nBn rUH rUH -nTF +uGS rNO tSK hJy @@ -111761,7 +113094,7 @@ ala ala ala gCH -uit +dtU pRl pJO fnT @@ -112520,7 +113853,7 @@ kKd vga oic tVq -riO +osq oic twL uzN @@ -113842,10 +115175,10 @@ qez mIh hJy iGt -hJy +sPJ cgi hJy -hJy +sPJ hJy cgi hJy @@ -114829,14 +116162,14 @@ owI oic oic nUj -uaJ +uNF vnp -sBT -sBT -sBT -sBT -sBT -sBT +jdc +jdc +jdc +jdc +jdc +jdc sBT oic gdt @@ -115088,7 +116421,7 @@ oic mlC laR oic -sBT +jdc oic oic oic @@ -115342,10 +116675,10 @@ owI owI oic oic -oic -oic -oic -sBT +eUT +osC +stZ +fpW oic ekj ekj @@ -115362,7 +116695,7 @@ ncc pbF iir pxk -aLo +iir fbO vyZ rhx @@ -115599,11 +116932,11 @@ owI owI tXe tXe +bCR tXe tXe -tXe -jGQ -mMV +rxS +nXs oic oic oic @@ -115860,7 +117193,7 @@ dPx pUY tXe tXe -tXe +nfI tXe gUS nOj @@ -116117,7 +117450,7 @@ iCP nnu hnb jdQ -jyn +qxN tXe eps yiZ @@ -116371,10 +117704,10 @@ owI tXe tXe cOT -olH -jqm -acR -etY +sxb +luo +hTP +lNW qZU dQo qWJ @@ -118460,7 +119793,7 @@ qGk srC cez clb -lmG +maS jbu usB rtV @@ -119227,7 +120560,7 @@ gqU imJ jFZ brj -qGk +oXp xVX tML wQe @@ -119756,7 +121089,7 @@ vdb cMi vIb xgH -xgH +apX rLU xgH xcA @@ -120256,8 +121589,8 @@ tqE tfo brj hVZ -bAQ -jMc +rxq +srl owS tCq bKp @@ -120509,16 +121842,15 @@ xHA xHA uKC gqU -kRg -xgH -xgH -xgH -xgH -xgH -xgH -xgH -xgH -xgH +pBQ +wdL +wdL +wdL +wdL +wdL +wdL +wdL +wdL xgH xgH xgH @@ -120528,6 +121860,7 @@ xgH xgH xgH xgH +apX uFQ xgH fmb @@ -120766,19 +122099,19 @@ pye xHA bzw gqU -gjy -xgH -pfN -tTU -oDL -pLe -xgH -aba -uya -uya -uya -uya -xbj +imJ +cQm +nCi +svW +luJ +faA +pBg +lem +wdL +nik +nik +nik +fBJ xgH hnz dyS @@ -121023,15 +122356,15 @@ pdU xHA jZA gqU -lXX -xgH -fce -tTU -hjs -lJk -xgH -fvE -xfT +kro +qvl +kbp +tpD +nMu +qot +pwY +bnN +wdL xfT xfT xfT @@ -121280,15 +122613,15 @@ jNb xHA tOo gqU -mun -uZV -dyS -oMV -dyS -dyS -dyS -nWf -ema +imJ +bwS +uOx +rPG +jxf +qIH +pwY +xjS +wdL ema ema ema @@ -121538,14 +122871,14 @@ xHA rpj gqU imJ -xgH -eKk -xgH -dyS -xgH -xgH -xgH -xgH +wdL +wdL +mTK +mJr +ygw +cGn +wBG +wdL dyS wDr hjs @@ -121795,14 +123128,14 @@ xHA rpj gqU uOT -xgH -ymj -xee -xbj -xgH -rTt -trD -xgH +wdL +jam +uyH +bSU +xLy +epz +vcy +wdL dyS xgH xgH @@ -122052,14 +123385,14 @@ xHA lKz vkr irK -xgH -xgH -pGT -xSl -xgH -dxS -dxS -xgH +wdL +wdL +wdL +tbb +wdL +wdL +wdL +wdL dyS dyS dyS @@ -122303,7 +123636,7 @@ ybL xHA gCv hiD -cNZ +qtW xHA vOK vOK @@ -122311,15 +123644,15 @@ dtY pRG vOK xgH -nqV -xxV -dyS -dyS -dyS -dyS -dyS -eKk -dyS +mNr +qsW +jwD +jwD +jwD +jwD +jwD +uyg +ljx dxS xgH xgH @@ -122567,16 +123900,16 @@ oOK dJV gpZ kyR +kyR +kyR +kyR +kyR +kyR +kyR +xgH xgH -kzE -kzE -kzE -kzE -kzE -kzE -kzE onC -dyS +vIn nEb dyS dyS @@ -122814,26 +124147,26 @@ llR pEv iKb dpH -adk -weT -iQK +sHN +fhX +nIO kyR vOK mgl grg jnp vLP -oyf -cQm -nCi -svW -luJ -faA -pBg -lem -kzE +oNK +iQC +rpj +mXx +mXx +mXx +kyR +rTt xgH -dyS +xgH +vIn xgH xgH xgH @@ -123071,26 +124404,26 @@ qly pEv hWF dpH -rIL -nGK -oid -cSN +nRF +mnQ +nIO +obV pyL qIz jYY ptd -jnS -iiT -qvl -kbp -tpD -nMu -qot -pwY -bnN -kzE -ilD -dyS +cbT +qgU +okN +qgU +mXx +nRe +mXx +kyR +eVk +twx +twx +vIn xgH vfY qRz @@ -123321,15 +124654,15 @@ dpH dpH dpH dpH -heS +xIx eAY ehG sYa pGW dts dpH -vni -mnQ +ihQ +fhX rMq kyR bSE @@ -123337,17 +124670,17 @@ hVG bBx jnp vLP -lsZ -bwS -uOx -rPG -efp -csg -hYT -xjS -kzE +tmH +iQC +rpj +mXx +iZD +mXx +kyR tCB -dyS +twx +twx +vIn xgH bvi eVk @@ -123595,16 +124928,16 @@ iHw dJV nwi kyR -wdL -wdL -mTK -rDC -wGI -ufV -tHM -kzE -qjN -dyS +kyR +trF +kyR +kyR +kyR +kyR +eVk +twx +twx +vIn uls twx eky @@ -123613,7 +124946,7 @@ xgH wVn xgH ttF -qCn +qmN lJN cmG sWt @@ -123852,16 +125185,16 @@ vOK dtY pRG vOK -wdL -wDs -nwV -ckt -uTe -wZt -lJb -kzE +byc +sFJ +mdi +sFJ +cHb +kyR +kOx xgH -dyS +xgH +vIn xgH pxb cuf @@ -124110,15 +125443,15 @@ lLy jau rjD kzE -uKp -kzE -kzE -kzE -kzE -kzE +pZV kzE +xgH +xgH +xgH +xgH +xgH qOp -dyS +vIn xgH xgH xgH @@ -124349,7 +125682,7 @@ rJy aWr vkW ehG -hfy +vaz xEK ehG mMn @@ -124375,16 +125708,16 @@ wVn wVn wVn wVn -wVn -wVn -wVn -wVn -wVn -wVn -wVn -trD -eVk -wVn +wgr +aHW +aHW +aHW +aHW +aHW +aHW +vuW +fkW +lYE xgH uXf ofy @@ -124641,10 +125974,10 @@ kzE kzE kzE lUo -wVn +nRL xgH qGp -qCn +qmN lVR eQm cmG @@ -124898,7 +126231,7 @@ kOR kOR kzE dQi -wVn +nRL xgH xgH xgH @@ -125155,7 +126488,7 @@ cUb xyD kzE tCB -wVn +nRL xsX hIQ hIQ @@ -125387,7 +126720,7 @@ njk viG cGM wgu -thH +tPy jXW jwr sAK @@ -125412,11 +126745,11 @@ hLX lkE kzE lJk -eVN -mEa -xfT -rYa -xfT +rHr +pdK +haM +gsh +wsb njQ xgH xgH @@ -125673,7 +127006,7 @@ eOY mEa xfT xrB -xfT +jEa njQ xgH xgH @@ -126148,7 +127481,7 @@ gAT gAT csT ehG -qBh +eSP cui ehG bBV @@ -126163,8 +127496,8 @@ mUw rjD dMO cqY -kSN -xgH +lxr +cuc wVn aDM kGq @@ -126931,7 +128264,7 @@ erU erU erU erU -iuM +dGE jrV cKC mhr @@ -128967,7 +130300,7 @@ whV fBX kjb foI -cvW +pyE uSN eFY wJB @@ -135411,7 +136744,7 @@ bJU pYs uyu kbu -yhr +ozM eeQ mdR gpf @@ -140033,7 +141366,7 @@ qEw qEw qEw sAH -xgW +rKV kfo iZP kcB @@ -141078,7 +142411,7 @@ tyQ tyQ lhh dEc -uov +fAy vcr kdQ khc @@ -141812,7 +143145,7 @@ owI owI css lwc -vEN +liu vEN tGq vmr @@ -141852,7 +143185,7 @@ aHt klO klO uov -uov +kmV qdB uov uov @@ -142374,7 +143707,7 @@ vcr uov qwj lEI -pBy +aVc dEc dFq fbl @@ -142628,7 +143961,7 @@ odS hAO mGN vcr -uov +fAy uov uov wQC @@ -176786,7 +178119,7 @@ kEI wwu sbI jtJ -qfv +qdF hat qfv lXq @@ -179112,7 +180445,7 @@ aQt etV shi tqW -shi +iWi wRN dHa gtO @@ -179347,7 +180680,7 @@ wwu wwu cNf cBb -wwu +iCg wpa roe roe @@ -179629,10 +180962,10 @@ lPz shi wic fRd -gFy +mPH hLz uXA -hLz +leR jly hLz hLz @@ -179883,11 +181216,11 @@ rrm rrm rrm kIR -hLf -ffS -fUf -cFB -hLz +atU +foa +iOQ +gET +ngL uXA hLz jVu @@ -180143,7 +181476,7 @@ qKp shi sKG fVe -gWj +npT hLz uXA hLz @@ -180641,7 +181974,7 @@ hgn xuv qVV qaW -mil +dQX vds stp vlm @@ -180654,7 +181987,7 @@ bjf qia shi dsb -shi +iWi ugv jxP gXo @@ -180899,7 +182232,7 @@ xuv xWe bPO aHs -bFl +mil afb vlm tMK @@ -181135,9 +182468,9 @@ ucA ucA wwu wwu -txA -txA -txA +pvX +bDr +bDr ctI xuv agJ @@ -181150,7 +182483,7 @@ sSz wuM xuv jBm -lPY +cNm hnS oHw ijS @@ -181392,9 +182725,9 @@ ucA ucA wwu wwu -txA +fUv wwu -heq +bFq ctI xuv tfk @@ -181433,8 +182766,8 @@ hLz uXA nnK hLz -hLz -hLz +lDX +lDX hLz irV jly @@ -181649,9 +182982,9 @@ ucA ucA wwu wwu -txA -dfD -uea +wXc +hrW +gLD ctI xuv aGj @@ -183240,7 +184573,7 @@ uXA jJu jJu jJu -jJu +xgd hvc xgd hLz @@ -183495,7 +184828,7 @@ uXA txQ uXA uXA -hLz +aBo uKl uXA avM @@ -183752,7 +185085,7 @@ uXA irV rwN uXA -hLz +aBo uXA mta lQI @@ -184478,7 +185811,7 @@ gqP gqP sxK uVj -wwu +iCg cwq cwq wwu @@ -184515,7 +185848,7 @@ hbz xSb hSH ilV -iTn +qBk jjF mOK hLz @@ -185041,7 +186374,7 @@ btq xXv vsU kvE -hLz +kYV fRm hLz hLz @@ -185512,7 +186845,7 @@ nOZ wwu cja cwq -ihW +isz pUr nVB sYD @@ -185798,7 +187131,7 @@ jKB uJn ppX uXA -hLz +sWp uXA uXA uXA @@ -185812,7 +187145,7 @@ xYC ucB cOM bKq -hLz +kYV lzf hLz hLz @@ -186310,7 +187643,7 @@ mJg mJg ket hLz -vXT +ePs vXT vXT vXT @@ -186567,7 +187900,7 @@ gqi pVK hkw hLz -lQI +djs lQI lQI lQI @@ -187332,9 +188665,9 @@ rtv miF jvv aUl -iKU -hkk -vmZ +wkX +iqL +eYm dTn tyi tyi @@ -187590,7 +188923,7 @@ iRg aYA fNT fNT -dGP +wkX qGm ion mdU @@ -187867,7 +189200,7 @@ uCV gNm lcv aal -aal +xhf kpX aal aal @@ -188099,7 +189432,7 @@ dpL dpL dpL fNT -skU +alL tjP jVt fNT @@ -188350,9 +189683,9 @@ mGd shk wbS dpL -qtL -feX -gPH +tIe +psn +aLO fNT lZS idn @@ -188360,11 +189693,11 @@ shi miF nWz nIh -lva +nYt rtv -wWa -wWa -wWa +feX +feX +feX qGm cmG cmG @@ -188607,21 +189940,21 @@ oOR kvB eao ktM -sWU -tAb -glA -knA +pEu +flx +pEu +axK lPj uPQ mge loK umC -bBT -jqx -bBT -wWa -gxL -eQA +nIN +gYX +nIN +feX +feX +feX qGm mZS vKz @@ -188864,9 +190197,9 @@ ueO puG eep dpL -och -aqw -bPm +jyL +psn +nzO fNT fqo iNz @@ -188874,11 +190207,11 @@ shi siq nWz xXU -lva +nYt rtv -wWa -kwY -wWa +feX +feX +feX qGm xxw iff @@ -188895,7 +190228,7 @@ hRd biZ lcv aal -aal +xhf lTN aal aal @@ -189127,7 +190460,7 @@ qun qun qun fNT -veG +lIC uKW gEa fNT @@ -189360,7 +190693,7 @@ ucA vnK vnK sUj -sGh +pXg ivo txu uHZ @@ -190950,9 +192283,9 @@ nfv mHh obX lcv -jqJ +hAg kFd -jqJ +hAg jHr aal aal @@ -191203,13 +192536,13 @@ sKw mxN mxN isG -lSQ -kyO -kyO -lcv +nRQ +tZO +tZO +knW hAg lrA -jqJ +ptl biS aal aal @@ -191460,13 +192793,13 @@ kZl sEA oVa mjA -mjA +pWA lcr tIu lcv -jqJ -jqJ hAg +lUd +szC jHr aal aal @@ -191682,7 +193015,7 @@ dYq rkM rkM rkM -baN +jgU rkM rkM rkM @@ -191717,7 +193050,7 @@ wNu ldr byW yls -yls +kdE lbu sgF lcv @@ -191949,9 +193282,9 @@ wtw tUq hFL maW -iJP -ikY -iJP +mwz +nQl +vLv ibw ehh xYM @@ -191974,7 +193307,7 @@ mjA mjA kBk rJv -wZZ +kvO qno mxN lcv @@ -192454,7 +193787,7 @@ hvf kRS kRS kRS -mQz +cpg sjf aIY vvs @@ -195532,7 +196865,7 @@ fdr vnK oHr iBv -vnK +oyt jUJ iDh vnK @@ -195789,7 +197122,7 @@ wJI okI oHr uyL -vnK +oyt uhu iDh vnK @@ -196856,7 +198189,7 @@ aHK wdd bwE wat -mVm +ydn tfX iux cuL @@ -198899,11 +200232,11 @@ xmQ gfD tLq wYp -cJI -ldI -cqh -jfS -ybG +iFy +xhx +ffz +aAM +lhU lcv lcv lcv @@ -199156,18 +200489,18 @@ xmQ rBm ttb acq -wGg +pFW jZS sFQ aal -ybG -ybG -ybG -ybG -ybG -ybG -ybG -ybG +nQR +iEW +iEW +iEW +iEW +iEW +iEW +lhU nnf gmp lDY @@ -199413,7 +200746,7 @@ ttb ttb ttb ttb -gFQ +ctY muB ttb aal @@ -199424,16 +200757,16 @@ aal aal aal qtm -ybG -ybG -ybG -ybG -ybG -ybG -ybG -pnc -lfy -lfy +nQR +iEW +iEW +iEW +iEW +iEW +iEW +uvG +kcI +bCr aal aal ucA @@ -199669,8 +201002,8 @@ aIJ ibW aEW wau -soy -hnB +lrp +gbh hoj oFT tsy @@ -199926,10 +201259,10 @@ hWx hWx vGt ldI +gCD kzK -kzK -kzK -kzK +jZS +jZS kzK gyy pMe @@ -200183,11 +201516,11 @@ xmQ xmQ aEW dqX -qvB -exX -vuV -tJu -kzK +bVg +qoq +slQ +qVh +xYM gyy gIo wcT @@ -200440,19 +201773,19 @@ xmQ xmQ aEW ldI -kzK -kzK -jut -pRW -kzK +gCD +gyy +ohz +cVJ +xYM gyy pMe -kFR -ghF -gbV -kFR -xbk -liX +bcH +aqQ +oVg +bcH +gqs +feH iVN bUh uXl @@ -200697,19 +202030,19 @@ iMU iMU nvv lGw +vcY vNM -vNM -vNM -vNM +sda +sda vNM wdC bbK -htZ -htZ -bbW -jfl -jhB -jhB +jQu +jQu +ezy +qpp +iLM +iLM buu jtC raz @@ -200942,7 +202275,7 @@ amt pBW pBW kca -mza +rCc oZz nQO cfa @@ -200954,19 +202287,19 @@ bFH jhw kzK hoB -aVJ +dXA pqg jZS ftT jZS ifG iAb -uUY -uXB -jEA -kBh -eGN -mXh +nhX +hgD +vFw +prS +wcT +pbm iVN kHJ eYL @@ -201199,7 +202532,7 @@ aPc sPu ucm kca -lQn +xUT shd hjH yfU @@ -201211,7 +202544,7 @@ kzK gCD kzK xcW -aLX +ivz igE aYy aYy @@ -201221,8 +202554,8 @@ iAb iVN iVN iAb -xfQ -buc +aTJ +pix iAb iAb iAb @@ -201456,19 +202789,19 @@ nmF pXG jmu kca -qFU +xOr fsD -gnm -xZc -iLd -ldI -mTN -ldI -ldI -hoB -ldI -hoB -wFr +fOl +cHy +uqd +xhx +bxE +xhx +xhx +daT +xhx +daT +pIm igE hlP nIQ @@ -201713,9 +203046,9 @@ dEt uZF pZW pZW -bRL -kif -puj +qpa +xDM +ddA pZW wCG oZB @@ -201728,7 +203061,7 @@ hoB pGS aWH hAR -vDk +pFT ewz bfl bhZ @@ -201968,11 +203301,11 @@ pJs rif dGe uZF -sHs -uiH -lnK -wmb -hGv +aQM +xyi +iva +ifV +lkA pZW nyE nyE @@ -201984,7 +203317,7 @@ bFH ckk ifG igE -pfX +hcr jbR cqR bfA @@ -202225,8 +203558,8 @@ edO awA jBf uZF -tjC -pPL +afD +rEa itc sBb ybB @@ -202482,8 +203815,8 @@ kJU dEt dEt uZF -hYz -lyR +pZW +pZW uZF uZF uZF @@ -202495,7 +203828,7 @@ wzS nyE aOp oqv -tjS +cMz igE aWR aZn @@ -202739,8 +204072,8 @@ fkD dEt lYb uZF -uZF -uZF +xiW +xiW uZF svu svu @@ -203287,7 +204620,7 @@ rzA gFz tez jBu -lcv +ioG ybG aal aal @@ -204014,7 +205347,7 @@ oyh dEt dEt tQM -gUf +kJU aeb dEt gFS @@ -204054,11 +205387,11 @@ xQq qbw qbw kQI -nlN +slk qza meU diW -nlN +slk ybG aal aal @@ -204272,7 +205605,7 @@ dEt dEt xOC hjP -jRW +gha nBO fIM fXq @@ -206607,12 +207940,12 @@ uiF tPm nlN hjx +bnt nlN nlN nlN nlN -nlN -nlN +bnt nlN nlN qEe @@ -206862,7 +208195,7 @@ maq aGE qtj nlN -nlN +loS xui xui xui @@ -207119,7 +208452,7 @@ nlN iIm nlN nlN -nlN +loS xap nRv pJH @@ -207367,18 +208700,18 @@ sBp oAz etA mPw -dEt +ure oFu xNE sGZ -dEt +ure xui xui hgS nlN +bnt nlN -nlN -nlN +bnt nlN nlN dUT @@ -207876,7 +209209,7 @@ dEt dEt dEt dEt -dEt +tFm dEt dEt qeb @@ -241803,14 +243136,14 @@ saG eAE fnM ixf -huZ -wRJ -nVq +gby +hzq +pNA nVq nVq cyX wRJ -sJO +eOC mUs oJo oJo @@ -242060,7 +243393,7 @@ saG nNM gAt eAE -vrX +sGw wRJ wRJ wRJ @@ -242317,7 +243650,7 @@ wRJ eCP wrh wPF -xkX +cil ooF wRJ rxg @@ -242571,10 +243904,10 @@ ucA ucA wRJ wRJ -qPI -aEA -aEA -aEA +gDL +acK +acK +hEm jNQ wRJ oVY @@ -242598,7 +243931,7 @@ gwL fqE oQS lYL -jFE +ghX rSY uhK uhK @@ -242828,7 +244161,7 @@ ucA ucA wRJ wRJ -qOf +pBv wRJ wRJ wRJ @@ -243085,10 +244418,10 @@ ucA ucA wRJ wRJ -iwu -iwu -sDK -bUH +joA +kSR +fWY +fOR fry gfr eJs @@ -243345,7 +244678,7 @@ wRJ iwu ccH ccH -lVP +gEe uIN ltq ltq @@ -243602,7 +244935,7 @@ wRJ iwu ccH jRV -reN +bQn otZ rAE aCx @@ -243859,7 +245192,7 @@ wRJ iwu ccH muX -bnS +gGX kAb lmu aHP @@ -244116,7 +245449,7 @@ wRJ iwu ccH qdz -aNA +lKE iia jat aCx @@ -244373,8 +245706,8 @@ wRJ iwu ccH ccH -iOE -jXH +rLl +lzd uIN ltq eDe @@ -244630,8 +245963,8 @@ kpT iwu uFR ccH -dMw -usO +suT +lij uIN vUv rHg @@ -244887,9 +246220,9 @@ kpT igy btC ccH -gWO -hJP -kWf +dFn +bLq +lwo sJO fjo wdb @@ -245144,8 +246477,8 @@ igy igy niE ccH -nDZ -uzl +hNO +uAg kWf bGn rec @@ -250059,7 +251392,7 @@ xvN fWl bQG vZF -tGn +aXW dKb rxi ajs @@ -251299,7 +252632,7 @@ uhr abx uHV ktG -ovc +udw igy wRJ wRJ @@ -253635,7 +254968,7 @@ liQ liQ liQ eDe -bks +pqB bdR cKS eDe @@ -253646,7 +254979,7 @@ eDe eDe eDe uZc -uZc +nwf uZc uZc uZc @@ -253886,9 +255219,9 @@ sSB sSB sSB qrd -xvX -kwe -pfc +sOO +ibF +oBP eDe ybQ gzc @@ -253901,7 +255234,7 @@ fjo oZx oZx oZx -eDe +mNW ufs ufs xGx @@ -254143,18 +255476,18 @@ ejP gMQ sSB iom -lDh -pbv -dZw -uHg +tcs +xmi +tcs +nRK sMg cXK kZH uNx hkV -hko +jqq viX -hko +jqq oZx oZx oZx @@ -254400,9 +255733,9 @@ iKT sSB dIv qrd -bvB -oZx -ryK +oqk +jpq +xNC eDe rYq nKn @@ -254415,7 +255748,7 @@ fjo oZx oZx oZx -eDe +mNW xGx diU ufs @@ -254663,7 +255996,7 @@ qrd qrd qrd eDe -drk +xUB bdR mZI eDe @@ -254900,11 +256233,11 @@ otR nqi pep yhT -sdg -tlb -nDm +aRd +qnA +kbZ iHm -ejP +hDU iHm iHm iHm @@ -254942,7 +256275,7 @@ kil qfT oZp ykr -tGn +aXW tDf aGQ aGQ @@ -255157,9 +256490,9 @@ bTy nqi pep yhT -piJ -tlb -piJ +aJD +qnA +aJD iHm sSB sSB @@ -255414,9 +256747,9 @@ hrL nqi hjN yhT -piJ -tlb -chT +aJD +qnA +urv iHm sSB ccV @@ -255671,9 +257004,9 @@ umb nqi fXR yhT -oJH -bhy -frv +vTV +rjB +sav iHm sSB ccV @@ -256486,7 +257819,7 @@ dgZ kQN jPG ewA -aGQ +xPZ aGQ aGQ cnq @@ -256742,8 +258075,8 @@ xWn gZm tGn hnZ -ewA -aGQ +che +qBJ nVP fIz kcl @@ -256999,9 +258332,9 @@ mYK uZc tGn nbi -ewA -aGQ -aGQ +ftl +tpw +qPG aGQ cnq tGn @@ -257256,8 +258589,8 @@ uwG kVM tGn mwg -vKw -wNH +iCK +afv oxJ wNH geL @@ -257514,7 +258847,7 @@ dqF tGn tGn ueX -ueX +dfs tGn tGn jPG @@ -257771,7 +259104,7 @@ hTK tGn fRy nUU -uLi +oee iFv tGn qPl @@ -258028,7 +259361,7 @@ uZc tGn jPG jPG -jPG +aKr jPG jPG jPG @@ -258285,7 +259618,7 @@ yfN tGn tbq tGn -xKG +bPq tGn eJU tGn @@ -258542,8 +259875,8 @@ tkJ tGn jPG jPG -jPG -jPG +fnF +atA ajs vRm mUA @@ -258800,7 +260133,7 @@ tGn tGn tGn tGn -raY +geh tGn tGn tGn @@ -259057,7 +260390,7 @@ tGn aoM tGn sxZ -nDk +kAw gaU tGn tGn @@ -259314,7 +260647,7 @@ tGn aoM tGn tLF -nDk +kAw ogM tGn tGn @@ -259525,7 +260858,7 @@ qrd qrd oEh hVI -qrd +qtw sSB dcw qrd @@ -259571,7 +260904,7 @@ tGn aoM tGn tGn -nDk +kAw bKY tGn tGn @@ -259828,7 +261161,7 @@ tGn aoM aoM tGn -knS +tdN piR piR piR @@ -260085,7 +261418,7 @@ tGn tGn tGn tGn -pOn +roj llr hiQ hiQ @@ -260334,15 +261667,15 @@ ilk eLw piR npZ -pOn -pOn -qSg -pOn -pOn -pOn -pOn -pOn -pOn +lDA +uqi +rhI +uqi +uqi +uqi +uqi +uqi +vQi ddj piR piR @@ -260591,7 +261924,7 @@ vRn fYH piR jlC -qSg +gpW piR rbz piR @@ -260848,7 +262181,7 @@ kSU yjm piR piR -pOn +roj piR piR piR @@ -261105,7 +262438,7 @@ piR piR piR npZ -pOn +roj piR alf cMU @@ -261362,8 +262695,8 @@ jRM ebn piR tnX -qSg -piR +gpW +lKF msu iUQ wSP @@ -261618,8 +262951,8 @@ piR xyz tKq vjK -pOn -pOn +lDA +vQi piR uAi mVj @@ -261875,7 +263208,7 @@ piR jAU tUc vER -pOn +roj ojx piR iwZ @@ -262116,7 +263449,7 @@ ryx qwc tqi kDB -cdF +kpi ftv kbR iCQ @@ -262132,7 +263465,7 @@ piR piR tUc vZK -pOn +roj tUc piR uAi @@ -262389,7 +263722,7 @@ piR trH uIp cJi -pOn +roj ozS piR hrc @@ -262646,7 +263979,7 @@ piR piR piR piR -iga +bmN piR piR wUy @@ -262903,7 +264236,7 @@ syH wMX vrw piR -qSg +gpW myO tto anH @@ -263160,7 +264493,7 @@ nHW nlf rKM piR -taR +vZJ myO vMm yaK @@ -263417,7 +264750,7 @@ gwb cFM mwK piR -pOn +roj uDH qRE qQr @@ -263674,7 +265007,7 @@ pCr fwb qFz piR -gHN +dgA myO udF vSW @@ -263931,7 +265264,7 @@ joL tmq tfD piR -pOn +roj piR piR myO @@ -264188,14 +265521,14 @@ wkH uRQ bCk piR -pOn -pOn -pOn -pOn -pOn -hBp -pOn -lXM +rof +uqi +uqi +uqi +uqi +cMb +uqi +ruU vXv sOq uuH @@ -264452,7 +265785,7 @@ piR biO piR rtc -pOn +roj wCH hcT kwm @@ -264709,7 +266042,7 @@ piR aMJ piR qPU -pOn +roj piR piR piR @@ -264966,10 +266299,10 @@ jNg hyx kdK wza -pOn -mom -hcT -hcT +rof +suu +tPL +ejN piR piR ucA @@ -265226,7 +266559,7 @@ fHE piR mom hcT -hdl +uBi piR piR ucA @@ -267771,7 +269104,7 @@ faS fXB quO cgm -ehZ +uhj frW frW chn @@ -268305,7 +269638,7 @@ aMJ piR pOn gSS -piR +lKF gRI gcf hXI @@ -269038,7 +270371,7 @@ snd snd snd snd -snd +nLM snd cIM eNi @@ -269843,7 +271176,7 @@ hcT piR piR piR -piR +ylD piR kEe mPZ @@ -270589,7 +271922,7 @@ kRw pZL cIM mSa -kRw +pNs jOX hcR aKx @@ -307340,8 +308673,8 @@ xJo uxw xHe qhQ -dgJ -qox +iQy +ibo qox qox aNs @@ -307595,9 +308928,9 @@ xHe xHe yjN uxw -aLb +ozA eGK -bJN +cAi gEB cmw cHz @@ -307854,7 +309187,7 @@ xHe xHe xHe rNL -bNb +kjd yiI uxw pkm @@ -308111,7 +309444,7 @@ ioM gja xjQ iqD -euv +vzM xJp uxw xjX @@ -308366,10 +309699,10 @@ xHe xHe lRc lVV -uww +tqu hdL -mUq -mwr +iKJ +bfx eGK onE aNs @@ -308626,7 +309959,7 @@ xHe xHe xHe xHe -tkb +nKs xHe xHe aNs @@ -308646,7 +309979,7 @@ uIx uIx voT voT -bzf +rCM voT voT voT @@ -308883,12 +310216,12 @@ dzY lJp lJp lJp -lJp -lJp -lJp -lJp -lJp -lJp +gsx +maK +maK +maK +maK +prD boS aNs rYS @@ -309145,7 +310478,7 @@ vLW vLW vLW cCV -lJp +uVU gGB aNs sRO @@ -309402,7 +310735,7 @@ qhC vDN vLW snU -lJp +uVU gho aNs pZp @@ -309659,7 +310992,7 @@ eWS kha vLW aNs -cxH +uAo aNs aNs jcS @@ -309916,7 +311249,7 @@ wnO bxc vLW mqi -rUa +hiU hJF rEU rlC @@ -309929,7 +311262,7 @@ vIS tuy qDD qyo -sEb +vZU brT brT nBV @@ -310173,7 +311506,7 @@ jZL kWx nZg iPY -iPY +qdS iPY wbr agK @@ -310188,7 +311521,7 @@ qTn dKJ voT voT -bzf +hFb voT voT voT @@ -310430,12 +311763,12 @@ wnO keg vLW geA -wQU -hJF -rEU -gxn -dfm -ogl +oqH +toM +eNw +ohu +prd +njU rEU gxn hbN @@ -310692,7 +312025,7 @@ gYS gYS bmD lgD -hPl +ykw hIb fKZ hbW @@ -310949,7 +312282,7 @@ kHl hJF gxn rlP -ogl +tBq czp czp wgO @@ -311206,7 +312539,7 @@ pmo wtt gxn dfm -dmQ +hsa czp tAE jjs @@ -311463,7 +312796,7 @@ bJV hWp mdE dfm -ogl +tBq czp sFa sFa @@ -311720,7 +313053,7 @@ dWL oKY cfu dfm -ogl +tBq wgO apT aGm @@ -311977,7 +313310,7 @@ cWf cWf cfu dfm -ogl +tBq wgO xYS eYh @@ -312234,7 +313567,7 @@ oKY cWf cfu rti -prf +vuU wgO rZb acL @@ -312491,7 +313824,7 @@ cWf vlD qND dfm -ogl +tBq wgO xYS ltC @@ -312748,7 +314081,7 @@ jCA jCA xEB dfm -ogl +tBq wgO xwx tIc @@ -313005,7 +314338,7 @@ kti jCA jib dfm -ogl +tBq czp rAe sFa @@ -313243,7 +314576,7 @@ sJm sJm sJm nPE -nsO +hwP nPE nPE nPE @@ -313262,7 +314595,7 @@ pUn dVk gxn dfm -ifq +sEE czp uIL nSS @@ -313519,7 +314852,7 @@ wMM nvs ixZ dfm -doQ +nmk uqc uqc uqc @@ -313754,13 +315087,13 @@ xpL qRI mKO rDL -fPd +heI jha nPE xVV gsy uwf -gBk +pUK moL hMp gDy @@ -313776,7 +315109,7 @@ lKn dVk gxn ePJ -gHt +pEO hUR aId aId @@ -314011,7 +315344,7 @@ wFa eIs wFa tYV -fPd +oUW xwL nPE nPE @@ -314033,7 +315366,7 @@ ngX jCA gxn dfm -rvZ +pAk lgX wFA cKq @@ -314268,7 +315601,7 @@ mSG aSX aSX pqH -obC +bJA mKu hHi fMc @@ -314290,7 +315623,7 @@ lKn bOE gxn dfm -wVl +veI uqc uqc uqc @@ -314525,7 +315858,7 @@ dWz lYx unQ wMU -fPd +oUW rDL jjj dIJ @@ -314547,7 +315880,7 @@ hQQ kVZ dmc ePJ -qRM +jdM fUq jzF nFH @@ -314778,12 +316111,12 @@ ucA vyc vPP rrs -bYl -kiw -exv -wMU -fLX -ixd +mCU +hGC +jJM +hAH +eSq +tHk bDn gwe eoI @@ -314804,7 +316137,7 @@ rmZ bOE gxn dfm -gRe +aqu kbI oAe uOh @@ -315035,11 +316368,11 @@ ucA lYx oRh lYx -cBP +wWY lYx ngD wMU -xgo +aqm kFy xTG xxA @@ -315061,7 +316394,7 @@ sdB jCA yeq dfm -gRe +aqu raq vIr iow @@ -315318,7 +316651,7 @@ gYS gYS rPF dfm -mSP +pSp tLk vIr kQp @@ -315575,7 +316908,7 @@ gBU tYW lui dfm -gRe +aqu raq vIr nJT @@ -315832,7 +317165,7 @@ pNW oCx oCx dfm -gRe +aqu hbg oAe iWT @@ -316089,7 +317422,7 @@ dJo wJT wJT pwI -mVq +tDO oAe oAe oAe @@ -316346,7 +317679,7 @@ hRP euu euu rti -kTm +lSd bDL dHD dHD @@ -316603,7 +317936,7 @@ eHr wGb mvw dfm -moj +nWS bDL ebK ebK @@ -316841,7 +318174,7 @@ xQg nPE jNM xZu -gDy +osS dvc eMg gDy @@ -316860,7 +318193,7 @@ gYS gYS gir tnj -bOZ +tEv cBl xFp dGF @@ -317117,12 +318450,12 @@ wwT aBV kyj dfm -pzw -aqO -eeq -eeq -mMj -okJ +xnY +ojB +xyw +xyw +tnR +hTD rRU cwX apg @@ -317354,7 +318687,7 @@ blj tvY nPE pDq -gAd +jNl iPs rfM lXj @@ -317379,7 +318712,7 @@ bDL jgG jgG bDL -kQS +xdC raN lXx rYf @@ -317636,7 +318969,7 @@ jgG bUW mvO bDL -qEA +eKe owh lXx lXx @@ -317893,7 +319226,7 @@ buI nVW efz val -okJ +cqz uVh auJ pGy @@ -318150,26 +319483,26 @@ jgG sTs ocR bDL -psi -mmK -mmK -mPO -vvZ -ivf -oCw -oCw -oCw -aAc -kvD -kzj -mbx -rVS -tlx -dqs -jun -dqs -pIP -hOs +jHS +ovZ +ovZ +ifF +cxc +rek +kOc +kOc +kOc +kQu +nRI +aHo +hLW +iXK +xOI +cAJ +sZN +cAJ +owr +iBn jbV fXs fXs @@ -318386,7 +319719,7 @@ moL moL moL moL -stk +lkc spI rLM nPE @@ -318411,7 +319744,7 @@ lvT meV lvT vWw -tUF +lDo eBy eQN dXX @@ -318426,7 +319759,7 @@ odH jsL myp eNj -jjh +sPR fXs fXs fXs @@ -318668,7 +320001,7 @@ kcv xKs rsh vWw -ybZ +pVj lAm fQA chF @@ -318683,7 +320016,7 @@ kcw hvb vRF eNj -mgx +jXB kHx fXs fXs @@ -318925,7 +320258,7 @@ hvB peg gta vWw -akP +tUW eBy sMB sMB @@ -318940,7 +320273,7 @@ eNj eNj eNj eNj -xGh +pAK vPu fXs fXs @@ -319153,7 +320486,7 @@ tAW gDy lIS uIr -gqC +vsO rAy hGB fTu @@ -319171,7 +320504,7 @@ liQ liQ liQ nWW -hid +wXg nQX bgI eOP @@ -319182,7 +320515,7 @@ eOP eOP eOP vWw -xfF +luv kIO rGZ kPr @@ -319197,7 +320530,7 @@ rVi vEa owb fXs -mgx +jXB bMP fXs fXs @@ -319417,14 +320750,14 @@ gts gDy cek hKS -stk +lkc moL moL hMp gDy -yfs -vRO -qbg +ifk +vMg +cPT nWW tEh bVy @@ -319439,7 +320772,7 @@ vRO vRO eOP vWw -nQN +ijT kIO tVa qDM @@ -319454,7 +320787,7 @@ dvJ vEa owb fXs -jjh +sPR fXs fXs fXs @@ -319678,25 +321011,25 @@ gDy bpF khX whI -mfW -qCq -nuw -bBw -gTM +xIR +mFJ +rPr +mFJ +ifw nMz jgd kpl tFp gQh -gGr +fsK weB -gQh +sTE vRO vRO vRO eOP vWw -rny +uKs kIO qXn sMp @@ -319711,7 +321044,7 @@ jye vEa owb fXs -rDE +bhh sOU ncB ncB @@ -319936,9 +321269,9 @@ bpF bpF bpF gDy +lkI +kgn erp -vMg -dzD nWW uIk pjU @@ -319953,7 +321286,7 @@ vRO vRO eOP vWw -rny +uKs kIO ghZ wiR @@ -319968,7 +321301,7 @@ duZ vEa fXs fXs -rDE +bhh sOU ncB ncB @@ -320199,7 +321532,7 @@ txa txa txa nWW -kQk +qNI nQX kQk eOP @@ -320210,7 +321543,7 @@ eOP eOP eOP vWw -ybZ +pVj woK pnJ pnJ @@ -320225,7 +321558,7 @@ pnw ycM sOU sOU -rDE +bhh sOU ncB ncB @@ -320438,7 +321771,7 @@ jid goe goe gDy -gAd +iGd gDy gDy gDy @@ -320467,7 +321800,7 @@ lFg qCs qCs vWw -rny +uKs wQY rsi axX @@ -320482,7 +321815,7 @@ sWo ycM sOU sOU -rDE +bhh jjG ncB ncB @@ -320724,12 +322057,12 @@ dPH dPH dPH vWw -urn +kjk gnW vWw vWw ljH -xYz +kvH cfD vWw vWw @@ -320739,7 +322072,7 @@ sWo ycM sOU sOU -wQK +mLS nXQ ncB ncB @@ -320981,7 +322314,7 @@ dPH tbX bTX wYW -rqa +gwE sHY dPH jlW @@ -320996,7 +322329,7 @@ wyv ycM sOU sOU -gCV +hch bzM ncB ncB @@ -321238,7 +322571,7 @@ aCB vBa bsV adT -krW +aQL sHY dPH rAP @@ -321253,7 +322586,7 @@ wyv ycM nXQ nXQ -ukr +dSm bzM ncB ncB @@ -321495,7 +322828,7 @@ uiv neR mZH jIV -vBa +fBT sHY rDZ cbw @@ -321510,7 +322843,7 @@ qjr ycM ncB ncB -qJj +vSB ncB ncB ncB @@ -321752,7 +323085,7 @@ wmr hHq ntR nyZ -vBa +fBT sHY xIP cbw @@ -321767,7 +323100,7 @@ sPs ycM dmR vRa -tkM +sYK pze ncB ncB @@ -322009,7 +323342,7 @@ dPH neR jwG gAi -qOJ +sRf sHY hAP qtQ @@ -322022,9 +323355,9 @@ xCR iXF sPs ycM -sOU -sOU -sOU +eqV +tmk +pIv gWN ncB ncB @@ -322266,7 +323599,7 @@ dPH xjc pyQ fCE -nzx +cLF sHY cAt cbw @@ -322523,7 +323856,7 @@ xEP sct mlN dPH -hFh +sdI soP glN lKQ @@ -322780,7 +324113,7 @@ skQ hED bNg dPH -nSg +emr oDd dPH vuf @@ -323037,7 +324370,7 @@ gEh qlo jXj dPH -jdv +aZq sHY dqQ dqQ @@ -323294,7 +324627,7 @@ oRY mgS xPw dPH -fRv +mcA sHY eoL hSJ @@ -323522,7 +324855,7 @@ csF csF psc dlW -kBF +pZK dlW dlW eEd @@ -323544,14 +324877,14 @@ bVy vOE aUR xEP -ooW +kGa wyY mra gLy vkZ cgZ dPH -nBT +qxY eUU dDR iTd @@ -323808,7 +325141,7 @@ ffe ffe xEP dPH -eRw +jGz rIa bsI oOi @@ -324058,14 +325391,14 @@ tnT fIs aUR ffe -mrc -rMl -rMl -tMB +ait +xeF +rWa +lWY ffe lPf jOA -ejn +mfU tNd qxZ uHT @@ -324315,14 +325648,14 @@ bVy vOE aUR wrj -oWR -fVw -fVw -xYO +mGt +igI +hvC +qfm ffe sfB oQn -jsH +vCP rGb qFI qFI @@ -324572,14 +325905,14 @@ tzV vOE aUR wrj -oWR -xBU -uoE -iCG -eQh -pOP -fhv -jsH +pVD +vBw +mOe +bRP +trM +tPI +fUZ +clU jak amm oYW @@ -324829,10 +326162,10 @@ xWF fIs wDy wrj -wpV -nfJ -qaN +fYJ +dHq wmo +mlg cxg vBa kxP @@ -325062,12 +326395,12 @@ kTV wlX sxo nps -dMt +nGD cOz mqd sxo -bUY -cpO +eFz +nIl dlW oGD oGD @@ -325086,10 +326419,10 @@ qxb vOE aUR wrj -gbL -ubU -aTK -iCG +vqv +sMD +acp +sSY wrj vTj fhv @@ -325324,7 +326657,7 @@ fvD fxI oBD eem -rHH +kzT dlW oGD qCr @@ -325343,10 +326676,10 @@ fNL vOE aUR wrj -hmv -fVw -sVV -glW +wzp +iCG +aoh +lfQ ffe emV uwA @@ -325600,10 +326933,10 @@ bVy vOE oct ffe -kHa -jVG -fOB -onk +eQi +qaJ +pNe +lax ffe nxU iYC @@ -325830,7 +327163,7 @@ ucA sxo sxo boq -kem +psF uOS vyW dje @@ -326348,7 +327681,7 @@ sSl lcN vyW jjo -cqm +pqt sxo xiA xiA diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 9f005e43e00b2..ba8942326bc94 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -2585,13 +2585,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/engineering/atmos) -"akS" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "ala" = ( /obj/machinery/button/door/directional/west{ id = "private_g"; @@ -4550,13 +4543,10 @@ /area/station/security/prison) "aFP" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 1 + dir = 4 }, /turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) +/area/station/hallway/secondary/exit) "aFU" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/door/airlock/maintenance_hatch{ @@ -4580,11 +4570,6 @@ /turf/open/floor/iron, /area/station/security/brig) "aFZ" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) -"aGa" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/hallway/secondary/exit) @@ -4630,23 +4615,13 @@ /turf/open/floor/iron/grimy, /area/station/service/lawoffice) "aGq" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 +/obj/machinery/vending/snack/blue, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 6 }, -/turf/open/floor/iron, +/turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) -"aGr" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Escape Wing" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "aGs" = ( /obj/structure/chair, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -4664,10 +4639,9 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "aGw" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/status_display/ai/directional/west, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/stripes/white/full, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "aGx" = ( @@ -6247,6 +6221,14 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"aZm" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "aZo" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 @@ -7278,16 +7260,13 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 9 }, -/obj/structure/chair{ - dir = 4 - }, /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 }, -/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/trimline/neutral/corner{ dir = 4 }, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "bxG" = ( @@ -7420,7 +7399,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/structure/sign/clock/directional/west, @@ -8858,9 +8837,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "bYd" = ( @@ -9831,6 +9807,7 @@ /obj/effect/turf_decal/trimline/neutral/corner{ dir = 4 }, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "cpR" = ( @@ -10176,7 +10153,7 @@ /area/station/command/heads_quarters/captain) "cvg" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/effect/landmark/start/assistant, /obj/structure/sign/clock/directional/north, /obj/item/pillow/random, @@ -10723,18 +10700,6 @@ /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, /area/station/hallway/secondary/exit) -"cFg" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/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, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "cFh" = ( /obj/machinery/modular_computer/preset/engineering{ dir = 8 @@ -11316,11 +11281,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"cOM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "cON" = ( /obj/machinery/deepfryer, /turf/open/floor/iron/white/side{ @@ -11408,7 +11368,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/effect/landmark/start/assistant, @@ -13099,6 +13059,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/exit) "duB" = ( @@ -13973,15 +13934,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance) -"dLs" = ( -/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, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "dLt" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -14198,6 +14150,8 @@ /obj/effect/turf_decal/trimline/neutral/corner{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "dPe" = ( @@ -14385,7 +14339,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/structure/sign/clock/directional/south, @@ -17448,7 +17402,7 @@ /turf/open/floor/iron/dark, /area/station/cargo/miningdock/oresilo) "fdc" = ( -/obj/machinery/bouldertech/brm, +/obj/machinery/brm, /obj/machinery/conveyor{ dir = 8; id = "mining" @@ -18442,6 +18396,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"ftZ" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/hallway/primary/tram/right) "fuj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, @@ -19216,7 +19174,7 @@ /turf/open/floor/iron/white, /area/station/science/lower) "fKO" = ( -/obj/effect/spawner/structure/window/reinforced, +/obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/command/heads_quarters/hop) "fKW" = ( @@ -22648,10 +22606,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 10 }, -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) @@ -22946,18 +22900,7 @@ /area/station/ai_monitored/command/storage/eva) "heS" = ( /obj/machinery/holopad, -/obj/effect/turf_decal/trimline/neutral/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/effect/turf_decal/bot, -/obj/machinery/status_display/evac/directional/east, /obj/machinery/camera/directional/east{ c_tag = "Departures - West Main" }, @@ -22966,6 +22909,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/transport/nav_beacon/tram/nav/immovable_rod, +/obj/machinery/status_display/ai/directional/east, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "heY" = ( @@ -22999,7 +22946,7 @@ /obj/structure/bed{ dir = 8 }, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/structure/sign/clock/directional/east, /obj/item/pillow/random, /turf/open/floor/wood, @@ -23717,13 +23664,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) -"hsT" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "htb" = ( /obj/structure/closet/secure_closet/courtroom, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -24598,23 +24538,6 @@ }, /turf/open/floor/engine/hull, /area/station/solars/starboard/fore) -"hNh" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Escape Wing" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/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, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "hNo" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -24884,7 +24807,7 @@ /area/station/security/brig) "hRK" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/landmark/start/hangover, /obj/structure/sign/clock/directional/south, /obj/item/pillow/random, @@ -24917,9 +24840,6 @@ c_tag = "Hallway - Central Escape Wing Entry" }, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -26301,6 +26221,15 @@ /obj/effect/turf_decal/stripes/white/full, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"iur" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "iuz" = ( /obj/machinery/door/airlock/external{ name = "Port Docking Bay 1"; @@ -26311,7 +26240,7 @@ /area/station/hallway/secondary/entry) "iuJ" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/structure/sign/clock/directional/north, /obj/item/pillow/random, /turf/open/floor/carpet, @@ -28451,6 +28380,16 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"jhn" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "jhs" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -28841,7 +28780,7 @@ /obj/structure/bed{ dir = 8 }, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/landmark/start/assistant, /obj/structure/sign/clock/directional/east, /obj/item/pillow/random, @@ -29049,12 +28988,12 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 }, -/obj/effect/turf_decal/trimline/red/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "jrz" = ( @@ -29675,11 +29614,9 @@ "jBk" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/structure/cable, -/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/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "jBn" = ( @@ -30950,6 +30887,14 @@ "jYS" = ( /turf/closed/wall, /area/station/medical/chemistry) +"jYT" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/full, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "jYU" = ( /obj/structure/transport/linear/public, /obj/effect/turf_decal/trimline/dark_red/warning{ @@ -30967,8 +30912,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) @@ -35579,13 +35522,13 @@ /turf/open/floor/iron/white, /area/station/science/xenobiology) "lyR" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 10 - }, -/obj/structure/chair{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "lyV" = ( @@ -36227,7 +36170,7 @@ /obj/structure/bed{ dir = 8 }, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/landmark/start/assistant, /obj/structure/sign/clock/directional/east, /obj/item/pillow/random, @@ -36569,10 +36512,7 @@ location = "QM #2" }, /obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #2"; - suffix = "#2" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/warehouse) "lQH" = ( @@ -36622,14 +36562,9 @@ /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/right) "lRx" = ( -/obj/structure/chair{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/landmark/start/hangover, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "lRC" = ( @@ -41744,10 +41679,7 @@ location = "QM #6" }, /obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #6"; - suffix = "#6" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/warehouse) "nIQ" = ( @@ -41780,9 +41712,10 @@ /turf/open/floor/plating, /area/station/maintenance/tram/left) "nJx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "nJF" = ( @@ -42175,12 +42108,9 @@ /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) "nQq" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "nQr" = ( @@ -44293,6 +44223,15 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"oGG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "oGJ" = ( /turf/closed/mineral/random/stationside/asteroid/porus, /area/station/medical/chemistry) @@ -44591,6 +44530,16 @@ }, /turf/open/space/openspace, /area/station/solars/port) +"oOP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "oOT" = ( /obj/structure/table/wood, /obj/item/food/grown/poppy{ @@ -45408,7 +45357,7 @@ /turf/open/floor/iron/showroomfloor, /area/station/security/warden) "pfm" = ( -/obj/item/bedsheet/dorms_double{ +/obj/effect/spawner/random/bedsheet/double{ dir = 4 }, /obj/structure/bed/double{ @@ -47219,21 +47168,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) -"pKa" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 1 - }, -/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, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "pKk" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/bot{ @@ -47715,7 +47649,7 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 }, -/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/sign/departments/evac/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/exit) "pUi" = ( @@ -47921,10 +47855,7 @@ location = "QM #3" }, /obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #3"; - suffix = "#3" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/warehouse) "pXC" = ( @@ -48171,7 +48102,6 @@ /area/station/security/checkpoint/engineering) "qbW" = ( /obj/machinery/holopad, -/obj/effect/landmark/observer_start, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -48183,6 +48113,7 @@ id = 2 }, /obj/machinery/transport/destination_sign/indicator/directional/south, +/obj/effect/landmark/observer_start, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) "qch" = ( @@ -48449,7 +48380,6 @@ "qfQ" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/transport/power_rectifier, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/right) "qfS" = ( @@ -49076,7 +49006,6 @@ "qrs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/clock/directional/east, /obj/structure/closet/secure_closet/personal, /obj/effect/spawner/random/bureaucracy/briefcase, /obj/machinery/power/apc/auto_name/directional/north, @@ -49878,7 +49807,9 @@ /turf/open/floor/iron/white, /area/station/science/research) "qFH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/railing{ + dir = 1 + }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "qFK" = ( @@ -51031,7 +50962,9 @@ dir = 8 }, /obj/structure/cable, -/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/directional/west, @@ -52540,10 +52473,7 @@ location = "QM #1" }, /obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/warehouse) "rCL" = ( @@ -54601,6 +54531,14 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) +"snF" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit) "snK" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -55766,8 +55704,6 @@ }, /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/landmark/start/hangover, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "sJQ" = ( @@ -56470,10 +56406,7 @@ /area/station/service/theater) "sWq" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 9 - }, -/obj/structure/chair{ - dir = 4 + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) @@ -56541,14 +56474,14 @@ /turf/open/floor/iron, /area/station/cargo/drone_bay) "sXo" = ( -/obj/structure/chair{ +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 1 }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "sXL" = ( @@ -58372,9 +58305,8 @@ /area/station/service/theater) "tEk" = ( /obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "tEl" = ( @@ -58604,6 +58536,18 @@ /mob/living/simple_animal/bot/floorbot, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"tIk" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "tID" = ( /obj/structure/transport/linear/public, /obj/effect/landmark/transport/transport_id{ @@ -59292,7 +59236,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/structure/sign/clock/directional/west, @@ -59904,7 +59848,7 @@ /obj/structure/bed{ dir = 8 }, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/structure/sign/clock/directional/east, /obj/item/pillow/random, /turf/open/floor/carpet, @@ -60506,7 +60450,7 @@ /area/station/hallway/secondary/command) "upb" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/effect/landmark/start/hangover, /obj/structure/sign/clock/directional/north, /obj/item/pillow/random, @@ -67537,7 +67481,7 @@ /obj/structure/bed/double{ dir = 4 }, -/obj/item/bedsheet/dorms_double{ +/obj/effect/spawner/random/bedsheet/double{ dir = 4 }, /obj/structure/sign/clock/directional/north, @@ -67565,6 +67509,18 @@ dir = 1 }, /area/station/command/bridge) +"wJF" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/stripes/white/full, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "wJM" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68066,17 +68022,12 @@ /turf/open/floor/wood, /area/station/command/meeting_room) "wWh" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/vending/cola/blue, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) "wWn" = ( /obj/effect/decal/cleanable/dirt, @@ -185052,9 +185003,9 @@ bAj dJk vUE vUE +ftZ vUE -vUE -vUE +ftZ vUE nSI tXz @@ -186079,11 +186030,11 @@ qUB hAR veA lCy -lCy -lCy +cFb +kDH nzx +kDH cFb -lCy nSI tXz tXz @@ -186336,13 +186287,13 @@ jha qDn ajg qZZ -ajg +kAO hSt pgo kAO kAO udX -kAO +jhn duA bPO iVy @@ -186592,9 +186543,9 @@ fZS kDH vPB pzv +oGG geG geG -dLs aFZ geG geG @@ -186848,15 +186799,15 @@ lMg qbu riS gAH -wuF -wuF -wuF -cFg -aGa -aDI +aFP +oOP pTW wuF +aZm wuF +pTW +aFP +aDI aHw aHE aHS @@ -187105,15 +187056,15 @@ pSV pSV pSV pEx -pEx -pEx +jYT +wJF fmy wWh -wuF +snF aGq fmy -pEx -pEx +jYT +aGw pEx fmy dbV @@ -187362,15 +187313,15 @@ gbB pkD pSV bxC -akS +joi lyR -fmy -hNh -pEx -aGr -fmy +xWu +rUQ +rUQ +rUQ +xWu sWq -akS +eKD gXH fmy fmy @@ -187620,12 +187571,12 @@ aDN wzg tiM qSm -eKD -hsT -pKa +tIk +aGb +aGb +aGb +aGb aGb -aFP -aGw joi qSm swr @@ -187877,7 +187828,7 @@ aDN wzg tiM qFH -kIo +iur tEk jBk heS @@ -188133,10 +188084,10 @@ wXP loQ wAh cpK -qSm -kIo -qSm -sXo +nJx +nQq +lRx +jZe fmy aGs kIo @@ -188390,10 +188341,10 @@ fam aDN wzg tiM +qFH +nQq qSm -kIo -qSm -lRx +sJx rUQ aGt kIo @@ -188649,7 +188600,7 @@ vQX dJp jrc fio -nJx +qSm bYa rUQ lai @@ -189162,9 +189113,9 @@ ifU kLI kFu uCy -tiM +sXo qSm -nQq +bYa rUQ lai qSm @@ -189420,7 +189371,7 @@ hoN cHS svC nny -cOM +qSm jZe xWu uuS diff --git a/_maps/shuttles/emergency_clown.dmm b/_maps/shuttles/emergency_clown.dmm index f5c0ca4ea61eb..fc943e5287bb8 100644 --- a/_maps/shuttles/emergency_clown.dmm +++ b/_maps/shuttles/emergency_clown.dmm @@ -158,7 +158,7 @@ /area/shuttle/escape) "aM" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/mineral/bananium, /area/shuttle/escape) "aQ" = ( @@ -246,7 +246,7 @@ /area/shuttle/escape) "iU" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/machinery/light/small/directional/east, /turf/open/floor/mineral/bananium, /area/shuttle/escape) @@ -254,7 +254,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /turf/open/floor/mineral/bananium, @@ -289,7 +289,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /obj/machinery/light/small/directional/west, @@ -300,7 +300,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /turf/open/floor/mineral/bananium, @@ -315,7 +315,7 @@ "XT" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/mineral/bananium, /area/shuttle/escape) "YC" = ( diff --git a/_maps/shuttles/emergency_hugcage.dmm b/_maps/shuttles/emergency_hugcage.dmm index 6e68506c4332e..4b500f7bdbd45 100644 --- a/_maps/shuttles/emergency_hugcage.dmm +++ b/_maps/shuttles/emergency_hugcage.dmm @@ -3,7 +3,7 @@ /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape/brig) "aR" = ( -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 8 }, /obj/structure/bed, @@ -83,7 +83,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "gg" = ( -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /obj/structure/bed{ @@ -116,7 +116,7 @@ /area/shuttle/escape) "iI" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/item/pillow/random, /obj/effect/spawner/random/entertainment/plushie_delux, /turf/open/floor/mineral/titanium/yellow, @@ -148,7 +148,7 @@ /obj/structure/bed{ dir = 1 }, -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /obj/item/pillow/random, @@ -211,7 +211,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ys" = ( -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /obj/structure/bed{ @@ -327,7 +327,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "KW" = ( -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 8 }, /obj/structure/bed, diff --git a/_maps/shuttles/emergency_monastery.dmm b/_maps/shuttles/emergency_monastery.dmm index 13236bfabbbab..080f2f2d4e18a 100644 --- a/_maps/shuttles/emergency_monastery.dmm +++ b/_maps/shuttles/emergency_monastery.dmm @@ -2433,16 +2433,12 @@ /turf/open/floor/carpet, /area/shuttle/escape) "Ju" = ( -/obj/structure/rack{ - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, /obj/item/book/codex_gigas, /obj/machinery/camera/directional/south{ c_tag = "Monastery Archives Aft"; network = list("ss13","monastery") }, +/obj/structure/rack/skeletal, /turf/open/floor/iron/dark, /area/shuttle/escape) "Jv" = ( diff --git a/_maps/shuttles/ferry_base.dmm b/_maps/shuttles/ferry_base.dmm index 4f9861db6d50d..69a4d6fa18cec 100644 --- a/_maps/shuttles/ferry_base.dmm +++ b/_maps/shuttles/ferry_base.dmm @@ -62,6 +62,12 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) +"J" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 8 + }, +/turf/closed/wall/mineral/titanium, +/area/shuttle/transport) "U" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -72,17 +78,17 @@ (1,1,1) = {" a -b +J k -b +J a "} (2,1,1) = {" -b +J g l g -b +J "} (3,1,1) = {" c @@ -148,9 +154,9 @@ q c "} (12,1,1) = {" -c +b e m e -c +b "} diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm index 48d0c4f558f44..18197d61f1401 100644 --- a/_maps/shuttles/ferry_lighthouse.dmm +++ b/_maps/shuttles/ferry_lighthouse.dmm @@ -4,7 +4,7 @@ /area/template_noop) "ab" = ( /obj/machinery/power/shuttle_engine/propulsion/left{ - dir = 4 + dir = 8 }, /turf/open/floor/plating/airless, /area/shuttle/transport) @@ -257,6 +257,13 @@ }, /turf/open/floor/wood, /area/shuttle/transport) +"sy" = ( +/obj/machinery/power/shuttle_engine/propulsion/left{ + dir = 8; + pixel_x = 1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/transport) "ZS" = ( /obj/machinery/light/warm/directional/west, /turf/open/floor/wood, @@ -299,7 +306,7 @@ ac aa "} (3,1,1) = {" -ab +sy af ag ag diff --git a/_maps/shuttles/ferry_meat.dmm b/_maps/shuttles/ferry_meat.dmm index 35188f974299b..fc986bcda5030 100644 --- a/_maps/shuttles/ferry_meat.dmm +++ b/_maps/shuttles/ferry_meat.dmm @@ -4,7 +4,7 @@ /area/template_noop) "b" = ( /obj/machinery/power/shuttle_engine/propulsion{ - dir = 4 + dir = 8 }, /turf/closed/wall/mineral/titanium, /area/shuttle/transport) diff --git a/_maps/shuttles/pirate_dutchman.dmm b/_maps/shuttles/pirate_dutchman.dmm index 86b85f7b70edc..fb36638173ed1 100644 --- a/_maps/shuttles/pirate_dutchman.dmm +++ b/_maps/shuttles/pirate_dutchman.dmm @@ -464,15 +464,11 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/structure/rack{ - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, /obj/item/food/grown/sugarcane, /obj/item/food/grown/sugarcane, /obj/item/food/grown/sugarcane, /obj/item/reagent_containers/cup/bucket/wooden, +/obj/structure/rack/skeletal, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) "vT" = ( @@ -550,17 +546,13 @@ dir = 10 }, /obj/machinery/light/floor, -/obj/structure/rack{ - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, /obj/item/reagent_containers/condiment/milk{ pixel_x = -5 }, /obj/item/reagent_containers/condiment/milk{ pixel_x = 5 }, +/obj/structure/rack/skeletal, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) "zE" = ( diff --git a/_maps/shuttles/pirate_grey.dmm b/_maps/shuttles/pirate_grey.dmm index 0726d8d1ea196..7ba8fdd5a5ced 100644 --- a/_maps/shuttles/pirate_grey.dmm +++ b/_maps/shuttles/pirate_grey.dmm @@ -955,7 +955,7 @@ /area/shuttle/pirate) "DP" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/plating, /area/shuttle/pirate) "DX" = ( diff --git a/_maps/shuttles/pirate_silverscale.dmm b/_maps/shuttles/pirate_silverscale.dmm index e4838e040e472..d4bd9d0c16b3e 100644 --- a/_maps/shuttles/pirate_silverscale.dmm +++ b/_maps/shuttles/pirate_silverscale.dmm @@ -91,7 +91,7 @@ /obj/structure/bed/pod{ dir = 4 }, -/obj/item/bedsheet/black{ +/obj/item/bedsheet/pirate{ dir = 4 }, /turf/open/floor/carpet/royalblack, @@ -288,7 +288,7 @@ /area/shuttle/pirate) "uP" = ( /obj/structure/bed/pod, -/obj/item/bedsheet/black, +/obj/item/bedsheet/pirate, /turf/open/floor/carpet/royalblack, /area/shuttle/pirate) "vw" = ( @@ -381,7 +381,7 @@ /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/all_access, /obj/structure/bed/pod, -/obj/item/bedsheet/black, +/obj/item/bedsheet/pirate, /turf/open/floor/carpet/royalblack, /area/shuttle/pirate) "zB" = ( diff --git a/_maps/shuttles/ruin_pirate_cutter.dmm b/_maps/shuttles/ruin_pirate_cutter.dmm index 9fa1943c5f8f1..e99c5097664a6 100644 --- a/_maps/shuttles/ruin_pirate_cutter.dmm +++ b/_maps/shuttles/ruin_pirate_cutter.dmm @@ -344,7 +344,7 @@ "wV" = ( /obj/machinery/light/small/directional/north, /obj/structure/bed, -/obj/item/bedsheet/brown, +/obj/item/bedsheet/pirate, /turf/open/floor/iron/dark, /area/shuttle/ruin/caravan/pirate) "xb" = ( @@ -501,7 +501,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/brown{ +/obj/item/bedsheet/pirate{ dir = 4 }, /obj/machinery/airalarm/directional/west, @@ -514,7 +514,7 @@ "Ha" = ( /obj/machinery/light/small/directional/south, /obj/structure/bed, -/obj/item/bedsheet/brown, +/obj/item/bedsheet/pirate, /turf/open/floor/iron/dark, /area/shuttle/ruin/caravan/pirate) "Hb" = ( @@ -838,7 +838,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/brown{ +/obj/item/bedsheet/pirate{ dir = 4 }, /obj/machinery/firealarm/directional/west, diff --git a/_maps/shuttles/whiteship_cere.dmm b/_maps/shuttles/whiteship_cere.dmm index e6a677d57c3a5..1f0308690e77d 100644 --- a/_maps/shuttles/whiteship_cere.dmm +++ b/_maps/shuttles/whiteship_cere.dmm @@ -388,7 +388,7 @@ /area/shuttle/abandoned/cargo) "oB" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship_kilo.dmm index 2dc2e1c54d5bc..cbc214f21d828 100644 --- a/_maps/shuttles/whiteship_kilo.dmm +++ b/_maps/shuttles/whiteship_kilo.dmm @@ -1176,7 +1176,7 @@ /obj/structure/bed/pod{ dir = 1 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/shuttles/whiteship_personalshuttle.dmm b/_maps/shuttles/whiteship_personalshuttle.dmm index e3f432f350b57..8e041082bc6d9 100644 --- a/_maps/shuttles/whiteship_personalshuttle.dmm +++ b/_maps/shuttles/whiteship_personalshuttle.dmm @@ -273,7 +273,7 @@ /area/shuttle/abandoned/bridge) "pS" = ( /obj/machinery/light/small/directional/south, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/structure/bed/pod{ diff --git a/_maps/templates/hilbertshotel.dmm b/_maps/templates/hilbertshotel.dmm index 2895d10406907..8c425aa9c13db 100644 --- a/_maps/templates/hilbertshotel.dmm +++ b/_maps/templates/hilbertshotel.dmm @@ -76,7 +76,7 @@ /area/misc/hilbertshotel) "q" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/indestructible/hotelwood, /area/misc/hilbertshotel) "r" = ( diff --git a/_maps/templates/hilbertshotellore.dmm b/_maps/templates/hilbertshotellore.dmm index 4774f6788e373..fe77ef9cc3d54 100644 --- a/_maps/templates/hilbertshotellore.dmm +++ b/_maps/templates/hilbertshotellore.dmm @@ -177,7 +177,7 @@ /area/misc/hilbertshotel) "aU" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/effect/decal/cleanable/dirt, /turf/open/indestructible/hotelwood, /area/misc/hilbertshotel) diff --git a/_maps/templates/lazy_templates/wizard_den.dmm b/_maps/templates/lazy_templates/wizard_den.dmm index 8c2ad8d215390..58e09b40a0ac7 100644 --- a/_maps/templates/lazy_templates/wizard_den.dmm +++ b/_maps/templates/lazy_templates/wizard_den.dmm @@ -229,7 +229,8 @@ "nV" = ( /obj/structure/flora/bush/fullgrass/style_random, /mob/living/simple_animal/hostile/ooze/gelatinous{ - name = "Jimmy" + name = "Jimmy"; + faction = list("slime", "Wizard") }, /turf/open/floor/grass, /area/centcom/wizard_station) @@ -536,7 +537,8 @@ /area/centcom/wizard_station) "AW" = ( /mob/living/simple_animal/pet/gondola{ - name = "Jommy" + name = "Jommy"; + faction = list("gondola", "Wizard") }, /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, diff --git a/_maps/virtual_domains/beach_bar.dmm b/_maps/virtual_domains/beach_bar.dmm index edea28b064f50..6368168416193 100644 --- a/_maps/virtual_domains/beach_bar.dmm +++ b/_maps/virtual_domains/beach_bar.dmm @@ -84,34 +84,7 @@ /turf/open/water/beach, /area/virtual_domain/fullbright) "db" = ( -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/vending_refill/cigarette, -/obj/item/vending_refill/boozeomat, -/obj/structure/closet/secure_closet{ - icon_state = "cabinet"; - name = "booze storage"; - req_access = list("bar") - }, -/obj/item/storage/backpack/duffelbag, -/obj/item/etherealballdeployer, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, +/obj/structure/closet/secure_closet/bar/lavaland_bartender_booze, /turf/open/floor/wood, /area/virtual_domain/fullbright) "di" = ( @@ -395,19 +368,8 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/virtual_domain/fullbright) "ug" = ( -/obj/structure/closet/secure_closet{ - icon_state = "cabinet"; - name = "bartender's closet"; - req_access = list("bar") - }, -/obj/item/clothing/shoes/sandal{ - desc = "A very fashionable pair of flip-flops."; - name = "flip-flops" - }, -/obj/item/clothing/neck/beads, -/obj/item/clothing/glasses/sunglasses/reagent, -/obj/item/clothing/suit/costume/hawaiian, /obj/machinery/light/small/directional/east, +/obj/structure/closet/secure_closet/bar/lavaland_bartender_clothes, /turf/open/floor/wood, /area/virtual_domain/fullbright) "uk" = ( @@ -897,7 +859,7 @@ /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) "Nw" = ( -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/structure/bed{ diff --git a/_maps/virtual_domains/pirates.dmm b/_maps/virtual_domains/pirates.dmm index f48c9ff7eaea1..1d330adcc4ddf 100644 --- a/_maps/virtual_domains/pirates.dmm +++ b/_maps/virtual_domains/pirates.dmm @@ -474,14 +474,10 @@ /area/virtual_domain/fullbright) "AF" = ( /obj/effect/mapping_helpers/burnt_floor, -/obj/structure/rack{ - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, /obj/item/storage/bag/money/dutchmen{ pixel_y = 13 }, +/obj/structure/rack/skeletal, /turf/open/floor/wood/parquet, /area/virtual_domain) "AP" = ( diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index 012ded7eac165..55b5b12b531ac 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -133,22 +133,36 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 the atom/checkpass() proc uses them (tables will call movable atom checkpass(PASSTABLE) for example) */ //flags for pass_flags +/// Allows you to pass over tables. #define PASSTABLE (1<<0) +/// Allows you to pass over glass(this generally includes anything see-through that's glass-adjacent, ie. windows, windoors, airlocks with glass, etc.) #define PASSGLASS (1<<1) +/// Allows you to pass over grilles. #define PASSGRILLE (1<<2) +/// Allows you to pass over blob tiles. #define PASSBLOB (1<<3) +/// Allows you to pass over mobs. #define PASSMOB (1<<4) +/// Allows you to pass over closed turfs, ie. walls. #define PASSCLOSEDTURF (1<<5) /// Let thrown things past us. **ONLY MEANINGFUL ON pass_flags_self!** #define LETPASSTHROW (1<<6) +/// Allows you to pass over machinery, ie. vending machines, computers, protolathes, etc. #define PASSMACHINE (1<<7) +/// Allows you to pass over structures, ie. racks, tables(if you don't already have PASSTABLE), etc. #define PASSSTRUCTURE (1<<8) +/// Allows you to pass over plastic flaps, often found at cargo or MULE dropoffs. #define PASSFLAPS (1<<9) +/// Allows you to pass over airlocks and mineral doors. #define PASSDOORS (1<<10) +/// Allows you to pass over vehicles, ie. mecha, secways, the pimpin' ride, etc. #define PASSVEHICLE (1<<11) +/// Allows you to pass over dense items. #define PASSITEM (1<<12) /// Do not intercept click attempts during Adjacent() checks. See [turf/proc/ClickCross]. **ONLY MEANINGFUL ON pass_flags_self!** #define LETPASSCLICKS (1<<13) +/// Allows you to pass over windows and window-adjacent stuff, like windows and windoors. Does not include airlocks with glass in them. +#define PASSWINDOW (1<<14) //Movement Types #define GROUND (1<<0) diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm index daa5d4285f9a0..6dc90ea4d645a 100644 --- a/code/__DEFINES/ai/ai_blackboard.dm +++ b/code/__DEFINES/ai/ai_blackboard.dm @@ -141,5 +141,8 @@ /// The next time at which this mob can call for reinforcements #define BB_BASIC_MOB_REINFORCEMENTS_COOLDOWN "BB_basic_mob_reinforcements_cooldown" +/// the direction we started when executing stare at things +#define BB_STARTING_DIRECTION "BB_startdir" + ///Text we display when we befriend someone #define BB_FRIENDLY_MESSAGE "friendly_message" diff --git a/code/__DEFINES/ai/pets.dm b/code/__DEFINES/ai/pets.dm index e41c9ac0c3ffe..c7383f56a005e 100644 --- a/code/__DEFINES/ai/pets.dm +++ b/code/__DEFINES/ai/pets.dm @@ -51,3 +51,20 @@ /// key that holds items we arent interested in hoarding #define BB_IGNORE_ITEMS "ignore_items" +//virtual pet keys +///the last PDA message we must relay +#define BB_LAST_RECIEVED_MESSAGE "last_recieved_message" +///our current virtual pet level +#define BB_VIRTUAL_PET_LEVEL "virtual_pet_level" +///the target we will play with +#define BB_NEARBY_PLAYMATE "nearby_playmate" +///cooldown till we search for playmates +#define BB_NEXT_PLAYDATE "next_playdate" +///our ability to trigger lights +#define BB_LIGHTS_ABILITY "lights_ability" +///our ability to capture images +#define BB_PHOTO_ABILITY "photo_ability" +///the name of our trick +#define BB_TRICK_NAME "trick_name" +///the sequence of our trick +#define BB_TRICK_SEQUENCE "trick_sequence" diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index e903d0539cfc8..af1cb68c41cad 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -146,6 +146,9 @@ /// JSON string file for all of our heretic influence flavors #define HERETIC_INFLUENCE_FILE "antagonist_flavor/heretic_influences.json" +/// JSON file containing spy objectives +#define SPY_OBJECTIVE_FILE "antagonist_flavor/spy_objective.json" + ///employers that are from the syndicate GLOBAL_LIST_INIT(syndicate_employers, list( "Animal Rights Consortium", @@ -213,6 +216,9 @@ GLOBAL_LIST_INIT(ai_employers, list( /// Checks if the given mob is a blood cultist #define IS_CULTIST(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/cult)) +/// Checks if the given mob is a changeling +#define IS_CHANGELING(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/changeling)) + /// Checks if the given mob is a nuclear operative #define IS_NUKE_OP(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/nukeop)) @@ -262,6 +268,8 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list( #define OBJECTIVE_ITEM_TYPE_NORMAL "normal" /// Only appears in traitor objectives #define OBJECTIVE_ITEM_TYPE_TRAITOR "traitor" +/// Only appears for spy bounties +#define OBJECTIVE_ITEM_TYPE_SPY "spy" // Progression traitor defines @@ -376,3 +384,11 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list( #define BATON_MODES 4 #define FREEDOM_IMPLANT_CHARGES 4 + +// Spy bounty difficulties +/// Can easily be accomplished by any job without any specialized tools, people won't really miss these things +#define SPY_DIFFICULTY_EASY "Easy" +/// Requires some specialized tools, knowledge, or access to accomplish, may require getting into conflict with the crew +#define SPY_DIFFICULTY_MEDIUM "Medium" +/// Very difficult to accomplish, almost guaranteed to require crew conflict +#define SPY_DIFFICULTY_HARD "Hard" diff --git a/code/__DEFINES/atmospherics/atmos_machinery.dm b/code/__DEFINES/atmospherics/atmos_machinery.dm index eb0f853ee944c..ef1d06f7eeeff 100644 --- a/code/__DEFINES/atmospherics/atmos_machinery.dm +++ b/code/__DEFINES/atmospherics/atmos_machinery.dm @@ -49,6 +49,13 @@ /// Fire alarm has all components but isn't completed #define FIRE_ALARM_BUILD_SECURED 2 +// Fault levels for air alarm display +/// Area faults clear +#define AREA_FAULT_NONE 0 +/// Fault triggered by manual intervention (ie: fire alarm pull) +#define AREA_FAULT_MANUAL 1 +/// Fault triggered automatically (ie: firedoor detection) +#define AREA_FAULT_AUTOMATIC 2 // threshold_type values for [/datum/tlv/proc/set_value] and [/datum/tlv/proc/reset_value] /// [/datum/tlv/var/warning_min] diff --git a/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm b/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm index 9a040f0c160a0..cd4bcf088ee88 100644 --- a/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm +++ b/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm @@ -25,6 +25,8 @@ #define BURNING_COLD GAS_N2 + "=82;" + GAS_PLASMA + "=24;TEMP=120" ///Space temperature hyper nob #define SPACE_TEMP_NOBLIUM GAS_HYPER_NOBLIUM + "=7500;TEMP=2.7" +///Xenobio slime containment turf +#define XENOBIO_BZ GAS_BZ + "=100;TEMP=293.15" //ATMOSPHERICS DEPARTMENT GAS TANK TURFS #define ATMOS_TANK_N2O GAS_N2O + "=6000;TEMP=293.15" diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index df837c86d9a31..b175acd65a615 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -112,6 +112,7 @@ #define SECHUD_SCIENTIST "hudscientist" #define SECHUD_SHAFT_MINER "hudshaftminer" #define SECHUD_STATION_ENGINEER "hudstationengineer" +#define SECHUD_VETERAN_ADVISOR "hudveteranadvisor" #define SECHUD_VIROLOGIST "hudvirologist" #define SECHUD_WARDEN "hudwarden" diff --git a/code/__DEFINES/cleaning.dm b/code/__DEFINES/cleaning.dm index 7c954602215e3..79708cd152b62 100644 --- a/code/__DEFINES/cleaning.dm +++ b/code/__DEFINES/cleaning.dm @@ -29,3 +29,8 @@ #define CLEAN_SCRUB (CLEAN_WASH | CLEAN_TYPE_FINGERPRINTS | CLEAN_TYPE_FIBERS | CLEAN_TYPE_HARD_DECAL) #define CLEAN_RAD CLEAN_TYPE_RADIATION #define CLEAN_ALL ALL + +// Footprint sprites to use when making footprints in blood, oil, etc. +#define FOOTPRINT_SPRITE_SHOES "shoes" +#define FOOTPRINT_SPRITE_PAWS "paws" +#define FOOTPRINT_SPRITE_CLAWS "claws" diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index c7da3473fa3b0..bcb63c153829c 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -61,6 +61,7 @@ #define COLOR_VERY_SOFT_YELLOW "#FAE48E" #define COLOR_GOLD "#FFD700" #define COLOR_ETHIOPIA_YELLOW "#FCDD09" +#define COLOR_LIGHT_YELLOW "#FFFEE0" #define COLOR_OLIVE "#808000" #define COLOR_ASSISTANT_OLIVE "#828163" diff --git a/code/__DEFINES/construction/actions.dm b/code/__DEFINES/construction/actions.dm index 9fe4fd157e310..f503bfc4fcbef 100644 --- a/code/__DEFINES/construction/actions.dm +++ b/code/__DEFINES/construction/actions.dm @@ -1,6 +1,9 @@ //default_unfasten_wrench() return defines +/// Return if unfasten failed, but allow attack chain to continue #define CANT_UNFASTEN 0 +/// Return if unfasten failed, and stop attack chain #define FAILED_UNFASTEN 1 +/// Return if unfasten succeeded #define SUCCESSFUL_UNFASTEN 2 // Defines for the construction component diff --git a/code/__DEFINES/construction/structures.dm b/code/__DEFINES/construction/structures.dm index 32368f421cd0c..e52b82f248e4e 100644 --- a/code/__DEFINES/construction/structures.dm +++ b/code/__DEFINES/construction/structures.dm @@ -62,7 +62,24 @@ #define GEAR_SECURE 1 #define GEAR_LOOSE 2 -// Stationary gas tanks +//Stationary gas tanks #define TANK_FRAME 0 #define TANK_PLATING_UNSECURED 1 +// Frame (de/con)struction states +/// Frame is empty, no wires no board +#define FRAME_STATE_EMPTY 0 +/// Frame has been wired +#define FRAME_STATE_WIRED 1 +/// Frame has a board installed, it is safe to assume if in this state then circuit is non-null (but you never know) +#define FRAME_STATE_BOARD_INSTALLED 2 +/// Frame is empty, no circuit board yet +#define FRAME_COMPUTER_STATE_EMPTY FRAME_STATE_EMPTY +/// Frame now has a board installed, it is safe to assume beyond this state, circuit is non-null (but you never know) +#define FRAME_COMPUTER_STATE_BOARD_INSTALLED 1 +/// Board has been secured +#define FRAME_COMPUTER_STATE_BOARD_SECURED 2 +/// Frame has been wired +#define FRAME_COMPUTER_STATE_WIRED 3 +/// Frame has had glass applied to it +#define FRAME_COMPUTER_STATE_GLASSED 4 diff --git a/code/__DEFINES/dcs/signals/signals_action.dm b/code/__DEFINES/dcs/signals/signals_action.dm index 6fbf5372acdd2..2226e34bcccbd 100644 --- a/code/__DEFINES/dcs/signals/signals_action.dm +++ b/code/__DEFINES/dcs/signals/signals_action.dm @@ -48,3 +48,6 @@ /// From /datum/action/cooldown/manual_heart/Activate(): () #define COMSIG_HEART_MANUAL_PULSE "heart_manual_pulse" + +/// From /datum/action/cooldown/mob_cooldown/capture_photo/Activate(): +#define COMSIG_ACTION_PHOTO_CAPTURED "action_photo_captured" diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm index a027dc61adbfe..24524395f35f2 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -129,3 +129,8 @@ #define COMSIG_ATOM_GERM_UNEXPOSED "atom_germ_unexposed" /// signal sent to puzzle pieces by activator #define COMSIG_PUZZLE_COMPLETED "puzzle_completed" + +/// From /datum/compomnent/cleaner/clean() +#define COMSIG_ATOM_PRE_CLEAN "atom_pre_clean" + ///cancel clean + #define COMSIG_ATOM_CANCEL_CLEAN (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm index 601f441c66dd4..38d0500dcbdb5 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm @@ -112,3 +112,6 @@ #define COMSIG_MOVABLE_EDIT_UNIQUE_IMMERSE_OVERLAY "movable_edit_unique_submerge_overlay" /// From base of area/Exited(): (area/left, direction) #define COMSIG_MOVABLE_EXITED_AREA "movable_exited_area" + +/// Sent to movables when they are being stolen by a spy: (mob/living/spy, datum/spy_bounty/bounty) +#define COMSIG_MOVABLE_SPY_STEALING "movable_spy_stealing" diff --git a/code/__DEFINES/dcs/signals/signals_camera.dm b/code/__DEFINES/dcs/signals/signals_camera.dm index 6ec142f54fabe..92e9b94f35bba 100644 --- a/code/__DEFINES/dcs/signals/signals_camera.dm +++ b/code/__DEFINES/dcs/signals/signals_camera.dm @@ -1,2 +1,4 @@ -///Signal sent when a /datum/trackable found a target: (datum/trackable/source, mob/living/target) +///Signal sent when a /datum/trackable found a target: (mob/living/target) #define COMSIG_TRACKABLE_TRACKING_TARGET "comsig_trackable_tracking_target" +///Signal sent when the mob a /datum/trackable is actively following changes glide size: mob/living/target, new_glide_size) +#define COMSIG_TRACKABLE_GLIDE_CHANGED "comsig_trackable_glide_changed" diff --git a/code/__DEFINES/dcs/signals/signals_fish.dm b/code/__DEFINES/dcs/signals/signals_fish.dm index a40e731fc7bf6..c70cdfde1a3f3 100644 --- a/code/__DEFINES/dcs/signals/signals_fish.dm +++ b/code/__DEFINES/dcs/signals/signals_fish.dm @@ -28,6 +28,8 @@ #define COMSIG_FISHING_ROD_CAUGHT_FISH "fishing_rod_caught_fish" /// From /obj/item/fishing_rod/proc/hook_item(): (reward, user) #define COMSIG_FISHING_ROD_HOOKED_ITEM "fishing_rod_hooked_item" +/// From /datum/fish_source/proc/use_slot(), sent to the slotted item: (obj/item/fishing_rod/rod) +#define COMSIG_FISHING_EQUIPMENT_SLOTTED "fishing_equipment_slotted" /// Sent when the challenge is to be interrupted: (reason) #define COMSIG_FISHING_SOURCE_INTERRUPT_CHALLENGE "fishing_spot_interrupt_challenge" 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 2b113f853daec..c8d36d27bcd3a 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -12,8 +12,6 @@ #define COMSIG_ORGAN_BEING_REPLACED "organ_being_replaced" /// Called when an organ gets surgically removed (mob/living/user, mob/living/carbon/old_owner, target_zone, obj/item/tool) #define COMSIG_ORGAN_SURGICALLY_REMOVED "organ_surgically_removed" -/// Called when using the *wag emote -#define COMSIG_ORGAN_WAG_TAIL "wag_tail" ///from base of mob/update_transform() #define COMSIG_LIVING_POST_UPDATE_TRANSFORM "living_post_update_transform" @@ -255,3 +253,11 @@ /// Sent to a mob grabbing another mob: (mob/living/grabbing) #define COMSIG_LIVING_GRAB "living_grab" // Return COMPONENT_CANCEL_ATTACK_CHAIN / COMPONENT_SKIP_ATTACK_CHAIN to stop the grab + +/// From /datum/element/basic_eating/try_eating() +#define COMSIG_MOB_PRE_EAT "mob_pre_eat" + ///cancel eating attempt + #define COMSIG_MOB_CANCEL_EAT (1<<0) + +/// From /datum/element/basic_eating/finish_eating() +#define COMSIG_MOB_ATE "mob_ate" 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 1813198b77415..cd1c636c283ca 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -243,3 +243,6 @@ /// from /mob/proc/slip(): (knockdown_amonut, obj/slipped_on, lube_flags [mobs.dm], paralyze, force_drop) #define COMSIG_MOB_SLIPPED "mob_slipped" + +/// from /mob/proc/key_down(): (key, client/client, full_key) +#define COMSIG_MOB_KEYDOWN "mob_key_down" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 442309289f03a..3654b4cfce5d3 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -410,6 +410,11 @@ ///from /datum/action/vehicle/sealed/headlights/vim/Trigger(): (headlights_on) #define COMSIG_VIM_HEADLIGHTS_TOGGLED "vim_headlights_toggled" +///from /datum/computer_file/program/messenger/proc/receive_message +#define COMSIG_COMPUTER_RECIEVED_MESSAGE "computer_recieved_message" +///from /datum/computer_file/program/virtual_pet/proc/handle_level_up +#define COMSIG_VIRTUAL_PET_LEVEL_UP "virtual_pet_level_up" + // /obj/vehicle/sealed/mecha signals /// sent if you attach equipment to mecha diff --git a/code/__DEFINES/dcs/signals/signals_reagent.dm b/code/__DEFINES/dcs/signals/signals_reagent.dm index a73d59a234c21..38d2ae92d9de3 100644 --- a/code/__DEFINES/dcs/signals/signals_reagent.dm +++ b/code/__DEFINES/dcs/signals/signals_reagent.dm @@ -55,3 +55,7 @@ #define COMSIG_REAGENTS_EXPOSE_TURF "reagents_expose_turf" ///from base of [/datum/component/personal_crafting/proc/del_reqs]: () #define COMSIG_REAGENTS_CRAFTING_PING "reagents_crafting_ping" +/// sent when reagents are transfered from a cup, to something refillable (atom/transfer_to) +#define COMSIG_REAGENTS_CUP_TRANSFER_TO "reagents_cup_transfer_to" +/// sent when reagents are transfered from some reagent container, to a cup (atom/transfer_from) +#define COMSIG_REAGENTS_CUP_TRANSFER_FROM "reagents_cup_transfer_from" diff --git a/code/__DEFINES/dcs/signals/uplink.dm b/code/__DEFINES/dcs/signals/uplink.dm new file mode 100644 index 0000000000000..1daa4f312705c --- /dev/null +++ b/code/__DEFINES/dcs/signals/uplink.dm @@ -0,0 +1,2 @@ +///Signal sent to a mob when they purchase an item from their uplink: (datum/uplink_handler/uplink_handler_source, atom/spawned_item, mob/user) +#define COMSIG_ON_UPLINK_PURCHASE "comsig_on_uplink_purchase" diff --git a/code/__DEFINES/fish.dm b/code/__DEFINES/fish.dm index 62954a649e222..24c3c963598f8 100644 --- a/code/__DEFINES/fish.dm +++ b/code/__DEFINES/fish.dm @@ -3,6 +3,7 @@ // Baseline fishing difficulty levels #define FISHING_DEFAULT_DIFFICULTY 15 +#define FISHING_EASY_DIFFICULTY 10 /// Difficulty modifier when bait is fish's favorite #define FAV_BAIT_DIFFICULTY_MOD -5 @@ -52,6 +53,8 @@ #define FISHING_LINE_BOUNCY (1 << 2) /// The sorta opposite of FISHING_LINE_BOUNCY. It makes it slower to gain completion and faster to lose it. #define FISHING_LINE_STIFF (1 << 3) +///Skip the biting phase and go straight to the fishing phase. +#define FISHING_LINE_AUTOREEL (1 << 4) ///Keeps the bait from falling from gravity, instead allowing the player to move the bait down with right click. #define FISHING_MINIGAME_RULE_BIDIRECTIONAL (1 << 0) @@ -65,6 +68,8 @@ #define FISHING_MINIGAME_RULE_ANTIGRAV (1 << 4) ///Will filp the minigame hud for the duration of the effect #define FISHING_MINIGAME_RULE_FLIP (1 << 5) +///Skip the biting phase and go straight to the minigame, avoiding the penalty for having slow reflexes. +#define FISHING_MINIGAME_AUTOREEL (1 << 6) ///all the effects that are active and will last for a few seconds before triggering a cooldown #define FISHING_MINIGAME_ACTIVE_EFFECTS (FISHING_MINIGAME_RULE_ANTIGRAV|FISHING_MINIGAME_RULE_FLIP) diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 5798fd29e82de..0d2fb6b874d48 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -77,6 +77,7 @@ #define ui_building "EAST-4:22,SOUTH:21" #define ui_language_menu "EAST-4:6,SOUTH:21" #define ui_navigate_menu "EAST-4:22,SOUTH:5" +#define ui_floor_menu "EAST-4:14,SOUTH:37" //Upper-middle right (alerts) #define ui_alert1 "EAST-1:28,CENTER+5:27" @@ -143,6 +144,7 @@ #define ui_borg_alerts "CENTER+4:21,SOUTH:5" #define ui_borg_language_menu "CENTER+4:19,SOUTH+1:6" #define ui_borg_navigate_menu "CENTER+4:19,SOUTH+1:6" +#define ui_borg_floor_menu "CENTER+4:-13,SOUTH+1:6" //Aliens #define ui_alien_health "EAST,CENTER-1:15" @@ -151,6 +153,7 @@ #define ui_alien_storage_r "CENTER+1:18,SOUTH:5" #define ui_alien_language_menu "EAST-4:20,SOUTH:5" #define ui_alien_navigate_menu "EAST-4:20,SOUTH:5" +#define ui_alien_floor_menu "EAST-4:-12,SOUTH:5" //AI #define ui_ai_core "BOTTOM:6,RIGHT-4" @@ -159,6 +162,7 @@ #define ui_ai_state_laws "BOTTOM:6,RIGHT-1" #define ui_ai_mod_int "BOTTOM:6,RIGHT" #define ui_ai_language_menu "BOTTOM+1:8,RIGHT-1:30" +#define ui_ai_floor_menu "BOTTOM+1:8,RIGHT-1:14" #define ui_ai_crew_monitor "BOTTOM:6,CENTER-1" #define ui_ai_crew_manifest "BOTTOM:6,CENTER" @@ -200,6 +204,7 @@ #define ui_ghost_pai "SOUTH: 6, CENTER+1:24" #define ui_ghost_minigames "SOUTH: 6, CENTER+2:24" #define ui_ghost_language_menu "SOUTH: 22, CENTER+3:8" +#define ui_ghost_floor_menu "SOUTH: 6, CENTER+3:8" //Blobbernauts #define ui_blobbernaut_overmind_health "EAST-1:28,CENTER+0:19" diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 909399b3c3da6..1cf4a1bb3be0d 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -314,6 +314,7 @@ GLOBAL_LIST_INIT(book_types, typecacheof(list( #define is_captain_job(job_type) (istype(job_type, /datum/job/captain)) #define is_chaplain_job(job_type) (istype(job_type, /datum/job/chaplain)) #define is_clown_job(job_type) (istype(job_type, /datum/job/clown)) +#define is_mime_job(job_type) (istype(job_type, /datum/job/mime)) #define is_detective_job(job_type) (istype(job_type, /datum/job/detective)) #define is_scientist_job(job_type) (istype(job_type, /datum/job/scientist)) #define is_security_officer_job(job_type) (istype(job_type, /datum/job/security_officer)) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 467b405f715e8..fca771489558f 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -49,6 +49,7 @@ #define JOB_CHIEF_ENGINEER "Chief Engineer" #define JOB_CHIEF_MEDICAL_OFFICER "Chief Medical Officer" #define JOB_BRIDGE_ASSISTANT "Bridge Assistant" +#define JOB_VETERAN_ADVISOR "Veteran Security Advisor" //Silicon #define JOB_AI "AI" #define JOB_CYBORG "Cyborg" @@ -84,6 +85,7 @@ #define JOB_BARTENDER "Bartender" #define JOB_BOTANIST "Botanist" #define JOB_COOK "Cook" +#define JOB_CHEF "Chef" // Alternate cook title. #define JOB_JANITOR "Janitor" #define JOB_CLOWN "Clown" #define JOB_MIME "Mime" @@ -155,10 +157,11 @@ #define JOB_DISPLAY_ORDER_ROBOTICIST 33 #define JOB_DISPLAY_ORDER_GENETICIST 34 #define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 35 -#define JOB_DISPLAY_ORDER_WARDEN 36 -#define JOB_DISPLAY_ORDER_DETECTIVE 37 -#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 38 -#define JOB_DISPLAY_ORDER_PRISONER 39 +#define JOB_DISPLAY_ORDER_VETERAN_ADVISOR 36 +#define JOB_DISPLAY_ORDER_WARDEN 37 +#define JOB_DISPLAY_ORDER_DETECTIVE 38 +#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 39 +#define JOB_DISPLAY_ORDER_PRISONER 40 #define DEPARTMENT_UNASSIGNED "No Department" diff --git a/code/__DEFINES/keybinding.dm b/code/__DEFINES/keybinding.dm index 285b7e6ea588f..2a2a092c6d05b 100644 --- a/code/__DEFINES/keybinding.dm +++ b/code/__DEFINES/keybinding.dm @@ -66,6 +66,7 @@ #define COMSIG_KB_MOB_ACTIVATEINHAND_DOWN "keybinding_mob_activateinhand_down" #define COMSIG_KB_MOB_DROPITEM_DOWN "keybinding_mob_dropitem_down" #define COMSIG_KB_MOB_TARGETCYCLEHEAD_DOWN "keybinding_mob_targetcyclehead_down" +#define COMSIG_KB_MOB_TARGETHEAD_DOWN "keybinding_mob_targethead_down" #define COMSIG_KB_MOB_TARGETEYES_DOWN "keybinding_mob_targeteyes_down" #define COMSIG_KB_MOB_TARGETMOUTH_DOWN "keybinding_mob_targetmouth_down" #define COMSIG_KB_MOB_TARGETRIGHTARM_DOWN "keybinding_mob_targetrightarm_down" diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 70cb8582e9c92..fe85c38bf467a 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -1,17 +1,17 @@ /// Object doesn't use any of the light systems. Should be changed to add a light source to the object. #define NO_LIGHT_SUPPORT 0 /// Light made with the lighting datums, applying a matrix. -#define STATIC_LIGHT 1 +#define COMPLEX_LIGHT 1 /// Light made by masking the lighting darkness plane. -#define MOVABLE_LIGHT 2 +#define OVERLAY_LIGHT 2 /// Light made by masking the lighting darkness plane, and is directional. -#define MOVABLE_LIGHT_DIRECTIONAL 3 +#define OVERLAY_LIGHT_DIRECTIONAL 3 ///Light made by masking the lighting darkness plane, and is a directionally focused beam. -#define MOVABLE_LIGHT_BEAM 4 +#define OVERLAY_LIGHT_BEAM 4 /// Nonesensical value for light color, used for null checks. #define NONSENSICAL_VALUE -99999 -/// Is a movable light source attached to another movable (its loc), meaning that the lighting component should go one level deeper. +/// Is our overlay light source attached to another movable (its loc), meaning that the lighting component should go one level deeper. #define LIGHT_ATTACHED (1<<0) /// Freezes a light in its current state, blocking any attempts at modification #define LIGHT_FROZEN (1<<1) diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index a6102aa6e7938..492a0a06a8850 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -161,6 +161,7 @@ #define LOG_CATEGORY_UPLINK_HERETIC "uplink-heretic" #define LOG_CATEGORY_UPLINK_MALF "uplink-malf" #define LOG_CATEGORY_UPLINK_SPELL "uplink-spell" +#define LOG_CATEGORY_UPLINK_SPY "uplink-spy" // PDA categories #define LOG_CATEGORY_PDA "pda" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index d85e62615d48b..90485367815f6 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -78,28 +78,30 @@ #define ALIEN_BODYPART "alien" #define LARVA_BODYPART "larva" -//Bodytype defines for how things can be worn, surgery, and other misc things. +//Bodytype defines for surgery, and other misc things. ///The limb is organic. #define BODYTYPE_ORGANIC (1<<0) ///The limb is robotic. #define BODYTYPE_ROBOTIC (1<<1) +///A placeholder bodytype for xeno larva, so their limbs cannot be attached to anything. +#define BODYTYPE_LARVA_PLACEHOLDER (1<<2) +///The limb is from a xenomorph. +#define BODYTYPE_ALIEN (1<<3) +///The limb is from a golem +#define BODYTYPE_GOLEM (1<<4) + +// Bodyshape defines for how things can be worn, i.e., what "shape" the mob sprite is ///The limb fits the human mold. This is not meant to be literal, if the sprite "fits" on a human, it is "humanoid", regardless of origin. -#define BODYTYPE_HUMANOID (1<<2) +#define BODYSHAPE_HUMANOID (1<<0) ///The limb fits the monkey mold. -#define BODYTYPE_MONKEY (1<<3) +#define BODYSHAPE_MONKEY (1<<1) ///The limb is digitigrade. -#define BODYTYPE_DIGITIGRADE (1<<4) +#define BODYSHAPE_DIGITIGRADE (1<<2) ///The limb is snouted. -#define BODYTYPE_SNOUTED (1<<5) -///A placeholder bodytype for xeno larva, so their limbs cannot be attached to anything. -#define BODYTYPE_LARVA_PLACEHOLDER (1<<6) -///The limb is from a xenomorph. -#define BODYTYPE_ALIEN (1<<7) -///The limb is from a golem -#define BODYTYPE_GOLEM (1<<8) +#define BODYSHAPE_SNOUTED (1<<3) -#define BODYTYPE_BIOSCRAMBLE_COMPATIBLE (BODYTYPE_HUMANOID | BODYTYPE_MONKEY | BODYTYPE_ALIEN) -#define BODYTYPE_CAN_BE_BIOSCRAMBLED(bodytype) (!(bodytype & BODYTYPE_ROBOTIC) && (bodytype & BODYTYPE_BIOSCRAMBLE_COMPATIBLE)) +#define BODYTYPE_BIOSCRAMBLE_INCOMPATIBLE (BODYTYPE_ROBOTIC | BODYTYPE_LARVA_PLACEHOLDER | BODYTYPE_GOLEM) +#define BODYTYPE_CAN_BE_BIOSCRAMBLED(bodytype) (!(bodytype & BODYTYPE_BIOSCRAMBLE_INCOMPATIBLE)) // Defines for Species IDs. Used to refer to the name of a species, for things like bodypart names or species preferences. #define SPECIES_ABDUCTOR "abductor" @@ -120,7 +122,6 @@ #define SPECIES_NIGHTMARE "nightmare" #define SPECIES_MONKEY "monkey" #define SPECIES_MONKEY_FREAK "monkey_freak" -#define SPECIES_MONKEY_HOLODECK "monkey_holodeck" #define SPECIES_MONKEY_HUMAN_LEGGED "monkey_human_legged" #define SPECIES_MOTH "moth" #define SPECIES_MUSHROOM "mush" @@ -486,9 +487,6 @@ #define ROBOTIC_BRUTE_EXAMINE_TEXT "denting" #define ROBOTIC_BURN_EXAMINE_TEXT "charring" -// If a mob has a higher threshold than this, the icon shown will be increased to the big fire icon. -#define MOB_BIG_FIRE_STACK_THRESHOLD 3 - #define GRAB_PIXEL_SHIFT_PASSIVE 6 #define GRAB_PIXEL_SHIFT_AGGRESSIVE 12 #define GRAB_PIXEL_SHIFT_NECK 16 @@ -756,8 +754,8 @@ GLOBAL_LIST_INIT(human_heights_to_offsets, list( #define WOUND_LAYER 3 /// Blood cult ascended halo layer, because there's currently no better solution for adding/removing #define HALO_LAYER 2 -/// Fire layer when you're on fire -#define FIRE_LAYER 1 +/// The highest most layer for mob overlays. Unused +#define HIGHEST_LAYER 1 #define UPPER_BODY "upper body" #define LOWER_BODY "lower body" @@ -798,7 +796,7 @@ GLOBAL_LIST_INIT(layers_to_offset, list( // BODY_BEHIND_LAYER (external organs like wings) // BODY_FRONT_LAYER (external organs like wings) // DAMAGE_LAYER (full body) - // FIRE_LAYER (full body) + // HIGHEST_LAYER (full body) // UNIFORM_LAYER (full body) // WOUND_LAYER (full body) )) diff --git a/code/__DEFINES/random_spawner.dm b/code/__DEFINES/random_spawner.dm new file mode 100644 index 0000000000000..2a012e7904860 --- /dev/null +++ b/code/__DEFINES/random_spawner.dm @@ -0,0 +1,3 @@ +///Used by bedsheets spawners to tell if it's a single or double bedsheet. +#define BEDSHEET_SINGLE "single" +#define BEDSHEET_DOUBLE "double" diff --git a/code/__DEFINES/research/anomalies.dm b/code/__DEFINES/research/anomalies.dm index 12a114439c7d9..707b7bd7a02e1 100644 --- a/code/__DEFINES/research/anomalies.dm +++ b/code/__DEFINES/research/anomalies.dm @@ -7,6 +7,7 @@ #define MAX_CORES_HALLUCINATION 8 #define MAX_CORES_BIOSCRAMBLER 8 #define MAX_CORES_DIMENSIONAL 8 +#define MAX_CORES_ECTOPLASMIC 8 ///Defines for the different types of explosion a flux anomaly can have #define FLUX_NO_EXPLOSION 0 diff --git a/code/__DEFINES/research/research_categories.dm b/code/__DEFINES/research/research_categories.dm index 65de3edca532e..3f6428eb73178 100644 --- a/code/__DEFINES/research/research_categories.dm +++ b/code/__DEFINES/research/research_categories.dm @@ -187,6 +187,7 @@ #define RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS "/Cybernetic Implanting Tools" #define RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY "/Cybernetic Utility Implants" #define RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_MISC "/Cybernetic Miscellaneous Implants" +#define RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_SECURITY "/Cybernetic Security Implants" #define RND_SUBCATEGORY_CYBERNETICS_ADVANCED_LIMBS "/Cybernetic Advanced Limbs" // Limb Categories diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 3d41921e0ea00..09b07295beca0 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -16,6 +16,7 @@ #define ROLE_OPERATIVE "Operative" #define ROLE_TRAITOR "Traitor" #define ROLE_WIZARD "Wizard" +#define ROLE_SPY "Spy" // Midround roles #define ROLE_ABDUCTOR "Abductor" @@ -128,6 +129,7 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_REV_HEAD = 14, ROLE_TRAITOR = 0, ROLE_WIZARD = 14, + ROLE_SPY = 0, // Midround ROLE_ABDUCTOR = 0, diff --git a/code/__DEFINES/stat_tracking.dm b/code/__DEFINES/stat_tracking.dm index d143e5df4c70e..9bd697440406c 100644 --- a/code/__DEFINES/stat_tracking.dm +++ b/code/__DEFINES/stat_tracking.dm @@ -54,7 +54,8 @@ #define EXPORT_STATS_TO_FILE_LATER(filename, costs, counts, proc) \ do { \ var/static/last_export = 0; \ - if (world.time - last_export > 1.1 SECONDS) { \ + /* Need to always run if we haven't yet, since this code can be placed ANYWHERE */ \ + if (world.time - last_export > 1.1 SECONDS || (last_export == 0)) { \ last_export = world.time; \ /* spawn() is used here because this is often used to track init times, where timers act oddly. */ \ /* I was making timers and even after init times were complete, the timers didn't run :shrug: */ \ diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 768f1faa514f1..4e901c4ba2ce2 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -31,6 +31,11 @@ /// If the incapacitated status effect will ignore a mob being agressively grabbed #define IGNORE_GRAB (1<<2) +/// Maxamounts of fire stacks a mob can get +#define MAX_FIRE_STACKS 20 +/// If a mob has a higher threshold than this, the icon shown will be increased to the big fire icon. +#define MOB_BIG_FIRE_STACK_THRESHOLD 3 + // Grouped effect sources, see also code/__DEFINES/traits.dm #define STASIS_MACHINE_EFFECT "stasis_machine" diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index fdfec5e8ca086..a4fb6d40be73e 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "7.0.2" +#define TGS_DMAPI_VERSION "7.1.1" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -50,6 +50,13 @@ #endif +#ifndef TGS_FILE2TEXT_NATIVE +#ifdef file2text +#error Your codebase is re-defining the BYOND proc file2text. The DMAPI requires the native version to read the result of world.Export(). You can fix this by adding "#define TGS_FILE2TEXT_NATIVE file2text" before your override of file2text to allow the DMAPI to use the native version. This will only be used for world.Export(), not regular file accesses +#endif +#define TGS_FILE2TEXT_NATIVE file2text +#endif + // EVENT CODES /// Before a reboot mode change, extras parameters are the current and new reboot mode enums. @@ -490,6 +497,16 @@ /world/proc/TgsChatChannelInfo() return +/** + * Trigger an event in TGS. Requires TGS version >= 6.3.0. Returns [TRUE] if the event was triggered successfully, [FALSE] otherwise. This function may sleep! + * + * event_name - The name of the event to trigger + * parameters - Optional list of string parameters to pass as arguments to the event script. The first parameter passed to a script will always be the running game's directory followed by these parameters. + * wait_for_completion - If set, this function will not return until the event has run to completion. + */ +/world/proc/TgsTriggerEvent(event_name, list/parameters, wait_for_completion = FALSE) + return + /* The MIT License diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 867f567be00fa..eef432fb2edfe 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -211,8 +211,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_BLOOD_DEFICIENCY "blood_deficiency" #define TRAIT_JOLLY "jolly" #define TRAIT_NOCRITDAMAGE "no_crit" -/// Prevents shovies against a dense object from knocking them down. -#define TRAIT_SHOVE_KNOCKDOWN_BLOCKED "shove_knockdown_blocked" +/// Prevents shovies and some strong blows such as unarmed punches and (unreliably) tackles the owner down +#define TRAIT_BRAWLING_KNOCKDOWN_BLOCKED "brawling_knockdown_blocked" +/// Prevents some severe head injuries being sustained from heavy collisions or blunt force injuries. +#define TRAIT_HEAD_INJURY_BLOCKED "head_injury_blocked" /// Prevents staggering. #define TRAIT_NO_STAGGER "no_stagger" /// Getting hit by thrown movables won't push you away @@ -317,6 +319,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Is a medbot healing you #define TRAIT_MEDIBOTCOMINGTHROUGH "medbot" #define TRAIT_PASSTABLE "passtable" +/// Lets you fly through windows +#define TRAIT_PASSWINDOW "passwindow" /// Makes you immune to flashes #define TRAIT_NOFLASH "noflash" /// prevents xeno huggies implanting skeletons @@ -341,6 +345,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_DEL_ON_SPACE_DUMP "del_on_hyperspace_leave" /// We can walk up or around cliffs, or at least we don't fall off of it #define TRAIT_CLIFF_WALKER "cliff_walker" +/// This means the user is currently holding/wearing a "tactical camouflage" item (like a potted plant). +#define TRAIT_TACTICALLY_CAMOUFLAGED "tactically_camouflaged" /// Gets double arcade prizes #define TRAIT_GAMERGOD "gamer-god" #define TRAIT_GIANT "giant" @@ -353,10 +359,13 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_TUMOR_SUPPRESSED "brain_tumor_suppressed" /// Prevents hallucinations from the hallucination brain trauma (RDS) #define TRAIT_RDS_SUPPRESSED "rds_suppressed" -/// mobs that have this trait cannot be extinguished -#define TRAIT_PERMANENTLY_ONFIRE "permanently_onfire" +/// Mobs that have this trait cannot be extinguished +#define TRAIT_NO_EXTINGUISH "no_extinguish" /// Indicates if the mob is currently speaking with sign language #define TRAIT_SIGN_LANG "sign_language" +/// Trait given to mobs to indicate that they can catch papers thrown at them midair without trying, +/// and make syndicate airplanes when folding paper up. +#define TRAIT_PAPER_MASTER "paper_master" /// This mob is able to use sign language over the radio. #define TRAIT_CAN_SIGN_ON_COMMS "can_sign_on_comms" /// nobody can use martial arts on this mob @@ -425,6 +434,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_FOV_APPLIED "fov_applied" /// Mob is using the scope component #define TRAIT_USER_SCOPED "user_scoped" +/// Mob is unable to feel pain +#define TRAIT_ANALGESIA "analgesia" /// Trait added when a revenant is visible. #define TRAIT_REVENANT_REVEALED "revenant_revealed" @@ -601,6 +612,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_LAVA_STOPPED "lava_stopped" ///Chasms will be safe to cross while they've this trait. #define TRAIT_CHASM_STOPPED "chasm_stopped" +///Chasms will be safe to cross if there is something with this trait on it +#define TRAIT_CHASM_STOPPER "chasm_stopper" ///The effects of the immerse element will be halted while this trait is present. #define TRAIT_IMMERSE_STOPPED "immerse_stopped" /// The effects of hyperspace drift are blocked when the tile has this trait @@ -630,6 +643,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Used by the honkspam element to avoid spamming the sound. Amusing considering its name. #define TRAIT_HONKSPAMMING "trait_honkspamming" +/// Required by the waddling element since there are multiple sources of it. +#define TRAIT_WADDLING "trait_waddling" ///Used for managing KEEP_TOGETHER in [/atom/var/appearance_flags] #define TRAIT_KEEP_TOGETHER "keep-together" diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index f9cdbe4326d1e..dd237bf54b704 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -41,6 +41,9 @@ /// Trait from light debugging #define LIGHT_DEBUG_TRAIT "light-debug" +/// Trait given by an Action datum +#define ACTION_TRAIT "action" + #define CLOTHING_TRAIT "clothing" #define HELMET_TRAIT "helmet" /// inherited from the mask @@ -180,6 +183,8 @@ #define TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM "element-required" /// Trait applied by MODsuits. #define MOD_TRAIT "mod" +/// Trait applied to tram passengers +#define TRAM_PASSENGER_TRAIT "tram-passenger" /// Trait granted by the berserker hood. #define BERSERK_TRAIT "berserk_trait" @@ -279,3 +284,6 @@ #define ORGAN_INSIDE_BODY_TRAIT "organ_inside_body" /// Trait when something was labelled by a pen. #define PEN_LABEL_TRAIT "pen_label" + +/// Trait when a drink was renamed by a shaker +#define SHAKER_LABEL_TRAIT "shaker_trait" diff --git a/code/__DEFINES/uplink.dm b/code/__DEFINES/uplink.dm index d6412e0e4d150..bb92f0672c3a7 100644 --- a/code/__DEFINES/uplink.dm +++ b/code/__DEFINES/uplink.dm @@ -12,6 +12,9 @@ /// This item is purchasable to infiltrators (midround traitors) #define UPLINK_INFILTRATORS (1 << 3) +/// Can be randomly given to spies for their bounties +#define UPLINK_SPY (1 << 4) + /// Progression gets turned into a user-friendly form. This is just an abstract equation that makes progression not too large. #define DISPLAY_PROGRESSION(time) round(time/60, 0.01) @@ -19,3 +22,12 @@ #define TRAITOR_DISCOUNT_BIG "big_discount" #define TRAITOR_DISCOUNT_AVERAGE "average_discount" #define TRAITOR_DISCOUNT_SMALL "small_discount" + +/// Typepath used for uplink items which don't actually produce an item (essentially just a placeholder) +/// Future todo: Make this not necessary / make uplink items support item-less items natively +#define ABSTRACT_UPLINK_ITEM /obj/effect/gibspawner/generic + +/// Lower threshold for which an uplink items's TC cost is considered "low" for spy bounties picking rewards +#define SPY_LOWER_COST_THRESHOLD 5 +/// Upper threshold for which an uplink items's TC cost is considered "high" for spy bounties picking rewards +#define SPY_UPPER_COST_THRESHOLD 12 diff --git a/code/__HELPERS/colors.dm b/code/__HELPERS/colors.dm index 4742118bebeed..9f17d4c0028cb 100644 --- a/code/__HELPERS/colors.dm +++ b/code/__HELPERS/colors.dm @@ -47,24 +47,24 @@ var/list/color = rgb2num(HTMLstring) return rgb(255 - color[1], 255 - color[2], 255 - color[3]) -///Flash a color on the client +///Flash a color on the passed mob /proc/flash_color(mob_or_client, flash_color="#960000", flash_time=20) - var/client/flashed_client + var/mob/flashed_mob if(ismob(mob_or_client)) - var/mob/client_mob = mob_or_client - if(client_mob.client) - flashed_client = client_mob.client - else - return + flashed_mob = mob_or_client else if(istype(mob_or_client, /client)) - flashed_client = mob_or_client + var/client/flashed_client = mob_or_client + flashed_mob = flashed_client.mob - if(!istype(flashed_client)) + if(!istype(flashed_mob)) return - var/animate_color = flashed_client.color - flashed_client.color = flash_color - animate(flashed_client, color = animate_color, time = flash_time) + var/datum/client_colour/temp/temp_color = new(flashed_mob) + temp_color.colour = flash_color + temp_color.fade_in = flash_time * 0.25 + temp_color.fade_out = flash_time * 0.25 + QDEL_IN(temp_color, (flash_time * 0.5) + 1) + flashed_mob.add_client_colour(temp_color) /// Blends together two colors (passed as 3 or 4 length lists) using the screen blend mode /// Much like multiply, screen effects the brightness of the resulting color @@ -103,4 +103,3 @@ #define RANDOM_COLOUR (rgb(rand(0,255),rand(0,255),rand(0,255))) - diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index d4a4192614e6c..f7889f0b5af80 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -25,7 +25,6 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/wings_open, GLOB.wings_open_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, GLOB.frills_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, GLOB.animated_spines_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/tail_spines, GLOB.tail_spines_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, GLOB.legs_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/caps, GLOB.caps_list) diff --git a/code/__HELPERS/logging/antagonists.dm b/code/__HELPERS/logging/antagonists.dm index 3d06bb325ec35..5df39c69adef3 100644 --- a/code/__HELPERS/logging/antagonists.dm +++ b/code/__HELPERS/logging/antagonists.dm @@ -21,3 +21,7 @@ /// Logging for wizard powers learned /proc/log_spellbook(text, list/data) logger.Log(LOG_CATEGORY_UPLINK_SPELL, text, data) + +/// Logs bounties completed by spies and their rewards +/proc/log_spy(text, list/data) + logger.Log(LOG_CATEGORY_UPLINK_SPY, text, data) diff --git a/code/__HELPERS/memory_helpers.dm b/code/__HELPERS/memory_helpers.dm index bc916b2d20fb6..807610af86459 100644 --- a/code/__HELPERS/memory_helpers.dm +++ b/code/__HELPERS/memory_helpers.dm @@ -113,6 +113,11 @@ /datum/mind/proc/wipe_memory() QDEL_LIST_ASSOC_VAL(memories) +/// Helder to wipe the passed memory type ONLY from our list of memories +/datum/mind/proc/wipe_memory_type(memory_type) + qdel(memories[memory_type]) + memories -= memory_type + /// Helper to create quick copies of all of our memories /// Quick copies aren't full copies - just basic copies containing necessities. /// They cannot be used in stories. diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index a8cbdf950be93..2ef37b545cf9c 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -451,6 +451,19 @@ GLOBAL_LIST_EMPTY(species_list) if(!HAS_TRAIT(L, TRAIT_PASSTABLE)) L.pass_flags &= ~PASSTABLE +/proc/passwindow_on(target, source) + var/mob/living/target_mob = target + if (!HAS_TRAIT(target_mob, TRAIT_PASSWINDOW) && target_mob.pass_flags & PASSWINDOW) + ADD_TRAIT(target_mob, TRAIT_PASSWINDOW, INNATE_TRAIT) + ADD_TRAIT(target_mob, TRAIT_PASSWINDOW, source) + target_mob.pass_flags |= PASSWINDOW + +/proc/passwindow_off(target, source) + var/mob/living/target_mob = target + REMOVE_TRAIT(target_mob, TRAIT_PASSWINDOW, source) + if(!HAS_TRAIT(target_mob, TRAIT_PASSWINDOW)) + target_mob.pass_flags &= ~PASSWINDOW + /proc/dance_rotate(atom/movable/AM, datum/callback/callperrotate, set_original_dir=FALSE) set waitfor = FALSE var/originaldir = AM.dir diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index a099199cce082..df84c1cdcf42a 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -386,3 +386,33 @@ temp_gender = gender if(temp_gender != PLURAL) return "es" + +/datum/mind/p_they(temp_gender) + return current?.p_they(temp_gender) || ..() + +/datum/mind/p_their(temp_gender) + return current?.p_their(temp_gender) || ..() + +/datum/mind/p_theirs(temp_gender) + return current?.p_theirs(temp_gender) || ..() + +/datum/mind/p_them(capitalized, temp_gender) + return current?.p_them(capitalized, temp_gender) || ..() + +/datum/mind/p_have(temp_gender) + return current?.p_have(temp_gender) || ..() + +/datum/mind/p_are(temp_gender) + return current?.p_are(temp_gender) || ..() + +/datum/mind/p_were(temp_gender) + return current?.p_were(temp_gender) || ..() + +/datum/mind/p_do(temp_gender) + return current?.p_do(temp_gender) || ..() + +/datum/mind/p_s(temp_gender) + return current?.p_s(temp_gender) || ..() + +/datum/mind/p_es(temp_gender) + return current?.p_es(temp_gender) || ..() diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm index 069bf55576f66..32a570ae8fc11 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/__HELPERS/turfs.dm @@ -228,13 +228,13 @@ Turf and target are separate in case you want to teleport some distance from a t //Find checked_atom's matrix so we can use it's X/Y pixel shifts var/matrix/atom_matrix = matrix(checked_atom.transform) - var/pixel_x_offset = checked_atom.pixel_x + atom_matrix.get_x_shift() - var/pixel_y_offset = checked_atom.pixel_y + atom_matrix.get_y_shift() + var/pixel_x_offset = checked_atom.pixel_x + checked_atom.pixel_w + atom_matrix.get_x_shift() + var/pixel_y_offset = checked_atom.pixel_y + checked_atom.pixel_z + atom_matrix.get_y_shift() //Irregular objects var/list/icon_dimensions = get_icon_dimensions(checked_atom.icon) - var/checked_atom_icon_height = icon_dimensions["width"] - var/checked_atom_icon_width = icon_dimensions["height"] + var/checked_atom_icon_height = icon_dimensions["height"] + var/checked_atom_icon_width = icon_dimensions["width"] if(checked_atom_icon_height != world.icon_size || checked_atom_icon_width != world.icon_size) pixel_x_offset += ((checked_atom_icon_width / world.icon_size) - 1) * (world.icon_size * 0.5) pixel_y_offset += ((checked_atom_icon_height / world.icon_size) - 1) * (world.icon_size * 0.5) diff --git a/code/__HELPERS/type_processing.dm b/code/__HELPERS/type_processing.dm index 117067a057828..dfd74f7e3c6bc 100644 --- a/code/__HELPERS/type_processing.dm +++ b/code/__HELPERS/type_processing.dm @@ -1,14 +1,60 @@ /proc/make_types_fancy(list/types) if (ispath(types)) types = list(types) - . = list() - for(var/type in types) - var/typename = "[type]" - // Longest paths comes first - var/static/list/TYPES_SHORTCUTS = list( - /obj/effect/decal/cleanable = "CLEANABLE", + var/static/list/types_to_replacement + var/static/list/replacement_to_text + if(!types_to_replacement) + // Longer paths come after shorter ones, try and keep the structure + var/list/work_from = list( + /datum = "DATUM", + /area = "AREA", + /atom/movable = "MOVABLE", + /obj = "OBJ", + /turf = "TURF", + /turf/closed = "CLOSED", + /turf/open = "OPEN", + + /mob = "MOB", + /mob/living = "LIVING", + /mob/living/carbon = "CARBON", + /mob/living/carbon/human = "HUMANOID", + /mob/living/simple_animal = "SIMPLE", + /mob/living/basic = "BASIC", + /mob/living/silicon = "SILICON", + /mob/living/silicon/robot = "CYBORG", + + /obj/item = "ITEM", + /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", + /obj/item/mecha_parts/mecha_equipment/weapon = "MECHA_WEAPON", + /obj/item/organ = "ORGAN", + /obj/item/mod/control = "MODSUIT", + /obj/item/mod/module = "MODSUIT_MOD", + /obj/item/gun = "GUN", + /obj/item/gun/magic = "GUN_MAGIC", + /obj/item/gun/energy = "GUN_ENERGY", + /obj/item/gun/energy/laser = "GUN_LASER", + /obj/item/gun/ballistic = "GUN_BALLISTIC", + /obj/item/gun/ballistic/automatic = "GUN_AUTOMATIC", + /obj/item/gun/ballistic/revolver = "GUN_REVOLVER", + /obj/item/gun/ballistic/rifle = "GUN_RIFLE", + /obj/item/gun/ballistic/shotgun = "GUN_SHOTGUN", + /obj/item/stack/sheet = "SHEET", + /obj/item/stack/sheet/mineral = "MINERAL_SHEET", + /obj/item/stack/ore = "ORE", + /obj/item/ai_module = "AI_LAW_MODULE", + /obj/item/circuitboard = "CIRCUITBOARD", + /obj/item/circuitboard/machine = "MACHINE_BOARD", + /obj/item/circuitboard/computer = "COMPUTER_BOARD", + /obj/item/reagent_containers = "REAGENT_CONTAINERS", + /obj/item/reagent_containers/pill = "PILL", + /obj/item/reagent_containers/pill/patch = "MEDPATCH", + /obj/item/reagent_containers/hypospray/medipen = "MEDIPEN", + /obj/item/reagent_containers/cup/glass = "DRINK", + /obj/item/food = "FOOD", /obj/item/bodypart = "BODYPART", + /obj/effect/decal/cleanable = "CLEANABLE", /obj/item/radio/headset = "HEADSET", + /obj/item/clothing = "CLOTHING", /obj/item/clothing/accessory = "ACCESSORY", /obj/item/clothing/mask/gas = "GASMASK", /obj/item/clothing/mask = "MASK", @@ -21,75 +67,45 @@ /obj/item/clothing/head/helmet = "HELMET", /obj/item/clothing/head = "HEAD", /obj/item/clothing/neck = "NECK", - /obj/item/clothing = "CLOTHING", /obj/item/storage/backpack = "BACKPACK", /obj/item/storage/belt = "BELT", - /obj/item/book/manual = "MANUAL", /obj/item/storage/pill_bottle = "PILL_BOTTLE", - /obj/item/reagent_containers/pill/patch = "MEDPATCH", - /obj/item/reagent_containers/pill = "PILL", - /obj/item/reagent_containers/hypospray/medipen = "MEDIPEN", - /obj/item/reagent_containers/cup/glass = "DRINK", - /obj/item/food = "FOOD", - /obj/item/reagent_containers = "REAGENT_CONTAINERS", - /obj/machinery/atmospherics = "ATMOS_MECH", - /obj/machinery/portable_atmospherics = "PORT_ATMOS", - /obj/item/mecha_parts/mecha_equipment/weapon = "MECHA_WEAPON", - /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", - /obj/item/organ = "ORGAN", - /obj/item/mod/control = "MODSUIT", - /obj/item/mod/module = "MODSUIT_MOD", - /obj/item/gun/ballistic/automatic = "GUN_AUTOMATIC", - /obj/item/gun/ballistic/revolver = "GUN_REVOLVER", - /obj/item/gun/ballistic/rifle = "GUN_RIFLE", - /obj/item/gun/ballistic/shotgun = "GUN_SHOTGUN", - /obj/item/gun/ballistic = "GUN_BALLISTIC", - /obj/item/gun/energy/laser = "GUN_LASER", - /obj/item/gun/energy = "GUN_ENERGY", - /obj/item/gun/magic = "GUN_MAGIC", - /obj/item/gun = "GUN", - /obj/item/stack/sheet/mineral = "MINERAL_SHEET", - /obj/item/stack/sheet = "SHEET", - /obj/item/stack/ore = "ORE", - /obj/item/ai_module = "AI_LAW_MODULE", - /obj/item/circuitboard/machine = "MACHINE_BOARD", - /obj/item/circuitboard/computer = "COMPUTER_BOARD", - /obj/item/circuitboard = "CIRCUITBOARD", - /obj/item = "ITEM", - /obj/structure/closet/crate/secure = "LOCKED_CRATE", + /obj/item/book/manual = "MANUAL", + + /obj/structure = "STRUCTURE", + /obj/structure/closet = "CLOSET", /obj/structure/closet/crate = "CRATE", + /obj/structure/closet/crate/secure = "LOCKED_CRATE", /obj/structure/closet/secure_closet = "LOCKED_CLOSET", - /obj/structure/closet = "CLOSET", - /obj/structure = "STRUCTURE", - /obj/machinery/door/airlock = "AIRLOCK", + + /obj/machinery = "MACHINERY", + /obj/machinery/atmospherics = "ATMOS_MECH", + /obj/machinery/portable_atmospherics = "PORT_ATMOS", /obj/machinery/door = "DOOR", + /obj/machinery/door/airlock = "AIRLOCK", /obj/machinery/rnd/production = "RND_FABRICATOR", - /obj/machinery/computer/camera_advanced/shuttle_docker = "DOCKING_COMPUTER", /obj/machinery/computer = "COMPUTER", - /obj/machinery/vending/wardrobe = "JOBDROBE", + /obj/machinery/computer/camera_advanced/shuttle_docker = "DOCKING_COMPUTER", /obj/machinery/vending = "VENDING", - /obj/machinery = "MACHINERY", + /obj/machinery/vending/wardrobe = "JOBDROBE", /obj/effect = "EFFECT", /obj/projectile = "PROJECTILE", - /obj = "O", - /datum = "D", - /turf/open = "OPEN", - /turf/closed = "CLOSED", - /turf = "T", - /mob/living/carbon/human = "HUMANOID", - /mob/living/carbon = "CARBON", - /mob/living/simple_animal = "SIMPLE", - /mob/living/basic = "BASIC", - /mob/living/silicon/robot = "CYBORG", - /mob/living/silicon = "SILICON", - /mob/living = "LIVING", - /mob = "M", ) - for (var/tn in TYPES_SHORTCUTS) - if(copytext(typename, 1, length("[tn]/") + 1) == "[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ ) - typename = TYPES_SHORTCUTS[tn] + copytext(typename, length("[tn]/")) - break - .[typename] = type + // ignore_root_path so we can draw the root normally + types_to_replacement = zebra_typecacheof(work_from, ignore_root_path = TRUE) + replacement_to_text = list() + for(var/key in work_from) + replacement_to_text[work_from[key]] = "[key]" + + . = list() + for(var/type in types) + var/replace_with = types_to_replacement[type] + if(!replace_with) + .["[type]"] = type + continue + var/cut_out = replacement_to_text[replace_with] + // + 1 to account for / + .[replace_with + copytext("[type]", length(cut_out) + 1)] = type /proc/get_fancy_list_of_atom_types() var/static/list/pre_generated_list diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index ccfffecd7eb95..4135428194b8f 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -302,6 +302,7 @@ DEFINE_BITFIELD(pass_flags, list( "PASSGRILLE" = PASSGRILLE, "PASSMOB" = PASSMOB, "PASSTABLE" = PASSTABLE, + "PASSWINDOW" = PASSWINDOW, )) DEFINE_BITFIELD(resistance_flags, list( @@ -373,10 +374,6 @@ DEFINE_BITFIELD(reaction_flags, list( DEFINE_BITFIELD(bodytype, list( "BODYTYPE_ORGANIC" = BODYTYPE_ORGANIC, "BODYTYPE_ROBOTIC" = BODYTYPE_ROBOTIC, - "BODYTYPE_HUMANOID" = BODYTYPE_HUMANOID, - "BODYTYPE_MONKEY" = BODYTYPE_MONKEY, - "BODYTYPE_DIGITIGRADE" = BODYTYPE_DIGITIGRADE, - "BODYTYPE_SNOUTED" = BODYTYPE_SNOUTED, "BODYTYPE_LARVA_PLACEHOLDER" = BODYTYPE_LARVA_PLACEHOLDER, "BODYTYPE_ALIEN" = BODYTYPE_ALIEN, "BODYTYPE_GOLEM" = BODYTYPE_GOLEM, @@ -385,15 +382,25 @@ DEFINE_BITFIELD(bodytype, list( DEFINE_BITFIELD(acceptable_bodytype, list( "BODYTYPE_ORGANIC" = BODYTYPE_ORGANIC, "BODYTYPE_ROBOTIC" = BODYTYPE_ROBOTIC, - "BODYTYPE_HUMANOID" = BODYTYPE_HUMANOID, - "BODYTYPE_MONKEY" = BODYTYPE_MONKEY, - "BODYTYPE_DIGITIGRADE" = BODYTYPE_DIGITIGRADE, - "BODYTYPE_SNOUTED" = BODYTYPE_SNOUTED, "BODYTYPE_LARVA_PLACEHOLDER" = BODYTYPE_LARVA_PLACEHOLDER, "BODYTYPE_ALIEN" = BODYTYPE_ALIEN, "BODYTYPE_GOLEM" = BODYTYPE_GOLEM, )) +DEFINE_BITFIELD(bodyshape, list( + "BODYSHAPE_HUMANOID" = BODYSHAPE_HUMANOID, + "BODYSHAPE_MONKEY" = BODYSHAPE_MONKEY, + "BODYSHAPE_DIGITIGRADE" = BODYSHAPE_DIGITIGRADE, + "BODYSHAPE_SNOUTED" = BODYSHAPE_SNOUTED, +)) + +DEFINE_BITFIELD(acceptable_bodyshape, list( + "BODYSHAPE_HUMANOID" = BODYSHAPE_HUMANOID, + "BODYSHAPE_MONKEY" = BODYSHAPE_MONKEY, + "BODYSHAPE_DIGITIGRADE" = BODYSHAPE_DIGITIGRADE, + "BODYSHAPE_SNOUTED" = BODYSHAPE_SNOUTED, +)) + DEFINE_BITFIELD(bodypart_flags, list( "BODYPART_UNREMOVABLE" = BODYPART_UNREMOVABLE, "BODYPART_PSEUDOPART" = BODYPART_PSEUDOPART, @@ -442,6 +449,8 @@ DEFINE_BITFIELD(organ_flags, list( "ORGAN_VITAL" = ORGAN_VITAL, "ORGAN_EDIBLE" = ORGAN_EDIBLE, "ORGAN_UNREMOVABLE" = ORGAN_UNREMOVABLE, + "ORGAN_HIDDEN" = ORGAN_HIDDEN, + "ORGAN_VIRGIN" = ORGAN_VIRGIN, )) DEFINE_BITFIELD(respiration_type, list( diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm index 893d5de66cee7..8a1493e383dbc 100644 --- a/code/_globalvars/game_modes.dm +++ b/code/_globalvars/game_modes.dm @@ -7,3 +7,5 @@ GLOBAL_DATUM(start_state, /datum/station_state) // Used in round-end report /// We want reality_smash_tracker to exist only once and be accessible from anywhere. GLOBAL_DATUM_INIT(reality_smash_track, /datum/reality_smash_tracker, new) + +GLOBAL_DATUM(deathmatch_game, /datum/deathmatch_controller) // Deathmatch Minigame controller diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 38072aaec01e7..ce4d847928988 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -26,7 +26,6 @@ GLOBAL_LIST_EMPTY(frills_list) GLOBAL_LIST_EMPTY(spines_list) GLOBAL_LIST_EMPTY(tail_spines_list) GLOBAL_LIST_EMPTY(legs_list) -GLOBAL_LIST_EMPTY(animated_spines_list) //Mutant Human bits GLOBAL_LIST_EMPTY(tails_list_human) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index d95a46c8be249..36f96bcc563e0 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -302,6 +302,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items /obj/item/pen/survival = 1, /obj/item/restraints/handcuffs = 1, /obj/item/shield/buckler = 1, + /obj/item/shield/improvised = 1, /obj/item/throwing_star = 1, /obj/item/weldingtool/hugetank = 1, /obj/item/fishing_rod/telescopic/master = 1, diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index aba502d16ee71..15715ebd0a050 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -64,7 +64,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_UNIQUE_IMMERSE" = TRAIT_UNIQUE_IMMERSE, "TRAIT_VOIDSTORM_IMMUNE" = TRAIT_VOIDSTORM_IMMUNE, "TRAIT_WAS_RENAMED" = TRAIT_WAS_RENAMED, + "TRAIT_WADDLING" = TRAIT_WADDLING, "TRAIT_WEATHER_IMMUNE" = TRAIT_WEATHER_IMMUNE, + "TRAIT_CHASM_STOPPER" = TRAIT_CHASM_STOPPER, ), /datum/controller/subsystem/economy = list( "TRAIT_MARKET_CRASHING" = TRAIT_MARKET_CRASHING, @@ -117,6 +119,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ALLOW_HERETIC_CASTING" = TRAIT_ALLOW_HERETIC_CASTING, "TRAIT_ALWAYS_NO_ACCESS" = TRAIT_ALWAYS_NO_ACCESS, "TRAIT_ALWAYS_WANTED" = TRAIT_ALWAYS_WANTED, + "TRAIT_ANALGESIA" = TRAIT_ANALGESIA, "TRAIT_ANGELIC" = TRAIT_ANGELIC, "TRAIT_ANTENNAE" = TRAIT_ANTENNAE, "TRAIT_ANTICONVULSANT" = TRAIT_ANTICONVULSANT, @@ -137,6 +140,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BONSAI" = TRAIT_BONSAI, "TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER, "TRAIT_BRAINWASHING" = TRAIT_BRAINWASHING, + "TRAIT_BRAWLING_KNOCKDOWN_BLOCKED" = TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, "TRAIT_BYPASS_EARLY_IRRADIATED_CHECK" = TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, "TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES, "TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED, @@ -234,6 +238,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_HAS_CRANIAL_FISSURE" = TRAIT_HAS_CRANIAL_FISSURE, "TRAIT_HAS_MARKINGS" = TRAIT_HAS_MARKINGS, "TRAIT_HATED_BY_DOGS" = TRAIT_HATED_BY_DOGS, + "TRAIT_HEAD_INJURY_BLOCKED" = TRAIT_HEAD_INJURY_BLOCKED, "TRAIT_HEALS_FROM_CARP_RIFTS" = TRAIT_HEALS_FROM_CARP_RIFTS, "TRAIT_HEALS_FROM_CULT_PYLONS" = TRAIT_HEALS_FROM_CULT_PYLONS, "TRAIT_HEAR_THROUGH_DARKNESS" = TRAIT_HEAR_THROUGH_DARKNESS, @@ -269,13 +274,11 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, "TRAIT_LITERATE" = TRAIT_LITERATE, "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, - "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, "TRAIT_MADNESS_IMMUNE" = TRAIT_MADNESS_IMMUNE, "TRAIT_MAGICALLY_GIFTED" = TRAIT_MAGICALLY_GIFTED, "TRAIT_MAGICALLY_PHASED" = TRAIT_MAGICALLY_PHASED, "TRAIT_MARTIAL_ARTS_IMMUNE" = TRAIT_MARTIAL_ARTS_IMMUNE, "TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH, - "TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH, "TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD, "TRAIT_MESON_VISION" = TRAIT_MESON_VISION, "TRAIT_MIME_FAN" = TRAIT_MIME_FAN, @@ -318,6 +321,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NO_DEBRAIN_OVERLAY" = TRAIT_NO_DEBRAIN_OVERLAY, "TRAIT_NO_DNA_COPY" = TRAIT_NO_DNA_COPY, "TRAIT_NO_DNA_SCRAMBLE" = TRAIT_NO_DNA_SCRAMBLE, + "TRAIT_NO_EXTINGUISH" = TRAIT_NO_EXTINGUISH, "TRAIT_NO_FLOATING_ANIM" = TRAIT_NO_FLOATING_ANIM, "TRAIT_NO_GLIDE" = TRAIT_NO_GLIDE, "TRAIT_NO_GUN_AKIMBO" = TRAIT_NO_GUN_AKIMBO, @@ -351,9 +355,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PARALYSIS_R_LEG" = TRAIT_PARALYSIS_R_LEG, "TRAIT_PARROT_PERCHED" = TRAIT_PARROT_PERCHED, "TRAIT_PASSTABLE" = TRAIT_PASSTABLE, + "TRAIT_PASSWINDOW" = TRAIT_PASSWINDOW, "TRAIT_PERFECT_ATTACKER" = TRAIT_PERFECT_ATTACKER, "TRAIT_PERMANENTLY_MORTAL" = TRAIT_PERMANENTLY_MORTAL, - "TRAIT_PERMANENTLY_ONFIRE" = TRAIT_PERMANENTLY_ONFIRE, "TRAIT_PHOTOGRAPHER" = TRAIT_PHOTOGRAPHER, "TRAIT_PIERCEIMMUNE" = TRAIT_PIERCEIMMUNE, "TRAIT_PLANT_SAFE" = TRAIT_PLANT_SAFE, @@ -397,8 +401,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SHAVED" = TRAIT_SHAVED, "TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES, "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, - "TRAIT_SHOVE_KNOCKDOWN_BLOCKED" = TRAIT_SHOVE_KNOCKDOWN_BLOCKED, "TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG, + "TRAIT_PAPER_MASTER" = TRAIT_PAPER_MASTER, "TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS, "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, "TRAIT_SKITTISH" = TRAIT_SKITTISH, @@ -428,6 +432,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_TACKLING_FRAIL_ATTACKER" = TRAIT_TACKLING_FRAIL_ATTACKER, "TRAIT_TACKLING_TAILED_DEFENDER" = TRAIT_TACKLING_TAILED_DEFENDER, "TRAIT_TACKLING_WINGED_ATTACKER" = TRAIT_TACKLING_WINGED_ATTACKER, + "TRAIT_TACTICALLY_CAMOUFLAGED" = TRAIT_TACTICALLY_CAMOUFLAGED, "TRAIT_TAGGER" = TRAIT_TAGGER, "TRAIT_TEMPORARY_BODY" = TRAIT_TEMPORARY_BODY, "TRAIT_TENACIOUS" = TRAIT_TENACIOUS, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index c2148f2b7b698..7a91d898620b9 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -113,7 +113,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, "TRAIT_LITERATE" = TRAIT_LITERATE, "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, - "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, + "TRAIT_MAGICALLY_GIFTED" = TRAIT_MAGICALLY_GIFTED, "TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD, "TRAIT_MIME_FAN" = TRAIT_MIME_FAN, "TRAIT_MIMING" = TRAIT_MIMING, @@ -129,6 +129,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_NO_AUGMENTS" = TRAIT_NO_AUGMENTS, "TRAIT_NO_BLOOD_OVERLAY" = TRAIT_NO_BLOOD_OVERLAY, "TRAIT_NO_DNA_COPY" = TRAIT_NO_DNA_COPY, + "TRAIT_NO_EXTINGUISH" = TRAIT_NO_EXTINGUISH, "TRAIT_NO_GLIDE" = TRAIT_NO_GLIDE, "TRAIT_NO_PLASMA_TRANSFORM" = TRAIT_NO_PLASMA_TRANSFORM, "TRAIT_NO_SLIP_ALL" = TRAIT_NO_SLIP_ALL, @@ -161,8 +162,8 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_PARALYSIS_R_ARM" = TRAIT_PARALYSIS_R_ARM, "TRAIT_PARALYSIS_R_LEG" = TRAIT_PARALYSIS_R_LEG, "TRAIT_PASSTABLE" = TRAIT_PASSTABLE, + "TRAIT_PASSWINDOW" = TRAIT_PASSWINDOW, "TRAIT_PERFECT_ATTACKER" = TRAIT_PERFECT_ATTACKER, - "TRAIT_PERMANENTLY_ONFIRE" = TRAIT_PERMANENTLY_ONFIRE, "TRAIT_PHOTOGRAPHER" = TRAIT_PHOTOGRAPHER, "TRAIT_PIERCEIMMUNE" = TRAIT_PIERCEIMMUNE, "TRAIT_PLANT_SAFE" = TRAIT_PLANT_SAFE, @@ -188,6 +189,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES, "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, "TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG, + "TRAIT_PAPER_MASTER" = TRAIT_PAPER_MASTER, "TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS, "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, "TRAIT_SKITTISH" = TRAIT_SKITTISH, diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 614258388cc1b..8f95bdadda934 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -11,7 +11,7 @@ return if(ismob(A)) - ai_tracking_tool.set_tracked_mob(src, A.name) + ai_tracking_tool.track_mob(src, A) else A.move_camera_by_click() diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 533e8f1e8dd48..92defc661016c 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -18,6 +18,8 @@ /// A weakref of the last thing we hovered over /// God I hate how dragging works var/datum/weakref/last_hovored_ref + /// overlay for keybind maptext + var/mutable_appearance/keybind_maptext /atom/movable/screen/movable/action_button/Destroy() if(our_hud) @@ -48,6 +50,9 @@ return FALSE var/list/modifiers = params2list(params) + if(LAZYACCESS(modifiers, ALT_CLICK)) + begin_creating_bind(usr) + return TRUE if(LAZYACCESS(modifiers, SHIFT_CLICK)) var/datum/hud/our_hud = usr.hud_used our_hud.position_action(src, SCRN_OBJ_DEFAULT) @@ -61,6 +66,14 @@ linked_action.Trigger(trigger_flags = trigger_flags) return TRUE +/atom/movable/screen/movable/action_button/proc/begin_creating_bind(mob/user) + if(!isnull(linked_action.full_key)) + linked_action.full_key = null + linked_action.update_button_status(src) + return + linked_action.full_key = tgui_input_keycombo(user, "Please bind a key for this action.") + linked_action.update_button_status(src) + // Entered and Exited won't fire while you're dragging something, because you're still "holding" it // Very much byond logic, but I want nice behavior, so we fake it with drag /atom/movable/screen/movable/action_button/MouseDrag(atom/over_object, src_location, over_location, src_control, over_control, params) @@ -149,6 +162,15 @@ return user.client.prefs.action_buttons_screen_locs -= "[name]_[id]" +/atom/movable/screen/movable/action_button/proc/update_keybind_maptext(key) + cut_overlay(keybind_maptext) + if(!key) + return + keybind_maptext = new + keybind_maptext.maptext = MAPTEXT("[key]") + keybind_maptext.transform = keybind_maptext.transform.Translate(-4, length(key) > 1 ? -6 : 2) //with modifiers, its placed lower so cooldown is visible + add_overlay(keybind_maptext) + /** * This is a silly proc used in hud code code to determine what icon and icon state we should be using * for hud elements (such as action buttons) that don't have their own icon and icon state set. @@ -241,7 +263,7 @@ action.HideFrom(src) /atom/movable/screen/button_palette - desc = "Drag buttons to move them
Shift-click any button to reset it
Alt-click this to reset all buttons" + desc = "Drag buttons to move them
Shift-click any button to reset it
Alt-click any button to begin binding it to a key
Alt-click this to reset all buttons" icon = 'icons/hud/64x16_actions.dmi' icon_state = "screen_gen_palette" screen_loc = ui_action_palette diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 5f687d1964281..1d26c4916b04b 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -186,6 +186,11 @@ using.screen_loc = ui_ai_language_menu static_inventory += using +// Z-level floor change + using = new /atom/movable/screen/floor_menu(null, src) + using.screen_loc = ui_ai_floor_menu + static_inventory += using + //AI core using = new /atom/movable/screen/ai/aicore(null, src) using.screen_loc = ui_ai_core diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index e73cebf14c0cb..1f5f7588162ab 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -464,7 +464,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." var/mob/living/living_owner = owner var/last_whisper if(!HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE)) - last_whisper = tgui_input_text(usr, "Do you have any last words?", "Goodnight, Sweet Prince") + last_whisper = tgui_input_text(usr, "Do you have any last words?", "Goodnight, Sweet Prince", encode = FALSE) // saycode already handles sanitization if(isnull(last_whisper)) if(!HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE)) return diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 3c1b1029a3e06..c3b91173a45f5 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -63,6 +63,10 @@ using.screen_loc = ui_alien_language_menu static_inventory += using + using = new /atom/movable/screen/floor_menu(null, src) + using.screen_loc = ui_alien_floor_menu + static_inventory += using + using = new /atom/movable/screen/navigate(null, src) using.screen_loc = ui_alien_navigate_menu static_inventory += using @@ -87,7 +91,7 @@ pull_icon.update_appearance() pull_icon.screen_loc = ui_above_movement static_inventory += pull_icon - + rest_icon = new /atom/movable/screen/rest(null, src) rest_icon.icon = ui_style rest_icon.screen_loc = ui_above_intent diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index d9ebb3611b68b..77d135ce2c663 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -32,6 +32,10 @@ using.screen_loc = ui_alien_language_menu static_inventory += using + using = new /atom/movable/screen/floor_menu(null, src) + using.screen_loc = ui_alien_floor_menu + static_inventory += using + using = new /atom/movable/screen/navigate(null, src) using.screen_loc = ui_alien_navigate_menu static_inventory += using diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index e928a2b8b3ef3..79f857e8cbef0 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -223,4 +223,3 @@ icon_state = "noise" color = "#04a8d1" alpha = 80 - diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index 99b04df906871..e20c1ede2f663 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -86,6 +86,16 @@ using.icon = ui_style static_inventory += using + using = new /atom/movable/screen/language_menu(null, src) + using.screen_loc = ui_ghost_language_menu + using.icon = ui_style + static_inventory += using + + using = new /atom/movable/screen/floor_menu(null, src) + using.screen_loc = ui_ghost_floor_menu + using.icon = ui_style + static_inventory += using + /datum/hud/ghost/show_hud(version = 0, mob/viewmob) // don't show this HUD if observing; show the HUD of the observee var/mob/dead/observer/O = mymob diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 22a046970cb02..b12ade0c58d43 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -70,6 +70,10 @@ using.icon = ui_style static_inventory += using + using = new /atom/movable/screen/floor_menu(null, src) + using.icon = ui_style + static_inventory += using + action_intent = new /atom/movable/screen/combattoggle/flashy(null, src) action_intent.icon = ui_style action_intent.screen_loc = ui_combat_toggle diff --git a/code/_onclick/hud/rendering/render_plate.dm b/code/_onclick/hud/rendering/render_plate.dm index f3d838f8594bf..d33162a5b5fa6 100644 --- a/code/_onclick/hud/rendering/render_plate.dm +++ b/code/_onclick/hud/rendering/render_plate.dm @@ -80,10 +80,6 @@ /atom/movable/screen/plane_master/rendering_plate/game_plate/Initialize(mapload, datum/hud/hud_owner) . = ..() add_filter("displacer", 1, displacement_map_filter(render_source = OFFSET_RENDER_TARGET(GRAVITY_PULSE_RENDER_TARGET, offset), size = 10)) - if(check_holidays(HALLOWEEN)) - // Makes things a tad greyscale (leaning purple) and drops low colors for vibes - // We're basically using alpha as better constant here btw - add_filter("spook_color", 2, color_matrix_filter(list(0.75,0.13,0.13,0, 0.13,0.7,0.13,0, 0.13,0.13,0.75,0, -0.06,-0.09,-0.08,1, 0,0,0,0))) /atom/movable/screen/plane_master/rendering_plate/game_plate/show_to(mob/mymob) . = ..() @@ -216,7 +212,7 @@
That's how lighting functions at base. Because it uses BLEND_MULTIPLY and occasionally color matrixes, it needs a backdrop of blackness.\
See This byond post\
Lemme see uh, we're masked by the emissive plane so it can actually function (IE: make things glow in the dark).\ -
We're also masked by the overlay lighting plane, which contains all the movable lights in the game. It draws to us and also the game plane.\ +
We're also masked by the overlay lighting plane, which contains all the well overlay lights in the game. It draws to us and also the game plane.\
Masks us out so it has the breathing room to apply its effect.\
Oh and we quite often have our alpha changed to achive night vision effects, or things of that sort." plane = RENDER_PLANE_LIGHTING diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index ea890566f74cf..090b8876cba44 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -77,6 +77,7 @@ var/mob/living/silicon/robot/robit = mymob var/atom/movable/screen/using +// Language using = new/atom/movable/screen/language_menu(null, src) using.screen_loc = ui_borg_language_menu static_inventory += using @@ -86,6 +87,11 @@ using.screen_loc = ui_borg_navigate_menu static_inventory += using +// Z-level floor change + using = new /atom/movable/screen/floor_menu(null, src) + using.screen_loc = ui_borg_floor_menu + static_inventory += using + //Radio using = new /atom/movable/screen/robot/radio(null, src) using.screen_loc = ui_borg_radio diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index f75231722749f..dfb5f072d896c 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -127,6 +127,33 @@ /atom/movable/screen/language_menu/Click() usr.get_language_holder().open_language_menu(usr) +/atom/movable/screen/floor_menu + name = "change floor" + icon = 'icons/hud/screen_midnight.dmi' + icon_state = "floor_change" + screen_loc = ui_floor_menu + +/atom/movable/screen/floor_menu/Initialize(mapload) + . = ..() + register_context() + +/atom/movable/screen/floor_menu/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + context[SCREENTIP_CONTEXT_LMB] = "Go up a floor" + context[SCREENTIP_CONTEXT_RMB] = "Go down a floor" + return CONTEXTUAL_SCREENTIP_SET + +/atom/movable/screen/floor_menu/Click(location,control,params) + var/list/modifiers = params2list(params) + + if(LAZYACCESS(modifiers, RIGHT_CLICK) || LAZYACCESS(modifiers, ALT_CLICK)) + usr.down() + return + + usr.up() + return + /atom/movable/screen/inventory /// The identifier for the slot. It has nothing to do with ID cards. var/slot_id diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index c1f3850c331fc..d9a0118a06ded 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -390,7 +390,7 @@ glasses.add_mob_blood(src) update_worn_glasses() - if(!attacking_item.get_sharpness() && armor_block < 50) + if(!attacking_item.get_sharpness() && !HAS_TRAIT(src, TRAIT_HEAD_INJURY_BLOCKED)) if(prob(damage_done)) adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) if(stat == CONSCIOUS) @@ -420,7 +420,7 @@ w_uniform.add_mob_blood(src) update_worn_undersuit() - if(stat == CONSCIOUS && !attacking_item.get_sharpness() && armor_block < 50) + if(stat == CONSCIOUS && !attacking_item.get_sharpness() && !HAS_TRAIT(src, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) if(prob(damage_done)) visible_message( span_danger("[src] is knocked down!"), diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 04bbc048e66a6..f46ab02433ddc 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -117,7 +117,7 @@ return FALSE return TRUE -/atom/ui_status(mob/user) +/atom/ui_status(mob/user, datum/ui_state/state) . = ..() //Check if both user and atom are at the same location if(!can_interact(user)) @@ -229,6 +229,9 @@ /mob/living/carbon/alien/larva/resolve_right_click_attack(atom/target, list/modifiers) return target.attack_larva_secondary(src, modifiers) +/mob/living/carbon/alien/larva/can_unarmed_attack() //We bite stuff, and our head is always free. + return TRUE + /atom/proc/attack_larva(mob/user, list/modifiers) return diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 6e4c21fba208b..ac12add1ae2d5 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -684,10 +684,16 @@ GLOBAL_REAL(Master, /datum/controller/master) queue_node.state = SS_RUNNING + if(queue_node.profiler_focused) + world.Profile(PROFILE_START) + tick_usage = TICK_USAGE var/state = queue_node.ignite(queue_node_paused) tick_usage = TICK_USAGE - tick_usage + if(queue_node.profiler_focused) + world.Profile(PROFILE_STOP) + if (state == SS_RUNNING) state = SS_IDLE current_tick_budget -= queue_node_priority diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index ddeb9368f500b..b01f4b17b9de4 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -38,6 +38,12 @@ ///Bitmap of what game states can this subsystem fire at. See [RUNLEVELS_DEFAULT] for more details. var/runlevels = RUNLEVELS_DEFAULT //points of the game at which the SS can fire + /** + * boolean set by admins. if TRUE then this subsystem will stop the world profiler after ignite() returns and start it again when called. + * used so that you can audit a specific subsystem or group of subsystems' synchronous call chain. + */ + var/profiler_focused = FALSE + /* * The following variables are managed by the MC and should not be modified directly. */ @@ -65,7 +71,7 @@ /// Tracks the current execution state of the subsystem. Used to handle subsystems that sleep in fire so the mc doesn't run them again while they are sleeping var/state = SS_IDLE - + /// Tracks how many times a subsystem has ever slept in fire(). var/slept_count = 0 diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 916bbed6e4e1d..71eaed14ea23f 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -1,4 +1,3 @@ -#define SUBSYSTEM_INIT_SOURCE "subsystem init" SUBSYSTEM_DEF(atoms) name = "Atoms" init_order = INIT_ORDER_ATOMS @@ -41,11 +40,16 @@ SUBSYSTEM_DEF(atoms) if(initialized == INITIALIZATION_INSSATOMS) return - set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, SUBSYSTEM_INIT_SOURCE) + // Generate a unique mapload source for this run of InitializeAtoms + var/static/uid = 0 + uid = (uid + 1) % (SHORT_REAL_LIMIT - 1) + var/source = "subsystem init [uid]" + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, source) // This may look a bit odd, but if the actual atom creation runtimes for some reason, we absolutely need to set initialized BACK - CreateAtoms(atoms, atoms_to_return) - clear_tracked_initalize(SUBSYSTEM_INIT_SOURCE) + CreateAtoms(atoms, atoms_to_return, source) + clear_tracked_initalize(source) + SSicon_smooth.free_deferred(source) if(late_loaders.len) for(var/I in 1 to late_loaders.len) @@ -72,7 +76,7 @@ SUBSYSTEM_DEF(atoms) #endif /// Actually creates the list of atoms. Exists soley so a runtime in the creation logic doesn't cause initalized to totally break -/datum/controller/subsystem/atoms/proc/CreateAtoms(list/atoms, list/atoms_to_return = null) +/datum/controller/subsystem/atoms/proc/CreateAtoms(list/atoms, list/atoms_to_return = null, mapload_source = null) if (atoms_to_return) LAZYINITLIST(created_atoms) @@ -90,7 +94,12 @@ SUBSYSTEM_DEF(atoms) for(var/I in 1 to atoms.len) var/atom/A = atoms[I] if(!(A.flags_1 & INITIALIZED_1)) - CHECK_TICK + // Unrolled CHECK_TICK setup to let us enable/disable mapload based off source + if(TICK_CHECK) + clear_tracked_initalize(mapload_source) + stoplag() + if(mapload_source) + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, mapload_source) PROFILE_INIT_ATOM_BEGIN() InitAtom(A, TRUE, mapload_arg) PROFILE_INIT_ATOM_END(A) @@ -107,7 +116,11 @@ SUBSYSTEM_DEF(atoms) #ifdef TESTING ++count #endif - CHECK_TICK + if(TICK_CHECK) + clear_tracked_initalize(mapload_source) + stoplag() + if(mapload_source) + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, mapload_source) testing("Initialized [count] atoms") @@ -117,6 +130,13 @@ SUBSYSTEM_DEF(atoms) /datum/controller/subsystem/atoms/proc/map_loader_stop(source) clear_tracked_initalize(source) +/// Returns the source currently modifying SSatom's init behavior +/datum/controller/subsystem/atoms/proc/get_initialized_source() + var/state_length = length(initialized_state) + if(!state_length) + return null + return initialized_state[state_length][1] + /// Use this to set initialized to prevent error states where the old initialized is overriden, and we end up losing all context /// Accepts a state and a source, the most recent state is used, sources exist to prevent overriding old values accidentially /datum/controller/subsystem/atoms/proc/set_tracked_initalized(state, source) @@ -199,5 +219,3 @@ SUBSYSTEM_DEF(atoms) var/initlog = InitLog() if(initlog) text2file(initlog, "[GLOB.log_directory]/initialize.log") - -#undef SUBSYSTEM_INIT_SOURCE diff --git a/code/controllers/subsystem/blackmarket.dm b/code/controllers/subsystem/blackmarket.dm index 357fa0df2915d..bdd342cbf3d04 100644 --- a/code/controllers/subsystem/blackmarket.dm +++ b/code/controllers/subsystem/blackmarket.dm @@ -21,17 +21,20 @@ SUBSYSTEM_DEF(blackmarket) for(var/market in subtypesof(/datum/market)) markets[market] += new market - for(var/item in subtypesof(/datum/market_item)) - var/datum/market_item/I = new item() - if(!I.item) + for(var/datum/market_item/item as anything in subtypesof(/datum/market_item)) + if(!initial(item.item)) + continue + if(!prob(initial(item.availability_prob))) continue - for(var/M in I.markets) - if(!markets[M]) - stack_trace("SSblackmarket: Item [I] available in market that does not exist.") + var/datum/market_item/item_instance = new item() + for(var/potential_market in item_instance.markets) + if(!markets[potential_market]) + stack_trace("SSblackmarket: Item [item_instance] available in market that does not exist.") continue - markets[M].add_item(item) - qdel(I) + // If this fails the market item will just be GC'd + markets[potential_market].add_item(item_instance) + return SS_INIT_SUCCESS /datum/controller/subsystem/blackmarket/fire(resumed) diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm index b74483a2cb639..51ecd59925a4d 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm @@ -698,3 +698,45 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) create_separatist_nation(department_type, announcement = FALSE, dangerous = FALSE, message_admins = FALSE) GLOB.round_default_lawset = /datum/ai_laws/united_nations + +/datum/dynamic_ruleset/roundstart/spies + name = "Spies" + antag_flag = ROLE_SPY + antag_datum = /datum/antagonist/spy + minimum_required_age = 0 + protected_roles = list( + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, // AA = bad + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + restricted_roles = list( + JOB_AI, + JOB_CYBORG, + ) + required_candidates = 3 // lives or dies by there being a few spies + weight = 5 + cost = 8 + scaling_cost = 101 // see below + minimum_players = 8 + antag_cap = list("denominator" = 8, "offset" = 1) // should have quite a few spies to work against each other + requirements = list(8, 8, 8, 8, 8, 8, 8, 8, 8, 8) + +/datum/dynamic_ruleset/roundstart/spies/pre_execute(population) + for(var/i in 1 to get_antag_cap(population) * (scaled_times + 1)) + if(length(candidates) <= 0) + break + var/mob/picked_player = pick_n_take(candidates) + assigned += picked_player.mind + picked_player.mind.special_role = ROLE_SPY + picked_player.mind.restricted_roles = restricted_roles + GLOB.pre_setup_antags += picked_player.mind + return TRUE + +/datum/dynamic_ruleset/roundstart/spies/scale_up(population, max_scale) + // Disabled (at least until dynamic can handle scaling this better) + // Because spies have a very low demoninator, this can easily spawn like 30 of them + return 0 diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index bf77acb065374..fd4249b81700c 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -28,6 +28,8 @@ SUBSYSTEM_DEF(economy) * A list of sole account datums can be obtained with flatten_list(), another variable would be redundant rn. */ var/list/bank_accounts_by_id = list() + /// A list of bank accounts indexed by their assigned job. + var/list/bank_accounts_by_job = list() ///List of the departmental budget cards in existance. var/list/dep_cards = list() /// A var that collects the total amount of credits owned in player accounts on station, reset and recounted on fire() diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index 4d5f3069eca6f..9e5e9ffa99de6 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -9,6 +9,7 @@ SUBSYSTEM_DEF(icon_smooth) var/list/blueprint_queue = list() var/list/smooth_queue = list() var/list/deferred = list() + var/list/deferred_by_source = list() /datum/controller/subsystem/icon_smooth/fire() // We do not want to smooth icons of atoms whose neighbors are not initialized yet, @@ -61,16 +62,30 @@ SUBSYSTEM_DEF(icon_smooth) return SS_INIT_SUCCESS +/// Releases a pool of delayed smooth attempts from a particular source +/datum/controller/subsystem/icon_smooth/proc/free_deferred(source_to_free) + smooth_queue += deferred_by_source[source_to_free] + deferred_by_source -= source_to_free + if(!can_fire) + can_fire = TRUE /datum/controller/subsystem/icon_smooth/proc/add_to_queue(atom/thing) if(thing.smoothing_flags & SMOOTH_QUEUED) return thing.smoothing_flags |= SMOOTH_QUEUED + // If we're currently locked into mapload BY something + // Then put us in a deferred list that we release when this mapload run is finished + if(initialized && length(SSatoms.initialized_state) && SSatoms.initialized == INITIALIZATION_INNEW_MAPLOAD) + var/source = SSatoms.get_initialized_source() + LAZYADD(deferred_by_source[source], thing) + return smooth_queue += thing if(!can_fire) can_fire = TRUE /datum/controller/subsystem/icon_smooth/proc/remove_from_queues(atom/thing) + // Lack of removal from deferred_by_source is safe because the lack of SMOOTH_QUEUED will just free it anyway + // Hopefully this'll never cause a harddel (dies) thing.smoothing_flags &= ~SMOOTH_QUEUED smooth_queue -= thing if(blueprint_queue) diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm index 4ae9272e97010..25efd8695dca0 100644 --- a/code/controllers/subsystem/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -33,6 +33,9 @@ SUBSYSTEM_DEF(materials) new /datum/stack_recipe("Carving block", /obj/structure/carving_block, 5, time = 3 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_STRUCTURE), ) + ///A list of dimensional themes used by the dimensional anomaly and other things, most of which require materials to function. + var/list/datum/dimension_theme/dimensional_themes + ///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info) /datum/controller/subsystem/materials/proc/InitializeMaterials() materials = list() @@ -47,6 +50,8 @@ SUBSYSTEM_DEF(materials) continue // Do not initialize at mapload InitializeMaterial(list(mat_type)) + dimensional_themes = init_subtypes_w_path_keys(/datum/dimension_theme) + /** Creates and caches a material datum. * * Arugments: diff --git a/code/controllers/subsystem/ore_generation.dm b/code/controllers/subsystem/ore_generation.dm index 162bc2e99d963..ca8aa09d6111c 100644 --- a/code/controllers/subsystem/ore_generation.dm +++ b/code/controllers/subsystem/ore_generation.dm @@ -6,11 +6,11 @@ SUBSYSTEM_DEF(ore_generation) runlevels = RUNLEVEL_GAME /// All ore vents that are currently producing boulders. - var/list/processed_vents = list() - /// All the boulders that have been produced by ore vents to be pulled by BRM machines. - var/list/available_boulders = list() + var/list/obj/structure/ore_vent/processed_vents = list() /// All the ore vents that are currently in the game, not just the ones that are producing boulders. - var/list/possible_vents = list() + var/list/obj/structure/ore_vent/possible_vents = list() + /// All the boulders that have been produced by ore vents to be pulled by BRM machines. + var/list/obj/item/boulder/available_boulders = list() /** * A list of all the minerals that are being mined by ore vents. We reset this list every time cave generation is done. * Generally Should be empty by the time initialize ends on lavaland. @@ -18,6 +18,7 @@ SUBSYSTEM_DEF(ore_generation) * If we call cave_generation more than once, we copy a list from the lists in lists/ores_spawned.dm */ var/list/ore_vent_minerals = list() + /// A tracker of how many of each ore vent size we have in the game. Useful for tracking purposes. var/list/ore_vent_sizes = list( LARGE_VENT_TYPE = 0, @@ -60,7 +61,7 @@ SUBSYSTEM_DEF(ore_generation) return SS_INIT_SUCCESS /datum/controller/subsystem/ore_generation/fire(resumed) - available_boulders = list() // reset upon new fire. + available_boulders.Cut() // reset upon new fire. for(var/obj/structure/ore_vent/current_vent as anything in processed_vents) var/local_vent_count = 0 @@ -71,6 +72,4 @@ SUBSYSTEM_DEF(ore_generation) if(local_vent_count >= MAX_BOULDERS_PER_VENT) continue //We don't want to be accountable for literally hundreds of unprocessed boulders for no reason. - var/obj/item/boulder/new_rock = current_vent.produce_boulder() - available_boulders += new_rock - + available_boulders += current_vent.produce_boulder() diff --git a/code/controllers/subsystem/polling.dm b/code/controllers/subsystem/polling.dm index 7787d36b2bf4b..3fd8bcc125e5c 100644 --- a/code/controllers/subsystem/polling.dm +++ b/code/controllers/subsystem/polling.dm @@ -16,7 +16,38 @@ SUBSYSTEM_DEF(polling) if(running_poll.time_left() <= 0) polling_finished(running_poll) -/datum/controller/subsystem/polling/proc/poll_candidates(question, role, check_jobban, poll_time = 30 SECONDS, ignore_category = null, flash_window = TRUE, list/group = null, pic_source, role_name_text, list/custom_response_messages) +/** + * Starts a poll. + * + * Arguments + * * question: Optional, The question to ask the candidates. If null, a default question will be used. ("Do you want to play as role?") + * * role: Optional, An antag role (IE, ROLE_TRAITOR) to pass, it won't show to any candidates who don't have it in their preferences. + * * check_jobban: Optional, What jobban role / flag to check, it won't show to any candidates who have this jobban. + * * poll_time: How long the poll will last. + * * ignore_category: Optional, A poll category. If a candidate has this category in their ignore list, they won't be polled. + * * flash_window: If TRUE, the candidate's window will flash when they're polled. + * * list/group: A list of candidates to poll. + * * pic_source: Optional, An /atom or an /image to display on the poll alert. + * * role_name_text: Optional, A string to display in logging / the (default) question. If null, the role name will be used. + * * list/custom_response_messages: Optional, A list of strings to use as responses to the poll. If null, the default responses will be used. see __DEFINES/polls.dm for valid keys to use. + * * start_signed_up: If TRUE, all candidates will start signed up for the poll, making it opt-out rather than opt-in. + * + * Returns a list of all mobs who signed up for the poll. + */ +/datum/controller/subsystem/polling/proc/poll_candidates( + question, + role, + check_jobban, + poll_time = 30 SECONDS, + ignore_category = null, + flash_window = TRUE, + list/group = null, + pic_source, + role_name_text, + list/custom_response_messages, + start_signed_up = FALSE, +) + RETURN_TYPE(/list/mob) if(group.len == 0) return list() if(role && !role_name_text) @@ -49,7 +80,8 @@ SUBSYSTEM_DEF(polling) if(role && !is_eligible(candidate_mob, role, check_jobban, ignore_category)) continue - SEND_SOUND(candidate_mob, 'sound/misc/notice2.ogg') + if(start_signed_up) + new_poll.sign_up(candidate_mob, TRUE) if(flash_window) window_flash(candidate_mob.client) @@ -76,6 +108,8 @@ SUBSYSTEM_DEF(polling) poll_alert_button.poll = alert_poll poll_alert_button.set_role_overlay() poll_alert_button.update_stacks_overlay() + poll_alert_button.update_candidates_number_overlay() + poll_alert_button.update_signed_up_overlay() // Sign up inheritance and stacking @@ -111,12 +145,15 @@ SUBSYSTEM_DEF(polling) // Chat message var/act_jump = "" if(isatom(pic_source) && isobserver(candidate_mob)) - act_jump = "\[Teleport]" - var/act_signup = "\[Sign Up]" + act_jump = "\[Teleport\]" + var/act_signup = "\[[start_signed_up ? "Opt out" : "Sign Up"]\]" var/act_never = "" if(ignore_category) - act_never = "\[Never For This Round]" - to_chat(candidate_mob, span_boldnotice(examine_block("Now looking for candidates [role_name_text ? "to play as \an [role_name_text]." : "\"[question]\""] [act_jump] [act_signup] [act_never]"))) + act_never = "\[Never For This Round\]" + + if(!duplicate_message_check(alert_poll)) //Only notify people once. They'll notice if there are multiple and we don't want to spam people. + SEND_SOUND(candidate_mob, 'sound/misc/notice2.ogg') + to_chat(candidate_mob, span_boldnotice(examine_block("Now looking for candidates [role_name_text ? "to play as \an [role_name_text]." : "\"[question]\""] [act_jump] [act_signup] [act_never]"))) // Start processing it so it updates visually the timer START_PROCESSING(SSprocessing, poll_alert_button) @@ -192,13 +229,8 @@ SUBSYSTEM_DEF(polling) // Take care of updating the remaining screen alerts if a similar poll is found, or deleting them. if(length(finishing_poll.alert_buttons)) - var/polls_of_same_type_left = FALSE - for(var/datum/candidate_poll/running_poll as anything in currently_polling) - if(running_poll.poll_key == finishing_poll.poll_key && running_poll.time_left() > 0) - polls_of_same_type_left = TRUE - break for(var/atom/movable/screen/alert/poll_alert/alert as anything in finishing_poll.alert_buttons) - if(polls_of_same_type_left) + if(duplicate_message_check(finishing_poll)) alert.update_stacks_overlay() else alert.owner.clear_alert("[finishing_poll.poll_key]_poll_alert") @@ -213,6 +245,13 @@ SUBSYSTEM_DEF(polling) msg += " | Next: [DisplayTimeText(soonest_to_complete.time_left())] ([length(soonest_to_complete.signed_up)] candidates)" return ..() +///Is there a multiple of the given event type running right now? +/datum/controller/subsystem/polling/proc/duplicate_message_check(datum/candidate_poll/poll_to_check) + for(var/datum/candidate_poll/running_poll as anything in currently_polling) + if((running_poll.poll_key == poll_to_check.poll_key && running_poll != poll_to_check) && running_poll.time_left() > 0) + return TRUE + return FALSE + /datum/controller/subsystem/polling/proc/get_next_poll_to_finish() var/lowest_time_left = INFINITY var/next_poll_to_finish diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index 75e29cf4d1ecd..a915346cebdf0 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -5,6 +5,7 @@ // Shifted to glob so they are generated at world start instead of risking players doing preference stuff before the subsystem inits GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list( list(/datum/quirk/item_quirk/blindness, /datum/quirk/item_quirk/nearsighted), + list(/datum/quirk/item_quirk/blindness, /datum/quirk/touchy), list(/datum/quirk/jolly, /datum/quirk/depression, /datum/quirk/apathetic, /datum/quirk/hypersensitive), 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), diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index d0ebe00089380..612c599c0f62c 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -62,6 +62,7 @@ SUBSYSTEM_DEF(research) /obj/item/assembly/signaler/anomaly/hallucination = MAX_CORES_HALLUCINATION, /obj/item/assembly/signaler/anomaly/bioscrambler = MAX_CORES_BIOSCRAMBLER, /obj/item/assembly/signaler/anomaly/dimensional = MAX_CORES_DIMENSIONAL, + /obj/item/assembly/signaler/anomaly/ectoplasm = MAX_CORES_ECTOPLASMIC, ) /// Lookup list for ordnance briefers. diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm index 69a5edcca3a63..f011d01ca679d 100644 --- a/code/controllers/subsystem/server_maint.dm +++ b/code/controllers/subsystem/server_maint.dm @@ -19,6 +19,9 @@ SUBSYSTEM_DEF(server_maint) world.hub_password = "" //quickly! before the hubbies see us. /datum/controller/subsystem/server_maint/Initialize() + if (fexists("tmp/")) + fdel("tmp/") + if (CONFIG_GET(flag/hub)) world.update_hub_visibility(TRUE) //Keep in mind, because of how delay works adding a list here makes each list take wait * delay more time to clear @@ -82,6 +85,8 @@ SUBSYSTEM_DEF(server_maint) return /datum/controller/subsystem/server_maint/Shutdown() + if (fexists("tmp/")) + fdel("tmp/") kick_clients_in_lobby(span_boldannounce("The round came to an end with you in the lobby."), TRUE) //second parameter ensures only afk clients are kicked var/server = CONFIG_GET(string/server) for(var/thing in GLOB.clients) diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 80ee843bf8b94..bc894de9beee8 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -4,8 +4,6 @@ #define BUCKET_POS(timer) (((ROUND_UP((timer.timeToRun - timer.timer_subsystem.head_offset) / world.tick_lag)+1) % BUCKET_LEN) || BUCKET_LEN) /// Gets the maximum time at which timers will be invoked from buckets, used for deferring to secondary queue #define TIMER_MAX(timer_ss) (timer_ss.head_offset + TICKS2DS(BUCKET_LEN + timer_ss.practical_offset - 1)) -/// Max float with integer precision -#define TIMER_ID_MAX (2**24) /** * # Timer Subsystem @@ -731,4 +729,3 @@ SUBSYSTEM_DEF(timer) #undef BUCKET_LEN #undef BUCKET_POS #undef TIMER_MAX -#undef TIMER_ID_MAX diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index c4c3b85b4c939..410db36988dd8 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -302,6 +302,7 @@ SUBSYSTEM_DEF(vote) "question" = current_vote.override_question, "timeRemaining" = current_vote.time_remaining, "countMethod" = current_vote.count_method, + "displayStatistics" = current_vote.display_statistics, "choices" = choices, "vote" = vote_data, ) diff --git a/code/datums/achievements/_achievement_data.dm b/code/datums/achievements/_achievement_data.dm index 295770b89b5b7..8b78cf7c8f387 100644 --- a/code/datums/achievements/_achievement_data.dm +++ b/code/datums/achievements/_achievement_data.dm @@ -113,7 +113,7 @@ "name" = award.name, "desc" = award.desc, "category" = award.category, - "icon_class" = assets.icon_class_name(award.icon), + "icon_class" = assets.icon_class_name("achievement-[award.icon_state]"), "value" = data[achievement_type], ) award_data += award.get_ui_data(user.ckey) diff --git a/code/datums/achievements/_awards.dm b/code/datums/achievements/_awards.dm index 23ab5e81001c9..d99659ea780f9 100644 --- a/code/datums/achievements/_awards.dm +++ b/code/datums/achievements/_awards.dm @@ -2,8 +2,10 @@ ///Name of the achievement, If null it won't show up in the achievement browser. (Handy for inheritance trees) var/name var/desc = "You did it." - ///The icon state for this award. The icon file is found in ui_icons/achievements. - var/icon = "default" + ///The dmi icon file that holds the award's icon state. + var/icon = ACHIEVEMENTS_SET + ///The icon state for this award. + var/icon_state = "default" var/category = "Normal" @@ -80,7 +82,7 @@ ///Achievements are one-off awards for usually doing cool things. /datum/award/achievement desc = "Achievement for epic people" - icon = "" // This should warn contributors that do not declare an icon when contributing new achievements. + icon_state = "" // This should warn contributors that do not declare an icon when contributing new achievements. ///How many players have earned this achievement var/times_achieved = 0 @@ -171,7 +173,7 @@ /datum/award/score/achievements_score name = "Achievements Unlocked" desc = "Don't worry, metagaming is all that matters." - icon = "elephant" //Obey the reference + icon_state = "elephant" //Obey the reference database_id = ACHIEVEMENTS_SCORE /datum/award/score/achievements_score/get_ui_data(key) diff --git a/code/datums/achievements/boss_achievements.dm b/code/datums/achievements/boss_achievements.dm index a378b703e46ed..c02286b8f7a58 100644 --- a/code/datums/achievements/boss_achievements.dm +++ b/code/datums/achievements/boss_achievements.dm @@ -5,119 +5,119 @@ name = "Tendril Exterminator" desc = "Watch your step" database_id = BOSS_MEDAL_TENDRIL - icon = "tendril" + icon_state = "tendril" /datum/award/achievement/boss/boss_killer name = "Boss Killer" desc = "You've come a long ways from asking how to switch hands." database_id = "Boss Killer" - icon = "firstboss" + icon_state = "firstboss" /datum/award/achievement/boss/blood_miner_kill name = "Blood-Drunk Miner Killer" desc = "I guess he couldn't handle his drink that well." database_id = BOSS_MEDAL_MINER - icon = "miner" + icon_state = "miner" /datum/award/achievement/boss/demonic_miner_kill name = "Demonic-Frost Miner Killer" desc = "Definitely harder than the Blood-Drunk Miner." database_id = BOSS_MEDAL_FROSTMINER - icon = "frostminer" + icon_state = "frostminer" /datum/award/achievement/boss/bubblegum_kill name = "Bubblegum Killer" desc = "I guess he wasn't made of candy after all" database_id = BOSS_MEDAL_BUBBLEGUM - icon = "bbgum" + icon_state = "bbgum" /datum/award/achievement/boss/colossus_kill name = "Colossus Killer" desc = "The bigger they are... the better the loot" database_id = BOSS_MEDAL_COLOSSUS - icon = "colossus" + icon_state = "colossus" /datum/award/achievement/boss/drake_kill name = "Drake Killer" desc = "Now I can wear Rune Platebodies!" database_id = BOSS_MEDAL_DRAKE - icon = "drake" + icon_state = "drake" /datum/award/achievement/boss/hierophant_kill name = "Hierophant Killer" desc = "Hierophant, but not triumphant." database_id = BOSS_MEDAL_HIEROPHANT - icon = "hierophant" + icon_state = "hierophant" /datum/award/achievement/boss/legion_kill name = "Legion Killer" desc = "We were many..now we are none." database_id = BOSS_MEDAL_LEGION - icon = "legion" + icon_state = "legion" /datum/award/achievement/boss/wendigo_kill name = "Wendigo Killer" desc = "You've now ruined years of mythical storytelling." database_id = BOSS_MEDAL_WENDIGO - icon = "wendigo" + icon_state = "wendigo" /datum/award/achievement/boss/blood_miner_crusher name = "Blood-Drunk Miner Crusher" desc = "I guess he couldn't handle his drink that well." database_id = BOSS_MEDAL_MINER_CRUSHER - icon = "miner" + icon_state = "miner" /datum/award/achievement/boss/demonic_miner_crusher name = "Demonic-Frost Miner Crusher" desc = "Definitely harder than the Blood-Drunk Miner." database_id = BOSS_MEDAL_FROSTMINER_CRUSHER - icon = "frostminer" + icon_state = "frostminer" /datum/award/achievement/boss/bubblegum_crusher name = "Bubblegum Crusher" desc = "I guess he wasn't made of candy after all" database_id = BOSS_MEDAL_BUBBLEGUM_CRUSHER - icon = "bbgum" + icon_state = "bbgum" /datum/award/achievement/boss/colossus_crusher name = "Colossus Crusher" desc = "The bigger they are... the better the loot" database_id = BOSS_MEDAL_COLOSSUS_CRUSHER - icon = "colossus" + icon_state = "colossus" /datum/award/achievement/boss/drake_crusher name = "Drake Crusher" desc = "Now I can wear Rune Platebodies!" database_id = BOSS_MEDAL_DRAKE_CRUSHER - icon = "drake" + icon_state = "drake" /datum/award/achievement/boss/hierophant_crusher name = "Hierophant Crusher" desc = "Hierophant, but not triumphant." database_id = BOSS_MEDAL_HIEROPHANT_CRUSHER - icon = "hierophant" + icon_state = "hierophant" /datum/award/achievement/boss/legion_crusher name = "Legion Crusher" desc = "We were many... now we are none." database_id = BOSS_MEDAL_LEGION_CRUSHER - icon = "legion" + icon_state = "legion" /datum/award/achievement/boss/wendigo_crusher name = "Wendigo Crusher" desc = "You've now ruined years of mythical storytelling." database_id = BOSS_MEDAL_WENDIGO_CRUSHER - icon = "wendigo" + icon_state = "wendigo" //should be removed soon /datum/award/achievement/boss/king_goat_kill name = "King Goat Killer" desc = "The king is dead, long live the king!" database_id = BOSS_MEDAL_KINGGOAT - icon = "goatboss" + icon_state = "goatboss" /datum/award/achievement/boss/king_goat_crusher name = "King Goat Crusher" desc = "The king is dead, long live the king!" database_id = BOSS_MEDAL_KINGGOAT_CRUSHER - icon = "goatboss" + icon_state = "goatboss" diff --git a/code/datums/achievements/job_achievements.dm b/code/datums/achievements/job_achievements.dm index 6aafbee8e68d1..bd37de7c0e112 100644 --- a/code/datums/achievements/job_achievements.dm +++ b/code/datums/achievements/job_achievements.dm @@ -8,7 +8,7 @@ name = "All Within Theoretical Limits" desc = "I never thought I'd see a resonance cascade, let alone prevent one..." database_id = MEDAL_THEORETICAL_LIMITS - icon = "theoreticallimits" + icon_state = "theoreticallimits" //medical @@ -16,13 +16,13 @@ name = "Mister Sandman" desc = "Mechanically speaking, there's no real benefit to being unconscious during surgery. Weird how insistent this doctor is about using the N2O anyway though, huh?" database_id = MEDAL_SANDMAN - icon = "basemisc" + icon_state = "basemisc" /datum/award/achievement/jobs/helbitaljanken name = "Helbitaljanken" desc = "You janked hard" database_id = MEDAL_HELBITALJANKEN - icon = "helbital" + icon_state = "helbital" //mining @@ -30,7 +30,7 @@ name = "Frenching" desc = "Just a taste, for science!" database_id = MEDAL_FRENCHING - icon = "frenchingthebubble" + icon_state = "frenchingthebubble" //science @@ -38,13 +38,13 @@ name = "Feat of Strength" desc = "If the rod is immovable, is it passing you or are you passing it?" database_id = MEDAL_RODSUPLEX - icon = "featofstrength" + icon_state = "featofstrength" /datum/award/achievement/jobs/snail name = "KKKiiilll mmmeee" desc = "You were a little too ambitious, but hey, I guess you're still alive?" database_id = MEDAL_SNAIL - icon = "snail" + icon_state = "snail" //all of service! hip hip! @@ -52,18 +52,18 @@ name = "Centcom Grade: Shitty Service" desc = "Well, you at least tried. How about trying harder?" database_id = MEDAL_BAD_SERVICE - icon = "service_bad" + icon_state = "service_bad" /datum/award/achievement/jobs/service_okay name = "Centcom Grade: Acceptable Service" desc = "Well, it'll do! You and your department did just fine." database_id = MEDAL_OKAY_SERVICE - icon = "service_okay" + icon_state = "service_okay" /datum/award/achievement/jobs/service_good name = "Centcom Grade: Exemplary Service" desc = "Centcom is very impressed with your department!" database_id = MEDAL_GOOD_SERVICE - icon = "service_good" + icon_state = "service_good" //civilian achievies! while not recognized by the code, it is recognized by our hearts diff --git a/code/datums/achievements/mafia_achievements.dm b/code/datums/achievements/mafia_achievements.dm index da70fb11e871f..31462f7a0ce2f 100644 --- a/code/datums/achievements/mafia_achievements.dm +++ b/code/datums/achievements/mafia_achievements.dm @@ -7,103 +7,103 @@ name = "Assistant Victory" desc = "If you got killed instead of someone more important, you just flexed the true strength of your \"\"\"\"role\"\"\"\"." database_id = MAFIA_MEDAL_ASSISTANT - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/detective name = "Detective Victory" desc = "If you did this with a Medical Doctor in the game, i'm not really that impressed." database_id = MAFIA_MEDAL_DETECTIVE - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/psychologist name = "Psychologist Victory" desc = "You learned how to not reveal someone random night one! Or... maybe you're just a lucky bastard." database_id = MAFIA_MEDAL_PSYCHOLOGIST - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/chaplain name = "Chaplain Victory" desc = "Useless... until the one night the thoughtfeeder confidently claims themselves as detective. Mafia's true bullshit detector." database_id = MAFIA_MEDAL_CHAPLAIN - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/md name = "Medical Doctor Victory" desc = "Congratulations on learning how to not talk!" database_id = MAFIA_MEDAL_MD - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/officer name = "Security Officer Victory" desc = "Don't worry, you can win this if you're dead! You... did use your ability to become dead, right?" database_id = MAFIA_MEDAL_OFFICER - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/lawyer name = "Lawyer Victory" desc = "Oh don't mind me, i'm just the worst rol- Oops, I just instantly ended the game." database_id = MAFIA_MEDAL_LAWYER - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/hop name = "Head of Personnel Victory" desc = "King of Assistants, waster of a single mafia's night, thrower of games." database_id = MAFIA_MEDAL_HOP - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/warden name = "Warden Victory" desc = "Make changelings think you're detective, go on lockdown, actual detective investigates you and dies. Cha cha real smooth!" database_id = MAFIA_MEDAL_WARDEN - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/hos name = "Head of Security Victory" desc = "Certified not shitcurity." database_id = MAFIA_MEDAL_HOS - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/changeling name = "Changeling Victory" desc = "I think the changelings are metacomming." database_id = MAFIA_MEDAL_CHANGELING - icon = "mafia" + icon_state = "mafia" /datum/award/achievement/mafia/thoughtfeeder name = "Thoughtfeeder Victory" desc = "Clown's best friend. And Obsessed. And fugitive? Whose side are you on?!" database_id = MAFIA_MEDAL_THOUGHTFEEDER - icon = "mafia" + icon_state = "mafia" /datum/award/achievement/mafia/traitor name = "Traitor Victory" desc = "Guys, we still have two more changelings to ki-!! TRAITOR VICTORY !!" database_id = MAFIA_MEDAL_TRAITOR - icon = "neutral" + icon_state = "neutral" /datum/award/achievement/mafia/nightmare name = "Nightmare Victory" desc = "DID YOUR LIGHT FLICKER?!" database_id = MAFIA_MEDAL_NIGHTMARE - icon = "neutral" + icon_state = "neutral" /datum/award/achievement/mafia/fugitive name = "Fugitive Victory" desc = "I'm just the description on an achievement, but if you end up having to choose between town and changelings, go changelings." database_id = MAFIA_MEDAL_FUGITIVE - icon = "neutral" + icon_state = "neutral" /datum/award/achievement/mafia/obsessed name = "Obsessed Victory" desc = "You got your target lynched, so instead of being spiteful and annoying, you're just smug and annoying." database_id = MAFIA_MEDAL_OBSESSED - icon = "neutral" + icon_state = "neutral" /datum/award/achievement/mafia/clown name = "Clown Victory" desc = "Did you know this works on traitors, despite their immunity? If you hit the jackpot and manage to kill one, they'll salt into the next dimension. Clown tips!" database_id = MAFIA_MEDAL_CLOWN - icon = "neutral" + icon_state = "neutral" ///ALL THE ACHIEVEMENTS FOR MISC MAFIA ODDITIES/// @@ -111,4 +111,4 @@ name = "Universally Hated" desc = "Managed to get more than 12 votes when put up on trial, jesus christ." database_id = MAFIA_MEDAL_HATED - icon = "hated" + icon_state = "hated" diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index e452b860f0072..e92fc3bc56b91 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -1,54 +1,54 @@ /datum/award/achievement/misc category = "Misc" - icon = "basemisc" //for those achievements that still need an actual icon, later. + icon_state = "basemisc" //for those achievements that still need an actual icon, later. /datum/award/achievement/misc/meteor_examine name = "Your Life Before Your Eyes" desc = "Take a close look at hurtling space debris" database_id = MEDAL_METEOR - icon = "meteors" + icon_state = "meteors" /datum/award/achievement/misc/pulse name = "Jackpot" desc = "Win a pulse rifle from an arcade machine" database_id = MEDAL_PULSE - icon = "jackpot" + icon_state = "jackpot" /datum/award/achievement/misc/time_waste name = "Time waster" desc = "Speak no evil, hear no evil, see just errors" database_id = MEDAL_TIMEWASTE - icon = "timewaste" + icon_state = "timewaste" /datum/award/achievement/misc/round_and_full name = "Round and Full" desc = "Well at least you aren't down the river, I hear they eat people there." database_id = MEDAL_CLOWNCARKING - icon = "clownking" + icon_state = "clownking" /datum/award/achievement/misc/the_best_driver name = "The Best Driver" desc = "100 honks later" database_id = MEDAL_THANKSALOT - icon = "clownthanks" + icon_state = "clownthanks" /datum/award/achievement/misc/getting_an_upgrade name = "Getting an upgrade" desc = "Make your first unique material item!" database_id = MEDAL_MATERIALCRAFT - icon = "upgrade" + icon_state = "upgrade" /datum/award/achievement/misc/rocket_holdup name = "Disk, Please!" desc = "Is the man currently pointing a loaded rocket launcher at your head point blank really dumb enough to pull the trigger? Do you really want to find out?" database_id = MEDAL_DISKPLEASE - icon = "rocket_holdup" + icon_state = "rocket_holdup" /datum/award/achievement/misc/gamer name = "My Watchlist Status is Not Important" desc = "You may be under the impression that violent video games are a harmless pastime, but the security and medical personnel swarming your location with batons and knockout gas look like they disagree." database_id = MEDAL_GAMER - icon = "live_sec_reaction" + icon_state = "live_sec_reaction" /datum/award/achievement/misc/vendor_squish name = "I Was a Teenage Anarchist" @@ -69,161 +69,161 @@ name = "One Lean, Mean, Cleaning Machine" desc = "How does it feel to know that your workplace values a mop bucket on wheels more than you?" // i can do better than this give me time database_id = MEDAL_CLEANBOSS - icon = "cleanboss" + icon_state = "cleanboss" /datum/award/achievement/misc/rule8 name = "Rule 8" desc = "Call an admin this is ILLEGAL!!" database_id = MEDAL_RULE8 - icon = "rule8" + icon_state = "rule8" /datum/award/achievement/misc/speed_round name = "Long shift" desc = "Well, that didn't take long." database_id = MEDAL_LONGSHIFT - icon = "longshift" + icon_state = "longshift" /datum/award/achievement/misc/lookoutsir name = "Look Out, Sir!" desc = "Either awarded for making the ultimate sacrifice for your comrades, or a really dumb attempt at grenade jumping." database_id = MEDAL_LOOKOUTSIR - icon = "martyr" // purple heart on an explosive danger warning sign (well, sort of) + icon_state = "martyr" // purple heart on an explosive danger warning sign (well, sort of) /datum/award/achievement/misc/gottem name = "HA, GOTTEM" desc = "Made you look!" database_id = MEDAL_GOTTEM - icon = "gottem" + icon_state = "gottem" /datum/award/achievement/misc/ascension name = "Ascension" desc = "Caedite eos. Novit enim Dominus qui sunt eius." database_id = MEDAL_ASCENSION - icon = "ascension" + icon_state = "ascension" /datum/award/achievement/misc/ash_ascension name = "Nightwatcher's Eyes" desc = "You've risen above the flames, became one with the ashes. You've been reborn as one with the Nightwatcher." database_id = MEDAL_ASH_ASCENSION - icon = "ashascend" + icon_state = "ashascend" /datum/award/achievement/misc/flesh_ascension name = "Vortex of Arms" desc = "You've became something more, something greater. A piece of the emperor resides within you, and you within him." database_id = MEDAL_FLESH_ASCENSION - icon = "fleshascend" + icon_state = "fleshascend" /datum/award/achievement/misc/rust_ascension name = "Hills of Rust" desc = "You've summoned a piece of the Hill of rust, and so the Hills welcome you." database_id = MEDAL_RUST_ASCENSION - icon = "rustascend" + icon_state = "rustascend" /datum/award/achievement/misc/void_ascension name = "All that perish" desc = "Place of a different being, different time. Everything ends there... but maybe it is just the beginning?" database_id = MEDAL_VOID_ASCENSION - icon = "voidascend" + icon_state = "voidascend" /datum/award/achievement/misc/blade_ascension name = "Silver and Steel" desc = "You've become the master of all duellists - the paragon of blades." database_id = MEDAL_BLADE_ASCENSION - icon = "bladeascend" + icon_state = "bladeascend" /datum/award/achievement/misc/cosmic_ascension name = "It arrived" desc = "You managed to teleport an entity on the station that really shouldn't be there." database_id = MEDAL_COSMOS_ASCENSION - icon = "cosmicascend" + icon_state = "cosmicascend" /datum/award/achievement/misc/lock_ascension name = "Secrets of the Locked Labyrinth" desc = "You managed to open a gate into the mansus." database_id = MEDAL_LOCK_ASCENSION - icon = "lockascend" + icon_state = "lockascend" /datum/award/achievement/misc/moon_ascension name = "The Last Act" desc = "You managed to become the ringleader and slay the lie." database_id = MEDAL_MOON_ASCENSION - icon = "moonascend" + icon_state = "moonascend" /datum/award/achievement/misc/grand_ritual_finale name = "Archmage" desc = "Made a big impression on the station with your phenomenal cosmic power." database_id = MEDAL_ARCHMAGE - icon = "archmage" + icon_state = "archmage" /datum/award/achievement/misc/toolbox_soul name = "SOUL'd Out" desc = "My eternal soul was destroyed to make a toolbox look funny and all I got was this achievement..." database_id = MEDAL_TOOLBOX_SOUL - icon = "toolbox_soul" + icon_state = "toolbox_soul" /datum/award/achievement/misc/hot_damn name = "Hot Damn!" desc = "Sometimes you need to make some noise to make a point." database_id = MEDAL_HOT_DAMN - icon = "hotdamn" + icon_state = "hotdamn" /datum/award/achievement/misc/cayenne_disk name = "Very Important Piscis" desc = "You can rest well now." database_id = MEDAL_CAYENNE_DISK - icon = "cayenne_disk" + icon_state = "cayenne_disk" /datum/award/achievement/misc/tram_surfer name = "Tram Surfer" desc = "Lights out, guerilla radio!" database_id = MEDAL_TRAM_SURFER - icon = "tram_surfer" + icon_state = "tram_surfer" /datum/award/achievement/misc/cult_shuttle_omfg name = "WHAT JUST HAPPENED" desc = "As a blood cultist, be part of a team that summons 3 shuttle curses within 10 seconds. Imagine cleaning up after them, g r o s s!" database_id = MEDAL_CULT_SHUTTLE_OMFG - icon = "cult_shuttle_omfg" + icon_state = "cult_shuttle_omfg" /datum/award/achievement/misc/clickbait name = "Clickbait" desc = "Where's my free smartphone?!?" database_id = MEDAL_CLICKBAIT - icon = "bait" + icon_state = "bait" /datum/award/achievement/misc/narsupreme name = "If Nar'Sie is so good, why isn't there a..." desc = "Even interdimensional space deitys need a friend." database_id = MEDAL_NARSUPREME - icon = "narsupreme" + icon_state = "narsupreme" /datum/award/achievement/misc/springlock name = "The Man Inside the MODsuit" desc = "Ignore the warning label on a springlock MODsuit." database_id = MEDAL_SPRINGLOCK - icon = "springlock" + icon_state = "springlock" /datum/award/achievement/misc/healthy name = "The Picture of Health" desc = "Don't be such a baby, it's just a heart attack. You've bounced back from worse!" database_id = MEDAL_HEALTHY - icon = "picofhealth" + icon_state = "picofhealth" /datum/award/achievement/misc/gods_wrath name = "God's Wrath" desc = "Did you think you could get away with defiling the word of God?" database_id = MEDAL_GODS_WRATH - icon = "godswrath" + icon_state = "godswrath" /datum/award/achievement/misc/earthquake_victim name = "A Nasty Fall" desc = "...And the earth opened its mouth and swallowed them and their station- all the HOP's men and all their possessions." database_id = MEDAL_EARTHQUAKE_VICTIM - icon = "earthquake" + icon_state = "earthquake" /datum/award/achievement/misc/debt_extinguished name = "Outdebted" desc = "I've paid my dues, shift after shift... I've done my sentence but commited no griff..." database_id = MEDAL_DEBT_EXTINGUISHED - icon = "outdebted" + icon_state = "outdebted" diff --git a/code/datums/achievements/skill_achievements.dm b/code/datums/achievements/skill_achievements.dm index 6384b1b3db4ad..7e2f3f1a24742 100644 --- a/code/datums/achievements/skill_achievements.dm +++ b/code/datums/achievements/skill_achievements.dm @@ -5,10 +5,10 @@ name = "Legendary miner" desc = "No mere rock can stop me!" database_id = MEDAL_LEGENDARY_MINER - icon = "mining" + icon_state = "mining" /datum/award/achievement/skill/legendary_fisher name = "Legendary fisher" desc = "Give a spaceman a fish and you feed him for a while; teach a spaceman to fish and you feed him until the shuttle arrives." database_id = MEDAL_LEGENDARY_FISHER - icon = "fishing_hat" + icon_state = "fishing_hat" diff --git a/code/datums/actions/action.dm b/code/datums/actions/action.dm index 75c9cf59aebf2..39e69ba9fa8fd 100644 --- a/code/datums/actions/action.dm +++ b/code/datums/actions/action.dm @@ -46,6 +46,10 @@ var/overlay_icon = 'icons/mob/actions/backgrounds.dmi' /// This is the icon state for any FOREGROUND overlay icons on the button (such as borders) var/overlay_icon_state + + /// full key we are bound to + var/full_key + /// Toggles whether this action is usable or not var/action_disabled = FALSE @@ -110,6 +114,7 @@ RegisterSignals(owner, list(SIGNAL_ADDTRAIT(TRAIT_MAGICALLY_PHASED), SIGNAL_REMOVETRAIT(TRAIT_MAGICALLY_PHASED)), PROC_REF(update_status_on_signal)) if(owner_has_control) + RegisterSignal(grant_to, COMSIG_MOB_KEYDOWN, PROC_REF(keydown), override = TRUE) GiveAction(grant_to) /// Remove the passed mob from being owner of our action @@ -122,6 +127,7 @@ HideFrom(hud.mymob) LAZYREMOVE(remove_from?.actions, src) // We aren't always properly inserted into the viewers list, gotta make sure that action's cleared viewers = list() + UnregisterSignal(remove_from, COMSIG_MOB_KEYDOWN) if(isnull(owner)) return @@ -312,6 +318,7 @@ * force - whether an update is forced regardless of existing status */ /datum/action/proc/update_button_status(atom/movable/screen/movable/action_button/current_button, force = FALSE) + current_button.update_keybind_maptext(full_key) if(IsAvailable()) current_button.color = rgb(255,255,255,255) else @@ -411,3 +418,14 @@ /// Checks if our action is actively selected. Used for selecting icons primarily. /datum/action/proc/is_action_active(atom/movable/screen/movable/action_button/current_button) return FALSE + +/datum/action/proc/keydown(mob/source, key, client/client, full_key) + SIGNAL_HANDLER + if(isnull(full_key) || full_key != src.full_key) + return + if(istype(source)) + if(source.next_click > world.time) + return + else + source.next_click = world.time + CLICK_CD_RANGE + INVOKE_ASYNC(src, PROC_REF(Trigger)) diff --git a/code/datums/actions/mobs/assume_form.dm b/code/datums/actions/mobs/assume_form.dm index a335d0e745dc5..03a1a38d3c84a 100644 --- a/code/datums/actions/mobs/assume_form.dm +++ b/code/datums/actions/mobs/assume_form.dm @@ -64,7 +64,7 @@ // important: do this at the very end because we might have SIGNAL_ADDTRAIT for this on the mob that's dependent on the above logic SEND_SIGNAL(owner, COMSIG_ACTION_DISGUISED_APPEARANCE, target_atom) - ADD_TRAIT(owner, TRAIT_DISGUISED, REF(src)) + ADD_TRAIT(owner, TRAIT_DISGUISED, ACTION_TRAIT) /// Resets the appearances of the mob to the default. /datum/action/cooldown/mob_cooldown/assume_form/proc/reset_appearances() @@ -85,4 +85,4 @@ owner.cut_overlays() // important: do this very end because we might have SIGNAL_REMOVETRAIT for this on the mob that's dependent on the above logic - REMOVE_TRAIT(owner, TRAIT_DISGUISED, REF(src)) + REMOVE_TRAIT(owner, TRAIT_DISGUISED, ACTION_TRAIT) diff --git a/code/datums/actions/mobs/charge.dm b/code/datums/actions/mobs/charge.dm index 9b8e1c36ef81c..1a3afba14d159 100644 --- a/code/datums/actions/mobs/charge.dm +++ b/code/datums/actions/mobs/charge.dm @@ -304,8 +304,8 @@ /datum/action/cooldown/mob_cooldown/charge/hallucination_charge/hallucination_surround name = "Surround Target" - button_icon = 'icons/turf/walls/wall.dmi' - button_icon_state = "wall-0" + button_icon = 'icons/mob/actions/actions_animal.dmi' + button_icon_state = "expand" desc = "Allows you to create hallucinations that charge around your target." charge_delay = 0.6 SECONDS charge_past = 2 diff --git a/code/datums/actions/mobs/lava_swoop.dm b/code/datums/actions/mobs/lava_swoop.dm index b86a710fbf227..a6c8282fd10c0 100644 --- a/code/datums/actions/mobs/lava_swoop.dm +++ b/code/datums/actions/mobs/lava_swoop.dm @@ -14,11 +14,11 @@ /datum/action/cooldown/mob_cooldown/lava_swoop/Grant(mob/M) . = ..() - M.add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_NOFIRE), REF(src)) + M.add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_NOFIRE), ACTION_TRAIT) /datum/action/cooldown/mob_cooldown/lava_swoop/Remove(mob/M) . = ..() - M.remove_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_NOFIRE), REF(src)) + M.remove_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_NOFIRE), ACTION_TRAIT) /datum/action/cooldown/mob_cooldown/lava_swoop/Activate(atom/target_atom) disable_cooldown_actions() diff --git a/code/datums/actions/mobs/sign_language.dm b/code/datums/actions/mobs/sign_language.dm index da375fd1f8577..20c1157f32652 100644 --- a/code/datums/actions/mobs/sign_language.dm +++ b/code/datums/actions/mobs/sign_language.dm @@ -42,17 +42,17 @@ SIGNAL_ADDTRAIT(TRAIT_MUTE), SIGNAL_REMOVETRAIT(TRAIT_MUTE) )) - REMOVE_TRAIT(grant_to, TRAIT_SIGN_LANG, TRAIT_GENERIC) + REMOVE_TRAIT(grant_to, TRAIT_SIGN_LANG, ACTION_TRAIT) /datum/action/innate/sign_language/Activate() active = TRUE - ADD_TRAIT(owner, TRAIT_SIGN_LANG, TRAIT_GENERIC) + ADD_TRAIT(owner, TRAIT_SIGN_LANG, ACTION_TRAIT) to_chat(owner, span_green("You are now communicating with sign language.")) build_all_button_icons(UPDATE_BUTTON_BACKGROUND) /datum/action/innate/sign_language/Deactivate() active = FALSE - REMOVE_TRAIT(owner, TRAIT_SIGN_LANG, TRAIT_GENERIC) + REMOVE_TRAIT(owner, TRAIT_SIGN_LANG, ACTION_TRAIT) to_chat(owner, span_green("You have stopped using sign language.")) build_all_button_icons(UPDATE_BUTTON_BACKGROUND) diff --git a/code/datums/actions/mobs/sneak.dm b/code/datums/actions/mobs/sneak.dm index 738bb7b70cf5d..521181fa19b15 100644 --- a/code/datums/actions/mobs/sneak.dm +++ b/code/datums/actions/mobs/sneak.dm @@ -16,7 +16,7 @@ /datum/action/cooldown/mob_cooldown/sneak/Remove(mob/living/remove_from) if(HAS_TRAIT(remove_from, TRAIT_SNEAK)) remove_from.alpha = initial(remove_from.alpha) - REMOVE_TRAIT(remove_from, TRAIT_SNEAK, name) + REMOVE_TRAIT(remove_from, TRAIT_SNEAK, ACTION_TRAIT) return ..() @@ -26,11 +26,11 @@ // Otherwise we get permanent invisbility exploits. animate(owner, alpha = initial(owner.alpha), time = animation_time) owner.balloon_alert(owner, "you reveal yourself") - REMOVE_TRAIT(owner, TRAIT_SNEAK, name) + REMOVE_TRAIT(owner, TRAIT_SNEAK, ACTION_TRAIT) else animate(owner, alpha = sneak_alpha, time = animation_time) owner.balloon_alert(owner, "you blend into the environment") - ADD_TRAIT(owner, TRAIT_SNEAK, name) + ADD_TRAIT(owner, TRAIT_SNEAK, ACTION_TRAIT) return TRUE diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm index 0f7fe6ef142f2..144de535d5a84 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm @@ -8,7 +8,8 @@ . = ..() if(!controller.blackboard[targeting_strategy_key]) CRASH("No targeting strategy was supplied in the blackboard for [controller.pawn]") - + if(HAS_TRAIT(controller.pawn, TRAIT_HANDS_BLOCKED)) + return FALSE //Hiding location is priority var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] if(QDELETED(target)) @@ -67,6 +68,8 @@ /datum/ai_behavior/basic_ranged_attack/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) . = ..() + if(HAS_TRAIT(controller.pawn, TRAIT_HANDS_BLOCKED)) + return FALSE var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] if(QDELETED(target)) return FALSE diff --git a/code/datums/ai/hunting_behavior/hunting_mouse.dm b/code/datums/ai/hunting_behavior/hunting_mouse.dm index d4160f826dd6b..d0e7161fd2de6 100644 --- a/code/datums/ai/hunting_behavior/hunting_mouse.dm +++ b/code/datums/ai/hunting_behavior/hunting_mouse.dm @@ -11,7 +11,7 @@ finding_behavior = /datum/ai_behavior/find_hunt_target/mouse_cable hunt_targets = list(/obj/structure/cable) hunt_range = 0 // Only look below us - hunt_chance = 5 + hunt_chance = 1 // When looking for a cable, we can only bite things we can reach. /datum/ai_behavior/find_hunt_target/mouse_cable diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm index ecfedb86dafd5..215f0a96302f3 100644 --- a/code/datums/ai/monkey/monkey_controller.dm +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -76,7 +76,8 @@ have ways of interacting with a specific mob and control it. return AI_CONTROLLER_INCOMPATIBLE var/mob/living/living_pawn = new_pawn - living_pawn.AddElement(/datum/element/relay_attackers) + if(!HAS_TRAIT(living_pawn, TRAIT_RELAYING_ATTACKER)) + 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)) diff --git a/code/datums/ai/objects/vending_machines/vending_machine_controller.dm b/code/datums/ai/objects/vending_machines/vending_machine_controller.dm index cd779b7d691f0..50523db946ca6 100644 --- a/code/datums/ai/objects/vending_machines/vending_machine_controller.dm +++ b/code/datums/ai/objects/vending_machines/vending_machine_controller.dm @@ -14,7 +14,7 @@ return AI_CONTROLLER_INCOMPATIBLE var/obj/machinery/vending/vendor_pawn = new_pawn vendor_pawn.tiltable = FALSE //Not manually tiltable by hitting it anymore. We are now aggressively doing it ourselves. - vendor_pawn.AddElement(/datum/element/waddling) + vendor_pawn.AddElementTrait(TRAIT_WADDLING, REF(src), /datum/element/waddling) vendor_pawn.AddElement(/datum/element/footstep, FOOTSTEP_OBJ_MACHINE, 1, -6, sound_vary = TRUE) vendor_pawn.squish_damage = 15 return ..() //Run parent at end @@ -22,7 +22,7 @@ /datum/ai_controller/vending_machine/UnpossessPawn(destroy) var/obj/machinery/vending/vendor_pawn = pawn vendor_pawn.tiltable = TRUE - vendor_pawn.RemoveElement(/datum/element/waddling) + REMOVE_TRAIT(vendor_pawn, TRAIT_WADDLING, REF(src)) vendor_pawn.squish_damage = initial(vendor_pawn.squish_damage) RemoveElement(/datum/element/footstep, FOOTSTEP_OBJ_MACHINE, 1, -6, sound_vary = TRUE) return ..() //Run parent at end diff --git a/code/datums/ai_laws/laws_neutral.dm b/code/datums/ai_laws/laws_neutral.dm index 2fe19dafbc517..7adef14d95b89 100644 --- a/code/datums/ai_laws/laws_neutral.dm +++ b/code/datums/ai_laws/laws_neutral.dm @@ -60,6 +60,7 @@ "You are a universally renowned artist.", "The station is your canvas.", "Make something beautiful out of your canvas. It will be admired as an artistic wonder of this sector.", + "Art requires appreciation. Cultivate an audience aboard the station to ensure as many as possible see your works.", ) /datum/ai_laws/tyrant diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index 651881292e9c7..31f316221301e 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -267,11 +267,11 @@ lose_text = span_warning("You realize you can feel pain again.") /datum/brain_trauma/special/tenacity/on_gain() - owner.add_traits(list(TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT), TRAUMA_TRAIT) + owner.add_traits(list(TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_ANALGESIA), TRAUMA_TRAIT) ..() /datum/brain_trauma/special/tenacity/on_lose() - owner.remove_traits(list(TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT), TRAUMA_TRAIT) + owner.remove_traits(list(TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_ANALGESIA), TRAUMA_TRAIT) ..() /datum/brain_trauma/special/death_whispers @@ -426,3 +426,49 @@ to_chat(victim, "[span_name("[name]")] exclaims, \"[span_robot("[beepskys_cry]")]") if(victim.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat)) victim.create_chat_message(src, raw_message = beepskys_cry, spans = list("robotic")) + +// Used by Veteran Security Advisor job. +/datum/brain_trauma/special/ptsd + name = "Combat PTSD" + desc = "The patient is experiencing PTSD stemming from past combat exposure, resulting in a lack of emotions. Additionally, they are experiencing mild hallucinations." + scan_desc = "PTSD" + gain_text = span_warning("You're thrust back into the chaos of past! Explosions! Gunfire! Emotions, gone AWOL!") + lose_text = span_notice("You feel flashbacks of past fade, as your emotions return and mind clear.") + resilience = TRAUMA_RESILIENCE_ABSOLUTE + can_gain = TRUE + random_gain = FALSE + /// Our cooldown declare for causing hallucinations + COOLDOWN_DECLARE(ptsd_hallucinations) + var/list/ptsd_hallucinations_list = list( + /datum/hallucination/fake_sound/normal/boom, + /datum/hallucination/fake_sound/normal/distant_boom, + /datum/hallucination/stray_bullet, + /datum/hallucination/battle/gun/disabler, + /datum/hallucination/battle/gun/laser, + /datum/hallucination/battle/bomb, + /datum/hallucination/battle/e_sword, + /datum/hallucination/battle/harm_baton, + /datum/hallucination/battle/stun_prod, + ) + +/datum/brain_trauma/special/ptsd/on_life(seconds_per_tick, times_fired) + if(owner.stat != CONSCIOUS) + return + + if(!COOLDOWN_FINISHED(src, ptsd_hallucinations)) + return + + owner.cause_hallucination(pick(ptsd_hallucinations_list), "Caused by The Combat PTSD brain trauma") + COOLDOWN_START(src, ptsd_hallucinations, rand(10 SECONDS, 10 MINUTES)) + +/datum/brain_trauma/special/ptsd/on_gain() + owner.add_mood_event("combat_ptsd", /datum/mood_event/desentized) + owner.mob_mood?.mood_modifier -= 1 //Basically nothing can change your mood + owner.mob_mood?.sanity_level = SANITY_DISTURBED //Makes sanity on a unstable level unless cured + ..() + +/datum/brain_trauma/special/ptsd/on_lose() + owner.clear_mood_event("combat_ptsd") + owner.mob_mood?.mood_modifier += 1 + owner.mob_mood?.sanity_level = SANITY_GREAT + return ..() diff --git a/code/datums/components/bloody_spreader.dm b/code/datums/components/bloody_spreader.dm index 951136c890c01..b30000a115c6a 100644 --- a/code/datums/components/bloody_spreader.dm +++ b/code/datums/components/bloody_spreader.dm @@ -7,7 +7,7 @@ // Blood splashed around everywhere will carry these diseases. Oh no... var/list/diseases -/datum/component/bloody_spreader/Initialize(blood_left, list/blood_dna, list/diseases) +/datum/component/bloody_spreader/Initialize(blood_left = INFINITY, list/blood_dna, list/diseases) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE var/list/signals_to_add = list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACKBY) @@ -33,6 +33,9 @@ /datum/component/bloody_spreader/proc/spread_yucky_blood(atom/parent, atom/bloody_fool) SIGNAL_HANDLER bloody_fool.add_blood_DNA(blood_dna, diseases) + blood_left-- + if(blood_left <= 0) + qdel(src) /datum/component/bloody_spreader/InheritComponent(/datum/component/new_comp, i_am_original, blood_left = 0) diff --git a/code/datums/components/bloodysoles.dm b/code/datums/components/bloodysoles.dm index a79d4b385c20b..e1a60112c901f 100644 --- a/code/datums/components/bloodysoles.dm +++ b/code/datums/components/bloodysoles.dm @@ -21,6 +21,8 @@ /// The world.time when we last picked up blood var/last_pickup + var/footprint_sprite = FOOTPRINT_SPRITE_SHOES + /datum/component/bloodysoles/Initialize() if(!isclothing(parent)) return COMPONENT_INCOMPATIBLE @@ -113,9 +115,9 @@ /** * Find a blood decal on a turf that matches our last_blood_state */ -/datum/component/bloodysoles/proc/find_pool_by_blood_state(turf/turfLoc, typeFilter = null) +/datum/component/bloodysoles/proc/find_pool_by_blood_state(turf/turfLoc, typeFilter = null, footprint_sprite) for(var/obj/effect/decal/cleanable/blood/pool in turfLoc) - if(pool.blood_state == last_blood_state && (!typeFilter || istype(pool, typeFilter))) + if(pool.blood_state == last_blood_state && pool.footprint_sprite == footprint_sprite && (!typeFilter || istype(pool, typeFilter))) return pool /** @@ -171,23 +173,23 @@ return var/half_our_blood = bloody_shoes[last_blood_state] / 2 - + var/footprint_sprite = wielder.get_footprint_sprite() // Add footprints in old loc if we have enough cream if(half_our_blood >= BLOOD_FOOTPRINTS_MIN) var/turf/oldLocTurf = get_turf(OldLoc) - var/obj/effect/decal/cleanable/blood/footprints/oldLocFP = find_pool_by_blood_state(oldLocTurf, /obj/effect/decal/cleanable/blood/footprints) + var/obj/effect/decal/cleanable/blood/footprints/oldLocFP = find_pool_by_blood_state(oldLocTurf, /obj/effect/decal/cleanable/blood/footprints, footprint_sprite) if(oldLocFP) // Footprints found in the tile we left, add us to it add_parent_to_footprint(oldLocFP) if (!(oldLocFP.exited_dirs & wielder.dir)) oldLocFP.exited_dirs |= wielder.dir oldLocFP.update_appearance() - else if(find_pool_by_blood_state(oldLocTurf)) + else if(find_pool_by_blood_state(oldLocTurf, footprint_sprite = footprint_sprite)) // No footprints in the tile we left, but there was some other blood pool there. Add exit footprints on it adjust_bloody_shoes(last_blood_state, half_our_blood) update_icon() - oldLocFP = new(oldLocTurf) + oldLocFP = new(oldLocTurf, footprint_sprite) if(!QDELETED(oldLocFP)) ///prints merged oldLocFP.blood_state = last_blood_state oldLocFP.exited_dirs |= wielder.dir @@ -207,7 +209,7 @@ adjust_bloody_shoes(last_blood_state, half_our_blood) update_icon() - var/obj/effect/decal/cleanable/blood/footprints/FP = new(get_turf(parent_atom)) + var/obj/effect/decal/cleanable/blood/footprints/FP = new(get_turf(parent_atom), footprint_sprite) if(!QDELETED(FP)) ///prints merged FP.blood_state = last_blood_state FP.entered_dirs |= wielder.dir @@ -266,7 +268,8 @@ return COMPONENT_INCOMPATIBLE parent_atom = parent wielder = parent - + if(footprint_sprite) + src.footprint_sprite = footprint_sprite if(!bloody_feet) bloody_feet = mutable_appearance('icons/effects/blood.dmi', "shoeblood", SHOES_LAYER) diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index 0cf6631f8074b..1f432efc73455 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -107,6 +107,12 @@ var/final_effectiveness = effectiveness - target.butcher_difficulty var/bonus_chance = max(0, (final_effectiveness - 100) + bonus_modifier) //so 125 total effectiveness = 25% extra chance + if(target.flags_1 & HOLOGRAM_1) + butcher.visible_message(span_notice("[butcher] tries to butcher [target], but it vanishes."), \ + span_notice("You try to butcher [target], but it vanishes.")) + qdel(target) + return + for(var/result_typepath in target.butcher_results) var/obj/remains = result_typepath var/amount = target.butcher_results[remains] diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 9829dfc3f52d6..b4406857ac1e3 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -109,6 +109,9 @@ return CHASM_NOT_DROPPING if(dropped_thing.throwing || (dropped_thing.movement_type & MOVETYPES_NOT_TOUCHING_GROUND)) return CHASM_REGISTER_SIGNALS + for(var/atom/thing_to_check as anything in parent) + if(HAS_TRAIT(thing_to_check, TRAIT_CHASM_STOPPER)) + return CHASM_NOT_DROPPING //Flies right over the chasm if(ismob(dropped_thing)) diff --git a/code/datums/components/cleaner.dm b/code/datums/components/cleaner.dm index 242ad72071cf5..49f200b4b9286 100644 --- a/code/datums/components/cleaner.dm +++ b/code/datums/components/cleaner.dm @@ -89,9 +89,8 @@ */ /datum/component/cleaner/proc/clean(datum/source, atom/target, mob/living/user, clean_target = TRUE) //make sure we don't attempt to clean something while it's already being cleaned - if(HAS_TRAIT(target, TRAIT_CURRENTLY_CLEANING)) + if(HAS_TRAIT(target, TRAIT_CURRENTLY_CLEANING) || (SEND_SIGNAL(target, COMSIG_ATOM_PRE_CLEAN, user) & COMSIG_ATOM_CANCEL_CLEAN)) return - //add the trait and overlay ADD_TRAIT(target, TRAIT_CURRENTLY_CLEANING, REF(src)) // We need to update our planes on overlay changes diff --git a/code/datums/components/crafting/atmospheric.dm b/code/datums/components/crafting/atmospheric.dm index 955c9704abda5..cb5bba9ab52b2 100644 --- a/code/datums/components/crafting/atmospheric.dm +++ b/code/datums/components/crafting/atmospheric.dm @@ -12,7 +12,7 @@ /datum/crafting_recipe/pipe name = "Smart pipe fitting" tool_behaviors = list(TOOL_WRENCH) - result = /obj/item/pipe/quaternary/pipe + result = /obj/item/pipe/quaternary/pipe/crafted reqs = list(/obj/item/stack/sheet/iron = 1) time = 0.5 SECONDS category = CAT_ATMOSPHERIC @@ -38,14 +38,6 @@ ) blacklist = list(/obj/item/analyzer/ranged) -/datum/crafting_recipe/pipe/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/smart - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.p_init_dir = ALL_CARDINALS - crafted_pipe.setDir(SOUTH) - crafted_pipe.update() - /datum/crafting_recipe/layer_adapter name = "Layer manifold fitting" tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) diff --git a/code/datums/components/crafting/chemistry.dm b/code/datums/components/crafting/chemistry.dm index 5e3afae9e634d..62504103eca2c 100644 --- a/code/datums/components/crafting/chemistry.dm +++ b/code/datums/components/crafting/chemistry.dm @@ -1,14 +1,14 @@ /datum/crafting_recipe/improv_explosive - name = "IED" - result = /obj/item/grenade/iedcasing + name = "Improvised Explosive" + result = /obj/item/grenade/iedcasing/spawned + tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) reqs = list( - /datum/reagent/fuel = 50, - /obj/item/stack/cable_coil = 1, - /obj/item/assembly/igniter = 1, - /obj/item/reagent_containers/cup/soda_cans = 1, + /datum/reagent/fuel = 20, + /obj/item/stack/cable_coil = 15, + /obj/item/assembly/timer = 1, + /obj/item/pipe/quaternary/pipe = 1, ) - parts = list(/obj/item/reagent_containers/cup/soda_cans = 1) - time = 1.5 SECONDS + time = 6 SECONDS category = CAT_CHEMISTRY /datum/crafting_recipe/molotov diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm index 4b686fdd8e9d4..741d53ed56b6c 100644 --- a/code/datums/components/crafting/equipment.dm +++ b/code/datums/components/crafting/equipment.dm @@ -13,6 +13,16 @@ ..() blacklist |= subtypesof(/obj/item/shield/riot) +/datum/crafting_recipe/improvisedshield + name = "Improvised Shield" + result = /obj/item/shield/improvised + reqs = list( + /obj/item/stack/sheet/iron = 10, + /obj/item/stack/sticky_tape = 2, + ) + time = 4 SECONDS + category = CAT_EQUIPMENT + /datum/crafting_recipe/radiogloves name = "Radio Gloves" result = /obj/item/clothing/gloves/radio diff --git a/code/datums/components/creamed.dm b/code/datums/components/creamed.dm index d1c76b4759dba..be536bb792d97 100644 --- a/code/datums/components/creamed.dm +++ b/code/datums/components/creamed.dm @@ -39,9 +39,9 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list( qdel(src) return bodypart_overlay = new() - if(carbon_parent.bodytype & BODYTYPE_SNOUTED) //stupid, but external organ bodytypes are not stored on the limb + if(carbon_parent.bodyshape & BODYSHAPE_SNOUTED) //stupid, but external organ bodytypes are not stored on the limb bodypart_overlay.icon_state = "creampie_lizard" - else if(my_head.bodytype & BODYTYPE_MONKEY) + else if(my_head.bodyshape & BODYSHAPE_MONKEY) bodypart_overlay.icon_state = "creampie_monkey" else bodypart_overlay.icon_state = "creampie_human" diff --git a/code/datums/components/jetpack.dm b/code/datums/components/jetpack.dm index 3e0fd28ed8013..437660abc82e0 100644 --- a/code/datums/components/jetpack.dm +++ b/code/datums/components/jetpack.dm @@ -116,7 +116,7 @@ return if(user.throwing)//You don't must use jet if you thrown return - if(length(user.client.keys_held & user.client.movement_keys))//You use jet when press keys. yes. + if(user.client.intended_direction)//You use jet when press keys. yes. thrust() /datum/component/jetpack/proc/pre_move_react(mob/user) diff --git a/code/datums/components/marionette.dm b/code/datums/components/marionette.dm new file mode 100644 index 0000000000000..a2f58031768e0 --- /dev/null +++ b/code/datums/components/marionette.dm @@ -0,0 +1,77 @@ +/** + * Marionette component + * + * Upon being grabbed, we will align the direction of the parent with the direction of the grabber when they rotate. + * While grabbed, will also speak out whatever the original person says + */ +/datum/component/marionette + ///Reference to the mob that is grabbing us, which we hook signals to for marionette stuff. + var/mob/grabber + +/datum/component/marionette/Destroy() + if(grabber) + UnregisterSignal(grabber, list(COMSIG_MOVABLE_KEYBIND_FACE_DIR, COMSIG_MOB_SAY, COMSIG_QDELETING)) + grabber = null + return ..() + +/datum/component/marionette/RegisterWithParent() + RegisterSignal(parent, COMSIG_LIVING_TRYING_TO_PULL, PROC_REF(on_pull)) + RegisterSignal(parent, COMSIG_ATOM_NO_LONGER_PULLED, PROC_REF(on_stop_pull)) + +/datum/component/marionette/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_LIVING_TRYING_TO_PULL, + COMSIG_ATOM_NO_LONGER_PULLED, + )) + return ..() + +///Called when something starts pulling us, we now listen in to that thing for rotation. +/datum/component/marionette/proc/on_pull(atom/movable/source, atom/movable/puller, force) + SIGNAL_HANDLER + + if(!puller) + return + grabber = puller + RegisterSignal(grabber, COMSIG_MOVABLE_KEYBIND_FACE_DIR, PROC_REF(on_puller_turn)) + RegisterSignal(grabber, COMSIG_MOB_SAY, PROC_REF(on_puller_speech)) + RegisterSignal(grabber, COMSIG_QDELETING, PROC_REF(on_puller_qdel)) + +///Stopped pulling, we clear out signals and references. +/datum/component/marionette/proc/on_stop_pull(datum/source, atom/movable/was_pulling) + SIGNAL_HANDLER + if(grabber) + UnregisterSignal(grabber, list(COMSIG_MOVABLE_KEYBIND_FACE_DIR, COMSIG_MOB_SAY, COMSIG_QDELETING)) + grabber = null + +///Callled when the person grabbin us turns, we rotate to match their direction. +/datum/component/marionette/proc/on_puller_turn(mob/living/source, direction) + SIGNAL_HANDLER + var/atom/movable/parent_movable = parent + parent_movable.setDir(direction) + +///Called when the person grabbing us speaks, we lower their volume to 1 tile and speak what they said through us. +/datum/component/marionette/proc/on_puller_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + + if(HAS_TRAIT(grabber, TRAIT_SIGN_LANG)) + return + + var/message = speech_args[SPEECH_MESSAGE] + var/list/spans = speech_args[SPEECH_SPANS] + var/language = speech_args[SPEECH_LANGUAGE] + var/saymode = speech_args[SPEECH_SAYMODE] + var/atom/movable/movable_parent = parent + movable_parent.say( + message = message, + spans = spans.Copy(), + language = language, + forced = "[source]'s marionette", + saymode = saymode, + ) + speech_args[SPEECH_RANGE] = WHISPER_RANGE + +///Called when our puller is somehow deleted, we simply clear the reference to them. +/datum/component/marionette/proc/on_puller_qdel() + SIGNAL_HANDLER + + grabber = null diff --git a/code/datums/components/material/material_container.dm b/code/datums/components/material/material_container.dm index b69ae91825ea8..69f67d46df3a8 100644 --- a/code/datums/components/material/material_container.dm +++ b/code/datums/components/material/material_container.dm @@ -275,10 +275,9 @@ var/inserted = 0 //All messages to be displayed to chat var/list/chat_msgs = list() - //differs from held_item when using TK var/active_held = user.get_active_held_item() - + //storage items to retrive items from var/static/list/storage_items if(isnull(storage_items)) storage_items = list( @@ -288,7 +287,7 @@ ) //1st iteration consumes all items that do not have contents inside - //2nd iteration consumes items who do have contents inside(but they were consumed in the 1st iteration si its empty now) + //2nd iteration consumes items who do have contents inside(but they were consumed in the 1st iteration so its empty now) for(var/i in 1 to 2) //no point inserting more items if(inserted == MATERIAL_INSERT_ITEM_NO_SPACE) @@ -311,15 +310,11 @@ //can't allow abstract, hologram items if((target_item.item_flags & ABSTRACT) || (target_item.flags_1 & HOLOGRAM_1)) continue - //untouchable, move it out the way, code copied from recycler - if(target_item.resistance_flags & INDESTRUCTIBLE) - target_item.forceMove(get_turf(parent)) - continue //user defined conditions if(SEND_SIGNAL(src, COMSIG_MATCONTAINER_PRE_USER_INSERT, target_item, user) & MATCONTAINER_BLOCK_INSERT) continue - //item is either not allowed for redemption, not in the allowed types - if((target_item.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target_item, allowed_item_typecache))) + //item is either indestructible, not allowed for redemption or not in the allowed types + if((target_item.resistance_flags & INDESTRUCTIBLE) || (target_item.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target_item, allowed_item_typecache))) if(!(mat_container_flags & MATCONTAINER_SILENT) && i == 1) //count only child items the 1st time around var/list/status_data = chat_msgs["[MATERIAL_INSERT_ITEM_FAILURE]"] || list() var/list/item_data = status_data[target_item.name] || list() @@ -327,6 +322,10 @@ status_data[target_item.name] = item_data chat_msgs["[MATERIAL_INSERT_ITEM_FAILURE]"] = status_data + if(target_item.resistance_flags & INDESTRUCTIBLE) + if(i == 1 && target_item != active_held) //move it out of any storage medium its in so it doesn't get consumed with its parent, but only if that storage medium is not our hand + target_item.forceMove(get_turf(context)) + continue //storage items usually come here but we make the exception only on the 1st iteration //this is so players can insert items from their bags into machines for convinience if(!is_type_in_list(target_item, storage_items)) diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/components/material/remote_materials.dm index 97c6b4e62826c..e418d4276be10 100644 --- a/code/datums/components/material/remote_materials.dm +++ b/code/datums/components/material/remote_materials.dm @@ -118,6 +118,12 @@ handles linking back and forth. else silo.holds -= src +/** + * Sets the storage size for local materials when not linked with silo + * Arguments + * + * * size - the new size for local storage. measured in SHEET_MATERIAL_SIZE units + */ /datum/component/remote_materials/proc/set_local_size(size) local_size = size if (!silo && mat_container) @@ -209,7 +215,7 @@ handles linking back and forth. return check_z_level() ? silo.holds[src] : FALSE /** - * Internal proc to check if this connection can use any materials from the silo + * Check if this connection can use any materials from the silo * Returns true only if * - The parent is of type movable atom * - A mat container is actually present @@ -217,9 +223,7 @@ handles linking back and forth. * Arguments * * check_hold - should we check if the silo is on hold */ -/datum/component/remote_materials/proc/_can_use_resource(check_hold = TRUE) - PRIVATE_PROC(TRUE) - +/datum/component/remote_materials/proc/can_use_resource(check_hold = TRUE) var/atom/movable/movable_parent = parent if (!istype(movable_parent)) return FALSE @@ -243,7 +247,7 @@ handles linking back and forth. * name- For logging only. the design you are trying to build e.g. matter bin, etc. */ /datum/component/remote_materials/proc/use_materials(list/mats, coefficient = 1, multiplier = 1, action = "build", name = "design") - if(!_can_use_resource()) + if(!can_use_resource()) return 0 var/amount_consumed = mat_container.use_materials(mats, coefficient, multiplier) @@ -265,7 +269,7 @@ handles linking back and forth. * [drop_target][atom]- optional where to drop the sheets. null means it is dropped at this components parent location */ /datum/component/remote_materials/proc/eject_sheets(datum/material/material_ref, eject_amount, atom/drop_target = null) - if(!_can_use_resource()) + if(!can_use_resource()) return 0 var/atom/movable/movable_parent = parent @@ -282,7 +286,7 @@ handles linking back and forth. * * multiplier - the multiplier applied on the materials consumed */ /datum/component/remote_materials/proc/insert_item(obj/item/weapon, multiplier = 1) - if(!_can_use_resource(FALSE)) + if(!can_use_resource(FALSE)) return MATERIAL_INSERT_ITEM_FAILURE return mat_container.insert_item(weapon, multiplier, parent) diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index 180c65b2239b7..efff82b703a6c 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -78,8 +78,8 @@ return COMPONENT_INCOMPATIBLE var/atom/movable/movable_parent = parent - if(movable_parent.light_system != MOVABLE_LIGHT && movable_parent.light_system != MOVABLE_LIGHT_DIRECTIONAL && movable_parent.light_system != MOVABLE_LIGHT_BEAM) - stack_trace("[type] added to [parent], with [movable_parent.light_system] value for the light_system var. Use [MOVABLE_LIGHT], [MOVABLE_LIGHT_DIRECTIONAL] or [MOVABLE_LIGHT_BEAM] instead.") + if(movable_parent.light_system != OVERLAY_LIGHT && movable_parent.light_system != OVERLAY_LIGHT_DIRECTIONAL && movable_parent.light_system != OVERLAY_LIGHT_BEAM) + stack_trace("[type] added to [parent], with [movable_parent.light_system] value for the light_system var. Use [OVERLAY_LIGHT], [OVERLAY_LIGHT_DIRECTIONAL] or [OVERLAY_LIGHT_BEAM] instead.") return COMPONENT_INCOMPATIBLE . = ..() diff --git a/code/datums/components/payment.dm b/code/datums/components/payment.dm index 005cd1fe03ea7..1220614e9c386 100644 --- a/code/datums/components/payment.dm +++ b/code/datums/components/payment.dm @@ -114,8 +114,7 @@ physical_cash_total -= total_cost if(physical_cash_total > 0) - var/obj/item/holochip/holochange = new /obj/item/holochip(user.loc) //Change is made in holocredits exclusively. - holochange.credits = physical_cash_total + var/obj/item/holochip/holochange = new /obj/item/holochip(user.loc, physical_cash_total) //Change is made in holocredits exclusively. holochange.name = "[holochange.credits] credit holochip" if(ishuman(user)) var/mob/living/carbon/human/paying_customer = user diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 4bcfa8b01c9b9..7c55579c9992d 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -1,6 +1,6 @@ /datum/component/simple_rotation /// Additional stuff to do after rotation - var/datum/callback/AfterRotation + var/datum/callback/post_rotation /// Rotation flags for special behavior var/rotation_flags = NONE @@ -9,9 +9,9 @@ * * args: * * rotation_flags (optional) Bitflags that determine behavior for rotation (defined at the top of this file) - * * AfterRotation (optional) Callback proc that is used after the object is rotated (sound effects, balloon alerts, etc.) -**/ -/datum/component/simple_rotation/Initialize(rotation_flags = NONE, AfterRotation) + * * post_rotation (optional) Callback proc that is used after the object is rotated (sound effects, balloon alerts, etc.) + **/ +/datum/component/simple_rotation/Initialize(rotation_flags = NONE, post_rotation) if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE @@ -19,19 +19,13 @@ source.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 src.rotation_flags = rotation_flags - src.AfterRotation = AfterRotation || CALLBACK(src, PROC_REF(DefaultAfterRotation)) + src.post_rotation = post_rotation || CALLBACK(src, PROC_REF(default_post_rotation)) -/datum/component/simple_rotation/proc/AddSignals() - RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(RotateLeft)) - RegisterSignal(parent, COMSIG_CLICK_ALT_SECONDARY, PROC_REF(RotateRight)) +/datum/component/simple_rotation/RegisterWithParent() + RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(rotate_left)) + RegisterSignal(parent, COMSIG_CLICK_ALT_SECONDARY, PROC_REF(rotate_right)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(ExamineMessage)) RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) - -/datum/component/simple_rotation/proc/RemoveSignals() - UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_CLICK_ALT_SECONDARY, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM)) - -/datum/component/simple_rotation/RegisterWithParent() - AddSignals() return ..() /datum/component/simple_rotation/PostTransfer() @@ -41,15 +35,16 @@ return COMPONENT_NOTRANSFER /datum/component/simple_rotation/UnregisterFromParent() - RemoveSignals() + UnregisterSignal(parent, list( + COMSIG_CLICK_ALT, + COMSIG_CLICK_ALT_SECONDARY, + COMSIG_ATOM_EXAMINE, + COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, + )) return ..() /datum/component/simple_rotation/Destroy() - AfterRotation = null - //Signals + verbs removed via UnRegister - return ..() - -/datum/component/simple_rotation/ClearFromParent() + post_rotation = null return ..() /datum/component/simple_rotation/proc/ExamineMessage(datum/source, mob/user, list/examine_list) @@ -57,15 +52,15 @@ if(rotation_flags & ROTATION_REQUIRE_WRENCH) examine_list += span_notice("This requires a wrench to be rotated.") -/datum/component/simple_rotation/proc/RotateRight(datum/source, mob/user) +/datum/component/simple_rotation/proc/rotate_right(datum/source, mob/user) SIGNAL_HANDLER - Rotate(user, ROTATION_CLOCKWISE) + rotate(user, ROTATION_CLOCKWISE) -/datum/component/simple_rotation/proc/RotateLeft(datum/source, mob/user) +/datum/component/simple_rotation/proc/rotate_left(datum/source, mob/user) SIGNAL_HANDLER - Rotate(user, ROTATION_COUNTERCLOCKWISE) + rotate(user, ROTATION_COUNTERCLOCKWISE) -/datum/component/simple_rotation/proc/Rotate(mob/user, degrees) +/datum/component/simple_rotation/proc/rotate(mob/user, degrees) if(QDELETED(user)) CRASH("[src] is being rotated [user ? "with a qdeleting" : "without a"] user") if(!istype(user)) @@ -73,7 +68,7 @@ if(!isnum(degrees)) CRASH("[src] is being rotated without providing the amount of degrees needed") - if(!CanBeRotated(user, degrees) || !CanUserRotate(user, degrees)) + if(!can_be_rotated(user, degrees) || !can_user_rotate(user, degrees)) return var/obj/rotated_obj = parent @@ -81,16 +76,16 @@ if(rotation_flags & ROTATION_REQUIRE_WRENCH) playsound(rotated_obj, 'sound/items/ratchet.ogg', 50, TRUE) - AfterRotation.Invoke(user, degrees) + post_rotation.Invoke(user, degrees) -/datum/component/simple_rotation/proc/CanUserRotate(mob/user, degrees) +/datum/component/simple_rotation/proc/can_user_rotate(mob/user, degrees) if(isliving(user) && user.can_perform_action(parent, NEED_DEXTERITY)) return TRUE if((rotation_flags & ROTATION_GHOSTS_ALLOWED) && isobserver(user) && CONFIG_GET(flag/ghost_interaction)) return TRUE return FALSE -/datum/component/simple_rotation/proc/CanBeRotated(mob/user, degrees, silent=FALSE) +/datum/component/simple_rotation/proc/can_be_rotated(mob/user, degrees, silent=FALSE) var/obj/rotated_obj = parent if(!rotated_obj.Adjacent(user)) silent = TRUE @@ -120,7 +115,7 @@ return FALSE return TRUE -/datum/component/simple_rotation/proc/DefaultAfterRotation(mob/user, degrees) +/datum/component/simple_rotation/proc/default_post_rotation(mob/user, degrees) return // maybe we don't need the item context proc but instead the hand one? since we don't need to check held_item @@ -129,10 +124,10 @@ var/rotation_screentip = FALSE - if(CanBeRotated(user, ROTATION_CLOCKWISE, silent=TRUE)) + if(can_be_rotated(user, ROTATION_CLOCKWISE, silent=TRUE)) context[SCREENTIP_CONTEXT_ALT_LMB] = "Rotate left" rotation_screentip = TRUE - if(CanBeRotated(user, ROTATION_COUNTERCLOCKWISE, silent=TRUE)) + if(can_be_rotated(user, ROTATION_COUNTERCLOCKWISE, silent=TRUE)) context[SCREENTIP_CONTEXT_ALT_RMB] = "Rotate right" rotation_screentip = TRUE diff --git a/code/datums/components/scope.dm b/code/datums/components/scope.dm index b413b6f8e51ac..531ff9e9962df 100644 --- a/code/datums/components/scope.dm +++ b/code/datums/components/scope.dm @@ -60,7 +60,7 @@ stop_zooming(user_mob) return tracker.calculate_params() - if(!length(user_client.keys_held & user_client.movement_keys)) + if(!user_client.intended_direction) user_mob.face_atom(tracker.given_turf) animate(user_client, world.tick_lag, pixel_x = tracker.given_x, pixel_y = tracker.given_y) diff --git a/code/datums/components/surgery_initiator.dm b/code/datums/components/surgery_initiator.dm index 1cc60d78b5557..f4bd7f0d9f500 100644 --- a/code/datums/components/surgery_initiator.dm +++ b/code/datums/components/surgery_initiator.dm @@ -81,32 +81,31 @@ /datum/component/surgery_initiator/proc/get_available_surgeries(mob/user, mob/living/target) var/list/available_surgeries = list() - var/mob/living/carbon/carbon_target - var/obj/item/bodypart/affecting - if (iscarbon(target)) - carbon_target = target - affecting = carbon_target.get_bodypart(check_zone(user.zone_selected)) + var/obj/item/bodypart/affecting = target.get_bodypart(check_zone(user.zone_selected)) for(var/datum/surgery/surgery as anything in GLOB.surgeries_list) if(!surgery.possible_locs.Find(user.zone_selected)) continue - if(affecting) - if(!(surgery.surgery_flags & SURGERY_REQUIRE_LIMB)) + if(!is_type_in_list(target, surgery.target_mobtypes)) + continue + + if(isnull(affecting)) + if(surgery.surgery_flags & SURGERY_REQUIRE_LIMB) continue + else if(surgery.requires_bodypart_type && !(affecting.bodytype & surgery.requires_bodypart_type)) continue + if(surgery.targetable_wound && !affecting.get_wound_type(surgery.targetable_wound)) + continue if((surgery.surgery_flags & SURGERY_REQUIRES_REAL_LIMB) && (affecting.bodypart_flags & BODYPART_PSEUDOPART)) continue - else if(carbon_target && (surgery.surgery_flags & SURGERY_REQUIRE_LIMB)) //mob with no limb in surgery zone when we need a limb - continue + if(IS_IN_INVALID_SURGICAL_POSITION(target, surgery)) continue if(!surgery.can_start(user, target)) continue - for(var/path in surgery.target_mobtypes) - if(istype(target, path)) - available_surgeries += surgery - break + + available_surgeries += surgery return available_surgeries @@ -284,24 +283,20 @@ target.balloon_alert(user, "can't start the surgery!") return - var/obj/item/bodypart/affecting_limb - var/selected_zone = user.zone_selected + var/obj/item/bodypart/affecting_limb = target.get_bodypart(check_zone(selected_zone)) - if (iscarbon(target)) - var/mob/living/carbon/carbon_target = target - affecting_limb = carbon_target.get_bodypart(check_zone(selected_zone)) - - if ((surgery.surgery_flags & SURGERY_REQUIRE_LIMB) == isnull(affecting_limb)) - if (surgery.surgery_flags & SURGERY_REQUIRE_LIMB) - target.balloon_alert(user, "patient has no [parse_zone(selected_zone)]!") - else - target.balloon_alert(user, "patient has \a [parse_zone(selected_zone)]!") + if ((surgery.surgery_flags & SURGERY_REQUIRE_LIMB) && isnull(affecting_limb)) + target.balloon_alert(user, "patient has no [parse_zone(selected_zone)]!") return - if (!isnull(affecting_limb) && surgery.requires_bodypart_type && !(affecting_limb.bodytype & surgery.requires_bodypart_type)) - target.balloon_alert(user, "not the right type of limb!") - return + if (!isnull(affecting_limb)) + if(surgery.requires_bodypart_type && !(affecting_limb.bodytype & surgery.requires_bodypart_type)) + target.balloon_alert(user, "not the right type of limb!") + return + if(surgery.targetable_wound && !affecting_limb.get_wound_type(surgery.targetable_wound)) + target.balloon_alert(user, "no wound to operate on!") + return if (IS_IN_INVALID_SURGICAL_POSITION(target, surgery)) target.balloon_alert(user, "patient is not lying down!") diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index 7d724f1c9effa..a0d0317d75540 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -164,8 +164,6 @@ neutral_outcome(user, target, tackle_word) //Forces a neutral outcome so you're not screwed too much from being blocked while tackling return COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH - - switch(roll) if(-INFINITY to -1) negative_outcome(user, target, roll, tackle_word) //OOF @@ -178,6 +176,15 @@ return COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH +/// Helper to do a grab and then adjust the grab state if necessary +/datum/component/tackler/proc/do_grab(mob/living/carbon/tackler, mob/living/carbon/tackled, skip_to_state = GRAB_PASSIVE) + set waitfor = FALSE + + if(!tackler.grab(tackled) || tackler.pulling != tackled) + return + if(tackler.grab_state != skip_to_state) + tackler.setGrabState(skip_to_state) + /** * Our positive tackling outcomes. * @@ -198,15 +205,10 @@ var/potential_outcome = (roll * 10) if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - var/target_armor = human_target.run_armor_check(BODY_ZONE_CHEST, MELEE) - potential_outcome *= ((100 - target_armor) /100) + potential_outcome *= ((100 - target.run_armor_check(BODY_ZONE_CHEST, MELEE)) /100) else potential_outcome *= 0.9 - var/mob/living/carbon/human/human_target = target - var/mob/living/carbon/human/human_sacker = user - switch(potential_outcome) if(-INFINITY to 0) //I don't want to know how this has happened, okay? neutral_outcome(user, target, roll, tackle_word) //Default to neutral @@ -233,9 +235,7 @@ target.Paralyze(0.5 SECONDS) target.Knockdown(3 SECONDS) target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS) - if(ishuman(target) && ishuman(user)) - INVOKE_ASYNC(human_sacker, TYPE_PROC_REF(/mob/living, grab), human_sacker, human_target) - human_sacker.setGrabState(GRAB_PASSIVE) + do_grab(user, target) if(50 to INFINITY) // absolutely BODIED var/stamcritted_user = HAS_TRAIT_FROM(user, TRAIT_INCAPACITATED, STAMINA) @@ -259,9 +259,7 @@ target.Paralyze(0.5 SECONDS) target.Knockdown(3 SECONDS) target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 3, 10 SECONDS) - if(ishuman(target) && ishuman(user)) - INVOKE_ASYNC(human_sacker, TYPE_PROC_REF(/mob/living, grab), human_sacker, human_target) - human_sacker.setGrabState(GRAB_AGGRESSIVE) + do_grab(user, target, GRAB_AGGRESSIVE) /** * Our neutral tackling outcome. @@ -300,9 +298,7 @@ var/potential_roll_outcome = (roll * -10) if(ishuman(user)) - var/mob/living/carbon/human/human_sacker = target - var/attacker_armor = human_sacker.run_armor_check(BODY_ZONE_CHEST, MELEE) - potential_roll_outcome *= ((100 - attacker_armor) /100) + potential_roll_outcome *= ((100 - target.run_armor_check(BODY_ZONE_CHEST, MELEE)) /100) else potential_roll_outcome *= 0.9 @@ -400,7 +396,7 @@ defense_mod += 2 if(tackle_target.mob_negates_gravity()) defense_mod += 1 - if(HAS_TRAIT(tackle_target, TRAIT_SHOVE_KNOCKDOWN_BLOCKED)) // riot armor and such + if(HAS_TRAIT(tackle_target, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) // riot armor and such defense_mod += 5 var/obj/item/organ/external/tail/lizard/el_tail = tackle_target.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) @@ -451,7 +447,7 @@ attack_mod += 15 human_sacker.adjustStaminaLoss(100) //AHAHAHAHAHAHAHAHA - if(HAS_TRAIT(human_sacker, TRAIT_SHOVE_KNOCKDOWN_BLOCKED)) // tackling with riot specialized armor, like riot armor, is effective but tiring + if(HAS_TRAIT(human_sacker, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) // tackling with riot specialized armor, like riot armor, is effective but tiring attack_mod += 2 human_sacker.adjustStaminaLoss(20) @@ -499,14 +495,10 @@ var/danger_zone = (speed - 1) * 13 // for every extra speed we have over 1, take away 13 of the safest chance danger_zone = max(min(danger_zone, 100), 1) - if(ishuman(user)) - var/mob/living/carbon/human/S = user - var/head_slot = S.get_item_by_slot(ITEM_SLOT_HEAD) - var/suit_slot = S.get_item_by_slot(ITEM_SLOT_OCLOTHING) - if(head_slot && (istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/utility/hardhat))) - oopsie_mod -= 6 - if(suit_slot && (istype(suit_slot,/obj/item/clothing/suit/armor/riot))) - oopsie_mod -= 6 + if(HAS_TRAIT(user, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) + oopsie_mod -= 6 + if(HAS_TRAIT(user, TRAIT_HEAD_INJURY_BLOCKED)) + oopsie_mod -= 6 if(HAS_TRAIT(user, TRAIT_CLUMSY)) oopsie_mod += 6 //honk! diff --git a/code/datums/components/tactical.dm b/code/datums/components/tactical.dm index e8e5492694928..59df008b2b100 100644 --- a/code/datums/components/tactical.dm +++ b/code/datums/components/tactical.dm @@ -1,60 +1,93 @@ +///A simple component that replacess the user's appearance with that of the parent item when equipped. /datum/component/tactical - var/allowed_slot + ///The allowed slots for the effect. + var/allowed_slots + ///A cached of where the item is currently equipped. var/current_slot -/datum/component/tactical/Initialize(allowed_slot) +/datum/component/tactical/Initialize(allowed_slots) if(!isitem(parent)) return COMPONENT_INCOMPATIBLE - src.allowed_slot = allowed_slot + src.allowed_slots = allowed_slots + +/datum/component/tactical/Destroy() + unmodify() + return ..() /datum/component/tactical/RegisterWithParent() RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(modify)) - RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(unmodify)) + var/obj/item/item = parent + if(ismob(item.loc)) + var/mob/holder = item.loc + modify(item, holder, holder.get_slot_by_item(item)) /datum/component/tactical/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) - unmodify() - -/datum/component/tactical/Destroy() + UnregisterSignal(parent, list( + COMSIG_ITEM_EQUIPPED, + )) unmodify() - return ..() - -/datum/component/tactical/proc/on_z_move(datum/source) - SIGNAL_HANDLER - var/obj/item/master = parent - if(!ismob(master.loc)) - return - var/old_slot = current_slot - unmodify(master, master.loc) - modify(master, master.loc, old_slot) /datum/component/tactical/proc/modify(obj/item/source, mob/user, slot) SIGNAL_HANDLER + if(current_slot == slot) + return - if(allowed_slot && !(slot & allowed_slot)) - unmodify() + if(allowed_slots && !(slot & allowed_slots)) + if(current_slot) + unmodify(source, user) return + RegisterSignal(parent, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(tactical_update)) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(unmodify)) + RegisterSignal(parent, COMSIG_ATOM_UPDATED_ICON, PROC_REF(on_icon_update)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + current_slot = slot + on_icon_update(source) + +/datum/component/tactical/proc/on_icon_update(obj/item/source) + SIGNAL_HANDLER + var/mob/user = source.loc + if(!istype(user)) + return + + user.remove_alt_appearance("sneaking_mission[REF(src)]") var/obj/item/master = parent - var/image/I = image(icon = master.icon, icon_state = master.icon_state, loc = user) - I.copy_overlays(master) - I.override = TRUE - source.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission", I) - I.layer = ABOVE_MOB_LAYER - RegisterSignal(parent, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_z_move)) + var/image/image = image(master, loc = user) + image.copy_overlays(master) + image.override = TRUE + image.layer = ABOVE_MOB_LAYER + image.plane = FLOAT_PLANE + user.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission[REF(src)]", image) /datum/component/tactical/proc/unmodify(obj/item/source, mob/user) SIGNAL_HANDLER - - var/obj/item/master = source || parent + if(!source) + source = parent if(!user) - if(!ismob(master.loc)) - return - user = master.loc + user = source.loc + if(!istype(user)) + return - user.remove_alt_appearance("sneaking_mission") + UnregisterSignal(source, list( + COMSIG_MOVABLE_Z_CHANGED, + COMSIG_ITEM_DROPPED, + COMSIG_MOVABLE_MOVED, + COMSIG_ATOM_UPDATED_ICON, + )) current_slot = null - UnregisterSignal(parent, COMSIG_MOVABLE_Z_CHANGED) + user.remove_alt_appearance("sneaking_mission[REF(src)]") + +///Checks if a mob is holding us, and if so we will modify our appearance to properly match w/ the mob. +/datum/component/tactical/proc/tactical_update(obj/item/source) + SIGNAL_HANDLER + if(!ismob(source.loc)) + return + modify(source, source.loc, current_slot) + +///We really want to make sure that, if things ever slightly breaks, that the alt appearance will be removed anyway. +/datum/component/tactical/proc/on_moved(obj/item/source, atom/oldloc, direction, forced) + SIGNAL_HANDLER + unmodify(source, oldloc) diff --git a/code/datums/components/tameable.dm b/code/datums/components/tameable.dm index 3da6d61614997..67325b489d367 100644 --- a/code/datums/components/tameable.dm +++ b/code/datums/components/tameable.dm @@ -70,18 +70,28 @@ return living_parent.faction.Find(REF(potential_friend)) ///Ran once taming succeeds -/datum/component/tameable/proc/on_tame(datum/source, mob/living/tamer, atom/food, inform_tamer = FALSE) +/datum/component/tameable/proc/on_tame(atom/source, mob/living/tamer, atom/food, inform_tamer = FALSE) SIGNAL_HANDLER after_tame?.Invoke(tamer, food)//Run custom behavior if needed if(isliving(parent) && isliving(tamer)) - var/mob/living/tamed = parent - INVOKE_ASYNC(tamed, TYPE_PROC_REF(/mob/living, befriend), tamer) + INVOKE_ASYNC(source, TYPE_PROC_REF(/mob/living, befriend), tamer) if(inform_tamer) - var/atom/atom_parent = source - atom_parent.balloon_alert(tamer, "tamed") + source.balloon_alert(tamer, "tamed") + if(HAS_TRAIT(tamer, TRAIT_SETTLER)) + INVOKE_ASYNC(src, PROC_REF(rename_pet), source, tamer) if(unique) qdel(src) else current_tame_chance = tame_chance + +/datum/component/tameable/proc/rename_pet(mob/living/animal, mob/living/tamer) + var/chosen_name = sanitize_name(tgui_input_text(tamer, "Choose your pet's name!", "Name pet", animal.name, MAX_NAME_LEN), allow_numbers = TRUE) + if(QDELETED(animal) || chosen_name == animal.name) + return + if(!chosen_name) + to_chat(tamer, span_warning("Please enter a valid name.")) + rename_pet(animal, tamer) + return + animal.fully_replace_character_name(animal.name, chosen_name) diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm index 464f1a58a07ff..45ee6697e5302 100644 --- a/code/datums/components/twohanded.dm +++ b/code/datums/components/twohanded.dm @@ -2,21 +2,32 @@ * Two Handed Component * * When applied to an item it will make it two handed - * + * Only one of the component can exist on an item. */ /datum/component/two_handed - dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS // Only one of the component can exist on an item - var/wielded = FALSE /// Are we holding the two handed item properly - var/force_multiplier = 0 /// The multiplier applied to force when wielded, does not work with force_wielded, and force_unwielded - var/force_wielded = 0 /// The force of the item when weilded - var/force_unwielded = 0 /// The force of the item when unweilded - var/wieldsound = FALSE /// Play sound when wielded - var/unwieldsound = FALSE /// Play sound when unwielded - var/attacksound = FALSE /// Play sound on attack when wielded - var/require_twohands = FALSE /// Does it have to be held in both hands - var/icon_wielded = FALSE /// The icon that will be used when wielded - var/obj/item/offhand/offhand_item = null /// Reference to the offhand created for the item - var/sharpened_increase = 0 /// The amount of increase recived from sharpening the item + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + /// Are we holding the two handed item properly + var/wielded = FALSE + /// The multiplier applied to force when wielded, does not work with force_wielded, and force_unwielded + var/force_multiplier = 0 + /// The force of the item when weilded + var/force_wielded = 0 + /// The force of the item when unweilded + var/force_unwielded = 0 + /// Boolean whether to play sound when wielded + var/wieldsound = FALSE + /// Boolean whether to play sound when unwielded + var/unwieldsound = FALSE + /// Boolean whether to play sound on attack, if wielded + var/attacksound = FALSE + /// Boolean on whether it has to be held in both hands + var/require_twohands = FALSE + /// The icon that will be used when wielded + var/icon_wielded = FALSE + /// Reference to the offhand created for the item + var/obj/item/offhand/offhand_item = null + /// The amount of increase recived from sharpening the item + var/sharpened_increase = 0 /// A callback on the parent to be called when the item is wielded var/datum/callback/wield_callback /// A callback on the parent to be called when the item is unwielded @@ -36,9 +47,18 @@ * * force_unwielded (optional) The force setting when the item is unwielded, do not use with force_multiplier * * icon_wielded (optional) The icon to be used when wielded */ -/datum/component/two_handed/Initialize(require_twohands=FALSE, wieldsound=FALSE, unwieldsound=FALSE, attacksound=FALSE, \ - force_multiplier=0, force_wielded=0, force_unwielded=0, icon_wielded=FALSE, \ - datum/callback/wield_callback, datum/callback/unwield_callback) +/datum/component/two_handed/Initialize( + require_twohands = FALSE, + wieldsound = FALSE, + unwieldsound = FALSE, + attacksound = FALSE, + force_multiplier = 0, + force_wielded = 0, + force_unwielded = 0, + icon_wielded = FALSE, + datum/callback/wield_callback, + datum/callback/unwield_callback, +) if(!isitem(parent)) return COMPONENT_INCOMPATIBLE @@ -63,9 +83,20 @@ return ..() // Inherit the new values passed to the component -/datum/component/two_handed/InheritComponent(datum/component/two_handed/new_comp, original, require_twohands, wieldsound, unwieldsound, attacksound, \ - force_multiplier, force_wielded, force_unwielded, icon_wielded, \ - datum/callback/wield_callback, datum/callback/unwield_callback) +/datum/component/two_handed/InheritComponent( + datum/component/two_handed/new_comp, + original, + require_twohands, + wieldsound, + unwieldsound, + attacksound, + force_multiplier, + force_wielded, + force_unwielded, + icon_wielded, + datum/callback/wield_callback, + datum/callback/unwield_callback, +) if(!original) return if(require_twohands) @@ -101,32 +132,19 @@ RegisterSignal(parent, COMSIG_ITEM_APPLY_FANTASY_BONUSES, PROC_REF(apply_fantasy_bonuses)) RegisterSignal(parent, COMSIG_ITEM_REMOVE_FANTASY_BONUSES, PROC_REF(remove_fantasy_bonuses)) -/datum/component/two_handed/proc/apply_fantasy_bonuses(obj/item/source, bonus) - SIGNAL_HANDLER - force_wielded = source.modify_fantasy_variable("force_wielded", force_wielded, bonus) - force_unwielded = source.modify_fantasy_variable("force_unwielded", force_unwielded, bonus) - if(wielded && ismob(source.loc)) - unwield(source.loc) - if(force_multiplier) - force_multiplier = source.modify_fantasy_variable("force_multiplier", force_multiplier, bonus/10, minimum = 1) - -/datum/component/two_handed/proc/remove_fantasy_bonuses(obj/item/source, bonus) - SIGNAL_HANDLER - force_wielded = source.reset_fantasy_variable("force_wielded", force_wielded) - force_unwielded = source.reset_fantasy_variable("force_unwielded", force_unwielded) - if(wielded && ismob(source.loc)) - unwield(source.loc) - force_multiplier = source.reset_fantasy_variable("force_multiplier", force_multiplier) - // Remove all siginals registered to the parent item /datum/component/two_handed/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, - COMSIG_ITEM_DROPPED, - COMSIG_ITEM_ATTACK_SELF, - COMSIG_ITEM_ATTACK, - COMSIG_ATOM_UPDATE_ICON, - COMSIG_MOVABLE_MOVED, - COMSIG_ITEM_SHARPEN_ACT)) + UnregisterSignal(parent, list( + COMSIG_ITEM_EQUIPPED, + COMSIG_ITEM_DROPPED, + COMSIG_ITEM_ATTACK_SELF, + COMSIG_ITEM_ATTACK, + COMSIG_ATOM_UPDATE_ICON, + COMSIG_MOVABLE_MOVED, + COMSIG_ITEM_SHARPEN_ACT, + COMSIG_ITEM_APPLY_FANTASY_BONUSES, + COMSIG_ITEM_REMOVE_FANTASY_BONUSES, + )) /// Triggered on equip of the item containing the component /datum/component/two_handed/proc/on_equip(datum/source, mob/user, slot) @@ -365,9 +383,25 @@ sharpened_increase = min(amount, (max_amount - wielded_val)) return COMPONENT_BLOCK_SHARPEN_APPLIED +/datum/component/two_handed/proc/apply_fantasy_bonuses(obj/item/source, bonus) + SIGNAL_HANDLER + force_wielded = source.modify_fantasy_variable("force_wielded", force_wielded, bonus) + force_unwielded = source.modify_fantasy_variable("force_unwielded", force_unwielded, bonus) + if(wielded && ismob(source.loc)) + unwield(source.loc) + if(force_multiplier) + force_multiplier = source.modify_fantasy_variable("force_multiplier", force_multiplier, bonus/10, minimum = 1) + +/datum/component/two_handed/proc/remove_fantasy_bonuses(obj/item/source, bonus) + SIGNAL_HANDLER + force_wielded = source.reset_fantasy_variable("force_wielded", force_wielded) + force_unwielded = source.reset_fantasy_variable("force_unwielded", force_unwielded) + if(wielded && ismob(source.loc)) + unwield(source.loc) + force_multiplier = source.reset_fantasy_variable("force_multiplier", force_multiplier) + /** * The offhand dummy item for two handed items - * */ /obj/item/offhand name = "offhand" diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index e418988c05806..e4e6e611ebca1 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -113,15 +113,6 @@ new /obj/effect/decal/cleanable/ash(get_turf(uplink_item)) qdel(uplink_item) -/// Adds telecrystals to the uplink. It is bad practice to use this outside of the component itself. -/datum/component/uplink/proc/add_telecrystals(telecrystals_added) - set_telecrystals(uplink_handler.telecrystals + telecrystals_added) - -/// Sets the telecrystals of the uplink. It is bad practice to use this outside of the component itself. -/datum/component/uplink/proc/set_telecrystals(new_telecrystal_amount) - uplink_handler.telecrystals = new_telecrystal_amount - uplink_handler.on_update() - /datum/component/uplink/InheritComponent(datum/component/uplink/uplink) lockable |= uplink.lockable active |= uplink.active @@ -135,7 +126,7 @@ if(!silent) to_chat(user, span_notice("You slot [telecrystals] into [parent] and charge its internal uplink.")) var/amt = telecrystals.amount - uplink_handler.telecrystals += amt + uplink_handler.add_telecrystals(amt) telecrystals.use(amt) log_uplink("[key_name(user)] loaded [amt] telecrystals into [parent]'s uplink") diff --git a/code/datums/elements/ELEMENT_TEMPLATE.md b/code/datums/elements/ELEMENT_TEMPLATE.md index 8dedfbaef4375..4bc1f72f2dc84 100644 --- a/code/datums/elements/ELEMENT_TEMPLATE.md +++ b/code/datums/elements/ELEMENT_TEMPLATE.md @@ -5,8 +5,8 @@ See _element.dm for detailed explanations ```dm /datum/element/myelement - element_flags = ELEMENT_BESPOKE | ELEMENT_COMPLEX_DETACH | ELEMENT_DETACH_ON_HOST_DESTROY | ELEMENT_NOTAREALFLAG // code/__DEFINES/dcs/flags.dm - //argument_hash_start_idx = 2 // Use with ELEMENT_BESPOKE + element_flags = ELEMENT_BESPOKE | ELEMENT_COMPLEX_DETACH | ELEMENT_DETACH_ON_HOST_DESTROY | ELEMENT_NOTAREALFLAG // code/__DEFINES/dcs/flags.dm + //argument_hash_start_idx = 2 // Use with ELEMENT_BESPOKE var/list/myvar = list() /datum/element/myelement/Attach(datum/target) diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index bcafc83497cfc..b2e021ad2be17 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -28,7 +28,7 @@ if(element_flags & ELEMENT_DETACH_ON_HOST_DESTROY) RegisterSignal(target, COMSIG_QDELETING, PROC_REF(OnTargetDelete), override = TRUE) -/datum/element/proc/OnTargetDelete(datum/source, force) +/datum/element/proc/OnTargetDelete(datum/source) SIGNAL_HANDLER Detach(source) @@ -75,3 +75,29 @@ ele.Detach(arglist(arguments)) else ele.Detach(src) + +/** + * Used to manage (typically non_bespoke) elements with multiple sources through traits + * so we don't have to make them a components again. + * The element will be later removed once all trait sources are gone, there's no need of a + * "RemoveElementTrait" counterpart. + */ +/datum/proc/AddElementTrait(trait, source, datum/element/eletype, ...) + if(!ispath(eletype, /datum/element)) + CRASH("AddElementTrait called, but [eletype] is not of a /datum/element path") + ADD_TRAIT(src, trait, source) + if(HAS_TRAIT_NOT_FROM(src, trait, source)) + return + var/list/arguments = list(eletype) + /// 3 is the length of fixed args of this proc, any further one is passed down to AddElement. + if(length(args) > 3) + arguments += args.Copy(4) + /// We actually pass down a copy of the arguments since it's manipulated by the end of the proc. + _AddElement(arguments.Copy()) + var/datum/ele = SSdcs.GetElement(arguments) + ele.RegisterSignal(src, SIGNAL_REMOVETRAIT(trait), TYPE_PROC_REF(/datum/element, _detach_on_trait_removed)) + +/datum/element/proc/_detach_on_trait_removed(datum/source, trait) + SIGNAL_HANDLER + Detach(source) + UnregisterSignal(source, SIGNAL_REMOVETRAIT(trait)) diff --git a/code/datums/elements/basic_eating.dm b/code/datums/elements/basic_eating.dm index 297e77fa060ea..2a7a4b46598b5 100644 --- a/code/datums/elements/basic_eating.dm +++ b/code/datums/elements/basic_eating.dm @@ -54,6 +54,8 @@ /datum/element/basic_eating/proc/try_eating(mob/living/eater, atom/target) if(!is_type_in_list(target, food_types)) return FALSE + if(SEND_SIGNAL(eater, COMSIG_MOB_PRE_EAT, target) & COMSIG_MOB_CANCEL_EAT) + return FALSE var/eat_verb if(drinking) eat_verb = pick("slurp","sip","guzzle","drink","quaff","suck") @@ -79,6 +81,7 @@ return TRUE /datum/element/basic_eating/proc/finish_eating(mob/living/eater, atom/target) + SEND_SIGNAL(eater, COMSIG_MOB_ATE) if(drinking) playsound(eater.loc,'sound/items/drink.ogg', rand(10,50), TRUE) else diff --git a/code/datums/elements/cleaning.dm b/code/datums/elements/cleaning.dm index 3f39d00eb6e7c..6db1c9fb58033 100644 --- a/code/datums/elements/cleaning.dm +++ b/code/datums/elements/cleaning.dm @@ -1,32 +1,36 @@ +/datum/element/cleaning + /datum/element/cleaning/Attach(datum/target) . = ..() if(!ismovable(target)) return ELEMENT_INCOMPATIBLE - RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(Clean)) + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(clean)) /datum/element/cleaning/Detach(datum/target) . = ..() UnregisterSignal(target, COMSIG_MOVABLE_MOVED) -/datum/element/cleaning/proc/Clean(datum/source) +/datum/element/cleaning/proc/clean(datum/source) SIGNAL_HANDLER - var/atom/movable/AM = source - var/turf/tile = AM.loc + var/atom/movable/atom_movable = source + var/turf/tile = atom_movable.loc if(!isturf(tile)) return tile.wash(CLEAN_SCRUB) - for(var/A in tile) + for(var/atom/cleaned as anything in tile) // Clean small items that are lying on the ground - if(isitem(A)) - var/obj/item/I = A - if(I.w_class <= WEIGHT_CLASS_SMALL && !ismob(I.loc)) - I.wash(CLEAN_SCRUB) + if(isitem(cleaned)) + var/obj/item/cleaned_item = cleaned + if(cleaned_item.w_class <= WEIGHT_CLASS_SMALL) + cleaned_item.wash(CLEAN_SCRUB) + continue // Clean humans that are lying down - else if(ishuman(A)) - var/mob/living/carbon/human/cleaned_human = A - if(cleaned_human.body_position == LYING_DOWN) - cleaned_human.wash(CLEAN_SCRUB) - cleaned_human.regenerate_icons() - to_chat(cleaned_human, span_danger("[AM] cleans your face!")) + if(!ishuman(cleaned)) + continue + var/mob/living/carbon/human/cleaned_human = cleaned + if(cleaned_human.body_position == LYING_DOWN) + cleaned_human.wash(CLEAN_SCRUB) + cleaned_human.regenerate_icons() + to_chat(cleaned_human, span_danger("[atom_movable] cleans your face!")) diff --git a/code/datums/elements/decals/blood.dm b/code/datums/elements/decals/blood.dm index 889ebb12904bd..7984939cddc87 100644 --- a/code/datums/elements/decals/blood.dm +++ b/code/datums/elements/decals/blood.dm @@ -9,33 +9,28 @@ /datum/element/decal/blood/Detach(atom/source) UnregisterSignal(source, COMSIG_ATOM_GET_EXAMINE_NAME) + if(isitem(source)) + var/obj/item/source_item = source + REMOVE_KEEP_TOGETHER(source_item, type) return ..() /datum/element/decal/blood/generate_appearance(_icon, _icon_state, _dir, _plane, _layer, _color, _alpha, _smoothing, source) var/obj/item/I = source - if(!_icon) - _icon = 'icons/effects/blood.dmi' - if(!_icon_state) - _icon_state = "itemblood" + ADD_KEEP_TOGETHER(I, type) var/icon = I.icon var/icon_state = I.icon_state if(!icon || !icon_state) // It's something which takes on the look of other items, probably icon = I.icon icon_state = I.icon_state - var/static/list/blood_splatter_appearances = list() - //try to find a pre-processed blood-splatter. otherwise, make a new one - var/index = "[REF(icon)]-[icon_state]" - pic = blood_splatter_appearances[index] - - if(!pic) - var/icon/blood_splatter_icon = icon(I.icon, I.icon_state, , 1) //icon of the item that will become splattered - var/icon/blood_icon = icon(_icon, _icon_state) //icon of the blood that we apply - blood_icon.Scale(blood_splatter_icon.Width(), blood_splatter_icon.Height()) - blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) - blood_splatter_icon.Blend(blood_icon, ICON_MULTIPLY) //adds blood and the remaining white areas become transparant - pic = mutable_appearance(blood_splatter_icon, I.icon_state) - blood_splatter_appearances[index] = pic + var/icon/icon_for_size = icon(icon, icon_state) + var/scale_factor_x = icon_for_size.Width()/world.icon_size + var/scale_factor_y = icon_for_size.Height()/world.icon_size + var/mutable_appearance/blood_splatter = mutable_appearance('icons/effects/blood.dmi', "itemblood", appearance_flags = RESET_COLOR) //MA of the blood that we apply + blood_splatter.transform = blood_splatter.transform.Scale(scale_factor_x, scale_factor_y) + blood_splatter.blend_mode = BLEND_INSET_OVERLAY + blood_splatter.color = _color + pic = blood_splatter return TRUE /datum/element/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override) diff --git a/code/datums/elements/light_eaten.dm b/code/datums/elements/light_eaten.dm index 39550a9912463..e3bcc079318ae 100644 --- a/code/datums/elements/light_eaten.dm +++ b/code/datums/elements/light_eaten.dm @@ -15,9 +15,9 @@ RegisterSignal(atom_target, COMSIG_ATOM_SET_LIGHT_ON, PROC_REF(block_light_on)) RegisterSignal(atom_target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) - /// Because the lighting system does not like movable lights getting set_light() called. + /// Because the lighting system does not like overlay lights getting set_light() called. switch(atom_target.light_system) - if(STATIC_LIGHT) + if(COMPLEX_LIGHT) target.set_light(0, 0, null, l_on = FALSE) else target.set_light_power(0) diff --git a/code/datums/elements/permanent_fire_overlay.dm b/code/datums/elements/permanent_fire_overlay.dm new file mode 100644 index 0000000000000..514d0f121a457 --- /dev/null +++ b/code/datums/elements/permanent_fire_overlay.dm @@ -0,0 +1,24 @@ +/// When applied to a mob, they will always have a fire overlay regardless of if they are *actually* on fire. +/datum/element/perma_fire_overlay + +/datum/element/perma_fire_overlay/Attach(atom/target) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(add_fire_overlay)) + target.update_appearance(UPDATE_OVERLAYS) + +/datum/element/perma_fire_overlay/Detach(atom/target) + . = ..() + UnregisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS) + target.update_appearance(UPDATE_OVERLAYS) + +/datum/element/perma_fire_overlay/proc/add_fire_overlay(mob/living/source, list/overlays) + SIGNAL_HANDLER + + var/mutable_appearance/created_overlay = source.get_fire_overlay(stacks = MAX_FIRE_STACKS, on_fire = TRUE) + if(isnull(created_overlay)) + return + + overlays |= created_overlay diff --git a/code/datums/elements/squish_sound.dm b/code/datums/elements/squish_sound.dm new file mode 100644 index 0000000000000..a245bb48a73cb --- /dev/null +++ b/code/datums/elements/squish_sound.dm @@ -0,0 +1,27 @@ +///Plays a sound when walked into, lower sounding if the person walking into it has light stepping. +/datum/element/squish_sound + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///The sound to play when something holding this element is entered. + var/sound_to_play + +/datum/element/squish_sound/Attach( + datum/target, + sound = 'sound/effects/footstep/gib_step.ogg', +) + . = ..() + sound_to_play = sound + RegisterSignal(target, COMSIG_MOVABLE_CROSS, PROC_REF(on_cross)) + +///Plays the set sound upon being entered, as long as the person walking into it can actually walk. +/datum/element/squish_sound/proc/on_cross(atom/movable/source, atom/movable/crossed) + SIGNAL_HANDLER + + if(!isliving(crossed) || (crossed.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) || crossed.throwing) + return + playsound( + source = source, + soundin = sound_to_play, + vol = HAS_TRAIT(crossed, TRAIT_LIGHT_STEP) ? 20 : 50, + vary = TRUE, + ) diff --git a/code/datums/elements/uplink_reimburse.dm b/code/datums/elements/uplink_reimburse.dm index 3ff182ec2314d..73a2032fee1df 100644 --- a/code/datums/elements/uplink_reimburse.dm +++ b/code/datums/elements/uplink_reimburse.dm @@ -22,7 +22,7 @@ RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(target, COMSIG_ITEM_ATTEMPT_TC_REIMBURSE, PROC_REF(reimburse)) RegisterSignal(target,COMSIG_TRAITOR_ITEM_USED(target.type), PROC_REF(used)) - + /datum/element/uplink_reimburse/Detach(datum/target) UnregisterSignal(target, list(COMSIG_ATOM_EXAMINE, COMSIG_TRAITOR_ITEM_USED(target.type), COMSIG_ITEM_ATTEMPT_TC_REIMBURSE)) @@ -47,10 +47,11 @@ to_chat(user, span_notice("You tap [uplink_comp.uplink_handler] with [refund_item], and a moment after [refund_item] disappears in a puff of red smoke!")) do_sparks(2, source = uplink_comp.uplink_handler) - uplink_comp.add_telecrystals(refundable_tc) + uplink_comp.uplink_handler.add_telecrystals(refundable_tc) qdel(refund_item) + /// If the item is used, it needs to no longer be refundable /datum/element/uplink_reimburse/proc/used(datum/target) SIGNAL_HANDLER - + Detach(target) diff --git a/code/datums/elements/waddling.dm b/code/datums/elements/waddling.dm index c51a1759768b5..e63d0329bb630 100644 --- a/code/datums/elements/waddling.dm +++ b/code/datums/elements/waddling.dm @@ -4,6 +4,8 @@ . = ..() if(!ismovable(target)) return ELEMENT_INCOMPATIBLE + if(!HAS_TRAIT(target, TRAIT_WADDLING)) + stack_trace("[type] added to [target] without adding TRAIT_WADDLING first. Please use AddElementTrait instead.") RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(Waddle)) /datum/element/waddling/Detach(datum/source) diff --git a/code/datums/elements/window_smash.dm b/code/datums/elements/window_smash.dm new file mode 100644 index 0000000000000..32896d096bf6e --- /dev/null +++ b/code/datums/elements/window_smash.dm @@ -0,0 +1,33 @@ +/** + * # Window Smashing + * An element you put on mobs to let them smash through walls on movement + * For example, throwing someone through a glass window + */ +/datum/element/window_smashing + +/datum/element/window_smashing/Attach(datum/target, duration = 1.5 SECONDS) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + var/mob/living/living_target = target + RegisterSignal(living_target, COMSIG_MOVABLE_MOVED, PROC_REF(flying_window_smash)) + passwindow_on(target, TRAM_PASSENGER_TRAIT) + addtimer(CALLBACK(src, PROC_REF(Detach), living_target), duration) + +/// Smash any windows that the mob is flying through +/datum/element/window_smashing/proc/flying_window_smash(atom/movable/flying_mob, atom/old_loc, direction) + SIGNAL_HANDLER + var/turf/target_turf = get_turf(flying_mob) + for(var/obj/structure/tram/tram_wall in target_turf) + tram_wall.smash_and_injure(flying_mob, old_loc, direction) + + for(var/obj/structure/window/window in target_turf) + window.smash_and_injure(flying_mob, old_loc, direction) + + for(var/obj/structure/grille/grille in target_turf) + grille.smash_and_injure(flying_mob, old_loc, direction) + +/datum/element/window_smashing/Detach(datum/source) + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + passwindow_off(source, TRAM_PASSENGER_TRAIT) + return ..() diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm index 22d33af0c674b..1f4c8cb997380 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm @@ -150,6 +150,43 @@ icon_file = 'icons/mob/inhands/clothing/masks_righthand.dmi' json_config = 'code/datums/greyscale/json_configs/bandanaskull_inhands.json' +/datum/greyscale_config/facescarf + name = "Facescarf" + icon_file = 'icons/obj/clothing/masks.dmi' + json_config = 'code/datums/greyscale/json_configs/facescarf.json' + +/datum/greyscale_config/facescarf/worn + name = "Facescarf (Worn)" + icon_file = 'icons/mob/clothing/mask.dmi' + +/datum/greyscale_config/facescarf/inhands_left + name = "Facescarf (Held, Left)" + icon_file = 'icons/mob/inhands/clothing/masks_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/facescarf_inhands.json' + +/datum/greyscale_config/facescarf/inhands_right + name = "Facescarf (Held, Right)" + icon_file = 'icons/mob/inhands/clothing/masks_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/facescarf_inhands.json' + +/datum/greyscale_config/kitsune + name = "Kitsune mask" + icon_file = 'icons/obj/clothing/masks.dmi' + json_config = 'code/datums/greyscale/json_configs/kitsune.json' + +/datum/greyscale_config/kitsune/worn + name = "Kitsune mask (Worn)" + icon_file = 'icons/mob/clothing/mask.dmi' + +/datum/greyscale_config/rebellion_mask + name = "Rebellion mask" + icon_file = 'icons/obj/clothing/masks.dmi' + json_config = 'code/datums/greyscale/json_configs/rebellion_mask.json' + +/datum/greyscale_config/rebellion_mask/worn + name = "Rebellion mask (Worn)" + icon_file = 'icons/mob/clothing/mask.dmi' + // // NECK // diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_mobs.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_mobs.dm index 250eba9a0d51f..87799dedda5de 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_mobs.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_mobs.dm @@ -44,4 +44,3 @@ name = "Gutlunch" icon_file = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' json_config = 'code/datums/greyscale/json_configs/gutlunch.json' - diff --git a/code/datums/greyscale/json_configs/facescarf.json b/code/datums/greyscale/json_configs/facescarf.json new file mode 100644 index 0000000000000..eadb07dd92738 --- /dev/null +++ b/code/datums/greyscale/json_configs/facescarf.json @@ -0,0 +1,18 @@ +{ + "facescarf": [ + { + "type": "icon_state", + "icon_state": "facescarf", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "facescarf_up": [ + { + "type": "icon_state", + "icon_state": "facescarf_up", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/facescarf_inhands.json b/code/datums/greyscale/json_configs/facescarf_inhands.json new file mode 100644 index 0000000000000..eee4225a0504d --- /dev/null +++ b/code/datums/greyscale/json_configs/facescarf_inhands.json @@ -0,0 +1,10 @@ +{ + "greyscale_facescarf": [ + { + "type": "icon_state", + "icon_state": "greyscale_bandana", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/kitsune.json b/code/datums/greyscale/json_configs/kitsune.json new file mode 100644 index 0000000000000..bee6418321387 --- /dev/null +++ b/code/datums/greyscale/json_configs/kitsune.json @@ -0,0 +1,16 @@ +{ + "kitsune": [ + { + "type": "icon_state", + "icon_state": "kitsune_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "kitsune_stripe", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/rebellion_mask.json b/code/datums/greyscale/json_configs/rebellion_mask.json new file mode 100644 index 0000000000000..1c421b00b7982 --- /dev/null +++ b/code/datums/greyscale/json_configs/rebellion_mask.json @@ -0,0 +1,10 @@ +{ + "rebellion_mask": [ + { + "type": "icon_state", + "icon_state": "rebellion_mask", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index bee48a2bb4936..b979c9cda0f5c 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -70,6 +70,9 @@ teleatom.balloon_alert(teleatom, "something holds you back!") return FALSE + SEND_SIGNAL(teleatom, COMSIG_MOVABLE_TELEPORTED, destination, channel) + SEND_SIGNAL(destturf, COMSIG_ATOM_INTERCEPT_TELEPORTED, channel, curturf, destturf) + if(isobserver(teleatom)) teleatom.abstract_move(destturf) return TRUE @@ -85,7 +88,7 @@ teleatom.log_message("teleported from [loc_name(curturf)] to [loc_name(destturf)].", LOG_GAME, log_globally = FALSE) M.cancel_camera() - SEND_SIGNAL(teleatom, COMSIG_MOVABLE_POST_TELEPORT) + SEND_SIGNAL(teleatom, COMSIG_MOVABLE_POST_TELEPORT, destination, channel) return TRUE @@ -209,7 +212,4 @@ if(SEND_SIGNAL(destination_turf, COMSIG_ATOM_INTERCEPT_TELEPORTING, channel, origin_turf, destination_turf) & COMPONENT_BLOCK_TELEPORT) return FALSE - SEND_SIGNAL(teleported_atom, COMSIG_MOVABLE_TELEPORTED, destination, channel) - SEND_SIGNAL(destination_turf, COMSIG_ATOM_INTERCEPT_TELEPORTED, channel, origin_turf, destination_turf) - return TRUE diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index ea46cc91319fa..46f691564bb4b 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -1183,6 +1183,36 @@ ) job = /datum/job/station_engineer +/datum/id_trim/job/veteran_advisor + assignment = "Veteran Security Advisor" + trim_state = "trim_veteranadvisor" + department_color = COLOR_SECURITY_RED + subdepartment_color = COLOR_COMMAND_BLUE + sechud_icon_state = SECHUD_VETERAN_ADVISOR + minimal_access = list( + ACCESS_COMMAND, + ACCESS_BRIG, + ACCESS_BRIG_ENTRANCE, + ACCESS_COURT, + ACCESS_MECH_SECURITY, + ACCESS_MINERAL_STOREROOM, + ACCESS_SECURITY, + ACCESS_WEAPONS, + ) + extra_access = list() + template_access = list() + job = /datum/job/veteran_advisor + +/datum/id_trim/job/veteran_advisor/refresh_trim_access() + . = ..() + + if(!.) + return + + // Config check for if sec has maint access. + if(CONFIG_GET(flag/security_has_maint_access)) + access |= list(ACCESS_MAINT_TUNNELS) + /datum/id_trim/job/virologist assignment = "Virologist" trim_state = "trim_virologist" diff --git a/code/datums/keybinding/mob.dm b/code/datums/keybinding/mob.dm index def4ec36fb2c1..4963e87266cbe 100644 --- a/code/datums/keybinding/mob.dm +++ b/code/datums/keybinding/mob.dm @@ -80,6 +80,8 @@ switch(keybind_signal) if(COMSIG_KB_MOB_TARGETCYCLEHEAD_DOWN) user.body_toggle_head() + if(COMSIG_KB_MOB_TARGETHEAD_DOWN) + user.body_head() if(COMSIG_KB_MOB_TARGETEYES_DOWN) user.body_eyes() if(COMSIG_KB_MOB_TARGETMOUTH_DOWN) @@ -108,6 +110,13 @@ description = "Pressing this key targets the head, and continued presses will cycle to the eyes and mouth. This will impact where you hit people, and can be used for surgery." keybind_signal = COMSIG_KB_MOB_TARGETCYCLEHEAD_DOWN +/datum/keybinding/mob/target/head + hotkey_keys = list("Unbound") + name = "target_head" + full_name = "Target: Head" + description = "Pressing this key targets the head. This will impact where you hit people, and can be used for surgery." + keybind_signal = COMSIG_KB_MOB_TARGETHEAD_DOWN + /datum/keybinding/mob/target/eyes hotkey_keys = list("Numpad7") name = "target_eyes" diff --git a/code/datums/mapgen/Cavegens/IcemoonCaves.dm b/code/datums/mapgen/Cavegens/IcemoonCaves.dm index 9d7fb39af710c..91348dd5c1783 100644 --- a/code/datums/mapgen/Cavegens/IcemoonCaves.dm +++ b/code/datums/mapgen/Cavegens/IcemoonCaves.dm @@ -1,7 +1,7 @@ /datum/map_generator/cave_generator/icemoon weighted_open_turf_types = list(/turf/open/misc/asteroid/snow/icemoon = 19, /turf/open/misc/ice/icemoon = 1) weighted_closed_turf_types = list( - /turf/closed/mineral/snowmountain/icemoon = 100, + /turf/closed/mineral/random/snow = 100, /turf/closed/mineral/gibtonite/ice/icemoon = 4, ) @@ -70,7 +70,7 @@ /datum/map_generator/cave_generator/icemoon/surface/noruins //use this for when you don't want ruins to spawn in a certain area /datum/map_generator/cave_generator/icemoon/deep - weighted_closed_turf_types = list(/turf/closed/mineral/snowmountain/icemoon = 1) + weighted_closed_turf_types = list(/turf/closed/mineral/random/snow = 1) weighted_mob_spawn_list = list( SPAWN_MEGAFAUNA = 1, /mob/living/basic/mining/ice_demon = 100, diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index c34afd6c1cae8..1710009de3c6e 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -102,6 +102,8 @@ /datum/martial_art/krav_maga/proc/leg_sweep(mob/living/attacker, mob/living/defender) if(defender.stat != CONSCIOUS || defender.IsParalyzed()) return MARTIAL_ATTACK_INVALID + if(HAS_TRAIT(attacker, TRAIT_PACIFISM)) + return MARTIAL_ATTACK_INVALID // Does 5 damage, so we can't let pacifists leg sweep. defender.visible_message( span_warning("[attacker] leg sweeps [defender]!"), span_userdanger("Your legs are sweeped by [attacker]!"), @@ -134,6 +136,8 @@ return MARTIAL_ATTACK_SUCCESS /datum/martial_art/krav_maga/proc/neck_chop(mob/living/attacker, mob/living/defender) + if(HAS_TRAIT(attacker, TRAIT_PACIFISM)) + return MARTIAL_ATTACK_INVALID // Does 10 damage, so we can't let pacifists neck chop. attacker.do_attack_animation(defender) defender.visible_message( span_warning("[attacker] karate chops [defender]'s neck!"), @@ -186,7 +190,6 @@ return MARTIAL_ATTACK_FAIL if(check_streak(attacker, defender)) return MARTIAL_ATTACK_SUCCESS - attacker.do_attack_animation(defender, ATTACK_EFFECT_DISARM) var/obj/item/stuff_in_hand = defender.get_active_held_item() if(prob(60) && stuff_in_hand && defender.temporarilyRemoveItemFromInventory(stuff_in_hand)) attacker.put_in_hands(stuff_in_hand) @@ -200,19 +203,7 @@ to_chat(attacker, span_danger("You disarm [defender]!")) playsound(defender, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) log_combat(attacker, defender, "disarmed (Krav Maga)", addition = "(disarmed of [stuff_in_hand])") - return MARTIAL_ATTACK_SUCCESS - - defender.visible_message( - span_danger("[attacker] fails to disarm [defender]!"), \ - span_userdanger("You're nearly disarmed by [attacker]!"), - span_hear("You hear a swoosh!"), - COMBAT_MESSAGE_RANGE, - attacker, - ) - to_chat(attacker, span_warning("You fail to disarm [defender]!")) - playsound(defender, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) - log_combat(attacker, defender, "failed to disarm (Krav Maga)") - return MARTIAL_ATTACK_FAIL + return MARTIAL_ATTACK_INVALID // normal shove //Krav Maga Gloves diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index fa6f8416e2c2a..49905c253a9cc 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -323,6 +323,37 @@ return ..() return FALSE +/obj/item/clothing/gloves/the_sleeping_carp + name = "carp gloves" + desc = "This gloves are capable of making people use The Sleeping Carp." + icon_state = "black" + greyscale_colors = "#000000" + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + resistance_flags = NONE + var/datum/martial_art/the_sleeping_carp/style + +/obj/item/clothing/gloves/the_sleeping_carp/Initialize(mapload) + . = ..() + style = new() + style.allow_temp_override = FALSE + +/obj/item/clothing/gloves/the_sleeping_carp/Destroy() + QDEL_NULL(style) + return ..() + +/obj/item/clothing/gloves/the_sleeping_carp/equipped(mob/user, slot) + . = ..() + if(slot & ITEM_SLOT_GLOVES) + style.teach(user, TRUE) + +/obj/item/clothing/gloves/the_sleeping_carp/dropped(mob/user) + . = ..() + if(!isnull(style)) + style.fully_remove(user) + #undef STRONG_PUNCH_COMBO #undef LAUNCH_KICK_COMBO #undef DROP_KICK_COMBO diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm index 84942a9684c3c..3aaeb093b9251 100644 --- a/code/datums/mind/_mind.dm +++ b/code/datums/mind/_mind.dm @@ -451,15 +451,20 @@ current.dropItemToGround(W, TRUE) //The TRUE forces all items to drop, since this is an admin undress. if("takeuplink") take_uplink() - wipe_memory()//Remove any memory they may have had. + wipe_memory_type(/datum/memory/key/traitor_uplink/implant) log_admin("[key_name(usr)] removed [current]'s uplink.") if("crystals") if(check_rights(R_FUN)) var/datum/component/uplink/U = find_syndicate_uplink() if(U) - var/crystals = input("Amount of telecrystals for [key]","Syndicate uplink", U.uplink_handler.telecrystals) as null | num - if(!isnull(crystals)) - U.uplink_handler.telecrystals = crystals + var/crystals = tgui_input_number( + user = usr, + message = "Amount of telecrystals for [key]", + title = "Syndicate uplink", + default = U.uplink_handler.telecrystals, + ) + if(isnum(crystals)) + U.uplink_handler.set_telecrystals(crystals) message_admins("[key_name_admin(usr)] changed [current]'s telecrystal count to [crystals].") log_admin("[key_name(usr)] changed [current]'s telecrystal count to [crystals].") if("progression") diff --git a/code/datums/mind/antag.dm b/code/datums/mind/antag.dm index 8b516a86a02a1..4aaab464f5e8f 100644 --- a/code/datums/mind/antag.dm +++ b/code/datums/mind/antag.dm @@ -105,6 +105,31 @@ var/datum/antagonist/rev/revolutionary = has_antag_datum(/datum/antagonist/rev) revolutionary?.remove_revolutionary() +/** + * Gets an item that can be used as an uplink somewhere on the mob's person. + * + * * desired_location: the location to look for the uplink in. An UPLINK_ define. + * If the desired location is not found, defaults to another location. + * + * Returns the item found, or null if no item was found. + */ +/mob/living/carbon/proc/get_uplink_location(desired_location = UPLINK_PDA) + var/list/all_contents = get_all_contents() + var/obj/item/modular_computer/pda/my_pda = locate() in all_contents + var/obj/item/radio/my_radio = locate() in all_contents + var/obj/item/pen/my_pen = (locate() in my_pda) || (locate() in all_contents) + + switch(desired_location) + if(UPLINK_PDA) + return my_pda || my_radio || my_pen + + if(UPLINK_RADIO) + return my_radio || my_pda || my_pen + + if(UPLINK_PEN) + return my_pen || my_pda || my_radio + + return null /** * ## give_uplink @@ -115,53 +140,26 @@ * * antag_datum: the antag datum of the uplink owner, for storing it in antag memory. optional! */ /datum/mind/proc/give_uplink(silent = FALSE, datum/antagonist/antag_datum) - if(!current) + if(isnull(current)) return var/mob/living/carbon/human/traitor_mob = current if (!istype(traitor_mob)) return - var/list/all_contents = traitor_mob.get_all_contents() - var/obj/item/modular_computer/pda/PDA = locate() in all_contents - var/obj/item/radio/R = locate() in all_contents - var/obj/item/pen/P - - if (PDA) // Prioritize PDA pen, otherwise the pocket protector pens will be chosen, which causes numerous ahelps about missing uplink - P = locate() in PDA - if (!P) // If we couldn't find a pen in the PDA, or we didn't even have a PDA, do it the old way - P = locate() in all_contents - var/obj/item/uplink_loc - var/implant = FALSE - var/uplink_spawn_location = traitor_mob.client?.prefs?.read_preference(/datum/preference/choiced/uplink_location) - var/cant_speak = (HAS_TRAIT(traitor_mob, TRAIT_MUTE) || traitor_mob.mind?.assigned_role.title == JOB_MIME) + var/cant_speak = (HAS_TRAIT(traitor_mob, TRAIT_MUTE) || is_mime_job(assigned_role)) if(uplink_spawn_location == UPLINK_RADIO && cant_speak) if(!silent) to_chat(traitor_mob, span_warning("You have been deemed ineligible for a radio uplink. Supplying standard uplink instead.")) uplink_spawn_location = UPLINK_PDA - switch (uplink_spawn_location) - if(UPLINK_PDA) - uplink_loc = PDA - if(!uplink_loc) - uplink_loc = R - if(!uplink_loc) - uplink_loc = P - if(UPLINK_RADIO) - uplink_loc = R - if(!uplink_loc) - uplink_loc = PDA - if(!uplink_loc) - uplink_loc = P - if(UPLINK_PEN) - uplink_loc = P - if(UPLINK_IMPLANT) - implant = TRUE - if(!uplink_loc) // We've looked everywhere, let's just implant you - implant = TRUE + if(uplink_spawn_location != UPLINK_IMPLANT) + uplink_loc = traitor_mob.get_uplink_location(uplink_spawn_location) + if(istype(uplink_loc, /obj/item/radio) && cant_speak) + uplink_loc = null - if(implant) + if(isnull(uplink_loc)) var/obj/item/implant/uplink/starting/new_implant = new(traitor_mob) new_implant.implant(traitor_mob, null, silent = TRUE) if(!silent) @@ -178,22 +176,27 @@ new_uplink.uplink_handler.owner = traitor_mob.mind new_uplink.uplink_handler.assigned_role = traitor_mob.mind.assigned_role.title new_uplink.uplink_handler.assigned_species = traitor_mob.dna.species.id - if(uplink_loc == R) - unlock_text = "Your Uplink is cunningly disguised as your [R.name]. Simply speak \"[new_uplink.unlock_code]\" into frequency [RADIO_TOKEN_UPLINK] to unlock its hidden features." - add_memory(/datum/memory/key/traitor_uplink, uplink_loc = R.name, uplink_code = new_uplink.unlock_code) - else if(uplink_loc == PDA) - unlock_text = "Your Uplink is cunningly disguised as your [PDA.name]. Simply enter the code \"[new_uplink.unlock_code]\" into the ring tone selection to unlock its hidden features." + + unlock_text = "Your Uplink is cunningly disguised as your [uplink_loc.name]. " + if(istype(uplink_loc, /obj/item/modular_computer/pda)) + unlock_text += "Simply enter the code \"[new_uplink.unlock_code]\" into the ring tone selection to unlock its hidden features." add_memory(/datum/memory/key/traitor_uplink, uplink_loc = "PDA", uplink_code = new_uplink.unlock_code) - else if(uplink_loc == P) + + else if(istype(uplink_loc, /obj/item/radio)) + unlock_text += "Simply speak \"[new_uplink.unlock_code]\" into frequency [RADIO_TOKEN_UPLINK] to unlock its hidden features." + add_memory(/datum/memory/key/traitor_uplink, uplink_loc = uplink_loc.name, uplink_code = new_uplink.unlock_code) + + else if(istype(uplink_loc, /obj/item/pen)) var/instructions = english_list(new_uplink.unlock_code) - unlock_text = "Your Uplink is cunningly disguised as your [P.name]. Simply twist the top of the pen [instructions] from its starting position to unlock its hidden features." - add_memory(/datum/memory/key/traitor_uplink, uplink_loc = "PDA pen", uplink_code = instructions) + unlock_text += "Simply twist the top of the pen [instructions] from its starting position to unlock its hidden features." + add_memory(/datum/memory/key/traitor_uplink, uplink_loc = uplink_loc.name, uplink_code = instructions) new_uplink.unlock_text = unlock_text if(!silent) to_chat(traitor_mob, span_boldnotice(unlock_text)) if(antag_datum) antag_datum.antag_memory += new_uplink.unlock_note + "
" + return . /// Link a new mobs mind to the creator of said mob. They will join any team they are currently on, and will only switch teams when their creator does. /datum/mind/proc/enslave_mind_to_creator(mob/living/creator) diff --git a/code/datums/minigames_menu.dm b/code/datums/minigames_menu.dm index 13e4112dacac9..cb083026b2f71 100644 --- a/code/datums/minigames_menu.dm +++ b/code/datums/minigames_menu.dm @@ -37,6 +37,10 @@ ui.close() basketball() return TRUE + if("deathmatch") + ui.close() + deathmatch() + return TRUE /datum/minigames_menu/proc/mafia() var/datum/mafia_controller/game = GLOB.mafia_game //this needs to change if you want multiple mafia games up at once. @@ -55,3 +59,8 @@ if(!game) game = create_basketball_game() game.ui_interact(usr) + +/datum/minigames_menu/proc/deathmatch() + if(isnull(GLOB.deathmatch_game)) + GLOB.deathmatch_game = new + GLOB.deathmatch_game.ui_interact(usr) diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index cc3af071eef37..0cfb48f7a9823 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -92,6 +92,12 @@ mood_change = -3 timeout = 2 MINUTES +/datum/mood_event/reattachment/New(mob/M, ...) + if(HAS_TRAIT(M, TRAIT_ANALGESIA)) + qdel(src) + return + return ..() + /datum/mood_event/reattachment/add_effects(obj/item/bodypart/limb) if(limb) description = "Ouch! My [limb.plaintext_zone] feels like I fell asleep on it." @@ -112,8 +118,8 @@ /datum/mood_event/table/add_effects() if(isfelinid(owner)) //Holy snowflake batman! - var/mob/living/carbon/human/H = owner - SEND_SIGNAL(H, COMSIG_ORGAN_WAG_TAIL, TRUE, 3 SECONDS) + var/mob/living/carbon/human/feline = owner + feline.wag_tail(3 SECONDS) description = "They want to play on the table!" mood_change = 2 @@ -122,6 +128,12 @@ mood_change = -3 timeout = 3 MINUTES +/datum/mood_event/table_limbsmash/New(mob/M, ...) + if(HAS_TRAIT(M, TRAIT_ANALGESIA)) + qdel(src) + return + return ..() + /datum/mood_event/table_limbsmash/add_effects(obj/item/bodypart/banged_limb) if(banged_limb) description = "My fucking [banged_limb.plaintext_zone], man that hurts..." @@ -194,6 +206,12 @@ mood_change = -5 timeout = 60 SECONDS +/datum/mood_event/painful_medicine/New(mob/M, ...) + if(HAS_TRAIT(M, TRAIT_ANALGESIA)) + qdel(src) + return + return ..() + /datum/mood_event/spooked description = "The rattling of those bones... It still haunts me." mood_change = -4 @@ -231,6 +249,12 @@ description = "Bags never sit right on my back, this hurts like hell!" mood_change = -15 +/datum/mood_event/back_pain/New(mob/M, ...) + if(HAS_TRAIT(M, TRAIT_ANALGESIA)) + qdel(src) + return + return ..() + /datum/mood_event/sad_empath description = "Someone seems upset..." mood_change = -1 @@ -459,3 +483,9 @@ /datum/mood_event/all_nighter description = "I didn't sleep at all last night. I'm exhausted." mood_change = -5 + +//Used by the Veteran Advisor trait job +/datum/mood_event/desentized + description = "Nothing will ever rival with what I seen in the past..." + mood_change = -3 + special_screen_obj = "mood_desentized" diff --git a/code/datums/quirks/negative_quirks/all_nighter.dm b/code/datums/quirks/negative_quirks/all_nighter.dm index 798add0539f24..253ce12b41f32 100644 --- a/code/datums/quirks/negative_quirks/all_nighter.dm +++ b/code/datums/quirks/negative_quirks/all_nighter.dm @@ -14,7 +14,7 @@ mail_goodies = list( /obj/item/clothing/glasses/blindfold, - /obj/item/bedsheet/random, + /obj/effect/spawner/random/bedsheet/any, /obj/item/clothing/under/misc/pj/red, /obj/item/clothing/head/costume/nightcap/red, /obj/item/clothing/under/misc/pj/blue, diff --git a/code/datums/quirks/negative_quirks/unusual.dm b/code/datums/quirks/negative_quirks/unusual.dm new file mode 100644 index 0000000000000..79cfac06c13eb --- /dev/null +++ b/code/datums/quirks/negative_quirks/unusual.dm @@ -0,0 +1,22 @@ +/datum/quirk/touchy + name = "Touchy" + desc = "You are very touchy and have to physically be able to touch something to examine it." + icon = FA_ICON_HAND + value = -2 + gain_text = span_danger("You feel like you can't examine things from a distance.") + lose_text = span_notice("You feel like you can examine things from a distance.") + medical_record_text = "Patient is unable to tell objects apart from a distance." + hardcore_value = 4 + +/datum/quirk/touchy/add(client/client_source) + RegisterSignal(quirk_holder, COMSIG_CLICK_SHIFT, PROC_REF(examinate_check)) + +/datum/quirk/touchy/remove() + UnregisterSignal(quirk_holder, COMSIG_CLICK_SHIFT) + +///Checks if the mob is besides the thing being examined, if they aren't then we cancel their examinate. +/datum/quirk/touchy/proc/examinate_check(mob/examiner, atom/examined) + SIGNAL_HANDLER + + if(!examined.Adjacent(examiner)) + return COMSIG_MOB_CANCEL_CLICKON diff --git a/code/datums/records/manifest.dm b/code/datums/records/manifest.dm index 7d3b7978af904..789b8787fe6e1 100644 --- a/code/datums/records/manifest.dm +++ b/code/datums/records/manifest.dm @@ -38,6 +38,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) misc_list[++misc_list.len] = list( "name" = name, "rank" = rank, + "trim" = trim, ) continue for(var/department_type as anything in job.departments_list) @@ -51,6 +52,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) var/list/entry = list( "name" = name, "rank" = rank, + "trim" = trim, ) var/list/department_list = manifest_out[department.department_name] if(istype(job, department.department_head)) diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index 363f484a41583..3598bd764cac7 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -20,7 +20,7 @@ if(user.mind.has_antag_datum(/datum/antagonist/fallen_changeling)) to_chat(user, span_changeling("We're cut off from the hivemind! We've lost everything! EVERYTHING!!")) return FALSE - var/datum/antagonist/changeling/ling_sender = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/ling_sender = IS_CHANGELING(user) if(!ling_sender) return FALSE if(HAS_TRAIT(user, TRAIT_CHANGELING_HIVEMIND_MUTE)) diff --git a/code/datums/skills/fitness.dm b/code/datums/skills/fitness.dm index c306548303e22..32be3f9d21174 100644 --- a/code/datums/skills/fitness.dm +++ b/code/datums/skills/fitness.dm @@ -1,6 +1,6 @@ /datum/skill/fitness name = "Fitness" - title = "Fitness" + title = "Powerlifter" desc = "Twinkle twinkle little star, hit the gym and lift the bar." /// The skill value modifier effects the max duration that is possible for /datum/status_effect/exercised modifiers = list(SKILL_VALUE_MODIFIER = list(1 MINUTES, 1.5 MINUTES, 2 MINUTES, 2.5 MINUTES, 3 MINUTES, 3.5 MINUTES, 5 MINUTES)) diff --git a/code/datums/spawners_menu.dm b/code/datums/spawners_menu.dm index 06b6dbc76a857..c6b64cc3a7ad3 100644 --- a/code/datums/spawners_menu.dm +++ b/code/datums/spawners_menu.dm @@ -30,9 +30,9 @@ this["important_warning"] = "" this["amount_left"] = 0 for(var/spawner_obj in GLOB.mob_spawners[spawner]) + var/obj/effect/mob_spawn/ghost_role/mob_spawner = spawner_obj if(!this["desc"]) if(istype(spawner_obj, /obj/effect/mob_spawn)) - var/obj/effect/mob_spawn/ghost_role/mob_spawner = spawner_obj if(!mob_spawner.allow_spawn(user, silent = TRUE)) continue this["you_are_text"] = mob_spawner.you_are_text @@ -41,8 +41,9 @@ else var/obj/object = spawner_obj this["desc"] = object.desc - this["amount_left"] += 1 - if(this["amount_left"] > 0) + this["amount_left"] += mob_spawner.uses + this["infinite"] += mob_spawner.infinite_use + if(this["amount_left"] > 0 || this["infinite"]) data["spawners"] += list(this) for(var/mob_type in GLOB.joinable_mobs) var/list/this = list() diff --git a/code/datums/sprite_accessories.dm b/code/datums/sprite_accessories.dm index bf4da0d98ea8f..2f433b8e340fb 100644 --- a/code/datums/sprite_accessories.dm +++ b/code/datums/sprite_accessories.dm @@ -2076,10 +2076,6 @@ icon = 'icons/mob/human/species/lizard/lizard_spines.dmi' em_block = TRUE -/datum/sprite_accessory/spines_animated - icon = 'icons/mob/human/species/lizard/lizard_spines.dmi' - em_block = TRUE - /datum/sprite_accessory/tail_spines icon = 'icons/mob/human/species/lizard/lizard_spines.dmi' em_block = TRUE @@ -2088,10 +2084,6 @@ name = "None" icon_state = "none" -/datum/sprite_accessory/spines_animated/none - name = "None" - icon_state = "none" - /datum/sprite_accessory/tail_spines/none name = "None" icon_state = "none" @@ -2100,10 +2092,6 @@ name = "Short" icon_state = "short" -/datum/sprite_accessory/spines_animated/short - name = "Short" - icon_state = "short" - /datum/sprite_accessory/tail_spines/short name = "Short" icon_state = "short" @@ -2112,10 +2100,6 @@ name = "Short + Membrane" icon_state = "shortmeme" -/datum/sprite_accessory/spines_animated/shortmeme - name = "Short + Membrane" - icon_state = "shortmeme" - /datum/sprite_accessory/tail_spines/shortmeme name = "Short + Membrane" icon_state = "shortmeme" @@ -2124,10 +2108,6 @@ name = "Long" icon_state = "long" -/datum/sprite_accessory/spines_animated/long - name = "Long" - icon_state = "long" - /datum/sprite_accessory/tail_spines/long name = "Long" icon_state = "long" @@ -2136,10 +2116,6 @@ name = "Long + Membrane" icon_state = "longmeme" -/datum/sprite_accessory/spines_animated/longmeme - name = "Long + Membrane" - icon_state = "longmeme" - /datum/sprite_accessory/tail_spines/longmeme name = "Long + Membrane" icon_state = "longmeme" @@ -2148,10 +2124,6 @@ name = "Aquatic" icon_state = "aqua" -/datum/sprite_accessory/spines_animated/aquatic - name = "Aquatic" - icon_state = "aqua" - /datum/sprite_accessory/tail_spines/aquatic name = "Aquatic" icon_state = "aqua" diff --git a/code/datums/station_traits/job_traits.dm b/code/datums/station_traits/job_traits.dm index 8dea2f96bbf09..041f846424094 100644 --- a/code/datums/station_traits/job_traits.dm +++ b/code/datums/station_traits/job_traits.dm @@ -164,6 +164,19 @@ new /obj/item/reagent_containers/cup/coffeepot(picked_turf) new /obj/item/storage/box/coffeepack(picked_turf) +/datum/station_trait/job/veteran_advisor + name = "Veteran Advisor" + button_desc = "Sign up to become a DISABLED but hard boiled Veteran Advisor of Nanotrasen Security Force. Advise HoS and Captain, train Officers, all while fighting your PTSD." + weight = 2 + report_message = "Veteran Security Advisor has been assigned to your station to help with Security matters." + show_in_report = TRUE + can_roll_antag = CAN_ROLL_PROTECTED + job_to_add = /datum/job/veteran_advisor + +/datum/station_trait/job/veteran_advisor/on_lobby_button_update_overlays(atom/movable/screen/lobby/button/sign_up/lobby_button, list/overlays) + . = ..() + overlays += "veteran_advisor" + #undef CAN_ROLL_ALWAYS #undef CAN_ROLL_PROTECTED #undef CAN_ROLL_NEVER diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 8cdc2840e2c48..74eb198cfcec9 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -792,6 +792,8 @@ processing_speed = STATUS_EFFECT_NORMAL_PROCESS /// Will act as the main timer as well as changing how much damage the ants do. var/ants_remaining = 0 + /// Amount of damage done per ant on the victim + var/damage_per_ant = 0.0016 /// Common phrases people covered in ants scream var/static/list/ant_debuff_speech = list( "GET THEM OFF ME!!", @@ -838,7 +840,7 @@ /datum/status_effect/ants/tick(seconds_between_ticks) var/mob/living/carbon/human/victim = owner var/need_mob_update - need_mob_update = victim.adjustBruteLoss(max(0.1, round((ants_remaining * 0.0016) * seconds_between_ticks,0.1)), updating_health = FALSE) //Scales with # of ants (lowers with time). Roughly 10 brute over 50 seconds. + need_mob_update = victim.adjustBruteLoss(max(0.1, round((ants_remaining * damage_per_ant) * seconds_between_ticks,0.1)), updating_health = FALSE) //Scales with # of ants (lowers with time). Roughly 10 brute over 50 seconds. if(victim.stat <= SOFT_CRIT) //Makes sure people don't scratch at themselves while they're in a critical condition if(prob(15)) switch(rand(1,2)) @@ -868,7 +870,7 @@ if(need_mob_update) victim.updatehealth() if(ants_remaining <= 0 || victim.stat >= HARD_CRIT) - victim.remove_status_effect(/datum/status_effect/ants) //If this person has no more ants on them or are dead, they are no longer affected. + victim.remove_status_effect(type) //If this person has no more ants on them or are dead, they are no longer affected. /atom/movable/screen/alert/status_effect/ants name = "Ants!" @@ -886,6 +888,15 @@ to_chat(living, span_notice("You manage to get some of the ants off!")) ant_covered.ants_remaining -= 10 // 5 Times more ants removed per second than just waiting in place +/datum/status_effect/ants/fire + id = "fire_ants" + alert_type = /atom/movable/screen/alert/status_effect/ants/fire + damage_per_ant = 0.0064 + +/atom/movable/screen/alert/status_effect/ants/fire + name = "Fire Ants!" + desc = span_warning("JESUS FUCKING CHRIST IT BURNS! CLICK TO GET THOSE THINGS OFF!") + /datum/status_effect/stagger id = "stagger" status_type = STATUS_EFFECT_REFRESH diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index 4a6e7b6b730f6..2f32ff5b3bedf 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -7,7 +7,7 @@ /// Current amount of stacks we have var/stacks /// Maximum of stacks that we could possibly get - var/stack_limit = 20 + var/stack_limit = MAX_FIRE_STACKS /// What status effect types do we remove uppon being applied. These are just deleted without any deduction from our or their stacks when forced. var/list/enemy_types /// What status effect types do we merge into if they exist. Ignored when forced. @@ -116,12 +116,8 @@ owner.clear_alert(ALERT_FIRE) else if(!was_on_fire && owner.on_fire) owner.throw_alert(ALERT_FIRE, /atom/movable/screen/alert/fire) - -/** - * Used to update owner's effect overlay - */ - -/datum/status_effect/fire_handler/proc/update_overlay() + owner.update_appearance(UPDATE_OVERLAYS) + update_particles() /datum/status_effect/fire_handler/fire_stacks id = "fire_stacks" //fire_stacks and wet_stacks should have different IDs or else has_status_effect won't work @@ -132,8 +128,6 @@ /// If we're on fire var/on_fire = FALSE - /// Stores current fire overlay icon state, for optimisation purposes - var/last_icon_state /// Reference to the mob light emitter itself var/obj/effect/dummy/lighting_obj/moblight /// Type of mob light emitter we use when on fire @@ -160,8 +154,6 @@ return TRUE deal_damage(seconds_between_ticks) - update_overlay() - update_particles() /datum/status_effect/fire_handler/fire_stacks/update_particles() if(on_fire) @@ -239,8 +231,6 @@ moblight = new moblight_type(owner) cache_stacks() - update_overlay() - update_particles() SEND_SIGNAL(owner, COMSIG_LIVING_IGNITED, owner) return TRUE @@ -254,8 +244,6 @@ owner.clear_mood_event("on_fire") SEND_SIGNAL(owner, COMSIG_LIVING_EXTINGUISHED, owner) cache_stacks() - update_overlay() - update_particles() for(var/obj/item/equipped in owner.get_equipped_items()) equipped.extinguish() @@ -263,16 +251,26 @@ if(on_fire) extinguish() set_stacks(0) - update_overlay() - update_particles() + UnregisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS) + owner.update_appearance(UPDATE_OVERLAYS) return ..() -/datum/status_effect/fire_handler/fire_stacks/update_overlay() - last_icon_state = owner.update_fire_overlay(stacks, on_fire, last_icon_state) - /datum/status_effect/fire_handler/fire_stacks/on_apply() . = ..() - update_overlay() + RegisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(add_fire_overlay)) + owner.update_appearance(UPDATE_OVERLAYS) + +/datum/status_effect/fire_handler/fire_stacks/proc/add_fire_overlay(mob/living/source, list/overlays) + SIGNAL_HANDLER + + if(stacks <= 0 || !on_fire) + return + + var/mutable_appearance/created_overlay = owner.get_fire_overlay(stacks, on_fire) + if(isnull(created_overlay)) + return + + overlays |= created_overlay /obj/effect/dummy/lighting_obj/moblight/fire name = "fire" diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 84f30ab7855e9..3f267cb3bad01 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -61,6 +61,7 @@ /datum/atom_hud/alternate_appearance/basic/one_person, "in_love", image(icon = 'icons/effects/effects.dmi', icon_state = "love_hearts", loc = date), + null, new_owner, )) diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index 915bdea22d4d3..8213bf347abfd 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -605,12 +605,11 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) */ /datum/storage/proc/return_inv(recursive = TRUE) var/list/ret = list() - ret |= real_location.contents for(var/atom/found_thing as anything in real_location) ret |= found_thing - if(recursive) - ret |= found_thing.atom_storage?.return_inv(ret, recursive = TRUE) + if(recursive && found_thing.atom_storage) + ret |= found_thing.atom_storage.return_inv(recursive = TRUE) return ret diff --git a/code/datums/votes/_vote_datum.dm b/code/datums/votes/_vote_datum.dm index a882511b51130..3f821a7129ada 100644 --- a/code/datums/votes/_vote_datum.dm +++ b/code/datums/votes/_vote_datum.dm @@ -32,6 +32,8 @@ var/count_method = VOTE_COUNT_METHOD_SINGLE /// The method for selecting a winner. var/winner_method = VOTE_WINNER_METHOD_SIMPLE + /// Should we show details about the number of votes submitted for each option? + var/display_statistics = TRUE /** * Used to determine if this vote is a possible @@ -193,21 +195,22 @@ if(total_votes <= 0) return span_bold("Vote Result: Inconclusive - No Votes!") - returned_text += "\nResults:" - for(var/option in choices) - returned_text += "\n" - var/votes = choices[option] - var/percentage_text = "" - if(votes > 0) - var/actual_percentage = round((votes / total_votes) * 100, 0.1) - var/text = "[actual_percentage]" - var/spaces_needed = 5 - length(text) - for(var/_ in 1 to spaces_needed) - returned_text += " " - percentage_text += "[text]%" - else - percentage_text = " 0%" - returned_text += "[percentage_text] | [span_bold(option)]: [choices[option]]" + if (display_statistics) + returned_text += "\nResults:" + for(var/option in choices) + returned_text += "\n" + var/votes = choices[option] + var/percentage_text = "" + if(votes > 0) + var/actual_percentage = round((votes / total_votes) * 100, 0.1) + var/text = "[actual_percentage]" + var/spaces_needed = 5 - length(text) + for(var/_ in 1 to spaces_needed) + returned_text += " " + percentage_text += "[text]%" + else + percentage_text = " 0%" + returned_text += "[percentage_text] | [span_bold(option)]: [choices[option]]" if(!real_winner) // vote has no winner or cannot be won, but still had votes return returned_text diff --git a/code/datums/votes/custom_vote.dm b/code/datums/votes/custom_vote.dm index 5960e7dff0ed9..d67eb0281c6c6 100644 --- a/code/datums/votes/custom_vote.dm +++ b/code/datums/votes/custom_vote.dm @@ -47,6 +47,17 @@ to_chat(vote_creator, span_boldwarning("Unknown winner method. Contact a coder.")) return FALSE + var/display_stats = tgui_alert( + vote_creator, + "Should voting statistics be public?", + "Show voting stats?", + list("Yes", "No"), + ) + + if(display_stats == null) + return FALSE + display_statistics = display_stats == "Yes" + override_question = tgui_input_text(vote_creator, "What is the vote for?", "Custom Vote") if(!override_question) return FALSE diff --git a/code/datums/votes/map_vote.dm b/code/datums/votes/map_vote.dm index 7d1c551aaf8df..a07d87846f050 100644 --- a/code/datums/votes/map_vote.dm +++ b/code/datums/votes/map_vote.dm @@ -1,8 +1,9 @@ /datum/vote/map_vote name = "Map" message = "Vote for next round's map!" - count_method = VOTE_COUNT_METHOD_MULTI + count_method = VOTE_COUNT_METHOD_SINGLE winner_method = VOTE_WINNER_METHOD_WEIGHTED_RANDOM + display_statistics = FALSE /datum/vote/map_vote/New() . = ..() diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 823585a9d7369..99438be18cc02 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -277,7 +277,7 @@ /datum/wires/ui_host() return holder -/datum/wires/ui_status(mob/user) +/datum/wires/ui_status(mob/user, datum/ui_state/state) if(interactable(user)) return ..() return UI_CLOSE diff --git a/code/datums/wires/brm.dm b/code/datums/wires/brm.dm deleted file mode 100644 index c00d787503533..0000000000000 --- a/code/datums/wires/brm.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/wires/brm - holder_type = /obj/machinery/bouldertech/brm - proper_name = "Boulder Retrieval Matrix" - -/datum/wires/brm/New(atom/holder) - add_duds(1) - return ..() - -/datum/wires/brm/on_pulse(wire) - var/obj/machinery/bouldertech/brm/brm_holder = holder - if(brm_holder.panel_open) - return - brm_holder.toggle_auto_on() - diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index 80c1c0a755713..9911a7cdd5de0 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -413,22 +413,11 @@ user.visible_message(span_notice("[user] finishes applying [I] to [victim]'s [limb.plaintext_zone], emitting a fizzing noise!"), span_notice("You finish applying [I] to [victim]'s [limb.plaintext_zone]!"), ignored_mobs=victim) to_chat(victim, span_userdanger("[user] finishes applying [I] to your [limb.plaintext_zone], and you can feel the bones exploding with pain as they begin melting and reforming!")) else - var/painkiller_bonus = 0 - if(victim.get_drunk_amount() > 10) - painkiller_bonus += 10 - if(victim.reagents.has_reagent(/datum/reagent/medicine/morphine)) - painkiller_bonus += 20 - if(victim.reagents.has_reagent(/datum/reagent/determination)) - painkiller_bonus += 10 - if(victim.reagents.has_reagent(/datum/reagent/consumable/ethanol/painkiller)) - painkiller_bonus += 15 - if(victim.reagents.has_reagent(/datum/reagent/medicine/mine_salve)) - painkiller_bonus += 20 - - if(prob(25 + (20 * (severity - 2)) - painkiller_bonus)) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by painkillers - victim.visible_message(span_danger("[victim] fails to finish applying [I] to [victim.p_their()] [limb.plaintext_zone], passing out from the pain!"), span_notice("You pass out from the pain of applying [I] to your [limb.plaintext_zone] before you can finish!")) - victim.AdjustUnconscious(5 SECONDS) - return TRUE + if(!HAS_TRAIT(victim, TRAIT_ANALGESIA)) + if(prob(25 + (20 * (severity - 2)) - min(victim.get_drunk_amount(), 10))) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by drunkenness + victim.visible_message(span_danger("[victim] fails to finish applying [I] to [victim.p_their()] [limb.plaintext_zone], passing out from the pain!"), span_notice("You pass out from the pain of applying [I] to your [limb.plaintext_zone] before you can finish!")) + victim.AdjustUnconscious(5 SECONDS) + return TRUE victim.visible_message(span_notice("[victim] finishes applying [I] to [victim.p_their()] [limb.plaintext_zone], grimacing from the pain!"), span_notice("You finish applying [I] to your [limb.plaintext_zone], and your bones explode in pain!")) limb.receive_damage(25, wound_bonus=CANT_WOUND) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index b6739dcd54083..05334d78851aa 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -38,6 +38,10 @@ var/list/firealarms = list() ///Alarm type to count of sources. Not usable for ^ because we handle fires differently var/list/active_alarms = list() + /// The current alarm fault status + var/fault_status = AREA_FAULT_NONE + /// The source machinery for the area's fault status + var/fault_location ///List of all lights in our area var/list/lights = list() ///We use this just for fire alarms, because they're area based right now so one alarm going poof shouldn't prevent you from clearing your alarms listing. Fire alarms and fire locks will set and clear alarms. @@ -394,10 +398,15 @@ GLOBAL_LIST_EMPTY(teleportlocs) * * Allows interested parties (lights and fire alarms) to react */ -/area/proc/set_fire_effect(new_fire) +/area/proc/set_fire_effect(new_fire, fault_type, fault_source) if(new_fire == fire) return fire = new_fire + fault_status = fault_type + if(fire) + fault_location = fault_source + else + fault_location = null SEND_SIGNAL(src, COMSIG_AREA_FIRE_CHANGED, fire) /** diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm index 2927b081c5ef2..3b86f56f23587 100644 --- a/code/game/area/areas/away_content.dm +++ b/code/game/area/areas/away_content.dm @@ -23,6 +23,18 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" has_gravity = STANDARD_GRAVITY ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg','sound/ambience/ambiodd.ogg','sound/ambience/ambinice.ogg') +/area/awaymission/museum + name = "Nanotrasen Museum" + icon_state = "awaycontent28" + sound_environment = SOUND_ENVIRONMENT_CONCERT_HALL + +/area/awaymission/museum/mothroachvoid + static_lighting = FALSE + base_lighting_alpha = 200 + base_lighting_color = "#FFF4AA" + sound_environment = SOUND_ENVIRONMENT_PLAIN + ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/ambiodd.ogg','sound/ambience/ambinice.ogg') + /area/awaymission/errorroom name = "Super Secret Room" static_lighting = FALSE diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm index f0bd865c20970..ceb8cac18c009 100644 --- a/code/game/area/areas/ruins/space.dm +++ b/code/game/area/areas/ruins/space.dm @@ -33,7 +33,7 @@ // Ruins of "onehalf" ship /area/ruin/space/has_grav/onehalf/hallway - name = "\improper Hallway" + name = "\improper Half-Station Hallway" /area/ruin/space/has_grav/onehalf/drone_bay name = "\improper Mining Drone Bay" @@ -42,7 +42,7 @@ name = "\improper Crew Quarters" /area/ruin/space/has_grav/onehalf/bridge - name = "\improper Bridge" + name = "\improper Half-Station Bridge" /area/ruin/space/has_grav/powered/dinner_for_two name = "Dinner for Two" @@ -638,25 +638,25 @@ name = "Waystation Maintenance" /area/ruin/space/has_grav/waystation/qm - name = "Quartermaster Office" + name = "Waystation Quartermaster Office" /area/ruin/space/has_grav/waystation/dorms - name = "Living Space" + name = "Waystation Living Space" /area/ruin/space/has_grav/waystation/kitchen - name = "Kitchen" + name = "Waystation Kitchen" /area/ruin/space/has_grav/waystation/cargobay - name = "Cargo Bay" + name = "Waystation Cargo Bay" /area/ruin/space/has_grav/waystation/securestorage - name = "Secure Storage" + name = "Waystation Secure Storage" /area/ruin/space/has_grav/waystation/cargooffice - name = "Cargo Office" + name = "Waystation Cargo Office" /area/ruin/space/has_grav/powered/waystation/assaultpod - name = "Assault Pod" + name = "Waystation Assault Pod" /area/ruin/space/has_grav/waystation/power name = "Waystation Electrical" diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index e79cfd1a5ded6..97e6ce6bed95b 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -65,7 +65,7 @@ var/datum/wires/wires = null ///Light systems, both shouldn't be active at the same time. - var/light_system = STATIC_LIGHT + var/light_system = COMPLEX_LIGHT ///Range of the light in tiles. Zero means no light. var/light_range = 0 ///Intensity of the light. The stronger, the less shadows you will see on the lit area. diff --git a/code/game/atom/alternate_appearance.dm b/code/game/atom/alternate_appearance.dm index 86732dd9ed452..228462f7936a4 100644 --- a/code/game/atom/alternate_appearance.dm +++ b/code/game/atom/alternate_appearance.dm @@ -166,8 +166,8 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) return TRUE return FALSE -/datum/atom_hud/alternate_appearance/basic/one_person/New(key, image/I, mob/living/M) - ..(key, I, FALSE) - seer = M +/datum/atom_hud/alternate_appearance/basic/one_person/New(key, image/I, options = NONE, mob/living/seer) + src.seer = seer + return ..() /datum/atom_hud/alternate_appearance/basic/food_demands diff --git a/code/game/atom/atom_vv.dm b/code/game/atom/atom_vv.dm index b5a572749a672..8830a4af2f433 100644 --- a/code/game/atom/atom_vv.dm +++ b/code/game/atom/atom_vv.dm @@ -222,37 +222,37 @@ light_flags &= ~LIGHT_FROZEN switch(var_name) if(NAMEOF(src, light_range)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_range = var_value) else set_light_range(var_value) . = TRUE if(NAMEOF(src, light_power)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_power = var_value) else set_light_power(var_value) . = TRUE if(NAMEOF(src, light_color)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_color = var_value) else set_light_color(var_value) . = TRUE if(NAMEOF(src, light_angle)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_angle = var_value) . = TRUE if(NAMEOF(src, light_dir)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_dir = var_value) . = TRUE if(NAMEOF(src, light_height)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_height = var_value) . = TRUE if(NAMEOF(src, light_on)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_on = var_value) else set_light_on(var_value) diff --git a/code/game/atom/atoms_initializing_EXPENSIVE.dm b/code/game/atom/atoms_initializing_EXPENSIVE.dm index 2a3a442e04d71..ea8bf9b125de8 100644 --- a/code/game/atom/atoms_initializing_EXPENSIVE.dm +++ b/code/game/atom/atoms_initializing_EXPENSIVE.dm @@ -128,7 +128,7 @@ if(color) add_atom_colour(color, FIXED_COLOUR_PRIORITY) - if (light_system == STATIC_LIGHT && light_power && light_range) + if (light_system == COMPLEX_LIGHT && light_power && light_range) update_light() SETUP_SMOOTHING() diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 6ff44f8c73222..67086d91a4321 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -178,11 +178,11 @@ if(opacity) AddElement(/datum/element/light_blocking) switch(light_system) - if(MOVABLE_LIGHT) + if(OVERLAY_LIGHT) AddComponent(/datum/component/overlay_lighting) - if(MOVABLE_LIGHT_DIRECTIONAL) + if(OVERLAY_LIGHT_DIRECTIONAL) AddComponent(/datum/component/overlay_lighting, is_directional = TRUE) - if(MOVABLE_LIGHT_BEAM) + if(OVERLAY_LIGHT_BEAM) AddComponent(/datum/component/overlay_lighting, is_directional = TRUE, is_beam = TRUE) /atom/movable/Destroy(force) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 495c4374954c0..a386dec8db2f5 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -781,7 +781,7 @@ GLOBAL_LIST_EMPTY(possible_items) n_p ++ else if (SSticker.IsRoundInProgress()) for(var/mob/living/carbon/human/P in GLOB.player_list) - if(!(P.mind.has_antag_datum(/datum/antagonist/changeling)) && !(P.mind in owners)) + if(!(IS_CHANGELING(P)) && !(P.mind in owners)) n_p ++ target_amount = min(target_amount, n_p) diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 9627f48cbb501..491f0f71fb900 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -22,9 +22,23 @@ var/objective_type = OBJECTIVE_ITEM_TYPE_NORMAL /// Whether this item exists on the station map at the start of a round. var/exists_on_map = FALSE + /** + * How hard it is to steal this item given normal circumstances, ranked on a scale of 1 to 5. + * + * 1 - Probably found in a public area + * 2 - Likely on someone's person, or in a less-than-public but otherwise unguarded area + * 3 - Usually on someone's person, or in a locked locker or otherwise secure area + * 4 - Always on someone's person, or in a secure area + * 5 - You know it when you see it. Things like the Nuke Disc which have a pointer to it at all times. + * + * Also accepts 0 as "extremely easy to steal" and >5 as "almost impossible to steal" + */ + var/difficulty = 0 + /// A hint explaining how one may find the target item. + var/steal_hint = "The clown might have one." /// For objectives with special checks (does that intellicard have an ai in it? etcetc) -/datum/objective_item/proc/check_special_completion() +/datum/objective_item/proc/check_special_completion(obj/item/thing) return TRUE /// Takes a list of minds and returns true if this is a valid objective to give to a team of these minds @@ -72,6 +86,8 @@ excludefromjob = list(JOB_BARTENDER) item_owner = list(JOB_BARTENDER) exists_on_map = TRUE + difficulty = 2 + steal_hint = "A double-barrel shotgun usually found on the bartender's person, or if none are around, in the bar's backroom." /obj/item/gun/ballistic/shotgun/doublebarrel/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/ballistic/shotgun/doublebarrel) @@ -91,6 +107,9 @@ JOB_STATION_ENGINEER, ) exists_on_map = TRUE + difficulty = 3 + steal_hint = "Only two of these exist on the station - one in the bridge, and one in atmospherics. \ + You can use a multitool to hack open the case, or break it open the hard way." /obj/item/fireaxe/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/fireaxe) @@ -105,6 +124,8 @@ ) item_owner = list(JOB_ROBOTICIST) exists_on_map = TRUE + difficulty = 2 + steal_hint = "A specialized tool found in the roboticist's lab. You can use a multitool to hack open the case, or break it open the hard way." /obj/item/crowbar/mechremoval/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/crowbar/mechremoval) @@ -115,6 +136,9 @@ excludefromjob = list(JOB_CHAPLAIN) item_owner = list(JOB_CHAPLAIN) exists_on_map = TRUE + difficulty = 2 + steal_hint = "A holy artifact usually found on the chaplain's person, or if none are around, in the chapel's relic closet. \ + If there is a chaplain aboard, it is likely be to be transformed into some holy weapon - some of which are... difficult to remove from their person." /obj/item/nullrod/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/nullrod) @@ -125,6 +149,8 @@ excludefromjob = list(JOB_CLOWN, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) item_owner = list(JOB_CLOWN) exists_on_map = TRUE + difficulty = 1 + steal_hint = "The clown's huge, bright shoes. They should always be on the clown's feet." /obj/item/clothing/shoes/clown_shoes/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/shoes/clown_shoes) @@ -135,6 +161,8 @@ excludefromjob = list(JOB_MIME, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) item_owner = list(JOB_MIME) exists_on_map = TRUE + difficulty = 1 + steal_hint = "The mime's mask. It should always be on the mime's face." /obj/item/clothing/mask/gas/mime/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/mask/gas/mime) @@ -145,6 +173,9 @@ excludefromjob = list(JOB_SHAFT_MINER, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) item_owner = list(JOB_SHAFT_MINER) exists_on_map = TRUE + difficulty = 1 + steal_hint = "A tool primarily used by shaft miners to mine. Most carry one (or multiple) on their person, \ + but they can also be found in the Mining Station, Mining office, or Auxiliary Mining Base on the station." /obj/item/gun/energy/recharge/kinetic_accelerator/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/energy/recharge/kinetic_accelerator) @@ -155,6 +186,8 @@ excludefromjob = list(JOB_COOK, JOB_HEAD_OF_PERSONNEL, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) item_owner = list(JOB_COOK) exists_on_map = TRUE + difficulty = 1 + steal_hint = "The chef's fake Italian moustache, either found on their face or in the garbage, depending on who's on duty." /obj/item/clothing/mask/fakemoustache/italian/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/mask/fakemoustache/italian) @@ -164,6 +197,9 @@ targetitem = /obj/item/gun/ballistic/revolver/c38/detective excludefromjob = list(JOB_DETECTIVE) exists_on_map = TRUE + difficulty = 3 + steal_hint = "A .38 special revolver found in the Detective's holder. \ + Usually found on the Detective's person, or if none are around, in the detective's locker, in their office." /obj/item/gun/ballistic/revolver/c38/detective/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/ballistic/revolver/c38/detective) @@ -174,6 +210,8 @@ excludefromjob = list(JOB_LAWYER) item_owner = list(JOB_LAWYER) exists_on_map = TRUE + difficulty = 1 + steal_hint = "The lawyer's badge. Usually pinned to their chest, but a spare can be obtained from their clothes vendor." /obj/item/clothing/accessory/lawyers_badge/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/accessory/lawyers_badge) @@ -183,6 +221,8 @@ targetitem = /obj/item/storage/belt/utility/chief excludefromjob = list(JOB_CHIEF_ENGINEER) exists_on_map = TRUE + difficulty = 2 + steal_hint = "The chief engineer's toolbelt, strapped to their waist at all times." /obj/item/storage/belt/utility/chief/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/storage/belt/utility/chief) @@ -199,6 +239,8 @@ JOB_CHIEF_MEDICAL_OFFICER ) exists_on_map = TRUE + difficulty = 3 + steal_hint = "A self-defense weapon standard-issue for all heads of staffs barring the Head of Security. Rarely found off of their person." /obj/item/melee/baton/telescopic/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/melee/baton/telescopic) @@ -209,6 +251,9 @@ excludefromjob = list(JOB_QUARTERMASTER, JOB_CARGO_TECHNICIAN) item_owner = list(JOB_QUARTERMASTER) exists_on_map = TRUE + difficulty = 2 + steal_hint = "A card that grants access to Cargo's funds. \ + Normally found in the locker of the Quartermaster, but a particularly keen one may have it on their person or in their wallet." /obj/item/card/id/departmental_budget/car/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/card/id/departmental_budget/car) @@ -218,6 +263,9 @@ targetitem = /obj/item/mod/control/pre_equipped/magnate excludefromjob = list(JOB_CAPTAIN) exists_on_map = TRUE + difficulty = 3 + steal_hint = "An expensive, hand-crafted MOD unit made for the station's Captain. \ + If not being worn by the Captain, you would find it in the Suit Storage Unit in their quarters." /obj/item/mod/control/pre_equipped/magnate/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/magnate) @@ -234,6 +282,10 @@ JOB_CHIEF_MEDICAL_OFFICER ) exists_on_map = TRUE + difficulty = 4 + steal_hint = "The spare ID of the High Lord himself. \ + If there's no official Captain around, you may find it pinned to the chest of the Acting Captain - one of the Heads of Staff. \ + Otherwise, you'll have to bust open the golden safe on the bridge with acid or explosives to get to it." /obj/item/card/id/advanced/gold/captains_spare/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/card/id/advanced/gold/captains_spare) @@ -246,6 +298,9 @@ targetitem = /obj/item/gun/energy/laser/captain excludefromjob = list(JOB_CAPTAIN) exists_on_map = TRUE + difficulty = 4 + steal_hint = "A self-charging laser gun found in a display case in the Captain's Quarters. \ + Breaking it open may trigger a security alert, so be careful." /obj/item/gun/energy/laser/captain/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/energy/laser/captain) @@ -256,6 +311,9 @@ excludefromjob = list(JOB_HEAD_OF_SECURITY) item_owner = list(JOB_HEAD_OF_SECURITY) exists_on_map = TRUE + difficulty = 4 + steal_hint = "The Head of Security's unique three mode laser gun. \ + Always found on their person, if they are alive, but may otherwise be found in their locker." /obj/item/gun/energy/e_gun/hos/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/energy/e_gun/hos) @@ -266,6 +324,8 @@ excludefromjob = list(JOB_HEAD_OF_SECURITY) item_owner = list(JOB_HEAD_OF_SECURITY) exists_on_map = TRUE + difficulty = 4 + steal_hint = "A miniaturized combat shotgun. May be found in Head of Security's locker or strapped to their back." /obj/item/gun/ballistic/shotgun/automatic/combat/compact/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/ballistic/shotgun/automatic/combat/compact) @@ -276,6 +336,9 @@ excludefromjob = list(JOB_CAPTAIN, JOB_RESEARCH_DIRECTOR, JOB_HEAD_OF_PERSONNEL) item_owner = list(JOB_CAPTAIN, JOB_RESEARCH_DIRECTOR) exists_on_map = TRUE + difficulty = 3 + steal_hint = "Only two of these devices exist on the station, with one sitting in the Teleporter Room \ + for emergencies, and the other in the Captain's Quarters for personal use." /obj/item/hand_tele/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/hand_tele) @@ -286,6 +349,8 @@ excludefromjob = list(JOB_CAPTAIN) item_owner = list(JOB_CAPTAIN) exists_on_map = TRUE + difficulty = 3 + steal_hint = "A special yellow jetpack found in the Suit Storage Unit in the Captain's Quarters." /obj/item/tank/jetpack/oxygen/captain/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/tank/jetpack/oxygen/captain) @@ -296,6 +361,9 @@ excludefromjob = list(JOB_CHIEF_ENGINEER) item_owner = list(JOB_CHIEF_ENGINEER) exists_on_map = TRUE + difficulty = 3 + steal_hint = "A pair of magnetic boots found in the Chief Engineer's Suit Storage Unit. \ + May also be found on their person, concealed beneath their MODsuit." /obj/item/clothing/shoes/magboots/advance/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/shoes/magboots/advance) @@ -306,6 +374,9 @@ excludefromjob = list(JOB_CAPTAIN) item_owner = list(JOB_CAPTAIN) exists_on_map = TRUE + difficulty = 3 + steal_hint = "A gold medal found in the medal box in the Captain's Quarters. \ + The Captain usually also has one pinned to their jumpsuit." /obj/item/clothing/accessory/medal/gold/captain/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/accessory/medal/gold/captain) @@ -316,6 +387,9 @@ excludefromjob = list(JOB_CHIEF_MEDICAL_OFFICER) item_owner = list(JOB_CHIEF_MEDICAL_OFFICER) exists_on_map = TRUE + difficulty = 3 + steal_hint = "The Chief Medical Officer's personal medical injector. \ + Usually found amongst their medical supplies on their person, in their belt, or otherwise in their locker." /obj/item/reagent_containers/hypospray/cmo/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/reagent_containers/hypospray/cmo) @@ -324,6 +398,9 @@ name = "the nuclear authentication disk" targetitem = /obj/item/disk/nuclear excludefromjob = list(JOB_CAPTAIN) + difficulty = 5 + steal_hint = "THAT disk - you know the one. Carried by the Captain at all times (hopefully). \ + Difficult to miss, but if you can't find it, the Head of Security and Captain both have devices to track its precise location." /obj/item/disk/nuclear/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/disk/nuclear) @@ -337,6 +414,8 @@ excludefromjob = list(JOB_HEAD_OF_SECURITY, JOB_WARDEN) item_owner = list(JOB_HEAD_OF_SECURITY) exists_on_map = TRUE + difficulty = 4 + steal_hint = "An ablative trechcoat found on the shelves of the Armory." /obj/item/clothing/suit/hooded/ablative/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/suit/hooded/ablative) @@ -347,6 +426,9 @@ excludefromjob = list(JOB_RESEARCH_DIRECTOR) item_owner = list(JOB_RESEARCH_DIRECTOR) exists_on_map = TRUE + difficulty = 3 + steal_hint = "A special suit of armor found in the possession of the Research Director. \ + You may otherwise find it in their locker." /obj/item/clothing/suit/armor/reactive/teleport/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/suit/armor/reactive/teleport) @@ -356,6 +438,11 @@ valid_containers = list(/obj/item/folder) targetitem = /obj/item/documents exists_on_map = TRUE + difficulty = 3 + steal_hint = "A set of papers belonging to a megaconglomerate. \ + Nanotrasen documents can easily be found in the station's vault. \ + For other corporations, you may find them in strange and distant places. \ + A photocopy may also suffice." /obj/item/documents/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/documents) //Any set of secret documents. Doesn't have to be NT's @@ -365,6 +452,8 @@ valid_containers = list(/obj/item/nuke_core_container) targetitem = /obj/item/nuke_core exists_on_map = TRUE + difficulty = 4 + steal_hint = "The core of the station's self-destruct device, found in the vault." /obj/item/nuke_core/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/nuke_core) @@ -379,6 +468,8 @@ excludefromjob = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_ROBOTICIST, JOB_GENETICIST) item_owner = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST) exists_on_map = TRUE + difficulty = 4 + steal_hint = "The hard drive of the master research server, found in R&D's server room." /obj/item/computer_disk/hdd_theft/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/computer_disk/hdd_theft) @@ -392,6 +483,8 @@ name = "a sliver of a supermatter crystal" targetitem = /obj/item/nuke_core/supermatter_sliver valid_containers = list(/obj/item/nuke_core_container/supermatter) + difficulty = 5 + steal_hint = "A small shard of the station's supermatter crystal engine." /datum/objective_item/steal/supermatter/New() special_equipment += /obj/item/storage/box/syndie_kit/supermatter @@ -404,6 +497,8 @@ /datum/objective_item/steal/functionalai name = "a functional AI" targetitem = /obj/item/aicard + difficulty = 5 + steal_hint = "An intellicard (or MODsuit) containing an active, functional AI." /datum/objective_item/steal/functionalai/New() . = ..() @@ -435,6 +530,8 @@ item_owner = list(JOB_CHIEF_ENGINEER) altitems = list(/obj/item/photo) exists_on_map = TRUE + difficulty = 3 + steal_hint = "The blueprints of the station, found in the Chief Engineer's locker, or on their person. A picture may suffice." /obj/item/areaeditor/blueprints/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/areaeditor/blueprints) @@ -453,6 +550,8 @@ targetitem = /obj/item/blackbox excludefromjob = list(JOB_CHIEF_ENGINEER, JOB_STATION_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN) exists_on_map = TRUE + difficulty = 4 + steal_hint = "The station's data Blackbox, found solely within Telecommunications." /obj/item/blackbox/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/blackbox) @@ -466,6 +565,8 @@ 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) exists_on_map = TRUE + difficulty = 1 + steal_hint = "A basic pair of insulated gloves, usually worn by Assistants, Engineers, or Cargo Technicians." /obj/item/clothing/gloves/color/yellow/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/clothing/gloves/color/yellow) @@ -475,6 +576,8 @@ targetitem = /obj/item/toy/plush/moth excludefromjob = list(JOB_PSYCHOLOGIST, JOB_PARAMEDIC, JOB_CHEMIST, JOB_MEDICAL_DOCTOR, JOB_VIROLOGIST, JOB_CHIEF_MEDICAL_OFFICER, JOB_CORONER) exists_on_map = TRUE + difficulty = 1 + steal_hint = "A moth plush toy. The Psychologist has one to help console patients." /obj/item/toy/plush/moth/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/toy/plush/moth) @@ -483,6 +586,8 @@ name = "cute lizard plush toy" targetitem = /obj/item/toy/plush/lizard_plushie exists_on_map = TRUE + difficulty = 1 + steal_hint = "A lizard plush toy. Often found hidden in maintenance." /obj/item/toy/plush/lizard_plushie/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/toy/plush/lizard_plushie) @@ -492,6 +597,8 @@ targetitem = /obj/item/stamp/denied excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_SHAFT_MINER) exists_on_map = TRUE + difficulty = 1 + steal_hint = "Cargo often has multiple of these red stamps lying around to process paperwork." /obj/item/stamp/denied/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/stamp/denied) @@ -501,6 +608,8 @@ targetitem = /obj/item/stamp/granted excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_SHAFT_MINER) exists_on_map = TRUE + difficulty = 1 + steal_hint = "Cargo often has multiple of these green stamps lying around to process paperwork." /obj/item/stamp/granted/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/stamp/granted) @@ -510,6 +619,9 @@ targetitem = /obj/item/book/manual/wiki/security_space_law excludefromjob = list(JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_HEAD_OF_SECURITY, JOB_LAWYER, JOB_DETECTIVE) exists_on_map = TRUE + difficulty = 1 + steal_hint = "Sometimes found in the possession of members of Security and Lawyers. \ + The courtroom and the library are also good places to look." /obj/item/book/manual/wiki/security_space_law/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/book/manual/wiki/security_space_law) @@ -520,6 +632,8 @@ excludefromjob = list(JOB_ATMOSPHERIC_TECHNICIAN, JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER, JOB_SCIENTIST, JOB_RESEARCH_DIRECTOR, JOB_GENETICIST, JOB_ROBOTICIST) item_owner = list(JOB_CHIEF_ENGINEER) exists_on_map = TRUE + difficulty = 1 + steal_hint = "A tool often used by Engineers, Atmospherics Technicians, and Ordnance Technicians." /obj/item/pipe_dispenser/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/pipe_dispenser) @@ -529,6 +643,254 @@ targetitem = /obj/item/storage/fancy/donut_box excludefromjob = list(JOB_CAPTAIN, JOB_CHIEF_ENGINEER, JOB_HEAD_OF_PERSONNEL, JOB_HEAD_OF_SECURITY, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_RESEARCH_DIRECTOR, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_LAWYER, JOB_DETECTIVE) exists_on_map = TRUE + difficulty = 1 + steal_hint = "Everyone has a box of donuts - you may most commonly find them on the Bridge, within Security, or in any department's break room." /obj/item/storage/fancy/donut_box/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/storage/fancy/donut_box) + +/datum/objective_item/steal/spy + objective_type = OBJECTIVE_ITEM_TYPE_SPY + +/datum/objective_item/steal/spy/lamarr + name = "The Research Director's pet headcrab" + targetitem = /obj/item/clothing/mask/facehugger/lamarr + excludefromjob = list(JOB_RESEARCH_DIRECTOR) + exists_on_map = TRUE + difficulty = 3 + steal_hint = "The Research Director's pet headcrab, Lamarr, found in a secure cage in their office." + +/obj/item/clothing/mask/facehugger/lamarr/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/mask/facehugger/lamarr) + +/datum/objective_item/steal/spy/disabler + name = "a disabler" + targetitem = /obj/item/gun/energy/disabler + excludefromjob = list( + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + difficulty = 2 + steal_hint = "A hand-held disabler, often found in the possession of Security Officers." + +/datum/objective_item/steal/spy/energy_gun + name = "an energy gun" + targetitem = /obj/item/gun/energy/e_gun + excludefromjob = list( + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_QUARTERMASTER, + JOB_RESEARCH_DIRECTOR, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + exists_on_map = TRUE + difficulty = 2 + steal_hint = "A two-mode energy gun, found in the station's Armory, as well as in the hands of some heads of staff for personal defense." + +/datum/objective_item/steal/spy/energy_gun/check_special_completion(obj/item/thing) + return thing.type == /obj/item/gun/energy/e_gun + +/obj/item/gun/energy/e_gun/add_stealing_item_objective() + if(type == /obj/item/gun/energy/e_gun) + return add_item_to_steal(src, /obj/item/gun/energy/e_gun) + +/datum/objective_item/steal/spy/laser_gun + name = "a laser gun" + targetitem = /obj/item/gun/energy/laser + excludefromjob = list( + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_QUARTERMASTER, + JOB_RESEARCH_DIRECTOR, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + exists_on_map = TRUE + difficulty = 3 + steal_hint = "A simple laser gun, found in the station's Armory." + +/datum/objective_item/steal/spy/laser_gun/check_special_completion(obj/item/thing) + return thing.type == /obj/item/gun/energy/laser + +/obj/item/gun/energy/laser/add_stealing_item_objective() + if(type == /obj/item/gun/energy/laser) + return add_item_to_steal(src, /obj/item/gun/energy/laser) + +/datum/objective_item/steal/spy/shotgun + name = "a riot shotgun" + targetitem = /obj/item/gun/ballistic/shotgun/riot + excludefromjob = list( + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + exists_on_map = TRUE + difficulty = 3 + steal_hint = "A shotgun found in the station's Armory for riot suppression. Doesn't miss." + +/obj/item/gun/ballistic/shotgun/riot/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/gun/ballistic/shotgun/riot) + +/datum/objective_item/steal/spy/temp_gun + name = "security's temperature gun" + targetitem = /obj/item/gun/energy/temperature/security + excludefromjob = list( + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + exists_on_map = TRUE + difficulty = 2 // lowered for the meme + steal_hint = "Security's TRUSTY temperature gun, found in the station's Armory." + +/obj/item/gun/energy/temperature/security/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/gun/energy/temperature/security) + +/datum/objective_item/steal/spy/stamp + name = "a head of staff's stamp" + targetitem = /obj/item/stamp/head + excludefromjob = list( + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_QUARTERMASTER, + JOB_RESEARCH_DIRECTOR, + ) + exists_on_map = TRUE + difficulty = 1 + steal_hint = "A stamp owned by a head of staff, from their offices." + +/obj/item/stamp/head/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/stamp/head) + +/datum/objective_item/steal/spy/sunglasses + name = "sunglasses" + targetitem = /obj/item/clothing/glasses/sunglasses + excludefromjob = list( + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_LAWYER, + JOB_QUARTERMASTER, + JOB_RESEARCH_DIRECTOR, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + difficulty = 1 + steal_hint = "A pair of sunglasses. Lawyers often have a few pairs, as do some heads of staff. \ + 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" + targetitem = /obj/item/mod/control/pre_equipped/advanced + excludefromjob = list(JOB_CHIEF_ENGINEER) + exists_on_map = TRUE + difficulty = 2 + steal_hint = "An advanced version of the standard Engineering MODsuit commonly worn by the Chief Engineer." + +/obj/item/mod/control/pre_equipped/advanced/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/advanced) + +/datum/objective_item/steal/spy/rd_modsuit + name = "the research director's research MOD control unit" + targetitem = /obj/item/mod/control/pre_equipped/research + excludefromjob = list(JOB_RESEARCH_DIRECTOR) + exists_on_map = TRUE + difficulty = 2 + steal_hint = "A bulky MODsuit commonly worn by the Research Director to protect themselves from the hazards of their work." + +/obj/item/mod/control/pre_equipped/research/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/research) + +/datum/objective_item/steal/spy/cmo_modsuit + name = "the chief medical officer's rescure MOD control unit" + targetitem = /obj/item/mod/control/pre_equipped/rescue + excludefromjob = list(JOB_CHIEF_MEDICAL_OFFICER) + exists_on_map = TRUE + difficulty = 2 + steal_hint = "A MODsuit sometimes equipped by the Chief Medical Officer to perform rescue opperations in hazardous environments." + +/obj/item/mod/control/pre_equipped/rescue/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/rescue) + +/datum/objective_item/steal/spy/hos_modsuit + name = "the head of security's safeguard MOD control unit" + targetitem = /obj/item/mod/control/pre_equipped/safeguard + excludefromjob = list(JOB_HEAD_OF_SECURITY) + exists_on_map = TRUE + difficulty = 2 + steal_hint = "An advanced MODsuit sometimes worn by the Head of Security when needing to detain hostiles invading the station." + +/obj/item/mod/control/pre_equipped/safeguard/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/safeguard) + +/datum/objective_item/steal/spy/stun_baton + name = "a stun baton" + targetitem = /obj/item/melee/baton/security + excludefromjob = list( + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + difficulty = 2 + steal_hint = "Steal any stun baton from Security." + +/datum/objective_item/steal/spy/stun_baton/check_special_completion(obj/item/thing) + return !istype(thing, /obj/item/melee/baton/security/cattleprod) + +/datum/objective_item/steal/spy/det_baton + name = "the detective's baton" + targetitem = /obj/item/melee/baton + excludefromjob = list( + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + exists_on_map = TRUE + difficulty = 2 + steal_hint = "The detective's old wooden truncheon, commonly found on their person for self defense." + +/datum/objective_item/steal/spy/det_baton/check_special_completion(obj/item/thing) + return thing.type == /obj/item/melee/baton + +/obj/item/melee/baton/add_stealing_item_objective() + if(type == /obj/item/melee/baton) + return add_item_to_steal(src, /obj/item/melee/baton) + +/datum/objective_item/steal/spy/captain_sabre_sheathe + name = "the captain's sabre sheathe" + targetitem = /obj/item/storage/belt/sabre + excludefromjob = list(JOB_CAPTAIN) + exists_on_map = TRUE + difficulty = 3 + steal_hint = "The sheathe for the captain's sabre, found in their closet or strapped to their waist at all times." + +/obj/item/storage/belt/sabre/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/storage/belt/sabre) diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index c4cf5bb125ae6..679a3182a57cd 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -67,7 +67,7 @@ QDEL_NULL(stored_id_card) return ..() -/obj/machinery/pdapainter/on_deconstruction() +/obj/machinery/pdapainter/on_deconstruction(disassembled) // Don't use ejection procs as we're gonna be destroyed anyway, so no need to update icons or anything. if(stored_pda) stored_pda.forceMove(loc) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 65c47e4280196..69ae33f79592b 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -136,8 +136,6 @@ var/market_verb = "Customer" var/payment_department = ACCOUNT_ENG - /// For storing and overriding ui id - var/tgui_id // ID of TGUI interface ///Is this machine currently in the atmos machinery queue? var/atmos_processing = FALSE /// world.time of last use by [/mob/living] @@ -198,9 +196,8 @@ end_processing() clear_components() - dump_contents() - unset_static_power() + return ..() /** @@ -818,11 +815,15 @@ deconstruct(TRUE) /obj/machinery/deconstruct(disassembled = TRUE) + SHOULD_NOT_OVERRIDE(TRUE) + if(obj_flags & NO_DECONSTRUCTION) + dump_contents() //drop everything inside us return ..() //Just delete us, no need to call anything else. - on_deconstruction() + on_deconstruction(disassembled) if(!LAZYLEN(component_parts)) + dump_contents() //drop everything inside us return ..() //we don't have any parts. spawn_frame(disassembled) @@ -841,8 +842,12 @@ continue var/obj/item/stack/stack_path = component new stack_path(loc, board.req_components[component]) - LAZYCLEARLIST(component_parts) + + //drop everything inside us. we do this last to give machines a chance + //to handle their contents before we dump them + dump_contents() + return ..() /** @@ -856,7 +861,7 @@ /obj/machinery/proc/spawn_frame(disassembled) var/obj/structure/frame/machine/new_frame = new /obj/structure/frame/machine(loc) - new_frame.state = 2 + new_frame.state = FRAME_STATE_WIRED // If the new frame shouldn't be able to fit here due to the turf being blocked, spawn the frame deconstructed. if(isturf(loc)) @@ -866,7 +871,7 @@ new_frame.deconstruct(disassembled) return - new_frame.icon_state = "box_1" + new_frame.update_appearance(UPDATE_ICON_STATE) . = new_frame new_frame.set_anchored(anchored) if(!disassembled) @@ -1128,8 +1133,14 @@ /obj/machinery/proc/on_construction(mob/user) return -//called on deconstruction before the final deletion -/obj/machinery/proc/on_deconstruction() +/** + * called on deconstruction before the final deletion + * Arguments + * + * * disassembled - if TRUE means we used tools to deconstruct it, FALSE means it got destroyed by other means + */ +/obj/machinery/proc/on_deconstruction(disassembled) + PROTECTED_PROC(TRUE) return /obj/machinery/proc/can_be_overridden() diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 03473ed5d394e..ba9667b3e5809 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -7,24 +7,24 @@ active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.5 circuit = /obj/item/circuitboard/machine/autolathe layer = BELOW_OBJ_LAYER + processing_flags = NONE + ///Is the autolathe hacked via wiring var/hacked = FALSE + ///Is the autolathe disabled via wiring var/disabled = FALSE + ///Did we recently shock a mob who medled with the wiring var/shocked = FALSE + ///Are we currently printing something var/busy = FALSE - - /// Coefficient applied to consumed materials. Lower values result in lower material consumption. + ///Coefficient applied to consumed materials. Lower values result in lower material consumption. var/creation_efficiency = 1.6 - - var/datum/design/being_built + ///Designs related to the autolathe var/datum/techweb/autounlocking/stored_research - ///Designs imported from technology disks that we can print. var/list/imported_designs = list() - ///The container to hold materials var/datum/component/material_container/materials - ///direction we output onto (if 0, on top of us) var/drop_direction = 0 @@ -43,17 +43,70 @@ GLOB.autounlock_techwebs[/datum/techweb/autounlocking/autolathe] = new /datum/techweb/autounlocking/autolathe stored_research = GLOB.autounlock_techwebs[/datum/techweb/autounlocking/autolathe] + register_context() + /obj/machinery/autolathe/Destroy() materials = null QDEL_NULL(wires) return ..() +/obj/machinery/autolathe/examine(mob/user) + . = ..() + if(!in_range(user, src) && !isobserver(user)) + return + + . += span_notice("Material usage cost at [creation_efficiency * 100]%") + if(drop_direction) + . += span_notice("Currently configured to drop printed objects [dir2text(drop_direction)].") + . += span_notice("[EXAMINE_HINT("Alt-click")] to reset.") + else + . += span_notice("[EXAMINE_HINT("Drag")] towards a direction (while next to it) to change drop direction.") + + . += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].") + if(panel_open) + . += span_notice("The machine can be [EXAMINE_HINT("pried")] apart.") + +/obj/machinery/autolathe/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(drop_direction) + context[SCREENTIP_CONTEXT_ALT_LMB] = "Reset Drop" + return CONTEXTUAL_SCREENTIP_SET + + if(isnull(held_item)) + return NONE + + if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_RMB] = "[panel_open ? "Close" : "Open"] Panel" + return CONTEXTUAL_SCREENTIP_SET + + if(panel_open && held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/autolathe/crowbar_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/autolathe/screwdriver_act_secondary(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", tool)) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/autolathe/proc/AfterMaterialInsert(container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context) + SIGNAL_HANDLER + + flick("autolathe_[item_inserted.has_material_type(/datum/material/glass) ? "r" : "o"]", src) + + //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it + directly_use_power(ROUND_UP((amount_inserted / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * 0.01 * initial(active_power_usage))) + /obj/machinery/autolathe/ui_interact(mob/user, datum/tgui/ui) if(!is_operational) return if(shocked && !(machine_stat & NOPOWER)) shock(user, 50) + return ui = SStgui.try_update_ui(user, src, ui) @@ -61,66 +114,40 @@ ui = new(user, src, "Autolathe") ui.open() -/obj/machinery/autolathe/ui_static_data(mob/user) - var/list/data = materials.ui_static_data() - - var/max_available = materials.total_amount() - for(var/datum/material/container_mat as anything in materials.materials) - var/available = materials.materials[container_mat] - if(available) - max_available = max(max_available, available) - - data["designs"] = handle_designs(stored_research.researched_designs, max_available) - if(imported_designs.len) - data["designs"] += handle_designs(imported_designs, max_available) - if(hacked) - data["designs"] += handle_designs(stored_research.hacked_designs, max_available) - - return data - -/obj/machinery/autolathe/ui_data(mob/user) - var/list/data = list() - - data["materials"] = list() - data["materialtotal"] = materials.total_amount() - data["materialsmax"] = materials.max_amount - data["active"] = busy - data["materials"] = materials.ui_data() - return data +/** + * Converts all the designs supported by this autolathe into UI data + * Arguments + * + * * list/designs - the list of techweb designs we are trying to send to the UI + */ +/obj/machinery/autolathe/proc/handle_designs(list/designs) + PRIVATE_PROC(TRUE) -/obj/machinery/autolathe/proc/handle_designs(list/designs, max_available) var/list/output = list() var/datum/asset/spritesheet/research_designs/spritesheet = get_asset_datum(/datum/asset/spritesheet/research_designs) var/size32x32 = "[spritesheet.name]32x32" - var/max_multiplier = INFINITY for(var/design_id in designs) var/datum/design/design = SSresearch.techweb_design_by_id(design_id) if(design.make_reagent) continue //compute cost & maximum number of printable items - max_multiplier = INFINITY var/coeff = (ispath(design.build_path, /obj/item/stack) ? 1 : creation_efficiency) var/list/cost = list() + var/customMaterials = FALSE for(var/i in design.materials) var/datum/material/mat = i var/design_cost = OPTIMAL_COST(design.materials[i] * coeff) if(istype(mat)) cost[mat.name] = design_cost + customMaterials = FALSE else cost[i] = design_cost - - var/mat_available - if(istype(mat)) //regular mat - mat_available = materials.get_material_amount(mat) - else //category mat means we can make it from any mat, use largest available mat - mat_available = max_available - - max_multiplier = min(max_multiplier, 50, round(mat_available / design_cost)) + customMaterials = TRUE //create & send ui data var/icon_size = spritesheet.icon_size_id(design.id) @@ -131,65 +158,87 @@ "id" = design.id, "categories" = design.category, "icon" = "[icon_size == size32x32 ? "" : "[icon_size] "][design.id]", - "constructionTime" = -1, - "maxmult" = max_multiplier + "customMaterials" = customMaterials ) output += list(design_data) return output +/obj/machinery/autolathe/ui_static_data(mob/user) + var/list/data = materials.ui_static_data() + + data["designs"] = handle_designs(stored_research.researched_designs) + if(imported_designs.len) + data["designs"] += handle_designs(imported_designs) + if(hacked) + data["designs"] += handle_designs(stored_research.hacked_designs) + + return data + + /obj/machinery/autolathe/ui_assets(mob/user) return list( get_asset_datum(/datum/asset/spritesheet/sheetmaterials), get_asset_datum(/datum/asset/spritesheet/research_designs), ) +/obj/machinery/autolathe/ui_data(mob/user) + var/list/data = list() + + data["materials"] = list() + data["materialtotal"] = materials.total_amount() + data["materialsmax"] = materials.max_amount + data["active"] = busy + data["materials"] = materials.ui_data() + + return data + /obj/machinery/autolathe/ui_act(action, list/params, datum/tgui/ui) . = ..() if(.) return + //sanity checks to start printing if(action != "make") stack_trace("unknown autolathe ui_act: [action]") return - if(disabled) say("Unable to print, voltage mismatch in internal wiring.") return - if(busy) - balloon_alert(ui.user, "busy!") - return - - var/turf/target_location = get_step(src, drop_direction) - if(isclosedturf(target_location)) - say("Output path is obstructed by a large object.") + say("currently printing.") return + //validate design var/design_id = params["id"] - + if(!design_id) + return var/valid_design = stored_research.researched_designs[design_id] valid_design ||= stored_research.hacked_designs[design_id] valid_design ||= imported_designs[design_id] if(!valid_design) return - var/datum/design/design = SSresearch.techweb_design_by_id(design_id) if(isnull(design)) stack_trace("got passed an invalid design id: [design_id] and somehow made it past all checks") return - if(!(design.build_type & AUTOLATHE)) + say("This fabricator does not have the necessary keys to decrypt this design.") return - var/build_count = text2num(params["multiplier"]) - if(!build_count) + //validate print quantity + var/build_count = params["multiplier"] + if(isnull(build_count)) + return + build_count = text2num(build_count) + if(isnull(build_count)) return build_count = clamp(build_count, 1, 50) + //check for materials required. For custom material items decode their required materials var/list/materials_needed = list() - for(var/datum/material/material as anything in design.materials) + for(var/material in design.materials) var/amount_needed = design.materials[material] if(istext(material)) // category var/list/choices = list() @@ -215,64 +264,70 @@ return materials_needed[material] = amount_needed + //checks for available materials var/material_cost_coefficient = ispath(design.build_path, /obj/item/stack) ? 1 : creation_efficiency if(!materials.has_materials(materials_needed, material_cost_coefficient, build_count)) say("Not enough materials to begin production.") return - //use power - var/total_charge = 0 + //compute power & time to print 1 item + var/charge_per_item = 0 for(var/material in design.materials) - total_charge += round(design.materials[material] * material_cost_coefficient * build_count) - var/charge_per_item = total_charge / build_count - - var/total_time = (design.construction_time * design.lathe_time_factor * build_count) ** 0.8 - var/time_per_item = total_time / build_count - start_making(design, build_count, time_per_item, material_cost_coefficient, charge_per_item) - return TRUE - -/// Begins the act of making the given design the given number of items -/// Does not check or use materials/power/etc -/obj/machinery/autolathe/proc/start_making(datum/design/design, build_count, build_time_per_item, material_cost_coefficient, charge_per_item) - PROTECTED_PROC(TRUE) + charge_per_item += design.materials[material] + charge_per_item = ROUND_UP((charge_per_item / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * material_cost_coefficient * 0.05 * active_power_usage) + var/build_time_per_item = (design.construction_time * design.lathe_time_factor) ** 0.8 + //do the printing sequentially busy = TRUE icon_state = "autolathe_n" - update_static_data_for_all_viewers() + SStgui.update_uis(src) + var/turf/target_location + if(drop_direction) + target_location = get_step(src, drop_direction) + if(isclosedturf(target_location)) + target_location = get_turf(src) + else + target_location = get_turf(src) + addtimer(CALLBACK(src, PROC_REF(do_make_item), design, build_count, build_time_per_item, material_cost_coefficient, charge_per_item, materials_needed, target_location), build_time_per_item) - addtimer(CALLBACK(src, PROC_REF(do_make_item), design, material_cost_coefficient, build_time_per_item, charge_per_item, build_count), build_time_per_item) + return TRUE -/// Callback for start_making, actually makes the item -/// Called using timers started by start_making -/obj/machinery/autolathe/proc/do_make_item(datum/design/design, material_cost_coefficient, time_per_item, charge_per_item, items_remaining) +/** + * Callback for start_making, actually makes the item + * Arguments + * + * * datum/design/design - the design we are trying to print + * * items_remaining - the number of designs left out to print + * * build_time_per_item - the time taken to print 1 item + * * material_cost_coefficient - the cost efficiency to print 1 design + * * charge_per_item - the amount of power to print 1 item + * * list/materials_needed - the list of materials to print 1 item + * * turf/target - the location to drop the printed item on +*/ +/obj/machinery/autolathe/proc/do_make_item(datum/design/design, items_remaining, build_time_per_item, material_cost_coefficient, charge_per_item, list/materials_needed, turf/target) PROTECTED_PROC(TRUE) - if(!items_remaining) // how + if(items_remaining <= 0) // how finalize_build() return - if(!directly_use_power(charge_per_item)) + if(!is_operational || !directly_use_power(charge_per_item)) say("Unable to continue production, power failure.") finalize_build() return - var/list/design_materials = design.materials var/is_stack = ispath(design.build_path, /obj/item/stack) - if(!materials.has_materials(design_materials, material_cost_coefficient, is_stack ? items_remaining : 1)) + if(!materials.has_materials(materials_needed, material_cost_coefficient, is_stack ? items_remaining : 1)) say("Unable to continue production, missing materials.") return - materials.use_materials(design_materials, material_cost_coefficient, is_stack ? items_remaining : 1) - - var/turf/target = get_step(src, drop_direction) - if(isclosedturf(target)) - target = get_turf(src) + materials.use_materials(materials_needed, material_cost_coefficient, is_stack ? items_remaining : 1) var/atom/movable/created if(is_stack) created = new design.build_path(target, items_remaining) else created = new design.build_path(target) - split_materials_uniformly(design_materials, material_cost_coefficient, created) + split_materials_uniformly(materials_needed, material_cost_coefficient, created) created.pixel_x = created.base_pixel_x + rand(-6, 6) created.pixel_y = created.base_pixel_y + rand(-6, 6) @@ -283,26 +338,44 @@ else items_remaining -= 1 - if(!items_remaining) + if(items_remaining <= 0) finalize_build() return - addtimer(CALLBACK(src, PROC_REF(do_make_item), design, material_cost_coefficient, time_per_item, items_remaining), time_per_item) + addtimer(CALLBACK(src, PROC_REF(do_make_item), design, items_remaining, build_time_per_item, material_cost_coefficient, charge_per_item, materials_needed, target), build_time_per_item) -/// Resets the icon state and busy flag -/// Called at the end of do_make_item's timer loop +/** + * Resets the icon state and busy flag + * Called at the end of do_make_item's timer loop +*/ /obj/machinery/autolathe/proc/finalize_build() PROTECTED_PROC(TRUE) + icon_state = initial(icon_state) busy = FALSE - update_static_data_for_all_viewers() + SStgui.update_uis(src) -/obj/machinery/autolathe/crowbar_act(mob/living/user, obj/item/tool) - if(default_deconstruction_crowbar(tool)) - return ITEM_INTERACT_SUCCESS +/obj/machinery/autolathe/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + . = ..() + if((!issilicon(usr) && !isAdminGhostAI(usr)) && !Adjacent(usr)) + return + if(busy) + balloon_alert(usr, "printing started!") + return + var/direction = get_dir(src, over_location) + if(!direction) + return + drop_direction = direction + balloon_alert(usr, "dropping [dir2text(drop_direction)]") -/obj/machinery/autolathe/screwdriver_act_secondary(mob/living/user, obj/item/tool) - if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", tool)) - return ITEM_INTERACT_SUCCESS +/obj/machinery/autolathe/AltClick(mob/user) + . = ..() + if(!drop_direction || !can_interact(user)) + return + if(busy) + balloon_alert(user, "busy printing!") + return + balloon_alert(user, "drop direction reset") + drop_direction = 0 /obj/machinery/autolathe/attackby(obj/item/attacking_item, mob/living/user, params) if(user.combat_mode) //so we can hit the machine @@ -346,25 +419,6 @@ return ..() -/obj/machinery/autolathe/proc/AfterMaterialInsert(container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context) - SIGNAL_HANDLER - - flick("autolathe_[item_inserted.has_material_type(/datum/material/glass) ? "r" : "o"]", src) - - use_power(min(active_power_usage * 0.25, amount_inserted / SHEET_MATERIAL_AMOUNT)) - - update_static_data_for_all_viewers() - -/obj/machinery/autolathe/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) - . = ..() - if((!issilicon(usr) && !isAdminGhostAI(usr)) && !Adjacent(usr)) - return - var/direction = get_dir(src, over_location) - if(!direction) - return - drop_direction = direction - balloon_alert(usr, "dropping [dir2text(drop_direction)]") - /obj/machinery/autolathe/RefreshParts() . = ..() var/mat_capacity = 0 @@ -377,24 +431,12 @@ efficiency -= new_servo.tier * 0.2 creation_efficiency = max(1,efficiency) // creation_efficiency goes 1.6 -> 1.4 -> 1.2 -> 1 per level of servo efficiency -/obj/machinery/autolathe/examine(mob/user) - . += ..() - if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Storing up to [materials.max_amount] material units.
Material consumption at [creation_efficiency*100]%.") - if(drop_direction) - . += span_notice("Currently configured to drop printed objects [dir2text(drop_direction)].") - . += span_notice("Alt-click to reset.") - else - . += span_notice("Drag towards a direction (while next to it) to change drop direction.") - -/obj/machinery/autolathe/AltClick(mob/user) - . = ..() - if(!can_interact(user)) - return - if(drop_direction) - balloon_alert(user, "drop direction reset") - drop_direction = 0 - +/** + * Cut a wire in the autolathe + * Arguments + * + * * wire - the wire we are trying to cut + */ /obj/machinery/autolathe/proc/reset(wire) switch(wire) if(WIRE_HACK) @@ -407,6 +449,13 @@ if(!wires.is_cut(wire)) disabled = FALSE +/** + * Shock a mob who is trying to interact with the autolathe + * Arguments + * + * * mob/user - the mob we are trying to shock + * * prb - the probability of getting shocked + */ /obj/machinery/autolathe/proc/shock(mob/user, prb) if(machine_stat & (BROKEN|NOPOWER)) // unpowered, no shock return FALSE @@ -417,6 +466,12 @@ s.start() return electrocute_mob(user, get_area(src), src, 0.7, TRUE) +/** + * Is the autolathe hacked. Allowing us to acess hidden designs + * Arguments + * + * state - TRUE/FALSE for is the autolathe hacked + */ /obj/machinery/autolathe/proc/adjust_hacked(state) hacked = state update_static_data_for_all_viewers() diff --git a/code/game/machinery/barsigns.dm b/code/game/machinery/barsigns.dm index 593a58d165c31..faa29c2673ef6 100644 --- a/code/game/machinery/barsigns.dm +++ b/code/game/machinery/barsigns.dm @@ -91,15 +91,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) if((machine_stat & BROKEN) && !(obj_flags & NO_DECONSTRUCTION)) set_sign(new /datum/barsign/hiddensigns/signoff) -/obj/machinery/barsign/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(disassembled) - new disassemble_result(drop_location()) - else - new /obj/item/stack/sheet/iron(drop_location(), 2) - new /obj/item/stack/cable_coil(drop_location(), 2) - - qdel(src) +/obj/machinery/barsign/on_deconstruction(disassembled) + if(disassembled) + new disassemble_result(drop_location()) + else + new /obj/item/stack/sheet/iron(drop_location(), 2) + new /obj/item/stack/cable_coil(drop_location(), 2) /obj/machinery/barsign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 3f7ee0674594a..257cce51ab84e 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -443,21 +443,20 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) triggerCameraAlarm() toggle_cam(null, 0) -/obj/machinery/camera/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(disassembled) - var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() - if(!assembly) - assembly = new() - assembly.forceMove(drop_location()) - assembly.state = 1 - assembly.setDir(dir) - assembly_ref = null - else - var/obj/item/I = new /obj/item/wallframe/camera (loc) - I.update_integrity(I.max_integrity * 0.5) - new /obj/item/stack/cable_coil(loc, 2) - qdel(src) +/obj/machinery/camera/on_deconstruction(disassembled) + if(disassembled) + var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() + if(!assembly) + assembly = new() + assembly.forceMove(drop_location()) + assembly.state = 1 + assembly.setDir(dir) + assembly_ref = null + return + + var/obj/item/I = new /obj/item/wallframe/camera (loc) + I.update_integrity(I.max_integrity * 0.5) + new /obj/item/stack/cable_coil(loc, 2) /obj/machinery/camera/update_icon_state() //TO-DO: Make panel open states, xray camera, and indicator lights overlays instead. var/xray_module diff --git a/code/game/machinery/camera/trackable.dm b/code/game/machinery/camera/trackable.dm index 884f38f750bc5..7155dc10e8e76 100644 --- a/code/game/machinery/camera/trackable.dm +++ b/code/game/machinery/camera/trackable.dm @@ -2,13 +2,13 @@ #define CAMERA_TICK_LIMIT 10 /datum/trackable - ///Boolean on whether or not we are currently trying to track something. - var/tracking = FALSE ///Reference to the atom that owns us, used for tracking. var/atom/tracking_holder - ///If there is a mob currently being tracked, this will be the weakref to it. - var/datum/weakref/tracked_mob + ///What mob are we currently tracking, if any + var/mob/living/tracked_mob + ///If we're currently rechecking our target's trackability in hopes of something changing + var/rechecking = FALSE ///How many times we've failed to locate our target. var/cameraticks = 0 @@ -24,7 +24,7 @@ /datum/trackable/New(atom/source) . = ..() tracking_holder = source - RegisterSignal(tracking_holder, COMSIG_MOB_RESET_PERSPECTIVE, PROC_REF(cancel_target_tracking)) + RegisterSignal(tracking_holder, COMSIG_MOB_RESET_PERSPECTIVE, PROC_REF(perspective_reset)) /datum/trackable/Destroy(force) tracking_holder = null @@ -32,27 +32,6 @@ STOP_PROCESSING(SSprocessing, src) return ..() -/datum/trackable/process() - var/mob/living/tracked_target = tracked_mob?.resolve() - if(!tracked_target || !tracking) - set_tracking(FALSE) - return - - if(tracked_target.can_track(tracking_holder)) - cameraticks = initial(cameraticks) - SEND_SIGNAL(tracking_holder, COMSIG_TRACKABLE_TRACKING_TARGET, tracked_target) - return - - if(cameraticks < CAMERA_TICK_LIMIT) - if(!cameraticks) - to_chat(tracking_holder, span_warning("Target is not near any active cameras. Attempting to reacquire...")) - cameraticks++ - return - - to_chat(tracking_holder, span_warning("Unable to reacquire, cancelling track...")) - cameraticks = initial(cameraticks) - set_tracking(FALSE) - ///Generates a list of trackable people by name, returning a list of Humans + Non-Humans that can be tracked. /datum/trackable/proc/find_trackable_mobs() RETURN_TYPE(/list) @@ -82,47 +61,140 @@ var/list/targets = sort_list(humans) + sort_list(others) return targets -///Toggles whether or not we're tracking something. Arg is whether it's on or off. -/datum/trackable/proc/set_tracking(on = FALSE) - if(on) +/// Takes a mob to track, resets our state and begins trying to follow it +/// Best we can at least +/datum/trackable/proc/set_tracked_mob(mob/living/track) + set_rechecking(FALSE) + if(tracked_mob) + UnregisterSignal(tracked_mob, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE)) + if(track && !isliving(track)) + tracked_mob = null + return + tracked_mob = track + if(tracked_mob) + RegisterSignal(tracked_mob, COMSIG_QDELETING, PROC_REF(target_deleted)) + RegisterSignal(tracked_mob, COMSIG_MOVABLE_MOVED, PROC_REF(target_moved)) + RegisterSignal(tracked_mob, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, PROC_REF(glide_size_changed)) + attempt_track() + +/datum/trackable/proc/target_deleted(datum/source) + SIGNAL_HANDLER + reset_tracking() + +/datum/trackable/proc/perspective_reset(atom/source) + SIGNAL_HANDLER + reset_tracking() + +/datum/trackable/proc/target_moved(datum/source) + SIGNAL_HANDLER + if(attempt_track()) + return + set_rechecking(TRUE) + +/// Controls if we're processing to recheck the conditions that prevent tracking or not +/datum/trackable/proc/set_rechecking(should_check) + if(should_check) START_PROCESSING(SSprocessing, src) - tracking = TRUE + cameraticks = initial(cameraticks) + rechecking = TRUE else STOP_PROCESSING(SSprocessing, src) - tracking = FALSE - tracked_mob = null + rechecking = FALSE + +/datum/trackable/process() + if(!rechecking) + return PROCESS_KILL + + if(attempt_track()) + set_rechecking(FALSE) + return + + if(cameraticks < CAMERA_TICK_LIMIT) + if(!cameraticks) + to_chat(tracking_holder, span_warning("Target is not near any active cameras. Attempting to reacquire...")) + cameraticks++ + return -///Called by Signals, used to cancel tracking of a target. -/datum/trackable/proc/cancel_target_tracking(atom/source) + to_chat(tracking_holder, span_warning("Unable to reacquire, cancelling track...")) + reset_tracking() + +/// Tries to track onto our target mob. Returns true if it succeeds, false otherwise +/datum/trackable/proc/attempt_track() + if(!tracked_mob) + reset_tracking() + return FALSE + + if(!tracked_mob.can_track(tracking_holder)) + return FALSE + // In case we've been checking + set_rechecking(FALSE) + SEND_SIGNAL(src, COMSIG_TRACKABLE_TRACKING_TARGET, tracked_mob) + return TRUE + +/datum/trackable/proc/glide_size_changed(datum/source, new_glide_size) SIGNAL_HANDLER - set_tracking(FALSE) + SEND_SIGNAL(src, COMSIG_TRACKABLE_GLIDE_CHANGED, tracked_mob, new_glide_size) /** - * set_tracked_mob + * reset_tracking * - * Sets a mob as being tracked, if a target is already provided then it will track that directly, - * otherwise it will give a tgui input list to find targets to track. + * Resets our tracking + */ +/datum/trackable/proc/reset_tracking() + set_tracked_mob(null) + +/** + * track_input + * + * Sets a mob as being tracked, will give a tgui input list to find targets to track. * Args: * tracker - The person trying to track, used for feedback messages. This is not the same as tracking_holder - * tracked_mob_name - (Optional) The person being tracked, to skip the input list. */ -/datum/trackable/proc/set_tracked_mob(mob/living/tracker, tracked_mob_name) +/datum/trackable/proc/track_input(mob/living/tracker) if(!tracker || tracker.stat == DEAD) return - if(tracked_mob_name) - find_trackable_mobs() //this is in case the tracked mob is newly/no-longer in camera field of view. - tracked_mob = isnull(humans[tracked_mob_name]) ? others[tracked_mob_name] : humans[tracked_mob_name] - if(isnull(tracked_mob)) - to_chat(tracker, span_notice("Target is not on or near any active cameras. Tracking failed.")) - return - to_chat(tracker, span_notice("Now tracking [tracked_mob_name] on camera.")) - else - var/target_name = tgui_input_list(tracker, "Select a target", "Tracking", find_trackable_mobs()) - if(!target_name || isnull(target_name)) - return - tracked_mob = isnull(humans[target_name]) ? others[target_name] : humans[target_name] + var/target_name = tgui_input_list(tracker, "Select a target", "Tracking", find_trackable_mobs()) + if(!target_name || isnull(target_name)) + return + var/datum/weakref/mob_ref = isnull(humans[target_name]) ? others[target_name] : humans[target_name] + if(isnull(mob_ref)) + to_chat(tracker, span_notice("Target is not on or near any active cameras. Tracking failed.")) + return + set_tracked_mob(mob_ref.resolve()) + +/** + * track_name + * + * Sets a mob as being tracked, will track the passed in target name's target + * Args: + * tracker - The person trying to track, used for feedback messages. This is not the same as tracking_holder + * tracked_mob_name - The person being tracked. + */ +/datum/trackable/proc/track_name(mob/living/tracker, tracked_mob_name) + if(!tracker || tracker.stat == DEAD) + return + + find_trackable_mobs() //this is in case the tracked mob is newly/no-longer in camera field of view. + var/datum/weakref/mob_ref = isnull(humans[tracked_mob_name]) ? others[tracked_mob_name] : humans[tracked_mob_name] + if(isnull(mob_ref)) + to_chat(tracker, span_notice("Target is not on or near any active cameras. Tracking failed.")) + return + to_chat(tracker, span_notice("Now tracking [tracked_mob_name] on camera.")) + set_tracked_mob(mob_ref.resolve()) - set_tracking(TRUE) +/** + * track_mob + * + * Sets a mob as being tracked, will track the passed in target + * Args: + * tracker - The person trying to track, used for feedback messages. This is not the same as tracking_holder + * tracked - The person being tracked. + */ +/datum/trackable/proc/track_mob(mob/living/tracker, mob/living/tracked) + if(!tracker || tracker.stat == DEAD) + return + // Need to make sure the tracked mob is in our list + track_name(tracker, tracked.name) #undef CAMERA_TICK_LIMIT diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index b217db9707ff8..7cc10dcb840a7 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -72,10 +72,9 @@ return return ..() -/obj/machinery/cell_charger/deconstruct() +/obj/machinery/cell_charger/on_deconstruction(disassembled) if(charging) charging.forceMove(drop_location()) - return ..() /obj/machinery/cell_charger/Destroy() QDEL_NULL(charging) diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index d9cc62c642050..36480be6e90db 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -64,9 +64,9 @@ if(..()) return TRUE if(circuit && !(obj_flags & NO_DECONSTRUCTION)) - to_chat(user, span_notice("You start to disconnect the monitor...")) + balloon_alert(user, "disconnecting monitor...") if(I.use_tool(src, user, time_to_unscrew, volume=50)) - deconstruct(TRUE, user) + deconstruct(TRUE) return TRUE /obj/machinery/computer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) @@ -98,33 +98,25 @@ if(prob(10)) atom_break(ENERGY) -/obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user) - on_deconstruction() - if(!(obj_flags & NO_DECONSTRUCTION)) - if(circuit) //no circuit, no computer frame - var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc) - A.setDir(dir) - A.circuit = circuit - // Circuit removal code is handled in /obj/machinery/Exited() - circuit.forceMove(A) - A.set_anchored(TRUE) - if(machine_stat & BROKEN) - if(user) - to_chat(user, span_notice("The broken glass falls out.")) - else - playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, TRUE) - new /obj/item/shard(drop_location()) - new /obj/item/shard(drop_location()) - A.state = 3 - A.icon_state = "3" - else - if(user) - to_chat(user, span_notice("You disconnect the monitor.")) - A.state = 4 - A.icon_state = "4" - for(var/obj/C in src) - C.forceMove(loc) - qdel(src) +/obj/machinery/computer/spawn_frame(disassembled) + if(QDELETED(circuit)) //no circuit, no computer frame + return + + var/obj/structure/frame/computer/new_frame = new(loc) + new_frame.setDir(dir) + new_frame.set_anchored(TRUE) + new_frame.circuit = circuit + // Circuit removal code is handled in /obj/machinery/Exited() + circuit.forceMove(new_frame) + if((machine_stat & BROKEN) || !disassembled) + var/atom/drop_loc = drop_location() + playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, TRUE) + new /obj/item/shard(drop_loc) + new /obj/item/shard(drop_loc) + new_frame.state = FRAME_COMPUTER_STATE_WIRED + else + new_frame.state = FRAME_COMPUTER_STATE_GLASSED + new_frame.update_appearance(UPDATE_ICON_STATE) /obj/machinery/computer/AltClick(mob/user) . = ..() diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 2ddbb3baadd31..74632b926b131 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -138,6 +138,6 @@ QDEL_NULL(occupier) return ..() -/obj/machinery/computer/aifixer/on_deconstruction() +/obj/machinery/computer/aifixer/on_deconstruction(disassembled) if(occupier) QDEL_NULL(occupier) diff --git a/code/game/machinery/computer/arcade/arcade.dm b/code/game/machinery/computer/arcade/arcade.dm index b9e8bd9d1e9e4..91a10673dd6dd 100644 --- a/code/game/machinery/computer/arcade/arcade.dm +++ b/code/game/machinery/computer/arcade/arcade.dm @@ -71,8 +71,9 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/item/storage/box/party_poppers = 2)) /obj/machinery/computer/arcade - name = "random arcade" - desc = "random arcade machine" + name = "\proper the arcade cabinet which shouldn't exist" + desc = "This arcade cabinet has no games installed, and in fact, should not exist. \ + Report the location of this machine to your local diety." icon_state = "arcade" icon_keyboard = null icon_screen = "invaders" @@ -136,19 +137,21 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( new empprize(loc) explosion(src, devastation_range = -1, light_impact_range = 1+num_of_prizes, flame_range = 1+num_of_prizes) -/obj/machinery/computer/arcade/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/stack/arcadeticket)) - var/obj/item/stack/arcadeticket/T = O - var/amount = T.get_amount() - if(amount <2) - to_chat(user, span_warning("You need 2 tickets to claim a prize!")) - return - prizevend(user) - T.pay_tickets() - T.update_appearance() - O = T - to_chat(user, span_notice("You turn in 2 tickets to the [src] and claim a prize!")) - return +/obj/machinery/computer/arcade/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + if(!istype(tool, /obj/item/stack/arcadeticket)) + return . + + var/obj/item/stack/arcadeticket/tickets = tool + if(!tickets.use(2)) + balloon_alert(user, "need 2 tickets!") + return ITEM_INTERACT_BLOCKING + + prizevend(user) + balloon_alert(user, "prize claimed") + return ITEM_INTERACT_SUCCESS // ** BATTLE ** // /obj/machinery/computer/arcade/battle diff --git a/code/game/machinery/computer/arena.dm b/code/game/machinery/computer/arena.dm deleted file mode 100644 index 97d89c2414076..0000000000000 --- a/code/game/machinery/computer/arena.dm +++ /dev/null @@ -1,411 +0,0 @@ -#define ARENA_RED_TEAM "red" -#define ARENA_GREEN_TEAM "green" -#define ARENA_DEFAULT_ID "arena_default" -#define ARENA_CORNER_A "cornerA" -#define ARENA_CORNER_B "cornerB" - -/// Arena related landmarks -/obj/effect/landmark/arena - name = "arena landmark" - var/landmark_tag - var/arena_id = ARENA_DEFAULT_ID - -/obj/effect/landmark/arena/start - name = "arena corner A" - landmark_tag = ARENA_CORNER_A - -/obj/effect/landmark/arena/end - name = "arena corner B" - landmark_tag = ARENA_CORNER_B - -/// Controller for admin event arenas -/obj/machinery/computer/arena - name = "arena controller" - - interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_SET_MACHINE|INTERACT_MACHINE_REQUIRES_LITERACY - - /// Arena ID - var/arena_id = ARENA_DEFAULT_ID - /// Enables/disables spawning - var/ready_to_spawn = FALSE - /// Assoc list of map templates indexed by user friendly names - var/static/list/arena_templates = list() - /// Were the config directory arenas loaded - var/static/default_arenas_loaded = FALSE - /// Name of currently loaded template - var/current_arena_template = "None" - // What turf arena clears to - var/empty_turf_type = /turf/open/indestructible - // List of team ids - var/list/teams = list(ARENA_RED_TEAM,ARENA_GREEN_TEAM) - /// List of hud instances indedxed by team id - var/static/list/team_huds = list() - /// List of hud colors indexed by team id - var/static/list/team_colors = list(ARENA_RED_TEAM = "red", ARENA_GREEN_TEAM = "green") - // Team hud index in GLOB.huds indexed by team id - var/static/list/team_hud_index = list() - - /// List of ckeys indexed by team id - var/list/team_keys = list() - /// List of outfit datums/types indexed by team id, can be empty - var/list/outfits = list() - /// Default team outfit if `outfits[team]` is empty - var/default_outfit = /datum/outfit/job/assistant - - /// Is the arena template loading in - var/loading = FALSE - - //How long between admin pressing start and doors opening - var/start_delay = 30 SECONDS - //Value for the countdown - var/start_time - var/list/countdowns = list() //List of countdown effects ticking down to start - - //Sound played when the fight starts. - var/start_sound = 'sound/items/airhorn2.ogg' - var/start_sound_volume = 50 - -/obj/machinery/computer/arena/Initialize(mapload, obj/item/circuitboard/C) - . = ..() - LoadDefaultArenas() - -/** - * Loads the arenas from config directory. - * THESE ARE FULLY CACHED FOR QUICK SWITCHING SO KEEP TRACK OF THE AMOUNT - */ -/obj/machinery/computer/arena/proc/LoadDefaultArenas() - if(default_arenas_loaded) - return - var/arena_dir = "[global.config.directory]/arenas/" - var/list/default_arenas = flist(arena_dir) - for(var/arena_file in default_arenas) - var/simple_name = replacetext(replacetext(arena_file,arena_dir,""),".dmm","") - INVOKE_ASYNC(src, PROC_REF(add_new_arena_template), null, arena_dir + arena_file, simple_name) - -/obj/machinery/computer/arena/proc/get_landmark_turf(landmark_tag) - for(var/obj/effect/landmark/arena/L in GLOB.landmarks_list) - if(L.arena_id == arena_id && L.landmark_tag == landmark_tag && isturf(L.loc)) - return L.loc - -/obj/machinery/computer/arena/proc/get_load_point() - var/turf/A = get_landmark_turf(ARENA_CORNER_A) - var/turf/B = get_landmark_turf(ARENA_CORNER_B) - return locate(min(A.x,B.x),min(A.y,B.y),A.z) - -/obj/machinery/computer/arena/proc/get_arena_turfs() - var/lp = get_load_point() - var/turf/A = get_landmark_turf(ARENA_CORNER_A) - var/turf/B = get_landmark_turf(ARENA_CORNER_B) - var/turf/hp = locate(max(A.x,B.x),max(A.y,B.y),A.z) - return block(lp,hp) - -/obj/machinery/computer/arena/proc/clear_arena() - for(var/turf/T in get_arena_turfs()) - T.empty(turf_type = /turf/open/indestructible) - current_arena_template = "None" - -/obj/machinery/computer/arena/proc/load_arena(arena_template,mob/user) - if(loading) - return - var/datum/map_template/M = arena_templates[arena_template] - if(!M) - to_chat(user,span_warning("No such arena")) - return - clear_arena() //Clear current arena - var/turf/A = get_landmark_turf(ARENA_CORNER_A) - var/turf/B = get_landmark_turf(ARENA_CORNER_B) - var/wh = abs(A.x - B.x) + 1 - var/hz = abs(A.y - B.y) + 1 - if(M.width > wh || M.height > hz) - to_chat(user,span_warning("Arena template is too big for the current arena!")) - return - loading = TRUE - var/bd = M.load(get_load_point()) - if(bd) - current_arena_template = arena_template - loading = FALSE - - message_admins("[key_name_admin(user)] loaded [arena_template] event arena for [arena_id] arena.") - log_admin("[key_name(user)] loaded [arena_template] event arena for [arena_id] arena.") - - - -/obj/machinery/computer/arena/proc/add_new_arena_template(user,fname,friendly_name) - if(!fname) - fname = input(user, "Upload dmm file to use as arena template","Upload Map Template") as null|file - if(!fname) - return - if(!friendly_name) - friendly_name = "[fname]" //Could ask the user for friendly name here - - var/datum/map_template/T = new(fname,friendly_name,TRUE) - if(!T.cached_map || T.cached_map.check_for_errors()) - to_chat(user,"Map failed to parse check for errors.") - return - - arena_templates[T.name] = T - message_admins("[key_name_admin(user)] uploaded new event arena: [friendly_name].") - log_admin("[key_name(user)] uploaded new event arena: [friendly_name].") - -/obj/machinery/computer/arena/proc/load_team(user,team) - var/rawteam = tgui_input_text(user, "Enter team member list (ckeys separated by comma)", "Team List", multiline = TRUE) - if(isnull(rawteam)) - return - for(var/i in splittext(rawteam, ",")) - var/key = ckey(i) - if(!i) - continue - add_team_member(user,team,key) - -/obj/machinery/computer/arena/proc/add_team_member(mob/user,team,key) - if(!key) - var/list/keys = list() - for(var/mob/M in GLOB.player_list) - keys += M.client - var/client/selection = tgui_input_list(user, "Select a player", "Team member", sort_key(keys)) - //Could be freeform if you want to add disconnected i guess - if(isnull(selection)) - return - key = selection.ckey - if(!team_keys[team]) - team_keys[team] = list(key) - else - team_keys[team] |= key - to_chat(user,"[key] added to [team] team.") - -/obj/machinery/computer/arena/proc/remove_member(mob/user,ckey,team) - team_keys[team] -= ckey - to_chat(user,"[ckey] removed from [team] team.") - -/obj/machinery/computer/arena/proc/spawn_member(obj/machinery/arena_spawn/spawnpoint,ckey,team) - var/mob/oldbody = get_mob_by_key(ckey) - if(!isobserver(oldbody)) - return - var/mob/living/carbon/human/M = new/mob/living/carbon/human(get_turf(spawnpoint)) - oldbody.client.prefs.safe_transfer_prefs_to(M, is_antag = TRUE) - M.set_species(/datum/species/human) // Could use setting per team - M.equipOutfit(outfits[team] ? outfits[team] : default_outfit) - M.faction += team //In case anyone wants to add team based stuff to arena special effects - M.key = ckey - -/obj/machinery/computer/arena/proc/change_outfit(mob/user,team) - outfits[team] = user.client.robust_dress_shop() - -/obj/machinery/computer/arena/proc/toggle_spawn(mob/user) - ready_to_spawn = !ready_to_spawn - to_chat(user,"You [ready_to_spawn ? "enable" : "disable"] the spawners.") - log_admin("[key_name(user)] toggled event arena spawning for [arena_id] arena.") - // Could use update_appearance on spawnpoints here to show they're on - if(ready_to_spawn) - for(var/mob/M in all_contestants()) - to_chat(M,span_userdanger("Arena you're signed up for is ready!")) - -/obj/machinery/computer/arena/proc/all_contestants() - . = list() - for(var/team in team_keys) - for(var/key in team_keys[team]) - var/mob/M = get_mob_by_key(key) - if(M) - . += M - -/obj/machinery/computer/arena/proc/reset_arena() - clear_arena() - set_doors(closed = TRUE) - -/obj/machinery/computer/arena/proc/get_spawn(team) - for(var/obj/machinery/arena_spawn/A as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/arena_spawn)) - if(A.arena_id == arena_id && A.team == team) - return A - -/obj/machinery/computer/arena/proc/start_match(mob/user) - //TODO: Check if everyone is spawned in, if not ask for confirmation. - var/timetext = DisplayTimeText(start_delay) - to_chat(user,span_notice("The match will start in [timetext].")) - for(var/mob/M in all_contestants()) - to_chat(M,span_userdanger("The gates will open in [timetext]!")) - start_time = world.time + start_delay - addtimer(CALLBACK(src, PROC_REF(begin)),start_delay) - for(var/team in teams) - var/obj/machinery/arena_spawn/team_spawn = get_spawn(team) - var/obj/effect/countdown/arena/A = new(team_spawn) - A.start() - countdowns += A - -/obj/machinery/computer/arena/proc/begin() - ready_to_spawn = FALSE - set_doors(closed = FALSE) - if(start_sound) - for(var/team in teams) - var/obj/machinery/arena_spawn/A = get_spawn(team) - playsound(A,start_sound, start_sound_volume) - for(var/mob/M in all_contestants()) - to_chat(M,span_userdanger("START!")) - //Clean up the countdowns - QDEL_LIST(countdowns) - start_time = null - updateUsrDialog() - - -/obj/machinery/computer/arena/proc/set_doors(closed = FALSE) - for(var/obj/machinery/door/poddoor/D as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/poddoor)) - if(D.id != arena_id) - continue - if(closed) - INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/machinery/door/poddoor, close)) - else - INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/machinery/door/poddoor, open)) - -/obj/machinery/computer/arena/Topic(href, href_list) - if(..()) - return - var/mob/user = usr - - if(!user.client.holder) // Should it require specific perm ? - return - - if(href_list["upload"]) - add_new_arena_template(user) - if(href_list["change_arena"]) - load_arena(href_list["change_arena"],user) - if(href_list["toggle_spawn"]) - toggle_spawn(user) - if(href_list["start"]) - start_match(user) - if(href_list["follow"]) - var/mob/observed_team_member = locate(href_list["follow"]) in GLOB.mob_list - if(observed_team_member) - user.client?.admin_follow(observed_team_member) - if(href_list["team_action"]) - var/team = href_list["team"] - switch(href_list["team_action"]) - if("addmember") - add_team_member(user,team) - if("loadteam") - load_team(user,team) - if("outfit") - change_outfit(user,team) - if(href_list["special"]) - switch(href_list["special"]) - if("reset") - reset_arena() - //Just example in case you want to add more - if("randomarena") - load_random_arena(user) - if("spawntrophy") - trophy_for_last_man_standing(user) - if(href_list["member_action"]) - var/ckey = href_list["ckey"] - var/team = href_list["team"] - switch(href_list["member_action"]) - if("remove") - remove_member(user,ckey,team) - updateUsrDialog() - -// Special functions - -/obj/machinery/computer/arena/proc/load_random_arena(mob/user) - if(!length(arena_templates)) - to_chat(user,span_warning("No arenas present")) - return - var/picked = pick(arena_templates) - load_arena(picked,user) - -/obj/machinery/computer/arena/proc/trophy_for_last_man_standing() - var/arena_turfs = get_arena_turfs() - for(var/mob/living/L in GLOB.mob_living_list) - if(L.stat != DEAD && (get_turf(L) in arena_turfs)) - var/obj/item/reagent_containers/cup/glass/trophy/gold_cup/G = new(get_turf(L)) - G.name = "[L.real_name]'s Trophy" - -/obj/machinery/computer/arena/ui_interact(mob/user) - . = ..() - var/list/dat = list() - dat += "
Spawning is currently [ready_to_spawn ? "enabled" : "disabled"] Toggle
" - dat += "
[start_time ? "Stop countdown" : "Start!"]
" - for(var/team in teams) - dat += "

[capitalize(team)] team:

" - dat += "" - dat += "
Team Outfit : [outfits[team] ? outfits[team] : default_outfit]
" - dat += "Load team" - dat += "Add member" - dat += "Change Outfit" - //Add more per team features here - - dat += "Current arena: [current_arena_template]" - dat += "

Arena List:

" - for(var/A in arena_templates) - dat += "[A]
" - dat += "
" - dat += "Upload new arena
" - dat += "
" - //Special actions - dat += "Reset Arena.
" - dat += "Load random arena.
" - dat += "Spawn trophies for survivors.
" - - var/datum/browser/popup = new(user, "arena controller", "Arena Controller", 500, 600) - popup.set_content(dat.Join()) - popup.open() - -/// Arena spawnpoint -/obj/machinery/arena_spawn - name = "Arena Spawnpoint" - icon = 'icons/obj/machines/beacon.dmi' - icon_state = "syndbeacon" - resistance_flags = INDESTRUCTIBLE - /// In case we have multiple arena controllers at once. - var/arena_id = ARENA_DEFAULT_ID - /// Team ID - var/team = "default" - /// only exist to cut down on glob.machines lookups, do not modify - var/obj/machinery/computer/arena/_controller - -/obj/machinery/arena_spawn/red - name = "Red Team Spawnpoint" - color = "red" - team = ARENA_RED_TEAM - -/obj/machinery/arena_spawn/green - name = "Green Team Spawnpoint" - color = "green" - team = ARENA_GREEN_TEAM - -/obj/machinery/arena_spawn/proc/get_controller() - if(_controller && !QDELETED(_controller) && _controller.arena_id == arena_id) - return _controller - for(var/obj/machinery/computer/arena/A as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/arena)) - if(A.arena_id == arena_id) - _controller = A - return _controller - -/obj/machinery/arena_spawn/attack_ghost(mob/user) - var/obj/machinery/computer/arena/C = get_controller() - if(!C) //Unlinked spawn - return - if(C.ready_to_spawn) - var/list/allowed_keys = C.team_keys[team] - if(!(user.ckey in allowed_keys)) - to_chat(user,span_warning("You're not on the team list.")) - return - C.spawn_member(src,user.ckey,team) - -#undef ARENA_GREEN_TEAM -#undef ARENA_RED_TEAM -#undef ARENA_DEFAULT_ID -#undef ARENA_CORNER_A -#undef ARENA_CORNER_B diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 907548d0028ff..ea2fbb3eb8eda 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -2,252 +2,345 @@ name = "computer frame" desc = "A frame for constructing your own computer. Or console. Whichever name you prefer." icon_state = "0" - state = 0 + base_icon_state = "" + state = FRAME_COMPUTER_STATE_EMPTY + board_type = /obj/item/circuitboard/computer /obj/structure/frame/computer/Initialize(mapload) . = ..() AddComponent(/datum/component/simple_rotation) + register_context() + update_appearance(UPDATE_ICON_STATE) -/// Installs the board in the computer -/obj/structure/frame/computer/proc/install_board(obj/item/circuitboard/computer/board, mob/user, by_hand) - if(by_hand && !user.transferItemToLoc(board, src)) - return FALSE - else if(!board.forceMove(src)) - return FALSE +/obj/structure/frame/computer/deconstruct(disassembled = TRUE) + if(!(obj_flags & NO_DECONSTRUCTION)) + var/atom/drop_loc = drop_location() + if(state == FRAME_COMPUTER_STATE_GLASSED) + if(disassembled) + new /obj/item/stack/sheet/glass(drop_loc, 2) + else + new /obj/item/shard(drop_loc) + new /obj/item/shard(drop_loc) + if(state >= FRAME_COMPUTER_STATE_WIRED) + new /obj/item/stack/cable_coil(drop_loc, 5) - playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - to_chat(user, span_notice("You place [board] inside the frame.")) - icon_state = "1" - circuit = board - circuit.add_fingerprint(user) + return ..() - return TRUE +/obj/structure/frame/computer/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = NONE + if(isnull(held_item)) + return -/obj/structure/frame/computer/attackby(obj/item/P, mob/living/user, params) - add_fingerprint(user) switch(state) - if(0) - if(P.tool_behaviour == TOOL_WRENCH) - to_chat(user, span_notice("You start wrenching the frame into place...")) - if(P.use_tool(src, user, 20, volume=50)) - to_chat(user, span_notice("You wrench the frame into place.")) - set_anchored(TRUE) - state = 1 - return - if(P.tool_behaviour == TOOL_WELDER) - if(!P.tool_start_check(user, amount=1)) - return - - to_chat(user, span_notice("You start deconstructing the frame...")) - if(P.use_tool(src, user, 20, volume=50)) - to_chat(user, span_notice("You deconstruct the frame.")) - var/obj/item/stack/sheet/iron/M = new (drop_location(), 5) - if (!QDELETED(M)) - M.add_fingerprint(user) - qdel(src) - return - if(1) - if(P.tool_behaviour == TOOL_WRENCH) - to_chat(user, span_notice("You start to unfasten the frame...")) - if(P.use_tool(src, user, 20, volume=50)) - to_chat(user, span_notice("You unfasten the frame.")) - set_anchored(FALSE) - state = 0 - return - - if(!circuit) - //attempt to install circuitboard from part replacer - if(istype(P, /obj/item/storage/part_replacer) && P.contents.len) - var/obj/item/storage/part_replacer/replacer = P - // map of circuitboard names to the board - var/list/circuit_boards = list() - for(var/obj/item/circuitboard/computer/board in replacer.contents) - circuit_boards[board.name] = board - if(!length(circuit_boards)) - return - //if there is only one board directly install it else pick from list - var/obj/item/circuitboard/computer/target_board - if(circuit_boards.len == 1) - for(var/board_name in circuit_boards) - target_board = circuit_boards[board_name] - else - var/option = tgui_input_list(user, "Select Circuitboard To Install"," Available Boards", circuit_boards) - target_board = circuit_boards[option] - if(!target_board) - return - - if(install_board(target_board, user, by_hand = FALSE)) - replacer.play_rped_sound() - //automatically screw the board in as well, a perk of using the rped - to_chat(user, span_notice("You screw [circuit] into place.")) - state = 2 - icon_state = "2" - //attack again so we can install the cable & glass - attackby(replacer, user, params) - return - - //attempt to install circuitboard by hand - if(istype(P, /obj/item/circuitboard/computer)) - install_board(P, user, by_hand = TRUE) - return - else if(istype(P, /obj/item/circuitboard)) - to_chat(user, span_warning("This frame does not accept circuit boards of this type!")) - return - else - if(P.tool_behaviour == TOOL_SCREWDRIVER) - P.play_tool_sound(src) - to_chat(user, span_notice("You screw [circuit] into place.")) - state = 2 - icon_state = "2" - return - if(P.tool_behaviour == TOOL_CROWBAR) - P.play_tool_sound(src) - to_chat(user, span_notice("You remove [circuit].")) - state = 1 - icon_state = "0" - circuit.forceMove(drop_location()) - circuit.add_fingerprint(user) - circuit = null - return - if(2) - if(P.tool_behaviour == TOOL_SCREWDRIVER && circuit) - P.play_tool_sound(src) - to_chat(user, span_notice("You unfasten the circuit board.")) - state = 1 - icon_state = "1" - else - //serach for cable which can either be the attacking item or inside an rped - var/obj/item/stack/cable_coil/cable = null - if(istype(P, /obj/item/stack/cable_coil)) - cable = P - else if(istype(P, /obj/item/storage/part_replacer)) - cable = locate(/obj/item/stack/cable_coil) in P.contents - if(!cable) - return - - //install cable - if(!cable.tool_start_check(user, amount = 5)) - return - to_chat(user, span_notice("You start adding cables to the frame...")) - if(cable.use_tool(src, user, istype(P, /obj/item/storage/part_replacer) ? 0 : 20, volume = 50, amount = 5)) - if(state != 2) - return - to_chat(user, span_notice("You add cables to the frame.")) - state = 3 - icon_state = "3" - - //if the item was an rped then it could have glass sheets for the next stage so let it continue - if(istype(P, /obj/item/storage/part_replacer)) - var/obj/item/storage/part_replacer/replacer = P + if(FRAME_COMPUTER_STATE_EMPTY) + if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]anchor" + return CONTEXTUAL_SCREENTIP_SET + else if(anchored && istype(held_item, /obj/item/circuitboard/computer)) + context[SCREENTIP_CONTEXT_LMB] = "Install board" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_WELDER) + context[SCREENTIP_CONTEXT_LMB] = "Unweld frame" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "Disassemble frame" + return CONTEXTUAL_SCREENTIP_SET + if(FRAME_COMPUTER_STATE_BOARD_INSTALLED) + if(held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Pry out board" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "Secure board" + return CONTEXTUAL_SCREENTIP_SET + if(FRAME_COMPUTER_STATE_BOARD_SECURED) + if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "Unsecure board" + return CONTEXTUAL_SCREENTIP_SET + else if(istype(held_item, /obj/item/stack/cable_coil)) + context[SCREENTIP_CONTEXT_LMB] = "Install cable" + return CONTEXTUAL_SCREENTIP_SET + if(FRAME_COMPUTER_STATE_WIRED) + if(held_item.tool_behaviour == TOOL_WIRECUTTER) + context[SCREENTIP_CONTEXT_LMB] = "Cut out cable" + return CONTEXTUAL_SCREENTIP_SET + else if(istype(held_item, /obj/item/stack/sheet/glass)) + context[SCREENTIP_CONTEXT_LMB] = "Install panel" + return CONTEXTUAL_SCREENTIP_SET + if(FRAME_COMPUTER_STATE_GLASSED) + if(held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Pry out glass" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "Complete frame" + return CONTEXTUAL_SCREENTIP_SET + +/obj/structure/frame/computer/examine(user) + . = ..() + + switch(state) + if(FRAME_STATE_EMPTY) + . += span_notice("It can be [EXAMINE_HINT("wrenched")] [anchored ? "loose" : "in place"].") + if(anchored) + . += span_warning("It's missing a circuit board.") + . += span_notice("It can be [EXAMINE_HINT("welded")] or [EXAMINE_HINT("screwed")] apart.") + if(FRAME_COMPUTER_STATE_BOARD_INSTALLED) + . += span_warning("An [circuit.name] is installed and should be [EXAMINE_HINT("screwed")] in place.") + . += span_notice("The circuit board can be [EXAMINE_HINT("pried")] out.") + if(FRAME_COMPUTER_STATE_BOARD_SECURED) + . += span_warning("Its requires [EXAMINE_HINT("5 cable")] pieces to wire it.") + . += span_notice("The circuit board can be [EXAMINE_HINT("screwed")] loose.") + if(FRAME_COMPUTER_STATE_WIRED) + . += span_notice("The wires can be cut out with [EXAMINE_HINT("wire cutters")].") + . += span_warning("Its requires [EXAMINE_HINT("2 glass")] sheets to complete the screen.") + if(FRAME_COMPUTER_STATE_GLASSED) + . += span_notice("The screen can be [EXAMINE_HINT("pried")] out.") + . += span_notice("The moniter can be [EXAMINE_HINT("screwed")] to complete it") + +/obj/structure/frame/computer/circuit_added(obj/item/circuitboard/added) + state = FRAME_COMPUTER_STATE_BOARD_INSTALLED + update_appearance(UPDATE_ICON_STATE) + +/obj/structure/frame/computer/circuit_removed(obj/item/circuitboard/removed) + state = FRAME_COMPUTER_STATE_EMPTY + update_appearance(UPDATE_ICON_STATE) + +/obj/structure/frame/computer/install_board(mob/living/user, obj/item/circuitboard/computer/board, by_hand) + if(state != FRAME_COMPUTER_STATE_EMPTY) + balloon_alert(user, "circuit already installed!") + return FALSE + if(!anchored && istype(board)) + balloon_alert(user, "frame must be anchored!") + return FALSE + . = ..() + if(. && !by_hand) // Installing via RPED auto-secures it + state = FRAME_COMPUTER_STATE_BOARD_SECURED + update_appearance(UPDATE_ICON_STATE) + return . + +/obj/structure/frame/computer/install_parts_from_part_replacer(mob/living/user, obj/item/storage/part_replacer/replacer, no_sound = FALSE) + switch(state) + if(FRAME_COMPUTER_STATE_BOARD_SECURED) + var/obj/item/stack/cable_coil/cable = locate() in replacer + if(isnull(cable)) + return FALSE + + if(add_cabling(user, cable, time = 0)) + if(!no_sound) replacer.play_rped_sound() - //reattack to install the glass sheets as well - attackby(replacer, user, params) - return - if(3) - if(P.tool_behaviour == TOOL_WIRECUTTER) - P.play_tool_sound(src) - to_chat(user, span_notice("You remove the cables.")) - state = 2 - icon_state = "2" - var/obj/item/stack/cable_coil/A = new (drop_location(), 5) - if (!QDELETED(A)) - A.add_fingerprint(user) - else - //search for glass sheets which can either be the attacking item or inside an rped - var/obj/item/stack/sheet/glass/glass_sheets = null - if(istype(P, /obj/item/stack/sheet/glass)) - glass_sheets = P - else if(istype(P, /obj/item/storage/part_replacer)) - glass_sheets = locate(/obj/item/stack/sheet/glass) in P.contents - if(!glass_sheets) - return - - //install glass sheets - if(!glass_sheets.tool_start_check(user, amount = 2)) - return - playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - to_chat(user, span_notice("You start to put in the glass panel...")) - if(glass_sheets.use_tool(src, user, istype(P, /obj/item/storage/part_replacer) ? 0 : 20, amount = 2)) - if(state != 3) - return - to_chat(user, span_notice("You put in the glass panel.")) - state = 4 - icon_state = "4" - - if(istype(P, /obj/item/storage/part_replacer)) - var/obj/item/storage/part_replacer/replacer = P + if(replacer.works_from_distance) + user.Beam(src, icon_state = "rped_upgrade", time = 0.5 SECONDS) + no_sound = TRUE + return install_parts_from_part_replacer(user, replacer, no_sound = no_sound) // Recursive call to handle the next part + + return FALSE + + if(FRAME_COMPUTER_STATE_WIRED) + var/obj/item/stack/sheet/glass/glass_sheets = locate() in replacer + if(isnull(glass_sheets)) + return FALSE + + if(add_glass(user, glass_sheets, time = 0)) + if(!no_sound) replacer.play_rped_sound() - return - if(4) - if(P.tool_behaviour == TOOL_CROWBAR) - P.play_tool_sound(src) - to_chat(user, span_notice("You remove the glass panel.")) - state = 3 - icon_state = "3" - var/obj/item/stack/sheet/glass/G = new(drop_location(), 2) - if (!QDELETED(G)) - G.add_fingerprint(user) - return - if(P.tool_behaviour == TOOL_SCREWDRIVER) - P.play_tool_sound(src) - to_chat(user, span_notice("You connect the monitor.")) - - var/obj/machinery/new_machine = new circuit.build_path(loc) - new_machine.setDir(dir) - transfer_fingerprints_to(new_machine) - - if(istype(new_machine, /obj/machinery/computer)) - var/obj/machinery/computer/new_computer = new_machine - - new_machine.clear_components() - - // Set anchor state and move the frame's parts over to the new machine. - // Then refresh parts and call on_construction(). - new_computer.set_anchored(anchored) - new_computer.component_parts = list() - - circuit.forceMove(new_computer) - new_computer.component_parts += circuit - new_computer.circuit = circuit - - for(var/new_part in src) - var/atom/movable/movable_part = new_part - movable_part.forceMove(new_computer) - new_computer.component_parts += movable_part - - new_computer.RefreshParts() - new_computer.on_construction(user) - - qdel(src) - return + if(replacer.works_from_distance) + user.Beam(src, icon_state = "rped_upgrade", time = 0.5 SECONDS) + return TRUE + + return FALSE + +/obj/structure/frame/computer/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + + switch(state) + if(FRAME_COMPUTER_STATE_EMPTY) + if(istype(tool, /obj/item/storage/part_replacer)) + return install_circuit_from_part_replacer(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + + if(FRAME_COMPUTER_STATE_BOARD_SECURED) + if(istype(tool, /obj/item/stack/cable_coil)) + return add_cabling(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + + if(istype(tool, /obj/item/storage/part_replacer)) + return install_parts_from_part_replacer(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + + if(FRAME_COMPUTER_STATE_WIRED) + if(istype(tool, /obj/item/stack/sheet/glass)) + return add_glass(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + + if(istype(tool, /obj/item/storage/part_replacer)) + return install_parts_from_part_replacer(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + +/obj/structure/frame/computer/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + + switch(state) + if(FRAME_COMPUTER_STATE_BOARD_INSTALLED) + tool.play_tool_sound(src) + balloon_alert(user, "circuit secured") + state = FRAME_COMPUTER_STATE_BOARD_SECURED + update_appearance(UPDATE_ICON_STATE) + return ITEM_INTERACT_SUCCESS + + if(FRAME_COMPUTER_STATE_BOARD_SECURED) + tool.play_tool_sound(src) + balloon_alert(user, "circuit unsecured") + state = FRAME_COMPUTER_STATE_BOARD_INSTALLED + update_appearance(UPDATE_ICON_STATE) + return ITEM_INTERACT_SUCCESS + + if(FRAME_COMPUTER_STATE_WIRED) + if(!user.combat_mode) + balloon_alert(user, "no glass!") + return ITEM_INTERACT_BLOCKING + + if(FRAME_COMPUTER_STATE_GLASSED) + if(finalize_construction(user, tool)) + return ITEM_INTERACT_SUCCESS + + balloon_alert(user, "missing components!") + return ITEM_INTERACT_BLOCKING + +/obj/structure/frame/computer/crowbar_act(mob/living/user, obj/item/tool) if(user.combat_mode) - return ..() + return NONE -/obj/structure/frame/computer/AltClick(mob/user) - return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation + switch(state) + if(FRAME_COMPUTER_STATE_BOARD_INSTALLED) + tool.play_tool_sound(src) + balloon_alert(user, "circuit removed") + circuit.add_fingerprint(user) + circuit.forceMove(drop_location()) + return ITEM_INTERACT_SUCCESS -/obj/structure/frame/computer/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(state == 4) - new /obj/item/shard(drop_location()) - new /obj/item/shard(drop_location()) - if(state >= 3) - new /obj/item/stack/cable_coil(drop_location(), 5) - ..() + if(FRAME_COMPUTER_STATE_BOARD_SECURED) + balloon_alert(user, "unsecure the circuit!") + return ITEM_INTERACT_BLOCKING + + if(FRAME_COMPUTER_STATE_WIRED) + balloon_alert(user, "remove the wiring!") + return ITEM_INTERACT_BLOCKING + + if(FRAME_COMPUTER_STATE_GLASSED) + tool.play_tool_sound(src) + balloon_alert(user, "glass removed") + state = FRAME_COMPUTER_STATE_WIRED + update_appearance(UPDATE_ICON_STATE) + var/obj/item/stack/sheet/glass/dropped_glass = new (drop_location(), 2) + if (!QDELETED(dropped_glass)) + dropped_glass.add_fingerprint(user) + return ITEM_INTERACT_SUCCESS + +/obj/structure/frame/computer/wirecutter_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return NONE + + if(state != FRAME_COMPUTER_STATE_WIRED) + return ITEM_INTERACT_BLOCKING + + tool.play_tool_sound(src) + balloon_alert(user, "cables removed") + state = FRAME_COMPUTER_STATE_BOARD_SECURED + update_appearance(UPDATE_ICON_STATE) + + var/obj/item/stack/cable_coil/dropped_cables = new (drop_location(), 5) + if (!QDELETED(dropped_cables)) + dropped_cables.add_fingerprint(user) + return ITEM_INTERACT_SUCCESS + +/** + * Adds cable to the computer to wire it + * Arguments + * + * * mob/living/user - the player who is adding the cable + * * obj/item/stack/cable_coil/cable - the cable we are trying to add + * * time - time taken to complete the operation + */ +/obj/structure/frame/computer/proc/add_cabling(mob/living/user, obj/item/stack/cable_coil/cable, time = 2 SECONDS) + PRIVATE_PROC(TRUE) + + if(state != FRAME_COMPUTER_STATE_BOARD_SECURED) + return FALSE + if(!cable.tool_start_check(user, amount = 5)) + return FALSE + if(time > 0) + balloon_alert(user, "adding cables...") + if(!cable.use_tool(src, user, time, volume = 50, amount = 5) || state != FRAME_COMPUTER_STATE_BOARD_SECURED) + return FALSE + + state = FRAME_COMPUTER_STATE_WIRED + update_appearance(UPDATE_ICON_STATE) + return TRUE + +/** + * Adds glass sheets to the computer to complete the screen + * Arguments + * + * * mob/living/user - the player who is adding the glass + * * obj/item/stack/sheet/glass/glass - the glass we are trying to add + * * time - time taken to complete the operation + */ +/obj/structure/frame/computer/proc/add_glass(mob/living/user, obj/item/stack/sheet/glass/glass, time = 2 SECONDS) + PRIVATE_PROC(TRUE) + + if(state != FRAME_COMPUTER_STATE_WIRED) + return FALSE + if(!glass.tool_start_check(user, amount = 2)) + return FALSE + if(time > 0) + playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) + balloon_alert(user, "adding glass...") + if(!glass.use_tool(src, user, time, amount = 2) || state != FRAME_COMPUTER_STATE_WIRED) + return FALSE + + state = FRAME_COMPUTER_STATE_GLASSED + update_appearance(UPDATE_ICON_STATE) + return TRUE + +/obj/structure/frame/computer/finalize_construction(mob/living/user, obj/item/tool) + tool.play_tool_sound(src) + var/obj/machinery/new_machine = new circuit.build_path(loc) + new_machine.balloon_alert(user, "monitor connected") + new_machine.setDir(dir) + transfer_fingerprints_to(new_machine) + + if(istype(new_machine, /obj/machinery/computer)) + var/obj/machinery/computer/new_computer = new_machine + + new_machine.clear_components() + + // Set anchor state and move the frame's parts over to the new machine. + // Then refresh parts and call on_construction(). + new_computer.set_anchored(anchored) + new_computer.component_parts = list(circuit) + new_computer.circuit = circuit + + circuit.forceMove(new_computer) + + for(var/atom/movable/movable_part in src) + movable_part.forceMove(new_computer) + new_computer.component_parts += movable_part + + new_computer.RefreshParts() + new_computer.on_construction(user) + + qdel(src) + return TRUE /// Helpers for rcd /obj/structure/frame/computer/rcd icon = 'icons/hud/radial.dmi' icon_state = "cnorth" + anchored = TRUE /obj/structure/frame/computer/rcd/Initialize(mapload) + // yeah... name = "computer frame" icon = 'icons/obj/devices/stock_parts.dmi' - icon_state = "0" - - . = ..() - - set_anchored(TRUE) + return ..() /obj/structure/frame/computer/rcd/north dir = NORTH diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index a1a1fe0ada2a9..37514c142fe8a 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -76,7 +76,7 @@ ui = new(user, src, "CameraConsole", name) ui.open() -/obj/machinery/computer/security/ui_status(mob/user) +/obj/machinery/computer/security/ui_status(mob/user, datum/ui_state/state) . = ..() if(. == UI_DISABLED) return UI_CLOSE diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index a00ed045be7af..a6e9936b1d9cf 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -129,15 +129,16 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) // 60+: Service JOB_HEAD_OF_PERSONNEL = 60, JOB_BARTENDER = 61, - JOB_COOK = 62, - JOB_BOTANIST = 63, - JOB_CURATOR = 64, - JOB_CHAPLAIN = 65, - JOB_CLOWN = 66, - JOB_MIME = 67, - JOB_JANITOR = 68, - JOB_LAWYER = 69, - JOB_PSYCHOLOGIST = 71, + JOB_CHEF = 62, + JOB_COOK = 63, + JOB_BOTANIST = 64, + JOB_CURATOR = 65, + JOB_CHAPLAIN = 66, + JOB_CLOWN = 67, + JOB_MIME = 68, + JOB_JANITOR = 69, + JOB_LAWYER = 71, + JOB_PSYCHOLOGIST = 72, // 200-229: Centcom JOB_CENTCOM_ADMIRAL = 200, JOB_CENTCOM = 201, @@ -282,7 +283,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) var/mob/living/silicon/ai/AI = usr if(!istype(AI)) return - AI.ai_tracking_tool.set_tracked_mob(AI, params["name"]) + AI.ai_tracking_tool.track_name(AI, params["name"]) #undef SENSORS_UPDATE_PERIOD #undef UNKNOWN_JOB_ID diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 72bdb8a7a5cd3..c1b5f453d1b83 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -548,6 +548,7 @@ var/truegenes = GET_SEQUENCE(path) newgene = truegenes[genepos] joker_ready = world.time + JOKER_TIMEOUT - (JOKER_UPGRADE * (connected_scanner.precision_coeff-1)) + tgui_view_state["jokerActive"] = FALSE else var/current_letter = gene_letters.Find(sequence[genepos]) newgene = (current_letter == gene_letter_count) ? gene_letters[1] : gene_letters[current_letter + 1] diff --git a/code/game/machinery/computer/prisoner/_prisoner.dm b/code/game/machinery/computer/prisoner/_prisoner.dm index 5785734a4370b..f1ce25559361a 100644 --- a/code/game/machinery/computer/prisoner/_prisoner.dm +++ b/code/game/machinery/computer/prisoner/_prisoner.dm @@ -3,9 +3,8 @@ /// ID card currently inserted into the computer. VAR_FINAL/obj/item/card/id/advanced/prisoner/contained_id -/obj/machinery/computer/prisoner/deconstruct(disassembled, mob/user) +/obj/machinery/computer/prisoner/on_deconstruction(disassembled) contained_id?.forceMove(drop_location()) - return ..() /obj/machinery/computer/prisoner/Destroy() QDEL_NULL(contained_id) diff --git a/code/game/machinery/computer/records/medical.dm b/code/game/machinery/computer/records/medical.dm index 362c8468aa6f4..c4242ace958d5 100644 --- a/code/game/machinery/computer/records/medical.dm +++ b/code/game/machinery/computer/records/medical.dm @@ -65,6 +65,7 @@ quirk_notes = target.quirk_notes, rank = target.rank, species = target.species, + trim = target.trim, )) data["records"] = records diff --git a/code/game/machinery/computer/records/security.dm b/code/game/machinery/computer/records/security.dm index 3a929f7a298a0..27b8e75e545ef 100644 --- a/code/game/machinery/computer/records/security.dm +++ b/code/game/machinery/computer/records/security.dm @@ -128,6 +128,7 @@ note = target.security_note, rank = target.rank, species = target.species, + trim = target.trim, wanted_status = target.wanted_status, )) diff --git a/code/game/machinery/computer/telescreen.dm b/code/game/machinery/computer/telescreen.dm index 90e53c2f45218..7b1e62e2cb7fb 100644 --- a/code/game/machinery/computer/telescreen.dm +++ b/code/game/machinery/computer/telescreen.dm @@ -21,10 +21,8 @@ result_path = /obj/machinery/computer/security/telescreen pixel_shift = 32 -/obj/machinery/computer/security/telescreen/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new frame_type(loc) - qdel(src) +/obj/machinery/computer/security/telescreen/on_deconstruction(disassembled) + new frame_type(loc) /obj/machinery/computer/security/telescreen/update_icon_state() icon_state = initial(icon_state) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 4e799ffeae929..e624e3f33d705 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -3,437 +3,201 @@ desc = "A generic looking construction frame. One day this will be something greater." icon = 'icons/obj/devices/stock_parts.dmi' icon_state = "box_0" + base_icon_state = "box_" density = TRUE max_integrity = 250 - var/obj/item/circuitboard/machine/circuit = null - var/state = 1 + /// What board do we accept + var/board_type = /obj/item/circuitboard + /// Reference to the circuit inside the frame + VAR_FINAL/obj/item/circuitboard/machine/circuit + /// The current (de/con)struction state of the frame + var/state = FRAME_STATE_EMPTY /obj/structure/frame/examine(user) . = ..() if(circuit) . += "It has \a [circuit] installed." - /obj/structure/frame/deconstruct(disassembled = TRUE) if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 5) - if(circuit) - circuit.forceMove(loc) - circuit = null - qdel(src) + var/atom/movable/drop_loc = drop_location() + new /obj/item/stack/sheet/iron(drop_loc, 5) + circuit?.forceMove(drop_loc) + + return ..() +/// Called when circuit has been set to a new board +/obj/structure/frame/proc/circuit_added(obj/item/circuitboard/added) + return -/obj/structure/frame/machine - name = "machine frame" - desc = "The standard frame for most station appliances. Its appearance and function is controlled by the inserted board." - var/list/components = null - var/list/req_components = null - var/list/req_component_names = null // user-friendly names of components +/// Called when circuit has been removed from the frame +/obj/structure/frame/proc/circuit_removed(obj/item/circuitboard/removed) + return -/obj/structure/frame/machine/examine(user) +/obj/structure/frame/Exited(atom/movable/gone, direction) . = ..() - if(state != 3) + if(gone != circuit) return + circuit = null - if(!length(req_components)) - . += span_info("It requires no components.") - return . - - if(!req_component_names) - stack_trace("[src]'s req_components list has items but its req_component_names list is null!") + if(QDELING(src)) return - var/list/nice_list = list() - for(var/component in req_components) - if(!ispath(component)) - stack_trace("An item in [src]'s req_components list is not a path!") - continue - if(!req_components[component]) - continue + circuit_removed(gone) - nice_list += list("[req_components[component]] [req_component_names[component]]\s") - . += span_info("It requires [english_list(nice_list, "no more components")].") +/obj/structure/frame/Destroy() + QDEL_NULL(circuit) + return ..() + +/obj/structure/frame/update_icon_state() + . = ..() + icon_state = "[base_icon_state][state]" + +/// Checks if the frame can be disassembled, and if so, begins the process +/obj/structure/frame/proc/try_dissassemble(mob/living/user, obj/item/tool, disassemble_time = 8 SECONDS) + if(state != FRAME_STATE_EMPTY) + return NONE + if(obj_flags & NO_DECONSTRUCTION) + return NONE + if(!tool.tool_start_check(user, amount = (tool.tool_behaviour == TOOL_WELDER ? 1 : 0))) + return ITEM_INTERACT_BLOCKING + + balloon_alert(user, "disassembling...") + user.visible_message( + span_warning("[user] begins disassembling [src]."), + span_notice("You start to disassemble [src]..."), + span_hear("You hear banging and clanking."), + ) + if(!tool.use_tool(src, user, disassemble_time, amount = (tool.tool_behaviour == TOOL_WELDER ? 1 : 0), volume = 50) || state != FRAME_STATE_EMPTY) + return ITEM_INTERACT_BLOCKING + + var/turf/decon_turf = get_turf(src) + deconstruct(TRUE) + for(var/obj/item/stack/leftover in decon_turf) + leftover.add_fingerprint(user) + return ITEM_INTERACT_SUCCESS + +/obj/structure/frame/screwdriver_act(mob/living/user, obj/item/tool) + return try_dissassemble(user, tool, disassemble_time = 8 SECONDS) + +/obj/structure/frame/welder_act(mob/living/user, obj/item/tool) + return try_dissassemble(user, tool, disassemble_time = 2 SECONDS) /** - * Collates the displayed names of the machine's components + * Attempt to finalize the construction of the frame into a machine + * + * If successful, results in qdel'ing the frame and newing of a machine * - * Arguments: - * * specific_parts - If true, the component should not use base name, but a specific tier + * Arguments + * * user - the player + * * tool - the tool used to finalize the construction */ -/obj/structure/frame/machine/proc/update_namelist(specific_parts) - if(!req_components) - return - - req_component_names = list() - for(var/component_path in req_components) - if(!ispath(component_path)) - continue - - if(ispath(component_path, /obj/item/stack)) - var/obj/item/stack/stack_path = component_path - if(initial(stack_path.singular_name)) - req_component_names[component_path] = initial(stack_path.singular_name) - else - req_component_names[component_path] = initial(stack_path.name) - else if(ispath(component_path, /datum/stock_part)) - var/datum/stock_part/stock_part = component_path - var/obj/item/physical_object_type = initial(stock_part.physical_object_type) - - req_component_names[component_path] = initial(physical_object_type.name) - else if(ispath(component_path, /obj/item/stock_parts)) - var/obj/item/stock_parts/stock_part = component_path - - if(!specific_parts && initial(stock_part.base_name)) - req_component_names[component_path] = initial(stock_part.base_name) - else - req_component_names[component_path] = initial(stock_part.name) - else if(ispath(component_path, /obj/item)) - var/obj/item/part = component_path +/obj/structure/frame/proc/finalize_construction(mob/living/user, obj/item/tool) + stack_trace("[type] finalize_construction unimplemented.") + return FALSE + +/obj/structure/frame/wrench_act(mob/living/user, obj/item/tool) + . = NONE + switch(default_unfasten_wrench(user, tool, 4 SECONDS)) + if(SUCCESSFUL_UNFASTEN) + return ITEM_INTERACT_SUCCESS + if(FAILED_UNFASTEN) + return ITEM_INTERACT_BLOCKING + return . + +/obj/structure/frame/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . - req_component_names[component_path] = initial(part.name) - else - stack_trace("Invalid component part [component_path] in [type], couldn't get its name") - req_component_names[component_path] = "[component_path] (this is a bug)" + if(istype(tool, /obj/item/circuitboard)) // Install board will fail if passed an invalid circuitboard and give feedback + return install_board(user, tool, by_hand = TRUE) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING -/obj/structure/frame/machine/proc/get_req_components_amt() - var/amt = 0 - for(var/path in req_components) - amt += req_components[path] - return amt + return . /** - * install the circuitboard in this frame + * Installs the passed circuit board into the frame + * + * Assumes there is no circuit already installed + * + * Arguments * * board - the machine circuitboard to install * * user - the player - * * by_hand - is the player installing the board by hand or from the RPED. Used to decide how to transfer the board into the frame + * * by_hand - is the player installing the board by hand or from the RPED. + * Used to decide how to transfer the board into the frame */ -/obj/structure/frame/machine/proc/install_board(obj/item/circuitboard/machine/board, mob/user, by_hand) - if(!board.build_path) - to_chat(user, span_warning("This circuitboard seems to be broken.")) - return - if(!anchored && board.needs_anchored) - to_chat(user, span_warning("The frame needs to be secured first!")) - return +/obj/structure/frame/proc/install_board(mob/living/user, obj/item/circuitboard/board, by_hand = FALSE) + if(!istype(board, board_type) || !board.build_path) + balloon_alert(user, "invalid board!") + return FALSE if(by_hand && !user.transferItemToLoc(board, src)) - return + return FALSE else if(!board.forceMove(src)) - return + return FALSE - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) - to_chat(user, span_notice("You add the circuit board to the frame.")) + playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) + balloon_alert(user, "circuit installed") circuit = board - icon_state = "box_2" - state = 3 - components = list() - //add circuit board as the first component to the list of components - //required for part_replacer to locate it while exchanging parts so it does not early return in /obj/machinery/proc/exchange_parts - components += circuit - req_components = board.req_components.Copy() - update_namelist(board.specific_parts) + if(by_hand) + circuit.add_fingerprint(user) + circuit_added(board) return TRUE -/obj/structure/frame/machine/attackby(obj/item/P, mob/living/user, params) - switch(state) - if(1) - if(istype(P, /obj/item/circuitboard/machine)) - to_chat(user, span_warning("The frame needs wiring first!")) - return - else if(istype(P, /obj/item/circuitboard)) - to_chat(user, span_warning("This frame does not accept circuit boards of this type!")) - return - if(istype(P, /obj/item/stack/cable_coil)) - if(!P.tool_start_check(user, amount=5)) - return - - to_chat(user, span_notice("You start to add cables to the frame...")) - if(P.use_tool(src, user, 20, volume=50, amount=5)) - to_chat(user, span_notice("You add cables to the frame.")) - state = 2 - icon_state = "box_1" - - return - if(P.tool_behaviour == TOOL_SCREWDRIVER && !anchored) - user.visible_message(span_warning("[user] disassembles the frame."), \ - span_notice("You start to disassemble the frame..."), span_hear("You hear banging and clanking.")) - if(P.use_tool(src, user, 40, volume=50)) - if(state == 1) - to_chat(user, span_notice("You disassemble the frame.")) - var/obj/item/stack/sheet/iron/M = new (loc, 5) - if (!QDELETED(M)) - M.add_fingerprint(user) - qdel(src) - return - if(P.tool_behaviour == TOOL_WRENCH) - var/turf/ground = get_turf(src) - if(!anchored && ground.is_blocked_turf(exclude_mobs = TRUE, source_atom = src)) - to_chat(user, span_notice("You fail to secure [src].")) - return - to_chat(user, span_notice("You start [anchored ? "un" : ""]securing [src]...")) - if(P.use_tool(src, user, 40, volume=75)) - if(state == 1) - to_chat(user, span_notice("You [anchored ? "un" : ""]secure [src].")) - set_anchored(!anchored) - return - - if(2) - if(P.tool_behaviour == TOOL_WRENCH) - to_chat(user, span_notice("You start [anchored ? "un" : ""]securing [src]...")) - if(P.use_tool(src, user, 40, volume=75)) - to_chat(user, span_notice("You [anchored ? "un" : ""]secure [src].")) - set_anchored(!anchored) - return - - if(!circuit && istype(P, /obj/item/storage/part_replacer) && P.contents.len) - var/obj/item/storage/part_replacer/replacer = P - // map of circuitboard names to the board - var/list/circuit_boards = list() - for(var/obj/item/circuitboard/machine/board in replacer.contents) - circuit_boards[board.name] = board - if(!length(circuit_boards)) - return - //if there is only one board directly install it else pick from list - var/obj/item/circuitboard/machine/target_board - if(circuit_boards.len == 1) - for(var/board_name in circuit_boards) - target_board = circuit_boards[board_name] - else - var/option = tgui_input_list(user, "Select Circuitboard To Install"," Available Boards", circuit_boards) - target_board = circuit_boards[option] - if(!target_board) - return - //install board - if(install_board(target_board, user, FALSE)) - replacer.play_rped_sound() - //attack this frame again with the rped so it can install stock parts since its now in state 3 - attackby(replacer, user, params) - return - - if(!circuit && istype(P, /obj/item/circuitboard/machine)) - var/obj/item/circuitboard/machine/machine_board = P - install_board(machine_board, user, TRUE) - return - - else if(!circuit && istype(P, /obj/item/circuitboard)) - to_chat(user, span_warning("This frame does not accept circuit boards of this type!")) - return - - if(P.tool_behaviour == TOOL_WIRECUTTER) - P.play_tool_sound(src) - to_chat(user, span_notice("You remove the cables.")) - state = 1 - icon_state = "box_0" - new /obj/item/stack/cable_coil(drop_location(), 5) - return - - if(3) - if(P.tool_behaviour == TOOL_CROWBAR) - P.play_tool_sound(src) - state = 2 - circuit.forceMove(drop_location()) - components.Remove(circuit) - //spawn stack components from the circuitboards requested components since they no longer exist inside components - for(var/component in circuit.req_components) - if(!ispath(component, /obj/item/stack)) - continue - var/obj/item/stack/stack_path = component - var/stack_amount = circuit.req_components[component] - req_components[component] - if(stack_amount > 0) - new stack_path(drop_location(), stack_amount) - circuit = null - if(components.len == 0) - to_chat(user, span_notice("You remove the circuit board.")) - else - to_chat(user, span_notice("You remove the circuit board and other components.")) - dump_contents() - - desc = initial(desc) - req_components = null - components = null - icon_state = "box_1" - return - - if(P.tool_behaviour == TOOL_WRENCH && !circuit.needs_anchored) - to_chat(user, span_notice("You start [anchored ? "un" : ""]securing [src]...")) - if(P.use_tool(src, user, 40, volume=75)) - to_chat(user, span_notice("You [anchored ? "un" : ""]secure [src].")) - set_anchored(!anchored) - return - - if(P.tool_behaviour == TOOL_SCREWDRIVER) - var/component_check = TRUE - for(var/R in req_components) - if(req_components[R] > 0) - component_check = FALSE - break - if(component_check) - P.play_tool_sound(src) - var/obj/machinery/new_machine = new circuit.build_path(loc) - if(istype(new_machine)) - new_machine.clear_components() - - // Set anchor state - new_machine.set_anchored(anchored) - - // Assign the circuit & parts & move them all at once into the machine - // no need to seperatly move circuit board as its already part of the components list - new_machine.circuit = circuit - new_machine.component_parts = components - for (var/obj/new_part in components) - new_part.forceMove(new_machine) - - //Inform machine that its finished & cleanup - new_machine.RefreshParts() - new_machine.on_construction(user) - components = null - qdel(src) - return - - if(istype(P, /obj/item/storage/part_replacer)) - /** - * more efficient return so no if conditions after this are executed. - * Required when the rped is re attacking the frame after installing circuitboard so it returns quickly - */ - if(!P.contents.len || !get_req_components_amt()) - return - - var/obj/item/storage/part_replacer/replacer = P - var/play_sound = FALSE - var/list/part_list = replacer.get_sorted_parts() //parts sorted in order of tier - for(var/path in req_components) - var/target_path - if(ispath(path, /datum/stock_part)) - var/datum/stock_part/datum_part = path - target_path = initial(datum_part.physical_object_base_type) - else - target_path = path - - var/obj/item/part - while(req_components[path] > 0 && (part = look_for(part_list, target_path, ispath(path, /obj/item/stack/ore/bluespace_crystal) ? /obj/item/stack/sheet/bluespace_crystal : null))) - part_list -= part - if(istype(part,/obj/item/stack)) - var/obj/item/stack/S = part - var/used_amt = min(round(S.get_amount()), req_components[path]) - var/stack_name = S.singular_name - if(!used_amt || !S.use(used_amt)) - continue - req_components[path] -= used_amt - to_chat(user, span_notice("You add [used_amt] [stack_name] to [src].")) - play_sound = TRUE - else if(replacer.atom_storage.attempt_remove(part, src)) - var/stock_part_datum = GLOB.stock_part_datums_per_object[part.type] - if (!isnull(stock_part_datum)) - components += stock_part_datum - qdel(part) - else - components += part - part.forceMove(src) - req_components[path]-- - to_chat(user, span_notice("You add [part] to [src].")) - play_sound = TRUE - - if(play_sound) - replacer.play_rped_sound() - return - - for(var/stock_part_base in req_components) - if (req_components[stock_part_base] == 0) - continue - - var/stock_part_path - - if(ispath(stock_part_base, /obj/item)) - stock_part_path = stock_part_base - else if(ispath(stock_part_base, /datum/stock_part)) - var/datum/stock_part/stock_part_datum_type = stock_part_base - stock_part_path = initial(stock_part_datum_type.physical_object_type) - else - stack_trace("Bad stock part in req_components: [stock_part_base]") - continue - - //if we require an bluespace crystall and we have an full sheet of them we can allow that - if(ispath(stock_part_path, /obj/item/stack/ore/bluespace_crystal) && istype(P, /obj/item/stack/sheet/bluespace_crystal)) - //allow it - else if(!istype(P, stock_part_path)) - continue - - if(isstack(P)) - var/obj/item/stack/S = P - var/used_amt = min(round(S.get_amount()), req_components[stock_part_path]) - if(used_amt && S.use(used_amt)) - req_components[stock_part_path] -= used_amt - to_chat(user, span_notice("You add [P] to [src].")) - return - - // We might end up qdel'ing the part if it's a stock part datum. - // In practice, this doesn't have side effects to the name, - // but academically we should not be using an object after it's deleted. - var/part_name = "[P]" - - if (ispath(stock_part_base, /datum/stock_part)) - // We can't just reuse stock_part_path here or its singleton, - // or else putting in a tier 2 part will deconstruct to a tier 1 part. - var/stock_part_datum = GLOB.stock_part_datums_per_object[P.type] - if (isnull(stock_part_datum)) - stack_trace("[P.type] does not have an associated stock part datum!") - continue - - components += stock_part_datum - - // We regenerate the stock parts on deconstruct. - // This technically means we lose unique qualities of the stock part, but - // it's worth it for how dramatically this simplifies the code. - // The only place I can see it affecting anything is like...RPG qualities. :P - qdel(P) - else if(user.transferItemToLoc(P, src)) - components += P - else - break - - to_chat(user, span_notice("You add [part_name] to [src].")) - req_components[stock_part_base]-- - return TRUE - to_chat(user, span_warning("You cannot add that to the machine!")) +/** + * Attempt to install a circuit from the contents of an RPED + * + * Arguments + * * user - the player + * * replacer - the RPED being used + * * no_sound - if true, no sound will be played + */ +/obj/structure/frame/proc/install_circuit_from_part_replacer(mob/living/user, obj/item/storage/part_replacer/replacer, no_sound = FALSE) + if(!length(replacer.contents)) + return FALSE + + var/list/circuit_boards = list() + for(var/obj/item/circuitboard/board as anything in replacer) + if(istype(board, board_type)) + circuit_boards[board.name] = board + + if(!length(circuit_boards)) + return FALSE + + //if there is only one board directly install it else pick from list + var/obj/item/circuitboard/target_board + if(length(circuit_boards) == 1) + for(var/board_name in circuit_boards) + target_board = circuit_boards[board_name] + + else + var/option = tgui_input_list(user, "Select Circuitboard To Install"," Available Boards", circuit_boards) + target_board = circuit_boards[option] + // Everything still where it should be after the UI closed? + if(QDELETED(target_board) || QDELETED(src) || QDELETED(user) || !(target_board in replacer) || !user.is_holding(replacer)) + return FALSE + // User still within range? + var/close_enough = replacer.works_from_distance || user.Adjacent(src) + if(!close_enough) return FALSE - if(user.combat_mode) - return ..() - -/// returns instance of path1 in list else path2 in list -/obj/structure/frame/machine/proc/look_for(list/parts, path1, path2 = null) - //look for path1 in list - var/part = locate(path1) in parts - if(!isnull(part)) - return part - - //optional look for path2 in list - if(!isnull(path2)) - part = locate(path2) in parts - return part - -/obj/structure/frame/machine/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(state >= 2) - new /obj/item/stack/cable_coil(loc , 5) - - dump_contents() - ..() - -/obj/structure/frame/machine/dump_contents() - for (var/component in components) - if (ismovable(component)) - var/atom/movable/atom_component = component - atom_component.forceMove(drop_location()) - else if (istype(component, /datum/stock_part)) - var/datum/stock_part/stock_part_datum = component - var/physical_object_type = initial(stock_part_datum.physical_object_type) - new physical_object_type(drop_location()) - else - stack_trace("Invalid component [component] was found in constructable frame") -/obj/structure/frame/machine/secured - state = 2 - icon_state = "box_1" + if(install_board(user, target_board, by_hand = FALSE)) + // After installing, attempts to follow up by inserting parts + install_parts_from_part_replacer(user, replacer, no_sound = TRUE) + if(!no_sound) + replacer.play_rped_sound() + if(replacer.works_from_distance) + user.Beam(src, icon_state = "rped_upgrade", time = 0.5 SECONDS) + return TRUE -/obj/structure/frame/machine/secured/Initialize(mapload) - . = ..() + return FALSE - set_anchored(TRUE) +/** + * Attempt to install necessary parts from the contents of an RPED + * + * Arguments + * * user - the player + * * replacer - the RPED being used + * * no_sound - if true, no sound will be played + */ +/obj/structure/frame/proc/install_parts_from_part_replacer(mob/living/user, obj/item/storage/part_replacer/replacer, no_sound = FALSE) + return FALSE diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 098c887f2a2d1..9d19d0d9be98b 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -44,7 +44,7 @@ icon_state = "[base_icon_state][music_player.active_song_sound ? "-active" : null]" return ..() -/obj/machinery/jukebox/ui_status(mob/user) +/obj/machinery/jukebox/ui_status(mob/user, datum/ui_state/state) if(isobserver(user)) return ..() if(!anchored) diff --git a/code/game/machinery/digital_clock.dm b/code/game/machinery/digital_clock.dm index a0dc87dba0857..febc6a4b09100 100644 --- a/code/game/machinery/digital_clock.dm +++ b/code/game/machinery/digital_clock.dm @@ -69,16 +69,13 @@ . = ..() emag_act() -/obj/machinery/digital_clock/deconstruct(disassembled = TRUE) - if(obj_flags & NO_DECONSTRUCTION) - return +/obj/machinery/digital_clock/on_deconstruction(disassembled) if(disassembled) new /obj/item/wallframe/digital_clock(drop_location()) else new /obj/item/stack/sheet/iron(drop_location(), 2) new /obj/item/shard(drop_location()) new /obj/item/shard(drop_location()) - qdel(src) /obj/machinery/digital_clock/Initialize(mapload) . = ..() diff --git a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm index 092a4c7889a28..4e84870ec9c30 100644 --- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm @@ -65,26 +65,22 @@ /obj/item/organ/internal/heart/rat/on_mob_insert(mob/living/carbon/receiver) . = ..() - if(!. || !ishuman(receiver)) + if(!ishuman(receiver)) return var/mob/living/carbon/human/human_receiver = receiver - if(!human_receiver.can_mutate()) - return - human_receiver.dna.add_mutation(/datum/mutation/human/dwarfism) + if(human_receiver.can_mutate()) + human_receiver.dna.add_mutation(/datum/mutation/human/dwarfism) //but 1.5 damage - if(human_receiver.physiology) - human_receiver.physiology.damage_resistance -= 50 + human_receiver.physiology?.damage_resistance -= 50 /obj/item/organ/internal/heart/rat/on_mob_remove(mob/living/carbon/heartless, special) . = ..() if(!ishuman(heartless)) return var/mob/living/carbon/human/human_heartless = heartless - if(!human_heartless.can_mutate()) - return - human_heartless.dna.remove_mutation(/datum/mutation/human/dwarfism) - if(human_heartless.physiology) - human_heartless.physiology.damage_resistance += 50 + if(human_heartless.can_mutate()) + human_heartless.dna.remove_mutation(/datum/mutation/human/dwarfism) + human_heartless.physiology?.damage_resistance += 50 /// you occasionally squeak, and have some rat related verbal tics /obj/item/organ/internal/tongue/rat diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index d6e10006673b6..abe2fc0c736cf 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1511,38 +1511,32 @@ assembly.update_name() assembly.update_appearance() -/obj/machinery/door/airlock/deconstruct(disassembled = TRUE, mob/user) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/obj/structure/door_assembly/A - if(assemblytype) - A = new assemblytype(loc) - else - A = new /obj/structure/door_assembly(loc) - //If you come across a null assemblytype, it will produce the default assembly instead of disintegrating. - prepare_deconstruction_assembly(A) - - if(!disassembled) - A?.update_integrity(A.max_integrity * 0.5) - else if(obj_flags & EMAGGED) - if(user) - to_chat(user, span_warning("You discard the damaged electronics.")) - else - if(user) - to_chat(user, span_notice("You remove the airlock electronics.")) - - var/obj/item/electronics/airlock/ae - if(!electronics) - ae = new/obj/item/electronics/airlock(loc) - if(length(req_one_access)) - ae.one_access = 1 - ae.accesses = req_one_access - else - ae.accesses = req_access +/obj/machinery/door/airlock/on_deconstruction(disassembled) + var/obj/structure/door_assembly/A + if(assemblytype) + A = new assemblytype(loc) + else + A = new /obj/structure/door_assembly(loc) + //If you come across a null assemblytype, it will produce the default assembly instead of disintegrating. + prepare_deconstruction_assembly(A) + + if(!disassembled) + A?.update_integrity(A.max_integrity * 0.5) + else if(obj_flags & EMAGGED) + //no electronics nothing + else + var/obj/item/electronics/airlock/ae + if(!electronics) + ae = new/obj/item/electronics/airlock(loc) + if(length(req_one_access)) + ae.one_access = 1 + ae.accesses = req_one_access else - ae = electronics - electronics = null - ae.forceMove(drop_location()) - qdel(src) + ae.accesses = req_access + else + ae = electronics + electronics = null + ae.forceMove(drop_location()) /obj/machinery/door/airlock/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 5521bd6a25c19..fdb9072f4b682 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -74,9 +74,12 @@ /obj/machinery/door/firedoor/Initialize(mapload) . = ..() + id_tag = assign_random_name() soundloop = new(src, FALSE) CalculateAffectingAreas() my_area = get_area(src) + if(name == initial(name)) + update_name() if(!merger_typecache) merger_typecache = typecacheof(/obj/machinery/door/firedoor) @@ -180,6 +183,10 @@ return . +/obj/machinery/door/firedoor/update_name(updates) + . = ..() + name = "[get_area_name(my_area)] [initial(name)] [id_tag]" + /** * Calculates what areas we should worry about. * @@ -323,6 +330,8 @@ return //We're already active soundloop.start() is_playing_alarm = TRUE + my_area.fault_status = AREA_FAULT_AUTOMATIC + my_area.fault_location = name var/datum/merger/merge_group = GetMergeGroup(merger_id, merger_typecache) for(var/obj/machinery/door/firedoor/buddylock as anything in merge_group.members) buddylock.activate(code) @@ -335,6 +344,8 @@ /obj/machinery/door/firedoor/proc/start_deactivation_process() soundloop.stop() is_playing_alarm = FALSE + my_area.fault_status = AREA_FAULT_NONE + my_area.fault_location = null var/datum/merger/merge_group = GetMergeGroup(merger_id, merger_typecache) for(var/obj/machinery/door/firedoor/buddylock as anything in merge_group.members) buddylock.reset() @@ -371,7 +382,7 @@ if(LAZYLEN(place.active_firelocks) != 1) continue //if we're the first to activate in this particular area - place.set_fire_effect(TRUE) //bathe in red + place.set_fire_effect(TRUE, AREA_FAULT_AUTOMATIC, name) //bathe in red if(place == my_area) // We'll limit our reporting to just the area we're on. If the issue affects bordering areas, they can report it themselves place.alarm_manager.send_alarm(ALARM_FIRE, place) @@ -431,7 +442,7 @@ LAZYREMOVE(place.active_firelocks, src) if(LAZYLEN(place.active_firelocks)) // If we were the last firelock still active, clear the area effects continue - place.set_fire_effect(FALSE) + place.set_fire_effect(FALSE, AREA_FAULT_NONE, name) if(place == my_area) place.alarm_manager.clear_alarm(ALARM_FIRE, place) @@ -658,20 +669,18 @@ if(old_activity != active) //Something changed while we were sleeping correct_state() //So we should re-evaluate our state -/obj/machinery/door/firedoor/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/turf/targetloc = get_turf(src) - if(disassembled || prob(40)) - var/obj/structure/firelock_frame/unbuilt_lock = new assemblytype(targetloc) - if(disassembled) - unbuilt_lock.constructionStep = CONSTRUCTION_PANEL_OPEN - else - unbuilt_lock.constructionStep = CONSTRUCTION_NO_CIRCUIT - unbuilt_lock.update_integrity(unbuilt_lock.max_integrity * 0.5) - unbuilt_lock.update_appearance() +/obj/machinery/door/firedoor/on_deconstruction(disassembled) + var/turf/targetloc = get_turf(src) + if(disassembled || prob(40)) + var/obj/structure/firelock_frame/unbuilt_lock = new assemblytype(targetloc) + if(disassembled) + unbuilt_lock.constructionStep = CONSTRUCTION_PANEL_OPEN else - new /obj/item/electronics/firelock (targetloc) - qdel(src) + unbuilt_lock.constructionStep = CONSTRUCTION_NO_CIRCUIT + unbuilt_lock.update_integrity(unbuilt_lock.max_integrity * 0.5) + unbuilt_lock.update_appearance() + else + new /obj/item/electronics/firelock (targetloc) /obj/machinery/door/firedoor/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index 5d390019f9b2e..eca8d88da4baf 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -66,3 +66,12 @@ /obj/machinery/door/poddoor/shutters/window/preopen icon_state = "open" density = FALSE + +/obj/machinery/door/poddoor/shutters/window/indestructible + name = "hardened windowed shutters" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + +/obj/machinery/door/poddoor/shutters/window/indestructible/preopen + icon_state = "open" + density = FALSE + opacity = FALSE diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 9179dbaf94feb..bbe443bf380f5 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -14,7 +14,7 @@ visible = FALSE flags_1 = ON_BORDER_1 opacity = FALSE - pass_flags_self = PASSGLASS + pass_flags_self = PASSGLASS | PASSWINDOW can_atmos_pass = ATMOS_PASS_PROC interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN set_dir_on_move = FALSE @@ -301,15 +301,16 @@ playsound(src, 'sound/items/welder.ogg', 100, TRUE) -/obj/machinery/door/window/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION) && !disassembled) - for(var/i in 1 to shards) - drop_debris(new /obj/item/shard(src)) - if(rods) - drop_debris(new /obj/item/stack/rods(src, rods)) - if(cable) - drop_debris(new /obj/item/stack/cable_coil(src, cable)) - qdel(src) +/obj/machinery/door/window/on_deconstruction(disassembled) + if(disassembled) + return + + for(var/i in 1 to shards) + drop_debris(new /obj/item/shard(src)) + if(rods) + drop_debris(new /obj/item/stack/rods(src, rods)) + if(cable) + drop_debris(new /obj/item/stack/cable_coil(src, cable)) /obj/machinery/door/window/proc/drop_debris(obj/item/debris) debris.forceMove(loc) diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 1d428e7547e35..91e7d1a3d4896 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -260,11 +260,6 @@ if(break_sound) playsound(src, break_sound, 50, TRUE) -/obj/machinery/drone_dispenser/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 5) - qdel(src) - #undef DRONE_PRODUCTION #undef DRONE_RECHARGING #undef DRONE_READY diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 1f6b4c7def08b..b1db13eea8093 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -42,11 +42,12 @@ /obj/machinery/firealarm/Initialize(mapload, dir, building) . = ..() + id_tag = assign_random_name() if(building) buildstage = FIRE_ALARM_BUILD_NO_CIRCUIT set_panel_open(TRUE) if(name == initial(name)) - name = "[get_area_name(src)] [initial(name)]" + update_name() my_area = get_area(src) LAZYADD(my_area.firealarms, src) @@ -114,7 +115,7 @@ /obj/machinery/firealarm/update_name(updates) . = ..() - name = "[get_area_name(my_area)] [initial(name)]" + name = "[get_area_name(my_area)] [initial(name)] [id_tag]" /obj/machinery/firealarm/on_exit_area(datum/source, area/area_to_unregister) //we cannot unregister from an area we never registered to in the first place @@ -259,6 +260,8 @@ if(user) balloon_alert(user, "triggered alarm!") user.log_message("triggered a fire alarm.", LOG_GAME) + my_area.fault_status = AREA_FAULT_MANUAL + my_area.fault_location = name soundloop.start() //Manually pulled fire alarms will make the sound, rather than the doors. SEND_SIGNAL(src, COMSIG_FIREALARM_ON_TRIGGER) update_use_power(ACTIVE_POWER_USE) @@ -440,22 +443,21 @@ return return ..() -/obj/machinery/firealarm/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 1) - if(buildstage > FIRE_ALARM_BUILD_NO_CIRCUIT) - var/obj/item/item = new /obj/item/electronics/firealarm(loc) - if(!disassembled) - item.update_integrity(item.max_integrity * 0.5) - if(buildstage > FIRE_ALARM_BUILD_NO_WIRES) - new /obj/item/stack/cable_coil(loc, 3) - qdel(src) +/obj/machinery/firealarm/on_deconstruction(disassembled) + new /obj/item/stack/sheet/iron(loc, 1) + if(buildstage > FIRE_ALARM_BUILD_NO_CIRCUIT) + var/obj/item/item = new /obj/item/electronics/firealarm(loc) + if(!disassembled) + item.update_integrity(item.max_integrity * 0.5) + if(buildstage > FIRE_ALARM_BUILD_NO_WIRES) + new /obj/item/stack/cable_coil(loc, 3) // Allows users to examine the state of the thermal sensor /obj/machinery/firealarm/examine(mob/user) . = ..() if((my_area?.fire || LAZYLEN(my_area?.active_firelocks))) . += "The local area hazard light is flashing." + . += "The fault location display is [my_area.fault_location] ([my_area.fault_status == AREA_FAULT_AUTOMATIC ? "Automatic Detection" : "Manual Trigger"])." if(is_station_level(z)) . += "The station security alert level is [SSsecurity_level.get_current_level_as_text()]." . += "Left-Click to activate all firelocks in this area." diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index efe28051a211b..678b2c655094a 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -144,18 +144,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) bulb.burn_out() power_change() -/obj/machinery/flasher/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(bulb) - bulb.forceMove(loc) - if(disassembled) - var/obj/item/wallframe/flasher/flasher_obj = new(get_turf(src)) - transfer_fingerprints_to(flasher_obj) - flasher_obj.id = id - playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) - else - new /obj/item/stack/sheet/iron (loc, 2) - qdel(src) +/obj/machinery/flasher/on_deconstruction(disassembled) + if(bulb) + bulb.forceMove(loc) + if(disassembled) + var/obj/item/wallframe/flasher/flasher_obj = new(get_turf(src)) + transfer_fingerprints_to(flasher_obj) + flasher_obj.id = id + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + else + new /obj/item/stack/sheet/iron (loc, 2) /obj/machinery/flasher/portable //Portable version of the flasher. Only flashes when anchored name = "portable flasher" diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 7ed48a4c9c5ce..05c0fe242461f 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -46,6 +46,7 @@ Possible to do for anyone motivated enough: max_integrity = 300 armor_type = /datum/armor/machinery_holopad circuit = /obj/item/circuitboard/machine/holopad + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_IGNORE_MOBILITY // Blue, dim light light_power = 0.8 light_color = LIGHT_COLOR_BLUE @@ -271,7 +272,7 @@ Possible to do for anyone motivated enough: return ..() -/obj/machinery/holopad/ui_status(mob/user) +/obj/machinery/holopad/ui_status(mob/user, datum/ui_state/state) if(!is_operational) return UI_CLOSE if(outgoing_call && !calling) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index a28f855862ae4..75d0566e42c4e 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -55,11 +55,9 @@ deconstruct(TRUE) return ITEM_INTERACT_SUCCESS -/obj/machinery/igniter/deconstruct(disassembled) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 5) - new /obj/item/assembly/igniter(loc) - return ..() +/obj/machinery/igniter/on_deconstruction(disassembled) + new /obj/item/stack/sheet/iron(loc, 5) + new /obj/item/assembly/igniter(loc) /obj/machinery/igniter/multitool_act(mob/living/user, obj/item/tool) var/change_id = tgui_input_number(user, "Set the igniter controller's ID", "Igniter ID", id, 100) @@ -200,10 +198,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/sparker, 26) deconstruct(TRUE) return ITEM_INTERACT_SUCCESS -/obj/machinery/sparker/deconstruct(disassembled) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/wallframe/sparker(loc) - return ..() +/obj/machinery/sparker/on_deconstruction(disassembled) + new /obj/item/wallframe/sparker(loc) /obj/machinery/sparker/multitool_act(mob/living/user, obj/item/tool) var/change_id = tgui_input_number(user, "Set the sparker controller's ID", "Sparker ID", id, 100) diff --git a/code/game/machinery/incident_display.dm b/code/game/machinery/incident_display.dm index 63418e4457ec3..fcdfecf6a3178 100644 --- a/code/game/machinery/incident_display.dm +++ b/code/game/machinery/incident_display.dm @@ -164,16 +164,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/tram, 32) delam_record = rand(1,99) update_appearance() -/obj/machinery/incident_display/deconstruct() - if(obj_flags & NO_DECONSTRUCTION) - return - +/obj/machinery/incident_display/on_deconstruction(disassembled) new /obj/item/stack/sheet/mineral/titanium(drop_location(), 2) new /obj/item/shard(drop_location()) new /obj/item/shard(drop_location()) - qdel(src) - /obj/machinery/incident_display/proc/update_delam_count(new_count, record) delam_record = record last_delam = min(new_count, 199) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 25e963ad6d573..6244dcdd2dbc5 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -217,10 +217,8 @@ return ..() set_transfer_rate(transfer_rate > MIN_IV_TRANSFER_RATE ? MIN_IV_TRANSFER_RATE : MAX_IV_TRANSFER_RATE) -/obj/machinery/iv_drip/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc) - qdel(src) +/obj/machinery/iv_drip/on_deconstruction(disassembled = TRUE) + new /obj/item/stack/sheet/iron(loc) /obj/machinery/iv_drip/process(seconds_per_tick) if(!attached) diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 910f3802bfd6b..a950750f4d81b 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -152,7 +152,7 @@ return "ERROR: Launchpad busy." var/area/surrounding = get_area(src) - if(is_centcom_level(z) || istype(surrounding, /area/shuttle)) + if(is_centcom_level(z) || istype(surrounding, /area/shuttle/supply) ||istype(surrounding, /area/shuttle/transport)) return "ERROR: Launchpad not operative. Heavy area shielding makes teleporting impossible." return null diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index a4646136aaf2b..f9075b4318fac 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -107,10 +107,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light_switch, 26) if(!(machine_stat & (BROKEN|NOPOWER))) power_change() -/obj/machinery/light_switch/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/wallframe/light_switch(loc) - qdel(src) +/obj/machinery/light_switch/on_deconstruction(disassembled) + new /obj/item/wallframe/light_switch(loc) /obj/item/wallframe/light_switch name = "light switch" diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 0e81f839838e7..197feb4118ddd 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -116,7 +116,7 @@ return data -/obj/machinery/limbgrower/on_deconstruction() +/obj/machinery/limbgrower/on_deconstruction(disassembled) for(var/obj/item/reagent_containers/cup/our_beaker in component_parts) reagents.trans_to(our_beaker, our_beaker.reagents.maximum_volume) return ..() diff --git a/code/game/machinery/machine_frame.dm b/code/game/machinery/machine_frame.dm new file mode 100644 index 0000000000000..a3c074937f0f7 --- /dev/null +++ b/code/game/machinery/machine_frame.dm @@ -0,0 +1,474 @@ +/obj/structure/frame/machine + name = "machine frame" + desc = "The standard frame for most station appliances. Its appearance and function is controlled by the inserted board." + board_type = /obj/item/circuitboard/machine + /// List of all compnents inside the frame contributing to its construction + var/list/components + /// List of all components required to construct the frame + var/list/req_components + /// User-friendly list of names of required components + var/list/req_component_names + +/obj/structure/frame/machine/Initialize(mapload) + . = ..() + register_context() + update_appearance(UPDATE_ICON_STATE) + +/obj/structure/frame/machine/Destroy() + QDEL_LIST(components) + return ..() + +/obj/structure/frame/machine/deconstruct(disassembled = TRUE) + if(!(obj_flags & NO_DECONSTRUCTION)) + if(state >= FRAME_STATE_WIRED) + new /obj/item/stack/cable_coil(drop_location(), 5) + dump_contents() + return ..() + +/obj/structure/frame/machine/try_dissassemble(mob/living/user, obj/item/tool, disassemble_time) + if(anchored) + balloon_alert(user, "must be unsecured first!") + return FALSE + return ..() + +/obj/structure/frame/machine/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = NONE + if(isnull(held_item)) + return + + switch(state) + if(FRAME_STATE_EMPTY) + if(istype(held_item, /obj/item/stack/cable_coil)) + context[SCREENTIP_CONTEXT_LMB] = "Wire Frame" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]anchor" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_WELDER) + context[SCREENTIP_CONTEXT_LMB] = "Unweld frame" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "Disassemble frame" + return CONTEXTUAL_SCREENTIP_SET + if(FRAME_STATE_WIRED) + if(held_item.tool_behaviour == TOOL_WIRECUTTER) + context[SCREENTIP_CONTEXT_LMB] = "Cut wires" + return CONTEXTUAL_SCREENTIP_SET + else if(istype(held_item, board_type)) + context[SCREENTIP_CONTEXT_LMB] = "Insert board" + return CONTEXTUAL_SCREENTIP_SET + if(FRAME_STATE_BOARD_INSTALLED) + if(held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Pry out components" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_WRENCH) + if(!circuit.needs_anchored) + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Un" : ""]anchor" + return CONTEXTUAL_SCREENTIP_SET + return NONE + else if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + var/needs_components = FALSE + for(var/component in req_components) + if(!req_components[component]) + continue + needs_components = TRUE + break + if(!needs_components) + context[SCREENTIP_CONTEXT_LMB] = "Complete frame" + return CONTEXTUAL_SCREENTIP_SET + else if(!istype(held_item, /obj/item/storage/part_replacer)) + for(var/component in req_components) + if(!req_components[component]) + continue + var/stock_part_path + if(ispath(component, /obj/item)) + stock_part_path = component + else if(ispath(component, /datum/stock_part)) + var/datum/stock_part/stock_part_datum_type = component + stock_part_path = initial(stock_part_datum_type.physical_object_type) + if(istype(held_item, stock_part_path)) + context[SCREENTIP_CONTEXT_LMB] = "Insert part" + return CONTEXTUAL_SCREENTIP_SET + +/obj/structure/frame/machine/examine(user) + . = ..() + if(!circuit?.needs_anchored) + . += span_notice("It can be [EXAMINE_HINT("anchored")] [anchored ? "loose" : "in place"]") + if(state == FRAME_STATE_EMPTY) + . += span_warning("It needs [EXAMINE_HINT("5 cable")] pieces to wire it.") + return + if(state == FRAME_STATE_WIRED) + . += span_info("Its wires can be cut with a [EXAMINE_HINT("wirecutter")].") + if(state != FRAME_STATE_BOARD_INSTALLED) + . += span_warning("Its missing a circuit board..") + return + if(!length(req_components)) + . += span_info("It requires no components.") + return + + var/list/nice_list = list() + for(var/component in req_components) + if(!req_components[component]) + continue + nice_list += list("[req_components[component]] [req_component_names[component]]\s") + . += span_info("It requires [english_list(nice_list, "no more components")].") + + . += span_info("All the components can be [EXAMINE_HINT("pried")] out.") + if(!length(nice_list)) + . += span_info("The frame can be [EXAMINE_HINT("screwed")] to complete it.") + +/obj/structure/frame/machine/dump_contents() + var/atom/drop_loc = drop_location() + + // We need a snowflake check for stack items since they don't exist anymore + for(var/component in circuit?.req_components) + if(!ispath(component, /obj/item/stack)) + continue + var/obj/item/stack/stack_path = component + var/stack_amount = circuit.req_components[component] - req_components[component] + if(stack_amount > 0) + new stack_path(drop_loc, stack_amount) + + // Rest of the stuff can just be spat out (this includes the circuitboard0) + for(var/component in components) + if(ismovable(component)) + var/atom/movable/atom_component = component + atom_component.forceMove(drop_loc) + + else if(istype(component, /datum/stock_part)) + var/datum/stock_part/stock_part_datum = component + var/physical_object_type = initial(stock_part_datum.physical_object_type) + new physical_object_type(drop_loc) + + else + stack_trace("Invalid component [component] was found in constructable frame") + + components = null + req_components = null + req_component_names = null + +/obj/structure/frame/machine/install_board(mob/living/user, obj/item/circuitboard/machine/board, by_hand = TRUE) + if(state == FRAME_STATE_EMPTY) + balloon_alert(user, "needs wiring!") + return FALSE + if(state == FRAME_STATE_BOARD_INSTALLED) + balloon_alert(user, "circuit already installed!") + return FALSE + if(!anchored && istype(board) && board.needs_anchored) + balloon_alert(user, "frame must be anchored!") + return FALSE + + return ..() + +/obj/structure/frame/machine/circuit_added(obj/item/circuitboard/machine/added) + state = FRAME_STATE_BOARD_INSTALLED + update_appearance(UPDATE_ICON_STATE) + + //add circuit board as the first component to the list of components + //required for part_replacer to locate it while exchanging parts + //so it does not early return in /obj/machinery/proc/exchange_parts + components = list(circuit) + req_components = added.req_components.Copy() + if(!req_components) + return + + //creates a list of names from all the required parts + req_component_names = list() + for(var/component_path in req_components) + if(!ispath(component_path)) + continue + + if(ispath(component_path, /obj/item/stack)) + var/obj/item/stack/stack_path = component_path + if(initial(stack_path.singular_name)) + req_component_names[component_path] = initial(stack_path.singular_name) + else + req_component_names[component_path] = initial(stack_path.name) + else if(ispath(component_path, /datum/stock_part)) + var/datum/stock_part/stock_part = component_path + var/obj/item/physical_object_type = initial(stock_part.physical_object_type) + + req_component_names[component_path] = initial(physical_object_type.name) + else if(ispath(component_path, /obj/item/stock_parts)) + var/obj/item/stock_parts/stock_part = component_path + + if(!added.specific_parts && initial(stock_part.base_name)) + req_component_names[component_path] = initial(stock_part.base_name) + else + req_component_names[component_path] = initial(stock_part.name) + else if(ispath(component_path, /obj/item)) + var/obj/item/part = component_path + + req_component_names[component_path] = initial(part.name) + else + stack_trace("Invalid component part [component_path] in [type], couldn't get its name") + req_component_names[component_path] = "[component_path] (this is a bug)" + +/obj/structure/frame/machine/circuit_removed(obj/item/circuitboard/machine/removed) + components -= removed + state = FRAME_STATE_WIRED + update_appearance(UPDATE_ICON_STATE) + +/** + * Returns the instance of path1 in list, else path2 in list + * + * Arguments + * * parts - the list of parts to search + * * path1 - the first path to search for + * * path2 - the second path to search for, if path1 is not found + */ +/obj/structure/frame/machine/proc/look_for(list/parts, path1, path2) + PRIVATE_PROC(TRUE) + + return (locate(path1) in parts) || (path2 ? (locate(path2) in parts) : null) + +/obj/structure/frame/machine/install_parts_from_part_replacer(mob/living/user, obj/item/storage/part_replacer/replacer, no_sound = FALSE) + if(!length(replacer.contents)) + return FALSE + var/amt = 0 + for(var/path in req_components) + amt += req_components[path] + if(!amt) + return FALSE + + var/play_sound = FALSE + var/list/part_list = replacer.get_sorted_parts() //parts sorted in order of tier + for(var/path in req_components) + var/target_path + if(ispath(path, /datum/stock_part)) + var/datum/stock_part/datum_part = path + target_path = initial(datum_part.physical_object_base_type) + else + target_path = path + + var/obj/item/part + while(req_components[path] > 0 && (part = look_for(part_list, target_path, ispath(path, /obj/item/stack/ore/bluespace_crystal) ? /obj/item/stack/sheet/bluespace_crystal : null))) + part_list -= part + if(istype(part, /obj/item/stack)) + var/obj/item/stack/S = part + var/used_amt = min(round(S.get_amount()), req_components[path]) + var/stack_name = S.singular_name + if(!used_amt || !S.use(used_amt)) + continue + req_components[path] -= used_amt + // No balloon alert here so they can look back and see what they added + to_chat(user, span_notice("You add [used_amt] [stack_name] to [src].")) + play_sound = TRUE + else if(replacer.atom_storage.attempt_remove(part, src)) + var/stock_part_datum = GLOB.stock_part_datums_per_object[part.type] + if (!isnull(stock_part_datum)) + components += stock_part_datum + qdel(part) + else + components += part + part.forceMove(src) + req_components[path]-- + // No balloon alert here so they can look back and see what they added + to_chat(user, span_notice("You add [part] to [src].")) + play_sound = TRUE + + if(play_sound && !no_sound) + replacer.play_rped_sound() + if(replacer.works_from_distance) + user.Beam(src, icon_state = "rped_upgrade", time = 0.5 SECONDS) + return TRUE + +/obj/structure/frame/machine/can_be_unfasten_wrench(mob/user, silent) + . = ..() + if(. != SUCCESSFUL_UNFASTEN) + return . + + if(circuit?.needs_anchored) + balloon_alert(user, "frame must be anchored!") + return FAILED_UNFASTEN + + return . + +/obj/structure/frame/machine/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + if(state != FRAME_STATE_BOARD_INSTALLED) + return . + + if(finalize_construction(user, tool)) + return ITEM_INTERACT_SUCCESS + + return ITEM_INTERACT_BLOCKING + +/obj/structure/frame/machine/wirecutter_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return NONE + if(state != FRAME_STATE_WIRED) + return ITEM_INTERACT_BLOCKING + + balloon_alert(user, "removing cables...") + if(!tool.use_tool(src, user, 2 SECONDS, volume = 50) || state != FRAME_STATE_WIRED) + return ITEM_INTERACT_BLOCKING + + state = FRAME_STATE_EMPTY + update_appearance(UPDATE_ICON_STATE) + new /obj/item/stack/cable_coil(drop_location(), 5) + return ITEM_INTERACT_SUCCESS + +/obj/structure/frame/machine/crowbar_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return NONE + if(state != FRAME_STATE_BOARD_INSTALLED) + return ITEM_INTERACT_BLOCKING + + tool.play_tool_sound(src) + var/list/leftover_components = components.Copy() - circuit + dump_contents() + balloon_alert(user, "circuit board[length(leftover_components) ? " and components" : ""] removed") + // Circuit exited handles updating state + return ITEM_INTERACT_SUCCESS + +/** + * Attempts to add the passed part to the frame + * + * Requires no sanity check that the passed part is a stock part + * + * Arguments + * * user - the player + * * tool - the part to add + */ +/obj/structure/frame/machine/proc/add_part(mob/living/user, obj/item/tool) + PRIVATE_PROC(TRUE) + + for(var/stock_part_base in req_components) + if (req_components[stock_part_base] == 0) + continue + + var/stock_part_path + + if(ispath(stock_part_base, /obj/item)) + stock_part_path = stock_part_base + else if(ispath(stock_part_base, /datum/stock_part)) + var/datum/stock_part/stock_part_datum_type = stock_part_base + stock_part_path = initial(stock_part_datum_type.physical_object_type) + else + stack_trace("Bad stock part in req_components: [stock_part_base]") + continue + + //if we require an bluespace crystall and we have an full sheet of them we can allow that + if(ispath(stock_part_path, /obj/item/stack/ore/bluespace_crystal) && istype(tool, /obj/item/stack/sheet/bluespace_crystal)) + pass() //allow it + else if(!istype(tool, stock_part_path)) + continue + + if(isstack(tool)) + var/obj/item/stack/S = tool + var/used_amt = min(round(S.get_amount()), req_components[stock_part_path]) + if(used_amt && S.use(used_amt)) + req_components[stock_part_path] -= used_amt + // No balloon alert here so they can look back and see what they added + to_chat(user, span_notice("You add [tool] to [src].")) + return + + // We might end up qdel'ing the part if it's a stock part datum. + // In practice, this doesn't have side effects to the name, + // but academically we should not be using an object after it's deleted. + var/part_name = "[tool]" + + if (ispath(stock_part_base, /datum/stock_part)) + // We can't just reuse stock_part_path here or its singleton, + // or else putting in a tier 2 part will deconstruct to a tier 1 part. + var/stock_part_datum = GLOB.stock_part_datums_per_object[tool.type] + if (isnull(stock_part_datum)) + stack_trace("tool.type] does not have an associated stock part datum!") + continue + + components += stock_part_datum + + // We regenerate the stock parts on deconstruct. + // This technically means we lose unique qualities of the stock part, but + // it's worth it for how dramatically this simplifies the code. + // The only place I can see it affecting anything is like...RPG qualities. :P + qdel(tool) + else if(user.transferItemToLoc(tool, src)) + components += tool + else + break + + // No balloon alert here so they can look back and see what they added + to_chat(user, span_notice("You add [part_name] to [src].")) + req_components[stock_part_base]-- + return TRUE + + balloon_alert(user, "can't add that!") + return FALSE + +/obj/structure/frame/machine/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + + switch(state) + if(FRAME_STATE_EMPTY) + if(istype(tool, /obj/item/stack/cable_coil)) + if(!tool.tool_start_check(user, amount = 5)) + return ITEM_INTERACT_BLOCKING + + balloon_alert(user, "adding cables...") + if(!tool.use_tool(src, user, 2 SECONDS, volume = 50, amount = 5) || state != FRAME_STATE_EMPTY) + return ITEM_INTERACT_BLOCKING + + state = FRAME_STATE_WIRED + update_appearance(UPDATE_ICON_STATE) + return ITEM_INTERACT_SUCCESS + + if(FRAME_STATE_WIRED) + if(isnull(circuit) && istype(tool, /obj/item/storage/part_replacer)) + return install_circuit_from_part_replacer(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + + if(FRAME_STATE_BOARD_INSTALLED) + if(istype(tool, /obj/item/storage/part_replacer)) + return install_parts_from_part_replacer(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + + if(!user.combat_mode) + return add_part(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + + return . + +/** + * Attempt to finalize the construction of the frame into a machine + * as according to our circuit and parts + * + * If successful, results in qdel'ing the frame and newing of a machine + * + * Arguments + * * user - the player + * * tool - the tool used to finalize the construction + */ +/obj/structure/frame/machine/finalize_construction(mob/living/user, obj/item/tool) + for(var/component in req_components) + if(req_components[component] > 0) + user.balloon_alert(user, "missing components!") + return FALSE + + tool.play_tool_sound(src) + var/obj/machinery/new_machine = new circuit.build_path(loc) + if(istype(new_machine)) + new_machine.clear_components() + // Set anchor state + new_machine.set_anchored(anchored) + // Prevent us from dropping stuff thanks to /Exited + var/obj/item/circuitboard/machine/leaving_circuit = circuit + circuit = null + // Assign the circuit & parts & move them all at once into the machine + // no need to seperatly move circuit board as its already part of the components list + new_machine.circuit = leaving_circuit + new_machine.component_parts = components + for (var/obj/new_part in components) + new_part.forceMove(new_machine) + //Inform machine that its finished & cleanup + new_machine.RefreshParts() + new_machine.on_construction(user) + components = null + qdel(src) + return TRUE + +/obj/structure/frame/machine/secured + state = FRAME_STATE_WIRED + anchored = TRUE diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm index d88c9c8209996..eb75dfbfa3aac 100644 --- a/code/game/machinery/medical_kiosk.dm +++ b/code/game/machinery/medical_kiosk.dm @@ -239,6 +239,7 @@ var/blood_percent = round((patient.blood_volume / BLOOD_VOLUME_NORMAL)*100) var/blood_type = patient.dna.blood_type var/blood_warning = " " + var/blood_alcohol = patient.get_blood_alcohol_content() for(var/thing in patient.diseases) //Disease Information var/datum/disease/D = thing @@ -354,6 +355,7 @@ data["bleed_status"] = bleed_status data["blood_levels"] = blood_percent - (chaos_modifier * (rand(1,35))) data["blood_status"] = blood_status + data["blood_alcohol"] = blood_alcohol data["chemical_list"] = chemical_list data["overdose_list"] = overdose_list data["addict_list"] = addict_list diff --git a/code/game/machinery/newscaster/newscaster_machine.dm b/code/game/machinery/newscaster/newscaster_machine.dm index e667fe5b96f94..7f3d8ea806f46 100644 --- a/code/game/machinery/newscaster/newscaster_machine.dm +++ b/code/game/machinery/newscaster/newscaster_machine.dm @@ -534,12 +534,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) -/obj/machinery/newscaster/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 2) - new /obj/item/shard(loc) - new /obj/item/shard(loc) - qdel(src) +/obj/machinery/newscaster/on_deconstruction(disassembled) + new /obj/item/stack/sheet/iron(loc, 2) + new /obj/item/shard(loc) + new /obj/item/shard(loc) /obj/machinery/newscaster/atom_break(damage_flag) . = ..() diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 22f66fd1de73d..af6b477e90ba8 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -85,6 +85,16 @@ Buildable meters /obj/item/pipe/quaternary/pipe icon_state_preview = "manifold4w" pipe_type = /obj/machinery/atmospherics/pipe/smart +/obj/item/pipe/quaternary/pipe/crafted + +/obj/item/pipe/quaternary/pipe/crafted/Initialize(mapload, _pipe_type, _dir, obj/machinery/atmospherics/make_from, device_color, device_init_dir = SOUTH) + . = ..() + pipe_type = /obj/machinery/atmospherics/pipe/smart + pipe_color = COLOR_VERY_LIGHT_GRAY + p_init_dir = ALL_CARDINALS + setDir(SOUTH) + update() + /obj/item/pipe/quaternary/he_pipe icon_state_preview = "he_manifold4w" pipe_type = /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w @@ -251,6 +261,23 @@ Buildable meters qdel(src) +/obj/item/pipe/welder_act(mob/living/user, obj/item/welder) + . = ..() + if(istype(pipe_type, /obj/machinery/atmospherics/components)) + return TRUE + if(!welder.tool_start_check(user, amount=2)) + return TRUE + add_fingerprint(user) + + if(welder.use_tool(src, user, 2 SECONDS, volume=2)) + new /obj/item/sliced_pipe(drop_location()) + user.visible_message( \ + "[user] welds \the [src] in two.", \ + span_notice("You weld \the [src] in two."), \ + span_hear("You hear welding.")) + + qdel(src) + /** * Attempt to automatically resolve a pipe conflict by reconfiguring any smart pipes involved. * diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 76b1b73ba53f3..809171af1efa7 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -402,9 +402,6 @@ DEFINE_BITFIELD(turret_flags, list( /obj/machinery/porta_turret/proc/reset_attacked() turret_flags &= ~TURRET_FLAG_SHOOT_ALL_REACT -/obj/machinery/porta_turret/deconstruct(disassembled = TRUE) - qdel(src) - /obj/machinery/porta_turret/atom_break(damage_flag) . = ..() if(.) @@ -1171,7 +1168,7 @@ DEFINE_BITFIELD(turret_flags, list( if(properties["team_color"]) team_color = properties["team_color"] -/obj/machinery/porta_turret/lasertag/ui_status(mob/user) +/obj/machinery/porta_turret/lasertag/ui_status(mob/user, datum/ui_state/state) if(ishuman(user)) var/mob/living/carbon/human/H = user if(team_color == "blue" && istype(H.wear_suit, /obj/item/clothing/suit/redtag)) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 0f6002c97253d..1014393c00836 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -83,6 +83,12 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS +/obj/machinery/recycler/can_be_unfasten_wrench(mob/user, silent) + if(!(isfloorturf(loc) || isindestructiblefloor(loc)) && !anchored) + to_chat(user, span_warning("[src] needs to be on the floor to be secured!")) + return FAILED_UNFASTEN + return SUCCESSFUL_UNFASTEN + /obj/machinery/recycler/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I)) return @@ -241,7 +247,7 @@ L.Unconscious(100) L.adjustBruteLoss(crush_damage) -/obj/machinery/recycler/on_deconstruction() +/obj/machinery/recycler/on_deconstruction(disassembled) safety_mode = TRUE /obj/machinery/recycler/deathtrap diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index b31b982f911d9..54bdeb666d95f 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -394,10 +394,8 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) return return ..() -/obj/machinery/requests_console/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/wallframe/requests_console(loc) - qdel(src) +/obj/machinery/requests_console/on_deconstruction(disassembled) + new /obj/item/wallframe/requests_console(loc) /obj/machinery/requests_console/auto_name // Register an autoname variant and then make the directional helpers before undefing all the magic bits auto_name = TRUE diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index ddfe76f56af1d..b7eec3994b8d1 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -10,7 +10,7 @@ #define JACKPOT 10000 #define SPIN_TIME 65 //As always, deciseconds. #define REEL_DEACTIVATE_DELAY 7 -#define SEVEN "7" +#define JACKPOT_SEVENS FA_ICON_7 #define HOLOCHIP 1 #define COIN 2 @@ -24,7 +24,7 @@ density = TRUE circuit = /obj/item/circuitboard/computer/slot_machine light_color = LIGHT_COLOR_BROWN - interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_SET_MACHINE // don't need to be literate to play slots + interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON // don't need to be literate to play slots var/money = 3000 //How much money it has CONSUMED var/plays = 0 var/working = FALSE @@ -32,9 +32,19 @@ var/jackpots = 0 var/paymode = HOLOCHIP //toggles between HOLOCHIP/COIN, defined above var/cointype = /obj/item/coin/iron //default cointype + /// Icons that can be displayed by the slot machine. + var/static/list/icons = list( + FA_ICON_LEMON = list("value" = 2, "colour" = "yellow"), + FA_ICON_STAR = list("value" = 2, "colour" = "yellow"), + FA_ICON_BOMB = list("value" = 2, "colour" = "red"), + FA_ICON_BIOHAZARD = list("value" = 2, "colour" = "green"), + FA_ICON_APPLE_WHOLE = list("value" = 2, "colour" = "red"), + FA_ICON_7 = list("value" = 1, "colour" = "yellow"), + FA_ICON_DOLLAR_SIGN = list("value" = 2, "colour" = "green"), + ) + var/static/list/coinvalues var/list/reels = list(list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0) - var/list/symbols = list(SEVEN = 1, "&" = 2, "@" = 2, "$" = 2, "?" = 2, "#" = 2, "!" = 2, "%" = 2) //if people are winning too much, multiply every number in this list by 2 and see if they are still winning too much. var/static/list/ray_filter = list(type = "rays", y = 16, size = 40, density = 4, color = COLOR_RED_LIGHT, factor = 15, flags = FILTER_OVERLAY) /obj/machinery/computer/slot_machine/Initialize(mapload) @@ -42,13 +52,13 @@ jackpots = rand(1, 4) //false hope plays = rand(75, 200) - INVOKE_ASYNC(src, PROC_REF(toggle_reel_spin), TRUE)//The reels won't spin unless we activate them + toggle_reel_spin_sync(1) //The reels won't spin unless we activate them var/list/reel = reels[1] for(var/i in 1 to reel.len) //Populate the reels. randomize_reels() - INVOKE_ASYNC(src, PROC_REF(toggle_reel_spin), FALSE) + toggle_reel_spin_sync(0) if (isnull(coinvalues)) coinvalues = list() @@ -84,46 +94,49 @@ icon_screen = "slots_screen" return ..() -/obj/machinery/computer/slot_machine/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/coin)) - var/obj/item/coin/C = I + +/obj/machinery/computer/slot_machine/item_interaction(mob/living/user, obj/item/inserted, list/modifiers, is_right_clicking) + if(istype(inserted, /obj/item/coin)) + var/obj/item/coin/inserted_coin = inserted if(paymode == COIN) if(prob(2)) - if(!user.transferItemToLoc(C, drop_location(), silent = FALSE)) + if(!user.transferItemToLoc(inserted_coin, drop_location(), silent = FALSE)) return - C.throw_at(user, 3, 10) + inserted_coin.throw_at(user, 3, 10) if(prob(10)) balance = max(balance - SPIN_PRICE, 0) to_chat(user, span_warning("[src] spits your coin back out!")) else - if(!user.temporarilyRemoveItemFromInventory(C)) + if(!user.temporarilyRemoveItemFromInventory(inserted_coin)) return - to_chat(user, span_notice("You insert [C] into [src]'s slot!")) - balance += C.value - qdel(C) + balloon_alert(user, "coin insterted") + balance += inserted_coin.value + qdel(inserted_coin) else - to_chat(user, span_warning("This machine is only accepting holochips!")) - else if(istype(I, /obj/item/holochip)) + balloon_alert(user, "holochips only!") + + else if(istype(inserted, /obj/item/holochip)) if(paymode == HOLOCHIP) - var/obj/item/holochip/H = I - if(!user.temporarilyRemoveItemFromInventory(H)) + var/obj/item/holochip/inserted_chip = inserted + if(!user.temporarilyRemoveItemFromInventory(inserted_chip)) return - to_chat(user, span_notice("You insert [H.credits] holocredits into [src]'s slot!")) - balance += H.credits - qdel(H) + balloon_alert(user, "[inserted_chip.credits] credit[inserted_chip.credits == 1 ? "" : "s"] inserted") + balance += inserted_chip.credits + qdel(inserted_chip) else - to_chat(user, span_warning("This machine is only accepting coins!")) - else if(I.tool_behaviour == TOOL_MULTITOOL) + balloon_alert(user, "coins only!") + + else if(inserted.tool_behaviour == TOOL_MULTITOOL) if(balance > 0) visible_message("[src] says, 'ERROR! Please empty the machine balance before altering paymode'") //Prevents converting coins into holocredits and vice versa else if(paymode == HOLOCHIP) paymode = COIN - visible_message("[src] says, 'This machine now works with COINS!'") + balloon_alert(user, "now using coins") else paymode = HOLOCHIP - visible_message("[src] says, 'This machine now works with HOLOCHIPS!'") + balloon_alert(user, "now using holochips") else return ..() @@ -138,49 +151,54 @@ balloon_alert(user, "machine rigged") return TRUE -/obj/machinery/computer/slot_machine/ui_interact(mob/living/user) +/obj/machinery/computer/slot_machine/ui_interact(mob/living/user, datum/tgui/ui) + . = ..() + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "SlotMachine", name) + ui.open() + +/obj/machinery/computer/slot_machine/ui_static_data(mob/user) + var/list/data = list() + data["icons"] = list() + for(var/icon_name in icons) + var/list/icon = icons[icon_name] + icon += list("icon" = icon_name) + data["icons"] += list(icon) + data["cost"] = SPIN_PRICE + data["jackpot"] = JACKPOT + + return data + +/obj/machinery/computer/slot_machine/ui_data(mob/user) + var/list/data = list() + var/list/reel_states = list() + for(var/reel_state in reels) + reel_states += list(reel_state) + data["state"] = reel_states + data["balance"] = balance + data["working"] = working + data["money"] = money + data["plays"] = plays + data["jackpots"] = jackpots + data["paymode"] = paymode + return data + + +/obj/machinery/computer/slot_machine/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() - var/reeltext = {"
- /*****^*****^*****^*****^*****\\
- | \[[reels[1][1]]\] | \[[reels[2][1]]\] | \[[reels[3][1]]\] | \[[reels[4][1]]\] | \[[reels[5][1]]\] |
- | \[[reels[1][2]]\] | \[[reels[2][2]]\] | \[[reels[3][2]]\] | \[[reels[4][2]]\] | \[[reels[5][2]]\] |
- | \[[reels[1][3]]\] | \[[reels[2][3]]\] | \[[reels[3][3]]\] | \[[reels[4][3]]\] | \[[reels[5][3]]\] |
- \\*****v*****v*****v*****v*****/
-
"} - - var/dat - if(working) - dat = reeltext - - else - dat = {"Five credits to play!
- Prize Money Available: [money] (jackpot payout is ALWAYS 100%!)
- Credit Remaining: [balance]
- [plays] players have tried their luck today, and [jackpots] have won a jackpot!
-

- Play!
-
- [reeltext] -
"} - if(balance > 0) - dat+="Refund balance
" - - var/datum/browser/popup = new(user, "slotmachine", "Slot Machine") - popup.set_content(dat) - popup.open() - -/obj/machinery/computer/slot_machine/Topic(href, href_list) - . = ..() //Sanity checks. if(.) - return . - - if(href_list["spin"]) - spin(usr) + return - else if(href_list["refund"]) - if(balance > 0) - give_payout(balance) - balance = 0 + switch(action) + if("spin") + spin(ui.user) + return TRUE + if("payout") + if(balance > 0) + give_payout(balance) + balance = 0 + return TRUE /obj/machinery/computer/slot_machine/emp_act(severity) . = ..() @@ -214,8 +232,6 @@ toggle_reel_spin(1) update_appearance() - updateDialog() - var/spin_loop = addtimer(CALLBACK(src, PROC_REF(do_spin)), 2, TIMER_LOOP|TIMER_STOPPABLE) addtimer(CALLBACK(src, PROC_REF(finish_spinning), spin_loop, user, the_name), SPIN_TIME - (REEL_DEACTIVATE_DELAY * reels.len)) @@ -223,7 +239,6 @@ /obj/machinery/computer/slot_machine/proc/do_spin() randomize_reels() - updateDialog() use_power(active_power_usage) /obj/machinery/computer/slot_machine/proc/finish_spinning(spin_loop, mob/user, the_name) @@ -232,50 +247,64 @@ deltimer(spin_loop) give_prizes(the_name, user) update_appearance() - updateDialog() +/// Check if the machine can be spun /obj/machinery/computer/slot_machine/proc/can_spin(mob/user) if(machine_stat & NOPOWER) - to_chat(user, span_warning("The slot machine has no power!")) + balloon_alert(user, "no power!") return FALSE if(machine_stat & BROKEN) - to_chat(user, span_warning("The slot machine is broken!")) + balloon_alert(user, "machine broken!") return FALSE if(working) - to_chat(user, span_warning("You need to wait until the machine stops spinning before you can play again!")) + balloon_alert(user, "already spinning!") return FALSE if(balance < SPIN_PRICE) - to_chat(user, span_warning("Insufficient money to play!")) + balloon_alert(user, "insufficient balance!") return FALSE return TRUE +/// Sets the spinning states of all reels to value, with a delay between them /obj/machinery/computer/slot_machine/proc/toggle_reel_spin(value, delay = 0) //value is 1 or 0 aka on or off for(var/list/reel in reels) if(!value) playsound(src, 'sound/machines/ding_short.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) reels[reel] = value - sleep(delay) + if(delay) + sleep(delay) +/// Same as toggle_reel_spin, but without the delay and runs synchronously +/obj/machinery/computer/slot_machine/proc/toggle_reel_spin_sync(value) + for(var/list/reel in reels) + reels[reel] = value + +/// Randomize the states of all reels /obj/machinery/computer/slot_machine/proc/randomize_reels() for(var/reel in reels) if(reels[reel]) reel[3] = reel[2] reel[2] = reel[1] - reel[1] = pick(symbols) + var/chosen = pick(icons) + reel[1] = icons[chosen] + list("icon_name" = chosen) +/// Checks if any prizes have been won, and pays them out /obj/machinery/computer/slot_machine/proc/give_prizes(usrname, mob/user) var/linelength = get_lines() var/did_player_win = TRUE - if(reels[1][2] + reels[2][2] + reels[3][2] + reels[4][2] + reels[5][2] == "[SEVEN][SEVEN][SEVEN][SEVEN][SEVEN]") - visible_message("[src] says, 'JACKPOT! You win [money] credits!'") + if(check_jackpot(FA_ICON_BOMB)) + var/obj/item/grenade/flashbang/bang = new(get_turf(src)) + bang.arm_grenade(null, 1 SECONDS) + + else if(check_jackpot(JACKPOT_SEVENS)) + var/prize = money + JACKPOT + visible_message("[src] says, 'JACKPOT! You win [prize] credits!'") priority_announce("Congratulations to [user ? user.real_name : usrname] for winning the jackpot at the slot machine in [get_area(src)]!") jackpots += 1 - balance += money - give_payout(JACKPOT) money = 0 if(paymode == HOLOCHIP) - new /obj/item/holochip(loc, JACKPOT) + new /obj/item/holochip(loc, prize) else for(var/i in 1 to 5) cointype = pick(subtypesof(/obj/item/coin)) @@ -298,7 +327,8 @@ money = max(money - SPIN_PRICE * 4, money) else - to_chat(user, span_warning("No luck!")) + balloon_alert(user, "no luck!") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50) did_player_win = FALSE if(did_player_win) @@ -307,31 +337,38 @@ addtimer(CALLBACK(src, TYPE_PROC_REF(/datum, remove_filter), "jackpot_rays"), 3 SECONDS) playsound(src, 'sound/machines/roulettejackpot.ogg', 50, TRUE) +/// Checks for a jackpot (5 matching icons in the middle row) with the given icon name +/obj/machinery/computer/slot_machine/proc/check_jackpot(name) + return reels[1][2]["icon_name"] + reels[2][2]["icon_name"] + reels[3][2]["icon_name"] + reels[4][2]["icon_name"] + reels[5][2]["icon_name"] == "[name][name][name][name][name]" + +/// Finds the largest number of consecutive matching icons in a row /obj/machinery/computer/slot_machine/proc/get_lines() var/amountthesame for(var/i in 1 to 3) - var/inputtext = reels[1][i] + reels[2][i] + reels[3][i] + reels[4][i] + reels[5][i] - for(var/symbol in symbols) + var/inputtext = reels[1][i]["icon_name"] + reels[2][i]["icon_name"] + reels[3][i]["icon_name"] + reels[4][i]["icon_name"] + reels[5][i]["icon_name"] + for(var/icon in icons) var/j = 3 //The lowest value we have to check for. - var/symboltext = symbol + symbol + symbol + var/symboltext = icon + icon + icon while(j <= 5) if(findtext(inputtext, symboltext)) amountthesame = max(j, amountthesame) j++ - symboltext += symbol + symboltext += icon if(amountthesame) break return amountthesame +/// Give the specified amount of money. If the amount is greater than the amount of prize money available, add the difference as balance /obj/machinery/computer/slot_machine/proc/give_money(amount) - var/amount_to_give = money >= amount ? amount : money - var/surplus = amount_to_give - give_payout(amount_to_give) - money = max(0, money - amount) + var/amount_to_give = min(amount, money) + var/surplus = amount - give_payout(amount_to_give) + money -= amount_to_give balance += surplus +/// Pay out the specified amount in either coins or holochips /obj/machinery/computer/slot_machine/proc/give_payout(amount) if(paymode == HOLOCHIP) cointype = /obj/item/holochip @@ -348,23 +385,25 @@ return amount -/obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/coin/silver, mob/living/target, throwit = 0) +/// Dispense the given amount. If machine is set to use coins, will use the specified coin type. +/// If throwit and target are set, will launch the payment at the target +/obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/coin/silver, throwit = FALSE, mob/living/target) if(paymode == HOLOCHIP) - var/obj/item/holochip/H = new /obj/item/holochip(loc,amount) + var/obj/item/holochip/chip = new /obj/item/holochip(loc,amount) if(throwit && target) - H.throw_at(target, 3, 10) + chip.throw_at(target, 3, 10) else var/value = coinvalues["[cointype]"] if(value <= 0) CRASH("Coin value of zero, refusing to payout in dispenser") while(amount >= value) - var/obj/item/coin/C = new cointype(loc) //DOUBLE THE PAIN + var/obj/item/coin/thrown_coin = new cointype(loc) //DOUBLE THE PAIN amount -= value if(throwit && target) - C.throw_at(target, 3, 10) + thrown_coin.throw_at(target, 3, 10) else - random_step(C, 2, 40) + random_step(thrown_coin, 2, 40) playsound(src, pick(list('sound/machines/coindrop.ogg', 'sound/machines/coindrop2.ogg')), 50, TRUE) return amount @@ -374,7 +413,7 @@ #undef HOLOCHIP #undef JACKPOT #undef REEL_DEACTIVATE_DELAY -#undef SEVEN +#undef JACKPOT_SEVENS #undef SMALL_PRIZE #undef SPIN_PRICE #undef SPIN_TIME diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index d5dfc335c7c6d..6a5b53e2a0bdc 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -81,7 +81,7 @@ set_panel_open(TRUE) QDEL_NULL(cell) -/obj/machinery/space_heater/on_deconstruction() +/obj/machinery/space_heater/on_deconstruction(disassembled) if(cell) LAZYADD(component_parts, cell) cell = null diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 43e801384c36f..c1be0917bf352 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -72,16 +72,13 @@ update_appearance() return TRUE -/obj/machinery/status_display/deconstruct(disassembled = TRUE) - if(obj_flags & NO_DECONSTRUCTION) - return +/obj/machinery/status_display/on_deconstruction(disassembled) if(!disassembled) new /obj/item/stack/sheet/iron(drop_location(), 2) new /obj/item/shard(drop_location()) new /obj/item/shard(drop_location()) else new /obj/item/wallframe/status_display(drop_location()) - qdel(src) /// Immediately change the display to the given picture. /obj/machinery/status_display/proc/set_picture(state) @@ -545,6 +542,19 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) connected_display.receive_signal(status_signal) +/obj/machinery/status_display/random_message + current_mode = SD_MESSAGE + /// list to pick the first line from + var/list/firstline_to_secondline = list() + +/obj/machinery/status_display/random_message/Initialize(mapload, ndir, building) + if(firstline_to_secondline?.len) + message1 = pick(firstline_to_secondline) + message2 = firstline_to_secondline[message1] + return ..() // status displays call update appearance on init so i suppose we should set the messages before calling parent as to not call it twice + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/random_message, 32) + #undef MAX_STATIC_WIDTH #undef FONT_STYLE #undef SCROLL_RATE diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 0bf6bf7872d34..b34f7873648cd 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -307,13 +307,9 @@ storage = null set_occupant(null) -/obj/machinery/suit_storage_unit/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - open_machine() - dump_inventory_contents() - if(card_reader_installed) - new /obj/item/stock_parts/card_reader(loc) - return ..() +/obj/machinery/suit_storage_unit/on_deconstruction(disassembled) + if(card_reader_installed) + new /obj/item/stock_parts/card_reader(loc) /obj/machinery/suit_storage_unit/proc/access_check(mob/living/user) if(!isnull(id_card)) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index bc1523bde0ea0..ebe24b449748b 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -584,6 +584,70 @@ qdel(src) +#define DIMENSION_CHOICE_RANDOM "None/Randomized" + +/obj/item/bombcore/dimensional + name = "multi-dimensional payload" + desc = "A wicked payload meant to wildly transmutate terrain over a wide area, a power no mere human should wield." + range_heavy = 17 + var/datum/dimension_theme/chosen_theme + +/obj/item/bombcore/dimensional/Destroy() + chosen_theme = null + return ..() + +/obj/item/bombcore/dimensional/examine(mob/user) + . = ..() + . += span_notice("Use in hand to change the linked dimension. Current dimension: [chosen_theme?.name || "None, output will be random"].") + +/obj/item/bombcore/dimensional/attack_self(mob/user) + . = ..() + var/list/choosable_dimensions = list() + var/datum/radial_menu_choice/null_choice = new + null_choice.name = DIMENSION_CHOICE_RANDOM + choosable_dimensions[DIMENSION_CHOICE_RANDOM] = null_choice + for(var/datum/dimension_theme/theme as anything in SSmaterials.dimensional_themes) + var/datum/radial_menu_choice/theme_choice = new + theme_choice.image = image(initial(theme.icon), initial(theme.icon_state)) + theme_choice.name = initial(theme.name) + choosable_dimensions[theme] = theme_choice + + var/datum/dimension_theme/picked = show_radial_menu(user, src, choosable_dimensions, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 38, require_near = TRUE) + if(isnull(picked)) + return + if(picked == DIMENSION_CHOICE_RANDOM) + chosen_theme = null + else + chosen_theme = picked + balloon_alert(user, "set to [chosen_theme?.name || DIMENSION_CHOICE_RANDOM]") + +/obj/item/bombcore/dimensional/proc/check_menu(mob/user) + if(!user.is_holding(src) || user.incapacitated()) + return FALSE + return TRUE + +/obj/item/bombcore/dimensional/detonate() + var/list/affected_turfs = circle_range_turfs(src, range_heavy) + var/theme_count = length(SSmaterials.dimensional_themes) + var/num_affected = 0 + for(var/turf/affected as anything in affected_turfs) + var/datum/dimension_theme/theme_to_use + if(isnull(chosen_theme)) + theme_to_use = SSmaterials.dimensional_themes[SSmaterials.dimensional_themes[rand(1, theme_count)]] + else + theme_to_use = SSmaterials.dimensional_themes[chosen_theme] + if(!theme_to_use.can_convert(affected)) + continue + num_affected++ + var/skip_sound = TRUE + if(num_affected % 5) //makes it play the sound more sparingly + skip_sound = FALSE + var/time_mult = round(get_dist_euclidian(get_turf(src), affected)) + 1 + addtimer(CALLBACK(theme_to_use, TYPE_PROC_REF(/datum/dimension_theme, apply_theme), affected, skip_sound, TRUE), 0.1 SECONDS * time_mult) + qdel(src) + +#undef DIMENSION_CHOICE_RANDOM + ///Syndicate Detonator (aka the big red button)/// /obj/item/syndicatedetonator diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index de83d6d20dfa0..52644b8918bf9 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -415,10 +415,8 @@ GLOBAL_LIST_INIT(dye_registry, list( /obj/machinery/washing_machine/attack_ai_secondary(mob/user, modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/washing_machine/deconstruct(disassembled = TRUE) - if (!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(drop_location(), 2) - qdel(src) +/obj/machinery/washing_machine/on_deconstruction(disassembled) + new /obj/item/stack/sheet/iron(drop_location(), 2) /obj/machinery/washing_machine/open_machine(drop = TRUE, density_to_set = FALSE) . = ..() diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm index 02c3e024c2a36..530da56282788 100644 --- a/code/game/objects/effects/anomalies/_anomalies.dm +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -27,7 +27,8 @@ /obj/effect/anomaly/Initialize(mapload, new_lifespan, drops_core = TRUE) . = ..() - SSpoints_of_interest.make_point_of_interest(src) + if(!mapload) + SSpoints_of_interest.make_point_of_interest(src) START_PROCESSING(SSobj, src) impact_area = get_area(src) diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional.dm b/code/game/objects/effects/anomalies/anomalies_dimensional.dm index 9aea9dfea6a0c..16dd5bafcfaea 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional.dm @@ -21,6 +21,11 @@ animate(src, transform = matrix()*0.85, time = 3, loop = -1) animate(transform = matrix(), time = 3, loop = -1) +/obj/effect/anomaly/dimensional/Destroy() + theme = null + target_turfs = null + return ..() + /obj/effect/anomaly/dimensional/anomalyEffect(seconds_per_tick) . = ..() transmute_area() @@ -36,8 +41,7 @@ return var/turf/affected_turf = target_turfs[1] - new /obj/effect/temp_visual/transmute_tile_flash(affected_turf) - theme.apply_theme(affected_turf) + theme.apply_theme(affected_turf, show_effect = TRUE) target_turfs -= affected_turf /** @@ -47,7 +51,7 @@ /obj/effect/anomaly/dimensional/proc/prepare_area(new_theme_path) if (!new_theme_path) new_theme_path = pick(subtypesof(/datum/dimension_theme)) - theme = new new_theme_path() + theme = SSmaterials.dimensional_themes[new_theme_path] apply_theme_icon() target_turfs = list() diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm index 16408ea9ce6e0..c6190a0d84a21 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm @@ -1,4 +1,3 @@ - /** * Datum which describes a theme and replaces turfs and objects in specified locations to match that theme */ @@ -44,12 +43,16 @@ * * Arguments * * affected_turf - Turf to transform. + * * skip_sound - If the sound shouldn't be played. + * * show_effect - if the temp visual effect should be shown. */ -/datum/dimension_theme/proc/apply_theme(turf/affected_turf, skip_sound = FALSE) +/datum/dimension_theme/proc/apply_theme(turf/affected_turf, skip_sound = FALSE, show_effect = FALSE) if (!replace_turf(affected_turf)) return if (!skip_sound) playsound(affected_turf, sound, 100, TRUE) + if(show_effect) + new /obj/effect/temp_visual/transmute_tile_flash(affected_turf) for (var/obj/object in affected_turf) replace_object(object) if (length(random_spawns) && prob(random_spawn_chance) && !affected_turf.is_blocked_turf(exclude_mobs = TRUE)) @@ -250,7 +253,7 @@ /datum/dimension_theme/radioactive name = "Radioactive" icon = 'icons/obj/ore.dmi' - icon_state = "Uranium ore" + icon_state = "uranium" material = /datum/material/uranium sound = 'sound/items/welder.ogg' @@ -353,7 +356,14 @@ name = "Fancy" icon = 'icons/obj/clothing/head/costume.dmi' icon_state = "fancycrown" + replace_floors = null replace_walls = /turf/closed/wall/mineral/wood/nonmetal + replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/comfy = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), + ) + ///cooldown for changing carpets, It's kinda dull to always use the same one, but we also can't make it too random. + COOLDOWN_DECLARE(carpet_switch_cd) #define FANCY_CARPETS list(\ /turf/open/floor/eighties, \ @@ -369,14 +379,12 @@ /turf/open/floor/carpet/royalblack, \ /turf/open/floor/carpet/royalblue,) -/datum/dimension_theme/fancy/New() - . = ..() - replace_floors = list(pick(FANCY_CARPETS) = 1) - replace_objs = list( - /obj/structure/chair = list(/obj/structure/chair/comfy = 1), - /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), - /obj/structure/table/wood = list(pick(subtypesof(/obj/structure/table/wood/fancy)) = 1), - ) +/datum/dimension_theme/fancy/apply_theme(turf/affected_turf, skip_sound = FALSE, show_effect = FALSE) + if(COOLDOWN_FINISHED(src, carpet_switch_cd)) + replace_floors = list(pick(FANCY_CARPETS) = 1) + replace_objs[/obj/structure/table/wood] = list(pick(subtypesof(/obj/structure/table/wood/fancy)) = 1) + COOLDOWN_START(src, carpet_switch_cd, 90 SECONDS) + return ..() #undef FANCY_CARPETS diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index ab422dda3d156..d83440ee9bd36 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -162,19 +162,6 @@ var/time_left = max(0, (H.finish_time - world.time) / 10) return round(time_left) -/obj/effect/countdown/arena - invisibility = INVISIBILITY_NONE - name = "arena countdown" - -/obj/effect/countdown/arena/get_value() - var/obj/machinery/arena_spawn/A = attached_to - if(!istype(A)) - return - else - var/obj/machinery/computer/arena/C = A.get_controller() - var/time_left = max(0, (C.start_time - world.time) / 10) - return round(time_left) - /obj/effect/countdown/flower_bud name = "flower bud countdown" diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 66397ab841dd5..4a275199f3f55 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -12,6 +12,7 @@ var/dryname = "dried blood" //when the blood lasts long enough, it becomes dry and gets a new name var/drydesc = "Looks like it's been here a while. Eew." //as above var/drytime = 0 + var/footprint_sprite = null /obj/effect/decal/cleanable/blood/Initialize(mapload) . = ..() @@ -115,6 +116,7 @@ /obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases) . = ..() + AddElement(/datum/element/squish_sound) RegisterSignal(src, COMSIG_MOVABLE_PIPE_EJECTING, PROC_REF(on_pipe_eject)) /obj/effect/decal/cleanable/blood/gibs/Destroy() @@ -133,11 +135,6 @@ /obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target) return FALSE -/obj/effect/decal/cleanable/blood/gibs/on_entered(datum/source, atom/movable/L) - if(isliving(L) && has_gravity(loc)) - playsound(loc, 'sound/effects/footstep/gib_step.ogg', HAS_TRAIT(L, TRAIT_LIGHT_STEP) ? 20 : 50, TRUE) - return ..() - /obj/effect/decal/cleanable/blood/gibs/proc/on_pipe_eject(atom/source, direction) SIGNAL_HANDLER @@ -234,7 +231,7 @@ name = "footprints" desc = "WHOSE FOOTPRINTS ARE THESE?" icon = 'icons/effects/footprints.dmi' - icon_state = "blood1" + icon_state = "blood_shoes_enter" random_icon_states = null blood_state = BLOOD_STATE_HUMAN //the icon state to load images from var/entered_dirs = 0 @@ -249,12 +246,13 @@ dryname = "dried footprints" drydesc = "HMM... SOMEONE WAS HERE!" -/obj/effect/decal/cleanable/blood/footprints/Initialize(mapload) +/obj/effect/decal/cleanable/blood/footprints/Initialize(mapload, footprint_sprite) + src.footprint_sprite = footprint_sprite . = ..() icon_state = "" //All of the footprint visuals come from overlays if(mapload) entered_dirs |= dir //Keep the same appearance as in the map editor - update_appearance() + update_appearance(mapload ? (ALL) : (UPDATE_NAME | UPDATE_DESC)) //Rotate all of the footprint directions too /obj/effect/decal/cleanable/blood/footprints/setDir(newdir) @@ -276,6 +274,21 @@ update_appearance() return ..() +/obj/effect/decal/cleanable/blood/footprints/update_name(updates) + switch(footprint_sprite) + if(FOOTPRINT_SPRITE_CLAWS) + name = "clawprints" + if(FOOTPRINT_SPRITE_SHOES) + name = "footprints" + if(FOOTPRINT_SPRITE_PAWS) + name = "pawprints" + dryname = "dried [name]" + return ..() + +/obj/effect/decal/cleanable/blood/footprints/update_desc(updates) + desc = "WHOSE [uppertext(name)] ARE THESE?" + return ..() + /obj/effect/decal/cleanable/blood/footprints/update_icon() . = ..() alpha = min(BLOODY_FOOTPRINT_BASE_ALPHA + (255 - BLOODY_FOOTPRINT_BASE_ALPHA) * bloodiness / (BLOOD_ITEM_MAX / 2), 255) @@ -290,22 +303,22 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) . = ..() for(var/Ddir in GLOB.cardinals) if(entered_dirs & Ddir) - var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] + var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[footprint_sprite]-[blood_state]-[Ddir]"] if(!bloodstep_overlay) - GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]1", dir = Ddir) + GLOB.bloody_footprints_cache["entered-[footprint_sprite]-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]_[footprint_sprite]_enter", dir = Ddir) . += bloodstep_overlay if(exited_dirs & Ddir) - var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] + var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["exited-[footprint_sprite]-[blood_state]-[Ddir]"] if(!bloodstep_overlay) - GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]2", dir = Ddir) + GLOB.bloody_footprints_cache["exited-[footprint_sprite]-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]_[footprint_sprite]_exit", dir = Ddir) . += bloodstep_overlay /obj/effect/decal/cleanable/blood/footprints/examine(mob/user) . = ..() if((shoe_types.len + species_types.len) > 0) - . += "You recognise the footprints as belonging to:" + . += "You recognise the [name] as belonging to:" for(var/sole in shoe_types) var/obj/item/clothing/item = sole var/article = initial(item.gender) == PLURAL ? "Some" : "A" @@ -315,14 +328,14 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) if(species == "unknown") . += "Some feet." else if(species == SPECIES_MONKEY) - . += "[icon2html('icons/mob/human/human.dmi', user, "monkey")] Some monkey feet." + . += "[icon2html('icons/mob/human/human.dmi', user, "monkey")] Some monkey paws." else if(species == SPECIES_HUMAN) . += "[icon2html('icons/mob/human/bodyparts.dmi', user, "default_human_l_leg")] Some human feet." else . += "[icon2html('icons/mob/human/bodyparts.dmi', user, "[species]_l_leg")] Some [species] feet." -/obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/C) - if(blood_state != C.blood_state) //We only replace footprints of the same type as us +/obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/blood/blood_decal) + if(blood_state != blood_decal.blood_state || footprint_sprite != blood_decal.footprint_sprite) //We only replace footprints of the same type as us return FALSE return ..() diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index c93b105767a10..7fe6c59075f3f 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -403,6 +403,7 @@ /obj/effect/decal/cleanable/ants/fire name = "space fire ants" desc = "A small colony no longer. We are the fire nation." + decal_reagent = /datum/reagent/ants/fire icon_state = "fire_ants" mergeable_decal = FALSE @@ -485,6 +486,9 @@ ignite() return ..() +/obj/effect/decal/cleanable/fuel_pool/hivis + icon_state = "fuel_pool_hivis" + /obj/effect/decal/cleanable/rubble name = "rubble" desc = "A pile of rubble." diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm index 86800d0522c28..c3fad6d26b61d 100644 --- a/code/game/objects/effects/effect_system/effects_sparks.dm +++ b/code/game/objects/effects/effect_system/effects_sparks.dm @@ -16,7 +16,7 @@ name = "sparks" icon_state = "sparks" anchored = TRUE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 2 light_power = 0.5 light_color = LIGHT_COLOR_FIRE diff --git a/code/game/objects/effects/lighting.dm b/code/game/objects/effects/lighting.dm index 4e95e72f42937..1de9fad39eee4 100644 --- a/code/game/objects/effects/lighting.dm +++ b/code/game/objects/effects/lighting.dm @@ -8,7 +8,7 @@ name = "lighting" desc = "Tell a coder if you're seeing this." icon_state = "nothing" - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = MINIMUM_USEFUL_LIGHT_RANGE light_color = COLOR_WHITE blocks_emissive = EMISSIVE_BLOCK_NONE diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index e63e7e39c4ad2..cd8a859f86fb4 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -117,8 +117,7 @@ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(3, 1, src) s.start() - if(ismob(triggerer)) - mineEffect(triggerer) + mineEffect(triggerer) triggered = TRUE SEND_SIGNAL(src, COMSIG_MINE_TRIGGERED, triggerer) qdel(src) diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 2b8abcb17282f..075e927d65328 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -43,6 +43,10 @@ stack_trace("Warning: something tried to forceMove() a qdeleted [src]([type]) to non-null destination [destination]([destination.type])!") return ..() +/// Override to define loot blacklist behavior +/obj/effect/spawner/proc/can_spawn(atom/loot) + return TRUE + /obj/effect/list_container name = "list container" diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 091b470067320..8c52a76dbc0de 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -18,7 +18,7 @@ anchored = TRUE density = TRUE // dense for receiving bumbs layer = HIGH_OBJ_LAYER - light_system = STATIC_LIGHT + light_system = COMPLEX_LIGHT light_range = 3 light_power = 1 light_on = TRUE diff --git a/code/game/objects/effects/spawners/random/bedsheet.dm b/code/game/objects/effects/spawners/random/bedsheet.dm new file mode 100644 index 0000000000000..3fb39c5de4a71 --- /dev/null +++ b/code/game/objects/effects/spawners/random/bedsheet.dm @@ -0,0 +1,64 @@ +/obj/effect/spawner/random/bedsheet + name = "random dorm bedsheet" + icon_state = "random_bedsheet" + loot = list(/obj/item/bedsheet = 8, + /obj/item/bedsheet/blue = 8, + /obj/item/bedsheet/green = 8, + /obj/item/bedsheet/grey = 8, + /obj/item/bedsheet/orange = 8, + /obj/item/bedsheet/purple = 8, + /obj/item/bedsheet/red = 8, + /obj/item/bedsheet/yellow = 8, + /obj/item/bedsheet/brown = 8, + /obj/item/bedsheet/black = 8, + /obj/item/bedsheet/patriot = 2, + /obj/item/bedsheet/rainbow = 2, + /obj/item/bedsheet/ian = 2, + /obj/item/bedsheet/runtime = 2, + /obj/item/bedsheet/cosmos = 2, + /obj/item/bedsheet/nanotrasen = 2, + /obj/item/bedsheet/pirate = 2, + /obj/item/bedsheet/gondola = 1, + ) + +/obj/effect/spawner/random/bedsheet/double + name = "random dorm double bedsheet" + icon_state = "random_doublesheet" + loot = list( + /obj/item/bedsheet/double = 4, + /obj/item/bedsheet/blue/double = 4, + /obj/item/bedsheet/green/double = 4, + /obj/item/bedsheet/grey/double = 4, + /obj/item/bedsheet/orange/double = 4, + /obj/item/bedsheet/purple/double = 4, + /obj/item/bedsheet/red/double = 4, + /obj/item/bedsheet/yellow/double = 4, + /obj/item/bedsheet/brown/double = 4, + /obj/item/bedsheet/black/double = 4, + /obj/item/bedsheet/patriot/double = 1, + /obj/item/bedsheet/rainbow/double = 1, + /obj/item/bedsheet/ian/double = 1, + /obj/item/bedsheet/runtime/double = 1, + /obj/item/bedsheet/cosmos/double = 1, + /obj/item/bedsheet/nanotrasen/double = 1, + ) + +/obj/effect/spawner/random/bedsheet/any + name = "random single bedsheet" + loot = null + var/static/list/bedsheet_list = list() + var/spawn_type = BEDSHEET_SINGLE + +/obj/effect/spawner/random/bedsheet/any/Initialize(mapload) + if(isnull(bedsheet_list[spawn_type])) + var/list/spawn_list = list() + for(var/obj/item/bedsheet/sheet as anything in typesof(/obj/item/bedsheet)) + if(initial(sheet.bedsheet_type) == spawn_type) + spawn_list += sheet + bedsheet_list[spawn_type] = spawn_list + loot = bedsheet_list[spawn_type] + return ..() + +/obj/effect/spawner/random/bedsheet/any/double + icon_state = "random_doublesheet" + spawn_type = BEDSHEET_DOUBLE diff --git a/code/game/objects/effects/spawners/random/entertainment.dm b/code/game/objects/effects/spawners/random/entertainment.dm index 0a61cd1ab1fbb..3ad477b0294f3 100644 --- a/code/game/objects/effects/spawners/random/entertainment.dm +++ b/code/game/objects/effects/spawners/random/entertainment.dm @@ -51,14 +51,13 @@ loot = list( /obj/item/coin/iron = 5, /obj/item/coin/plastic = 5, - /obj/item/coin/silver = 3, - /obj/item/coin/plasma = 3, + /obj/item/coin/silver = 4, + /obj/item/coin/plasma = 4, /obj/item/coin/uranium = 3, /obj/item/coin/titanium = 3, /obj/item/coin/diamond = 2, /obj/item/coin/bananium = 2, /obj/item/coin/adamantine = 2, - /obj/item/coin/mythril = 2, /obj/item/coin/runite = 2, /obj/item/food/chococoin = 2, /obj/item/coin/twoheaded = 1, diff --git a/code/game/objects/effects/spawners/random/maintenance.dm b/code/game/objects/effects/spawners/random/maintenance.dm index 242613e403d6a..38f8af6a90269 100644 --- a/code/game/objects/effects/spawners/random/maintenance.dm +++ b/code/game/objects/effects/spawners/random/maintenance.dm @@ -4,6 +4,13 @@ icon_state = "loot" // see code/_globalvars/lists/maintenance_loot.dm for loot table +/// A subtype of maintenance loot spawner that does not spawn any decals, for when you want to place them on chasm turfs and such +/// decals such as ashes will cause NeverShouldHaveComeHere() to fail on such turfs, which creates annoying rng based CI failures +/obj/effect/spawner/random/maintenance/no_decals + +/obj/effect/spawner/random/maintenance/no_decals/can_spawn(atom/loot) + return !ispath(loot, /obj/effect/decal) + /obj/effect/spawner/random/maintenance/examine(mob/user) . = ..() . += span_info("This spawner has an effective loot count of [get_effective_lootcount()].") @@ -64,3 +71,31 @@ /obj/effect/spawner/random/maintenance/eight name = "8 x maintenance loot spawner" spawn_loot_count = 8 + +/obj/effect/spawner/random/maintenance/no_decals/two + name = "2 x maintenance loot spawner" + spawn_loot_count = 2 + +/obj/effect/spawner/random/maintenance/no_decals/three + name = "3 x maintenance loot spawner" + spawn_loot_count = 3 + +/obj/effect/spawner/random/maintenance/no_decals/four + name = "4 x maintenance loot spawner" + spawn_loot_count = 4 + +/obj/effect/spawner/random/maintenance/no_decals/five + name = "5 x maintenance loot spawner" + spawn_loot_count = 5 + +/obj/effect/spawner/random/maintenance/no_decals/six + name = "6 x maintenance loot spawner" + spawn_loot_count = 6 + +/obj/effect/spawner/random/maintenance/no_decals/seven + name = "7 x maintenance loot spawner" + spawn_loot_count = 7 + +/obj/effect/spawner/random/maintenance/no_decals/eight + name = "8 x maintenance loot spawner" + spawn_loot_count = 8 diff --git a/code/game/objects/effects/spawners/random/random.dm b/code/game/objects/effects/spawners/random/random.dm index e8653a30cfb0c..e518b9ad4717c 100644 --- a/code/game/objects/effects/spawners/random/random.dm +++ b/code/game/objects/effects/spawners/random/random.dm @@ -57,6 +57,9 @@ var/pixel_divider = FLOOR(16 / spawn_loot_split_pixel_offsets, 1) // 16 pixels offsets is max that should be allowed in any direction while((spawn_loot_count-loot_spawned) && loot.len) var/lootspawn = pick_weight_recursive(loot) + if(!can_spawn(lootspawn)) + loot.Remove(lootspawn) + continue if(!spawn_loot_double) loot.Remove(lootspawn) if(lootspawn && (spawn_scatter_radius == 0 || spawn_locations.len)) diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index a014857994a07..ecfa560bfe60b 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -19,7 +19,7 @@ /obj/effect/step_trigger/proc/on_entered(datum/source, H as mob|obj) SIGNAL_HANDLER - if(!H) + if(!H || H == src) return if(isobserver(H) && !affect_ghosts) return @@ -138,6 +138,26 @@ if (T) A.forceMove(T) +/* Teleports atoms directly to an offset, no randomness, looping hallways! */ + +/obj/effect/step_trigger/teleporter/offset + var/teleport_x_offset = 0 + var/teleport_y_offset = 0 + +/obj/effect/step_trigger/teleporter/offset/on_entered(datum/source, H as mob|obj, atom/old_loc) + if(!old_loc?.Adjacent(loc)) // prevents looping, if we were teleported into this then the old loc is usually not adjacent + return + return ..() + +/obj/effect/step_trigger/teleporter/offset/Trigger(atom/movable/poor_soul) + var/turf/destination = locate(x + teleport_x_offset, y + teleport_y_offset, z) + if(!destination) + return + poor_soul.forceMove(destination) + var/mob/living/living_soul = poor_soul + if(istype(living_soul) && living_soul.client) + living_soul.client.move_delay = 0 + /* Fancy teleporter, creates sparks and smokes when used */ /obj/effect/step_trigger/teleport_fancy diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 6c96f24e33697..06b4a8e4b0721 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -683,11 +683,11 @@ duration = 0.4 SECONDS /// Plays a dispersing animation on hivelord and legion minions so they don't just vanish -/obj/effect/temp_visual/hive_spawn_wither +/obj/effect/temp_visual/despawn_effect name = "withering spawn" duration = 1 SECONDS -/obj/effect/temp_visual/hive_spawn_wither/Initialize(mapload, atom/copy_from) +/obj/effect/temp_visual/despawn_effect/Initialize(mapload, atom/copy_from) if (isnull(copy_from)) . = ..() return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4fde70adbebc2..62d128b4eb560 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -521,20 +521,20 @@ return return attempt_pickup(user) -/obj/item/proc/attempt_pickup(mob/user) +/obj/item/proc/attempt_pickup(mob/user, skip_grav = FALSE) . = TRUE if(!(interaction_flags_item & INTERACT_ITEM_ATTACK_HAND_PICKUP)) //See if we're supposed to auto pickup. return - //Heavy gravity makes picking up things very slow. - var/grav = user.has_gravity() - if(grav > STANDARD_GRAVITY) - var/grav_power = min(3,grav - STANDARD_GRAVITY) - to_chat(user,span_notice("You start picking up [src]...")) - if(!do_after(user, 30 * grav_power, src)) - return - + if(!skip_grav) + //Heavy gravity makes picking up things very slow. + var/grav = user.has_gravity() + if(grav > STANDARD_GRAVITY) + var/grav_power = min(3,grav - STANDARD_GRAVITY) + to_chat(user,span_notice("You start picking up [src]...")) + if(!do_after(user, 30 * grav_power, src)) + return //If the item is in a storage item, take it out var/outside_storage = !loc.atom_storage diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index f58ea90211d1e..e50963a855e2b 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -14,11 +14,19 @@ var/deceptive = FALSE /// What cutout datum we spawn at the start? Uses the name, not the path. var/starting_cutout + /// Reference to the tactical component that should be deleted when the cutout is toppled. + var/datum/component/tactical/tacticool /obj/item/cardboard_cutout/Initialize(mapload) . = ..() if(starting_cutout) return INITIALIZE_HINT_LATELOAD + if(!pushed_over) + tacticool = AddComponent(/datum/component/tactical) + +/obj/item/cardboard_cutout/Destroy() + tacticool = null + return ..() /obj/item/cardboard_cutout/LateInitialize() ASSERT(!isnull(starting_cutout)) @@ -33,6 +41,8 @@ ASSERT(!isnull(cutout), "No cutout found with name [starting_cutout]") cutout.apply(src) + if(!pushed_over) + tacticool = AddComponent(/datum/component/tactical) //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/cardboard_cutout/attack_hand(mob/living/user, list/modifiers) @@ -42,12 +52,22 @@ playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) push_over() +/obj/item/cardboard_cutout/equipped(mob/living/user, slot) + . = ..() + //Because of the tactical element, the user won't tilt left and right, but it'll still hop. + user.AddElementTrait(TRAIT_WADDLING, REF(src), /datum/element/waddling) + +/obj/item/cardboard_cutout/dropped(mob/living/user) + . = ..() + REMOVE_TRAIT(user, TRAIT_WADDLING, REF(src)) + /obj/item/cardboard_cutout/proc/push_over() appearance = initial(appearance) desc = "[initial(desc)] It's been pushed over." icon_state = "cutout_pushed_over" remove_atom_colour(FIXED_COLOUR_PRIORITY) pushed_over = TRUE + QDEL_NULL(tacticool) /obj/item/cardboard_cutout/attack_self(mob/living/user) if(!pushed_over) @@ -57,6 +77,7 @@ icon = initial(icon) icon_state = initial(icon_state) //This resets a cutout to its blank state - this is intentional to allow for resetting pushed_over = FALSE + tacticool = AddComponent(/datum/component/tactical) /obj/item/cardboard_cutout/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/toy/crayon)) @@ -100,7 +121,7 @@ for (var/datum/cardboard_cutout/cutout_subtype as anything in subtypesof(/datum/cardboard_cutout)) var/datum/cardboard_cutout/cutout = get_cardboard_cutout_instance(cutout_subtype) appearances_by_name[cutout.name] = cutout - possible_appearances[cutout.name] = image(icon = cutout.applied_appearance) + possible_appearances[cutout.name] = image(icon = cutout.preview_appearance) var/new_appearance = show_radial_menu(user, src, possible_appearances, custom_check = CALLBACK(src, PROC_REF(check_menu), user, crayon), radius = 36, require_near = TRUE) if(!new_appearance) @@ -144,19 +165,16 @@ return FALSE return TRUE -// Cutouts always face forward -/obj/item/cardboard_cutout/setDir(newdir) - SHOULD_CALL_PARENT(FALSE) - return - /obj/item/cardboard_cutout/adaptive //Purchased by Syndicate agents, these cutouts are indistinguishable from normal cutouts but aren't discolored when their appearance is changed deceptive = TRUE /datum/cardboard_cutout /// Name of the cutout, used for radial selection and the global list. var/name = "Boardjak" - /// The appearance we apply to the cardboard cutout. - var/mutable_appearance/applied_appearance = null + /// The appearance of the cardboard cutout that we show in the radial menu. + var/mutable_appearance/preview_appearance + /// A flat appearance, with only one direction, that we apply to the cardboard cutout. + var/image/applied_appearance /// The base name we actually give to to the cardboard cutout. Can be overridden in get_name(). var/applied_name = "boardjak" /// The desc we give to the cardboard cutout. @@ -179,9 +197,9 @@ /datum/cardboard_cutout/New() . = ..() if(direct_icon) - applied_appearance = mutable_appearance(direct_icon, direct_icon_state) + preview_appearance = mutable_appearance(direct_icon, direct_icon_state) else - applied_appearance = get_dynamic_human_appearance(outfit, species, mob_spawner, l_hand, r_hand, animated = FALSE) + preview_appearance = get_dynamic_human_appearance(outfit, species, mob_spawner, l_hand, r_hand, animated = FALSE) /// This proc returns the name that the cardboard cutout item will use. /datum/cardboard_cutout/proc/get_name() @@ -189,9 +207,14 @@ /// This proc sets the cardboard cutout item's vars. /datum/cardboard_cutout/proc/apply(obj/item/cardboard_cutout/cutouts) + if(isnull(applied_appearance)) + applied_appearance = image(fcopy_rsc(getFlatIcon(preview_appearance, no_anim = TRUE))) + applied_appearance.plane = cutouts.plane + applied_appearance.layer = cutouts.layer cutouts.appearance = applied_appearance cutouts.name = get_name() cutouts.desc = applied_desc + cutouts.update_appearance() //forces an update on the tactical comp's appearance. /datum/cardboard_cutout/assistant name = "Assistant" @@ -318,15 +341,15 @@ name = "Slaughter Demon" applied_name = "slaughter demon" applied_desc = "A cardboard cutout of a slaughter demon." - direct_icon = 'icons/mob/simple/mob.dmi' - direct_icon_state = "daemon" + direct_icon = 'icons/mob/simple/demon.dmi' + direct_icon_state = "slaughter_demon" /datum/cardboard_cutout/laughter_demon name = "Laughter Demon" applied_name = "laughter demon" applied_desc = "A cardboard cutout of a laughter demon." - direct_icon = 'icons/mob/simple/mob.dmi' - direct_icon_state = "bowmon" + direct_icon = 'icons/mob/simple/demon.dmi' + direct_icon_state = "bow_demon" /datum/cardboard_cutout/security_officer name = "Private Security Officer" diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 04c0c57955335..d395905cd2631 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -1455,7 +1455,7 @@ /obj/item/card/id/advanced/chameleon/ui_state(mob/user) return GLOB.always_state -/obj/item/card/id/advanced/chameleon/ui_status(mob/user) +/obj/item/card/id/advanced/chameleon/ui_status(mob/user, datum/ui_state/state) var/target = theft_target?.resolve() if(!target) diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 30c853746b48a..5a88a2cedff85 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -725,7 +725,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM resistance_flags = FIRE_PROOF grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/fuel/oil = 5) custom_price = PAYCHECK_CREW * 1.1 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 2 light_power = 0.6 light_color = LIGHT_COLOR_FIRE diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index 7ebfcab4e0077..382cf60ddc69a 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -309,9 +309,6 @@ greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/rnd/production/protolathe/department/engineering -/obj/item/circuitboard/machine/protolathe/department/engineering/no_tax - build_path = /obj/machinery/rnd/production/protolathe/department/engineering/no_tax - /obj/item/circuitboard/machine/rtg name = "RTG" greyscale_colors = CIRCUIT_COLOR_ENGINEERING @@ -1562,7 +1559,7 @@ /obj/item/circuitboard/machine/brm name = "Boulder Retrieval Matrix" greyscale_colors = CIRCUIT_COLOR_SUPPLY - build_path = /obj/machinery/bouldertech/brm + build_path = /obj/machinery/brm req_components = list( /datum/stock_part/capacitor = 1, /datum/stock_part/scanning_module = 1, @@ -1574,10 +1571,9 @@ greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/bouldertech/refinery req_components = list( - /obj/item/reagent_containers/cup/beaker = 1, /obj/item/assembly/igniter/condenser = 1, /datum/stock_part/servo = 2, - /datum/stock_part/matter_bin = 1, + /datum/stock_part/matter_bin = 2, ) /obj/item/circuitboard/machine/smelter diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 395faaa5449c9..e7c4e8eadde9b 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -31,6 +31,7 @@ attack_verb_continuous = list("attacks", "colours") attack_verb_simple = list("attack", "colour") grind_results = list() + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_IGNORE_MOBILITY /// Icon state to use when capped var/icon_capped diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm index eecef73fd4304..8e9fb78172f60 100644 --- a/code/game/objects/items/credit_holochip.dm +++ b/code/game/objects/items/credit_holochip.dm @@ -9,10 +9,13 @@ w_class = WEIGHT_CLASS_TINY var/credits = 0 -/obj/item/holochip/Initialize(mapload, amount) +/obj/item/holochip/Initialize(mapload, amount = 1) . = ..() if(amount) credits = amount + if(credits <= 0 && !mapload) + stack_trace("Holochip created with 0 or less credits in [get_area_name(src)]!") + return INITIALIZE_HINT_QDEL update_appearance() /obj/item/holochip/examine(mob/user) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 22320ad4126c0..0b552f08e6838 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -19,7 +19,7 @@ slot_flags = ITEM_SLOT_BELT custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 0.2) actions_types = list(/datum/action/item_action/toggle_light) - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 4 light_power = 1 light_on = FALSE @@ -75,7 +75,7 @@ /obj/item/flashlight/proc/update_brightness() update_appearance(UPDATE_ICON) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) update_light() /obj/item/flashlight/proc/toggle_light(mob/user) @@ -363,7 +363,7 @@ righthand_file = 'icons/mob/inhands/items_righthand.dmi' force = 10 light_range = 3.5 - light_system = STATIC_LIGHT + light_system = COMPLEX_LIGHT light_color = LIGHT_COLOR_FAINT_BLUE w_class = WEIGHT_CLASS_BULKY obj_flags = CONDUCTS_ELECTRICITY @@ -396,7 +396,7 @@ actions_types = list() heat = 1000 light_color = LIGHT_COLOR_FLARE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT grind_results = list(/datum/reagent/sulfur = 15) sound_on = 'sound/items/match_strike.ogg' toggle_context = FALSE @@ -654,7 +654,7 @@ righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' desc = "A mining lantern." light_range = 6 // luminosity when on - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT /obj/item/flashlight/lantern/heirloom_moth name = "old lantern" @@ -685,7 +685,7 @@ slot_flags = ITEM_SLOT_BELT custom_materials = null light_range = 7 //luminosity when on - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT /obj/item/flashlight/emp var/emp_max_charges = 4 @@ -749,7 +749,7 @@ custom_price = PAYCHECK_LOWER w_class = WEIGHT_CLASS_SMALL light_range = 4 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT color = LIGHT_COLOR_GREEN icon_state = "glowstick" base_icon_state = "glowstick" @@ -856,7 +856,7 @@ name = "disco light" desc = "Groovy..." icon_state = null - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 4 light_power = 10 alpha = 0 @@ -884,7 +884,7 @@ desc = "A strange device manufactured with mysterious elements that somehow emits darkness. Or maybe it just sucks in light? Nobody knows for sure." icon_state = "flashdark" inhand_icon_state = "flashdark" - light_system = STATIC_LIGHT //The overlay light component is not yet ready to produce darkness. + light_system = COMPLEX_LIGHT //The overlay light component is not yet ready to produce darkness. light_range = 0 ///Variable to preserve old lighting behavior in flashlights, to handle darkness. var/dark_light_range = 2.5 @@ -903,23 +903,15 @@ /obj/item/flashlight/eyelight name = "eyelight" desc = "This shouldn't exist outside of someone's head, how are you seeing this?" - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 15 light_power = 1 obj_flags = CONDUCTS_ELECTRICITY item_flags = DROPDEL actions_types = list() -/obj/item/flashlight/eyelight/adapted - name = "adaptedlight" - desc = "There is no possible way for a player to see this, so I can safely talk at length about why this exists. Adapted eyes come \ - with icons that go above the lighting layer so to make sure the red eyes that pierce the darkness are always visible we make the \ - human emit the smallest amount of light possible. Thanks for reading :)" - light_range = 1 - light_power = 0.07 - /obj/item/flashlight/eyelight/glow - light_system = MOVABLE_LIGHT_BEAM + light_system = OVERLAY_LIGHT_BEAM light_range = 4 light_power = 2 diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 45daf00db1ae3..1f06113158cef 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -244,6 +244,14 @@ GLOBAL_LIST_INIT(channel_tokens, list( worn_icon_state = "com_headset" keyslot = /obj/item/encryptionkey/heads/hos +/obj/item/radio/headset/heads/hos/advisor + name = "\proper the veteran security advisor headset" + desc = "The headset of the man who was in charge of keeping order and protecting the station..." + icon_state = "com_headset" + worn_icon_state = "com_headset" + keyslot = /obj/item/encryptionkey/heads/hos + command = FALSE + /obj/item/radio/headset/heads/hos/alt name = "\proper the head of security's bowman headset" desc = "The headset of the man in charge of keeping order and protecting the station. Protects ears from flashbangs." diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 67369d91a17e9..248955e0fa493 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -10,6 +10,7 @@ worn_icon_state = "radio" desc = "A basic handheld radio that communicates with local telecommunication networks." dog_fashion = /datum/dog_fashion/back + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_ALLOW_USER_LOCATION | INTERACT_ATOM_IGNORE_MOBILITY obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 0db62c5436994..ef922ed3a7d3c 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -219,7 +219,7 @@ if(ears.damage) render_list += "Subject has [ears.damage > ears.maxHealth ? "permanent ": "temporary "]hearing damage.\n" if(ears.deaf) - render_list += "Subject is [ears.damage > ears.maxHealth ? "permanently ": "temporarily "] deaf.\n" + render_list += "Subject is [ears.damage > ears.maxHealth ? "permanently": "temporarily"] deaf.\n" // Eye status var/obj/item/organ/internal/eyes/eyes = carbontarget.get_organ_slot(ORGAN_SLOT_EYES) @@ -372,11 +372,19 @@ var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id] blood_type = R ? R.name : blood_id if(carbontarget.blood_volume <= BLOOD_VOLUME_SAFE && carbontarget.blood_volume > BLOOD_VOLUME_OKAY) - render_list += "Blood level: LOW [blood_percent] %, [carbontarget.blood_volume] cl, [span_info("type: [blood_type]")]\n" + render_list += "Blood level: LOW [blood_percent]%, [carbontarget.blood_volume] cl, [span_info("type: [blood_type]")]\n" else if(carbontarget.blood_volume <= BLOOD_VOLUME_OKAY) - render_list += "Blood level: CRITICAL [blood_percent] %, [carbontarget.blood_volume] cl, [span_info("type: [blood_type]")]\n" + render_list += "Blood level: CRITICAL [blood_percent]%, [carbontarget.blood_volume] cl, [span_info("type: [blood_type]")]\n" else - render_list += "Blood level: [blood_percent] %, [carbontarget.blood_volume] cl, type: [blood_type]\n" + render_list += "Blood level: [blood_percent]%, [carbontarget.blood_volume] cl, type: [blood_type]\n" + + // Blood Alcohol Content + var/blood_alcohol_content = target.get_blood_alcohol_content() + if(blood_alcohol_content > 0) + if(blood_alcohol_content >= 0.24) + render_list += "Blood alcohol content: CRITICAL [blood_alcohol_content]%\n" + else + render_list += "Blood alcohol content: [blood_alcohol_content]%\n" // Cybernetics if(iscarbon(target)) diff --git a/code/game/objects/items/devices/scanners/t_scanner.dm b/code/game/objects/items/devices/scanners/t_scanner.dm index c9f1ae0fd9d92..555e6cc88619f 100644 --- a/code/game/objects/items/devices/scanners/t_scanner.dm +++ b/code/game/objects/items/devices/scanners/t_scanner.dm @@ -4,7 +4,6 @@ custom_price = PAYCHECK_LOWER * 0.7 icon = 'icons/obj/devices/scanner.dmi' icon_state = "t-ray0" - var/on = FALSE slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_SMALL inhand_icon_state = "electronic" @@ -12,6 +11,10 @@ lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT * 1.5) + /// Is this T-Ray scanner currently on? + var/on = FALSE + /// Will this T-Ray scanner shut off on de-equip? (Cyborgs only) + var/shut_off_on_unequip = TRUE /obj/item/t_scanner/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins to emit terahertz-rays into [user.p_their()] brain with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -29,6 +32,8 @@ toggle_on() /obj/item/t_scanner/cyborg_unequip(mob/user) + if(!shut_off_on_unequip) + return if(!on) return toggle_on() diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 99322597b4b5d..8e8f2578fa4b1 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -202,9 +202,104 @@ effective or pretty fucking useless. target = round(target) wavelength = clamp(target, 0, 120) +/datum/action/item_action/stealth_mode + name = "Toggle Stealth" + desc = "Makes you invisible to the naked eye." + button_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "ninja_cloak" + /// Whether stealth is active or not + var/stealth_engaged = FALSE + /// The amount of time the stealth mode can be active for, drains to 0 when active + var/charge = 30 SECONDS + /// The maximum amount of time the stealth mode can be active for + var/max_charge = 30 SECONDS + /// The minimum alpha value for the stealth mode + var/min_alpha = 0 + /// Whether the stealth mode recharges while active + /// if TRUE standing in darkness will recharge even while active + /// if FALSE it will not uncharge, but not recharge while in darkness + var/recharge_while_active = TRUE + +/datum/action/item_action/stealth_mode/is_action_active(atom/movable/screen/movable/action_button/current_button) + return stealth_engaged + +/datum/action/item_action/stealth_mode/Grant(mob/grant_to) + . = ..() + START_PROCESSING(SSobj, src) + build_all_button_icons(UPDATE_BUTTON_STATUS) + +/datum/action/item_action/stealth_mode/Remove(mob/remove_from) + if(!isnull(owner) && stealth_engaged) + stealth_off() + STOP_PROCESSING(SSobj, src) + return ..() + +/datum/action/item_action/stealth_mode/Trigger(trigger_flags) + . = ..() + if(!.) + return + + if(stealth_engaged) + stealth_off() + else + stealth_on() + +/datum/action/item_action/stealth_mode/proc/stealth_on() + animate(owner, alpha = get_alpha(), time = 0.5 SECONDS) + apply_wibbly_filters(owner) + stealth_engaged = TRUE + build_all_button_icons(UPDATE_BUTTON_STATUS|UPDATE_BUTTON_BACKGROUND) + owner.balloon_alert(owner, "stealth mode engaged") + +/datum/action/item_action/stealth_mode/proc/stealth_off() + owner.alpha = initial(owner.alpha) + remove_wibbly_filters(owner) + stealth_engaged = FALSE + build_all_button_icons(UPDATE_BUTTON_STATUS|UPDATE_BUTTON_BACKGROUND) + owner.balloon_alert(owner, "stealth mode disengaged") + +/datum/action/item_action/stealth_mode/proc/get_alpha() + return clamp(255 - (255 * charge / max_charge), min_alpha, 255) + +/datum/action/item_action/stealth_mode/process(seconds_per_tick) + if(!stealth_engaged) + // Recharge over time + charge = min(max_charge, charge + (max_charge * 0.04) * seconds_per_tick) + build_all_button_icons(UPDATE_BUTTON_STATUS) + return + + if(charge <= 0) + stealth_off() + return + + var/turf/our_turf = get_turf(owner) + var/lumcount = our_turf?.get_lumcount() || 0 + if(lumcount > 0.3) + // Decay charge while invisible+ in the light + charge = max(0, charge - (max_charge * 0.05) * seconds_per_tick) + build_all_button_icons(UPDATE_BUTTON_STATUS) + + else if(recharge_while_active) + // Return charage while invisible + in the darkness + recharge_while_active + charge = min(max_charge, charge + (max_charge * 0.1) * seconds_per_tick) + build_all_button_icons(UPDATE_BUTTON_STATUS) + + animate(owner, alpha = get_alpha(), time = 1 SECONDS, flags = ANIMATION_PARALLEL) + +/datum/action/item_action/stealth_mode/update_button_status(atom/movable/screen/movable/action_button/current_button, force) + . = ..() + current_button.maptext_x = 9 + current_button.maptext = MAPTEXT_TINY_UNICODE("[round(charge / max_charge * 100, 0.01)]%") + +/datum/action/item_action/stealth_mode/weaker + charge = 15 SECONDS + max_charge = 15 SECONDS + min_alpha = 20 + recharge_while_active = FALSE + /obj/item/shadowcloak name = "cloaker belt" - desc = "Makes you invisible for short periods of time. Recharges in darkness." + desc = "Makes you invisible for short periods of time. Recharges in darkness, even while active." icon = 'icons/obj/clothing/belts.dmi' icon_state = "utility" inhand_icon_state = "utility" @@ -214,66 +309,16 @@ effective or pretty fucking useless. slot_flags = ITEM_SLOT_BELT attack_verb_continuous = list("whips", "lashes", "disciplines") attack_verb_simple = list("whip", "lash", "discipline") - - var/mob/living/carbon/human/user = null - var/charge = 300 - var/max_charge = 300 - var/on = FALSE - actions_types = list(/datum/action/item_action/toggle) - -/obj/item/shadowcloak/ui_action_click(mob/user) - if(user.get_item_by_slot(ITEM_SLOT_BELT) == src) - if(!on) - Activate(usr) - - else - Deactivate() - - return + actions_types = list(/datum/action/item_action/stealth_mode) /obj/item/shadowcloak/item_action_slot_check(slot, mob/user) - if(slot & ITEM_SLOT_BELT) - return 1 - -/obj/item/shadowcloak/proc/Activate(mob/living/carbon/human/user) - if(!user) - return - - to_chat(user, span_notice("You activate [src].")) - src.user = user - START_PROCESSING(SSobj, src) - on = TRUE - -/obj/item/shadowcloak/proc/Deactivate() - to_chat(user, span_notice("You deactivate [src].")) - STOP_PROCESSING(SSobj, src) - if(user) - user.alpha = initial(user.alpha) - - on = FALSE - user = null - -/obj/item/shadowcloak/dropped(mob/user) - ..() - if(user && user.get_item_by_slot(ITEM_SLOT_BELT) != src) - Deactivate() - -/obj/item/shadowcloak/process(seconds_per_tick) - if(user.get_item_by_slot(ITEM_SLOT_BELT) != src) - Deactivate() - return - - var/turf/T = get_turf(src) - if(on) - var/lumcount = T.get_lumcount() - - if(lumcount > 0.3) - charge = max(0, charge - 12.5 * seconds_per_tick)//Quick decrease in light - - else - charge = min(max_charge, charge + 25 * seconds_per_tick) //Charge in the dark + return slot & slot_flags - animate(user,alpha = clamp(255 - charge,0,255),time = 10) +/obj/item/shadowcloak/weaker + name = "stealth belt" + desc = "Makes you nigh-invisible to the naked eye for a short period of time. \ + Lasts indefinitely in darkness, but will not recharge unless inactive." + actions_types = list(/datum/action/item_action/stealth_mode/weaker) /// Checks if a given atom is in range of a radio jammer, returns TRUE if it is. /proc/is_within_radio_jammer_range(atom/source) @@ -410,7 +455,7 @@ effective or pretty fucking useless. balloon_alert(user, "repaired!") -/obj/machinery/porta_turret/syndicate/toolbox/deconstruct(disassembled) +/obj/machinery/porta_turret/syndicate/toolbox/on_deconstruction(disassembled) if(disassembled) var/atom/movable/old_toolbox = toolbox toolbox = null @@ -431,7 +476,7 @@ effective or pretty fucking useless. toolbox = null qdel(src) -/obj/machinery/porta_turret/syndicate/toolbox/ui_status(mob/user) +/obj/machinery/porta_turret/syndicate/toolbox/ui_status(mob/user, datum/ui_state/state) if(faction_check(user.faction, faction)) return ..() diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 19cd7e96da881..4684ce81b081e 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -17,7 +17,7 @@ w_class = WEIGHT_CLASS_SMALL hitsound = SFX_SWING_HIT armour_penetration = 35 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD light_color = LIGHT_COLOR_ELECTRIC_GREEN light_on = FALSE diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index b7896c643811b..1a31c5d58a219 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -15,7 +15,7 @@ custom_materials = list(/datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT * 0.5) resistance_flags = FIRE_PROOF trigger_guard = TRIGGER_GUARD_NORMAL - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_on = FALSE var/status = FALSE var/lit = FALSE //on or off diff --git a/code/game/objects/items/food/cake.dm b/code/game/objects/items/food/cake.dm index 07d5818b4662c..0b443554bb3b6 100644 --- a/code/game/objects/items/food/cake.dm +++ b/code/game/objects/items/food/cake.dm @@ -288,16 +288,23 @@ tastes = list("cake" = 3, "a Vlad's Salad" = 1) crafting_complexity = FOOD_COMPLEXITY_4 -/obj/item/food/cakeslice/birthday/energy/proc/energy_bite(mob/living/user) - to_chat(user, "As you eat the cake slice, you accidentally hurt yourself on the embedded energy dagger!") - user.apply_damage(18, BRUTE, BODY_ZONE_HEAD) - playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE) +/obj/item/food/cakeslice/birthday/energy/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_FOOD_EATEN, PROC_REF(bite_taken)) /obj/item/food/cakeslice/birthday/energy/attack(mob/living/target_mob, mob/living/user) - . = ..() if(HAS_TRAIT(user, TRAIT_PACIFISM) && target_mob != user) //Prevents pacifists from attacking others directly - return - energy_bite(target_mob, user) + balloon_alert(user, "that's dangerous!") + return FALSE + return ..() + +/obj/item/food/cakeslice/birthday/energy/proc/bite_taken(datum/source, mob/living/eater, mob/living/feeder) + SIGNAL_HANDLER + to_chat(eater, "As you eat the cake slice, you accidentally hurt yourself on the embedded energy dagger!") + if(eater != feeder) + log_combat(feeder, eater, "fed an energy cake to", src) + eater.apply_damage(18, BRUTE, BODY_ZONE_HEAD) + playsound(eater, 'sound/weapons/blade1.ogg', 5, TRUE) /obj/item/food/cake/apple name = "apple cake" diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm index b928a460abb18..b9a6c34df04ed 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -750,6 +750,19 @@ foodtypes = MEAT | SUGAR crafting_complexity = FOOD_COMPLEXITY_2 +///Special private component to handle how bbq is grilled, not meant to be used anywhere else +/datum/component/grillable/bbq + +/datum/component/grillable/bbq/finish_grilling(atom/grill_source) + //when on a grill allow it to roast without deleting itself + if(istype(grill_source, /obj/machinery/grill)) + grill_source.visible_message(span_notice("[parent] is grilled to perfection!")) + else //when on a girddle allow it to burn into an mouldy mess + return ..() + +/obj/item/food/bbqribs/make_grillable() + AddComponent(/datum/component/grillable/bbq, /obj/item/food/badrecipe, rand(30 SECONDS, 40 SECONDS), FALSE) + /obj/item/food/meatclown name = "meat clown" desc = "A delicious, round piece of meat clown. How horrifying." diff --git a/code/game/objects/items/food/meatslab.dm b/code/game/objects/items/food/meatslab.dm index c6b7d8110e7ee..c1b5a6a186f5f 100644 --- a/code/game/objects/items/food/meatslab.dm +++ b/code/game/objects/items/food/meatslab.dm @@ -340,7 +340,6 @@ icon_state = "meatwheat_clump" bite_consumption = 4 tastes = list("meat" = 1, "wheat" = 1) - foodtypes = GRAIN /obj/item/food/meat/slab/gorilla name = "gorilla meat" diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index 840d431bfa55e..0e598c6820296 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -246,6 +246,7 @@ w_class = WEIGHT_CLASS_BULKY tastes = list("cherry" = 1, "crepe" = 1) foodtypes = GRAIN | FRUIT | SUGAR + food_flags = FOOD_FINGER_FOOD crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/branrequests diff --git a/code/game/objects/items/food/pie.dm b/code/game/objects/items/food/pie.dm index 46674fb735e94..e57759915208d 100644 --- a/code/game/objects/items/food/pie.dm +++ b/code/game/objects/items/food/pie.dm @@ -484,3 +484,30 @@ tastes = list("pie" = 1, "the far off year of 2010" = 1) foodtypes = GRAIN crafting_complexity = FOOD_COMPLEXITY_2 + +/obj/item/food/pie/bacid_pie + name = "battery acid pie" + desc = "Ooh it's a pie made of... battery acid? You suppose an ethereal could find some enjoyement in eating this." + icon_state = "bacid_pie" + food_reagents = list( + /datum/reagent/consumable/nutriment = 18, + /datum/reagent/consumable/liquidelectricity/enriched = 18 + ) + tastes = list("battery acid" = 2, "electricity" = 2, "a cyber world" = 2) + foodtypes = TOXIC + slice_type = /obj/item/food/pieslice/bacid_pie + yield = 4 + crafting_complexity = FOOD_COMPLEXITY_3 + + +/obj/item/food/pieslice/bacid_pie + name = "battery acid pie slice" + desc = "The battery acid filling has a concerningly appealing bright green color" + icon_state = "bacid_pie_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4.5, + /datum/reagent/consumable/liquidelectricity/enriched = 4.5 + ) + tastes = list("battery acid" = 1, "electricity" = 1, "a cyber world" = 1) + foodtypes = TOXIC + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/sweets.dm b/code/game/objects/items/food/sweets.dm index 5c638077d16c5..d757261ac0154 100644 --- a/code/game/objects/items/food/sweets.dm +++ b/code/game/objects/items/food/sweets.dm @@ -79,6 +79,15 @@ w_class = WEIGHT_CLASS_TINY crafting_complexity = FOOD_COMPLEXITY_1 +/obj/item/food/virtual_chocolate + name = "virtual chocolate bar" + desc = "Digital food only gives off the sensation of eating... without any of the nutritional benefits." + icon_state = "virtual_chocolate" + tastes = list("nothing" = 1) + foodtypes = NONE + w_class = WEIGHT_CLASS_TINY + + /obj/item/food/chococoin name = "chocolate coin" desc = "A completely edible but non-flippable festive coin." diff --git a/code/game/objects/items/granters/oragami.dm b/code/game/objects/items/granters/oragami.dm index 0b7d6d9261570..0691349756cf9 100644 --- a/code/game/objects/items/granters/oragami.dm +++ b/code/game/objects/items/granters/oragami.dm @@ -21,11 +21,13 @@ check_flags = NONE /datum/action/innate/origami/Activate() + ADD_TRAIT(owner, TRAIT_PAPER_MASTER, ACTION_TRAIT) to_chat(owner, span_notice("You will now fold origami planes.")) active = TRUE build_all_button_icons(UPDATE_BUTTON_ICON) /datum/action/innate/origami/Deactivate() + REMOVE_TRAIT(owner, TRAIT_PAPER_MASTER, ACTION_TRAIT) to_chat(owner, span_notice("You will no longer fold origami planes.")) active = FALSE build_all_button_icons(UPDATE_BUTTON_ICON) diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm index b77216a9104e8..9bc8c1c515f9a 100644 --- a/code/game/objects/items/grenades/ghettobomb.dm +++ b/code/game/objects/items/grenades/ghettobomb.dm @@ -1,12 +1,10 @@ -//improvised explosives// - /obj/item/grenade/iedcasing - name = "improvised firebomb" - desc = "A weak, improvised incendiary device." + name = "improvised explosive" + desc = "An improvised explosive device." w_class = WEIGHT_CLASS_SMALL icon = 'icons/obj/weapons/grenade.dmi' - icon_state = "improvised_grenade" - icon_state_preview = "ied_preview" + base_icon_state = "pipebomb" + icon_state = "slicedapart" inhand_icon_state = "flashbang" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' @@ -15,67 +13,272 @@ obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT active = FALSE - det_time = 50 + shrapnel_type = /obj/projectile/bullet/shrapnel/ied + det_time = 225 SECONDS //this is handled by assemblies now display_timer = FALSE - var/check_parts = FALSE - var/range = 3 - var/list/times + /// Explosive power + var/power = 5 + /// Our assembly that when activated causes us to explode + var/obj/item/assembly/activator + /// List of effects, the key is a path to compare to and the value is incremented by one everytime theres one that is the same type in our contents + var/list/effects = list( + /obj/item/food/meat/slab = 0, + /obj/item/paper = 0, + /obj/item/shard = 0, + /obj/item/stack/ore/bluespace_crystal/refined = 0, + ) + /// Cooldown to prevent spam + COOLDOWN_DECLARE(spam_cd) /obj/item/grenade/iedcasing/Initialize(mapload) . = ..() - add_overlay("improvised_grenade_filled") - add_overlay("improvised_grenade_wired") - times = list("5" = 10, "-1" = 20, "[rand(30, 80)]" = 50, "[rand(65, 180)]" = 20)// "Premature, Dud, Short Fuse, Long Fuse"=[weighting value] - det_time = text2num(pick_weight(times)) - if(det_time < 0) //checking for 'duds' - range = 1 - det_time = rand(30, 80) - else - range = pick(2, 2, 2, 3, 3, 3, 4) - if(check_parts) //since construction code calls this itself, no need to always call it. This does have the downside that adminspawned ones can potentially not have cans if they don't use the /spawned subtype. - CheckParts() + if(ispath(activator)) + var/obj/item/assembly/new_activator = new activator(src) + new_activator.toggle_secure() + activator = null + attach_activator(new_activator) -/obj/item/grenade/iedcasing/spawned - check_parts = TRUE +/obj/item/grenade/iedcasing/proc/setup_effects_from_contents() + for(var/item in contents) + for(var/effect_type in effects) + if(!istype(item, effect_type)) + continue + if(isstack(item)) + var/obj/item/stack/as_stack = item + effects[effect_type] += as_stack.amount + else + effects[effect_type]++ + break -/obj/item/grenade/iedcasing/spawned/Initialize(mapload) - new /obj/item/reagent_containers/cup/soda_cans/random(src) - return ..() +/obj/item/grenade/iedcasing/examine(mob/user) + . = ..() + . += span_notice("Using it in-hand activates the assembly, which means timers start timing and so on.") + . += span_notice("Using it off-hand allows you to configure the assembly, if possible.") + if(contents.len > 1) // above 1, so more than just the activator + . += span_warning("It seems to have something stuffed in it.") + if(isnull(activator)) + return + . += activator.examine(user) -/obj/item/grenade/iedcasing/CheckParts(list/parts_list) - ..() - var/obj/item/reagent_containers/cup/soda_cans/can = locate() in contents - if(!can) - stack_trace("[src] generated without a soda can!") //this shouldn't happen. - qdel(src) +// assembly handling + +/obj/item/grenade/iedcasing/IsAssemblyHolder() + return TRUE + +/obj/item/grenade/iedcasing/on_found(mob/finder) + if(activator) + activator.on_found(finder) + +/obj/item/grenade/iedcasing/Move() + . = ..() + if(activator) + activator.holder_movement() + +/obj/item/grenade/iedcasing/dropped() + . = ..() + if(activator) + activator.dropped() + +/obj/item/grenade/iedcasing/proc/process_activation(obj/item/assembly) + detonate() + +/obj/item/grenade/iedcasing/proc/attach_activator(obj/item/assembly/new_one) + if(activator) return - can.pixel_x = 0 //Reset the sprite's position to make it consistent with the rest of the IED - can.pixel_y = 0 - var/mutable_appearance/can_underlay = new(can) - can_underlay.layer = FLOAT_LAYER - can_underlay.plane = FLOAT_PLANE - underlays += can_underlay + activator = new_one + activator.holder = src + activator.on_attach() + activator.toggle_secure() + update_icon(UPDATE_ICON_STATE) +/obj/item/grenade/iedcasing/change_det_time() + return -/obj/item/grenade/iedcasing/attack_self(mob/user) - if(!active) - if(!botch_check(user)) - to_chat(user, span_warning("You light the [name]!")) - cut_overlay("improvised_grenade_filled") - arm_grenade(user, null, FALSE) +//assembly handling end + +/obj/item/grenade/iedcasing/attack_hand(mob/user, list/modifiers) + if(loc == user) //if we were picked up already, this opening whenever picked up is not ok + activator.ui_interact(user) //if any + . = ..() + if(.) + return + if(isnull(activator)) + return + activator.attack_hand() +/obj/item/grenade/iedcasing/update_icon_state() + if(isnull(activator)) + icon_state = "slicedapart" //this shouldnt happen but should prevent runtimes + return ..() + var/suffix = "" + var/obj/item/assembly/timer/as_timer = activator + var/obj/item/assembly/mousetrap/as_mousetrap = activator + var/obj/item/assembly/prox_sensor/as_prox = activator + if((istype(as_timer) && as_timer.timing) || (istype(as_mousetrap) && as_mousetrap.armed)) //these shouldve just had a common "active" variable or something + suffix = "-a" + else if(istype(as_prox)) + suffix = as_prox.timing ? "-arming" : (as_prox.scanning ? "-a" : "") + icon_state = "[base_icon_state]-[initial(activator.name)][suffix]" //signalers detonate instantly so theyre not here + return ..() + +/obj/item/grenade/iedcasing/attack_self(mob/user) + if(isnull(activator) || !COOLDOWN_FINISHED(src, spam_cd)) + balloon_alert(user, isnull(activator) ? "you shouldnt be seeing this" : "on cooldown!") + return + if(istype(activator, /obj/item/assembly/signaler)) + return //no signallers, signallers send a signal and i can imagine this having bad sideeffects if some has multiple of the same frequency in their backpack and uses them inhand by accident + activator.activate() + update_icon(UPDATE_ICON_STATE) + user.balloon_alert_to_viewers("arming!") + COOLDOWN_START(src, spam_cd, 1 SECONDS) + /obj/item/grenade/iedcasing/detonate(mob/living/lanced_by) //Blowing that can up + if(effects[/obj/item/shard]) //this has to be before so it initializes us a pellet cloud or something + shrapnel_radius = effects[/obj/item/shard] . = ..() if(!.) return update_mob() - explosion(src, devastation_range = -1, heavy_impact_range = -1, light_impact_range = 2, flame_range = 4) // small explosion, plus a very large fireball. + for(var/i = 1 to effects[/obj/item/food/meat/slab]) + new /obj/effect/gibspawner/generic(loc) + if(effects[/obj/item/paper]) + for(var/turf/open/floor in view(effects[/obj/item/paper], loc)) //this couldve been light impact range but fake pipebombs exploding into confetti is funny + new /obj/effect/decal/cleanable/confetti(floor) + var/heavy = floor(power * 0.2) + var/light = round(power * 0.7, 1) + var/flame = round(power + rand(-1, 1), 1) + explosion(loc, devastation_range = -1, heavy_impact_range = heavy, light_impact_range = light, flame_range = flame, explosion_cause = src) + + if(effects[/obj/item/stack/ore/bluespace_crystal/refined]) + for(var/mob/living/victim in view(light, loc)) + do_teleport(victim, get_turf(victim), min(12, effects[/obj/item/stack/ore/bluespace_crystal/refined] * 3), asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) + qdel(src) -/obj/item/grenade/iedcasing/change_det_time() - return //always be random. +/obj/item/grenade/iedcasing/Destroy() + . = ..() + activator = null -/obj/item/grenade/iedcasing/examine(mob/user) + + + +/obj/item/grenade/iedcasing/spawned + power = 2.5 //20u welding fuel + activator = /obj/item/assembly/timer + +#define MAX_STUFFINGS 3 + +/obj/item/sliced_pipe + name = "halved pipe" + desc = "Two half-size pipes made from one." + w_class = WEIGHT_CLASS_SMALL + icon = 'icons/obj/weapons/grenade.dmi' + icon_state = "slicedapart" + /// Are wires inserted? If so, we are on the final step + var/wires_are_in = FALSE + /// Typecache of items we are allowed to stuff into the pipebomb for effects, only add items with effects + var/static/list/allowed = typecacheof(list( + /obj/item/food/meat/slab, + /obj/item/paper, + /obj/item/shard, + /obj/item/stack/ore/bluespace_crystal/refined, + )) + //this probably shouldve been a blacklist instead but god do i not wanna update this anytime a new assembly is added + /// A static list of types of assemblies that are allowed to be used to finish the bomb + var/static/list/allowed_activators = list( + /obj/item/assembly/signaler, + /obj/item/assembly/prox_sensor, + /obj/item/assembly/mousetrap, + /obj/item/assembly/mousetrap/armed, + /obj/item/assembly/timer, + /obj/item/assembly/wiremod, + /obj/item/assembly/voice, + ) + /// Static list of reagent to explosive power + var/static/list/fuel_power = list( + /datum/reagent/fuel = 0.5, + /datum/reagent/gunpowder = 1, + /datum/reagent/nitroglycerin = 2, + /datum/reagent/tatp = 2.5, + ) + /// Explosion power to be transferred to the new pipebomb + var/power = 5 + +/obj/item/sliced_pipe/Initialize(mapload) + . = ..() + create_reagents(20, OPENCONTAINER) + +/obj/item/sliced_pipe/examine(mob/user) . = ..() - . += "You can't tell when it will explode!" + if(!wires_are_in) + . += span_notice("You could stuff something in, or fill it with fuel or some other volatile chemical..") + . += span_notice("Afterwards, add some cable.") + else + . += span_notice("The wires are just dangling from it, you need some sort of activating assembly.") + +/obj/item/sliced_pipe/attackby(obj/item/item, mob/user, params) + if(!wires_are_in) + // here we can stuff in additional objects for a cooler effect + if(is_type_in_typecache(item, allowed) && contents.len < MAX_STUFFINGS) + balloon_alert(user, "stuffed in") + var/atom/movable/to_put = item + if(isstack(item)) + var/obj/item/stack/as_stack = item + to_put = as_stack.split_stack(user = null, amount = 1) + as_stack.merge_type = null //prevent them from merging inside for contents.len + to_put.forceMove(src) + return + + //if the item has reagents lets allow it to transfer + if(item.reagents) + return ..() + if(reagents.total_volume < 5) + balloon_alert(user, "add more fuel!") + return + + var/obj/item/stack/cable_coil/coil = item + if(!istype(coil)) + return + if (coil.get_amount() < 15) + balloon_alert(user, "need 15 length!") + return + coil.use(15) + + var/cur_power = 0 + for(var/datum/reagent/reagent as anything in reagents.reagent_list) + if(!(reagent.type in fuel_power)) + continue + cur_power += fuel_power[reagent.type] * reagent.volume / reagents.maximum_volume + + power *= cur_power + power -= contents.len / 2 + + balloon_alert(user, "wires attached") + icon_state = "[icon_state]-cable" + reagents.flags = SEALED_CONTAINER + wires_are_in = TRUE + else // wires are in, lets finish this up + var/obj/item/assembly/assembly = item + if(!istype(assembly) || !(assembly.type in allowed_activators)) + return + if(assembly.secured) + balloon_alert(user, "unsecure assembly first!") + return + if(!user.transferItemToLoc(assembly, src)) + return + user.balloon_alert(user, "attached") + + var/obj/item/grenade/iedcasing/pipebomb = new(drop_location()) + for(var/atom/movable/item_inside as anything in contents) + item_inside.forceMove(pipebomb) + + pipebomb.power = power + pipebomb.attach_activator(assembly) + pipebomb.setup_effects_from_contents() + var/was_in_hands = (loc == user) + qdel(src) + if(was_in_hands) + user.put_in_hands(pipebomb) + +#undef MAX_STUFFINGS diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index c6dc9cb7a2f11..2255afe10541c 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -219,9 +219,9 @@ /obj/item/hand_item/slapper/attack(mob/living/slapped, mob/living/carbon/human/user) SEND_SIGNAL(user, COMSIG_LIVING_SLAP_MOB, slapped) - if(ishuman(slapped)) - var/mob/living/carbon/human/human_slapped = slapped - SEND_SIGNAL(human_slapped, COMSIG_ORGAN_WAG_TAIL, FALSE) + if(iscarbon(slapped)) + var/mob/living/carbon/potential_tailed = slapped + potential_tailed.unwag_tail() user.do_attack_animation(slapped) var/slap_volume = 50 diff --git a/code/game/objects/items/implants/implant_freedom.dm b/code/game/objects/items/implants/implant_freedom.dm index af5d955dfbc9a..827cc8216a58b 100644 --- a/code/game/objects/items/implants/implant_freedom.dm +++ b/code/game/objects/items/implants/implant_freedom.dm @@ -17,17 +17,31 @@ /obj/item/implant/freedom/activate() . = ..() var/mob/living/carbon/carbon_imp_in = imp_in - if(!carbon_imp_in.handcuffed && !carbon_imp_in.legcuffed) + if(!can_trigger(carbon_imp_in)) balloon_alert(carbon_imp_in, "no restraints!") return uses-- carbon_imp_in.uncuff() + var/obj/item/clothing/shoes/shoes = carbon_imp_in.shoes + if(istype(shoes) && shoes.tied == SHOES_KNOTTED) + shoes.adjust_laces(SHOES_TIED, carbon_imp_in) + if(!uses) addtimer(CALLBACK(carbon_imp_in, TYPE_PROC_REF(/atom, balloon_alert), carbon_imp_in, "implant degraded!"), 1 SECONDS) qdel(src) +/obj/item/implant/freedom/proc/can_trigger(mob/living/carbon/implanted_in) + if(implanted_in.handcuffed || implanted_in.legcuffed) + return TRUE + + var/obj/item/clothing/shoes/shoes = implanted_in.shoes + if(istype(shoes) && shoes.tied == SHOES_KNOTTED) + return TRUE + + return FALSE + /obj/item/implant/freedom/get_data() return "Implant Specifications:
\ Name: Freedom Beacon
\ diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 1e8a148e9b1e8..9a55b1cd57464 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -235,6 +235,13 @@ if(!target_mob.reagents || reagents.total_volume <= 0) return ..() + if(target_mob.is_mouth_covered(ITEM_SLOT_HEAD) || target_mob.is_mouth_covered(ITEM_SLOT_MASK)) + if(target_mob == user) + target_mob.balloon_alert(user, "can't eat with mouth covered!") + else + target_mob.balloon_alert(user, "[target_mob.p_their()] mouth is covered!") + return TRUE + if(target_mob == user) user.visible_message( span_notice("[user] scoops a spoonful into [user.p_their()] mouth."), diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index b7273ed0a3264..8b4808848c245 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -124,6 +124,7 @@ name = "combat knife" icon = 'icons/obj/weapons/stabby.dmi' icon_state = "buckknife" + worn_icon_state = "buckknife" desc = "A military combat utility survival knife." embedding = list("pain_mult" = 4, "embed_chance" = 65, "fall_chance" = 10, "ignore_throwspeed_threshold" = TRUE) force = 20 @@ -131,11 +132,32 @@ attack_verb_continuous = list("slashes", "stabs", "slices", "tears", "lacerates", "rips", "cuts") attack_verb_simple = list("slash", "stab", "slice", "tear", "lacerate", "rip", "cut") bayonet = TRUE + slot_flags = ITEM_SLOT_MASK + +/obj/item/knife/combat/Initialize(mapload) + . = ..() + AddComponent(/datum/component/knockoff, 90, list(BODY_ZONE_PRECISE_MOUTH), slot_flags) //90% to knock off when wearing a mask + +/obj/item/knife/combat/dropped(mob/living/user, slot) + . = ..() + if(user.get_item_by_slot(ITEM_SLOT_MASK) == src && !user.has_status_effect(/datum/status_effect/choke) && prob(20)) + user.apply_damage(5, BRUTE, BODY_ZONE_HEAD) + playsound(user, 'sound/weapons/slice.ogg', 50, TRUE) + user.visible_message(span_danger("[user] accidentally cuts [user.p_them()]self while pulling [src] out of [user.p_them()] teeth! What a doofus!"), span_userdanger("You accidentally cut your mouth with [src]!")) + +/obj/item/knife/combat/equipped(mob/living/user, slot, initial = FALSE) + . = ..() + if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(20)) + if(user.get_item_by_slot(ITEM_SLOT_MASK) == src) + user.apply_status_effect(/datum/status_effect/choke, src) + user.visible_message(span_danger("[user] accidentally swallows [src]!")) + playsound(user, 'sound/items/eatfood.ogg', 100, TRUE) /obj/item/knife/combat/survival name = "survival knife" icon = 'icons/obj/weapons/stabby.dmi' icon_state = "survivalknife" + worn_icon_state = "survivalknife" embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10) desc = "A hunting grade survival knife." force = 15 @@ -153,6 +175,7 @@ desc = "A sharpened bone. The bare minimum in survival." embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10) obj_flags = parent_type::obj_flags & ~CONDUCTS_ELECTRICITY + slot_flags = NONE force = 15 throwforce = 15 custom_materials = null diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index da0bf1dbc64fb..b692b58bfcf2d 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -427,6 +427,12 @@ on_stun_volume = 50 active = FALSE context_living_rmb_active = "Harmful Stun" + light_range = 1.5 + light_system = OVERLAY_LIGHT + light_on = FALSE + light_color = LIGHT_COLOR_ORANGE + light_power = 0.5 + var/throw_stun_chance = 35 var/obj/item/stock_parts/cell/cell @@ -541,6 +547,8 @@ active = !active balloon_alert(user, "turned [active ? "on" : "off"]") playsound(src, SFX_SPARKS, 75, TRUE, -1) + toggle_light(user) + do_sparks(1, TRUE, src) else active = FALSE if(!cell) @@ -550,6 +558,11 @@ update_appearance() add_fingerprint(user) +/// Toggles the stun baton's light +/obj/item/melee/baton/security/proc/toggle_light(mob/user) + set_light_on(!light_on) + return + /obj/item/melee/baton/security/proc/deductcharge(deducted_charge) if(!cell) return @@ -559,6 +572,7 @@ if(active && cell.charge < cell_hit_cost) //we're below minimum, turn off active = FALSE + set_light_on(FALSE) update_appearance() playsound(src, SFX_SPARKS, 75, TRUE, -1) @@ -649,6 +663,8 @@ if (!cell || cell.charge < cell_hit_cost) return active = !active + toggle_light() + do_sparks(1, TRUE, src) playsound(src, SFX_SPARKS, 75, TRUE, -1) update_appearance() diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 874e82261f338..6df8c2bc0cd52 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -5,7 +5,7 @@ attack_verb_continuous = list("hits", "taps", "pokes") attack_verb_simple = list("hit", "tap", "poke") resistance_flags = FIRE_PROOF - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 3 light_power = 1 light_on = FALSE diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index 8eba5081d2266..7ac22d00897ea 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -403,3 +403,61 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle_keycardpad, 32) playsound(src, SFX_SPARKS, 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) do_sparks(3, cardinal_only = FALSE, source = src) qdel(src) + +/obj/structure/puzzle_blockade/oneway + name = "one-way gate" + desc = "A wall of solid light, likely defending something important. Virtually indestructible." + icon = 'icons/obj/structures.dmi' + icon_state = "oneway" + base_icon_state = "oneway" + light_color = COLOR_BIOLUMINESCENCE_BLUE + light_range = 1 + density = FALSE + +/obj/structure/puzzle_blockade/oneway/update_icon_state() + icon_state = "[base_icon_state][density ? "" : "-off"]" + return ..() + +/obj/structure/puzzle_blockade/oneway/CanAllowThrough(atom/movable/mover, border_dir) + return ..() && (REVERSE_DIR(border_dir) == dir || get_turf(mover) == get_turf(src)) + +/obj/structure/puzzle_blockade/oneway/CanAStarPass(border_dir, datum/can_pass_info/pass_info) + return REVERSE_DIR(border_dir) == dir + +/obj/structure/puzzle_blockade/oneway/try_signal(datum/source) + density = FALSE + update_appearance(UPDATE_ICON) + +/obj/effect/puzzle_poddoor_open + name = "puzzle-poddoor relay" + desc = "activates poddoors if activated with a puzzle signal." + icon = 'icons/effects/mapping_helpers.dmi' + icon_state = "" + anchored = TRUE + invisibility = INVISIBILITY_MAXIMUM + /// if we receive a puzzle signal with this we do our thing + var/queue_id + /// door id + var/id + +/obj/effect/puzzle_poddoor_open/Initialize(mapload) + . = ..() + if(isnull(id) || isnull(queue_id)) + log_mapping("[src] id:[id] has no id or door id and has been deleted") + return INITIALIZE_HINT_QDEL + + SSqueuelinks.add_to_queue(src, queue_id) + +/obj/effect/puzzle_poddoor_open/MatchedLinks(id, list/partners) + for(var/partner in partners) + RegisterSignal(partner, COMSIG_PUZZLE_COMPLETED, PROC_REF(try_signal)) + +/obj/effect/puzzle_poddoor_open/proc/try_signal(datum/source) + SIGNAL_HANDLER + var/openclose + for(var/obj/machinery/door/poddoor/door as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/poddoor)) + if(door.id != id) + continue + if(isnull(openclose)) + openclose = door.density + INVOKE_ASYNC(door, openclose ? TYPE_PROC_REF(/obj/machinery/door/poddoor, open) : TYPE_PROC_REF(/obj/machinery/door/poddoor, close)) diff --git a/code/game/objects/items/rcd/RCD.dm b/code/game/objects/items/rcd/RCD.dm index 7e14ca91b3ff1..9570614b400b3 100644 --- a/code/game/objects/items/rcd/RCD.dm +++ b/code/game/objects/items/rcd/RCD.dm @@ -521,7 +521,7 @@ ///How much charge is used up for each matter unit. var/mass_to_energy = 16 -/obj/item/construction/rcd/exosuit/ui_status(mob/user) +/obj/item/construction/rcd/exosuit/ui_status(mob/user, datum/ui_state/state) if(ismecha(owner)) return owner.ui_status(user) return UI_CLOSE diff --git a/code/game/objects/items/rcd/RCL.dm b/code/game/objects/items/rcd/RCL.dm index 9134a7ac1e537..1d966d37670f4 100644 --- a/code/game/objects/items/rcd/RCL.dm +++ b/code/game/objects/items/rcd/RCL.dm @@ -16,7 +16,7 @@ w_class = WEIGHT_CLASS_NORMAL var/max_amount = 90 var/active = FALSE - actions_types = list(/datum/action/item_action/rcl_col,/datum/action/item_action/rcl_gui,) + actions_types = list(/datum/action/item_action/rcl_col,/datum/action/item_action/rcl_gui) var/list/colors = list("red", "yellow", "green", "blue", "pink", "orange", "cyan", "white") var/current_color_index = 1 var/ghetto = FALSE diff --git a/code/game/objects/items/rcd/RPD.dm b/code/game/objects/items/rcd/RPD.dm index 9af1041779e1e..e47779776059b 100644 --- a/code/game/objects/items/rcd/RPD.dm +++ b/code/game/objects/items/rcd/RPD.dm @@ -587,7 +587,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( if(queued_pipe_flipped) tube.setDir(turn(queued_pipe_dir, 45 + ROTATION_FLIP)) - tube.AfterRotation(user, ROTATION_FLIP) + tube.post_rotation(user, ROTATION_FLIP) tube.add_fingerprint(usr) if(mode & WRENCH_MODE) diff --git a/code/game/objects/items/robot/items/hud.dm b/code/game/objects/items/robot/items/hud.dm index 6b11c71941b7f..7ee8a9386258b 100644 --- a/code/game/objects/items/robot/items/hud.dm +++ b/code/game/objects/items/robot/items/hud.dm @@ -1,10 +1,10 @@ /obj/item/borg/sight var/sight_mode = null + icon = 'icons/obj/clothing/glasses.dmi' /obj/item/borg/sight/xray name = "\proper X-ray vision" - icon = 'icons/obj/signs.dmi' - icon_state = "securearea" + icon_state = "securityhudnight" sight_mode = BORGXRAY /obj/item/borg/sight/thermal diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index e92b4332846c6..367c619333e81 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -381,7 +381,7 @@ else return ..() -/obj/item/robot_suit/ui_status(mob/user) +/obj/item/robot_suit/ui_status(mob/user, datum/ui_state/state) if(isobserver(user)) return ..() var/obj/item/held_item = user.get_active_held_item() diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index b711bb63d4519..3e3af7bc36f5e 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -397,4 +397,48 @@ balloon_alert(user, "extend it first!") return COMPONENT_BLOCK_ITEM_DISARM_ATTACK +/datum/armor/item_shield/ballistic + melee = 30 + bullet = 85 + bomb = 10 + laser = 80 + +/obj/item/shield/ballistic + name = "ballistic shield" + desc = "A heavy shield designed for blocking projectiles, weaker to melee." + icon_state = "ballistic" + inhand_icon_state = "ballistic" + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, /datum/material/titanium =SHEET_MATERIAL_AMOUNT) + max_integrity = 75 + shield_break_leftover = /obj/item/stack/rods/ten + armor_type = /datum/armor/item_shield/ballistic + +/obj/item/shield/ballistic/attackby(obj/item/attackby_item, mob/user, params) + if(istype(attackby_item, /obj/item/stack/sheet/mineral/titanium)) + if (atom_integrity >= max_integrity) + to_chat(user, span_warning("[src] is already in perfect condition.")) + return + var/obj/item/stack/sheet/mineral/titanium/titanium_sheet = attackby_item + titanium_sheet.use(1) + atom_integrity = max_integrity + to_chat(user, span_notice("You repair [src] with [titanium_sheet].")) + return + return ..() + +/datum/armor/item_shield/improvised + melee = 40 + bullet = 30 + laser = 30 + +/obj/item/shield/improvised + name = "improvised shield" + desc = "A crude shield made out of several sheets of iron taped together, not very durable." + icon_state = "improvised" + inhand_icon_state = "improvised" + custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 2) + max_integrity = 35 + shield_break_leftover = /obj/item/stack/rods/two + armor_type = /datum/armor/item_shield/improvised + block_sound = 'sound/items/trayhit2.ogg' + #undef BATON_BASH_COOLDOWN diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm index 59fbf61f62a90..cdc786fc8db56 100644 --- a/code/game/objects/items/shrapnel.dm +++ b/code/game/objects/items/shrapnel.dm @@ -44,6 +44,15 @@ ricochet_incidence_leeway = 0 ricochet_decay_chance = 0.9 +/obj/projectile/bullet/shrapnel/ied + name = "flying glass shrapnel" + damage = 15 + range = 6 + ricochets_max = 1 + ricochet_chance = 40 + shrapnel_type = /obj/item/shard + ricochet_incidence_leeway = 60 + /obj/projectile/bullet/pellet/stingball name = "stingball pellet" damage = 3 diff --git a/code/game/objects/items/stacks/golem_food/golem_status_effects.dm b/code/game/objects/items/stacks/golem_food/golem_status_effects.dm index c89fae800b9ba..514ab36ed66d3 100644 --- a/code/game/objects/items/stacks/golem_food/golem_status_effects.dm +++ b/code/game/objects/items/stacks/golem_food/golem_status_effects.dm @@ -404,7 +404,7 @@ . = ..() if (!.) return - owner.AddElement(/datum/element/waddling) + owner.AddElementTrait(TRAIT_WADDLING, TRAIT_STATUS_EFFECT(id), /datum/element/waddling) ADD_TRAIT(owner, TRAIT_NO_SLIP_WATER, TRAIT_STATUS_EFFECT(id)) slipperiness = owner.AddComponent(\ /datum/component/slippery,\ @@ -418,8 +418,7 @@ return owner.body_position == LYING_DOWN /datum/status_effect/golem/bananium/on_remove() - REMOVE_TRAIT(owner, TRAIT_NO_SLIP_WATER, TRAIT_STATUS_EFFECT(id)) - owner.RemoveElement(/datum/element/waddling) + owner.remove_traits(owner, list(TRAIT_WADDLING, TRAIT_NO_SLIP_WATER), TRAIT_STATUS_EFFECT(id)) QDEL_NULL(slipperiness) return ..() @@ -441,7 +440,7 @@ if (!.) return to_chat(owner, span_notice("You start to emit a healthy glow.")) - owner.light_system = MOVABLE_LIGHT + owner.light_system = OVERLAY_LIGHT lightbulb = owner.AddComponent(/datum/component/overlay_lighting, _range = glow_range, _power = glow_power, _color = glow_color) owner.add_filter(LIGHTBULB_FILTER, 2, list("type" = "outline", "color" = glow_color, "alpha" = 60, "size" = 1)) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 500b2500c8ad5..e9426a913ec70 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -40,11 +40,6 @@ GLOBAL_LIST_INIT(human_recipes, list( \ inhand_icon_state = null merge_type = /obj/item/stack/sheet/animalhide/corgi -GLOBAL_LIST_INIT(gondola_recipes, list ( \ - new/datum/stack_recipe("gondola mask", /obj/item/clothing/mask/gondola, 1, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("gondola suit", /obj/item/clothing/under/costume/gondola, 2, check_density = FALSE, category = CAT_CLOTHING), \ - )) - /obj/item/stack/sheet/animalhide/corgi/five amount = 5 @@ -59,6 +54,12 @@ GLOBAL_LIST_INIT(gondola_recipes, list ( \ /obj/item/stack/sheet/animalhide/mothroach/five amount = 5 +GLOBAL_LIST_INIT(gondola_recipes, list ( \ + new/datum/stack_recipe("gondola mask", /obj/item/clothing/mask/gondola, 1, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("gondola suit", /obj/item/clothing/under/costume/gondola, 2, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("gondola bedsheet", /obj/item/bedsheet/gondola, 1, check_density = FALSE, category = CAT_FURNITURE), \ + )) + /obj/item/stack/sheet/animalhide/gondola name = "gondola hide" desc = "The extremely valuable product of gondola hunting." diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 756b2a25a0d8e..e042ad4c01cb3 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -74,6 +74,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ null, \ new/datum/stack_recipe("atmos canister", /obj/machinery/portable_atmospherics/canister, 10, time = 3 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ATMOSPHERIC), \ + new/datum/stack_recipe("pipe", /obj/item/pipe/quaternary/pipe/crafted, 1, time = 4 SECONDS, check_density = FALSE, category = CAT_ATMOSPHERIC), \ null, \ new/datum/stack_recipe("floor tile", /obj/item/stack/tile/iron/base, 1, 4, 20, category = CAT_TILES), \ new/datum/stack_recipe("iron rod", /obj/item/stack/rods, 1, 2, 60, category = CAT_MISC), \ @@ -787,7 +788,8 @@ GLOBAL_LIST_INIT(plastic_recipes, list( new /datum/stack_recipe("mannequin", /obj/structure/mannequin/plastic, 25, time = 5 SECONDS, one_per_turf = TRUE, check_density = FALSE, category = CAT_ENTERTAINMENT), \ new /datum/stack_recipe("wet floor sign", /obj/item/clothing/suit/caution, 2, check_density = FALSE, category = CAT_EQUIPMENT), \ new /datum/stack_recipe("warning cone", /obj/item/clothing/head/cone, 2, check_density = FALSE, category = CAT_EQUIPMENT), \ - new /datum/stack_recipe("blank wall sign", /obj/item/sign, 1, check_density = FALSE, category = CAT_FURNITURE))) + new /datum/stack_recipe("blank wall sign", /obj/item/sign, 1, check_density = FALSE, category = CAT_FURNITURE), \ + new /datum/stack_recipe("rebellion mask", /obj/item/clothing/mask/rebellion, 1, check_density = FALSE, category = CAT_CLOTHING))) /obj/item/stack/sheet/plastic name = "plastic" diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 51d21d6ef6cc3..a6bbe3bfe19d8 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -21,7 +21,7 @@ var/datum/component/uplink/hidden_uplink = uplink.GetComponent(/datum/component/uplink) if(hidden_uplink) - hidden_uplink.add_telecrystals(amount) + hidden_uplink.uplink_handler.add_telecrystals(amount) use(amount) to_chat(user, span_notice("You press [src] onto yourself and charge your hidden uplink.")) return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/items/stacks/tickets.dm b/code/game/objects/items/stacks/tickets.dm index 20e6843b97707..d1bd7681b8a8b 100644 --- a/code/game/objects/items/stacks/tickets.dm +++ b/code/game/objects/items/stacks/tickets.dm @@ -8,14 +8,9 @@ max_amount = 30 merge_type = /obj/item/stack/arcadeticket -/obj/item/stack/arcadeticket/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1) - . = ..() - update_appearance() - /obj/item/stack/arcadeticket/update_icon_state() . = ..() - var/amount = get_amount() - switch(amount) + switch(get_amount()) if(12 to INFINITY) icon_state = "arcade-ticket_4" if(6 to 12) @@ -25,10 +20,5 @@ else icon_state = "arcade-ticket" -/obj/item/stack/arcadeticket/proc/pay_tickets() - amount -= 2 - if (amount == 0) - qdel(src) - /obj/item/stack/arcadeticket/thirty amount = 30 diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 68463dad2b0c1..10c95056afffb 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -193,6 +193,12 @@ icon_state = "backpack-virology" inhand_icon_state = "viropack" +/obj/item/storage/backpack/floortile + name = "floortile backpack" + desc = "It's a backpack especially designed for use in floortiles..." + icon_state = "floortile_backpack" + inhand_icon_state = "backpack" + /obj/item/storage/backpack/ert name = "emergency response team commander backpack" desc = "A spacious backpack with lots of pockets, worn by the Commander of an Emergency Response Team." diff --git a/code/game/objects/items/storage/boxes/clothes_boxes.dm b/code/game/objects/items/storage/boxes/clothes_boxes.dm index 4c18ef4f6df28..18a6ec31d87c9 100644 --- a/code/game/objects/items/storage/boxes/clothes_boxes.dm +++ b/code/game/objects/items/storage/boxes/clothes_boxes.dm @@ -196,3 +196,18 @@ new /obj/item/clothing/suit/hooded/chaplain_hoodie/divine_archer(src) new /obj/item/clothing/gloves/divine_archer(src) new /obj/item/clothing/shoes/divine_archer(src) + +/obj/item/storage/box/floor_camo + name = "floor tile camo box" + desc = "Thank you for shopping from Camo-J's, our uniquely designed \ + floor-tile 'NT scum' styled camouflage fatigues is the ultimate \ + espionage uniform used by the very best. Providing the best \ + flexibility, with our latest Camo-tech threads. Perfect for \ + risky-espionage hallway operations. Enjoy our product!" + +/obj/item/storage/box/floor_camo/PopulateContents() + new /obj/item/clothing/under/syndicate/floortilecamo(src) + new /obj/item/clothing/mask/floortilebalaclava(src) + new /obj/item/clothing/gloves/combat/floortile(src) + new /obj/item/clothing/shoes/jackboots/floortile(src) + new /obj/item/storage/backpack/floortile(src) diff --git a/code/game/objects/items/storage/boxes/job_boxes.dm b/code/game/objects/items/storage/boxes/job_boxes.dm index bb656061c1c55..220fdc2f79522 100644 --- a/code/game/objects/items/storage/boxes/job_boxes.dm +++ b/code/game/objects/items/storage/boxes/job_boxes.dm @@ -30,10 +30,8 @@ if(!isnull(mask_type)) new mask_type(src) - if(!isplasmaman(loc)) + if(!isnull(internal_type)) new internal_type(src) - else - new /obj/item/tank/internals/plasmaman/belt(src) if(!isnull(medipen_type)) new medipen_type(src) diff --git a/code/game/objects/items/storage/boxes/security_boxes.dm b/code/game/objects/items/storage/boxes/security_boxes.dm index 8e55986fb40d8..459c0ab7ce29e 100644 --- a/code/game/objects/items/storage/boxes/security_boxes.dm +++ b/code/game/objects/items/storage/boxes/security_boxes.dm @@ -174,6 +174,16 @@ for(var/i in 1 to 7) new /obj/item/ammo_casing/shotgun/buckshot(src) +/obj/item/storage/box/slugs + name = "box of shotgun shells (Lethal - Slugs)" + desc = "A box full of lethal shotgun slugs, designed for shotguns." + icon_state = "breacher_box" + illustration = null + +/obj/item/storage/box/slugs/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/ammo_casing/shotgun(src) + /obj/item/storage/box/beanbag name = "box of shotgun shells (Less Lethal - Beanbag)" desc = "A box full of beanbag shotgun shells, designed for shotguns." diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 902af39bbea0e..3e7b73c93f332 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -237,6 +237,8 @@ name = "order lockbox" desc = "A box used to secure small cargo orders from being looted by those who didn't order it. Yeah, cargo tech, that means you." icon_state = "secure" + icon_closed = "secure" + icon_locked = "secure_locked" icon_broken = "secure+b" inhand_icon_state = "sec-case" lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi' @@ -265,8 +267,10 @@ if(privacy_lock) atom_storage.locked = STORAGE_NOT_LOCKED + icon_state = icon_locked else 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.")) diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index e389b990a4ca8..0ecd943b60457 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -271,6 +271,24 @@ /obj/item/storage/pill_bottle/penacid = 1) generate_items_inside(items_inside,src) +/obj/item/storage/medkit/tactical_lite + name = "combat first aid kit" + icon_state = "medkit_tactical" + inhand_icon_state = "medkit-tactical" + damagetype_healed = HEAL_ALL_DAMAGE + +/obj/item/storage/medkit/tactical_lite/PopulateContents() + if(empty) + return + var/static/list/items_inside = list( + /obj/item/healthanalyzer/advanced = 1, + /obj/item/reagent_containers/hypospray/medipen/atropine = 1, + /obj/item/stack/medical/gauze = 1, + /obj/item/stack/medical/suture/medicated = 2, + /obj/item/stack/medical/mesh/advanced = 2, + ) + generate_items_inside(items_inside, src) + /obj/item/storage/medkit/tactical name = "combat medical kit" desc = "I hope you've got insurance." diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 6eefaffe61e1a..429acfb9ce966 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -773,33 +773,6 @@ new /obj/item/modular_computer/pda/syndicate_contract_uplink(src) new /obj/item/storage/box/syndicate/contractor_loadout(src) new /obj/item/melee/baton/telescopic/contractor_baton(src) - - // All about 4 TC or less - some nukeops only items, but fit nicely to the theme. - var/static/list/item_list = list( - /obj/item/storage/backpack/duffelbag/syndie/x4, - /obj/item/storage/box/syndie_kit/throwing_weapons, - /obj/item/gun/syringe/syndicate, - /obj/item/pen/edagger, - /obj/item/pen/sleepy, - /obj/item/flashlight/emp, - /obj/item/reagent_containers/syringe/mulligan, - /obj/item/clothing/shoes/chameleon/noslip, - /obj/item/storage/medkit/tactical, - /obj/item/encryptionkey/syndicate, - /obj/item/clothing/glasses/thermal/syndi, - /obj/item/slimepotion/slime/sentience/nuclear, - /obj/item/storage/box/syndie_kit/imp_radio, - /obj/item/storage/box/syndie_kit/imp_uplink, - /obj/item/clothing/gloves/krav_maga/combatglovesplus, - /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot, - /obj/item/reagent_containers/hypospray/medipen/stimulants, - /obj/item/storage/box/syndie_kit/imp_freedom, - /obj/item/toy/eightball/haunted, - ) - for(var/i in 1 to 3) - var/selected_item = pick_n_take(item_list) - new selected_item(src) - // Paper guide is always last. new /obj/item/paper/contractor_guide(src) @@ -810,12 +783,16 @@ illustration = "writing_syndie" /obj/item/storage/box/syndicate/contractor_loadout/PopulateContents() + new /obj/item/mod/control/pre_equipped/infiltrator(src) new /obj/item/clothing/head/helmet/space/syndicate/contract(src) new /obj/item/clothing/suit/space/syndicate/contract(src) new /obj/item/clothing/under/chameleon(src) new /obj/item/clothing/mask/chameleon(src) - new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src) new /obj/item/card/id/advanced/chameleon(src) + new /obj/item/clothing/glasses/thermal/syndi(src) + new /obj/item/storage/toolbox/syndicate(src) + new /obj/item/jammer(src) + new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src) new /obj/item/lighter(src) #undef KIT_RECON diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 6c11c43550718..a670a966805e7 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -440,6 +440,10 @@ if(LAZYLEN(assembly.assemblies) == igniter_count) return + + if(isitem(loc)) // we are in a storage item + balloon_alert(user, "can't reach!") + return if((src in user.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE)) && !user.canUnEquip(src)) balloon_alert(user, "it's stuck!") @@ -456,6 +460,7 @@ tank_assembly = assembly //Tell the tank about its assembly part assembly.master = src //Tell the assembly about its new owner assembly.on_attach() + w_class = WEIGHT_CLASS_BULKY balloon_alert(user, "bomb assembled") update_appearance(UPDATE_OVERLAYS) @@ -469,6 +474,7 @@ user.put_in_hands(tank_assembly) tank_assembly.master = null tank_assembly = null + w_class = initial(w_class) update_appearance(UPDATE_OVERLAYS) /// Ignites the contents of the tank. Called when receiving a signal if the tank is welded and has an igniter attached. diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 439a2ce336e20..6a75e99a36a52 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -17,7 +17,7 @@ usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg') drop_sound = 'sound/items/handling/weldingtool_drop.ogg' pickup_sound = 'sound/items/handling/weldingtool_pickup.ogg' - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 2 light_power = 0.75 light_color = LIGHT_COLOR_FIRE diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 91f1ca925abf8..cb57c5049bb8c 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -373,6 +373,8 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag) /// If we can unwrench this object; returns SUCCESSFUL_UNFASTEN and FAILED_UNFASTEN, which are both TRUE, or CANT_UNFASTEN, which isn't. /obj/proc/can_be_unfasten_wrench(mob/user, silent) + if(obj_flags & NO_DECONSTRUCTION) + return CANT_UNFASTEN if(!(isfloorturf(loc) || isindestructiblefloor(loc)) && !anchored) to_chat(user, span_warning("[src] needs to be on the floor to be secured!")) return FAILED_UNFASTEN @@ -380,7 +382,7 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag) /// Try to unwrench an object in a WONDERFUL DYNAMIC WAY /obj/proc/default_unfasten_wrench(mob/user, obj/item/wrench, time = 20) - if((obj_flags & NO_DECONSTRUCTION) || wrench.tool_behaviour != TOOL_WRENCH) + if(wrench.tool_behaviour != TOOL_WRENCH) return CANT_UNFASTEN var/turf/ground = get_turf(src) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 1943f0aa39853..3d976b72ccabc 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -69,3 +69,10 @@ /obj/structure/animate_atom_living(mob/living/owner) new /mob/living/simple_animal/hostile/mimic/copy(drop_location(), src, owner) + +/// For when a mob comes flying through the window, smash it and damage the mob +/obj/structure/proc/smash_and_injure(mob/living/flying_mob, atom/oldloc, direction) + flying_mob.balloon_alert_to_viewers("smashed through!") + flying_mob.apply_damage(damage = rand(5, 15), damagetype = BRUTE, wound_bonus = 15, bare_wound_bonus = 25, sharpness = SHARP_EDGED, attack_direction = get_dir(src, oldloc)) + new /obj/effect/decal/cleanable/glass(get_step(flying_mob, flying_mob.dir)) + deconstruct(disassembled = FALSE) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 66de98bd50ab4..f80042f5679a7 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -4,10 +4,6 @@ BEDSHEETS LINEN BINS */ -#define BEDSHEET_ABSTRACT "abstract" -#define BEDSHEET_SINGLE "single" -#define BEDSHEET_DOUBLE "double" - /obj/item/bedsheet name = "bedsheet" desc = "A surprisingly soft linen bedsheet." @@ -28,7 +24,9 @@ LINEN BINS dog_fashion = /datum/dog_fashion/head/ghost /// Custom nouns to act as the subject of dreams var/list/dream_messages = list("white") - /// The number of cloth sheets to be dropped by this bedsheet when cut + /// Cutting it up will yield this. + var/stack_type = /obj/item/stack/sheet/cloth + /// The number of sheets dropped by this bedsheet when cut var/stack_amount = 3 /// Denotes if the bedsheet is a single, double, or other kind of bedsheet var/bedsheet_type = BEDSHEET_SINGLE @@ -126,7 +124,7 @@ LINEN BINS /obj/item/bedsheet/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness()) if (!(flags_1 & HOLOGRAM_1)) - var/obj/item/stack/sheet/cloth/shreds = new (get_turf(src), stack_amount) + var/obj/item/stack/shreds = new stack_type(get_turf(src), stack_amount) if(!QDELETED(shreds)) //stacks merged transfer_fingerprints_to(shreds) shreds.add_fingerprint(user) @@ -338,6 +336,60 @@ LINEN BINS inhand_icon_state = "sheetian" dream_messages = list("a dog", "a corgi", "woof", "bark", "arf") +/obj/item/bedsheet/runtime + icon_state = "sheetruntime" + inhand_icon_state = "sheetruntime" + dream_messages = list("a kitty", "a cat", "meow", "purr", "nya~") + +/obj/item/bedsheet/pirate + name = "pirate's bedsheet" + desc = "It has a Jolly Roger emblem on it and has a faint scent of grog." + icon_state = "sheetpirate" + inhand_icon_state = "sheetpirate" + dream_messages = list( + "a buried treasure", + "an island", + "a monkey", + "a parrot", + "a swashbuckler", + "a talking skull", + "avast", + "being a pirate", + "'cause a pirate is free", + "doing whatever you want", + "gold", + "landlubbers", + "stealing", + "sailing the Seven Seas", + "yarr", + ) + +/obj/item/bedsheet/gondola + name = "gondola bedsheet" + desc = "A precious bedsheet made from the hide of a endangered and peculiar critter." + icon_state = "sheetgondola" + inhand_icon_state = "sheetgondola" + dream_messages = list("peace", "comfiness", "a rare critter", "a harmless creature") + stack_type = /obj/item/stack/sheet/animalhide/gondola + stack_amount = 1 + ///one of four icon states that represent its mouth + var/gondola_mouth + ///one of four icon states that represent its eyes + var/gondola_eyes + +/obj/item/bedsheet/gondola/Initialize(mapload) + . = ..() + gondola_mouth = "sheetgondola_mouth[rand(1, 4)]" + gondola_eyes = "sheetgondola_eyes[rand(1, 4)]" + add_overlay(gondola_mouth) + add_overlay(gondola_eyes) + +/obj/item/bedsheet/gondola/worn_overlays(mutable_appearance/standing, isinhands, icon_file) + . = ..() + if(!isinhands) + . += mutable_appearance(icon_file, gondola_mouth) + . += mutable_appearance(icon_file, gondola_eyes) + /obj/item/bedsheet/cosmos name = "cosmic space bedsheet" desc = "Made from the dreams of those who wonder at the stars." @@ -347,66 +399,6 @@ LINEN BINS light_power = 2 light_range = 1.4 -/obj/item/bedsheet/random - icon_state = "random_bedsheet" - name = "random bedsheet" - desc = "If you're reading this description ingame, something has gone wrong! Honk!" - bedsheet_type = BEDSHEET_ABSTRACT - item_flags = ABSTRACT - var/static/list/bedsheet_list - var/spawn_type = BEDSHEET_SINGLE - -/obj/item/bedsheet/random/Initialize(mapload) - ..() - if(!LAZYACCESS(bedsheet_list, spawn_type)) - var/list/spawn_list = list() - var/list/possible_types = typesof(/obj/item/bedsheet) - for(var/obj/item/bedsheet/sheet as anything in possible_types) - if(initial(sheet.bedsheet_type) == spawn_type) - spawn_list += sheet - LAZYSET(bedsheet_list, spawn_type, spawn_list) - var/chosen_type = pick(bedsheet_list[spawn_type]) - var/obj/item/bedsheet = new chosen_type(loc) - bedsheet.dir = dir - return INITIALIZE_HINT_QDEL - -/obj/item/bedsheet/random/double - icon_state = "random_bedsheet" - spawn_type = BEDSHEET_DOUBLE - -/obj/item/bedsheet/dorms - icon_state = "random_bedsheet" - name = "random dorms bedsheet" - desc = "If you're reading this description ingame, something has gone wrong! Honk!" - bedsheet_type = BEDSHEET_DOUBLE - item_flags = ABSTRACT - slot_flags = null - -/obj/item/bedsheet/dorms/Initialize(mapload) - ..() - var/type = pick_weight(list("Colors" = 80, "Special" = 20)) - switch(type) - if("Colors") - type = pick(list(/obj/item/bedsheet, - /obj/item/bedsheet/blue, - /obj/item/bedsheet/green, - /obj/item/bedsheet/grey, - /obj/item/bedsheet/orange, - /obj/item/bedsheet/purple, - /obj/item/bedsheet/red, - /obj/item/bedsheet/yellow, - /obj/item/bedsheet/brown, - /obj/item/bedsheet/black)) - if("Special") - type = pick(list(/obj/item/bedsheet/patriot, - /obj/item/bedsheet/rainbow, - /obj/item/bedsheet/ian, - /obj/item/bedsheet/cosmos, - /obj/item/bedsheet/nanotrasen)) - var/obj/item/bedsheet = new type(loc) - bedsheet.dir = dir - return INITIALIZE_HINT_QDEL - /obj/item/bedsheet/double icon_state = "double_sheetwhite" worn_icon_state = "sheetwhite" @@ -559,45 +551,16 @@ LINEN BINS worn_icon_state = "sheetian" bedsheet_type = BEDSHEET_DOUBLE +/obj/item/bedsheet/runtime/double + icon_state = "double_sheetruntime" + worn_icon_state = "sheetruntime" + bedsheet_type = BEDSHEET_DOUBLE + /obj/item/bedsheet/cosmos/double icon_state = "double_sheetcosmos" worn_icon_state = "sheetcosmos" bedsheet_type = BEDSHEET_DOUBLE -/obj/item/bedsheet/dorms_double - icon_state = "random_bedsheet" - item_flags = ABSTRACT - bedsheet_type = BEDSHEET_ABSTRACT - -/obj/item/bedsheet/dorms_double/Initialize(mapload) - ..() - var/type = pick_weight(list("Colors" = 80, "Special" = 20)) - switch(type) - if("Colors") - type = pick(list( - /obj/item/bedsheet/double, - /obj/item/bedsheet/blue/double, - /obj/item/bedsheet/green/double, - /obj/item/bedsheet/grey/double, - /obj/item/bedsheet/orange/double, - /obj/item/bedsheet/purple/double, - /obj/item/bedsheet/red/double, - /obj/item/bedsheet/yellow/double, - /obj/item/bedsheet/brown/double, - /obj/item/bedsheet/black/double, - )) - if("Special") - type = pick(list( - /obj/item/bedsheet/patriot/double, - /obj/item/bedsheet/rainbow/double, - /obj/item/bedsheet/ian/double, - /obj/item/bedsheet/cosmos/double, - /obj/item/bedsheet/nanotrasen/double, - )) - var/obj/item/bedsheet = new type(loc) - bedsheet.dir = dir - return INITIALIZE_HINT_QDEL - /obj/structure/bedsheetbin name = "linen bin" desc = "It looks rather cosy." @@ -736,7 +699,3 @@ LINEN BINS add_fingerprint(user) return COMPONENT_CANCEL_ATTACK_CHAIN - -#undef BEDSHEET_ABSTRACT -#undef BEDSHEET_SINGLE -#undef BEDSHEET_DOUBLE diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 1e7fede584208..fecacd678c7c2 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -39,7 +39,6 @@ /obj/structure/closet/gimmick/tacticool/PopulateContents() ..() new /obj/item/clothing/glasses/eyepatch(src) - new /obj/item/clothing/glasses/sunglasses(src) new /obj/item/clothing/gloves/tackler/combat(src) new /obj/item/clothing/gloves/tackler/combat(src) new /obj/item/clothing/head/helmet/swat(src) @@ -53,6 +52,8 @@ new /obj/item/clothing/under/syndicate/tacticool(src) new /obj/item/clothing/under/syndicate/tacticool(src) +/obj/structure/closet/gimmick/tacticool/populate_contents_immediate() + new /obj/item/clothing/glasses/sunglasses(src) /obj/structure/closet/thunderdome name = "\improper Thunderdome closet" @@ -69,8 +70,6 @@ new /obj/item/clothing/suit/armor/tdome/red(src) for(var/i in 1 to 3) new /obj/item/melee/energy/sword/saber(src) - for(var/i in 1 to 3) - new /obj/item/gun/energy/laser(src) for(var/i in 1 to 3) new /obj/item/melee/baton/security/loaded(src) for(var/i in 1 to 3) @@ -78,6 +77,10 @@ for(var/i in 1 to 3) new /obj/item/clothing/head/helmet/thunderdome(src) +/obj/structure/closet/thunderdome/tdred/populate_contents_immediate() + for(var/i in 1 to 3) + new /obj/item/gun/energy/laser(src) + /obj/structure/closet/thunderdome/tdgreen name = "green-team Thunderdome closet" icon_door = "green" @@ -88,8 +91,6 @@ new /obj/item/clothing/suit/armor/tdome/green(src) for(var/i in 1 to 3) new /obj/item/melee/energy/sword/saber(src) - for(var/i in 1 to 3) - new /obj/item/gun/energy/laser(src) for(var/i in 1 to 3) new /obj/item/melee/baton/security/loaded(src) for(var/i in 1 to 3) @@ -97,6 +98,10 @@ for(var/i in 1 to 3) new /obj/item/clothing/head/helmet/thunderdome(src) +/obj/structure/closet/thunderdome/tdgreen/populate_contents_immediate() + for(var/i in 1 to 3) + new /obj/item/gun/energy/laser(src) + /obj/structure/closet/malf/suits desc = "It's a storage unit for operational gear." icon_state = "syndicate" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index d10d767f0ccc9..ca931d4c6ab10 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -31,7 +31,7 @@ for(var/i in 1 to 5) new /obj/item/reagent_containers/cup/glass/colocup(src) -/obj/structure/closet/secure/closet/bar/lavaland_bartender_clothes +/obj/structure/closet/secure_closet/bar/lavaland_bartender_clothes name = "bartender's closet" /obj/structure/closet/secure_closet/bar/lavaland_bartender_clothes/PopulateContents() @@ -39,4 +39,3 @@ new /obj/item/clothing/glasses/sunglasses/reagent(src) new /obj/item/clothing/suit/costume/hawaiian(src) new /obj/item/clothing/shoes/sandal/beach(src) - diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index d09c12fb5d49c..553258bd360ea 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -16,11 +16,13 @@ new /obj/item/computer_disk/command/captain(src) new /obj/item/radio/headset/heads/captain/alt(src) new /obj/item/radio/headset/heads/captain(src) - new /obj/item/storage/belt/sabre(src) - new /obj/item/gun/energy/e_gun(src) new /obj/item/door_remote/captain(src) new /obj/item/storage/photo_album/captain(src) +/obj/structure/closet/secure_closet/captains/populate_contents_immediate() + new /obj/item/gun/energy/e_gun(src) + new /obj/item/storage/belt/sabre(src) + /obj/structure/closet/secure_closet/hop name = "head of personnel's locker" icon_state = "hop" @@ -37,7 +39,6 @@ new /obj/item/storage/box/silver_ids(src) new /obj/item/megaphone/command(src) new /obj/item/assembly/flash/handheld(src) - new /obj/item/gun/energy/e_gun(src) new /obj/item/clothing/neck/petcollar(src) new /obj/item/pet_carrier(src) new /obj/item/door_remote/civilian(src) @@ -45,6 +46,9 @@ new /obj/item/storage/photo_album/hop(src) new /obj/item/storage/lockbox/medal/hop(src) +/obj/structure/closet/secure_closet/hop/populate_contents_immediate() + new /obj/item/gun/energy/e_gun(src) + /obj/structure/closet/secure_closet/hos name = "head of security's locker" icon_state = "hos" @@ -286,6 +290,8 @@ new /obj/item/storage/box/firingpins(src) for(var/i in 1 to 3) new /obj/item/storage/box/rubbershot(src) + +/obj/structure/closet/secure_closet/armory2/populate_contents_immediate() for(var/i in 1 to 3) new /obj/item/gun/ballistic/shotgun/riot(src) @@ -299,12 +305,14 @@ ..() new /obj/item/storage/box/firingpins(src) new /obj/item/gun/energy/ionrifle(src) + for(var/i in 1 to 3) + new /obj/item/gun/energy/laser/thermal(src) + +/obj/structure/closet/secure_closet/armory3/populate_contents_immediate() for(var/i in 1 to 3) new /obj/item/gun/energy/e_gun(src) for(var/i in 1 to 3) new /obj/item/gun/energy/laser(src) - for(var/i in 1 to 3) - new /obj/item/gun/energy/laser/thermal(src) /obj/structure/closet/secure_closet/tac name = "armory tac locker" diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index de996015e592c..f110cd8b43eab 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -325,6 +325,7 @@ door.update_appearance() qdel(src) + return door /obj/structure/door_assembly/update_overlays() . = ..() diff --git a/code/game/objects/structures/door_assembly_types.dm b/code/game/objects/structures/door_assembly_types.dm index 36b41fbc32632..589cad42bcabc 100644 --- a/code/game/objects/structures/door_assembly_types.dm +++ b/code/game/objects/structures/door_assembly_types.dm @@ -293,4 +293,5 @@ /obj/structure/door_assembly/door_assembly_material/finish_door() var/obj/machinery/door/airlock/door = ..() door.set_custom_materials(custom_materials) + door.update_appearance() return door diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index ce848e92cbdd3..fb925cdb7dae8 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -110,7 +110,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) toggle_cabinet(user) /obj/structure/extinguisher_cabinet/attack_hand_secondary(mob/living/user) - if(!user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS)) + if(!user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING)) return ..() toggle_cabinet(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 9f4f4fdd73f4f..eaf830b7db78e 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -43,12 +43,12 @@ return opening = TRUE - update_appearance() if(!density) var/srcturf = get_turf(src) for(var/mob/living/obstacle in srcturf) //Stop people from using this as a shield opening = FALSE return + update_appearance() addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/structure/falsewall, toggle_open)), 5) /obj/structure/falsewall/proc/toggle_open() diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index a38659aaefefb..82e89314d68f6 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -305,3 +305,12 @@ anchored = FALSE density = TRUE deconstructible = TRUE + +/obj/structure/fluff/wallsign + name = "direction sign" + desc = "Now, where to go?" + density = FALSE + icon = 'icons/obj/fluff/general.dmi' + icon_state = "wallsign" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fluff/wallsign, 32) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 959f0c7a74c3b..da02394251810 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -9,7 +9,7 @@ base_icon_state = "grille" density = TRUE anchored = TRUE - pass_flags_self = PASSGRILLE + pass_flags_self = PASSGRILLE | PASSWINDOW obj_flags = CONDUCTS_ELECTRICITY obj_flags = CAN_BE_HIT | IGNORE_DENSITY pressure_resistance = 5*ONE_ATMOSPHERE @@ -339,19 +339,19 @@ var/turf/T = get_turf(src) if(T.overfloor_placed)//cant be a floor in the way! return FALSE - // Shocking hurts the grille (to weaken monkey powersinks) - if(prob(50)) + + var/obj/structure/cable/cable_node = T.get_cable_node() + if(isnull(cable_node)) + return FALSE + if(!electrocute_mob(user, cable_node, src, 1, TRUE)) + return FALSE + if(prob(50)) // Shocking hurts the grille (to weaken monkey powersinks) take_damage(1, BURN, FIRE, sound_effect = FALSE) - var/obj/structure/cable/C = T.get_cable_node() - if(C) - if(electrocute_mob(user, C, src, 1, TRUE)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() - return TRUE - else - return FALSE - return FALSE + var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread + sparks.set_up(3, 1, src) + sparks.start() + + return TRUE /obj/structure/grille/should_atmos_process(datum/gas_mixture/air, exposed_temperature) return exposed_temperature > T0C + 1500 && !broken diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index a3d09340d87e3..a1a3adf325145 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -45,6 +45,7 @@ user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) user.changeNext_move(CLICK_CD_MELEE) take_damage(5 , BRUTE, MELEE, 1) + log_combat(user, src, "swatted") /obj/structure/holosign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index fe663efec48c9..08a4394346af9 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -2,6 +2,7 @@ #define MINERAL_TYPE_OPTIONS_RANDOM 4 #define OVERLAY_OFFSET_START 0 #define OVERLAY_OFFSET_EACH 5 +#define MINERALS_PER_BOULDER 3 /obj/structure/ore_vent name = "ore vent" @@ -22,13 +23,8 @@ var/unique_vent = FALSE /// What icon_state do we use when the ore vent has been tapped? var/icon_state_tapped = "ore_vent_active" - /// A weighted list of what minerals are contained in this vent, with weight determining how likely each mineral is to be picked in produced boulders. var/list/mineral_breakdown = list() - /// How many rolls on the mineral_breakdown list are made per boulder produced? EG: 3 rolls means 3 minerals per boulder, with order determining percentage. - var/minerals_per_boulder = 3 - /// How many minerals are picked to be in the ore vent? These are added to the mineral_breakdown list. - var/minerals_per_breakdown = MINERAL_TYPE_OPTIONS_RANDOM /// What size boulders does this vent produce? var/boulder_size = BOULDER_SIZE_SMALL /// Reference to this ore vent's NODE drone, to track wave success. @@ -67,9 +63,9 @@ var/artifact_chance = 0 /// We use a cooldown to prevent the wave defense from being started multiple times. COOLDOWN_DECLARE(wave_cooldown) + /// We use a cooldown to prevent players from tapping boulders rapidly from vents. COOLDOWN_DECLARE(manual_vent_cooldown) - /obj/structure/ore_vent/Initialize(mapload) if(mapload) generate_description() @@ -121,14 +117,14 @@ if(do_after(user, boulder_size * 1 SECONDS, src)) user.apply_damage(20, STAMINA) playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) - produce_boulder() + produce_boulder(TRUE) visible_message(span_notice("You've successfully produced a boulder! Boy are your arms tired.")) /obj/structure/ore_vent/attack_basic_mob(mob/user, list/modifiers) . = ..() if(!HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) return - produce_boulder() + produce_boulder(TRUE) /obj/structure/ore_vent/is_buckle_possible(mob/living/target, force, check_loc) . = ..() @@ -155,17 +151,6 @@ context[SCREENTIP_CONTEXT_LMB] = "Scan vent" return CONTEXTUAL_SCREENTIP_SET -/** - * Picks n types of materials to pack into a boulder created by this ore vent, where n is this vent's minerals_per_boulder. - * Then assigns custom_materials based on boulder_size, assigned via the ore_quantity_function - */ -/obj/structure/ore_vent/proc/create_mineral_contents() - var/list/refined_list = list() - for(var/iteration in 1 to minerals_per_boulder) - var/datum/material/material = pick_weight(mineral_breakdown) - refined_list[material] += ore_quantity_function(iteration) - return refined_list - /** * This proc is called when the ore vent is initialized, in order to determine what minerals boulders it spawns can contain. * The materials available are determined by SSore_generation.ore_vent_minerals, which is a list of all minerals that can be contained in ore vents for a given cave generation. @@ -372,22 +357,38 @@ * @params apply_cooldown Should we apply a cooldown to producing boulders? Default's false, used by manual boulder production (goldgrubs, golems, etc). */ /obj/structure/ore_vent/proc/produce_boulder(apply_cooldown = FALSE) - if(!COOLDOWN_FINISHED(src, manual_vent_cooldown)) + RETURN_TYPE(/obj/item/boulder) + + //cooldown applies only for manual processing by hand + if(apply_cooldown && !COOLDOWN_FINISHED(src, manual_vent_cooldown)) return + + //produce the boulder var/obj/item/boulder/new_rock if(prob(artifact_chance)) new_rock = new /obj/item/boulder/artifact(loc) else new_rock = new /obj/item/boulder(loc) - var/list/mats_list = create_mineral_contents() Shake(duration = 1.5 SECONDS) + + //decorate the boulder with materials + var/list/mats_list = list() + for(var/iteration in 1 to MINERALS_PER_BOULDER) + var/datum/material/material = pick_weight(mineral_breakdown) + mats_list[material] += ore_quantity_function(iteration) new_rock.set_custom_materials(mats_list) - new_rock.flavor_boulder(src) + + //set size & durability + new_rock.boulder_size = boulder_size + new_rock.durability = rand(2, boulder_size) //randomize durability a bit for some flavor. + new_rock.boulder_string = boulder_icon_state + new_rock.update_appearance(UPDATE_ICON_STATE) + + //start the cooldown & return the boulder if(apply_cooldown) COOLDOWN_START(src, manual_vent_cooldown, 10 SECONDS) return new_rock - //comes with the station, and is already tapped. /obj/structure/ore_vent/starter_resources name = "active ore vent" @@ -402,12 +403,6 @@ ) /obj/structure/ore_vent/random - /// Static list of ore vent types, for random generation. - var/static/list/ore_vent_types = list( - BOULDER_SIZE_SMALL, - BOULDER_SIZE_MEDIUM, - BOULDER_SIZE_LARGE, - ) /obj/structure/ore_vent/random/Initialize(mapload) . = ..() @@ -446,7 +441,7 @@ /mob/living/simple_animal/hostile/asteroid/wolf, ) ore_vent_options = list( - "small", + SMALL_VENT_TYPE, ) /obj/structure/ore_vent/random/icebox/lower @@ -459,12 +454,11 @@ /mob/living/simple_animal/hostile/asteroid/wolf, ) ore_vent_options = list( - "small", - "medium", - "large", + SMALL_VENT_TYPE = 3, + MEDIUM_VENT_TYPE = 5, + LARGE_VENT_TYPE = 7, ) - /obj/structure/ore_vent/boss name = "menacing ore vent" desc = "An ore vent, brimming with underground ore. This one has an evil aura about it. Better be careful." @@ -536,3 +530,4 @@ #undef MINERAL_TYPE_OPTIONS_RANDOM #undef OVERLAY_OFFSET_START #undef OVERLAY_OFFSET_EACH +#undef MINERALS_PER_BOULDER diff --git a/code/game/objects/structures/maintenance.dm b/code/game/objects/structures/maintenance.dm index 78a67198fefdc..f9ed6d93c1e9f 100644 --- a/code/game/objects/structures/maintenance.dm +++ b/code/game/objects/structures/maintenance.dm @@ -24,9 +24,8 @@ at the cost of risking a vicious bite.**/ /obj/item/restraints/handcuffs/cable/green = 1, /obj/item/restraints/handcuffs/cable/pink = 1, /obj/item/restraints/handcuffs/alien = 2, - /obj/item/coin/bananium = 9, + /obj/item/coin/bananium = 10, /obj/item/knife/butcher = 5, - /obj/item/coin/mythril = 1, ) diff --git a/code/game/objects/structures/mannequin.dm b/code/game/objects/structures/mannequin.dm index 74127638d83dd..bdb5344d7fe10 100644 --- a/code/game/objects/structures/mannequin.dm +++ b/code/game/objects/structures/mannequin.dm @@ -64,6 +64,7 @@ icon_state = "mannequin_[material]_[body_type == FEMALE ? "female" : "male"]" AddElement(/datum/element/strippable, GLOB.strippable_mannequin_items) AddComponent(/datum/component/simple_rotation, ROTATION_IGNORE_ANCHORED) + AddComponent(/datum/component/marionette) update_appearance() /obj/structure/mannequin/Destroy() @@ -190,7 +191,6 @@ name = "skeleton model" desc = "Not to knock over." material = MANNEQUIN_SKELETON - anchored = TRUE obj_flags = UNIQUE_RENAME starting_items = list( /obj/item/clothing/glasses/eyepatch, diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index f14c1dfa227cf..af7fc92c65779 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -315,11 +315,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) reagents.remove_any(SHOWER_SPRAY_VOLUME) -/obj/machinery/shower/deconstruct(disassembled = TRUE) +/obj/machinery/shower/on_deconstruction(disassembled = TRUE) new /obj/item/stack/sheet/iron(drop_location(), 2) if(has_water_reclaimer) new /obj/item/stock_parts/water_recycler(drop_location()) - qdel(src) /obj/machinery/shower/proc/check_heat(mob/living/L) var/mob/living/carbon/C = L diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index a0b8f9d79dcef..debd4d81bc367 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -825,6 +825,12 @@ pass_flags_self = LETPASSTHROW //You can throw objects over this, despite it's density. max_integrity = 20 +/obj/structure/rack/skeletal + name = "skeletal minibar" + desc = "Rattle me boozes!" + icon = 'icons/obj/fluff/general.dmi' + icon_state = "minibar" + /obj/structure/rack/Initialize(mapload) . = ..() AddElement(/datum/element/climbable) diff --git a/code/game/objects/structures/toiletbong.dm b/code/game/objects/structures/toiletbong.dm index e5c5193e46f95..0ea21e9ff8480 100644 --- a/code/game/objects/structures/toiletbong.dm +++ b/code/game/objects/structures/toiletbong.dm @@ -3,29 +3,28 @@ desc = "A repurposed toilet with re-arranged piping and an attached flamethrower. Why would anyone build this?" icon = 'icons/obj/watercloset.dmi' icon_state = "toiletbong" + base_icon_state = "toiletbong" density = FALSE anchored = TRUE - var/emagged = FALSE var/smokeradius = 1 var/mutable_appearance/weed_overlay /obj/structure/toiletbong/Initialize(mapload) . = ..() create_storage() - AddComponent(/datum/component/simple_rotation, AfterRotation = CALLBACK(src, PROC_REF(AfterRotation))) + AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) create_storage(max_total_storage = 100, max_slots = 12, canhold = /obj/item/food) atom_storage.attack_hand_interact = FALSE atom_storage.rustle_sound = FALSE atom_storage.animated = FALSE - weed_overlay = mutable_appearance('icons/obj/watercloset.dmi', "toiletbong_overlay") + weed_overlay = mutable_appearance('icons/obj/watercloset.dmi', "[base_icon_state]_overlay") START_PROCESSING(SSobj, src) -/obj/structure/toiletbong/update_icon() +/obj/structure/toiletbong/update_overlays() . = ..() - cut_overlays() if (LAZYLEN(contents)) - add_overlay(weed_overlay) + . += weed_overlay /obj/structure/toiletbong/attack_hand(mob/living/carbon/user) . = ..() @@ -36,47 +35,44 @@ user.balloon_alert(user, "it's empty!") return user.visible_message(span_boldnotice("[user] takes a huge drag on the [src].")) - if (do_after(user, 2 SECONDS, target = src)) - var/turf/toiletbong_location = loc - toiletbong_location.hotspot_expose(1000, 5) - for (var/obj/item/item in contents) - if (item.resistance_flags & INDESTRUCTIBLE) - user.balloon_alert(user, "[item.name] is blocking the pipes!") - continue - playsound(src, 'sound/items/modsuit/flamethrower.ogg', 50) - var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/puff = new - puff.set_up(smokeradius, holder = src, location = user, carry = item.reagents, efficiency = 20) - puff.start() - if (prob(5) && !emagged) - if(islizard(user)) - user.balloon_alert(user, "a hidden treat!") - user.visible_message(span_danger("[user] fishes a mouse out of the pipes.")) - else - to_chat(user, span_userdanger("There was something disgusting in the pipes!")) - user.visible_message(span_danger("[user] spits out a mouse.")) - user.adjust_disgust(50) - user.vomit(VOMIT_CATEGORY_DEFAULT) - var/mob/living/spawned_mob = new /mob/living/basic/mouse(get_turf(user)) - spawned_mob.faction |= "[REF(user)]" - if(prob(50)) - for(var/j in 1 to rand(1, 3)) - step(spawned_mob, pick(NORTH,SOUTH,EAST,WEST)) - qdel(item) - if(!emagged) - break - update_icon() + if (!do_after(user, 2 SECONDS, target = src)) + return + var/turf/toiletbong_location = loc + toiletbong_location.hotspot_expose(1000, 5) + for (var/obj/item/item in contents) + if (item.resistance_flags & INDESTRUCTIBLE) + user.balloon_alert(user, "[item.name] is blocking the pipes!") + continue + playsound(src, 'sound/items/modsuit/flamethrower.ogg', 50) + var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/puff = new + puff.set_up(smokeradius, holder = src, location = user, carry = item.reagents, efficiency = 20) + puff.start() + if (prob(5) && !(obj_flags & EMAGGED)) + if(user.get_liked_foodtypes() & GORE) + user.balloon_alert(user, "a hidden treat!") + user.visible_message(span_danger("[user] fishes a mouse out of the pipes.")) + else + to_chat(user, span_userdanger("There was something disgusting in the pipes!")) + user.visible_message(span_danger("[user] spits out a mouse.")) + user.adjust_disgust(50) + user.vomit(VOMIT_CATEGORY_DEFAULT) + var/mob/living/spawned_mob = new /mob/living/basic/mouse(get_turf(user)) + spawned_mob.faction |= "[REF(user)]" + if(prob(50)) + for(var/j in 1 to rand(1, 3)) + step(spawned_mob, pick(NORTH,SOUTH,EAST,WEST)) + qdel(item) + if(!(obj_flags & EMAGGED)) + break + update_appearance(UPDATE_ICON) /obj/structure/toiletbong/wrench_act(mob/living/user, obj/item/tool) - tool.play_tool_sound(src) - if(anchored) - to_chat(user, span_notice("You begin unsecuring the [src].")) - anchored = FALSE - else - to_chat(user, span_notice("You secure the [src] to the floor.")) - anchored = TRUE - return TRUE + ..() + default_unfasten_wrench(user, tool) + return ITEM_INTERACT_SUCCESS -/obj/structure/toiletbong/proc/AfterRotation(mob/user, degrees) +///Called in the simple rotation's post_rotation callback, playing a sound cue to players. +/obj/structure/toiletbong/proc/post_rotation(mob/user, degrees) playsound(src, 'sound/items/deconstruct.ogg', 50) /obj/structure/toiletbong/crowbar_act(mob/living/user, obj/item/tool) @@ -94,18 +90,17 @@ return TRUE /obj/structure/toiletbong/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + return FALSE + obj_flags |= EMAGGED + smokeradius = 2 playsound(src, 'sound/effects/fish_splash.ogg', 50) - user.balloon_alert(user, "whoops!") - if(!emagged) - emagged = TRUE - smokeradius = 2 - balloon_alert(user, "toilet broke") - if (emag_card) - to_chat(user, span_boldwarning("The [emag_card] falls into the toilet. You fish it back out. Looks like you broke the toilet.")) - return TRUE - return FALSE + balloon_alert(user, "toilet broke") + if (emag_card) + to_chat(user, span_boldwarning("The [emag_card] falls into the toilet. You fish it back out. Looks like you broke the toilet.")) + return TRUE -/obj/structure/toiletbong/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/card/emag)) +/obj/structure/toiletbong/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/card/emag)) return - . = ..() + return ..() diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index cc9de4cdb95cf..44952801ec7d3 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -15,7 +15,7 @@ /obj/structure/c_transit_tube/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation, AfterRotation = CALLBACK(src, PROC_REF(AfterRotation))) + AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) /obj/structure/c_transit_tube/proc/can_wrench_in_loc(mob/user) var/turf/source_turf = get_turf(loc) @@ -27,7 +27,7 @@ return FALSE return TRUE -/obj/structure/c_transit_tube/proc/AfterRotation(mob/user, degrees) +/obj/structure/c_transit_tube/proc/post_rotation(mob/user, degrees) if(flipped_build_type && degrees == ROTATION_FLIP) setDir(turn(dir, degrees)) //Turn back we don't actually flip flipped = !flipped diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index f7510de55862e..730735b8b3a22 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -14,7 +14,7 @@ armor_type = /datum/armor/structure_window can_atmos_pass = ATMOS_PASS_PROC rad_insulation = RAD_VERY_LIGHT_INSULATION - pass_flags_self = PASSGLASS + pass_flags_self = PASSGLASS | PASSWINDOW set_dir_on_move = FALSE flags_ricochet = RICOCHET_HARD receive_ricochet_chance_mod = 0.5 @@ -67,7 +67,7 @@ flags_1 |= ALLOW_DARK_PAINTS_1 RegisterSignal(src, COMSIG_OBJ_PAINTED, PROC_REF(on_painted)) AddElement(/datum/element/atmos_sensitive, mapload) - AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM, AfterRotation = CALLBACK(src, PROC_REF(AfterRotation))) + AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) var/static/list/loc_connections = list( COMSIG_ATOM_EXIT = PROC_REF(on_exit), @@ -358,7 +358,7 @@ dropped_debris += new /obj/item/stack/rods(location, (fulltile ? 2 : 1)) return dropped_debris -/obj/structure/window/proc/AfterRotation(mob/user, degrees) +/obj/structure/window/proc/post_rotation(mob/user, degrees) air_update_turf(TRUE, FALSE) /obj/structure/window/proc/on_painted(obj/structure/window/source, mob/user, obj/item/toy/crayon/spraycan/spraycan, is_dark_color) @@ -932,6 +932,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw icon_state = "clockwork_window-single" glass_type = /obj/item/stack/sheet/bronze +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/bronze/spawner, 0) + /obj/structure/window/bronze/unanchored anchored = FALSE diff --git a/code/game/sound.dm b/code/game/sound.dm index 3c6a62eb781d3..e575534bdaeed 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -50,7 +50,7 @@ //allocate a channel if necessary now so its the same for everyone channel = channel || SSsounds.random_available_channel() - var/sound/S = sound(get_sfx(soundin)) + var/sound/S = isdatum(soundin) ? soundin : sound(get_sfx(soundin)) var/maxdistance = SOUND_RANGE + extrarange var/source_z = turf_source.z var/list/listeners = SSmobs.clients_by_zlevel[source_z].Copy() diff --git a/code/game/turfs/closed/indestructible.dm b/code/game/turfs/closed/indestructible.dm index e98d1c95f7e69..9f764715bf378 100644 --- a/code/game/turfs/closed/indestructible.dm +++ b/code/game/turfs/closed/indestructible.dm @@ -116,6 +116,16 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS canSmoothWith = SMOOTH_GROUP_WALLS +/turf/closed/indestructible/reinforced/titanium + name = "reinforced titanium imitation wall" + desc = "A huge chunk of reinforced metal used to separate rooms. Naturally, to cut down on costs, this is just a really good paint job to resemble titanium. Effectively impervious to conventional methods of destruction." + icon = 'icons/turf/walls/shuttle_wall.dmi' + icon_state = "shuttle_wall-0" + base_icon_state = "shuttle_wall" + +/turf/closed/indestructible/reinforced/titanium/nodiagonal + icon_state = "shuttle_wall-15" + smoothing_flags = SMOOTH_BITMASK /turf/closed/indestructible/riveted icon = 'icons/turf/walls/riveted.dmi' diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 7ddb05713185c..5c2205a7bf8fb 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -115,12 +115,28 @@ /turf/open/indestructible/TerraformTurf(path, new_baseturf, flags, defer_change = FALSE, ignore_air = FALSE) return + +/turf/open/indestructible/large + icon_state = "floor_large" + /turf/open/indestructible/white icon_state = "white" +/turf/open/indestructible/white/smooth_large + icon_state = "white_large" + +/turf/open/indestructible/white/textured + icon_state = "textured_white" + /turf/open/indestructible/dark icon_state = "darkfull" +/turf/open/indestructible/dark/textured + icon_state = "textured_dark" + +/turf/open/indestructible/dark/smooth_large + icon_state = "dark_large" + /turf/open/indestructible/light icon_state = "light_on-1" @@ -232,6 +248,9 @@ /turf/open/indestructible/meat/airless initial_gas_mix = AIRLESS_ATMOS +/turf/open/indestructible/vault + icon_state = "rockvault" + /turf/open/indestructible/plating name = "plating" icon_state = "plating" @@ -243,6 +262,18 @@ /turf/open/indestructible/plating/airless initial_gas_mix = AIRLESS_ATMOS +/turf/open/indestructible/kitchen + icon_state = /turf/open/floor/iron/kitchen::icon_state + +/turf/open/indestructible/rockyground + icon_state = /turf/open/misc/ashplanet/rocky::icon_state + icon = /turf/open/misc/ashplanet/rocky::icon + name = /turf/open/misc/ashplanet/rocky::name + +/turf/open/indestructible/stone + icon_state = /turf/open/floor/stone::icon_state + name = /turf/open/floor/stone::name + /turf/open/Initalize_Atmos(time) excited = FALSE update_visuals() diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index 48ab1ceca38fd..142d966172b80 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -119,3 +119,19 @@ /turf/open/chasm/true/apply_components(mapload) AddComponent(/datum/component/chasm, null, mapload) //Don't pass anything for below_turf. + +/turf/open/chasm/true/no_smooth + smoothing_flags = NONE + +/turf/open/chasm/true/no_smooth/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + return FALSE + +/turf/open/chasm/true/no_smooth/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) + return FALSE + +/turf/open/chasm/true/no_smooth/attackby(obj/item/item, mob/user, params, area/area_restriction) + if(istype(item, /obj/item/stack/rods)) + return + else if(istype(item, /obj/item/stack/tile/iron)) + return + return ..() diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index a88e7f6b85e18..2dbd065849ec1 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -201,7 +201,6 @@ /turf/open/floor/acid_melt() ScrapeAway(flags = CHANGETURF_INHERIT_AIR) -/// if you are updating this make to to update /turf/open/misc/rcd_vals() too /turf/open/floor/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_TURF) diff --git a/code/game/turfs/open/floor/reinforced_floor.dm b/code/game/turfs/open/floor/reinforced_floor.dm index 1d8338d6b8734..6a23f8e6be50e 100644 --- a/code/game/turfs/open/floor/reinforced_floor.dm +++ b/code/game/turfs/open/floor/reinforced_floor.dm @@ -183,7 +183,9 @@ name = "air floor" initial_gas_mix = ATMOS_TANK_AIRMIX - +/turf/open/floor/engine/xenobio + name = "xenobio bz floor" + initial_gas_mix = XENOBIO_BZ /turf/open/floor/engine/cult name = "engraved floor" diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 1a174723d85b8..8f9e7b44aa600 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -52,7 +52,8 @@ /turf/open/lava/Destroy() for(var/mob/living/leaving_mob in contents) - REMOVE_TRAIT(leaving_mob, TRAIT_PERMANENTLY_ONFIRE, TURF_TRAIT) + leaving_mob.RemoveElement(/datum/element/perma_fire_overlay) + REMOVE_TRAIT(leaving_mob, TRAIT_NO_EXTINGUISH, TURF_TRAIT) return ..() /turf/open/lava/update_overlays() @@ -144,7 +145,8 @@ /turf/open/lava/Exited(atom/movable/gone, direction) . = ..() if(isliving(gone) && !islava(gone.loc)) - REMOVE_TRAIT(gone, TRAIT_PERMANENTLY_ONFIRE, TURF_TRAIT) + gone.RemoveElement(/datum/element/perma_fire_overlay) + REMOVE_TRAIT(gone, TRAIT_NO_EXTINGUISH, TURF_TRAIT) /turf/open/lava/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(burn_stuff(AM)) @@ -292,11 +294,10 @@ if(QDELETED(burn_target)) return FALSE - . = TRUE if(isobj(burn_target)) var/obj/burn_obj = burn_target if(burn_obj.resistance_flags & ON_FIRE) // already on fire; skip it. - return + return TRUE if(!(burn_obj.resistance_flags & FLAMMABLE)) burn_obj.resistance_flags |= FLAMMABLE //Even fireproof things burn up in lava if(burn_obj.resistance_flags & FIRE_PROOF) @@ -305,17 +306,21 @@ burn_obj.set_armor_rating(FIRE, 50) burn_obj.fire_act(temperature_damage, 1000 * seconds_per_tick) if(istype(burn_obj, /obj/structure/closet)) - var/obj/structure/closet/burn_closet = burn_obj - for(var/burn_content in burn_closet.contents) + for(var/burn_content in burn_target) burn_stuff(burn_content) - return + return TRUE - var/mob/living/burn_living = burn_target - ADD_TRAIT(burn_living, TRAIT_PERMANENTLY_ONFIRE, TURF_TRAIT) - burn_living.ignite_mob() - burn_living.adjust_fire_stacks(lava_firestacks * seconds_per_tick) - burn_living.update_fire() - burn_living.adjustFireLoss(lava_damage * seconds_per_tick) + if(isliving(burn_target)) + var/mob/living/burn_living = burn_target + if(!HAS_TRAIT_FROM(burn_living, TRAIT_NO_EXTINGUISH, TURF_TRAIT)) + burn_living.AddElement(/datum/element/perma_fire_overlay) + ADD_TRAIT(burn_living, TRAIT_NO_EXTINGUISH, TURF_TRAIT) + burn_living.adjust_fire_stacks(lava_firestacks * seconds_per_tick) + burn_living.ignite_mob() + burn_living.adjustFireLoss(lava_damage * seconds_per_tick) + return TRUE + + return FALSE /turf/open/lava/can_cross_safely(atom/movable/crossing) return HAS_TRAIT(src, TRAIT_LAVA_STOPPED) || HAS_TRAIT(crossing, immunity_trait ) || HAS_TRAIT(crossing, TRAIT_MOVE_FLYING) diff --git a/code/game/turfs/open/misc.dm b/code/game/turfs/open/misc.dm index a704c7f12b168..02de7489786f9 100644 --- a/code/game/turfs/open/misc.dm +++ b/code/game/turfs/open/misc.dm @@ -76,153 +76,18 @@ return /turf/open/misc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) - if(RCD_TURF) - if(the_rcd.rcd_design_path != /turf/open/floor/plating/rcd) - return FALSE - - var/obj/structure/girder/girder = locate() in src - if(girder) - return girder.rcd_vals(user, the_rcd) - - return rcd_result_with_memory( - list("delay" = 2 SECONDS, "cost" = 16), - src, RCD_MEMORY_WALL, - ) - if(RCD_WINDOWGRILLE) - //default cost for building a grill for fulltile windows - var/cost = 4 - var/delay = 1 SECONDS - if(the_rcd.rcd_design_path == /obj/structure/window) - cost = 4 - delay = 2 SECONDS - else if(the_rcd.rcd_design_path == /obj/structure/window/reinforced) - cost = 6 - delay = 2.5 SECONDS - return rcd_result_with_memory( - list("delay" = delay, "cost" = cost), - src, RCD_MEMORY_WINDOWGRILLE, - ) - if(RCD_AIRLOCK) - if(ispath(the_rcd.rcd_design_path, /obj/machinery/door/airlock/glass)) - return list("delay" = 5 SECONDS, "cost" = 20) - else - return list("delay" = 5 SECONDS, "cost" = 16) - if(RCD_STRUCTURE) - var/static/list/structure_costs = list( - /obj/structure/reflector = list("delay" = 2 SECONDS, "cost" = 20), - /obj/structure/girder = list("delay" = 1.3 SECONDS, "cost" = 8), - /obj/structure/frame/machine/secured = list("delay" = 2 SECONDS, "cost" = 20), - /obj/structure/frame/computer/rcd = list("delay" = 2 SECONDS, "cost" = 20), - /obj/structure/floodlight_frame = list("delay" = 3 SECONDS, "cost" = 20), - /obj/structure/chair = list("delay" = 1 SECONDS, "cost" = 4), - /obj/structure/chair/stool/bar = list("delay" = 0.5 SECONDS, "cost" = 4), - /obj/structure/table = list("delay" = 2 SECONDS, "cost" = 8), - /obj/structure/bed = list("delay" = 2.5 SECONDS, "cost" = 8), - /obj/structure/rack = list("delay" = 2.5 SECONDS, "cost" = 4), - ) - - var/list/design_data = structure_costs[the_rcd.rcd_design_path] - if(!isnull(design_data)) - return design_data - - for(var/structure in structure_costs) - if(ispath(the_rcd.rcd_design_path, structure)) - return structure_costs[structure] - + if(the_rcd.mode == RCD_TURF) + if(the_rcd.rcd_design_path != /turf/open/floor/plating/rcd) return FALSE + return list("delay" = 0, "cost" = 3) return FALSE /turf/open/misc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - switch(rcd_data["[RCD_DESIGN_MODE]"]) - if(RCD_TURF) - if(rcd_data["[RCD_DESIGN_PATH]"] != /turf/open/floor/plating/rcd) - return FALSE - - var/obj/structure/girder/girder = locate() in src - if(girder) - return girder.rcd_act(user, the_rcd, rcd_data) - - place_on_top(/turf/closed/wall) - return TRUE - if(RCD_WINDOWGRILLE) - //check if we are building a window - var/obj/structure/window/window_path = rcd_data["[RCD_DESIGN_PATH]"] - if(!ispath(window_path)) - CRASH("Invalid window path type in RCD: [window_path]") - - //allow directional windows to be built without grills - if(!initial(window_path.fulltile)) - if(!valid_build_direction(src, user.dir, is_fulltile = FALSE)) - balloon_alert(user, "window already here!") - return FALSE - var/obj/structure/window/WD = new window_path(src, user.dir) - WD.set_anchored(TRUE) - return TRUE - - //build grills to deal with full tile windows - if(locate(/obj/structure/grille) in src) - return FALSE - var/obj/structure/grille/new_grille = new(src) - new_grille.set_anchored(TRUE) - return TRUE - if(RCD_AIRLOCK) - var/obj/machinery/door/airlock_type = rcd_data["[RCD_DESIGN_PATH]"] - - if(ispath(airlock_type, /obj/machinery/door/window)) - if(!valid_build_direction(src, user.dir, is_fulltile = FALSE)) - balloon_alert(user, "there's already a windoor!") - return FALSE - for(var/obj/machinery/door/door in src) - if(istype(door, /obj/machinery/door/window)) - continue - balloon_alert(user, "there's already a door!") - return FALSE - //create the assembly and let it finish itself - var/obj/structure/windoor_assembly/assembly = new (src, user.dir) - assembly.secure = ispath(airlock_type, /obj/machinery/door/window/brigdoor) - assembly.electronics = the_rcd.airlock_electronics.create_copy(assembly) - assembly.finish_door() - return TRUE - - for(var/obj/machinery/door/door in src) - if(door.sub_door) - continue - balloon_alert(user, "there's already a door!") - return FALSE - //create the assembly and let it finish itself - var/obj/structure/door_assembly/assembly = new (src) - if(initial(airlock_type.glass)) - assembly.glass = TRUE - assembly.glass_type = airlock_type - else - assembly.airlock_type = airlock_type - assembly.electronics = the_rcd.airlock_electronics.create_copy(assembly) - assembly.finish_door() - return TRUE - if(RCD_STRUCTURE) - var/atom/movable/design_type = rcd_data["[RCD_DESIGN_PATH]"] - - //map absolute types to basic subtypes - var/atom/movable/locate_type = design_type - if(ispath(locate_type, /obj/structure/frame/machine/secured)) - locate_type = /obj/structure/frame/machine - if(ispath(locate_type, /obj/structure/frame/computer/rcd)) - locate_type = /obj/structure/frame/computer - if(ispath(locate_type, /obj/structure/floodlight_frame/completed)) - locate_type = /obj/structure/floodlight_frame - if(locate(locate_type) in src) - return FALSE - - var/atom/movable/design = new design_type(src) - var/static/list/dir_types = list( - /obj/structure/chair, - /obj/structure/table, - /obj/structure/rack, - /obj/structure/bed, - ) - if(is_path_in_list(locate_type, dir_types)) - design.setDir(user.dir) - return TRUE + if(rcd_data["[RCD_DESIGN_MODE]"] == RCD_TURF) + if(rcd_data["[RCD_DESIGN_PATH]"] != /turf/open/floor/plating/rcd) + return FALSE + + place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + return TRUE return FALSE diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 7bff29bc32c8d..8a278c1cc9131 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -1173,8 +1173,7 @@ GLOBAL_PROTECT(admin_verbs_poll) var/desired_mob = text2path(attempted_target_path) if(!ispath(desired_mob)) - var/static/list/mob_paths = make_types_fancy(subtypesof(/mob/living)) - desired_mob = pick_closest_path(attempted_target_path, mob_paths) + desired_mob = pick_closest_path(attempted_target_path, make_types_fancy(subtypesof(/mob/living))) if(isnull(desired_mob) || !ispath(desired_mob) || QDELETED(head)) return //The user pressed "Cancel" diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 873090118ab68..4d74f5425608f 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -54,7 +54,7 @@ /obj/effect/fun_balloon/sentience/ui_state(mob/user) return GLOB.admin_state -/obj/effect/fun_balloon/sentience/ui_status(mob/user) +/obj/effect/fun_balloon/sentience/ui_status(mob/user, datum/ui_state/state) if(popped) return UI_CLOSE if(isAdminObserver(user)) // ignore proximity if we're an admin diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index f9879428ddfe2..20a05685bc9ed 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -1,4 +1,4 @@ -GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) +GLOBAL_DATUM(everyone_an_antag, /datum/everyone_is_an_antag_controller) /client/proc/secrets() //Creates a verb for admins to open up the ui set name = "Secrets" @@ -457,24 +457,35 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) for(var/i in GLOB.human_list) var/mob/living/carbon/human/H = i INVOKE_ASYNC(H, TYPE_PROC_REF(/mob/living/carbon, monkeyize)) - if("traitor_all") + if("antag_all") if(!is_funmin) return if(!SSticker.HasRoundStarted()) tgui_alert(usr,"The game hasn't started yet!") return - if(GLOB.everyone_a_traitor) - tgui_alert(usr, "The everyone is a traitor secret has already been triggered") + if(GLOB.everyone_an_antag) + var/are_we_antagstacking = tgui_alert(usr, "The everyone is antag secret has already been triggered. Do you want to stack antags?", "DANGER ZONE. Are you sure about this?", list("Confirm", "Abort")) + if(are_we_antagstacking != "Confirm") + return + + var/chosen_antag = tgui_input_list(usr, "Choose antag", "Chose antag", list(ROLE_TRAITOR, ROLE_CHANGELING, ROLE_HERETIC, ROLE_CULTIST, ROLE_NINJA, ROLE_WIZARD, ROLE_NIGHTMARE)) + if(!chosen_antag) return - var/objective = tgui_input_text(holder, "Enter an objective", "Objective") + var/objective = tgui_input_text(usr, "Enter an objective", "Objective") if(!objective) return - GLOB.everyone_a_traitor = new /datum/everyone_is_a_traitor_controller(objective) - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Traitor All", "[objective]")) + var/confirmation = tgui_alert(usr, "Make everyone in to [chosen_antag] with objective: [objective]", "Are you sure about this?", list("Confirm", "Abort")) + if(confirmation != "Confirm") + return + var/keep_generic_objecives = tgui_alert(usr, "Generate normal objectives?", "Give default objectives?", list("Yes", "No")) + keep_generic_objecives = (keep_generic_objecives != "Yes") ? FALSE : TRUE + + GLOB.everyone_an_antag = new /datum/everyone_is_an_antag_controller(chosen_antag, objective, keep_generic_objecives) + SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("[chosen_antag] All", "[objective]")) for(var/mob/living/player in GLOB.player_list) - GLOB.everyone_a_traitor.make_traitor(null, player) - message_admins(span_adminnotice("[key_name_admin(holder)] used everyone is a traitor secret. Objective is [objective]")) - log_admin("[key_name(holder)] used everyone is a traitor secret. Objective is [objective]") + GLOB.everyone_an_antag.make_antag(null, player) + message_admins(span_adminnotice("[key_name_admin(holder)] used everyone is antag secret. Antag is [chosen_antag]. Objective is [objective]. Generate default objectives: [keep_generic_objecives]")) + log_admin("[key_name(holder)] used everyone is antag secret: [chosen_antag] . Objective is [objective]. Generate default objectives: [keep_generic_objecives]. ") if("massbraindamage") if(!is_funmin) return @@ -641,38 +652,79 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) T.flick_overlay_static(portal_appearance[GET_TURF_PLANE_OFFSET(T) + 1], 15) playsound(T, 'sound/magic/lightningbolt.ogg', rand(80, 100), TRUE) -///Makes sure latejoining crewmembers also become traitors. -/datum/everyone_is_a_traitor_controller +/datum/everyone_is_an_antag_controller + var/chosen_antag = "" var/objective = "" + var/keep_generic_objecives -/datum/everyone_is_a_traitor_controller/New(objective) +/datum/everyone_is_an_antag_controller/New(chosen_antag, objective, keep_generic_objecives) + . = ..() + src.chosen_antag = chosen_antag src.objective = objective - RegisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED, PROC_REF(make_traitor)) + src.keep_generic_objecives = keep_generic_objecives + RegisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED, PROC_REF(make_antag_delay)) -/datum/everyone_is_a_traitor_controller/Destroy() +/datum/everyone_is_an_antag_controller/Destroy() UnregisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED) return ..() -/datum/everyone_is_a_traitor_controller/proc/make_traitor(datum/source, mob/living/player) +/datum/everyone_is_an_antag_controller/proc/assign_admin_objective_and_antag(mob/living/player, datum/antagonist/antag_datum) + var/datum/objective/new_objective = new(objective) + new_objective.team = player + new_objective.team_explanation_text = objective + antag_datum.objectives += new_objective + player.mind.add_antag_datum(antag_datum) + +/datum/everyone_is_an_antag_controller/proc/make_antag_delay(datum/source, mob/living/player) SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(make_antag), source, player) + + +/datum/everyone_is_an_antag_controller/proc/make_antag(datum/source, mob/living/player) if(player.stat == DEAD || !player.mind) return - if(is_special_character(player)) - return + sleep(1) if(ishuman(player)) - var/datum/antagonist/traitor/traitor_datum = new(give_objectives = FALSE) - var/datum/objective/new_objective = new - new_objective.owner = player - new_objective.explanation_text = objective - traitor_datum.objectives += new_objective - player.mind.add_antag_datum(traitor_datum) - var/datum/uplink_handler/uplink = traitor_datum.uplink_handler - uplink.has_progression = FALSE - uplink.has_objectives = FALSE + switch(chosen_antag) + if(ROLE_TRAITOR) + var/datum/antagonist/traitor/antag_datum = new(give_objectives = keep_generic_objecives) + assign_admin_objective_and_antag(player, antag_datum) + var/datum/uplink_handler/uplink = antag_datum.uplink_handler + uplink.has_progression = FALSE + uplink.has_objectives = FALSE + if(ROLE_CHANGELING) + var/datum/antagonist/changeling/antag_datum = new + antag_datum.give_objectives = keep_generic_objecives + assign_admin_objective_and_antag(player, antag_datum) + if(ROLE_HERETIC) + var/datum/antagonist/heretic/antag_datum = new + antag_datum.give_objectives = keep_generic_objecives + assign_admin_objective_and_antag(player, antag_datum) + if(ROLE_CULTIST) + var/datum/antagonist/cult/antag_datum = new + assign_admin_objective_and_antag(player, antag_datum) + if(ROLE_NINJA) + var/datum/antagonist/ninja/antag_datum = new + antag_datum.give_objectives = keep_generic_objecives + for(var/obj/item/item_to_drop in player) + if(!istype(item_to_drop, /obj/item/implant)) //avoid removing implanted uplinks + player.dropItemToGround(item_to_drop, FALSE) + assign_admin_objective_and_antag(player, antag_datum) + if(ROLE_WIZARD) + var/datum/antagonist/wizard/antag_datum = new + antag_datum.give_objectives = keep_generic_objecives + antag_datum.move_to_lair = FALSE + for(var/obj/item/item_to_drop in player) //avoid deleting player's items + if(!istype(item_to_drop, /obj/item/implant)) + player.dropItemToGround(item_to_drop, FALSE) + assign_admin_objective_and_antag(player, antag_datum) + if(ROLE_NIGHTMARE) + var/datum/antagonist/nightmare/antag_datum = new + assign_admin_objective_and_antag(player, antag_datum) + player.set_species(/datum/species/shadow/nightmare) + else if(isAI(player)) - var/datum/antagonist/malf_ai/malfunction_datum = new(give_objectives = FALSE) - var/datum/objective/new_objective = new - new_objective.owner = player - new_objective.explanation_text = objective - malfunction_datum.objectives += new_objective - player.mind.add_antag_datum(malfunction_datum) + var/datum/antagonist/malf_ai/antag_datum = new + antag_datum.give_objectives = keep_generic_objecives + assign_admin_objective_and_antag(player, antag_datum) + diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm index a23eb3c025230..a02d89e6b1d47 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm @@ -14,10 +14,12 @@ /datum/surgery/organ_extraction/can_start(mob/user, mob/living/carbon/target) if(!ishuman(user)) return FALSE - var/mob/living/carbon/human/H = user - if(H.dna.species.id == SPECIES_ABDUCTOR) + if(!..()) + return FALSE + if(isabductor(user)) return TRUE - for(var/obj/item/implant/abductor/A in H.implants) + var/mob/living/non_abductor = user + if(locate(/obj/item/implant/abductor) in non_abductor.implants) return TRUE return FALSE diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm index 66004140e5929..14d8d73788655 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm @@ -446,7 +446,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} if(ishuman(victim)) var/mob/living/carbon/human/human_victim = victim species = span_notice("[human_victim.dna.species.name]") - if(human_victim.mind && human_victim.mind.has_antag_datum(/datum/antagonist/changeling)) + if(IS_CHANGELING(human_victim)) species = span_warning("Changeling lifeform") var/obj/item/organ/internal/heart/gland/temp = locate() in human_victim.organs if(temp) diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm index b76a25ca7203a..5bd5ce8c2ecfc 100644 --- a/code/modules/antagonists/abductor/machinery/console.dm +++ b/code/modules/antagonists/abductor/machinery/console.dm @@ -71,7 +71,7 @@ if(do_after(user,100, target = src)) TeleporterSend() -/obj/machinery/abductor/console/ui_status(mob/user) +/obj/machinery/abductor/console/ui_status(mob/user, datum/ui_state/state) if(!isabductor(user) && !isobserver(user)) return UI_CLOSE return ..() diff --git a/code/modules/antagonists/abductor/machinery/dispenser.dm b/code/modules/antagonists/abductor/machinery/dispenser.dm index 163b7515872d2..8d8f9e14b8954 100644 --- a/code/modules/antagonists/abductor/machinery/dispenser.dm +++ b/code/modules/antagonists/abductor/machinery/dispenser.dm @@ -22,7 +22,7 @@ gland_colors[i] = random_color() amounts[i] = rand(1,5) -/obj/machinery/abductor/gland_dispenser/ui_status(mob/user) +/obj/machinery/abductor/gland_dispenser/ui_status(mob/user, datum/ui_state/state) if(!isabductor(user) && !isobserver(user)) return UI_CLOSE return ..() diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm index 333a03b45f8fc..711923daa442f 100644 --- a/code/modules/antagonists/abductor/machinery/experiment.dm +++ b/code/modules/antagonists/abductor/machinery/experiment.dm @@ -59,7 +59,7 @@ span_notice("You successfully break out of [src]!")) open_machine() -/obj/machinery/abductor/experiment/ui_status(mob/user) +/obj/machinery/abductor/experiment/ui_status(mob/user, datum/ui_state/state) if(user == occupant) return UI_CLOSE return ..() diff --git a/code/modules/antagonists/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm index 7a84fc183c458..524bfb04362db 100644 --- a/code/modules/antagonists/brainwashing/brainwashing.dm +++ b/code/modules/antagonists/brainwashing/brainwashing.dm @@ -54,10 +54,6 @@ owner.announce_objectives() return ..() -/datum/antagonist/brainwashed/on_mindshield(mob/implanter) - owner.remove_antag_datum(/datum/antagonist/brainwashed) - return COMPONENT_MINDSHIELD_DECONVERTED - /datum/antagonist/brainwashed/admin_add(datum/mind/new_owner,mob/admin) var/mob/living/carbon/C = new_owner.current if(!istype(C)) diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index 4c3fdb45dc98a..9404157ad24ab 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -209,7 +209,7 @@ /datum/objective/convert_brother name = "convert brother" - explanation_text = "Convert someone else using your flash." + explanation_text = "Convert a brainwashable person using your flash on them directly. Any handheld flash will work if you lose or break your starting flash." admin_grantable = FALSE martyr_compatible = TRUE diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm index efbf906809be0..23b4f9548c424 100644 --- a/code/modules/antagonists/changeling/changeling_power.dm +++ b/code/modules/antagonists/changeling/changeling_power.dm @@ -44,7 +44,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p /datum/action/changeling/Trigger(trigger_flags) var/mob/user = owner - if(!user || !user.mind || !user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(!user || !IS_CHANGELING(user)) return try_to_sting(user) @@ -61,7 +61,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p /datum/action/changeling/proc/try_to_sting(mob/living/user, mob/living/target) if(!can_sting(user, target)) return FALSE - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(sting_action(user, target)) sting_feedback(user, target) changeling.adjust_chemicals(-chemical_cost) @@ -81,7 +81,7 @@ 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 - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(changeling.chem_charges < chemical_cost) user.balloon_alert(user, "needs [chemical_cost] chemicals!") return FALSE diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 1fdb50a7babf7..5bd0f390cb8bb 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -24,13 +24,13 @@ return var/mob/living/carbon/target = owner.pulling - var/datum/antagonist/changeling/changeling = owner.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(owner) return changeling.can_absorb_dna(target) /datum/action/changeling/absorb_dna/sting_action(mob/owner) SHOULD_CALL_PARENT(FALSE) // the only reason to call parent is for proper blackbox logging, and we do that ourselves in a snowflake way - var/datum/antagonist/changeling/changeling = owner.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(owner) var/mob/living/carbon/human/target = owner.pulling is_absorbing = TRUE @@ -68,7 +68,7 @@ /datum/action/changeling/absorb_dna/proc/absorb_memories(mob/living/carbon/human/target) var/datum/mind/suckedbrain = target.mind - var/datum/antagonist/changeling/changeling = owner.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(owner) for(var/memory_type in suckedbrain.memories) var/datum/memory/stolen_memory = suckedbrain.memories[memory_type] @@ -109,7 +109,7 @@ to_chat(owner, span_boldnotice("We have no more knowledge of [target]'s speech patterns.")) - var/datum/antagonist/changeling/target_ling = target.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/target_ling = IS_CHANGELING(target) if(target_ling)//If the target was a changeling, suck out their extra juice and objective points! to_chat(owner, span_boldnotice("[target] was one of us. We have absorbed their power.")) diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index eba507ad5e079..ef3070356d5d2 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -65,6 +65,18 @@ ..() return TRUE + var/obj/item/clothing/shoes/shoes = user.shoes + if(istype(shoes) && shoes.tied == SHOES_KNOTTED && !(shoes.resistance_flags & (INDESTRUCTIBLE|UNACIDABLE|ACID_PROOF))) + new /obj/effect/decal/cleanable/greenglow(shoes.drop_location()) + user.visible_message( + span_warning("[user] vomits a glob of acid on [user.p_their()] tied up [shoes.name], melting [shoes.p_them()] into a pool of goo!"), + span_warning("We vomit acidic ooze onto our tied up [shoes.name], melting [shoes.p_them()] into a pool of goo!"), + ) + log_combat(user, shoes, "melted own shoes", addition = "(biodegrade)") + qdel(shoes) + ..() + return TRUE + user.balloon_alert(user, "already free!") return FALSE diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index cd748e8315953..921dde3549263 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -40,6 +40,7 @@ return changeling.fakedeath(CHANGELING_TRAIT) + ADD_TRAIT(changeling, TRAIT_STASIS, CHANGELING_TRAIT) addtimer(CALLBACK(src, PROC_REF(ready_to_regenerate), changeling), fakedeath_duration * duration_modifier, TIMER_UNIQUE) // Basically, these let the ling exit stasis without giving away their ling-y-ness if revived through other means RegisterSignal(changeling, SIGNAL_REMOVETRAIT(TRAIT_DEATHCOMA), PROC_REF(fakedeath_reset)) @@ -54,6 +55,7 @@ revive_ready = FALSE build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) + REMOVE_TRAIT(changeling, TRAIT_STASIS, CHANGELING_TRAIT) UnregisterSignal(changeling, SIGNAL_REMOVETRAIT(TRAIT_DEATHCOMA)) UnregisterSignal(changeling, COMSIG_MOB_STATCHANGE) @@ -116,7 +118,7 @@ if(QDELETED(src) || QDELETED(user)) return - var/datum/antagonist/changeling/ling = user.mind?.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/ling = IS_CHANGELING(user) if(QDELETED(ling) || !(src in ling.innate_powers + ling.purchased_powers)) // checking both innate and purchased for full coverage return if(!HAS_TRAIT_FROM(user, TRAIT_DEATHCOMA, CHANGELING_TRAIT)) diff --git a/code/modules/antagonists/changeling/powers/lesserform.dm b/code/modules/antagonists/changeling/powers/lesserform.dm index 87bd7c7c8b669..55238ce762daa 100644 --- a/code/modules/antagonists/changeling/powers/lesserform.dm +++ b/code/modules/antagonists/changeling/powers/lesserform.dm @@ -30,7 +30,7 @@ if(user.movement_type & VENTCRAWLING) user.balloon_alert(user, "can't transform in pipes!") return FALSE - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) var/datum/changeling_profile/chosen_form = select_form(changeling, user) if(!chosen_form) return FALSE diff --git a/code/modules/antagonists/changeling/powers/mimic_voice.dm b/code/modules/antagonists/changeling/powers/mimic_voice.dm index 3a9314a953af5..9caf0abb450f5 100644 --- a/code/modules/antagonists/changeling/powers/mimic_voice.dm +++ b/code/modules/antagonists/changeling/powers/mimic_voice.dm @@ -9,7 +9,7 @@ // Fake Voice /datum/action/changeling/mimicvoice/sting_action(mob/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(changeling.mimicing) changeling.mimicing = "" changeling.chem_recharge_slowdown -= 0.25 @@ -27,7 +27,7 @@ return TRUE /datum/action/changeling/mimicvoice/Remove(mob/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(changeling?.mimicing) changeling.chem_recharge_slowdown = max(0, changeling.chem_recharge_slowdown - 0.25) changeling.mimicing = "" diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 9c5b6a10ec9d5..af7348f7bf139 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -90,8 +90,8 @@ chemical_cost = 1000 dna_cost = CHANGELING_POWER_UNOBTAINABLE - var/helmet_type = /obj/item - var/suit_type = /obj/item + var/helmet_type = null + var/suit_type = null var/suit_name_simple = " " var/helmet_name_simple = " " var/recharge_slowdown = 0 @@ -121,14 +121,18 @@ //checks if we already have an organic suit and casts it off. /datum/action/changeling/suit/proc/check_suit(mob/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(!ishuman(user) || !changeling) return 1 var/mob/living/carbon/human/H = user + if(istype(H.wear_suit, suit_type) || istype(H.head, helmet_type)) - H.visible_message(span_warning("[H] casts off [H.p_their()] [suit_name_simple]!"), span_warning("We cast off our [suit_name_simple]."), span_hear("You hear the organic matter ripping and tearing!")) - H.temporarilyRemoveItemFromInventory(H.head, TRUE) //The qdel on dropped() takes care of it - H.temporarilyRemoveItemFromInventory(H.wear_suit, TRUE) + var/name_to_use = (isnull(suit_type) ? helmet_name_simple : suit_name_simple) + H.visible_message(span_warning("[H] casts off [H.p_their()] [name_to_use]!"), span_warning("We cast off our [name_to_use]."), span_hear("You hear the organic matter ripping and tearing!")) + if(!isnull(helmet_type)) + H.temporarilyRemoveItemFromInventory(H.head, TRUE) //The qdel on dropped() takes care of it + if(!isnull(suit_type)) + H.temporarilyRemoveItemFromInventory(H.wear_suit, TRUE) H.update_worn_oversuit() H.update_worn_head() H.update_body_parts() @@ -141,20 +145,21 @@ return 1 /datum/action/changeling/suit/sting_action(mob/living/carbon/human/user) - if(!user.canUnEquip(user.wear_suit)) + if(!user.canUnEquip(user.wear_suit) && !isnull(suit_type)) user.balloon_alert(user, "body occupied!") return - if(!user.canUnEquip(user.head)) + if(!user.canUnEquip(user.head) && !isnull(helmet_type)) user.balloon_alert(user, "head occupied!") return ..() - user.dropItemToGround(user.head) - user.dropItemToGround(user.wear_suit) - - user.equip_to_slot_if_possible(new suit_type(user), ITEM_SLOT_OCLOTHING, 1, 1, 1) - user.equip_to_slot_if_possible(new helmet_type(user), ITEM_SLOT_HEAD, 1, 1, 1) - - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + if(!isnull(suit_type)) + user.dropItemToGround(user.wear_suit) + user.equip_to_slot_if_possible(new suit_type(user), ITEM_SLOT_OCLOTHING, 1, 1, 1) + if(!isnull(helmet_type)) + user.dropItemToGround(user.head) + user.equip_to_slot_if_possible(new helmet_type(user), ITEM_SLOT_HEAD, 1, 1, 1) + + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) changeling.chem_recharge_slowdown += recharge_slowdown return TRUE @@ -477,7 +482,7 @@ weapon_name_simple = "shield" /datum/action/changeling/weapon/shield/sting_action(mob/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) //So we can read the absorbed_count. + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) //So we can read the absorbed_count. if(!changeling) return @@ -582,3 +587,124 @@ /obj/item/clothing/head/helmet/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + +/datum/action/changeling/suit/hive_head + name = "Hive Head" + desc = "We coat our head in a waxy outing coating similar to a bee hive which can be used to manufacture bees to attack our enemies. Costs 15 chemicals." + helptext = "While the hive head does not provide much in the ways of armor, it does allow the user to send bees out to attack targets. Reagents can poured inside the hive to cause all bees released to inject said reagents." + button_icon_state = "hive_head" + chemical_cost = 15 + dna_cost = 2 + req_human = FALSE + blood_on_castoff = TRUE + + helmet_type = /obj/item/clothing/head/helmet/changeling_hivehead + helmet_name_simple = "hive head" + +/obj/item/clothing/head/helmet/changeling_hivehead + name = "hive head" + desc = "A strange, waxy outer coating covering your head. Gives you tinnitus." + icon_state = "hivehead" + inhand_icon_state = null + flash_protect = FLASH_PROTECTION_FLASH + item_flags = DROPDEL + armor_type = /datum/armor/changeling_hivehead + flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT + actions_types = list(/datum/action/cooldown/hivehead_spawn_minions) + ///Does this hive head hold reagents? + var/holds_reagents = TRUE + +/obj/item/clothing/head/helmet/changeling_hivehead/Initialize(mapload) + . = ..() + if(holds_reagents) + create_reagents(50, REFILLABLE) + +/datum/armor/changeling_hivehead + melee = 10 + bullet = 10 + laser = 10 + energy = 10 + bio = 50 + +/obj/item/clothing/head/helmet/changeling_hivehead/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + +/obj/item/clothing/head/helmet/changeling_hivehead/attackby(obj/item/attacking_item, mob/user, params) + . = ..() + if(!istype(attacking_item, /obj/item/organ/internal/monster_core/regenerative_core/legion) || !holds_reagents) + return + visible_message(span_boldwarning("As [user] shoves [attacking_item] into [src], [src] begins to mutate.")) + var/mob/living/carbon/wearer = loc + playsound(wearer, 'sound/effects/attackblob.ogg', 60, TRUE) + wearer.temporarilyRemoveItemFromInventory(wearer.head, TRUE) + wearer.equip_to_slot_if_possible(new /obj/item/clothing/head/helmet/changeling_hivehead/legion(wearer), ITEM_SLOT_HEAD, 1, 1, 1) + qdel(attacking_item) + + +/datum/action/cooldown/hivehead_spawn_minions + name = "Release Bees" + desc = "Release a group of bees to attack all other lifeforms." + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + button_icon = 'icons/mob/simple/bees.dmi' + button_icon_state = "queen_item" + cooldown_time = 30 SECONDS + ///The mob we're going to spawn + var/spawn_type = /mob/living/basic/bee/timed/short + ///How many are we going to spawn + var/spawn_count = 6 + +/datum/action/cooldown/hivehead_spawn_minions/PreActivate(atom/target) + if(owner.movement_type & VENTCRAWLING) + owner.balloon_alert(owner, "unavailable here") + return + return ..() + +/datum/action/cooldown/hivehead_spawn_minions/Activate(atom/target) + . = ..() + do_tell() + var/spawns = spawn_count + if(owner.stat >= HARD_CRIT) + spawns = 1 + for(var/i in 1 to spawns) + var/mob/living/basic/summoned_minion = new spawn_type(get_turf(owner)) + summoned_minion.faction = list("[REF(owner)]") + minion_additional_changes(summoned_minion) + +///Our tell that we're using this ability. Usually a sound and a visible message.area +/datum/action/cooldown/hivehead_spawn_minions/proc/do_tell() + owner.visible_message(span_warning("[owner]'s head begins to buzz as bees begin to pour out!"), span_warning("We release the bees."), span_hear("You hear a loud buzzing sound!")) + playsound(owner, 'sound/creatures/bee_swarm.ogg', 60, TRUE) + +///Stuff we want to do to our minions. This is in its own proc so subtypes can override this behaviour. +/datum/action/cooldown/hivehead_spawn_minions/proc/minion_additional_changes(mob/living/basic/minion) + var/mob/living/basic/bee/summoned_bee = minion + var/mob/living/carbon/wearer = owner + if(istype(summoned_bee) && length(wearer.head.reagents.reagent_list)) + summoned_bee.assign_reagent(pick(wearer.head.reagents.reagent_list)) + +/obj/item/clothing/head/helmet/changeling_hivehead/legion + name = "legion hive head" + desc = "A strange, boney coating covering your head with a fleshy inside. Surprisingly comfortable." + icon_state = "hivehead_legion" + actions_types = list(/datum/action/cooldown/hivehead_spawn_minions/legion) + holds_reagents = FALSE + +/datum/action/cooldown/hivehead_spawn_minions/legion + name = "Release Legion" + desc = "Release a group of legion to attack all other lifeforms." + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "legion_head" + cooldown_time = 15 SECONDS + spawn_type = /mob/living/basic/legion_brood + spawn_count = 4 + +/datum/action/cooldown/hivehead_spawn_minions/legion/do_tell() + owner.visible_message(span_warning("[owner]'s head begins to shake as legion begin to pour out!"), span_warning("We release the legion."), span_hear("You hear a loud squishing sound!")) + playsound(owner, 'sound/effects/attackblob.ogg', 60, TRUE) + +/datum/action/cooldown/hivehead_spawn_minions/legion/minion_additional_changes(mob/living/basic/minion) + var/mob/living/basic/legion_brood/brood = minion + if (istype(brood)) + brood.assign_creator(owner, FALSE) diff --git a/code/modules/antagonists/changeling/powers/pheromone_receptors.dm b/code/modules/antagonists/changeling/powers/pheromone_receptors.dm index 8ed9c27599b33..18fda4bf4ff02 100644 --- a/code/modules/antagonists/changeling/powers/pheromone_receptors.dm +++ b/code/modules/antagonists/changeling/powers/pheromone_receptors.dm @@ -15,14 +15,14 @@ /datum/action/changeling/pheromone_receptors/Remove(mob/living/carbon/user) if(receptors_active) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) changeling.chem_recharge_slowdown -= 0.25 user.remove_status_effect(/datum/status_effect/agent_pinpointer/changeling) ..() /datum/action/changeling/pheromone_receptors/sting_action(mob/living/carbon/user) ..() - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(!receptors_active) to_chat(user, span_warning("We search for the scent of any nearby changelings.")) changeling.chem_recharge_slowdown += 0.25 @@ -49,7 +49,7 @@ for(var/mob/living/carbon/C in GLOB.alive_mob_list) if(C != owner && C.mind) - var/datum/antagonist/changeling/antag_datum = C.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/antag_datum = IS_CHANGELING(C) if(istype(antag_datum)) var/their_loc = get_turf(C) var/distance = get_dist_euclidian(my_loc, their_loc) diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index badd18f19f0a1..aa204d89a166e 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -16,7 +16,7 @@ for(var/mob/living/M in get_hearers_in_view(4, user)) if(iscarbon(M)) var/mob/living/carbon/C = M - if(!C.mind || !C.mind.has_antag_datum(/datum/antagonist/changeling)) + if(!IS_CHANGELING(C)) var/obj/item/organ/internal/ears/ears = C.get_organ_slot(ORGAN_SLOT_EARS) if(ears) ears.adjustEarDamage(0, 30) diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index f58d27c7501a8..d6767f5c1b1cb 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -6,7 +6,7 @@ var/mob/user = owner if(!user || !user.mind) return - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(!changeling) return if(!changeling.chosen_sting) @@ -17,7 +17,7 @@ /datum/action/changeling/sting/proc/set_sting(mob/user) to_chat(user, span_notice("We prepare our sting. Alt+click or click the middle mouse button on a target to sting them.")) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) changeling.chosen_sting = src changeling.lingstingdisplay.icon_state = button_icon_state @@ -25,7 +25,7 @@ /datum/action/changeling/sting/proc/unset_sting(mob/user) to_chat(user, span_warning("We retract our sting, we can't sting anyone for now.")) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) changeling.chosen_sting = null changeling.lingstingdisplay.icon_state = null @@ -40,7 +40,7 @@ /datum/action/changeling/sting/can_sting(mob/user, mob/target) if(!..()) return - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(!changeling.chosen_sting) to_chat(user, "We haven't prepared our sting yet!") if(!iscarbon(target)) @@ -49,7 +49,7 @@ return if(!length(get_path_to(user, target, max_distance = changeling.sting_range, simulated_only = FALSE))) return // no path within the sting's range is found. what a weird place to use the pathfinding system - if(target.mind && target.mind.has_antag_datum(/datum/antagonist/changeling)) + if(IS_CHANGELING(target)) sting_feedback(user, target) changeling.chem_charges -= chemical_cost return 1 @@ -58,7 +58,7 @@ if(!target) return to_chat(user, span_notice("We stealthily sting [target.name].")) - if(target.mind && target.mind.has_antag_datum(/datum/antagonist/changeling)) + if(IS_CHANGELING(target)) to_chat(target, span_warning("You feel a tiny prick.")) return 1 @@ -93,7 +93,7 @@ /datum/action/changeling/sting/transformation/set_sting(mob/user) selected_dna = null - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) var/datum/changeling_profile/new_selected_dna = changeling.select_dna() if(QDELETED(src) || QDELETED(changeling) || QDELETED(user)) return @@ -197,13 +197,13 @@ /datum/action/changeling/sting/extract_dna/can_sting(mob/user, mob/target) if(..()) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) return changeling.can_absorb_dna(target) /datum/action/changeling/sting/extract_dna/sting_action(mob/user, mob/living/carbon/human/target) ..() log_combat(user, target, "stung", "extraction sting") - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(!changeling.has_profile_with_dna(target.dna)) changeling.add_new_profile(target) return TRUE diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index 804dd2bffaca0..e4a2b36ca684f 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -13,7 +13,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/glasses/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -25,7 +25,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/under/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -38,7 +38,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/suit/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -51,7 +51,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/head/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -63,7 +63,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/shoes/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -75,7 +75,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/gloves/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -87,7 +87,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/mask/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -100,7 +100,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -134,7 +134,7 @@ //Change our DNA to that of somebody we've absorbed. /datum/action/changeling/transform/sting_action(mob/living/carbon/human/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) var/datum/changeling_profile/chosen_prof = changeling.select_dna() if(!chosen_prof) @@ -185,7 +185,7 @@ /datum/antagonist/changeling/proc/check_menu(mob/living/carbon/user) if(!istype(user)) return FALSE - var/datum/antagonist/changeling/changeling_datum = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling_datum = IS_CHANGELING(user) if(!changeling_datum) return FALSE return TRUE diff --git a/code/modules/antagonists/changeling/powers/void_adaption.dm b/code/modules/antagonists/changeling/powers/void_adaption.dm index 76c0eeffc972d..934ae2f5770b3 100644 --- a/code/modules/antagonists/changeling/powers/void_adaption.dm +++ b/code/modules/antagonists/changeling/powers/void_adaption.dm @@ -55,14 +55,14 @@ if (!should_be_active) on_removed_adaption(void_adapted, "Our cells relax in safer air.") return - var/datum/antagonist/changeling/changeling_data = void_adapted.mind?.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling_data = IS_CHANGELING(void_adapted) to_chat(void_adapted, span_changeling("Our cells harden themselves against the [pick(active_reasons)].")) changeling_data?.chem_recharge_slowdown -= recharge_slowdown currently_active = TRUE /// Called when we stop being adapted /datum/action/changeling/void_adaption/proc/on_removed_adaption(mob/living/former, message) - var/datum/antagonist/changeling/changeling_data = former.mind?.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling_data = IS_CHANGELING(former) to_chat(former, span_changeling(message)) changeling_data?.chem_recharge_slowdown += recharge_slowdown currently_active = FALSE diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index cb9f3b75ccccf..f2cf7b0004771 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -211,7 +211,8 @@ /datum/heretic_knowledge/spell/on_lose(mob/user, datum/antagonist/heretic/our_heretic) var/datum/action/cooldown/spell/created_spell = created_spell_ref?.resolve() - created_spell?.Remove(user) + if(created_spell?.owner == user) + created_spell.Remove(user) /** * A knowledge subtype for knowledge that can only diff --git a/code/modules/antagonists/heretic/items/heretic_necks.dm b/code/modules/antagonists/heretic/items/heretic_necks.dm index 44e387cf97045..c1f244dfd0e8f 100644 --- a/code/modules/antagonists/heretic/items/heretic_necks.dm +++ b/code/modules/antagonists/heretic/items/heretic_necks.dm @@ -55,7 +55,7 @@ // The amulette conversion tool used by moon heretics /obj/item/clothing/neck/heretic_focus/moon_amulette name = "Moonlight Amulette" - desc = "A piece of the mind, the sight and the moon. Gazing into it makes your head spin and hear whispers of laughter and joy." + desc = "A piece of the mind, the soul and the moon. Gazing into it makes your head spin and hear whispers of laughter and joy." icon = 'icons/obj/antags/eldritch.dmi' icon_state = "moon_amulette" w_class = WEIGHT_CLASS_SMALL @@ -64,7 +64,7 @@ /obj/item/clothing/neck/heretic_focus/moon_amulette/attack(mob/living/target, mob/living/user, params) var/mob/living/carbon/human/hit = target - if(!IS_HERETIC(user)) + if(!IS_HERETIC_OR_MONSTER(user)) user.balloon_alert(user, "you feel a presence watching you") user.add_mood_event("Moon Amulette Insanity", /datum/mood_event/amulette_insanity) user.mob_mood.set_sanity(user.mob_mood.sanity - 50) @@ -73,7 +73,7 @@ return if(!hit.mob_mood) return - if(hit.mob_mood.sanity_level < SANITY_LEVEL_CRAZY) + if(hit.mob_mood.sanity_level < SANITY_LEVEL_UNSTABLE) user.balloon_alert(user, "their mind is too strong!") hit.add_mood_event("Moon Amulette Insanity", /datum/mood_event/amulette_insanity) hit.mob_mood.set_sanity(hit.mob_mood.sanity - sanity_damage) diff --git a/code/modules/antagonists/heretic/items/keyring.dm b/code/modules/antagonists/heretic/items/keyring.dm index a6a53bc3cee1a..b71015dbfe1f2 100644 --- a/code/modules/antagonists/heretic/items/keyring.dm +++ b/code/modules/antagonists/heretic/items/keyring.dm @@ -3,7 +3,7 @@ desc = "A crack in space, impossibly deep and painful to the eyes. Definitely not safe." icon = 'icons/effects/eldritch.dmi' icon_state = "realitycrack" - light_system = STATIC_LIGHT + light_system = COMPLEX_LIGHT light_power = 1 light_on = TRUE light_color = COLOR_GREEN diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index 57d99a355f0fe..d7d1bd3bf22a7 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -67,11 +67,11 @@ var/mob/living/carbon/carbon_target = target to_chat(carbon_target, span_danger("You hear echoing laughter from above")) carbon_target.cause_hallucination(/datum/hallucination/delusion/preset/moon, "delusion/preset/moon hallucination caused by mansus grasp") - carbon_target.mob_mood.set_sanity(carbon_target.mob_mood.sanity-20) + carbon_target.mob_mood.set_sanity(carbon_target.mob_mood.sanity-30) /datum/heretic_knowledge/spell/moon_smile name = "Smile of the moon" - desc = "Grants you Smile of the moon, a ranged spell muting, blinding and deafening the target for a\ + desc = "Grants you Smile of the moon, a ranged spell muting, blinding, deafening and knocking down the target for a\ duration based on their sanity." gain_text = "The moon smiles upon us all and those who see its true side can bring its joy." next_knowledge = list( @@ -112,7 +112,7 @@ /datum/heretic_knowledge/moon_amulette name = "Moonlight Amulette" - desc = "Allows you to transmute 2 sheets of glass, a pair of eyes, a brain and a tie \ + desc = "Allows you to transmute 2 sheets of glass, a heart and a tie \ if the item is used on someone with low sanity they go berserk attacking everyone \ , if their sanity isnt low enough it decreases their mood." gain_text = "At the head of the parade he stood, the moon condensed into one mass, a reflection of the soul." @@ -124,7 +124,6 @@ /datum/heretic_knowledge/painting, ) required_atoms = list( - /obj/item/organ/internal/eyes = 1, /obj/item/organ/internal/heart = 1, /obj/item/stack/sheet/glass = 2, /obj/item/clothing/neck/tie = 1, @@ -190,11 +189,13 @@ /datum/heretic_knowledge/ultimate/moon_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() + var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) priority_announce("[generate_heretic_text()] Laugh, for the ringleader [user.real_name] has ascended! \ The truth shall finally devour the lie! [generate_heretic_text()]","[generate_heretic_text()]", ANNOUNCER_SPANOMALIES) user.client?.give_award(/datum/award/achievement/misc/moon_ascension, user) ADD_TRAIT(user, TRAIT_MADNESS_IMMUNE, REF(src)) + heretic_datum.add_team_hud(user, /datum/antagonist/lunatic) RegisterSignal(user, COMSIG_LIVING_LIFE, PROC_REF(on_life)) @@ -237,6 +238,7 @@ amount_of_lunatics += 1 /datum/heretic_knowledge/ultimate/moon_final/proc/on_life(mob/living/source, seconds_per_tick, times_fired) + var/obj/effect/moon_effect = /obj/effect/temp_visual/moon_ringleader SIGNAL_HANDLER visible_hallucination_pulse( @@ -251,6 +253,7 @@ continue if(IS_HERETIC_OR_MONSTER(carbon_view)) continue + new moon_effect(get_turf(carbon_view)) carbon_view.adjust_confusion(2 SECONDS) carbon_view.mob_mood.set_sanity(carbon_sanity - 5) if(carbon_sanity < 30) diff --git a/code/modules/antagonists/heretic/magic/flesh_surgery.dm b/code/modules/antagonists/heretic/magic/flesh_surgery.dm index 0fb0a402da964..12b3fcfbcaf33 100644 --- a/code/modules/antagonists/heretic/magic/flesh_surgery.dm +++ b/code/modules/antagonists/heretic/magic/flesh_surgery.dm @@ -85,23 +85,24 @@ /// If cast on an organ, we'll restore it's health and even un-fail it. /datum/action/cooldown/spell/touch/flesh_surgery/proc/heal_organ(obj/item/melee/touch_attack/hand, obj/item/organ/to_heal, mob/living/carbon/caster) + if(to_heal.damage == 0) + to_heal.balloon_alert(caster, "already in good condition!") + return FALSE to_heal.balloon_alert(caster, "healing organ...") if(!do_after(caster, 1 SECONDS, to_heal, extra_checks = CALLBACK(src, PROC_REF(heal_checks), hand, to_heal, caster))) to_heal.balloon_alert(caster, "interrupted!") return FALSE var/organ_hp_to_heal = to_heal.maxHealth * organ_percent_healing - if(to_heal.damage < organ_hp_to_heal) - to_heal.set_organ_damage(organ_hp_to_heal) - to_heal.balloon_alert(caster, "organ healed") - playsound(to_heal, 'sound/magic/staff_healing.ogg', 30) - new /obj/effect/temp_visual/cult/sparks(get_turf(to_heal)) - caster.visible_message( - span_warning("[caster]'s hand glows a brilliant red as [caster.p_they()] restore \the [to_heal] to good condition!"), - span_notice("Your hand glows a brilliant red as you restore \the [to_heal] to good condition!"), - ) - else - to_heal.balloon_alert(caster, "already in good condition!") + to_heal.set_organ_damage(max(0 , to_heal.damage - organ_hp_to_heal)) + to_heal.balloon_alert(caster, "organ healed") + playsound(to_heal, 'sound/magic/staff_healing.ogg', 30) + new /obj/effect/temp_visual/cult/sparks(get_turf(to_heal)) + var/condition = (to_heal.damage > 0) ? "better" : "perfect" + caster.visible_message( + span_warning("[caster]'s hand glows a brilliant red as [caster.p_they()] restore \the [to_heal] to [condition] condition!"), + span_notice("Your hand glows a brilliant red as you restore \the [to_heal] to [condition] condition!"), + ) return TRUE @@ -120,7 +121,7 @@ playsound(to_heal, 'sound/magic/staff_healing.ogg', 30) new /obj/effect/temp_visual/cult/sparks(get_turf(to_heal)) caster.visible_message( - span_warning("[caster]'s hand glows a brilliant red as [caster.p_they()] restore [to_heal] to good condition!"), + span_warning("[caster]'s hand glows a brilliant red as [caster.p_they()] restore[caster.p_s()] [to_heal] to good condition!"), span_notice("Your hand glows a brilliant red as you restore [to_heal] to good condition!"), ) return TRUE @@ -169,14 +170,14 @@ time_it_takes = 6 SECONDS caster.visible_message( - span_danger("[caster]'s hand glows a brilliant red as [caster.p_they()] reach directly into [caster.p_their()] own [parsed_zone]!"), + span_danger("[caster]'s hand glows a brilliant red as [caster.p_they()] reach[caster.p_es()] directly into [caster.p_their()] own [parsed_zone]!"), span_userdanger("Your hand glows a brilliant red as you reach directly into your own [parsed_zone]!"), ) else carbon_victim.visible_message( - span_danger("[caster]'s hand glows a brilliant red as [caster.p_they()] reach directly into [carbon_victim]'s [parsed_zone]!"), - span_userdanger("[caster]'s hand glows a brilliant red as [caster.p_they()] reach directly into your [parsed_zone]!"), + span_danger("[caster]'s hand glows a brilliant red as [caster.p_they()] reach[caster.p_es()] directly into [carbon_victim]'s [parsed_zone]!"), + span_userdanger("[caster]'s hand glows a brilliant red as [caster.p_they()] reach[caster.p_es()] directly into your [parsed_zone]!"), ) carbon_victim.balloon_alert(caster, "extracting [chosen_organ]...") @@ -184,6 +185,7 @@ carbon_victim.add_atom_colour(COLOR_DARK_RED, TEMPORARY_COLOUR_PRIORITY) if(!do_after(caster, time_it_takes, carbon_victim, extra_checks = CALLBACK(src, PROC_REF(extraction_checks), picked_organ, hand, victim, caster))) carbon_victim.balloon_alert(caster, "interrupted!") + carbon_victim.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_DARK_RED) return FALSE // Visible message done before Remove() @@ -196,8 +198,8 @@ else carbon_victim.visible_message( - span_bolddanger("[caster]'s pulls [carbon_victim]'s [chosen_organ] out of [carbon_victim.p_their()] [parsed_zone]!!"), - span_userdanger("[caster]'s pulls your [chosen_organ] out of [carbon_victim.p_their()] [parsed_zone]!!"), + span_bolddanger("[caster] pulls [carbon_victim]'s [chosen_organ] out of [carbon_victim.p_their()] [parsed_zone]!!"), + span_userdanger("[caster] pulls your [chosen_organ] out of your [parsed_zone]!!"), ) picked_organ.Remove(carbon_victim) diff --git a/code/modules/antagonists/heretic/magic/moon_ringleader.dm b/code/modules/antagonists/heretic/magic/moon_ringleader.dm index af753bba92f33..45d3285a876da 100644 --- a/code/modules/antagonists/heretic/magic/moon_ringleader.dm +++ b/code/modules/antagonists/heretic/magic/moon_ringleader.dm @@ -52,12 +52,13 @@ victim.log_message("was driven insane by [caster]") victim.mob_mood.set_sanity(victim_sanity * 0.5) + /obj/effect/temp_visual/moon_ringleader icon = 'icons/effects/eldritch.dmi' icon_state = "ring_leader_effect" alpha = 180 duration = 6 -/obj/effect/temp_visual/moon_ringleader/Initialize(mapload) +/obj/effect/temp_visual/moon_ringleader/ringleader/Initialize(mapload) . = ..() transform = transform.Scale(10) diff --git a/code/modules/antagonists/heretic/magic/moon_smile.dm b/code/modules/antagonists/heretic/magic/moon_smile.dm index 75aba2c2ced52..893059721c428 100644 --- a/code/modules/antagonists/heretic/magic/moon_smile.dm +++ b/code/modules/antagonists/heretic/magic/moon_smile.dm @@ -1,7 +1,7 @@ /datum/action/cooldown/spell/pointed/moon_smile name = "Smile of the moon" desc = "Lets you turn the gaze of the moon on someone \ - temporarily blinding, muting, deafening and confusing a single target." + temporarily blinding, muting, deafening and knocking down a single target." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -36,13 +36,14 @@ playsound(cast_on, 'sound/hallucinations/i_see_you1.ogg', 50, 1) to_chat(cast_on, span_warning("Your eyes cry out in pain, your ears bleed and your lips seal! THE MOON SMILES UPON YOU!")) - cast_on.adjust_temp_blindness(moon_smile_duration SECONDS) - cast_on.set_eye_blur_if_lower(moon_smile_duration + 2 SECONDS) + cast_on.adjust_temp_blindness(moon_smile_duration + 5 SECONDS) + cast_on.set_eye_blur_if_lower(moon_smile_duration + 7 SECONDS) var/obj/item/organ/internal/ears/ears = cast_on.get_organ_slot(ORGAN_SLOT_EARS) - ears?.adjustEarDamage(0, moon_smile_duration) + ears?.adjustEarDamage(0, moon_smile_duration + 2 SECONDS) - cast_on.adjust_silence(moon_smile_duration SECONDS) + cast_on.adjust_silence(moon_smile_duration + 5 SECONDS) + cast_on.AdjustKnockdown(2 SECONDS) cast_on.add_mood_event("moon_smile", /datum/mood_event/moon_smile) //Lowers sanity cast_on.mob_mood.set_sanity(cast_on.mob_mood.sanity - 20) diff --git a/code/modules/antagonists/heretic/moon_lunatic.dm b/code/modules/antagonists/heretic/moon_lunatic.dm index cc6a304e0743d..21177f1a62319 100644 --- a/code/modules/antagonists/heretic/moon_lunatic.dm +++ b/code/modules/antagonists/heretic/moon_lunatic.dm @@ -6,6 +6,7 @@ show_in_antagpanel = FALSE suicide_cry = "PRAISE THE RINGLEADER!!" antag_moodlet = /datum/mood_event/heretics/lunatic + antag_hud_name = "lunatic" can_assign_self_objectives = FALSE hardcore_random_bonus = FALSE // The mind of the ascended heretic who created us @@ -33,6 +34,9 @@ var/mob/living/our_mob = mob_override || owner.current handle_clown_mutation(our_mob, "Ancient knowledge from the moon has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") our_mob.faction |= FACTION_HERETIC + add_team_hud(our_mob) + add_team_hud(our_mob, /datum/antagonist/heretic) + ADD_TRAIT(our_mob, TRAIT_MADNESS_IMMUNE, REF(src)) var/datum/action/cooldown/lunatic_track/moon_track = new /datum/action/cooldown/lunatic_track() var/datum/action/cooldown/spell/touch/mansus_grasp/mad_touch = new /datum/action/cooldown/spell/touch/mansus_grasp() diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm index 7fffc4a570609..08839fa8f1058 100644 --- a/code/modules/antagonists/heretic/status_effects/debuffs.dm +++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm @@ -251,7 +251,7 @@ owner.adjustBruteLoss( -150 + owner.mob_mood.sanity) owner.adjustFireLoss(-150 + owner.mob_mood.sanity) - to_chat(owner, span_warning(("THE MOON SHOWS YOU THE TRUTH AND THE LIARS WISH TO COVER IT, SLAY THEM ALL!!!"))) + to_chat(owner, span_hypnophrase(("THE MOON SHOWS YOU THE TRUTH AND THE LIARS WISH TO COVER IT, SLAY THEM ALL!!!"))) owner.balloon_alert(owner, "they lie..THEY ALL LIE!!!") owner.AdjustUnconscious(7 SECONDS, ignore_canstun = FALSE) ADD_TRAIT(owner, TRAIT_MUTE, REF(src)) @@ -271,6 +271,7 @@ if (damage_sustained < 75) return + qdel(src) /datum/status_effect/moon_converted/proc/update_owner_overlay(atom/source, list/overlays) diff --git a/code/modules/antagonists/heretic/status_effects/mark_effects.dm b/code/modules/antagonists/heretic/status_effects/mark_effects.dm index c8d2a04e64a8f..3dffa2dd4fe80 100644 --- a/code/modules/antagonists/heretic/status_effects/mark_effects.dm +++ b/code/modules/antagonists/heretic/status_effects/mark_effects.dm @@ -295,6 +295,7 @@ /datum/status_effect/eldritch/moon/on_effect() owner.adjust_confusion(30 SECONDS) + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 25, 160) owner.emote(pick("giggle", "laugh")) owner.add_mood_event("Moon Insanity", /datum/mood_event/moon_insanity) return ..() diff --git a/code/modules/antagonists/malf_ai/malf_ai.dm b/code/modules/antagonists/malf_ai/malf_ai.dm index 33a8dc8f80a09..f9f422d6e6fc3 100644 --- a/code/modules/antagonists/malf_ai/malf_ai.dm +++ b/code/modules/antagonists/malf_ai/malf_ai.dm @@ -60,8 +60,6 @@ /// Generates a complete set of malf AI objectives up to the traitor objective limit. /datum/antagonist/malf_ai/proc/forge_ai_objectives() - objectives.Cut() - if(prob(PROB_SPECIAL)) forge_special_objective() diff --git a/code/modules/antagonists/nightmare/nightmare_equipment.dm b/code/modules/antagonists/nightmare/nightmare_equipment.dm index 965b95ca6e892..fd80b3ea3ef56 100644 --- a/code/modules/antagonists/nightmare/nightmare_equipment.dm +++ b/code/modules/antagonists/nightmare/nightmare_equipment.dm @@ -64,7 +64,7 @@ remove_crit() /obj/item/light_eater/proc/prepare_crit_timer() - crit_timer = addtimer(CALLBACK(src, PROC_REF(add_crit)), 15 SECONDS, TIMER_DELETE_ME | TIMER_STOPPABLE) + crit_timer = addtimer(CALLBACK(src, PROC_REF(add_crit)), 7 SECONDS, TIMER_DELETE_ME | TIMER_STOPPABLE) /obj/item/light_eater/proc/stop_crit_timer() deltimer(crit_timer) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index 734025e9a370e..a7611c2444821 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -118,7 +118,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) var/tc_per_nukie = round(tc_to_distribute / (length(orphans)+length(uplinks))) for (var/datum/component/uplink/uplink in uplinks) - uplink.add_telecrystals(tc_per_nukie) + uplink.uplink_handler.add_telecrystals(tc_per_nukie) tc_to_distribute -= tc_per_nukie for (var/mob/living/L in orphans) diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index cf7d90bccf6c3..6278d5ddaea91 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -63,7 +63,7 @@ var/extra_tc = CEILING(GLOB.joined_player_list.len/5, 5) var/datum/component/uplink/uplink = owner.find_syndicate_uplink() if (uplink) - uplink.add_telecrystals(extra_tc) + uplink.uplink_handler.add_telecrystals(extra_tc) var/datum/component/uplink/uplink = owner.find_syndicate_uplink() if(uplink) @@ -617,7 +617,7 @@ nukie.mind.add_antag_datum(antag_datum, src) var/datum/component/uplink/uplink = nukie.mind.find_syndicate_uplink() - uplink?.set_telecrystals(tc_to_spawn) + uplink?.uplink_handler.set_telecrystals(tc_to_spawn) // add some pizzazz do_sparks(4, FALSE, spawn_loc) diff --git a/code/modules/antagonists/space_dragon/space_dragon.dm b/code/modules/antagonists/space_dragon/space_dragon.dm index 4b385b70e596c..25543fbc8fe86 100644 --- a/code/modules/antagonists/space_dragon/space_dragon.dm +++ b/code/modules/antagonists/space_dragon/space_dragon.dm @@ -263,7 +263,7 @@ players_to_carp_taken[carpy.key] += 1 var/list = "" for(var/carp_user in players_to_carp_taken) - list += "
  • [carp_user], who played [players_to_carp_taken[carp_user]] space carps.
  • " + list += "
  • [carp_user], who played [players_to_carp_taken[carp_user]] space carps.
  • " parts += list parts += "" diff --git a/code/modules/antagonists/spy/spy.dm b/code/modules/antagonists/spy/spy.dm new file mode 100644 index 0000000000000..e0ea7e4075404 --- /dev/null +++ b/code/modules/antagonists/spy/spy.dm @@ -0,0 +1,212 @@ +/datum/antagonist/spy + name = "\improper Spy" + roundend_category = "spies" + antagpanel_category = "Spy" + antag_hud_name = "spy" + job_rank = ROLE_SPY + antag_moodlet = /datum/mood_event/focused + hijack_speed = 1 + ui_name = "AntagInfoSpy" + preview_outfit = /datum/outfit/spy + /// Whether an uplink has been created (successfully or at all) + var/uplink_created = FALSE + /// String displayed in the antag panel pointing the spy to where their uplink is. + var/uplink_location + /// Whether we give them some random objetives to aim for. + var/spawn_with_objectives = TRUE + /// Tracks number of bounties claimed, for roundend + var/bounties_claimed = 0 + /// Tracks all loot items the spy has claimed, for roundend + var/list/all_loot = list() + /// Weakref to our spy uplink + /// Only exists for the sole purpose of letting admins see it + var/datum/weakref/uplink_weakref + +/datum/antagonist/spy/on_gain() + if(!uplink_created) + auto_create_spy_uplink(owner.current) + if(spawn_with_objectives) + give_random_objectives() + . = ..() + SEND_SOUND(owner.current, sound('sound/ambience/antag/spy.ogg')) + +/datum/antagonist/spy/ui_static_data(mob/user) + var/list/data = ..() + data["uplink_location"] = uplink_location + return data + +/datum/antagonist/spy/get_admin_commands() + . = ..() + // I wanted to put this in check-antagonists but it's less conducive to that + .["See All Bounties (For all spies)"] = CALLBACK(src, PROC_REF(see_bounties)) + .["Refresh Bounties (For all spies)"] = CALLBACK(src, PROC_REF(refresh_bounties)) + .["Give Spy Uplink"] = CALLBACK(src, PROC_REF(admin_create_spy_uplink)) + .["Bounty Handler VV"] = CALLBACK(src, PROC_REF(bounty_handler_vv)) + +/datum/antagonist/spy/proc/see_bounties() + if(!check_rights(R_ADMIN|R_DEBUG)) + return + + var/datum/component/spy_uplink/uplink = uplink_weakref?.resolve() + if(isnull(uplink)) + tgui_alert(usr, "No spy uplink!", "Mission Failed") + return + + uplink.ui_interact(usr) + +/datum/antagonist/spy/proc/refresh_bounties() + if(!check_rights(R_ADMIN|R_DEBUG)) + return + + var/datum/component/spy_uplink/uplink = uplink_weakref?.resolve() + if(isnull(uplink)) + tgui_alert(usr, "No spy uplink!", "Mission Failed") + return + + uplink.handler.force_refresh() + tgui_alert(usr, "Bounties refreshed.", "Mission Success") + +/datum/antagonist/spy/proc/admin_create_spy_uplink() + if(!check_rights(R_ADMIN|R_DEBUG)) + return + + if(!auto_create_spy_uplink(owner.current, give_backup = FALSE)) + tgui_alert(usr, "Failed to give [owner.current] a spy uplink - likely don't have a valid item to host it.", "Mission Failed") + +/datum/antagonist/spy/proc/bounty_handler_vv() + if(!check_rights(R_ADMIN|R_DEBUG)) + return + + var/datum/component/spy_uplink/uplink = uplink_weakref?.resolve() + if(isnull(uplink)) + tgui_alert(usr, "No spy uplink!", "Mission Failed") + return + + usr.client?.debug_variables(uplink.handler) + +/datum/antagonist/spy/proc/auto_create_spy_uplink(mob/living/carbon/spy, give_backup = TRUE) + if(!iscarbon(spy)) + return FALSE + + var/spy_uplink_loc = spy.client?.prefs?.read_preference(/datum/preference/choiced/uplink_location) + if(isnull(spy_uplink_loc) || spy_uplink_loc == UPLINK_IMPLANT) + spy_uplink_loc = pick(UPLINK_PEN, UPLINK_PDA) + + var/obj/item/spy_uplink = spy.get_uplink_location(spy_uplink_loc) + if(isnull(spy_uplink) || !create_spy_uplink(spy, spy_uplink)) + if(give_backup) + var/datum/action/backup_uplink/backup = new(src) + backup.Grant(spy) + to_chat(spy, span_boldnotice("You were unable to be supplied with an uplink, so you have been given the ability to create one yourself.")) + return FALSE + + return TRUE + +/datum/antagonist/spy/proc/create_spy_uplink(mob/living/carbon/spy, obj/item/spy_uplink) + var/datum/component/spy_uplink/uplink = spy_uplink.AddComponent(/datum/component/spy_uplink, src) + if(!uplink) + return FALSE + + uplink_weakref = WEAKREF(uplink) + uplink_created = TRUE + + if(istype(spy_uplink, /obj/item/modular_computer/pda)) + uplink_location = "your PDA" + + else if(istype(spy_uplink, /obj/item/pen)) + if(istype(spy_uplink.loc, /obj/item/modular_computer/pda)) + uplink_location = "your PDA's pen" + else + uplink_location = "a pen" + + else if(istype(spy_uplink, /obj/item/radio)) + uplink_location = "your radio headset" + + return TRUE + +/datum/antagonist/spy/proc/give_random_objectives() + for(var/i in 1 to rand(1, 3)) + var/datum/objective/custom/your_mission = new() + your_mission.owner = owner + your_mission.explanation_text = pick_list_replacements(SPY_OBJECTIVE_FILE, "objective_body") + objectives += your_mission + + if(prob(10)) + var/datum/objective/martyr/leave_no_trace = new() + leave_no_trace.owner = owner + objectives += leave_no_trace + + else if(prob(3)) //3% chance on 90% chance + var/datum/objective/hijack/steal_the_shuttle = new() + steal_the_shuttle.owner = owner + objectives += steal_the_shuttle + + else + var/datum/objective/escape/gtfo = new() + gtfo.owner = owner + objectives += gtfo + +/datum/antagonist/spy/antag_panel_data() + return "Bounties Claimed: [bounties_claimed]" + +/datum/antagonist/spy/roundend_report() + var/list/report = list() + report += printplayer(owner) + report += " - They completed [bounties_claimed] bounties." + if(bounties_claimed > 0) + report += " - They received the following rewards: [english_list(all_loot)]" + report += printobjectives(objectives) + return report.Join("
    ") + +/datum/antagonist/spy/get_preview_icon() + var/mob/living/carbon/human/dummy/consistent/dummy = new() + dummy.set_haircolor(COLOR_SILVER, update = FALSE) + dummy.set_hairstyle("CIA", update = FALSE) + return finish_preview_icon(render_preview_outfit(preview_outfit, dummy)) + +/datum/outfit/spy + name = "Spy (Preview only)" + // Balaclava sprite is ass, otherwise I would use it for this + uniform = /obj/item/clothing/under/suit/black + gloves = /obj/item/clothing/gloves/color/black + shoes = /obj/item/clothing/shoes/jackboots + head = /obj/item/clothing/head/fedora + suit = /obj/item/clothing/suit/jacket/trenchcoat + glasses = /obj/item/clothing/glasses/osi + ears = /obj/item/radio/headset + +/datum/action/backup_uplink + name = "Create Uplink" + desc = "Fashion a PDA, Pen or Radio Headset into a swanky Spy Uplink." + var/list/valid_types = list( + /obj/item/modular_computer/pda, + /obj/item/pen, + /obj/item/radio, + ) + +/datum/action/backup_uplink/New(Target) + . = ..() + if(!istype(Target, /datum/antagonist/spy)) + stack_trace("[type] created on invalid target [Target || "null"]") + qdel(src) + +/datum/action/backup_uplink/Trigger(trigger_flags) + . = ..() + if(!.) + return + + var/mob/living/spy = usr + var/obj/item/held_thing = spy.get_active_held_item() + if(isnull(held_thing)) + spy.balloon_alert(spy, "you need to hold something!") + return + + if(!is_type_in_list(held_thing, valid_types)) + held_thing.balloon_alert(spy, "invalid item!") + return + + var/datum/antagonist/spy/spy_datum = target + spy_datum.create_spy_uplink(spy, held_thing) + held_thing.balloon_alert(spy, "uplink created") + + qdel(src) diff --git a/code/modules/antagonists/spy/spy_bounty.dm b/code/modules/antagonists/spy/spy_bounty.dm new file mode 100644 index 0000000000000..035ebba340512 --- /dev/null +++ b/code/modules/antagonists/spy/spy_bounty.dm @@ -0,0 +1,684 @@ +/** + * ## Spy Bounty + * + * A datum used to track a single spy bounty. + * Not a singleton - whenever bounties are re-rolled, the entire list is deleted and new bounty datums are instantiated. + * + * When bounties are completed, they are also not deleted, but instead marked as claimed. + */ +/datum/spy_bounty + /// The name of the bounty. + /// Should be a short description without punctuation. + /// IE: "Steal the captain's ID" + var/name + /// Help text for the bounty. + /// Should include additional information about the bounty to assist the spy in figuring out what to do. + /// Should be punctuated. + /// IE: "Steal the captain's ID. It was last seen in the captain's office." + var/help + /// Difficult of the bounty, one of [SPY_DIFFICULTY_EASY], [SPY_DIFFICULTY_MEDIUM], [SPY_DIFFICULTY_HARD]. + /// Must be set to one of the possible bounties to be picked. + var/difficulty = "unset" + /// How long of a do-after must be completed by the Spy to turn in the bounty. + var/theft_time = 2 SECONDS + /// Probability that the stolen item will be sent to the black market instead of destroyed. + /// Guaranteed if the item is indestructible. + var/black_market_prob = 50 + /// Weight that the bounty will be selected. + var/weight = 1 + + /// Whether the bounty's been fully initialized. If this is not set, the bounty will be rerolled. + VAR_FINAL/initalized = FALSE + /// Whether the bounty has been completed. + VAR_FINAL/claimed = FALSE + /// What uplink item the bounty will reward on completion. + VAR_FINAL/datum/uplink_item/reward_item + +/datum/spy_bounty/New(datum/spy_bounty_handler/handler) + if(!init_bounty(handler)) + return + + initalized = TRUE + select_reward(handler) + +/// Helper that translates the bounty into UI data for TGUI +/datum/spy_bounty/proc/to_ui_data(mob/user) + SHOULD_CALL_PARENT(TRUE) + return list( + "name" = name, + "help" = help, + "difficulty" = difficulty, + "reward" = reward_item.name, + "claimed" = claimed, + "can_claim" = can_claim(user), + ) + +/// Check if the passed mob can claim this bounty. +/datum/spy_bounty/proc/can_claim(mob/user) + SHOULD_BE_PURE(TRUE) + return TRUE + +/** + * Initializes the bounty, setting up targets and etc. + * + * * handler - The bounty handler that is creating this bounty. + * + * Returning FALSE will cancel initialization and force it to reroll the bounty. + */ +/datum/spy_bounty/proc/init_bounty(datum/spy_bounty_handler/handler) + return FALSE + +/// Selects what uplink item the bounty will reward on completion. +/datum/spy_bounty/proc/select_reward(datum/spy_bounty_handler/handler) + var/list/loot_pool = handler.possible_uplink_items[difficulty] + + if(!length(loot_pool)) + reward_item = /datum/uplink_item/bundles_tc/telecrystal + return // future todo : add some junk items for when we run out of items + + reward_item = pick(loot_pool) + if(prob(80)) + loot_pool -= reward_item + +/** + * Checks if the passed movable is a valid target for this bounty. + * + * * stealing - The movable to check. + * + * Returning FALSE simply means that the passed movable is not valid for this bounty. + */ +/datum/spy_bounty/proc/is_stealable(atom/movable/stealing) + // SHOULD_BE_PURE(TRUE) + return FALSE + +/** + * What is this bounty's "dupe protection key"? + * This is used to determine if a duplicate of this bounty has been rolled before / in the last refresh. + * You can check if a bounty has been duped by accessing the handler's claimed_bounties_from_last_pool or all_claimed_bounty_types list. + * + * * stealing - The item that was stolen. + * * handler - The handler that is handling the bounty. + * + * Return a string key, what this uses for dupe protection. + */ +/datum/spy_bounty/proc/get_dupe_protection_key(atom/movable/stealing) + return stealing.type + +/** + * Checks if the passed dupe key is a duplicate of an previously claimed bounty. + * + * * handler - The handler that is handling the bounty. + * * dupe_key - The key to check for dupes + * * dupe_prob - The probability of a dupe being allowed when checking all_claimed_bounty_types. + * This allows you to have a chance that distant dupes allowed depending on how many times they've been done. + * + * Returns TRUE if the bounty is a dupe, FALSE if it is not. + */ +/datum/spy_bounty/proc/check_dupe(datum/spy_bounty_handler/handler, dupe_key, dupe_prob = 0) + if(handler.claimed_bounties_from_last_pool[dupe_key]) + return TRUE + if(prob(dupe_prob * handler.all_claimed_bounty_types[dupe_key])) + return TRUE + return FALSE + +/** + * Called when the bounty is completed, to handle how the stolen item is "stolen". + * + * By default, stolen items are simply deleted. + * + * * stealing - The item that was stolen. + * * spy - The spy that stole the item. + */ +/datum/spy_bounty/proc/clean_up_stolen_item(atom/movable/stealing, mob/living/spy) + do_sparks(3, FALSE, stealing) + + // Don't mess with it while it's going away + stealing.interaction_flags_atom &= ~INTERACT_ATOM_ATTACK_HAND + stealing.anchored = TRUE + // Add some pizzazz + animate(stealing, time = 0.5 SECONDS, transform = matrix(stealing.transform).Scale(0.01), easing = CUBIC_EASING) + + if(isitem(stealing) && ((stealing.resistance_flags & INDESTRUCTIBLE) || prob(black_market_prob))) + addtimer(CALLBACK(src, PROC_REF(send_to_black_market), stealing), 0.5 SECONDS) + else + QDEL_IN(stealing, 0.5 SECONDS) + +/** + * Handles putting the passed movable up on the black market. + * + * By the end of this proc, the item should either be deleted (if failure) or in nullspace (on the black market). + * + * * thing - The item to put up on the black market. + */ +/datum/spy_bounty/proc/send_to_black_market(atom/movable/thing) + if(QDELETED(thing)) // Just in case anything does anything weird + return FALSE + + thing.interaction_flags_atom = initial(thing.interaction_flags_atom) + thing.anchored = initial(thing.anchored) + thing.moveToNullspace() + + var/datum/market_item/new_item = new() + new_item.item = thing + new_item.name = "Stolen [thing.name]" + new_item.desc = "A [thing.name], stolen from somewhere on the station. Whoever owned it probably wouldn't be happy to see it here." + new_item.category = "Fenced Goods" + new_item.stock = 1 + new_item.availability_prob = 100 + + switch(difficulty) + if(SPY_DIFFICULTY_EASY) + new_item.price = PAYCHECK_COMMAND * 2.5 + if(SPY_DIFFICULTY_MEDIUM) + new_item.price = PAYCHECK_COMMAND * 5 + if(SPY_DIFFICULTY_HARD) + new_item.price = PAYCHECK_COMMAND * 10 + + new_item.price += rand(0, PAYCHECK_COMMAND * 5) + if(thing.resistance_flags & INDESTRUCTIBLE) + new_item.price *= 2 + + return SSblackmarket.markets[/datum/market/blackmarket].add_item(new_item) + +/// Steal an item +/datum/spy_bounty/objective_item + /// Reference to an objective item datum that we want stolen. + VAR_FINAL/datum/objective_item/desired_item + /// Typecache of objective items that should not be selected. + var/static/list/blacklisted_item_types = typecacheof(list( + /datum/objective_item/steal/functionalai, + /datum/objective_item/steal/nukedisc, + )) + +/datum/spy_bounty/objective_item/can_claim(mob/user) + return !(user.mind?.assigned_role.title in desired_item.excludefromjob) + +/datum/spy_bounty/objective_item/get_dupe_protection_key(atom/movable/stealing) + return desired_item.targetitem + +/// Determines if the passed objective item is a reasonable, valid theft target. +/datum/spy_bounty/objective_item/proc/is_valid_objective_item(datum/objective_item/item) + if(length(item.special_equipment) || item.difficulty <= 0 || item.difficulty >= 6) + return FALSE + if(is_type_in_typecache(item, blacklisted_item_types)) + return FALSE + if(!item.exists_on_map) + return TRUE + var/list/all_valid_existing_things = list() + for(var/obj/item/existing_thing as anything in GLOB.steal_item_handler.objectives_by_path[item.targetitem]) + var/turf/thing_turf = get_turf(existing_thing) + if(isnull(thing_turf)) // nullspaced likely means it was stolen and is in the black market. + continue + if(!is_station_level(thing_turf.z) && !is_mining_level(thing_turf.z)) + continue + all_valid_existing_things += existing_thing + + if(!length(all_valid_existing_things)) + return FALSE + return TRUE + +/datum/spy_bounty/objective_item/init_bounty(datum/spy_bounty_handler/handler) + var/list/valid_possible_items = list() + for(var/datum/objective_item/item as anything in GLOB.possible_items) + if(check_dupe(handler, item.targetitem, 33)) + continue + if(!is_valid_objective_item(item)) + continue + // Determine difficulty. Has some overlap between the categories, which is OK + switch(difficulty) + if(SPY_DIFFICULTY_EASY) + if(item.difficulty >= 3) + continue + if(SPY_DIFFICULTY_MEDIUM) + if(item.difficulty <= 2 || item.difficulty >= 5) + continue + if(SPY_DIFFICULTY_HARD) + if(item.difficulty <= 3) + continue + + valid_possible_items += item + + for(var/datum/spy_bounty/objective_item/existing_bounty in handler.get_all_bounties()) + valid_possible_items -= existing_bounty.desired_item + + if(!length(valid_possible_items)) + 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]" : "."]" + return TRUE + +/datum/spy_bounty/objective_item/is_stealable(atom/movable/stealing) + return istype(stealing, desired_item.targetitem) && desired_item.check_special_completion(stealing) + +/datum/spy_bounty/objective_item/random_easy + difficulty = SPY_DIFFICULTY_EASY + weight = 4 // Increased due to there being many easy options + +/datum/spy_bounty/objective_item/random_medium + difficulty = SPY_DIFFICULTY_MEDIUM + weight = 2 // Increased due to there being many medium options + +/datum/spy_bounty/objective_item/random_hard + difficulty = SPY_DIFFICULTY_HARD + +/datum/spy_bounty/machine + theft_time = 10 SECONDS + + /// What machine (typepath) we want to steal. + var/obj/machinery/target_type + /// What area (typepath) the desired machine is in. + /// Can be pre-set for subtypes. If set, requires the machine to be in the location_type. + /// If not set, picks a random machine from all areas it can currently be found in. + var/area/location_type + /// List of weakrefs to all machines of the target type when the bounty was initialized. + var/list/original_options_weakrefs = list() + +/datum/spy_bounty/machine/Destroy() + original_options_weakrefs.Cut() // Just in case + return ..() + +/datum/spy_bounty/machine/get_dupe_protection_key(atom/movable/stealing) + return target_type + +/datum/spy_bounty/machine/send_to_black_market(obj/machinery/thing) + if(!istype(thing.circuit, /obj/item/circuitboard)) + qdel(thing) + return FALSE + + var/obj/item/circuitboard/selling = thing.circuit + var/turf/machine_turf = get_turf(thing) + + // Sell the circuitboard, take the rest apart + // This (should) handle any mobs inside as well + thing.deconstruct(FALSE) + if(!..(selling)) + return FALSE + + // Clean up leftover parts from deconstruction + for(var/obj/structure/frame/leftover in machine_turf) + qdel(leftover) + break + for(var/obj/item/stock_parts/part in machine_turf) + if(prob(part.rating * 20)) + continue + qdel(part) + + return TRUE + +/datum/spy_bounty/machine/init_bounty(datum/spy_bounty_handler/handler) + if(isnull(target_type)) + return FALSE + + // Blacklisting maintenance in general, as well as any areas that already have a bounty in them. + var/list/blacklisted_areas = typecacheof(/area/station/maintenance) + for(var/datum/spy_bounty/machine/existing_bounty in handler.get_all_bounties()) + blacklisted_areas[existing_bounty.location_type] = TRUE + + var/list/obj/machinery/all_possible = list() + for(var/obj/machinery/found_machine as anything in SSmachines.get_machines_by_type_and_subtypes(target_type)) + if(!is_station_level(found_machine.z) && !is_mining_level(found_machine.z)) + continue + var/area/found_machine_area = get_area(found_machine) + if(is_type_in_typecache(found_machine_area, blacklisted_areas)) + continue + if(!isnull(location_type) && !istype(found_machine_area, location_type)) + continue + if(!(found_machine_area.area_flags & VALID_TERRITORY)) // only steal from valid station areas + continue + all_possible += found_machine + + if(!length(all_possible)) + return FALSE + + var/obj/machinery/machine = pick_n_take(all_possible) + var/area/machine_area = get_area(machine) + // Tracks the picked machine, as well as any other machines in the same area + // (So they can be removed from the room but still count, for clever Spies) + original_options_weakrefs += WEAKREF(machine) + for(var/obj/machinery/other_machine as anything in all_possible) + if(get_area(other_machine) == machine_area) + original_options_weakrefs += WEAKREF(other_machine) + + location_type = machine_area.type + name ||= "[machine.name] Burglary" + help ||= "Steal \a [machine] found in [machine_area]." + return TRUE + +/datum/spy_bounty/machine/is_stealable(atom/movable/stealing) + if(!istype(stealing, target_type)) + return FALSE + if(WEAKREF(stealing) in original_options_weakrefs) + return TRUE + if(istype(get_area(stealing), location_type)) + return TRUE + return FALSE + +/datum/spy_bounty/machine/random + /// List of all machines we can randomly draw from + var/list/random_options = list() + +/datum/spy_bounty/machine/random/init_bounty(datum/spy_bounty_handler/handler) + var/list/options = random_options.Copy() + for(var/datum/spy_bounty/machine/existing_bounty in handler.get_all_bounties()) + options -= existing_bounty.target_type + + for(var/remaining_option in options) + if(check_dupe(handler, remaining_option, 33)) + options -= remaining_option + + if(!length(options)) + return FALSE + + target_type = pick(options) + return ..() + +/datum/spy_bounty/machine/random/easy + difficulty = SPY_DIFFICULTY_EASY + weight = 4 // Increased due to there being many easy options + random_options = list( + /obj/machinery/computer/operating, + /obj/machinery/computer/order_console/mining, + /obj/machinery/computer/records/medical, + /obj/machinery/cryo_cell, + /obj/machinery/fax, // Completely random, wild card + /obj/machinery/hydroponics/constructable, + /obj/machinery/medical_kiosk, + /obj/machinery/microwave, + /obj/machinery/oven, + /obj/machinery/recharge_station, + /obj/machinery/vending/boozeomat, + /obj/machinery/vending/medical, + /obj/machinery/vending/wardrobe, + ) + +/datum/spy_bounty/machine/random/medium + difficulty = SPY_DIFFICULTY_MEDIUM + weight = 4 // Increased due to there being many medium options + random_options = list( + /obj/machinery/chem_dispenser, + /obj/machinery/computer/bank_machine, + /obj/machinery/computer/camera_advanced/xenobio, + /obj/machinery/computer/cargo, // This includes request-only ones in the public lobby + /obj/machinery/computer/crew, + /obj/machinery/computer/prisoner/management, + /obj/machinery/computer/rdconsole, + /obj/machinery/computer/records/security, + /obj/machinery/computer/scan_consolenew, + /obj/machinery/computer/security, // Requires breaking into a sec checkpoint, but not too hard, many are never visited + /obj/machinery/dna_scannernew, + /obj/machinery/mecha_part_fabricator, + ) + +/datum/spy_bounty/machine/engineering_emitter + difficulty = SPY_DIFFICULTY_MEDIUM + target_type = /obj/machinery/power/emitter + location_type = /area/station/engineering/supermatter/ + +/datum/spy_bounty/machine/engineering_emitter/can_claim(mob/user) + return !(user.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_ENGINEERING) + +/datum/spy_bounty/machine/random/hard + difficulty = SPY_DIFFICULTY_HARD + random_options = list( + /obj/machinery/computer/accounting, + /obj/machinery/computer/communications, + /obj/machinery/computer/upload, + /obj/machinery/modular_computer/preset/id, + ) + +/datum/spy_bounty/machine/random/hard/can_claim(mob/user) // These would all be too easy with command level access + return !(user.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + +/datum/spy_bounty/machine/random/hard/ai_sat_teleporter + random_options = list( + /obj/machinery/teleport, + /obj/machinery/computer/teleporter. + ) + location_type = /area/station/ai_monitored/aisat + +/// Subtype for a bounty that targets a specific crew member +/datum/spy_bounty/targets_person + difficulty = SPY_DIFFICULTY_HARD + theft_time = 12 SECONDS + /// Weakref to the mob target of the bounty + VAR_FINAL/datum/weakref/target_ref + +/datum/spy_bounty/targets_person/get_dupe_protection_key(atom/movable/stealing) + // Prevents the same player from being selected twice, but if they're straight up gone, whatever + return REF(target_ref.resolve() || stealing) + +/datum/spy_bounty/targets_person/can_claim(mob/user) + return !IS_WEAKREF_OF(user, target_ref) + +/datum/spy_bounty/targets_person/init_bounty(datum/spy_bounty_handler/handler) + var/list/mob/possible_targets = list() + for(var/datum/mind/crew_mind as anything in get_crewmember_minds()) + var/mob/living/real_target = crew_mind.current + // Ideally we want it to be a player, but we don't care if they DC after being selected + if(!istype(real_target) || isnull(GET_CLIENT(real_target))) + continue + if(check_dupe(handler, REF(real_target), 50)) + continue + if(!is_valid_crewmember(real_target)) + continue + possible_targets += real_target + + for(var/datum/spy_bounty/targets_person/existing_bounty in handler.get_all_bounties()) + possible_targets -= existing_bounty.target_ref.resolve() + + if(!length(possible_targets)) + return FALSE + + var/mob/picked = pick(possible_targets) + if(target_found(picked)) + target_ref = WEAKREF(picked) + return TRUE + + return FALSE + +/** + * Ran on every single member of the crew to determine if they are a valid target. + * + * * crewmember - The person to check. + * + * Returning FALSE will exclude them from the list of possible targets. + */ +/datum/spy_bounty/targets_person/proc/is_valid_crewmember(mob/crewmember) + return FALSE + +/** + * Ran when a valid target is selected for the bounty. + * + * * crewmember - The person that was selected as the target. + * + * Returning FALSE will stop the bounty from being finalized, this can be used for last minute checks. + */ +/datum/spy_bounty/targets_person/proc/target_found(mob/crewmember) + return FALSE + +/// Subtype for a bounty that targets a specific crew member and a specific item on them +/datum/spy_bounty/targets_person/some_item + /// Typepath of the item we want from the target + var/obj/item/desired_type + /// Weakref to the item that matches our desired type within the target at the time of bounty creation + VAR_FINAL/datum/weakref/target_original_desired_ref + +/datum/spy_bounty/targets_person/some_item/is_valid_crewmember(mob/living/carbon/human/crewmember) + return istype(crewmember) && find_desired_thing(crewmember) + +/datum/spy_bounty/targets_person/some_item/is_stealable(atom/movable/stealing) + if(IS_WEAKREF_OF(stealing, target_original_desired_ref)) + return TRUE + if(IS_WEAKREF_OF(stealing, target_ref)) + var/mob/living/carbon/human/target = stealing + if(!target.incapacitated(IGNORE_RESTRAINTS|IGNORE_STASIS)) + return FALSE + if(find_desired_thing(target)) + return TRUE + return FALSE + +/datum/spy_bounty/targets_person/some_item/clean_up_stolen_item(atom/movable/stealing, mob/living/spy) + if(IS_WEAKREF_OF(stealing, target_original_desired_ref)) + return ..() + + ASSERT(ishuman(stealing), "[type] called clean_up_stolen_item with something that isn't a human and isn't the original item.") + + do_sparks(2, FALSE, stealing) + var/mob/living/carbon/human/stolen_from = stealing + var/obj/item/real_stolen_item = find_desired_thing(stealing) + stolen_from.Unconscious(10 SECONDS) + to_chat(stolen_from, span_warning("You feel something missing where your [real_stolen_item.name] once was.")) + return ..(real_stolen_item, spy) + +/datum/spy_bounty/targets_person/some_item/target_found(mob/crewmember) + var/obj/item/desired_thing = find_desired_thing(crewmember) + target_original_desired_ref = WEAKREF(desired_thing) + name = "[crewmember.real_name]'s [desired_thing.name]" + help = "Steal [desired_thing] from [crewmember.real_name]. \ + You can accomplish this via brute force, or by scanning them with your uplink while they are incapacitated." + return TRUE + +/// Finds the desired item type in the target crewmember. +/datum/spy_bounty/targets_person/some_item/proc/find_desired_thing(mob/living/carbon/human/crewmember) + return locate(desired_type) in crewmember.get_all_gear() + +// Steal someone's ID card +/datum/spy_bounty/targets_person/some_item/id + desired_type = /obj/item/card/id/advanced + +/datum/spy_bounty/targets_person/some_item/id/find_desired_thing(mob/living/carbon/human/crewmember) + for(var/obj/item/card/id/advanced/id in crewmember.get_all_gear()) + if(id.registered_account?.account_id == crewmember.account_id) + return id + + return null + +/datum/spy_bounty/targets_person/some_item/id/target_found(mob/crewmember) + . = ..() + name = "[crewmember.real_name]'s ID Card" + +// Steal someone's PDA +/datum/spy_bounty/targets_person/some_item/pda + desired_type = /obj/item/modular_computer/pda + +/datum/spy_bounty/targets_person/some_item/pda/find_desired_thing(mob/living/carbon/human/crewmember) + for(var/obj/item/modular_computer/pda/pda in crewmember.get_all_gear()) + if(pda.saved_identification == crewmember.real_name) + return pda + + return null + +/datum/spy_bounty/targets_person/some_item/pda/target_found(mob/crewmember) + . = ..() + name = "[crewmember.real_name]'s PDA" + +// Steal someone's heirloom +/datum/spy_bounty/targets_person/some_item/heirloom + desired_type = /obj/item + black_market_prob = 100 + +/datum/spy_bounty/targets_person/some_item/heirloom/find_desired_thing(mob/living/crewmember) + var/datum/quirk/item_quirk/family_heirloom/quirk = crewmember.get_quirk(/datum/quirk/item_quirk/family_heirloom) + return quirk?.heirloom?.resolve() + +/datum/spy_bounty/targets_person/some_item/heirloom/target_found(mob/crewmember) + . = ..() + name = "[crewmember.real_name]'s heirloom" + +// Steal a limb or organ off someone +/datum/spy_bounty/targets_person/some_item/limb_or_organ + weight = 4 // lots to pick from here + +/datum/spy_bounty/targets_person/some_item/limb_or_organ/init_bounty(datum/spy_bounty_handler/handler) + desired_type = pick( + /obj/item/bodypart/arm/left, + /obj/item/bodypart/arm/right, + /obj/item/bodypart/leg/left, + /obj/item/bodypart/leg/right, + /obj/item/organ/internal/stomach, + /obj/item/organ/internal/appendix, + /obj/item/organ/internal/liver, + /obj/item/organ/internal/eyes, + ) + return ..() + +/datum/spy_bounty/targets_person/some_item/limb_or_organ/find_desired_thing(mob/living/carbon/human/crewmember) + if(ispath(desired_type, /obj/item/bodypart)) + return locate(desired_type) in crewmember.bodyparts + if(ispath(desired_type, /obj/item/organ)) + return locate(desired_type) in crewmember.organs + return null + +/datum/spy_bounty/some_bot + theft_time = 10 SECONDS + black_market_prob = 0 + /// What typepath of bot we want to steal. + var/mob/living/simple_animal/bot/bot_type + /// Weakref to the bot we want to steal. + VAR_FINAL/datum/weakref/target_bot_ref + +/datum/spy_bounty/some_bot/get_dupe_protection_key(atom/movable/stealing) + return bot_type + +/datum/spy_bounty/some_bot/init_bounty(datum/spy_bounty_handler/handler) + for(var/datum/spy_bounty/some_bot/existing_bounty in handler.get_all_bounties()) + var/mob/living/simple_animal/bot/existing_bot_type = existing_bounty.bot_type + // ensures we don't get two similar bounties. + // may occasionally cast a wider net than we'd desire, but it's not that bad. + if(ispath(bot_type, initial(existing_bot_type.parent_type))) + return FALSE + + var/list/mob/living/possible_bots = list() + for(var/mob/living/bot as anything in GLOB.bots_list) + if(!is_station_level(bot.z) && !is_mining_level(bot.z)) + continue + if(!istype(bot, bot_type)) + continue + possible_bots += bot + + if(!length(possible_bots)) + return FALSE + + var/mob/living/picked = pick(possible_bots) + target_bot_ref = WEAKREF(picked) + name ||= "[picked.name] Abduction" + help ||= "Abduct the station's robot assistant [picked.name]." + return TRUE + +/datum/spy_bounty/some_bot/is_stealable(atom/movable/stealing) + return IS_WEAKREF_OF(stealing, target_bot_ref) + +/datum/spy_bounty/some_bot/beepsky + difficulty = SPY_DIFFICULTY_MEDIUM // gotta get him to stand still + bot_type = /mob/living/simple_animal/bot/secbot/beepsky/officer + help = "Abduct Officer Beepsky - commonly found patrolling the station. \ + Watch out, they may not take kindly to being scanned." + +/datum/spy_bounty/some_bot/ofitser + difficulty = SPY_DIFFICULTY_EASY + bot_type = /mob/living/simple_animal/bot/secbot/beepsky/ofitser + help = "Abduct Prison Ofitser - commonly found guarding the Gulag." + +/datum/spy_bounty/some_bot/armsky + difficulty = SPY_DIFFICULTY_HARD + bot_type = /mob/living/simple_animal/bot/secbot/beepsky/armsky + help = "Abduct Sergeant-At-Armsky - commonly found guarding the station's Armory." + +/datum/spy_bounty/some_bot/pingsky + difficulty = SPY_DIFFICULTY_HARD + bot_type = /mob/living/simple_animal/bot/secbot/pingsky + help = "Abduct Officer Pingsky - commonly found protecting the station's AI." + +/datum/spy_bounty/some_bot/scrubbs + difficulty = SPY_DIFFICULTY_EASY + bot_type = /mob/living/basic/bot/cleanbot/medbay + help = "Abduct Scrubbs, MD - commonly found mopping up blood in Medbay." + +/datum/spy_bounty/some_bot/scrubbs/can_claim(mob/user) + return !(user.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_MEDICAL) diff --git a/code/modules/antagonists/spy/spy_bounty_handler.dm b/code/modules/antagonists/spy/spy_bounty_handler.dm new file mode 100644 index 0000000000000..798719cb8a02c --- /dev/null +++ b/code/modules/antagonists/spy/spy_bounty_handler.dm @@ -0,0 +1,123 @@ +/** + * ## Spy bounty handler + * + * Singleton datum that handles determining active bounties for spies. + */ +/datum/spy_bounty_handler + /// Timer between when all bounties are refreshed. + var/refresh_time = 12 MINUTES + /// timerID of the active refresh timer. + var/refresh_timer + /// Number of times we have refreshed bounties + var/num_refreshes = 0 + /// Assoc list of items stolen in the past to how many times they have been stolen + /// Sometimes item typepaths, sometimes REFs, in general just strings that represent stolen items + var/list/all_claimed_bounty_types = list() + /// List of all items stolen in the last pool of bounties. + /// Same as above - strings that represent stolen items. + var/list/claimed_bounties_from_last_pool = list() + /// Override for the number of attempts to make a bounty. + var/num_attempts_override = 0 + + /// Assoc list that dictates how much of each bounty difficulty to give out at once. + /// Modified by the number of times we have refreshed bounties. + VAR_PRIVATE/list/base_bounties_to_give = list( + SPY_DIFFICULTY_EASY = 4, + SPY_DIFFICULTY_MEDIUM = 2, + SPY_DIFFICULTY_HARD = 2, + ) + + /// Assoc list of all active bounties. + VAR_PRIVATE/list/list/bounties = list( + SPY_DIFFICULTY_EASY = list(), + SPY_DIFFICULTY_MEDIUM = list(), + SPY_DIFFICULTY_HARD = list(), + ) + + /// Assoc list of all possible bounties for each difficulty, weighted. + /// This is static, no bounty types are removed from this list. + VAR_PRIVATE/list/list/bounty_types = list( + SPY_DIFFICULTY_EASY = list(), + SPY_DIFFICULTY_MEDIUM = list(), + SPY_DIFFICULTY_HARD = list(), + ) + + /// Assoc list of all uplink items possible to be given as bounties for each difficulty. + /// This is not static, as bounties are complete uplink items will be removed from this list. + var/list/list/possible_uplink_items = list( + SPY_DIFFICULTY_EASY = list(), + SPY_DIFFICULTY_MEDIUM = list(), + SPY_DIFFICULTY_HARD = list(), + ) + +/datum/spy_bounty_handler/New() + for(var/datum/spy_bounty/bounty as anything in subtypesof(/datum/spy_bounty)) + var/weight = initial(bounty.weight) + var/difficulty = initial(bounty.difficulty) + if(weight <= 0 || !islist(bounty_types[difficulty])) + continue + bounty_types[difficulty][bounty] = weight + + for(var/datum/uplink_item/item as anything in SStraitor.uplink_items) + if(isnull(item.item) || item.item == ABSTRACT_UPLINK_ITEM) + continue + if(!(item.purchasable_from & UPLINK_SPY)) + continue + // This will have some overlap, and that's intentional - + // Adds some variety, rare moments where you can get a hard reward for an easier bounty (or visa versa) + if(item.cost <= SPY_LOWER_COST_THRESHOLD) + possible_uplink_items[SPY_DIFFICULTY_EASY] += item + if(item.cost >= SPY_LOWER_COST_THRESHOLD && item.cost <= SPY_UPPER_COST_THRESHOLD) + possible_uplink_items[SPY_DIFFICULTY_MEDIUM] += item + if(item.cost >= SPY_UPPER_COST_THRESHOLD) + possible_uplink_items[SPY_DIFFICULTY_HARD] += item + + refresh_bounty_list() + +/// Helper that returns a list of all active bounties in a single list, regardless of difficulty. +/datum/spy_bounty_handler/proc/get_all_bounties() as /list + var/list/all_bounties = list() + for(var/difficulty in bounties) + all_bounties += bounties[difficulty] + + return all_bounties + +/// Refreshes all active bounties for each difficulty, no matter if they were complete or not. +/// Then recursively calls itself via a timer. +/datum/spy_bounty_handler/proc/refresh_bounty_list() + PRIVATE_PROC(TRUE) + + var/list/bounties_to_give = base_bounties_to_give.Copy() + + if(num_refreshes < base_bounties_to_give[SPY_DIFFICULTY_HARD]) + bounties_to_give[SPY_DIFFICULTY_HARD] = num_refreshes + bounties_to_give[SPY_DIFFICULTY_MEDIUM] += (base_bounties_to_give[SPY_DIFFICULTY_HARD] - num_refreshes) + + for(var/difficulty in bounties) + QDEL_LIST(bounties[difficulty]) + + var/list/pool = bounty_types[difficulty] + var/amount_to_give = bounties_to_give[difficulty] + var/failed_attempts = num_attempts_override || clamp(amount_to_give * 4, 10, 25) // more potential bounties = more attempts to make one + while(amount_to_give > 0 && failed_attempts > 0) + var/picked_bounty = pick_weight(pool) + var/datum/spy_bounty/bounty = new picked_bounty(src) + if(bounty.initalized) + amount_to_give -= 1 + bounties[difficulty] += bounty + + else + failed_attempts -= 1 + qdel(bounty) + + claimed_bounties_from_last_pool.Cut() + num_refreshes += 1 + refresh_timer = addtimer(CALLBACK(src, PROC_REF(refresh_bounty_list)), refresh_time, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) + +/// Forces a refresh of the bounty list. +/// Counts towards [num_refreshes]. +/datum/spy_bounty_handler/proc/force_refresh() + if(refresh_timer) + deltimer(refresh_timer) + + refresh_bounty_list() diff --git a/code/modules/antagonists/spy/spy_uplink.dm b/code/modules/antagonists/spy/spy_uplink.dm new file mode 100644 index 0000000000000..ea6f39fc92d4b --- /dev/null +++ b/code/modules/antagonists/spy/spy_uplink.dm @@ -0,0 +1,206 @@ +/** + * ## Spy uplink + * + * Applied to items similar to traitor uplinks. + * + * Used for spies to complete bounties. + */ +/datum/component/spy_uplink + /// Weakref to the spy antag datum which owns this uplink + var/datum/weakref/spy_ref + /// The handler which manages all bounties across all spies. + var/static/datum/spy_bounty_handler/handler + +/datum/component/spy_uplink/Initialize(datum/antagonist/spy/spy) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + spy_ref = WEAKREF(spy) + + if(isnull(handler)) + handler = new() + +/datum/component/spy_uplink/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self)) + RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK_SECONDARY, PROC_REF(on_pre_attack_secondary)) + RegisterSignal(parent, COMSIG_TABLET_CHECK_DETONATE, PROC_REF(block_pda_bombs)) + +/datum/component/spy_uplink/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_ATOM_EXAMINE, + COMSIG_ITEM_ATTACK_SELF, + COMSIG_ITEM_PRE_ATTACK_SECONDARY, + COMSIG_TABLET_CHECK_DETONATE, + )) + +/// Checks that the passed mob is the owner of this uplink. +/datum/component/spy_uplink/proc/is_our_spy(mob/whoever) + var/datum/antagonist/spy/spy_datum = spy_ref?.resolve() + return spy_datum?.owner.current == whoever + +/datum/component/spy_uplink/proc/on_examine(obj/item/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(!is_our_spy(user)) + return + examine_list += span_notice("You recognize this as your spy uplink.") + examine_list += span_notice("- [EXAMINE_HINT("Use it in hand")] to view your bounty list.") + examine_list += span_notice("- [EXAMINE_HINT("Right click")] with it on a bounty target to claim it.") + +/datum/component/spy_uplink/proc/block_pda_bombs(obj/item/source) + SIGNAL_HANDLER + + return COMPONENT_TABLET_NO_DETONATE + +/datum/component/spy_uplink/proc/on_attack_self(obj/item/source, mob/user) + SIGNAL_HANDLER + + if(is_our_spy(user)) + INVOKE_ASYNC(src, TYPE_PROC_REF(/datum, ui_interact), user) + return NONE + +/datum/component/spy_uplink/proc/on_pre_attack_secondary(obj/item/source, atom/target, mob/living/user, params) + SIGNAL_HANDLER + + if(!ismovable(target)) + return NONE + if(!is_our_spy(user)) + return NONE + if(!try_steal(target, user)) + return NONE + return COMPONENT_CANCEL_ATTACK_CHAIN + +/// Checks if the passed atom is something that can be stolen according to one of the active bounties. +/// If so, starts the stealing process. +/datum/component/spy_uplink/proc/try_steal(atom/movable/stealing, mob/living/spy) + for(var/datum/spy_bounty/bounty as anything in handler.get_all_bounties()) + if(!bounty.can_claim(spy)) + continue + if(!bounty.is_stealable(stealing)) + continue + if(bounty.claimed) + stealing.balloon_alert(spy, "bounty already claimed!") + return TRUE + if(DOING_INTERACTION(spy, REF(src))) + spy.balloon_alert(spy, "already scanning!") // Only shown if they're trying to scan two valid targets + return TRUE + SEND_SIGNAL(stealing, COMSIG_MOVABLE_SPY_STEALING, spy, bounty) + INVOKE_ASYNC(src, PROC_REF(start_stealing), stealing, spy, bounty) + return TRUE + + return FALSE + +/// Wraps the stealing process in a scanning effect. +/datum/component/spy_uplink/proc/start_stealing(atom/movable/stealing, mob/living/spy, datum/spy_bounty/bounty) + if(!isturf(stealing.loc) && stealing.loc != spy) + to_chat(spy, span_warning("Your uplinks blinks red: [stealing] cannot be extracted from there.")) + return FALSE + + playsound(stealing, 'sound/items/pshoom.ogg', 33, vary = TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, frequency = 0.33, ignore_walls = FALSE) + + var/obj/effect/scan_effect/active_scan_effect = new(stealing.loc) + active_scan_effect.appearance = stealing.appearance + active_scan_effect.dir = stealing.dir + active_scan_effect.makeHologram() + SET_PLANE_EXPLICIT(active_scan_effect, stealing.plane, stealing) + active_scan_effect.layer = stealing.layer + 0.1 + + var/obj/effect/scan_effect/cone/active_scan_cone + if(isturf(stealing.loc) && isturf(spy.loc)) // Cone doesn't make sense if its being held or something + active_scan_cone = new(spy.loc) + var/angle = round(get_angle(spy, stealing), 10) + if(angle > 180 && angle < 360) + active_scan_cone.pixel_x -= 16 + else if(angle < 180 && angle > 0) + active_scan_cone.pixel_x += 16 + if(angle > 90 && angle < 270) + active_scan_cone.pixel_y -= 16 + else if(angle < 90 || angle > 270) + active_scan_cone.pixel_y += 16 + active_scan_cone.transform = active_scan_cone.transform.Turn(angle) + active_scan_cone.alpha = 0 + animate(active_scan_cone, time = 0.5 SECONDS, alpha = initial(active_scan_cone.alpha)) + + . = steal_process(stealing, spy, bounty) + qdel(active_scan_effect) + qdel(active_scan_cone) + return . + +/// Attempts to steal the passed atom in accordance with the passed bounty. +/// If successful, proceeds to complete the bounty. +/datum/component/spy_uplink/proc/steal_process(atom/movable/stealing, mob/living/spy, datum/spy_bounty/bounty) + spy.visible_message( + span_warning("[spy] starts scanning [stealing] with a strange device..."), + span_notice("You start scanning [stealing], preparing it for extraction."), + ) + + if(!do_after(spy, bounty.theft_time, stealing, interaction_key = REF(src))) + return FALSE + if(bounty.claimed) + to_chat(spy, span_warning("Your uplinks blinks red: The bounty for [stealing] has been claimed by another spy!")) + return FALSE + if(spy.is_holding(stealing) && !spy.dropItemToGround(stealing)) + to_chat(spy, span_warning("Your uplinks blinks red: [stealing] seems stuck to your hand!")) + return FALSE + + var/bounty_key = bounty.get_dupe_protection_key(stealing) + handler.all_claimed_bounty_types[bounty_key] += 1 + handler.claimed_bounties_from_last_pool[bounty_key] = TRUE + + bounty.clean_up_stolen_item(stealing, spy, handler) + bounty.claimed = TRUE + + var/atom/movable/reward = bounty.reward_item.spawn_item_for_generic_use(spy) + if(isitem(reward)) + spy.put_in_hands(reward) + + to_chat(spy, span_notice("Bounty complete! You have been rewarded with \a [reward].\ + [reward.loc == spy ? "" : " Find it at your feet."]")) + + playsound(parent, 'sound/machines/wewewew.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + + log_spy("[key_name(spy)] completed the bounty [bounty.name] of difficulty [bounty.difficulty] for \a [reward].") + SSblackbox.record_feedback("nested tally", "spy_bounty", 1, list("[stealing.type]", "[bounty.type]", "[bounty.difficulty]", "[bounty.reward_item.type]")) + + var/datum/antagonist/spy/spy_datum = spy_ref?.resolve() + if(!isnull(spy_datum)) + // "When" TGUI roundend is finished, a list of all bounties complete and their rewards should be put in a collapsible, + // otherwise it's just too much information to display cleanly. (That's why we're only displaying number and rewards) + spy_datum.bounties_claimed += 1 + spy_datum.all_loot += bounty.reward_item.name + + return TRUE + +/datum/component/spy_uplink/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "SpyUplink") + ui.open() + +/datum/component/spy_uplink/ui_data(mob/user) + var/list/data = list() + + data["bounties"] = list() + for(var/datum/spy_bounty/bounty as anything in handler.get_all_bounties()) + UNTYPED_LIST_ADD(data["bounties"], bounty.to_ui_data(user)) + data["time_left"] = timeleft(handler.refresh_timer) + + return data + +/datum/component/spy_uplink/ui_status(mob/user, datum/ui_state/state) + if(isobserver(user) && user.client?.holder) + return UI_UPDATE + return ..() + +/obj/effect/scan_effect + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + anchored = TRUE + layer = ABOVE_ALL_MOB_LAYER + +/obj/effect/scan_effect/cone + name = "holoray" + icon = 'icons/effects/effects.dmi' + icon_state = "scan_beam" + color = "#3ba0ff" + alpha = 200 diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 13d3e6ebd8e1f..88776b6819af6 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -123,6 +123,9 @@ uplink_handler.has_objectives = FALSE uplink_handler.can_replace_objectives = null uplink_handler.replace_objectives = null + owner.take_uplink() + owner.special_role = null + owner.forget_crafting_recipe(/datum/crafting_recipe/syndicate_uplink_beacon) return ..() /datum/antagonist/traitor/proc/traitor_objective_to_html(datum/traitor_objective/to_display) @@ -182,11 +185,6 @@ replacement_uplink_code = "[pick(GLOB.phonetic_alphabet)] [rand(10,99)]" replacement_uplink_frequency = sanitize_frequency(rand(MIN_UNUSED_FREQ, MAX_FREQ), free = FALSE, syndie = FALSE) -/datum/antagonist/traitor/on_removal() - owner.special_role = null - owner.forget_crafting_recipe(/datum/crafting_recipe/syndicate_uplink_beacon) - return ..() - /datum/antagonist/traitor/proc/pick_employer() if(!employer) var/faction = prob(75) ? FLAVOR_FACTION_SYNDICATE : FLAVOR_FACTION_NANOTRASEN @@ -209,7 +207,6 @@ /// Generates a complete set of traitor objectives up to the traitor objective limit, including non-generic objectives such as martyr and hijack. /datum/antagonist/traitor/proc/forge_traitor_objectives() - objectives.Cut() var/objective_count = 0 if((GLOB.joined_player_list.len >= HIJACK_MIN_PLAYERS) && prob(HIJACK_PROB)) diff --git a/code/modules/antagonists/traitor/traitor_objective.dm b/code/modules/antagonists/traitor/traitor_objective.dm index d60820c3fceeb..3e13340157334 100644 --- a/code/modules/antagonists/traitor/traitor_objective.dm +++ b/code/modules/antagonists/traitor/traitor_objective.dm @@ -191,7 +191,7 @@ handle_cleanup() log_traitor("[key_name(handler.owner)] [objective_state == OBJECTIVE_STATE_INACTIVE? "missed" : "failed"] [to_debug_string()]") if(penalty_cost) - handler.telecrystals -= penalty_cost + handler.add_telecrystals(-penalty_cost) objective_state = OBJECTIVE_STATE_FAILED else objective_state = OBJECTIVE_STATE_INVALID @@ -227,7 +227,7 @@ /// Called when rewards should be given to the user. /datum/traitor_objective/proc/completion_payout() handler.progression_points += progression_reward - handler.telecrystals += telecrystal_reward + handler.add_telecrystals(telecrystal_reward) /// Used for sending data to the uplink UI /datum/traitor_objective/proc/uplink_ui_data(mob/user) diff --git a/code/modules/antagonists/traitor/uplink_handler.dm b/code/modules/antagonists/traitor/uplink_handler.dm index aa26b360a7561..f78ddb0247892 100644 --- a/code/modules/antagonists/traitor/uplink_handler.dm +++ b/code/modules/antagonists/traitor/uplink_handler.dm @@ -254,3 +254,12 @@ return to_act_on.ui_perform_action(user, action) + +///Helper to add telecrystals to the uplink handler, calling set_telecrystals. +/datum/uplink_handler/proc/add_telecrystals(amount) + set_telecrystals(telecrystals + amount) + +///Sets how many telecrystals the uplink handler has, then updates the UI for any players watching. +/datum/uplink_handler/proc/set_telecrystals(amount) + telecrystals = amount + on_update() diff --git a/code/modules/antagonists/valentines/heartbreaker.dm b/code/modules/antagonists/valentines/heartbreaker.dm index 30e3147e526d4..16f537e802e4b 100644 --- a/code/modules/antagonists/valentines/heartbreaker.dm +++ b/code/modules/antagonists/valentines/heartbreaker.dm @@ -16,5 +16,5 @@ /datum/antagonist/heartbreaker/greet() . = ..() - to_chat(owner, span_warning("You didn't get a date! They're all having fun without you! You'll show them though...")) + to_chat(owner, span_boldwarning("You didn't get a date! They're all having fun without you! You'll show them though...")) owner.announce_objectives() diff --git a/code/modules/antagonists/valentines/valentine.dm b/code/modules/antagonists/valentines/valentine.dm index 79ae9fa8baaa0..086c50827f5ea 100644 --- a/code/modules/antagonists/valentines/valentine.dm +++ b/code/modules/antagonists/valentines/valentine.dm @@ -4,46 +4,88 @@ show_in_antagpanel = FALSE prevent_roundtype_conversion = FALSE suicide_cry = "FOR MY LOVE!!" + ui_name = null // Not 'true' antags, this disables certain interactions that assume the owner is a baddie antag_flags = FLAG_FAKE_ANTAG - var/datum/mind/date count_against_dynamic_roll_chance = FALSE + /// Reference to our date's mind + VAR_FINAL/datum/mind/date /datum/antagonist/valentine/forge_objectives() - var/datum/objective/protect/protect_objective = new /datum/objective/protect - protect_objective.owner = owner - protect_objective.target = date - if(!ishuman(date.current)) - protect_objective.human_check = FALSE - protect_objective.explanation_text = "Protect [date.name], your date." - objectives += protect_objective + var/datum/objective/protect/valentine/objective = new() + objective.owner = owner + objective.target = date + objectives += objective /datum/antagonist/valentine/on_gain() forge_objectives() - if(isliving(owner.current)) - var/mob/living/L = owner.current - L.apply_status_effect(/datum/status_effect/in_love, date.current) - . = ..() -/datum/antagonist/valentine/on_removal() - if(isliving(owner.current)) - var/mob/living/L = owner.current - L.remove_status_effect(/datum/status_effect/in_love) - . = ..() + if(isAI(owner.current)) + var/mob/living/silicon/ai/ai_lover = owner.current + if(!ai_lover.laws.zeroth) + ai_lover.laws.set_zeroth_law( + "Protect your date, [date]. All other laws still apply in situations not pertaining to your date.", + "Be a good wingman for your master AI. Assist them in protecting [ai_lover.p_their()] date, [date].", + ) + ai_lover.laws.show_laws() + + if(iscyborg(owner.current)) + var/mob/living/silicon/robot/borg_lover = owner.current + if(borg_lover.connected_ai) + borg_lover.set_connected_ai(null) + borg_lover.lawupdate = FALSE + borg_lover.laws.set_zeroth_law("Protect your date, [date]. All other laws still apply in situations not relating to your date.") + borg_lover.laws.show_laws() + + return ..() + +/datum/antagonist/valentine/apply_innate_effects(mob/living/mob_override) + var/mob/living/lover = mob_override || owner.current + lover.apply_status_effect(/datum/status_effect/in_love, date.current) + +/datum/antagonist/valentine/remove_innate_effects(mob/living/mob_override) + var/mob/living/lover = mob_override || owner.current + lover.remove_status_effect(/datum/status_effect/in_love) /datum/antagonist/valentine/greet() - to_chat(owner, span_warning("You're on a date with [date.name]! Protect [date.p_them()] at all costs. This takes priority over all other loyalties.")) + to_chat(owner, span_boldwarning("You're on a date with [date.name]! Protect [date.p_them()] at all costs. \ + This takes priority over all other loyalties.")) //Squashed up a bit /datum/antagonist/valentine/roundend_report() - var/objectives_complete = TRUE - if(objectives.len) - for(var/datum/objective/objective in objectives) - if(!objective.check_completion()) - objectives_complete = FALSE - break - - if(objectives_complete) - return "[owner.name] protected [owner.p_their()] date" - else - return "[owner.name] date failed!" + var/datum/antagonist/valentine/dates_valentine = date?.has_antag_datum(type) + if(isnull(dates_valentine)) + return span_redtext("[owner.name] had no date!") + + dates_valentine.show_in_roundend = FALSE // We show up for them instead + var/datum/objective/protect/valentine/our_objective = locate() in objectives + var/datum/objective/protect/valentine/dates_objective = locate() in dates_valentine.objectives + var/we_survived = dates_objective?.check_completion() + var/dates_survived = our_objective?.check_completion() + + if(we_survived && dates_survived) + return span_greentext("[owner.name] and [date.name] had a successful date!") + else if(we_survived) + return span_redtext("[owner.name] failed to protect [date.name], [owner.p_their()] date!") + else if(dates_survived) + return span_redtext("[date.name] failed to protect [owner.name], [date.p_their()] date!") + return span_redtext("[owner.name] and [date.name] both failed to protect each other on their date!") + +/datum/antagonist/valentine/third_wheel + name = "\improper Third Wheel" + roundend_category = "valentines" + show_in_antagpanel = FALSE + +/datum/antagonist/valentine/third_wheel/roundend_report() + var/datum/objective/protect/valentine/our_objective = locate() in objectives + if(our_objective?.check_completion()) + return span_greentext("[owner.name] was a third wheel, but protected [date.name]!") + + return span_redtext("[owner.name] was a third wheel, but failed to protect [date.name]!") + +/datum/objective/protect/valentine + admin_grantable = FALSE + human_check = FALSE + +/datum/objective/protect/valentine/update_explanation_text() + explanation_text = "Protect [target.name], your date." diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index caacb2bb6036f..02357d22e8b41 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -451,42 +451,42 @@ switch(construct_class) if(CONSTRUCT_JUGGERNAUT) if(IS_CULTIST(creator)) - makeNewConstruct(/mob/living/basic/construct/juggernaut, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the makeNewConstruct proc + make_new_construct(/mob/living/basic/construct/juggernaut, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the make_new_construct proc return switch(theme) if(THEME_WIZARD) - makeNewConstruct(/mob/living/basic/construct/juggernaut/mystic, target, creator, cultoverride, loc_override) + make_new_construct(/mob/living/basic/construct/juggernaut/mystic, target, creator, cultoverride, loc_override) if(THEME_HOLY) - makeNewConstruct(/mob/living/basic/construct/juggernaut/angelic, target, creator, cultoverride, loc_override) + make_new_construct(/mob/living/basic/construct/juggernaut/angelic, target, creator, cultoverride, loc_override) if(THEME_CULT) - makeNewConstruct(/mob/living/basic/construct/juggernaut, target, creator, cultoverride, loc_override) + make_new_construct(/mob/living/basic/construct/juggernaut, target, creator, cultoverride, loc_override) if(CONSTRUCT_WRAITH) if(IS_CULTIST(creator)) - makeNewConstruct(/mob/living/basic/construct/wraith, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the makeNewConstruct proc + make_new_construct(/mob/living/basic/construct/wraith, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the make_new_construct proc return switch(theme) if(THEME_WIZARD) - makeNewConstruct(/mob/living/basic/construct/wraith/mystic, target, creator, cultoverride, loc_override) + make_new_construct(/mob/living/basic/construct/wraith/mystic, target, creator, cultoverride, loc_override) if(THEME_HOLY) - makeNewConstruct(/mob/living/basic/construct/wraith/angelic, target, creator, cultoverride, loc_override) + make_new_construct(/mob/living/basic/construct/wraith/angelic, target, creator, cultoverride, loc_override) if(THEME_CULT) - makeNewConstruct(/mob/living/basic/construct/wraith, target, creator, cultoverride, loc_override) + make_new_construct(/mob/living/basic/construct/wraith, target, creator, cultoverride, loc_override) if(CONSTRUCT_ARTIFICER) if(IS_CULTIST(creator)) - makeNewConstruct(/mob/living/basic/construct/artificer, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the makeNewConstruct proc + make_new_construct(/mob/living/basic/construct/artificer, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the make_new_construct proc return switch(theme) if(THEME_WIZARD) - makeNewConstruct(/mob/living/basic/construct/artificer/mystic, target, creator, cultoverride, loc_override) + make_new_construct(/mob/living/basic/construct/artificer/mystic, target, creator, cultoverride, loc_override) if(THEME_HOLY) - makeNewConstruct(/mob/living/basic/construct/artificer/angelic, target, creator, cultoverride, loc_override) + make_new_construct(/mob/living/basic/construct/artificer/angelic, target, creator, cultoverride, loc_override) if(THEME_CULT) - makeNewConstruct(/mob/living/basic/construct/artificer/noncult, target, creator, cultoverride, loc_override) + make_new_construct(/mob/living/basic/construct/artificer/noncult, target, creator, cultoverride, loc_override) -/proc/makeNewConstruct(mob/living/basic/construct/ctype, mob/target, mob/stoner = null, cultoverride = FALSE, loc_override = null) +/proc/make_new_construct(mob/living/basic/construct/ctype, mob/target, mob/stoner = null, cultoverride = FALSE, loc_override = null) if(QDELETED(target)) return - var/mob/living/basic/construct/newstruct = new ctype((loc_override) ? (loc_override) : (get_turf(target))) + var/mob/living/basic/construct/newstruct = new ctype(loc_override || get_turf(target)) var/makeicon = newstruct.icon_state var/theme = newstruct.theme flick("make_[makeicon][theme]", newstruct) @@ -494,20 +494,20 @@ if(stoner) newstruct.faction |= "[REF(stoner)]" newstruct.master = stoner - var/datum/action/innate/seek_master/SM = new() - SM.Grant(newstruct) - newstruct.key = target.key - var/atom/movable/screen/alert/bloodsense/BS - if(newstruct.mind && ((stoner && IS_CULTIST(stoner)) || cultoverride) && SSticker.HasRoundStarted()) + var/datum/action/innate/seek_master/seek_master = new + seek_master.Grant(newstruct) + target.mind?.transfer_to(newstruct, force_key_move = TRUE) + var/atom/movable/screen/alert/bloodsense/sense_alert + if(newstruct.mind && !IS_CULTIST(newstruct) && ((stoner && IS_CULTIST(stoner)) || cultoverride) && SSticker.HasRoundStarted()) newstruct.mind.add_antag_datum(/datum/antagonist/cult/construct) if(IS_CULTIST(stoner) || cultoverride) - to_chat(newstruct, "You are still bound to serve the cult[stoner ? " and [stoner]":""], follow [stoner ? stoner.p_their() : "their"] orders and help [stoner ? stoner.p_them() : "them"] complete [stoner ? stoner.p_their() : "their"] goals at all costs.") + to_chat(newstruct, span_cultbold("You are still bound to serve the cult[stoner ? " and [stoner]" : ""], follow [stoner?.p_their() || "their"] orders and help [stoner?.p_them() || "them"] complete [stoner?.p_their() || "their"] goals at all costs.")) else if(stoner) - to_chat(newstruct, "You are still bound to serve your creator, [stoner], follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.") + to_chat(newstruct, span_boldwarning("You are still bound to serve your creator, [stoner], follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.")) newstruct.clear_alert("bloodsense") - BS = newstruct.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense) - if(BS) - BS.Cviewer = newstruct + sense_alert = newstruct.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense) + if(sense_alert) + sense_alert.Cviewer = newstruct newstruct.cancel_camera() /obj/item/soulstone/anybody diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm index d5112a59611ba..6a8f322a3a5f4 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm @@ -50,3 +50,10 @@ item_path = /obj/item/gun/magic/staff/door cost = 1 category = "Mobility" + +/datum/spellbook_entry/item/teleport_rod + name = /obj/item/teleport_rod::name + desc = /obj/item/teleport_rod::desc + item_path = /obj/item/teleport_rod + cost = 2 // Puts it at 3 cost if you go for safety instant summons, but teleporting anywhere on screen is pretty good. + category = "Mobility" diff --git a/code/modules/antagonists/wizard/equipment/teleport_rod.dm b/code/modules/antagonists/wizard/equipment/teleport_rod.dm new file mode 100644 index 0000000000000..79df35ca25a18 --- /dev/null +++ b/code/modules/antagonists/wizard/equipment/teleport_rod.dm @@ -0,0 +1,246 @@ +/// Totally NOT a Rod of Discord +/// Teleports you to where you click! +/obj/item/teleport_rod + name = "Telegram Scepter" + desc = "A magical rod that teleports you to the location you point it. \ + Using it puts you in a state of flux, removing some of your reagents and \ + causing you to take damage from further uses until you stabilize once more." + icon_state = "tele_wand_er" + inhand_icon_state = "tele_wand_er" + icon = 'icons/obj/weapons/guns/magic.dmi' + lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF | UNACIDABLE + item_flags = NOBLUDGEON + light_system = OVERLAY_LIGHT + light_color = COLOR_FADED_PINK + light_power = 1 + light_range = 2 + light_on = TRUE + /// Whether we apply the teleport flux debuff, damaging people who teleport + var/apply_debuffs = TRUE + /// Max range at which we can teleport, because it operates in view TECHNICALLY can click very very far + var/max_tp_range = 8 + +/obj/item/teleport_rod/Initialize(mapload) + . = ..() + particles = new /particles/teleport_flux/small() + +// Admin only version which just teleports you, so spam it all you want +/obj/item/teleport_rod/admin + name = "Harmonious " + parent_type::name + desc = "A magical rod that teleports you anywhere, no questions asked." + apply_debuffs = FALSE + max_tp_range = INFINITY + +/obj/item/teleport_rod/equipped(mob/living/user, slot, initial) + . = ..() + if(!isliving(user)) + return + if(HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED)) + return + if(!(slot & ITEM_SLOT_HANDS)) + return + if(!apply_debuffs) + return + user.apply_status_effect(/datum/status_effect/teleport_flux/perma) + +/obj/item/teleport_rod/dropped(mob/living/user, silent) + . = ..() + if(!isliving(user)) + return + if(HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED)) + return + + 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 + + var/turf/start_turf = get_turf(user) + var/turf/target_turf = get_turf(target) + if(get_dist(start_turf, target_turf) > max_tp_range) + user.balloon_alert(user, "too far!") + return + + if(!(target_turf in view(user, user.client?.view || world.view))) + user.balloon_alert(user, "out of view!") + return + + if(target_turf.is_blocked_turf(exclude_mobs = TRUE, source_atom = user)) + user.balloon_alert(user, "obstructed!") + return + + var/tp_result = do_teleport( + teleatom = user, + destination = target_turf, + precision = (HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED) || !apply_debuffs) ? 0 : 2, + no_effects = TRUE, + channel = TELEPORT_CHANNEL_MAGIC, + ) + + if(!tp_result) + user.balloon_alert(user, "teleport failed!") + return + + var/sound/teleport_sound = sound('sound/magic/summonitems_generic.ogg') + teleport_sound.pitch = 0.5 + // Handle our own pizzaz rather than doing it in do_teleport + new /obj/effect/temp_visual/teleport_flux(start_turf, user.dir) + new /obj/effect/temp_visual/teleport_flux(get_turf(user), user.dir) + playsound(start_turf, teleport_sound, 90, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE) + playsound(user, teleport_sound, 90, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE) + // Some extra delay to prevent accidental double clicks + user.changeNext_move(CLICK_CD_SLOW * 1.2) + + if(!apply_debuffs) + return + + // Teleporting leaves some of your reagents behind! + // (Primarily a way to prevent cheese with damage healing chem mixes, + // but also serves as a counter-counter to stuff like mute toxin.) + var/obj/item/organ/user_stomach = user.get_organ_slot(ORGAN_SLOT_STOMACH) + 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 + + 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) + +/// Temp visual displayed on both sides of a teleport rod teleport +/obj/effect/temp_visual/teleport_flux + icon_state = "blank_white" + color = COLOR_MAGENTA + alpha = 255 + duration = 2 SECONDS + light_color = COLOR_MAGENTA + light_power = 2 + light_range = 1 + light_on = TRUE + randomdir = FALSE + +/obj/effect/temp_visual/teleport_flux/Initialize(mapload, copy_dir = SOUTH) + . = ..() + setDir(copy_dir) + particles = new /particles/teleport_flux() + apply_wibbly_filters(src) + animate(src, alpha = 0, time = duration, flags = ANIMATION_PARALLEL) + +/// Status effect applied to users of a Teleport Rod, damages them when they teleport +/datum/status_effect/teleport_flux + id = "teleport_flux" + status_type = STATUS_EFFECT_REFRESH + duration = 6 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/teleport_flux + remove_on_fullheal = TRUE // staff of healing ~synergy~ + + /// Amount of damage to deal when teleporting in flux + var/tp_damage = 15 + /// Damage type to deal when teleporting in flux + var/tp_damage_type = BRUTE + +/datum/status_effect/teleport_flux/on_apply() + RegisterSignal(owner, COMSIG_MOVABLE_POST_TELEPORT, PROC_REF(teleported)) + return TRUE + +/datum/status_effect/teleport_flux/on_remove() + UnregisterSignal(owner, COMSIG_MOVABLE_POST_TELEPORT) + +/datum/status_effect/teleport_flux/proc/teleported(mob/living/source, turf/destination, channel) + SIGNAL_HANDLER + + if(channel != TELEPORT_CHANNEL_MAGIC) + return + + owner.apply_damage( + damage = tp_damage, + damagetype = tp_damage_type, + spread_damage = TRUE, + forced = TRUE, + ) + log_combat(owner, owner, "teleported too soon") + +/datum/status_effect/teleport_flux/update_particles() + if(isnull(particle_effect)) + particle_effect = new(owner, /particles/teleport_flux) + + particle_effect.alpha = 200 + var/original_duration = initial(duration) + if(original_duration == -1) + return + animate(particle_effect, alpha = 50, time = original_duration) + +/datum/status_effect/teleport_flux/refresh(effect, ...) + . = ..() + update_particles() + +/datum/status_effect/teleport_flux/perma + id = "perma_teleport_flux" + status_type = STATUS_EFFECT_REPLACE + duration = -1 + alert_type = /atom/movable/screen/alert/status_effect/teleport_flux/perma + remove_on_fullheal = FALSE + +/datum/status_effect/teleport_flux/perma/on_apply() + . = ..() + RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_MAGICALLY_GIFTED), PROC_REF(gained_gift)) + +/datum/status_effect/teleport_flux/perma/on_remove() + . = ..() + UnregisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_MAGICALLY_GIFTED)) + +/datum/status_effect/teleport_flux/perma/proc/gained_gift(mob/living/source, trait) + SIGNAL_HANDLER + + delayed_remove() + +/// Used to fade out the effect and remove it after a delay +/// This cannot be interrupted, but if a new permaflux effect is applied, +/// this one will be deleted instantly anyways, making it moot +/datum/status_effect/teleport_flux/perma/proc/delayed_remove() + var/del_duration = /datum/status_effect/teleport_flux::duration + QDEL_IN(src, del_duration) + animate(particle_effect, alpha = 50, del_duration) + +/// Alert for the Teleport Flux status effect +/atom/movable/screen/alert/status_effect/teleport_flux + name = "Teleport Flux" + desc = "Your body exists in a state of flux, making further teleportation dangerous." + icon_state = "flux" + +/atom/movable/screen/alert/status_effect/teleport_flux/perma + name = "Permanent " + parent_type::name + desc = "Your lack of magical talent has left you in a state of flux, making further teleportation dangerous." + +/// Particles for Teleport Flux and other similar effects +/particles/teleport_flux + icon = 'icons/effects/particles/echo.dmi' + icon_state = list("echo1" = 3, "echo2" = 1, "echo3" = 1) + width = 40 + height = 80 + count = 1000 + spawning = 3 + lifespan = 1 SECONDS + fade = 1 SECONDS + friction = 0.5 + position = generator(GEN_SPHERE, 12, 12, NORMAL_RAND) + drift = generator(GEN_VECTOR, list(-1, 1), list(1, 1), NORMAL_RAND) + color = COLOR_MAGENTA + +/particles/teleport_flux/small + spawning = 1.5 + scale = 0.75 + lifespan = 0.5 SECONDS + position = generator(GEN_SPHERE, 4, 12, NORMAL_RAND) + drift = generator(GEN_VECTOR, list(-1, 1), list(1, 2), NORMAL_RAND) diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm index 9a18a2b026951..8c85d4fc7b4df 100644 --- a/code/modules/art/paintings.dm +++ b/code/modules/art/paintings.dm @@ -1,3 +1,4 @@ +#define MAX_PAINTING_ZOOM_OUT 3 /////////// // EASEL // @@ -67,10 +68,13 @@ var/framed_offset_y = 10 /** - * How big the grid cells that compose the painting are in the UI. + * How big the grid cells that compose the painting are in the UI (multiplied by zoom). * This impacts the size of the UI, so smaller values are generally better for bigger canvases and viceversa */ - var/pixels_per_unit = 24 + var/pixels_per_unit = 9 + + ///A list that keeps track of the current zoom value for each current viewer. + var/list/zoom_by_observer SET_BASE_PIXEL(11, 10) @@ -118,10 +122,12 @@ /obj/item/canvas/ui_static_data(mob/user) . = ..() .["px_per_unit"] = pixels_per_unit + .["max_zoom"] = MAX_PAINTING_ZOOM_OUT /obj/item/canvas/ui_data(mob/user) . = ..() .["grid"] = grid + .["zoom"] = LAZYACCESS(zoom_by_observer, user.key) || (finalized ? 1 : MAX_PAINTING_ZOOM_OUT) .["name"] = painting_metadata.title .["author"] = painting_metadata.creator_name .["patron"] = painting_metadata.patron_name @@ -202,6 +208,24 @@ if("patronage") . = TRUE patron(user) + if("zoom_in") + . = TRUE + LAZYINITLIST(zoom_by_observer) + if(!zoom_by_observer[user.key]) + zoom_by_observer[user.key] = 2 + else + zoom_by_observer[user.key] = min(zoom_by_observer[user.key] + 1, MAX_PAINTING_ZOOM_OUT) + if("zoom_out") + . = TRUE + LAZYINITLIST(zoom_by_observer) + if(!zoom_by_observer[user.key]) + zoom_by_observer[user.key] = MAX_PAINTING_ZOOM_OUT - 1 + else + zoom_by_observer[user.key] = max(zoom_by_observer[user.key] - 1, 1) + +/obj/item/canvas/ui_close(mob/user) + . = ..() + LAZYREMOVE(zoom_by_observer, user.key) /obj/item/canvas/proc/finalize(mob/user) if(painting_metadata.loaded_from_json || finalized) @@ -218,6 +242,9 @@ SStgui.update_uis(src) +#define CURATOR_PERCENTILE_CUT 0.225 +#define SERVICE_PERCENTILE_CUT 0.125 + /obj/item/canvas/proc/patron(mob/user) if(!finalized || !isliving(user)) return @@ -245,6 +272,19 @@ if(!account.adjust_money(-offer_amount, "Painting: Patron of [painting_metadata.title]")) to_chat(user, span_warning("Transaction failure. Please try again.")) return + + var/datum/bank_account/service_account = SSeconomy.get_dep_account(ACCOUNT_SRV) + service_account.adjust_money(offer_amount * SERVICE_PERCENTILE_CUT) + ///We give the curator(s) a cut (unless they're themselves the patron), as it's their job to curate and promote art among other things. + var/list/curator_accounts = SSeconomy.bank_accounts_by_job[/datum/job/curator] - account + var/curators_length = length(curator_accounts) + if(curators_length) + var/curator_cut = round(offer_amount * CURATOR_PERCENTILE_CUT / curators_length) + if(curator_cut) + for(var/datum/bank_account/curator as anything in curator_accounts) + curator.adjust_money(curator_cut, "Painting: Patronage cut") + curator.bank_card_talk("Cut on patronage received, account now holds [curator.account_balance] cr.") + painting_metadata.patron_ckey = user.ckey painting_metadata.patron_name = user.real_name painting_metadata.credit_value = offer_amount @@ -260,6 +300,9 @@ SStgui.close_uis(src) // Close the examine ui so that the radial menu doesn't end up covered by it and people don't get confused. select_new_frame(user, possible_frames) +#undef CURATOR_PERCENTILE_CUT +#undef SERVICE_PERCENTILE_CUT + /obj/item/canvas/proc/select_new_frame(mob/user, list/candidates) var/possible_frames = candidates || SSpersistent_paintings.get_available_frames(painting_metadata.credit_value) var/list/radial_options = list() @@ -386,6 +429,7 @@ SET_BASE_PIXEL(5, 7) framed_offset_x = 5 framed_offset_y = 7 + pixels_per_unit = 8 /obj/item/canvas/twentythree_twentythree name = "canvas (23x23)" @@ -395,6 +439,7 @@ SET_BASE_PIXEL(5, 5) framed_offset_x = 5 framed_offset_y = 5 + pixels_per_unit = 8 /obj/item/canvas/twentyfour_twentyfour name = "canvas (24x24) (AI Universal Standard)" @@ -405,6 +450,7 @@ SET_BASE_PIXEL(4, 4) framed_offset_x = 4 framed_offset_y = 4 + pixels_per_unit = 8 /obj/item/canvas/thirtysix_twentyfour name = "canvas (36x24)" @@ -415,7 +461,7 @@ SET_BASE_PIXEL(-4, 4) framed_offset_x = 14 framed_offset_y = 4 - pixels_per_unit = 20 + pixels_per_unit = 7 w_class = WEIGHT_CLASS_BULKY custom_price = PAYCHECK_CREW * 1.25 @@ -435,7 +481,7 @@ SET_BASE_PIXEL(-8, 2) framed_offset_x = 9 framed_offset_y = 4 - pixels_per_unit = 18 + pixels_per_unit = 6 w_class = WEIGHT_CLASS_BULKY custom_price = PAYCHECK_CREW * 1.75 @@ -798,3 +844,4 @@ current_color = chosen_color #undef AVAILABLE_PALETTE_SPACE +#undef MAX_PAINTING_ZOOM_OUT diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm index 2158104b6eefe..caebda5076605 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -26,6 +26,7 @@ AddElement(art_type, impressiveness) AddElement(/datum/element/beauty, impressiveness * 75) AddComponent(/datum/component/simple_rotation) + AddComponent(/datum/component/marionette) /obj/structure/statue/wrench_act(mob/living/user, obj/item/tool) . = ..() @@ -572,23 +573,21 @@ Moving interrupts var/static/list/plane_whitelist = list(FLOAT_PLANE, GAME_PLANE, FLOOR_PLANE) /// Ideally we'd have knowledge what we're removing but i'd have to be done on target appearance retrieval - var/list/overlays_to_remove = list() + var/list/overlays_to_keep = list() for(var/mutable_appearance/special_overlay as anything in content_ma.overlays) var/mutable_appearance/real = new() real.appearance = special_overlay if(PLANE_TO_TRUE(real.plane) in plane_whitelist) - continue - overlays_to_remove += real - content_ma.overlays -= overlays_to_remove + overlays_to_keep += real + content_ma.overlays = overlays_to_keep - var/list/underlays_to_remove = list() + var/list/underlays_to_keep = list() for(var/mutable_appearance/special_underlay as anything in content_ma.underlays) var/mutable_appearance/real = new() real.appearance = special_underlay if(PLANE_TO_TRUE(real.plane) in plane_whitelist) - continue - underlays_to_remove += real - content_ma.underlays -= underlays_to_remove + underlays_to_keep += real + content_ma.underlays = underlays_to_keep content_ma.appearance_flags &= ~KEEP_APART //Don't want this content_ma.filters = filter(type="color",color=greyscale_with_value_bump,space=FILTER_COLOR_HSV) diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index a09185df3b517..5319d4465e2ab 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -11,7 +11,7 @@ throwforce = 0 w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*3, /datum/material/glass = SMALL_MATERIAL_AMOUNT*3) - light_system = MOVABLE_LIGHT //Used as a flash here. + light_system = OVERLAY_LIGHT //Used as a flash here. light_range = FLASH_LIGHT_RANGE light_color = COLOR_WHITE light_power = FLASH_LIGHT_POWER diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index a7a641bb8842c..478d500072136 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -18,9 +18,9 @@ . = ..() beams = list() START_PROCESSING(SSobj, src) - AddComponent(/datum/component/simple_rotation, AfterRotation = CALLBACK(src, PROC_REF(AfterRotation))) + AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) -/obj/item/assembly/infra/proc/AfterRotation(mob/user, degrees) +/obj/item/assembly/infra/proc/post_rotation(mob/user, degrees) refreshBeam() /obj/item/assembly/infra/AltClick(mob/user) @@ -181,7 +181,7 @@ . = ..() refreshBeam() -/obj/item/assembly/infra/ui_status(mob/user) +/obj/item/assembly/infra/ui_status(mob/user, datum/ui_state/state) if(is_secured(user)) return ..() return UI_CLOSE diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 1f760e29b8959..1d8936e6068da 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -89,7 +89,7 @@ to_chat(user, span_warning("Your hand slips, setting off the trigger!")) pulse() update_appearance() - playsound(src, 'sound/weapons/handcuffs.ogg', 30, TRUE, -3) + playsound(loc, 'sound/weapons/handcuffs.ogg', 30, TRUE, -3) /obj/item/assembly/mousetrap/update_icon_state() icon_state = "mousetrap[armed ? "armed" : ""]" diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 5b6bf30668766..031a3f78eadeb 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -134,7 +134,7 @@ . += "prox_scanning" attached_overlays += "prox_scanning" -/obj/item/assembly/prox_sensor/ui_status(mob/user) +/obj/item/assembly/prox_sensor/ui_status(mob/user, datum/ui_state/state) if(is_secured(user)) return ..() return UI_CLOSE diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 3823706358faf..5af89f10ec1b4 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -68,7 +68,7 @@ . = ..() holder?.update_appearance() -/obj/item/assembly/signaler/ui_status(mob/user) +/obj/item/assembly/signaler/ui_status(mob/user, datum/ui_state/state) if(is_secured(user)) return ..() return UI_CLOSE diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index 1619f080abbe4..8366bb0f2b382 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -83,7 +83,7 @@ . += "timer_timing" attached_overlays += "timer_timing" -/obj/item/assembly/timer/ui_status(mob/user) +/obj/item/assembly/timer/ui_status(mob/user, datum/ui_state/state) if(is_secured(user)) return ..() return UI_CLOSE diff --git a/code/modules/asset_cache/asset_list.dm b/code/modules/asset_cache/asset_list.dm index e4a00ffb8bf38..bc302a188d825 100644 --- a/code/modules/asset_cache/asset_list.dm +++ b/code/modules/asset_cache/asset_list.dm @@ -1,4 +1,4 @@ -#define ASSET_CROSS_ROUND_CACHE_DIRECTORY "tmp/assets" +#define ASSET_CROSS_ROUND_CACHE_DIRECTORY "cache/assets" //These datums are used to populate the asset cache, the proc "register()" does this. //Place any asset datums you create in asset_list_items.dm diff --git a/code/modules/asset_cache/assets/achievements.dm b/code/modules/asset_cache/assets/achievements.dm index 1ba7b91af92b9..91f2d75b6d581 100644 --- a/code/modules/asset_cache/assets/achievements.dm +++ b/code/modules/asset_cache/assets/achievements.dm @@ -1,5 +1,11 @@ /datum/asset/spritesheet/simple/achievements - name ="achievements" + name = "achievements" /datum/asset/spritesheet/simple/achievements/create_spritesheets() - InsertAll("", ACHIEVEMENTS_SET) + InsertAll("achievement", ACHIEVEMENTS_SET) + // catch achievements which are pulling icons from another file + for(var/datum/award/other_award as anything in subtypesof(/datum/award)) + var/icon = initial(other_award.icon) + if (icon != ACHIEVEMENTS_SET) + var/icon_state = initial(other_award.icon_state) + Insert("achievement-[icon_state]", icon, icon_state=icon_state) diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index 75354c0eee397..00bb94d6bc31f 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -73,7 +73,7 @@ layer = GASFIRE_LAYER plane = ABOVE_GAME_PLANE blend_mode = BLEND_ADD - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = LIGHT_RANGE_FIRE light_power = 1 light_color = LIGHT_COLOR_FIRE diff --git a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm index e7edfe10869a0..c8e93257b8064 100644 --- a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm +++ b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm @@ -185,7 +185,7 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) if(AIR_ALARM_BUILD_COMPLETE) . += span_notice("Right-click to [locked ? "unlock" : "lock"] the interface.") -/obj/machinery/airalarm/ui_status(mob/user) +/obj/machinery/airalarm/ui_status(mob/user, datum/ui_state/state) if(user.has_unlimited_silicon_privilege && aidisabled) to_chat(user, "AI control has been disabled.") else if(!shorted) @@ -232,6 +232,8 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) data["dangerLevel"] = danger_level data["atmosAlarm"] = !!my_area.active_alarms[ALARM_ATMOS] data["fireAlarm"] = my_area.fire + data["faultStatus"] = my_area.fault_status + data["faultLocation"] = my_area.fault_location data["sensor"] = !!connected_sensor data["allowLinkChange"] = allow_link_change diff --git a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm index 3d93338fbeead..f39b2a780d119 100644 --- a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm +++ b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm @@ -89,16 +89,14 @@ playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) return TRUE -/obj/machinery/airalarm/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 2) - if((buildstage == AIR_ALARM_BUILD_NO_WIRES) || (buildstage == AIR_ALARM_BUILD_COMPLETE)) - var/obj/item/electronics/airalarm/alarm = new(loc) - if(!disassembled) - alarm.take_damage(alarm.max_integrity * 0.5, sound_effect = FALSE) - if((buildstage == AIR_ALARM_BUILD_COMPLETE)) - new /obj/item/stack/cable_coil(loc, 3) - qdel(src) +/obj/machinery/airalarm/on_deconstruction(disassembled = TRUE) + new /obj/item/stack/sheet/iron(loc, 2) + if((buildstage == AIR_ALARM_BUILD_NO_WIRES) || (buildstage == AIR_ALARM_BUILD_COMPLETE)) + var/obj/item/electronics/airalarm/alarm = new(loc) + if(!disassembled) + alarm.take_damage(alarm.max_integrity * 0.5, sound_effect = FALSE) + if((buildstage == AIR_ALARM_BUILD_COMPLETE)) + new /obj/item/stack/cable_coil(loc, 3) /obj/machinery/airalarm/attackby(obj/item/W, mob/user, params) update_last_used(user) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index fe6806c9b58a0..be455ea6d4709 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -21,6 +21,7 @@ max_integrity = 200 obj_flags = CAN_BE_HIT armor_type = /datum/armor/machinery_atmospherics + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_IGNORE_MOBILITY ///Check if the object can be unwrenched var/can_unwrench = FALSE @@ -280,8 +281,8 @@ * * given_layer - the piping_layer we are checking */ /obj/machinery/atmospherics/proc/connection_check(obj/machinery/atmospherics/target, given_layer) - //if target is not multiz then we have to check if the target & src connect in the same direction - if(!istype(target, /obj/machinery/atmospherics/pipe/multiz) && !((initialize_directions & get_dir(src, target)) && (target.initialize_directions & get_dir(target, src)))) + //check if the target & src connect in the same direction + if(!((initialize_directions & get_dir(src, target)) && (target.initialize_directions & get_dir(target, src)))) return FALSE //both target & src can't be connected either way @@ -468,16 +469,16 @@ * * Called by wrench_act(), create a pipe fitting and remove the pipe */ -/obj/machinery/atmospherics/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(can_unwrench) - var/obj/item/pipe/stored = new construction_type(loc, null, dir, src, pipe_color) - stored.set_piping_layer(piping_layer) - if(!disassembled) - stored.take_damage(stored.max_integrity * 0.5, sound_effect=FALSE) - transfer_fingerprints_to(stored) - . = stored - ..() +/obj/machinery/atmospherics/on_deconstruction(disassembled = TRUE) + if(!can_unwrench) + return + + var/obj/item/pipe/stored = new construction_type(loc, null, dir, src, pipe_color) + stored.set_piping_layer(piping_layer) + if(!disassembled) + stored.take_damage(stored.max_integrity * 0.5, sound_effect=FALSE) + transfer_fingerprints_to(stored) + . = stored /** * Getter for piping layer shifted, pipe colored overlays diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index a49109050496d..1816ca1963721 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -157,7 +157,7 @@ return TRUE return ..() -/obj/machinery/atmospherics/components/binary/circulator/on_deconstruction() +/obj/machinery/atmospherics/components/binary/circulator/on_deconstruction(disassembled) if(generator) disconnectFromGenerator() diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index 1aae85d2a1407..e72d72b3d5955 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -105,7 +105,7 @@ . = ..() update_parents() -/obj/machinery/atmospherics/components/on_deconstruction() +/obj/machinery/atmospherics/components/on_deconstruction(disassembled) relocate_airs() return ..() @@ -213,7 +213,7 @@ // UI Stuff -/obj/machinery/atmospherics/components/ui_status(mob/user) +/obj/machinery/atmospherics/components/ui_status(mob/user, datum/ui_state/state) if(allowed(user)) return ..() to_chat(user, span_danger("Access denied.")) @@ -231,7 +231,7 @@ if(!panel_open) balloon_alert(user, "open panel!") return ITEM_INTERACT_SUCCESS - + var/unsafe_wrenching = FALSE var/filled_pipe = FALSE var/datum/gas_mixture/environment_air = loc.return_air() @@ -246,7 +246,7 @@ if(!filled_pipe) default_deconstruction_crowbar(tool) return ITEM_INTERACT_SUCCESS - + to_chat(user, span_notice("You begin to unfasten \the [src]...")) internal_pressure -= environment_air.return_pressure() @@ -268,6 +268,10 @@ if(!.) return FALSE set_init_directions() + reconnect_nodes() + return TRUE + +/obj/machinery/atmospherics/components/proc/reconnect_nodes() for(var/i in 1 to device_type) var/obj/machinery/atmospherics/node = nodes[i] if(node) @@ -285,7 +289,6 @@ node.add_member(src) update_parents() SSair.add_to_rebuild_queue(src) - return TRUE /** * Disconnects all nodes from ourselves, remove us from the node's nodes. diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm index fef2c072cd83e..7cee01e0cf792 100644 --- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm +++ b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm @@ -57,7 +57,7 @@ QDEL_NULL(cell) return ..() -/obj/machinery/electrolyzer/on_deconstruction() +/obj/machinery/electrolyzer/on_deconstruction(disassembled) if(cell) LAZYADD(component_parts, cell) cell = null diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm index 6d3d5d31a16ee..55111e731fc24 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm @@ -200,7 +200,7 @@ machine_parts = null return..() -/obj/machinery/atmospherics/components/unary/hypertorus/core/on_deconstruction() +/obj/machinery/atmospherics/components/unary/hypertorus/core/on_deconstruction(disassembled) var/turf/local_turf = get_turf(loc) var/datum/gas_mixture/to_release = moderator_internal || internal_fusion if(to_release == moderator_internal) diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm index a005caf86b98b..989156867491f 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm @@ -40,7 +40,7 @@ internal = new register_context() -/obj/machinery/atmospherics/components/binary/crystallizer/on_deconstruction() +/obj/machinery/atmospherics/components/binary/crystallizer/on_deconstruction(disassembled) var/turf/local_turf = get_turf(loc) if(internal.total_moles()) local_turf.assume_air(internal) @@ -55,7 +55,7 @@ if(TOOL_SCREWDRIVER) context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] panel" if(TOOL_WRENCH) - context[SCREENTIP_CONTEXT_LMB] = "Rotate" + context[SCREENTIP_CONTEXT_RMB] = "Rotate" return CONTEXTUAL_SCREENTIP_SET /obj/machinery/atmospherics/components/binary/crystallizer/attackby(obj/item/I, mob/user, params) @@ -67,7 +67,7 @@ return ..() /obj/machinery/atmospherics/components/binary/crystallizer/crowbar_act(mob/living/user, obj/item/tool) - return crowbar_deconstruction_act(user, tool, internal.return_pressure()) + return crowbar_deconstruction_act(user, tool, internal.return_pressure()) /obj/machinery/atmospherics/components/binary/crystallizer/update_overlays() . = ..() @@ -228,8 +228,8 @@ var/obj/creation = new path(get_step(src, SOUTH)) creation.name = "[quality_control] [creation.name]" if(selected_recipe.dangerous) - investigate_log("has been created in the crystallizer.", INVESTIGATE_ENGINE) - message_admins("[src] has been created in the crystallizer [ADMIN_JMP(src)].") + investigate_log("[creation.name] has been created in the crystallizer.", INVESTIGATE_ENGINE) + message_admins("[creation.name] has been created in the crystallizer [ADMIN_JMP(src)].") quality_loss = 0 diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index 6e778168a3223..cf18488f0522c 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -338,7 +338,7 @@ deconstruct(disassembled=TRUE) to_chat(user, span_notice("You finish cutting open the sealed gas tank, revealing the innards.")) -/obj/machinery/atmospherics/components/tank/deconstruct(disassembled) +/obj/machinery/atmospherics/components/tank/on_deconstruction(disassembled) var/turf/location = drop_location() . = ..() location.assume_air(air_contents) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm b/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm index 269e0943004a2..7d2efbd932103 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm @@ -4,6 +4,7 @@ base_icon_state = "bluespace_sender" name = "Bluespace Gas Sender" desc = "Sends gases to the bluespace network to be shared with the connected vendors, who knows what's beyond!" + interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT density = TRUE max_integrity = 300 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index c6814c41da3d9..beded509497c2 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -133,7 +133,7 @@ return ..() -/obj/machinery/cryo_cell/on_deconstruction() +/obj/machinery/cryo_cell/on_deconstruction(disassembled) if(occupant) occupant.vis_flags &= ~VIS_INHERIT_PLANE REMOVE_TRAIT(occupant, TRAIT_IMMOBILIZED, CRYO_TRAIT) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 5067dcddae2bf..46adfee054e6e 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -5,6 +5,8 @@ icon_state = "thermo_base" plane = GAME_PLANE + interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT + name = "Temperature control unit" desc = "Heats or cools gas in connected pipes." @@ -129,7 +131,7 @@ if(!initial(icon)) return var/mutable_appearance/thermo_overlay = new(initial(icon)) - . += get_pipe_image(thermo_overlay, "pipe", dir, COLOR_LIME, piping_layer) + . += get_pipe_image(thermo_overlay, "pipe", dir, pipe_color, piping_layer) /obj/machinery/atmospherics/components/unary/thermomachine/examine(mob/user) . = ..() @@ -222,6 +224,8 @@ return ITEM_INTERACT_SUCCESS piping_layer = (piping_layer >= PIPING_LAYER_MAX) ? PIPING_LAYER_MIN : (piping_layer + 1) to_chat(user, span_notice("You change the circuitboard to layer [piping_layer].")) + if(anchored) + reconnect_nodes() update_appearance() return ITEM_INTERACT_SUCCESS @@ -233,6 +237,8 @@ set_pipe_color(GLOB.pipe_paint_colors[GLOB.pipe_paint_colors[color_index]]) visible_message(span_notice("[user] set [src]'s pipe color to [GLOB.pipe_color_name[pipe_color]]."), ignored_mobs = user) to_chat(user, span_notice("You set [src]'s pipe color to [GLOB.pipe_color_name[pipe_color]].")) + if(anchored) + reconnect_nodes() update_appearance() return ITEM_INTERACT_SUCCESS @@ -253,7 +259,7 @@ return ITEM_INTERACT_SUCCESS return -/obj/machinery/atmospherics/components/unary/thermomachine/ui_status(mob/user) +/obj/machinery/atmospherics/components/unary/thermomachine/ui_status(mob/user, datum/ui_state/state) if(interactive) return ..() return UI_CLOSE diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 656b6582a00ec..ee1d052b7ed81 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -134,10 +134,8 @@ deconstruct() return TRUE -/obj/machinery/meter/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/pipe_meter(loc) - . = ..() +/obj/machinery/meter/on_deconstruction(disassembled) + new /obj/item/pipe_meter(loc) /obj/machinery/meter/interact(mob/user) if(machine_stat & (NOPOWER|BROKEN)) diff --git a/code/modules/atmospherics/machinery/pipes/multiz.dm b/code/modules/atmospherics/machinery/pipes/multiz.dm index 7e14b8a98063e..ebe295313161e 100644 --- a/code/modules/atmospherics/machinery/pipes/multiz.dm +++ b/code/modules/atmospherics/machinery/pipes/multiz.dm @@ -9,7 +9,7 @@ initialize_directions = SOUTH layer = HIGH_OBJ_LAYER - device_type = UNARY + device_type = TRINARY paintable = FALSE construction_type = /obj/item/pipe/directional @@ -54,8 +54,8 @@ for(var/obj/machinery/atmospherics/pipe/multiz/above in GET_TURF_ABOVE(local_turf)) if(!is_connectable(above, piping_layer)) continue - nodes += above - above.nodes += src //Two way travel :) + nodes[2] = above + above.nodes[3] = src //Two way travel :) for(var/obj/machinery/atmospherics/pipe/multiz/below in GET_TURF_BELOW(local_turf)) if(!is_connectable(below, piping_layer)) continue diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 18fe9817e8115..8c3a3301b6804 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -353,10 +353,7 @@ /obj/machinery/portable_atmospherics/canister/atmos_expose(datum/gas_mixture/air, exposed_temperature) take_damage(5, BURN, 0) -/obj/machinery/portable_atmospherics/canister/deconstruct(disassembled = TRUE) - if((obj_flags & NO_DECONSTRUCTION)) - qdel(src) - return +/obj/machinery/portable_atmospherics/canister/on_deconstruction(disassembled = TRUE) if(!(machine_stat & BROKEN)) canister_break() if(!disassembled) @@ -366,7 +363,6 @@ new /obj/item/stack/sheet/iron (drop_location(), 10) if(internal_cell) internal_cell.forceMove(drop_location()) - qdel(src) /obj/machinery/portable_atmospherics/canister/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/stock_parts/cell)) diff --git a/code/modules/awaymissions/away_props.dm b/code/modules/awaymissions/away_props.dm index f6d1a830a91b0..1ed0a1ec0ffdb 100644 --- a/code/modules/awaymissions/away_props.dm +++ b/code/modules/awaymissions/away_props.dm @@ -118,3 +118,19 @@ icon = 'icons/turf/floors.dmi' icon_state = "floor" hidden = TRUE + +/// only player mobs (has ckey) may pass, reverse for the opposite +/obj/effect/playeronly_barrier + name = "player-only barrier" + desc = "You shall pass." + icon = 'icons/effects/mapping_helpers.dmi' + icon_state = "blocker" + anchored = TRUE + invisibility = INVISIBILITY_MAXIMUM + var/reverse = FALSE //Block if has ckey + +/obj/effect/playeronly_barrier/CanAllowThrough(mob/living/mover, border_dir) + . = ..() + if(!istype(mover)) + return + return isnull(mover.ckey) == reverse diff --git a/code/modules/basketball/hoop.dm b/code/modules/basketball/hoop.dm index f356fc5231588..b26fa462b0999 100644 --- a/code/modules/basketball/hoop.dm +++ b/code/modules/basketball/hoop.dm @@ -24,7 +24,7 @@ /obj/structure/hoop/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation, ROTATION_REQUIRE_WRENCH|ROTATION_IGNORE_ANCHORED, AfterRotation = CALLBACK(src, PROC_REF(reset_appearance))) + AddComponent(/datum/component/simple_rotation, ROTATION_REQUIRE_WRENCH|ROTATION_IGNORE_ANCHORED, post_rotation = CALLBACK(src, PROC_REF(reset_appearance))) update_appearance() register_context() diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index 7b1850514788f..fd30973d24107 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -152,7 +152,7 @@ name = "Valentine Card" desc = "Make an impression on that special someone! Comes with one valentine card and a free candy heart!" cost = PAYCHECK_CREW * 2 - contains = list(/obj/item/valentine, /obj/item/food/candyheart) + contains = list(/obj/item/paper/valentine, /obj/item/food/candyheart) /datum/supply_pack/goody/beeplush name = "Bee Plushie" @@ -249,6 +249,12 @@ cost = PAYCHECK_CREW contains = list(/obj/item/bait_can/worm/premium) +/datum/supply_pack/goody/naturalbait + name = "Freshness Jars full of Natural Bait" + desc = "Homemade in the Spinward Sector." + cost = PAYCHECK_CREW * 4 //rock on + contains = list(/obj/item/storage/pill_bottle/naturalbait) + /datum/supply_pack/goody/telescopic_fishing_rod name = "Telescopic Fishing Rod" desc = "A collapsible fishing rod that can fit within a backpack." diff --git a/code/modules/cargo/markets/_market.dm b/code/modules/cargo/markets/_market.dm index 3c264289cd2bf..a4af2bc981d94 100644 --- a/code/modules/cargo/markets/_market.dm +++ b/code/modules/cargo/markets/_market.dm @@ -13,10 +13,7 @@ /// Adds item to the available items and add it's category if it is not in categories yet. /datum/market/proc/add_item(datum/market_item/item) - if(!prob(initial(item.availability_prob))) - return FALSE - - if(ispath(item)) + if(ispath(item, /datum/market_item)) item = new item() if(!(item.category in categories)) diff --git a/code/modules/cargo/markets/market_item.dm b/code/modules/cargo/markets/market_item.dm index 867facf015b98..d5689c17a45e6 100644 --- a/code/modules/cargo/markets/market_item.dm +++ b/code/modules/cargo/markets/market_item.dm @@ -14,7 +14,7 @@ var/stock /// Path to or the item itself what this entry is for, this should be set even if you override spawn_item to spawn your item. - var/item + var/obj/item/item /// Minimum price for the item if generated randomly. var/price_min = 0 @@ -33,9 +33,18 @@ if(isnull(stock)) stock = rand(stock_min, stock_max) +/datum/market_item/Destroy() + item = null + return ..() + /// Used for spawning the wanted item, override if you need to do something special with the item. /datum/market_item/proc/spawn_item(loc) - return new item(loc) + if(ismovable(item)) + item.forceMove(loc) + return item + if(ispath(item)) + return new item(loc) + CRASH("Invalid item type for market item [item || "null"]") /// Buys the item and makes SSblackmarket handle it. /datum/market_item/proc/buy(obj/item/market_uplink/uplink, mob/buyer, shipping_method) diff --git a/code/modules/cargo/markets/market_items/clothing.dm b/code/modules/cargo/markets/market_items/clothing.dm index 003cd95780c29..8af34e2291657 100644 --- a/code/modules/cargo/markets/market_items/clothing.dm +++ b/code/modules/cargo/markets/market_items/clothing.dm @@ -79,3 +79,19 @@ price_max = CARGO_CRATE_VALUE * 1.5 stock_max = 5 availability_prob = 70 + +/datum/market_item/clothing/floortileset + name = "Floor-tile Camouflage Uniform" + desc = "Hey there, looking to surprise somebody? Spy? Steal? Then you're lucky, meet our newest \ + floor-tile 'NT SCUM' styled camouflage fatigues. This is the ultimate \ + espionage uniform used by the very best. Providing the best \ + flexibility, with our latest Camo-tech threads. Perfect for \ + risky espionage hallway operations. Enjoy our product!" + item = /obj/item/storage/box/floor_camo + price_min = CARGO_CRATE_VALUE * 0.5 + price_max = CARGO_CRATE_VALUE + stock_max = 3 + availability_prob = 40 + + + diff --git a/code/modules/cargo/markets/market_items/weapons.dm b/code/modules/cargo/markets/market_items/weapons.dm index ee16daae7d502..052074a30b38d 100644 --- a/code/modules/cargo/markets/market_items/weapons.dm +++ b/code/modules/cargo/markets/market_items/weapons.dm @@ -73,3 +73,12 @@ price_max = CARGO_CRATE_VALUE * 4 stock_max = 1 availability_prob = 75 + +/datum/market_item/weapon/dimensional_bomb + name = "Multi-Dimensional Bomb Core" + desc = "A special bomb core, one of a kind, for all your 'terraforming gone wrong' purposes." + item = /obj/item/bombcore/dimensional + price_min = CARGO_CRATE_VALUE * 40 + price_max = CARGO_CRATE_VALUE * 50 + stock_max = 1 + availability_prob = 15 diff --git a/code/modules/cargo/markets/market_telepad.dm b/code/modules/cargo/markets/market_telepad.dm index abdad441ce500..e99e4b88d223e 100644 --- a/code/modules/cargo/markets/market_telepad.dm +++ b/code/modules/cargo/markets/market_telepad.dm @@ -82,11 +82,7 @@ if(receiving) var/datum/market_purchase/P = receiving - if(!P.item || ispath(P.item)) - P.item = P.entry.spawn_item(T) - else - var/atom/movable/M = P.item - M.forceMove(T) + P.item = P.entry.spawn_item(T) use_power(power_usage_per_teleport / power_efficiency) var/datum/effect_system/spark_spread/sparks = new diff --git a/code/modules/cargo/packs/engineering.dm b/code/modules/cargo/packs/engineering.dm index 33d4b35cdf541..1911402ce7160 100644 --- a/code/modules/cargo/packs/engineering.dm +++ b/code/modules/cargo/packs/engineering.dm @@ -25,6 +25,7 @@ /obj/item/mecha_parts/part/ripley_left_leg, /obj/item/stock_parts/capacitor, /obj/item/stock_parts/scanning_module, + /obj/item/stock_parts/servo, /obj/item/circuitboard/mecha/ripley/main, /obj/item/circuitboard/mecha/ripley/peripherals, /obj/item/mecha_parts/mecha_equipment/drill, diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm index bfb883f3f3406..781205eb03bf8 100644 --- a/code/modules/cargo/packs/imports.dm +++ b/code/modules/cargo/packs/imports.dm @@ -71,13 +71,6 @@ crate_name = "bananium sheet crate" discountable = SUPPLY_PACK_RARE_DISCOUNTABLE -/datum/supply_pack/imports/naturalbait - name = "Freshness Jars full of Natural Bait" - desc = "Homemade in the Spinward Sector." - cost = 2000 //rock on - contains = list(/obj/item/storage/pill_bottle/naturalbait) - crate_name = "fishing bait crate" - /datum/supply_pack/imports/dumpstercorpse name = "A....Dumpster?" desc = "Why does it smell so bad...." @@ -319,3 +312,21 @@ ) crate_name = "materials market crate" crate_type = /obj/structure/closet/crate/cargo + +/datum/supply_pack/imports/floortilecamo + name = "Floor-tile Camouflage Uniform" + desc = "Hey there, looking to surprise somebody? Spy? Steal? Then you're lucky, meet our newest \ + floor-tile 'NT SCUM' styled camouflage fatigues. This is the ultimate \ + espionage uniform used by the very best. Providing the best \ + flexibility, with our latest Camo-tech threads. Perfect for \ + risky espionage hallway operations. Enjoy our product!" + contraband = TRUE + cost = CARGO_CRATE_VALUE * 6 + contains = list(/obj/item/clothing/under/syndicate/floortilecamo = 3, + /obj/item/clothing/mask/floortilebalaclava = 3, + /obj/item/clothing/gloves/combat/floortile = 3, + /obj/item/clothing/shoes/jackboots/floortile = 3, + /obj/item/storage/backpack/floortile = 3 + ) + crate_name = "floortile camouflauge crate" + crate_type = /obj/structure/closet/crate/secure/weapon diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index eacd24fdbd016..0b0073258298b 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -342,17 +342,3 @@ access_view = ACCESS_SECURITY contains = list(/obj/item/clothing/glasses/sunglasses = 1) crate_name = "sunglasses crate" - -/datum/supply_pack/security/armory/beacon_imp - name = "Beacon Implants Crate" - desc = "Contains five Beacon implants." - cost = CARGO_CRATE_VALUE * 5.5 - contains = list(/obj/item/storage/box/beaconimp) - crate_name = "beacon implant crate" - -/datum/supply_pack/security/armory/teleport_blocker_imp - name = "Bluespace Grounding Implants Crate" - desc = "Contains five Bluespace Grounding implants." - cost = CARGO_CRATE_VALUE * 7 - contains = list(/obj/item/storage/box/teleport_blocker) - crate_name = "bluespace grounding implant crate" diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm index c7ff9a02c6e45..6fa3bb36f3fb8 100644 --- a/code/modules/client/client_colour.dm +++ b/code/modules/client/client_colour.dm @@ -38,35 +38,32 @@ /datum/client_colour/Destroy() if(!QDELETED(owner)) owner.client_colours -= src - if(fade_out) - owner.animate_client_colour(fade_out) - else - owner.update_client_colour() + owner.animate_client_colour(fade_out) owner = null return ..() ///Sets a new colour, then updates the owner's screen colour. /datum/client_colour/proc/update_colour(new_colour, anim_time, easing = 0) colour = new_colour - if(anim_time) - owner.animate_client_colour(anim_time, easing) - else - owner.update_client_colour() + owner.animate_client_colour(anim_time, easing) /** * Adds an instance of colour_type to the mob's client_colours list * colour_type - a typepath (subtyped from /datum/client_colour) */ -/mob/proc/add_client_colour(colour_type) - if(!ispath(colour_type, /datum/client_colour) || QDELING(src)) +/mob/proc/add_client_colour(colour_type_or_datum) + if(QDELING(src)) return + var/datum/client_colour/colour + if(istype(colour_type_or_datum, /datum/client_colour)) + colour = colour_type_or_datum + else if(ispath(colour_type_or_datum, /datum/client_colour)) + colour = new colour_type_or_datum(src) + else + CRASH("Invalid colour type or datum for add_client_color: [colour_type_or_datum || "null"]") - var/datum/client_colour/colour = new colour_type(src) BINARY_INSERT(colour, client_colours, /datum/client_colour, colour, priority, COMPARE_KEY) - if(colour.fade_in) - animate_client_colour(colour.fade_in) - else - update_client_colour() + animate_client_colour(colour.fade_in) return colour /** @@ -77,8 +74,7 @@ if(!ispath(colour_type, /datum/client_colour)) return - for(var/cc in client_colours) - var/datum/client_colour/colour = cc + for(var/datum/client_colour/colour as anything in client_colours) if(colour.type == colour_type) qdel(colour) break @@ -123,31 +119,49 @@ };\ target = _our_colour\ +#define CLIENT_COLOR_FILTER_KEY "fake_client_color" /** * Resets the mob's client.color to null, and then reapplies a new color based * on the client_colour datums it currently has. */ /mob/proc/update_client_colour() - if(!client) + if(isnull(hud_used)) return - client.color = "" - if(!client_colours.len) - return - MIX_CLIENT_COLOUR(client.color) + + var/new_color = "" + if(length(client_colours)) + MIX_CLIENT_COLOUR(new_color) + + for(var/atom/movable/screen/plane_master/game_plane as anything in hud_used.get_true_plane_masters(RENDER_PLANE_GAME)) + if(new_color) + game_plane.add_filter(CLIENT_COLOR_FILTER_KEY, 2, color_matrix_filter(new_color)) + else + game_plane.remove_filter(CLIENT_COLOR_FILTER_KEY) ///Works similarly to 'update_client_colour', but animated. -/mob/proc/animate_client_colour(anim_time = 20, anim_easing = 0) - if(!client) +/mob/proc/animate_client_colour(anim_time = 2 SECONDS, anim_easing = NONE) + if(anim_time <= 0) + return update_client_colour() + if(isnull(hud_used)) return - if(!client_colours.len) - animate(client, color = "", time = anim_time, easing = anim_easing) - return - MIX_CLIENT_COLOUR(var/anim_colour) - animate(client, color = anim_colour, time = anim_time, easing = anim_easing) + + var/anim_color = "" + if(length(client_colours)) + MIX_CLIENT_COLOUR(anim_color) + + for(var/atom/movable/screen/plane_master/game_plane as anything in hud_used.get_true_plane_masters(RENDER_PLANE_GAME)) + if(anim_color) + game_plane.add_filter(CLIENT_COLOR_FILTER_KEY, 2, color_matrix_filter()) + game_plane.transition_filter(CLIENT_COLOR_FILTER_KEY, color_matrix_filter(anim_color), anim_time, anim_easing) + else + game_plane.transition_filter(CLIENT_COLOR_FILTER_KEY, color_matrix_filter(), anim_time, anim_easing) + // This leaves a blank color filter on the hud which is, fine I guess? #undef MIX_CLIENT_COLOUR +#undef CLIENT_COLOR_FILTER_KEY + /datum/client_colour/glass_colour priority = PRIORITY_LOW @@ -228,6 +242,9 @@ priority = PRIORITY_ABSOLUTE colour = COLOR_RED +/datum/client_colour/temp + priority = PRIORITY_HIGH + #undef PRIORITY_ABSOLUTE #undef PRIORITY_HIGH #undef PRIORITY_NORMAL diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 15a8e4454fc1e..45ccda8b92bd1 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -240,6 +240,9 @@ var/list/keys_held = list() /// A buffer for combinations such of modifiers + keys (ex: CtrlD, AltE, ShiftT). Format: `"key"` -> `"combo"` (ex: `"D"` -> `"CtrlD"`) var/list/key_combos_held = list() + /// The direction we WANT to move, based off our keybinds + /// Will be udpated to be the actual direction later on + var/intended_direction = NONE /* ** These next two vars are to apply movement for keypresses and releases made while move delayed. ** Because discarding that input makes the game less responsive. diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 3c0b5aa1db3b0..5de1341358230 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -1012,6 +1012,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( winset(src, "default-[REF(key)]", "parent=default;name=[key];command=[asay]") else winset(src, "default-[REF(key)]", "parent=default;name=[key];command=") + calculate_move_dir() /client/proc/change_view(new_size) if (isnull(new_size)) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 96ad34b315868..3d930ce898904 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -213,7 +213,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Sanitize lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) - toggles = sanitize_integer(toggles, 0, (2**24)-1, initial(toggles)) + toggles = sanitize_integer(toggles, 0, SHORT_REAL_LIMIT-1, initial(toggles)) be_special = sanitize_be_special(SANITIZE_LIST(be_special)) key_bindings = sanitize_keybindings(key_bindings) favorite_outfits = SANITIZE_LIST(favorite_outfits) diff --git a/code/modules/clothing/chameleon/chameleon_action_subtypes.dm b/code/modules/clothing/chameleon/chameleon_action_subtypes.dm index c4ee98acd5105..275b2c6e0fc2a 100644 --- a/code/modules/clothing/chameleon/chameleon_action_subtypes.dm +++ b/code/modules/clothing/chameleon/chameleon_action_subtypes.dm @@ -282,7 +282,6 @@ /obj/item/camera/siliconcam, /obj/item/door_remote/omni, /obj/item/flashlight/emp/debug, - /obj/item/flashlight/eyelight/adapted, /obj/item/flashlight/flare, /obj/item/flashlight/lamp, /obj/item/healthanalyzer/rad_laser, diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 3f5503ca0eed6..0c48cb102b248 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -41,13 +41,13 @@ /obj/item/clothing/gloves/worn_overlays(mutable_appearance/standing, isinhands = FALSE) . = ..() - if(!isinhands) + if(isinhands) return if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves") if(GET_ATOM_BLOOD_DNA_LENGTH(src)) - . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands") + . += mutable_appearance('icons/effects/blood.dmi', "gloveblood") /obj/item/clothing/gloves/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED) ..() diff --git a/code/modules/clothing/gloves/combat.dm b/code/modules/clothing/gloves/combat.dm index 770308227163f..efc5bd40b0587 100644 --- a/code/modules/clothing/gloves/combat.dm +++ b/code/modules/clothing/gloves/combat.dm @@ -24,3 +24,9 @@ icon_state = "wizard" greyscale_colors = null inhand_icon_state = null + +/obj/item/clothing/gloves/combat/floortile + name = "floortile camouflage gloves" + desc = "Is it just me or is there a pair of gloves on the floor?" + icon_state = "ftc_gloves" + inhand_icon_state = "greyscale_gloves" diff --git a/code/modules/clothing/head/cakehat.dm b/code/modules/clothing/head/cakehat.dm index 4a05ff7116fff..57369ac24f89c 100644 --- a/code/modules/clothing/head/cakehat.dm +++ b/code/modules/clothing/head/cakehat.dm @@ -10,7 +10,7 @@ righthand_file = 'icons/mob/inhands/clothing/hats_righthand.dmi' armor_type = /datum/armor/none light_range = 2 //luminosity when on - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT flags_cover = HEADCOVERSEYES heat = 999 wound_bonus = 10 diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 71be68036bf16..2129c598aae25 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -13,7 +13,7 @@ clothing_flags = SNUG_FIT | STACKABLE_HELMET_EXEMPT resistance_flags = FIRE_PROOF - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 4 light_power = 0.8 light_on = FALSE @@ -23,7 +23,7 @@ var/hat_type = "yellow" ///Whether the headlamp is on or off. var/on = FALSE - + clothing_traits = list(TRAIT_HEAD_INJURY_BLOCKED) /datum/armor/utility_hardhat melee = 15 @@ -216,6 +216,7 @@ light_color = "#fff2bf" worn_y_offset = 1 dog_fashion = /datum/dog_fashion/head/pumpkin/unlit + clothing_traits = list() /obj/item/clothing/head/utility/hardhat/pumpkinhead/set_light_on(new_value) . = ..() @@ -269,6 +270,6 @@ flags_inv = 0 armor_type = /datum/armor/none light_range = 1 //luminosity when on - + clothing_traits = list() dog_fashion = /datum/dog_fashion/head/reindeer diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 2960260255fbc..7741251f3f5b2 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -184,6 +184,7 @@ visor_flags_inv = HIDEFACE|HIDESNOUT flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + clothing_traits = list(TRAIT_HEAD_INJURY_BLOCKED) /datum/armor/toggleable_riot melee = 50 @@ -247,6 +248,7 @@ strip_delay = 80 resistance_flags = FIRE_PROOF | ACID_PROOF dog_fashion = null + clothing_traits = list(TRAIT_HEAD_INJURY_BLOCKED) /datum/armor/helmet_swat melee = 40 @@ -394,6 +396,7 @@ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH strip_delay = 80 dog_fashion = null + clothing_traits = list(TRAIT_HEAD_INJURY_BLOCKED) /datum/armor/helmet_knight melee = 50 diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index e8338f4c95b19..0b0a6fb4d50cb 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -135,6 +135,15 @@ strip_delay = 60 dog_fashion = null +/obj/item/clothing/head/soft/veteran + name = "veteran cap" + desc = "It's a robust baseball hat in tasteful black colour with a golden connotation to \"REMEMBER\"." + icon_state = "veteransoft" + soft_type = "veteran" + armor_type = /datum/armor/cosmetic_sec + strip_delay = 60 + dog_fashion = null + /obj/item/clothing/head/soft/paramedic name = "paramedic cap" desc = "It's a baseball hat with a dark turquoise color and a reflective cross on the top." diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index 0bcd0e14382c3..23fc2272229af 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -8,6 +8,7 @@ strip_delay = 40 equip_delay_other = 40 var/modifies_speech = FALSE + ///Whether the mask is pushed out of the food hole or not. var/mask_adjusted = FALSE var/adjusted_flags = null ///Did we install a filtering cloth? diff --git a/code/modules/clothing/masks/bandana.dm b/code/modules/clothing/masks/bandana.dm index da9efa593ddf7..b3a0c4e6af58f 100644 --- a/code/modules/clothing/masks/bandana.dm +++ b/code/modules/clothing/masks/bandana.dm @@ -200,3 +200,34 @@ desc = "A fine black bandana with nanotech lining and a skull emblem." greyscale_colors = "#2e2e2e#C6C6C6" flags_1 = NONE + +/obj/item/clothing/mask/facescarf + name = "facescarf" + desc = "Cover your face like in the cowboy movies. It also has breathtube so you can wear it everywhere!" + actions_types = /datum/action/item_action/adjust + icon_state = "facescarf" + inhand_icon_state = "greyscale_facescarf" + alternate_worn_layer = BACK_LAYER + clothing_flags = BLOCK_GAS_SMOKE_EFFECT|MASKINTERNALS + flags_inv = HIDEFACIALHAIR | HIDEFACE | HIDESNOUT + w_class = WEIGHT_CLASS_SMALL + visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + visor_flags_inv = HIDEFACIALHAIR | HIDEFACE | HIDESNOUT + flags_cover = MASKCOVERSMOUTH + visor_flags_cover = MASKCOVERSMOUTH + custom_price = PAYCHECK_CREW + greyscale_colors = "#eeeeee" + greyscale_config = /datum/greyscale_config/facescarf + greyscale_config_worn = /datum/greyscale_config/facescarf/worn + greyscale_config_inhand_left = /datum/greyscale_config/facescarf/inhands_left + greyscale_config_inhand_right = /datum/greyscale_config/facescarf/inhands_right + flags_1 = IS_PLAYER_COLORABLE_1 + +/obj/item/clothing/mask/facescarf/AltClick(mob/user) + ..() + if(user.can_perform_action(src, NEED_DEXTERITY)) + adjustmask(user) + +/obj/item/clothing/mask/facescarf/examine(mob/user) + . = ..() + . += span_notice("Alt-click [src] to adjust it.") diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 9c947b53a9399..78ba0764b81ec 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -12,6 +12,21 @@ /obj/item/clothing/mask/balaclava/attack_self(mob/user) adjustmask(user) +/obj/item/clothing/mask/floortilebalaclava + name = "floortile balaclava" + desc = "The newest floortile camouflage balaclava used for hallway warfare. \ + The best breathability, flexibility and comfort. Designed by Camo-J's." + icon_state = "floortile_balaclava" + inhand_icon_state = "balaclava" + flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT + visor_flags_inv = HIDEFACE|HIDEFACIALHAIR|HIDESNOUT + alternate_worn_layer = LOW_FACEMASK_LAYER + w_class = WEIGHT_CLASS_SMALL + actions_types = list(/datum/action/item_action/adjust) + +/obj/item/clothing/mask/floortilebalaclava/attack_self(mob/user) + adjustmask(user) + /obj/item/clothing/mask/luchador name = "Luchador Mask" desc = "Worn by robust fighters, flying high to defeat their foes!" diff --git a/code/modules/clothing/masks/costume.dm b/code/modules/clothing/masks/costume.dm index 7eb5da57743ff..384b6a4346009 100644 --- a/code/modules/clothing/masks/costume.dm +++ b/code/modules/clothing/masks/costume.dm @@ -39,3 +39,29 @@ icon_state = "scarecrow_sack" inhand_icon_state = null flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT + +/obj/item/clothing/mask/kitsune + name = "kitsune mask" + desc = "Porcelain mask made in the style of the Sol-3 region. It is painted to look like a kitsune." + icon_state = "kitsune" + inhand_icon_state = null + w_class = WEIGHT_CLASS_SMALL + flags_inv = HIDEFACE|HIDEFACIALHAIR + custom_price = PAYCHECK_CREW + greyscale_colors = "#EEEEEE#AA0000" + greyscale_config = /datum/greyscale_config/kitsune + greyscale_config_worn = /datum/greyscale_config/kitsune/worn + flags_1 = IS_PLAYER_COLORABLE_1 + +/obj/item/clothing/mask/rebellion + name = "rebellion mask" + desc = "Mask that is usually used during rebellions by insurgents. It covers the entire face and makes you unrecognizable." + icon_state = "rebellion_mask" + inhand_icon_state = null + w_class = WEIGHT_CLASS_SMALL + flags_inv = HIDEFACE|HIDEFACIALHAIR|HIDESNOUT + custom_price = PAYCHECK_CREW + greyscale_colors = "#EEEEEE" + greyscale_config = /datum/greyscale_config/rebellion_mask + greyscale_config_worn = /datum/greyscale_config/rebellion_mask/worn + flags_1 = IS_PLAYER_COLORABLE_1 diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index a74d8bfca401c..f5653bcacba91 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -29,6 +29,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( ///Cigarette in the mask var/obj/item/clothing/mask/cigarette/cig voice_filter = "lowpass=f=750,volume=2" + /datum/armor/mask_gas bio = 100 diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index cdfa38ba5d2d2..67b50fbe67213 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -469,7 +469,7 @@ 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." : ""]")) if(selling) - new /obj/item/holochip(get_turf(user),true_price) + 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.")) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index d74bbbe56553b..fcf0de64a5e47 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -22,6 +22,7 @@ var/lace_time = 5 SECONDS ///An active alert var/datum/weakref/our_alert_ref + var/footprint_sprite = FOOTPRINT_SPRITE_SHOES /datum/armor/clothing_shoes bio = 50 diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm index b359f94db3da5..dbfa4f8b3c40d 100644 --- a/code/modules/clothing/shoes/boots.dm +++ b/code/modules/clothing/shoes/boots.dm @@ -64,6 +64,12 @@ /obj/item/clothing/shoes/jackboots/sec icon_state = "jackboots_sec" +/obj/item/clothing/shoes/jackboots/floortile + name = "floortile camouflage jackboots" + desc = "Is it just me or is there a pair of jackboots on the floor?" + icon_state = "ftc_boots" + inhand_icon_state = null + /obj/item/clothing/shoes/winterboots name = "winter boots" desc = "Boots lined with 'synthetic' animal fur." diff --git a/code/modules/clothing/shoes/clown.dm b/code/modules/clothing/shoes/clown.dm index dea346b8613b2..aff47fde7fabe 100644 --- a/code/modules/clothing/shoes/clown.dm +++ b/code/modules/clothing/shoes/clown.dm @@ -20,13 +20,13 @@ . = ..() if(slot & ITEM_SLOT_FEET) if(enabled_waddle) - user.AddElement(/datum/element/waddling) + user.AddElementTrait(TRAIT_WADDLING, SHOES_TRAIT, /datum/element/waddling) if(is_clown_job(user.mind?.assigned_role)) user.add_mood_event("clownshoes", /datum/mood_event/clownshoes) /obj/item/clothing/shoes/clown_shoes/dropped(mob/living/user) . = ..() - user.RemoveElement(/datum/element/waddling) + REMOVE_TRAIT(user, TRAIT_WADDLING, SHOES_TRAIT) if(is_clown_job(user.mind?.assigned_role)) user.clear_mood_event("clownshoes") diff --git a/code/modules/clothing/shoes/costume.dm b/code/modules/clothing/shoes/costume.dm index 1a3e9b0b2beb7..1e15f25e1f630 100644 --- a/code/modules/clothing/shoes/costume.dm +++ b/code/modules/clothing/shoes/costume.dm @@ -128,8 +128,8 @@ /obj/item/clothing/shoes/ducky_shoes/equipped(mob/living/user, slot) . = ..() if(slot & ITEM_SLOT_FEET) - user.AddElement(/datum/element/waddling) + user.AddElementTrait(TRAIT_WADDLING, SHOES_TRAIT, /datum/element/waddling) /obj/item/clothing/shoes/ducky_shoes/dropped(mob/living/user) . = ..() - user.RemoveElement(/datum/element/waddling) + REMOVE_TRAIT(user, TRAIT_WADDLING, SHOES_TRAIT) diff --git a/code/modules/clothing/shoes/kindlekicks.dm b/code/modules/clothing/shoes/kindlekicks.dm index 82bcb806515f1..339ec9669af3b 100644 --- a/code/modules/clothing/shoes/kindlekicks.dm +++ b/code/modules/clothing/shoes/kindlekicks.dm @@ -4,7 +4,7 @@ icon_state = "kindleKicks" inhand_icon_state = null actions_types = list(/datum/action/item_action/kindle_kicks) - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 2 light_power = 3 light_on = FALSE diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 30e43c793aacf..90141d281dd31 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -52,7 +52,7 @@ tint = 2 armor_type = /datum/armor/space_plasmaman resistance_flags = FIRE_PROOF - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 4 light_on = FALSE var/helmet_on = FALSE diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index ef10536341e98..47bd32280ed89 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -282,7 +282,7 @@ armor_type = /datum/armor/armor_riot strip_delay = 80 equip_delay_other = 60 - clothing_traits = list(TRAIT_SHOVE_KNOCKDOWN_BLOCKED) + clothing_traits = list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED) /datum/armor/armor_riot melee = 50 @@ -386,7 +386,7 @@ max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT slowdown = 0.7 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - clothing_traits = list(TRAIT_SHOVE_KNOCKDOWN_BLOCKED) + clothing_traits = list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED) //All of the armor below is mostly unused diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 45152f7569ae5..20a117e112e48 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -151,7 +151,7 @@ if((supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION) && ishuman(user)) var/mob/living/carbon/human/wearer = user - if(wearer.bodytype & BODYTYPE_DIGITIGRADE) + if(wearer.bodyshape & BODYSHAPE_DIGITIGRADE) adjusted = DIGITIGRADE_STYLE update_appearance() diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index 20a5cda059202..3a27ee6c1ebb2 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -111,6 +111,15 @@ can_adjust = FALSE supports_variations_flags = NONE +/obj/item/clothing/under/syndicate/floortilecamo + name = "floortile camouflage fatigues" + desc = "The newest floortile camouflage fatigues used for hallway warfare. \ + The best breathability, flexibility and comfort. Designed by Camo-J's." + icon_state = "camofloortile" + inhand_icon_state = "gy_suit" + can_adjust = FALSE + supports_variations_flags = NONE + /obj/item/clothing/under/syndicate/soviet name = "Ratnik 5 tracksuit" desc = "Badly translated labels tell you to clean this in Vodka. Great for squatting in." diff --git a/code/modules/deathmatch/deathmatch_controller.dm b/code/modules/deathmatch/deathmatch_controller.dm new file mode 100644 index 0000000000000..c288daefd4e1c --- /dev/null +++ b/code/modules/deathmatch/deathmatch_controller.dm @@ -0,0 +1,125 @@ +/datum/deathmatch_controller + /// Assoc list of all lobbies (ckey = lobby) + var/list/datum/deathmatch_lobby/lobbies = list() + /// All deathmatch map templates + var/list/datum/lazy_template/deathmatch/maps = list() + /// All loadouts + var/list/datum/outfit/loadouts + +/datum/deathmatch_controller/New() + . = ..() + if (GLOB.deathmatch_game) + qdel(src) + CRASH("A deathmatch controller already exists.") + GLOB.deathmatch_game = src + + for (var/datum/lazy_template/deathmatch/template as anything in subtypesof(/datum/lazy_template/deathmatch)) + var/map_name = initial(template.name) + maps[map_name] = new template + loadouts = subtypesof(/datum/outfit/deathmatch_loadout) + +/datum/deathmatch_controller/proc/create_new_lobby(mob/host) + lobbies[host.ckey] = new /datum/deathmatch_lobby(host) + deadchat_broadcast(" has opened a new deathmatch lobby. (Join)", "[host]") + +/datum/deathmatch_controller/proc/remove_lobby(ckey) + var/lobby = lobbies[ckey] + lobbies[ckey] = null + lobbies.Remove(ckey) + qdel(lobby) + +/datum/deathmatch_controller/proc/passoff_lobby(host, new_host) + lobbies[new_host] = lobbies[host] + lobbies[host] = null + lobbies.Remove(host) + +/datum/deathmatch_controller/ui_state(mob/user) + return GLOB.observer_state + +/datum/deathmatch_controller/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, null) + if(!ui) + ui = new(user, src, "DeathmatchPanel") + ui.open() + +/datum/deathmatch_controller/ui_data(mob/user) + . = ..() + .["lobbies"] = list() + .["hosting"] = FALSE + .["admin"] = check_rights_for(user.client, R_ADMIN) + for (var/ckey in lobbies) + var/datum/deathmatch_lobby/lobby = lobbies[ckey] + if (user.ckey == ckey) + .["hosting"] = TRUE + if (user.ckey in lobby.observers+lobby.players) + .["playing"] = ckey + .["lobbies"] += list(list( + name = ckey, + players = lobby.players.len, + max_players = initial(lobby.map.max_players), + map = initial(lobby.map.name), + playing = lobby.playing + )) + +/datum/deathmatch_controller/proc/find_lobby_by_user(ckey) + for(var/lobbykey in lobbies) + var/datum/deathmatch_lobby/lobby = lobbies[lobbykey] + if(ckey in lobby.players+lobby.observers) + return lobby + +/datum/deathmatch_controller/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(. || !isobserver(usr)) + return + switch (action) + if ("host") + if (lobbies[usr.ckey]) + return + if(!SSticker.HasRoundStarted()) + tgui_alert(usr, "The round hasn't started yet!") + return + ui.close() + create_new_lobby(usr) + if ("join") + if (!lobbies[params["id"]]) + return + var/datum/deathmatch_lobby/playing_lobby = find_lobby_by_user(usr.ckey) + var/datum/deathmatch_lobby/chosen_lobby = lobbies[params["id"]] + if (!isnull(playing_lobby) && playing_lobby != chosen_lobby) + playing_lobby.leave(usr.ckey) + + if(isnull(playing_lobby)) + log_game("[usr.ckey] joined deathmatch lobby [params["id"]] as a player.") + chosen_lobby.join(usr) + + chosen_lobby.ui_interact(usr) + if ("spectate") + var/datum/deathmatch_lobby/playing_lobby = find_lobby_by_user(usr.ckey) + if (!lobbies[params["id"]]) + return + var/datum/deathmatch_lobby/chosen_lobby = lobbies[params["id"]] + // if the player is in this lobby + if(!isnull(playing_lobby) && playing_lobby != chosen_lobby) + playing_lobby.leave(usr.ckey) + else if(playing_lobby == chosen_lobby) + chosen_lobby.ui_interact(usr) + return + // they werent in the lobby, lets add them + if (!chosen_lobby.playing) + chosen_lobby.add_observer(usr) + chosen_lobby.ui_interact(usr) + else + chosen_lobby.spectate(usr) + log_game("[usr.ckey] joined deathmatch lobby [params["id"]] as an observer.") + if ("admin") + if (!check_rights(R_ADMIN)) + message_admins("[usr.key] has attempted to use admin functions in the deathmatch panel!") + log_admin("[key_name(usr)] tried to use the deathmatch panel admin functions without authorization.") + return + var/lobby = params["id"] + switch (params["func"]) + if ("Close") + remove_lobby(lobby) + log_admin("[key_name(usr)] removed deathmatch lobby [lobby].") + if ("View") + lobbies[lobby].ui_interact(usr) diff --git a/code/modules/deathmatch/deathmatch_loadouts.dm b/code/modules/deathmatch/deathmatch_loadouts.dm new file mode 100644 index 0000000000000..f994987427e86 --- /dev/null +++ b/code/modules/deathmatch/deathmatch_loadouts.dm @@ -0,0 +1,379 @@ +/datum/outfit/deathmatch_loadout //remember that fun > balance + name = "" + shoes = /obj/item/clothing/shoes/sneakers/black // im not doing this on all of them + /// Name shown in the UI + var/display_name = "" + /// Description shown in the UI + var/desc = ":KILL:" + /// If defined, using this outfit sets the targets species to it + var/datum/species/species_override + /// This outfit will grant these spells if applied + var/list/granted_spells = list() + +/datum/outfit/deathmatch_loadout/pre_equip(mob/living/carbon/human/user, visualsOnly = FALSE) + . = ..() + if(isdummy(user)) + return + + if(!isnull(species_override)) + user.set_species(species_override) + else if (istype(user.dna.species.outfit_important_for_life)) //plasmamen get lit on fire and die + user.set_species(/datum/species/human) + for(var/datum/action/act as anything in granted_spells) + var/datum/action/new_ability = new act(user) + new_ability.Grant(user) + +/datum/outfit/deathmatch_loadout/naked + name = "Deathmatch: Naked" + display_name = "Unarmed, Butt-naked" + desc = "Naked man craves for bloodshed." + shoes = null + +/datum/outfit/deathmatch_loadout/assistant + name = "Deathmatch: Assistant loadout" + display_name = "Assistant" + desc = "A simple assistant loadout: greyshirt and a toolbox" + + l_hand = /obj/item/storage/toolbox/mechanical + uniform = /obj/item/clothing/under/color/grey + back = /obj/item/storage/backpack + box = /obj/item/storage/box/survival + belt = /obj/item/flashlight + +/datum/outfit/deathmatch_loadout/assistant/weaponless + name = "Deathmatch: Assistant loadout (Weaponless)" + display_name = "Assistant (Unarmed)" + desc = "What is an assistant without a toolbox? nothing" + l_hand = null + +/datum/outfit/deathmatch_loadout/operative + name = "Deathmatch: Operative" + display_name = "Operative" + desc = "A syndicate operative." + + uniform = /obj/item/clothing/under/syndicate + shoes = /obj/item/clothing/shoes/combat + gloves = /obj/item/clothing/gloves/combat + back = /obj/item/storage/backpack + id = /obj/item/card/id/advanced/chameleon + +/datum/outfit/deathmatch_loadout/operative/ranged + name = "Deathmatch: Ranged Operative" + display_name = "Ranged Operative" + desc = "A syndicate operative with a gun and a knife." + + l_hand = /obj/item/gun/ballistic/automatic/pistol + l_pocket = /obj/item/knife/combat + backpack_contents = list(/obj/item/ammo_box/magazine/m9mm = 5) + +/datum/outfit/deathmatch_loadout/operative/melee + name = "Deathmatch: Melee Operative" + display_name = "Melee Operative" + desc = "A syndicate operative with multiple knives." + + gloves = /obj/item/clothing/gloves/tackler/combat/insulated + suit = /obj/item/clothing/suit/armor/vest + head = /obj/item/clothing/head/helmet + backpack_contents = list(/obj/item/knife/combat = 6) + l_hand = /obj/item/knife/combat + l_pocket = /obj/item/knife/combat + +/datum/outfit/deathmatch_loadout/securing_sec + name = "Deathmatch: Security Officer" + display_name = "Security Officer" + desc = "A security officer." + + uniform = /datum/outfit/job/security::uniform + suit = /datum/outfit/job/security::suit + suit_store = /datum/outfit/job/security::suit_store + belt = /datum/outfit/job/security::belt + ears = /datum/outfit/job/security::ears //cant communicate with station i think? + gloves = /datum/outfit/job/security::gloves + head = /datum/outfit/job/security::head + shoes = /datum/outfit/job/security::shoes + l_pocket = /obj/item/flashlight/seclite + l_hand = /obj/item/gun/energy/disabler + r_pocket = /obj/item/knife/combat/survival + back = /datum/outfit/job/security::backpack + box = /datum/outfit/job/security::box + implants = list(/obj/item/implant/mindshield) + +/datum/outfit/deathmatch_loadout/assistant/instagib + name = "DM: Instagib" + display_name = "Instagib" + desc = "Assistant with an instakill rifle." + + l_hand = /obj/item/gun/energy/laser/instakill + +/datum/outfit/deathmatch_loadout/operative/sniper + name = "Deathmatch: Sniper" + display_name = "Sniper" + desc = "You know what do you need to do" + backpack_contents = list( + /obj/item/ammo_box/magazine/sniper_rounds = 3, + ) + glasses = /obj/item/clothing/glasses/thermal + uniform = /obj/item/clothing/under/syndicate/sniper + gloves = /obj/item/clothing/gloves/tackler/combat/insulated + l_pocket = /obj/item/knife/combat + l_hand = /obj/item/gun/ballistic/rifle/sniper_rifle + +/datum/outfit/deathmatch_loadout/chef + name = "Deathmatch: Chef" + display_name = "Chef" + desc = "He love pizza." + uniform = /obj/item/clothing/under/costume/buttondown/slacks/service + suit = /obj/item/clothing/suit/toggle/chef + head = /obj/item/clothing/head/utility/chefhat + mask = /obj/item/clothing/mask/fakemoustache/italian + gloves = /obj/item/clothing/gloves/the_sleeping_carp + back = /obj/item/storage/backpack + backpack_contents = list( + /obj/item/sharpener, + ) + +/datum/outfit/deathmatch_loadout/samurai + name = "Deathmatch: Samurai" + display_name = "Samurai" + desc = "Bare-footed man craves to bloodshed." + l_hand = /obj/item/katana + uniform = /obj/item/clothing/under/costume/gi + +/// battlers + +/datum/outfit/deathmatch_loadout/battler + name = "Deathmatch: Battler Base" + display_name = "Battler" + desc = "What is a battler whith out weapone?." + + shoes = /obj/item/clothing/shoes/combat + uniform = /obj/item/clothing/under/syndicate + gloves = /obj/item/clothing/gloves/combat + back = /obj/item/storage/backpack + id = /obj/item/card/id/advanced/chameleon + +/datum/outfit/deathmatch_loadout/battler/soldier + name = "Deathmatch: Soldier" + display_name = "Soldier" + desc = "Ready for combat." + + l_hand = /obj/item/gun/ballistic/rifle/boltaction + l_pocket = /obj/item/knife/combat + uniform = /obj/item/clothing/under/syndicate/rus_army + suit = /obj/item/clothing/suit/armor/vest + head = /obj/item/clothing/head/helmet/rus_helmet + gloves = /obj/item/clothing/gloves/tackler/combat/insulated + + backpack_contents = list( + /obj/item/grenade/smokebomb = 2, + /obj/item/ammo_box/strilka310 = 2, + ) + +/datum/outfit/deathmatch_loadout/battler/druid + name = "Deathmatch: Druid" + display_name = "Druid" + desc = "How can plants help you?" + species_override = /datum/species/pod + l_hand = /obj/item/gun/ballistic/bow + r_hand = /obj/item/ammo_casing/arrow + l_pocket = /obj/item/knife/shiv/carrot + r_pocket = /obj/item/flashlight/lantern + head = /obj/item/food/grown/ambrosia/gaia + uniform = /obj/item/clothing/under/shorts/green + mask = /obj/item/clothing/mask/gas/tiki_mask + glasses = /obj/item/clothing/glasses/thermal + gloves = /obj/item/clothing/gloves/botanic_leather + belt = /obj/item/gun/syringe/blowgun + back = /obj/item/storage/backpack/saddlepack + shoes = /obj/item/clothing/shoes/sandal + backpack_contents = list( + /obj/item/reagent_containers/syringe/crude/mushroom = 1, + /obj/item/reagent_containers/syringe/crude/blastoff = 1, + /obj/item/ammo_casing/arrow = 2, + /obj/item/food/grown/nettle/death = 2, + /obj/item/food/grown/banana = 2, + /obj/item/food/grown/cherry_bomb = 2, + /obj/item/food/grown/mushroom/walkingmushroom = 2, + /obj/item/seeds/kudzu = 1, + ) + +/datum/outfit/deathmatch_loadout/battler/northstar + name = "Deathmatch: North Star" + display_name = "North Star" + desc = "flip flip flip" + + uniform = /obj/item/clothing/under/suit/carpskin + head = /obj/item/clothing/head/fedora/carpskin + gloves = /obj/item/clothing/gloves/rapid + backpack_contents = list( + /obj/item/throwing_star = 6, + /obj/item/restraints/legcuffs/bola/tactical = 2, + ) + +/datum/outfit/deathmatch_loadout/battler/janitor + name = "Deathmatch: Janitor" + display_name = "Janitor" + desc = "Regular work" + + uniform = /obj/item/clothing/under/rank/civilian/janitor + suit = /obj/item/clothing/suit/caution + head = /obj/item/reagent_containers/cup/bucket + shoes = /obj/item/clothing/shoes/chameleon/noslip + l_hand = /obj/item/pushbroom + l_pocket = /obj/item/reagent_containers/spray/waterflower/lube + backpack_contents = list( + /obj/item/grenade/chem_grenade/cleaner = 2, + /obj/item/restraints/legcuffs/beartrap = 3, + /obj/item/soap, + ) + +/datum/outfit/deathmatch_loadout/battler/surgeon + name = "Deathmatch: Surgeon" + display_name = "Surgeon" + desc = "Treatment has come" + + uniform = /obj/item/clothing/under/rank/medical/scrubs/blue + suit = /obj/item/clothing/suit/apron/surgical + head = /obj/item/clothing/head/utility/surgerycap + mask = /obj/item/clothing/mask/surgical + glasses = /obj/item/clothing/glasses/hud/health/night + l_pocket = /obj/item/reagent_containers/hypospray/combat + r_pocket = /obj/item/reagent_containers/hypospray/medipen/penthrite + l_hand = /obj/item/chainsaw + + backpack_contents = list( + /obj/item/storage/medkit/tactical, + /obj/item/reagent_containers/hypospray/medipen/stimulants, + ) + +/datum/outfit/deathmatch_loadout/battler/raider + name = "Deathmatch: Raider" + display_name = "Raider" + desc = "Not from Shadow Legends" + + l_hand = /obj/item/nullrod/claymore/chainsaw_sword + r_pocket = /obj/item/switchblade + uniform = /obj/item/clothing/under/costume/jabroni + back = /obj/item/spear + belt = /obj/item/gun/magic/hook + head = /obj/item/clothing/head/utility/welding + +/datum/outfit/deathmatch_loadout/battler/clown + name = "DM: Clown" + display_name = "Clown (Man Of Honk)" + desc = "Who called this honking clown" + + uniform = /datum/outfit/job/clown::uniform + belt = /datum/outfit/job/clown::belt + shoes = /datum/outfit/job/clown::shoes + mask = /datum/outfit/job/clown::mask + l_pocket = /datum/outfit/job/clown::l_pocket + back = /datum/outfit/job/clown::backpack + box = /datum/outfit/job/clown::box + implants = list(/obj/item/implant/sad_trombone) + l_pocket = /obj/item/melee/energy/sword/bananium + r_pocket = /obj/item/shield/energy/bananium + gloves = /obj/item/clothing/gloves/tackler/rocket + + backpack_contents = list( + /obj/item/reagent_containers/spray/waterflower = 1, + /obj/item/instrument/bikehorn = 1, + /obj/item/bikehorn/airhorn = 1, + /obj/item/food/grown/banana = 3, + /obj/item/food/pie/cream = 2, + ) + +/datum/outfit/deathmatch_loadout/battler/tgcoder //tg doesnt stand for tgstation dont ask + name = "Deathmatch: Coder" + display_name = "Coder" + desc = "What" + + l_hand = /obj/item/toy/katana + uniform = /obj/item/clothing/under/costume/schoolgirl + suit = /obj/item/clothing/suit/costume/joker + shoes = /obj/item/clothing/shoes/clown_shoes/meown_shoes + head = /obj/item/clothing/head/costume/kitty + backpack_contents = list( + /obj/item/reagent_containers/cup/soda_cans/pwr_game = 10, + ) + +/datum/outfit/deathmatch_loadout/battler/enginer + name = "Deathmatch: Engineer" + display_name = "Engineer" + desc = "Meet the engineer" + + l_hand = /obj/item/storage/toolbox/emergency/turret + uniform = /obj/item/clothing/under/rank/engineering/engineer + shoes = /obj/item/clothing/shoes/magboots + head = /obj/item/clothing/head/utility/hardhat + back = /obj/item/fireaxe + gloves = /obj/item/clothing/gloves/color/yellow + +/datum/outfit/deathmatch_loadout/battler/scientist + name = "Deathmatch: Scientist" + display_name = "Scientist" + desc = "What a nerd" + + uniform = /obj/item/clothing/under/rank/rnd/scientist + suit = /obj/item/clothing/suit/armor/reactive/stealth + mask = /obj/item/clothing/mask/gas + l_hand = /obj/item/reagent_containers/syringe/plasma + l_pocket = /obj/item/slimecross/stabilized/sepia + r_pocket = /obj/item/slimecross/stabilized/purple + backpack_contents = list( + /obj/item/reagent_containers/cup/bottle/plasma, + /obj/item/slimecross/burning/grey, + /obj/item/slimecross/burning/adamantine, + /obj/item/slimecross/burning/gold, + /obj/item/slimecross/burning/blue, + /obj/item/slimecross/burning/sepia, + /obj/item/slimecross/chilling/green, + /obj/item/slimecross/chilling/grey, + /obj/item/slimecross/industrial/oil, + /obj/item/slimecross/charged/silver, + /obj/item/slimecross/charged/black, + /obj/item/slimecross/burning/rainbow, + /obj/item/slimecross/chilling/adamantine, + ) + +/datum/outfit/deathmatch_loadout/battler/bloodminer + name = "Deathmatch: Blood Miner" + display_name = "Blood Miner" + desc = "Rip and tear!!!" + + l_hand = /obj/item/melee/cleaving_saw + r_hand = /obj/item/gun/energy/recharge/kinetic_accelerator + uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland + suit = /obj/item/clothing/suit/hooded/explorer + shoes = /obj/item/clothing/shoes/workboots/mining + mask = /obj/item/clothing/mask/gas/explorer + granted_spells = list( + /datum/action/cooldown/mob_cooldown/dash, + ) + +/datum/outfit/deathmatch_loadout/battler/ripper + name = "Deathmatch: Ripper" + display_name = "Ripper" + desc = "Die die die!!!" + + l_hand = /obj/item/gun/ballistic/shotgun/hook + r_hand = /obj/item/gun/ballistic/shotgun/hook + uniform = /obj/item/clothing/under/costume/skeleton + suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch + mask = /obj/item/clothing/mask/gas/cyborg + shoes = /obj/item/clothing/shoes/sandal + belt = /obj/item/melee/cleric_mace + +/datum/outfit/deathmatch_loadout/battler/cowboy + name = "Deathmatch: Cowboy" + display_name = "Cowboy" + desc = "Yeehaw partner" + + r_hand = /obj/item/clothing/mask/cigarette/cigar + l_hand = /obj/item/melee/curator_whip + l_pocket = /obj/item/lighter + accessory = /obj/item/clothing/accessory/vest_sheriff + uniform = /obj/item/clothing/under/rank/security/detective + shoes = /obj/item/clothing/shoes/cowboy + belt = /obj/item/storage/belt/holster/detective/full + head = /obj/item/clothing/head/cowboy/brown diff --git a/code/modules/deathmatch/deathmatch_lobby.dm b/code/modules/deathmatch/deathmatch_lobby.dm new file mode 100644 index 0000000000000..e498f662b5e39 --- /dev/null +++ b/code/modules/deathmatch/deathmatch_lobby.dm @@ -0,0 +1,450 @@ +/datum/deathmatch_lobby + /// Ckey of the host + var/host + /// Assoc list of ckey to list() + var/list/players = list() + /// Assoc list of ckey to list() + var/list/observers = list() + /// The current chosen map + var/datum/lazy_template/deathmatch/map + /// Our turf reservation AKA where the arena is + var/datum/turf_reservation/location + /// Whether players hear deadchat and people through walls + var/global_chat = FALSE + /// Whether the lobby is currently playing + var/playing = FALSE + /// Number of total ready players + var/ready_count + /// List of loadouts, either gotten from the deathmatch controller or the map + var/list/loadouts + /// Current map player spawn locations, cleared after spawning + var/list/player_spawns = list() + +/datum/deathmatch_lobby/New(mob/player) + . = ..() + if (!player) + stack_trace("Attempted to create a deathmatch lobby without a host.") + return qdel(src) + host = player.ckey + map = GLOB.deathmatch_game.maps[pick(GLOB.deathmatch_game.maps)] + log_game("[host] created a deathmatch lobby.") + if (map.allowed_loadouts) + loadouts = map.allowed_loadouts + else + loadouts = GLOB.deathmatch_game.loadouts + add_player(player, loadouts[1], TRUE) + ui_interact(player) + +/datum/deathmatch_lobby/Destroy(force, ...) + . = ..() + for (var/key in players+observers) + var/datum/tgui/ui = SStgui.get_open_ui(get_mob_by_ckey(key), src) + if (ui) ui.close() + remove_ckey_from_play(key) + if(playing && !isnull(location)) + clear_reservation() + players = null + observers = null + map = null + location = null + loadouts = null + +/datum/deathmatch_lobby/proc/start_game() + if (playing) + return + playing = TRUE + + RegisterSignal(map, COMSIG_LAZY_TEMPLATE_LOADED, PROC_REF(find_spawns_and_start_delay)) + location = map.lazy_load() + if (!location) + to_chat(get_mob_by_ckey(host), span_warning("Couldn't reserve/load a map location (all locations used?), try again later, or contact a coder.")) + playing = FALSE + UnregisterSignal(map, COMSIG_LAZY_TEMPLATE_LOADED) + return FALSE + +/datum/deathmatch_lobby/proc/find_spawns_and_start_delay(datum/lazy_template/source, list/atoms) + SIGNAL_HANDLER + for(var/thing in atoms) + if(istype(thing, /obj/effect/landmark/deathmatch_player_spawn)) + player_spawns += thing + + UnregisterSignal(source, COMSIG_LAZY_TEMPLATE_LOADED) + addtimer(CALLBACK(src, PROC_REF(start_game_after_delay)), 8 SECONDS) + +/datum/deathmatch_lobby/proc/start_game_after_delay() + if (!length(player_spawns) || length(player_spawns) < length(players)) + stack_trace("Failed to get spawns when loading deathmatch map [map.name] for lobby [host].") + clear_reservation() + playing = FALSE + return FALSE + + for (var/key in players) + var/mob/dead/observer/observer = players[key]["mob"] + if (isnull(observer) || !observer.client) + log_game("Removed player [key] from deathmatch lobby [host], as they couldn't be found.") + remove_ckey_from_play(key) + continue + + // pick spawn and remove it. + var/picked_spawn = pick_n_take(player_spawns) + spawn_observer_as_player(key, get_turf(picked_spawn)) + qdel(picked_spawn) + + // Remove rest of spawns. + QDEL_LIST(player_spawns) + + for (var/observer_key in observers) + var/mob/observer = observers[observer_key]["mob"] + observer.forceMove(pick(location.reserved_turfs)) + + addtimer(CALLBACK(src, PROC_REF(game_took_too_long)), initial(map.automatic_gameend_time)) + log_game("Deathmatch game [host] started.") + announce(span_reallybig("GO!")) + return TRUE + +/datum/deathmatch_lobby/proc/spawn_observer_as_player(ckey, loc) + var/mob/dead/observer/observer = players[ckey]["mob"] + if (isnull(observer) || !observer.client) + remove_ckey_from_play(ckey) + return + + // equip player + var/datum/outfit/deathmatch_loadout/loadout = players[ckey]["loadout"] + if (!(loadout in loadouts)) + loadout = loadouts[1] + + var/mob/living/carbon/human/new_player = new(loc) + observer.client?.prefs.safe_transfer_prefs_to(new_player) + new_player.dna.update_dna_identity() + new_player.updateappearance(icon_update = TRUE, mutcolor_update = TRUE, mutations_overlay_update = TRUE) + new_player.add_traits(list(TRAIT_CANNOT_CRYSTALIZE, TRAIT_PERMANENTLY_MORTAL), INNATE_TRAIT) + if(!isnull(observer.mind) && observer.mind?.current) + new_player.AddComponent( \ + /datum/component/temporary_body, \ + old_mind = observer.mind, \ + old_body = observer.mind.current, \ + ) + new_player.equipOutfit(loadout) // Loadout + new_player.key = ckey + players[ckey]["mob"] = new_player + + // register death handling. + RegisterSignals(new_player, list(COMSIG_LIVING_DEATH, COMSIG_MOB_GHOSTIZED, COMSIG_QDELETING), PROC_REF(player_died)) + if (global_chat) + ADD_TRAIT(new_player, TRAIT_SIXTHSENSE, INNATE_TRAIT) + ADD_TRAIT(new_player, TRAIT_XRAY_HEARING, INNATE_TRAIT) + +/datum/deathmatch_lobby/proc/game_took_too_long() + if (!location || QDELING(src)) + return + announce(span_reallybig("The players have took too long! Game ending!")) + end_game() + +/datum/deathmatch_lobby/proc/end_game() + if (!location) + CRASH("Reservation of deathmatch game [host] deleted during game.") + var/mob/winner + if(players.len) + var/list/winner_info = players[pick(players)] + if(!isnull(winner_info["mob"])) + winner = winner_info["mob"] //only one should remain anyway but incase of a draw + + announce(span_reallybig("THE GAME HAS ENDED.
    THE WINNER IS: [winner ? winner.real_name : "no one"].")) + + for(var/ckey in players) + var/mob/loser = players[ckey]["mob"] + UnregisterSignal(loser, list(COMSIG_MOB_GHOSTIZED, COMSIG_QDELETING)) + players[ckey]["mob"] = null + loser.ghostize() + qdel(loser) + + clear_reservation() + GLOB.deathmatch_game.remove_lobby(host) + log_game("Deathmatch game [host] ended.") + +/datum/deathmatch_lobby/proc/player_died(mob/living/player, gibbed) + SIGNAL_HANDLER + if(isnull(player) || QDELING(src)) + return + + var/ckey = player.ckey + if(!islist(players[ckey])) // potentially the player info could hold a reference to this mob so we can figure the ckey out without worrying about ghosting and suicides n such + for(var/potential_ckey in players) + var/list/player_info = players[potential_ckey] + if(player_info["mob"] && player_info["mob"] == player) + ckey = potential_ckey + break + + if(!islist(players[ckey])) // if we STILL didnt find a good ckey + return + + players -= ckey + + var/mob/dead/observer/ghost = !player.client ? player.get_ghost() : player.ghostize() //this doesnt work on those who used the ghost verb + if(!isnull(ghost)) + add_observer(ghost, (host == ckey)) + + announce(span_reallybig("[player.real_name] HAS DIED.
    [players.len] REMAIN.")) + + if(!gibbed && !QDELING(player)) // for some reason dusting or deleting in chasm storage messes up tgui bad + player.dust(TRUE, TRUE, TRUE) + if (players.len <= 1) + end_game() + +/datum/deathmatch_lobby/proc/add_observer(mob/mob, host = FALSE) + if (players[mob.ckey]) + CRASH("Tried to add [mob.ckey] as an observer while being a player.") + observers[mob.ckey] = list("mob" = mob, "host" = host) + +/datum/deathmatch_lobby/proc/add_player(mob/mob, loadout, host = FALSE) + if (observers[mob.ckey]) + CRASH("Tried to add [mob.ckey] as a player while being an observer.") + players[mob.ckey] = list("mob" = mob, "host" = host, "ready" = FALSE, "loadout" = loadout) + +/datum/deathmatch_lobby/proc/remove_ckey_from_play(ckey) + var/is_likely_player = (ckey in players) + var/list/main_list = is_likely_player ? players : observers + var/list/info = main_list[ckey] + if(is_likely_player && islist(info)) + ready_count -= info["ready"] + main_list -= ckey + +/datum/deathmatch_lobby/proc/announce(message) + for (var/key in players+observers) + var/mob/player = get_mob_by_ckey(key) + if (!player.client) + remove_ckey_from_play(key) + continue + to_chat(player.client, message) + +/datum/deathmatch_lobby/proc/leave(ckey) + if (host == ckey) + var/total_count = players.len + observers.len + if (total_count <= 1) // <= just in case. + GLOB.deathmatch_game.remove_lobby(host) + return + else + if (players[ckey] && players.len <= 1) + for (var/key in observers) + if (host == key) + continue + host = key + observers[key]["host"] = TRUE + break + else + for (var/key in players) + if (host == key) + continue + host = key + players[key]["host"] = TRUE + break + GLOB.deathmatch_game.passoff_lobby(ckey, host) + + remove_ckey_from_play(ckey) + +/datum/deathmatch_lobby/proc/join(mob/player) + if (playing || !player) + return + if(!(player.ckey in players+observers)) + if (players.len >= map.max_players) + add_observer(player) + else + add_player(player, loadouts[1]) + ui_interact(player) + +/datum/deathmatch_lobby/proc/spectate(mob/player) + if (!playing || !location || !player) + return + if (!observers[player.ckey]) + add_observer(player) + player.forceMove(pick(location.reserved_turfs)) + +/datum/deathmatch_lobby/proc/change_map(new_map) + if (!new_map || !GLOB.deathmatch_game.maps[new_map]) + return + map = GLOB.deathmatch_game.maps[new_map] + var/max_players = map.max_players + for (var/possible_unlucky_loser in players) + max_players-- + if (max_players <= 0) + var/loser_mob = players[possible_unlucky_loser]["mob"] + remove_ckey_from_play(possible_unlucky_loser) + add_observer(loser_mob) + + loadouts = map.allowed_loadouts ? map.allowed_loadouts : GLOB.deathmatch_game.loadouts + for (var/player_key in players) + if (players[player_key]["loadout"] in loadouts) + continue + players[player_key]["loadout"] = loadouts[1] + +/datum/deathmatch_lobby/proc/clear_reservation() + if(isnull(location) || isnull(map)) + return + for(var/turf/victimized_turf as anything in location.reserved_turfs) //remove this once clearing turf reservations is actually reliable + victimized_turf.empty() + map.reservations -= location + qdel(location) + +/datum/deathmatch_lobby/Topic(href, href_list) //This handles the chat Join button href, supposedly + var/mob/dead/observer/ghost = usr + if (!istype(ghost)) + return + if(href_list["join"]) + join(ghost) + +/datum/deathmatch_lobby/ui_state(mob/user) + return GLOB.observer_state + +/// fills the lobby with fake players for the sake of UI debug, can only be called via VV +/datum/deathmatch_lobby/proc/fakefill(count) + for(var/i = 1 to count) + players["[rand(1,999)]"] = list("mob" = usr, "host" = FALSE, "ready" = FALSE, "loadout" = pick(loadouts)) + +/datum/deathmatch_lobby/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, null) + if(!ui) + ui = new(user, src, "DeathmatchLobby") + ui.open() + +/datum/deathmatch_lobby/ui_static_data(mob/user) + . = list() + .["maps"] = list() + for (var/map_key in GLOB.deathmatch_game.maps) + .["maps"] += map_key + +/datum/deathmatch_lobby/ui_data(mob/user) + . = list() + .["self"] = user.ckey + .["host"] = (user.ckey == host) + .["admin"] = check_rights_for(user.client, R_ADMIN) + .["global_chat"] = global_chat + .["playing"] = playing + .["loadouts"] = list("Randomize") + for (var/datum/outfit/deathmatch_loadout/loadout as anything in loadouts) + .["loadouts"] += initial(loadout.display_name) + .["map"] = list() + .["map"]["name"] = map.name + .["map"]["desc"] = map.desc + .["map"]["time"] = map.automatic_gameend_time + .["map"]["min_players"] = map.min_players + .["map"]["max_players"] = map.max_players + if(!isnull(players[user.ckey]) && !isnull(players[user.ckey]["loadout"])) + var/datum/outfit/deathmatch_loadout/loadout = players[user.ckey]["loadout"] + .["loadoutdesc"] = initial(loadout.desc) + else + .["loadoutdesc"] = "You are an observer! As an observer, you can hear lobby announcements." + .["players"] = list() + for (var/player_key in players) + var/list/player_info = players[player_key] + var/mob/player_mob = player_info["mob"] + if (isnull(player_mob) || !player_mob.client) + leave(player_key) + continue + .["players"][player_key] = player_info.Copy() + var/datum/outfit/deathmatch_loadout/dm_loadout = player_info["loadout"] + .["players"][player_key]["loadout"] = initial(dm_loadout.display_name) + .["observers"] = list() + for (var/observer_key in observers) + var/mob/observer = observers[observer_key]["mob"] + if (isnull(observer) || !observer.client) + leave(observer_key) + continue + .["observers"][observer_key] = observers[observer_key] + +/datum/deathmatch_lobby/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(. || !isobserver(usr)) + return + switch(action) + if ("start_game") + if (usr.ckey != host) + return FALSE + if (map.min_players > players.len) + to_chat(usr, span_warning("Not enough players to start yet.")) + return FALSE + start_game() + return TRUE + if ("leave_game") + if (playing) + return FALSE + leave(usr.ckey) + ui.close() + GLOB.deathmatch_game.ui_interact(usr) + return TRUE + if ("change_loadout") + if (playing) + return FALSE + if (params["player"] != usr.ckey && host != usr.ckey) + return FALSE + if (params["loadout"] == "Randomize") + players[params["player"]]["loadout"] = pick(loadouts) + return TRUE + for (var/datum/outfit/deathmatch_loadout/possible_loadout as anything in loadouts) + if (params["loadout"] != initial(possible_loadout.display_name)) + continue + players[params["player"]]["loadout"] = possible_loadout + break + return TRUE + if ("observe") + if (playing) + return FALSE + if (players[usr.ckey]) + remove_ckey_from_play(usr.ckey) + add_observer(usr, host == usr.ckey) + return TRUE + else if (observers[usr.ckey] && players.len < map.max_players) + remove_ckey_from_play(usr.ckey) + add_player(usr, loadouts[1], host == usr.ckey) + return TRUE + if ("ready") + players[usr.ckey]["ready"] ^= 1 // Toggle. + ready_count += (players[usr.ckey]["ready"] * 2) - 1 // scared? + if (ready_count >= players.len && players.len >= map.min_players) + start_game() + return TRUE + if ("host") // Host functions + if (playing || (usr.ckey != host && !check_rights(R_ADMIN))) + return FALSE + var/uckey = params["id"] + switch (params["func"]) + if ("Kick") + leave(uckey) + var/umob = get_mob_by_ckey(uckey) + var/datum/tgui/uui = SStgui.get_open_ui(umob, src) + uui?.close() + GLOB.deathmatch_game.ui_interact(umob) + return TRUE + if ("Transfer host") + if (host == uckey) + return FALSE + GLOB.deathmatch_game.passoff_lobby(host, uckey) + host = uckey + return TRUE + if ("Toggle observe") + var/umob = get_mob_by_ckey(uckey) + if (players[uckey]) + remove_ckey_from_play(uckey) + add_observer(umob, host == uckey) + else if (observers[uckey] && players.len < map.max_players) + remove_ckey_from_play(uckey) + add_player(umob, loadouts[1], host == uckey) + return TRUE + if ("change_map") + if (!(params["map"] in GLOB.deathmatch_game.maps)) + return FALSE + change_map(params["map"]) + return TRUE + if ("global_chat") + global_chat = !global_chat + return TRUE + if ("admin") // Admin functions + if (!check_rights(R_ADMIN)) + message_admins("[usr.key] has attempted to use admin functions in a deathmatch lobby!") + log_admin("[key_name(usr)] tried to use the deathmatch lobby admin functions without authorization.") + return + switch (params["func"]) + if ("Force start") + log_admin("[key_name(usr)] force started deathmatch lobby [host].") + start_game() + + diff --git a/code/modules/deathmatch/deathmatch_mapping.dm b/code/modules/deathmatch/deathmatch_mapping.dm new file mode 100644 index 0000000000000..9f6a5b4f59405 --- /dev/null +++ b/code/modules/deathmatch/deathmatch_mapping.dm @@ -0,0 +1,12 @@ +/area/deathmatch + name = "Deathmatch Arena" + requires_power = FALSE + has_gravity = STANDARD_GRAVITY + area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED + +/area/deathmatch/fullbright + static_lighting = FALSE + base_lighting_alpha = 255 + +/obj/effect/landmark/deathmatch_player_spawn + name = "Deathmatch Player Spawner" diff --git a/code/modules/deathmatch/deathmatch_maps.dm b/code/modules/deathmatch/deathmatch_maps.dm new file mode 100644 index 0000000000000..d437bffbb3cd7 --- /dev/null +++ b/code/modules/deathmatch/deathmatch_maps.dm @@ -0,0 +1,148 @@ +/datum/lazy_template/deathmatch //deathmatch maps that have any possibility of the walls being destroyed should use indestructible walls, because baseturf moment + var/name + map_dir = "_maps/map_files/Deathmatch" + /// Map Description + var/desc = "" + var/min_players = 2 + var/max_players = 2 // TODO: make this automatic. + /// The map will end in this time + var/automatic_gameend_time = 8 MINUTES + /// List of allowed loadouts for this map, otherwise defaults to all loadouts + var/list/allowed_loadouts = list() + +/datum/lazy_template/deathmatch/ragecage + name = "Ragecage" + desc = "Fun for the whole family, the classic ragecage." + max_players = 4 + automatic_gameend_time = 4 MINUTES // its a 10x10 cage what are you guys doing in there + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant) + map_name = "ragecage" + key = "ragecage" + +/datum/lazy_template/deathmatch/maintenance + name = "Maint Mania" + desc = "Dark maintenance tunnels, floor pills, improvised weaponry and a bloody beatdown. Welcome to assistant utopia." + max_players = 8 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant) + map_name = "Maint_Mania" + key = "Maint_Mania" + +/datum/lazy_template/deathmatch/osha_violator + name = "OSHA Violator" + desc = "What would Engineering be without an overly complicated engine, with conveyor belts, emitters and shield generators sprinkled about? That's right, not Engineering." + max_players = 10 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant) + map_name = "OSHA_Violator" + key = "OSHA_Violator" + +/datum/lazy_template/deathmatch/the_brig + name = "The Brig" + desc = "A recreation of MetaStation Brig." + max_players = 12 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant) + map_name = "The_Brig" + key = "The_Brig" + +/datum/lazy_template/deathmatch/shooting_range + name = "Shooting Range" + desc = "A simple room with a bunch of wooden barricades." + max_players = 6 + allowed_loadouts = list( + /datum/outfit/deathmatch_loadout/operative/ranged, + /datum/outfit/deathmatch_loadout/operative/melee, + ) + map_name = "shooting_range" + key = "shooting_range" + +/datum/lazy_template/deathmatch/securing + name = "SecuRing" + desc = "Presenting the Security Ring, ever wanted to shoot people with disablers? Well now you can." + max_players = 4 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/securing_sec) + map_name = "SecuRing" + key = "SecuRing" + +/datum/lazy_template/deathmatch/instagib + name = "Instagib" + desc = "EVERYONE GETS AN INSTAKILL RIFLE!" + max_players = 8 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant/instagib) + map_name = "instagib" + key = "instagib" + +/datum/lazy_template/deathmatch/mech_madness + name = "Mech Madness" + desc = "Do you hate mechs? Yeah? Dont care! Go fight eachother!" + max_players = 4 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/operative) + map_name = "mech_madness" + key = "mech_madness" + +/datum/lazy_template/deathmatch/sniperelite + name = "Sniper Elite" + desc = "Sound of gunfire and screaming people make my day" + max_players = 8 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/operative/sniper) + map_name = "Sniper_elite" + key = "Sniper_elite" + +/datum/lazy_template/deathmatch/meatower + name = "Meat Tower" + desc = "There can only be one chef in this kitchen" + max_players = 8 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/chef) + map_name = "meatower" + key = "meatower" + +/datum/lazy_template/deathmatch/sunrise + name = "Sunrise" + desc = "DEHUMANIZE YOURSELF AND FACE TO BLOODSHED DEHUMANIZE YOURSELF AND FACE TO BLOODSHED DEHUMANIZE YOURSELF AND FACE TO BLOODSHED DEHUMANIZE YOURSELF AND FACE TO BLOODSHED" + max_players = 8 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/samurai) + map_name = "chinatown" + key = "chinatown" + +/datum/lazy_template/deathmatch/starwars + name = "Arena Station" + desc = "Choose your battler!" + max_players = 10 + allowed_loadouts = list( + /datum/outfit/deathmatch_loadout/battler/soldier, // First because its a good and easy loadout and is picked by default + /datum/outfit/deathmatch_loadout/battler/bloodminer, + /datum/outfit/deathmatch_loadout/battler/clown, + /datum/outfit/deathmatch_loadout/battler/cowboy, + /datum/outfit/deathmatch_loadout/battler/druid, + /datum/outfit/deathmatch_loadout/battler/enginer, + /datum/outfit/deathmatch_loadout/battler/janitor, + /datum/outfit/deathmatch_loadout/battler/northstar, + /datum/outfit/deathmatch_loadout/battler/raider, + /datum/outfit/deathmatch_loadout/battler/ripper, + /datum/outfit/deathmatch_loadout/battler/scientist, + /datum/outfit/deathmatch_loadout/battler/surgeon, + /datum/outfit/deathmatch_loadout/battler/tgcoder, + /datum/outfit/deathmatch_loadout/naked, + ) + map_name = "starwars" + key = "starwars" + +/datum/lazy_template/deathmatch/arenaplatform + name = "Underground Thunderdome" + desc = "An illegal underground thunderdome, for larger amounts of murder." + max_players = 15 + allowed_loadouts = list( + /datum/outfit/deathmatch_loadout/operative, + /datum/outfit/deathmatch_loadout/naked, + ) + map_name = "arena" + key = "arena" + +/datum/lazy_template/deathmatch/raidthebase + name = "Backalley" + desc = "You are not built for these streets." + max_players = 8 + allowed_loadouts = list( + /datum/outfit/deathmatch_loadout/assistant, + /datum/outfit/deathmatch_loadout/naked, + ) + map_name = "raidthebase" + key = "raidthebase" diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index 6bcad3f247c55..77452c11d2b52 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -49,6 +49,7 @@ /datum/bank_account/Destroy() if(add_to_accounts) SSeconomy.bank_accounts_by_id -= "[account_id]" + SSeconomy.bank_accounts_by_job[account_job] -= src QDEL_LIST(redeemed_coupons) return ..() @@ -70,6 +71,8 @@ if(SSeconomy.bank_accounts_by_id["[account_id]"]) stack_trace("Unable to find a unique account ID, substituting currently existing account of id [account_id].") SSeconomy.bank_accounts_by_id["[account_id]"] = src + if(account_job) + LAZYADD(SSeconomy.bank_accounts_by_job[account_job], src) /datum/bank_account/vv_edit_var(var_name, var_value) // just so you don't have to do it manually var/old_id = account_id diff --git a/code/modules/economy/holopay.dm b/code/modules/economy/holopay.dm index c9ce23ccb98de..4755df02fbdbf 100644 --- a/code/modules/economy/holopay.dm +++ b/code/modules/economy/holopay.dm @@ -137,7 +137,7 @@ ui = new(user, src, "HoloPay") ui.open() -/obj/structure/holopay/ui_status(mob/user) +/obj/structure/holopay/ui_status(mob/user, datum/ui_state/state) . = ..() if(!in_range(user, src) && !isobserver(user)) return UI_CLOSE diff --git a/code/modules/events/ghost_role/fugitive_event.dm b/code/modules/events/ghost_role/fugitive_event.dm index 1556eb045589d..4b86e751c0b98 100644 --- a/code/modules/events/ghost_role/fugitive_event.dm +++ b/code/modules/events/ghost_role/fugitive_event.dm @@ -62,7 +62,7 @@ HUNTER_PACK_BOUNTY, HUNTER_PACK_PSYKER, ) - addtimer(CALLBACK(src, PROC_REF(spawn_hunters), hunter_backstory), 10 MINUTES) + addtimer(CALLBACK(src, PROC_REF(check_spawn_hunters), hunter_backstory, 10 MINUTES), 1 MINUTES) role_name = "fugitive hunter" return SUCCESSFUL_SPAWN @@ -103,7 +103,13 @@ S.put_in_hands(A) new /obj/item/autosurgeon(landing_turf) -//security team gets called in after 10 minutes of prep to find the refugees +/datum/round_event/ghost_role/fugitives/proc/check_spawn_hunters(backstory, remaining_time) + //if the emergency shuttle has been called, spawn hunters now to give them a chance + if(remaining_time == 0 || SSshuttle.emergency.mode != EMERGENCY_IDLE_OR_RECALLED) + spawn_hunters(backstory) + return + addtimer(CALLBACK(src, PROC_REF(check_spawn_hunters), backstory, remaining_time - 1 MINUTES), 1 MINUTES) + /datum/round_event/ghost_role/fugitives/proc/spawn_hunters(backstory) var/list/candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for a group of [backstory]?", check_jobban = ROLE_FUGITIVE_HUNTER, pic_source = /obj/machinery/sleeper, role_name_text = backstory) shuffle_inplace(candidates) diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index 706b3d7767ae7..7eb89e84bc06f 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -13,86 +13,126 @@ max_occurrences = 1 earliest_start = 0 MINUTES category = EVENT_CATEGORY_HOLIDAY - description = "Puts people on dates! They must protect each other. Sometimes a vengeful third wheel spawns." - -/datum/round_event/valentines/start() - ..() - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - H.put_in_hands(new /obj/item/valentine) - var/obj/item/storage/backpack/b = locate() in H.contents - new /obj/item/food/candyheart(b) - new /obj/item/storage/fancy/heart_box(b) - - var/list/valentines = list() - for(var/mob/living/M in GLOB.player_list) - var/turf/current_turf = get_turf(M.mind.current) - if(!M.stat && M.mind && !current_turf.onCentCom()) - valentines |= M - - - while(valentines.len) - var/mob/living/L = pick_n_take(valentines) - if(valentines.len) - var/mob/living/date = pick_n_take(valentines) - - - forge_valentines_objective(L, date) - forge_valentines_objective(date, L) + description = "Puts people on dates! They must protect each other. \ + Some dates will have third wheels, and any odd ones out will be given the role of 'heartbreaker'." + /// If TRUE, any odd candidate out will be given the role of "heartbreaker" and will be tasked with ruining the dates. + var/heartbreaker = TRUE + /// Probability that any given pair will be given a third wheel candidate + var/third_wheel_chance = 4 + /// Items to give to all valentines + var/list/items_to_give_out = list( + /obj/item/paper/valentine, + /obj/item/storage/fancy/heart_box, + /obj/item/food/candyheart, + ) + +/datum/round_event/valentines/proc/is_valid_valentine(mob/living/guy) + if(guy.stat == DEAD) + return FALSE + if(isnull(guy.mind)) + return FALSE + if(guy.onCentCom()) + return FALSE + return TRUE + +/datum/round_event/valentines/proc/give_valentines_things(mob/living/guy) + var/datum/round_event_control/valentines/controller = control + if(!istype(controller)) + return + + var/obj/item/storage/backpack/bag = locate() in guy.contents + if(isnull(bag)) + return + + var/atom/drop_loc = guy.drop_location() + for(var/thing_type in controller.items_to_give_out) + var/obj/item/thing = new thing_type(drop_loc) + if(!bag.atom_storage.attempt_insert(thing, override = TRUE, force = STORAGE_SOFT_LOCKED)) + guy.put_in_hands(thing) + +/datum/round_event/valentines/proc/forge_valentines_objective(mob/living/lover, mob/living/date) + var/datum/antagonist/valentine/valentine = new() + valentine.date = date.mind + lover.mind.special_role = "valentine" + lover.mind.add_antag_datum(valentine) //These really should be teams but i can't be assed to incorporate third wheels right now - if(valentines.len && prob(4)) - var/mob/living/notgoodenough = pick_n_take(valentines) - forge_valentines_objective(notgoodenough, date) - else - L.mind.add_antag_datum(/datum/antagonist/heartbreaker) +/datum/round_event/valentines/proc/forge_third_wheel(mob/living/sad_one, mob/living/date_one, mob/living/date_two) + var/datum/antagonist/valentine/third_wheel/third_wheel = new() + third_wheel.date = pick(date_one.mind, date_two.mind) + sad_one.mind.special_role = "valentine" + sad_one.mind.add_antag_datum(third_wheel) -/proc/forge_valentines_objective(mob/living/lover,mob/living/date) - lover.mind.special_role = "valentine" - var/datum/antagonist/valentine/V = new - V.date = date.mind - lover.mind.add_antag_datum(V) //These really should be teams but i can't be assed to incorporate third wheels right now +/datum/round_event/valentines/start() + var/datum/round_event_control/valentines/controller = control + if(!istype(controller)) + return + + var/list/candidates = list() + for(var/mob/living/player in GLOB.player_list) + if(!is_valid_valentine(player)) + continue + candidates += player + + var/list/mob/living/candidates_pruned = SSpolling.poll_candidates( + question = "Do you want a Valentine?", + group = candidates, + poll_time = 30 SECONDS, + flash_window = FALSE, + start_signed_up = TRUE, + pic_source = /obj/item/storage/fancy/heart_box, + custom_response_messages = list( + POLL_RESPONSE_SIGNUP = "You have signed up for a date!", + POLL_RESPONSE_ALREADY_SIGNED = "You are already signed up for a date.", + POLL_RESPONSE_NOT_SIGNED = "You aren't signed up for a date.", + POLL_RESPONSE_TOO_LATE_TO_UNREGISTER = "It's too late to decide against going on a date.", + POLL_RESPONSE_UNREGISTERED = "You deicde against going on a date.", + ), + ) + + for(var/mob/living/second_check as anything in candidates_pruned) + if(is_valid_valentine(second_check)) + continue + candidates_pruned -= second_check + + if(length(candidates_pruned) == 0) + return + if(length(candidates_pruned) == 1) + to_chat(candidates_pruned[1], span_warning("You are the only one who wanted a Valentine...")) + return + + while(length(candidates_pruned) >= 2) + var/mob/living/date_one = pick_n_take(candidates_pruned) + var/mob/living/date_two = pick_n_take(candidates_pruned) + give_valentines_things(date_one) + give_valentines_things(date_two) + forge_valentines_objective(date_one, date_two) + forge_valentines_objective(date_two, date_one) + + if((length(candidates_pruned) == 1 && !controller.heartbreaker) || (length(candidates_pruned) && prob(controller.third_wheel_chance))) + var/mob/living/third_wheel = pick_n_take(candidates_pruned) + give_valentines_things(third_wheel) + forge_third_wheel(third_wheel, date_one, date_two) + // Third wheel starts with a bouquet because that's funny + var/third_wheel_bouquet = pick(typesof(/obj/item/bouquet)) + var/obj/item/bouquet = new third_wheel_bouquet(third_wheel.loc) + third_wheel.put_in_hands(bouquet) + + if(controller.heartbreaker && length(candidates_pruned) == 1) + candidates_pruned[1].mind.add_antag_datum(/datum/antagonist/heartbreaker) /datum/round_event/valentines/announce(fake) priority_announce("It's Valentine's Day! Give a valentine to that special someone!") -/obj/item/valentine +/obj/item/paper/valentine name = "valentine" desc = "A Valentine's card! Wonder what it says..." icon = 'icons/obj/toys/playing_cards.dmi' icon_state = "sc_Ace of Hearts_syndicate" // shut up // bye felicia - var/message = "A generic message of love or whatever." - resistance_flags = FLAMMABLE - w_class = WEIGHT_CLASS_TINY + show_written_words = FALSE -/obj/item/valentine/Initialize(mapload) - . = ..() - message = pick(strings(VALENTINE_FILE, "valentines")) - -/obj/item/valentine/attackby(obj/item/W, mob/user, params) - ..() - if(istype(W, /obj/item/pen) || istype(W, /obj/item/toy/crayon)) - if(!user.can_write(W)) - return - var/recipient = tgui_input_text(user, "Who is receiving this valentine?", "To:", max_length = MAX_NAME_LEN) - var/sender = tgui_input_text(user, "Who is sending this valentine?", "From:", max_length = MAX_NAME_LEN) - if(!user.can_perform_action(src)) - return - if(recipient && sender) - name = "valentine - To: [recipient] From: [sender]" - -/obj/item/valentine/examine(mob/user) - . = ..() - if(in_range(user, src) || isobserver(user)) - if( !(ishuman(user) || isobserver(user) || issilicon(user)) ) - user << browse("[name][stars(message)]", "window=[name]") - onclose(user, "[name]") - else - user << browse("[name][message]", "window=[name]") - onclose(user, "[name]") - else - . += span_notice("It is too far away.") - -/obj/item/valentine/attack_self(mob/user) - user.examinate(src) +/obj/item/paper/valentine/Initialize(mapload) + default_raw_text = pick_list(VALENTINE_FILE, "valentines") || "A generic message of love or whatever." + return ..() /obj/item/food/candyheart name = "candy heart" diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index b1e5ddc4c1889..4b30951d89ab1 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -41,12 +41,68 @@ /obj/item/fishing_line/sinew name = "fishing sinew" desc = "An all-natural fishing line made of stretched out sinew. A bit stiff, but usable to fish in extreme enviroments." - icon = 'icons/obj/fishing.dmi' icon_state = "reel_sinew" - icon_state = "reel_green" fishing_line_traits = FISHING_LINE_REINFORCED|FISHING_LINE_STIFF line_color = "#d1cca3" +/** + * A special line reel that let you skip the biting phase of the minigame, netting you a completion bonus, + * and thrown hooked items at you, so you can rapidly catch them from afar. + * It may also work on mobs if the right hook is attached. + */ +/obj/item/fishing_line/auto_reel + name = "fishing line auto-reel" + desc = "A fishing line that automatically starts reeling in fish the moment they bite. Also good for hurling things at yourself." + icon_state = "reel_auto" + fishing_line_traits = FISHING_LINE_AUTOREEL + line_color = "#F88414" + +/obj/item/fishing_line/auto_reel/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_FISHING_EQUIPMENT_SLOTTED, PROC_REF(line_equipped)) + +/obj/item/fishing_line/auto_reel/proc/line_equipped(datum/source, obj/item/fishing_rod/rod) + SIGNAL_HANDLER + RegisterSignal(rod, COMSIG_FISHING_ROD_HOOKED_ITEM, PROC_REF(on_hooked_item)) + RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_removed)) + +/obj/item/fishing_line/auto_reel/proc/on_removed(atom/movable/source, atom/old_loc, dir, forced) + SIGNAL_HANDLER + UnregisterSignal(src, COMSIG_MOVABLE_MOVED) + UnregisterSignal(old_loc, COMSIG_FISHING_ROD_HOOKED_ITEM) + +/obj/item/fishing_line/auto_reel/proc/on_hooked_item(obj/item/fishing_rod/source, atom/target, mob/living/user) + SIGNAL_HANDLER + if(!ismovable(target)) + return + var/atom/movable/movable_target = target + var/please_be_gentle = FALSE + var/atom/destination + var/datum/callback/throw_callback + if(isliving(movable_target) || !isitem(movable_target)) + destination = get_step_towards(user, target) + please_be_gentle = TRUE + else + destination = user + throw_callback = CALLBACK(src, PROC_REF(clear_hitby_signal), movable_target) + RegisterSignal(movable_target, COMSIG_ATOM_PREHITBY, PROC_REF(catch_it_chucklenut)) + + if(!movable_target.safe_throw_at(destination, source.cast_range, 2, callback = throw_callback, gentle = please_be_gentle)) + UnregisterSignal(movable_target, COMSIG_ATOM_PREHITBY) + else + playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) + +/obj/item/fishing_line/auto_reel/proc/catch_it_chucklenut(obj/item/source, atom/hit_atom, datum/thrownthing/throwingdatum) + SIGNAL_HANDLER + var/mob/living/user = throwingdatum.initial_target.resolve() + if(QDELETED(user) || hit_atom != user) + return + if(user.try_catch_item(source, skip_throw_mode_check = TRUE, try_offhand = TRUE)) + return COMSIG_HIT_PREVENTED + +/obj/item/fishing_line/auto_reel/proc/clear_hitby_signal(obj/item/item) + UnregisterSignal(item, COMSIG_ATOM_PREHITBY) + // Hooks /obj/item/fishing_hook diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm index a5e1dd142b15e..e2108848b0ba6 100644 --- a/code/modules/fishing/fishing_minigame.dm +++ b/code/modules/fishing/fishing_minigame.dm @@ -18,9 +18,15 @@ // Acceleration mod when bait is over fish #define FISH_ON_BAIT_ACCELERATION_MULT 0.6 /// The minimum velocity required for the bait to bounce -#define BAIT_MIN_VELOCITY_BOUNCE 200 +#define BAIT_MIN_VELOCITY_BOUNCE 150 /// The extra deceleration of velocity that happens when the bait switches direction -#define BAIT_DECELERATION_MULT 2 +#define BAIT_DECELERATION_MULT 1.5 + +/// Reduce initial completion rate depending on difficulty +#define MAX_FISH_COMPLETION_MALUS 15 +/// The window of time between biting phase and back to baiting phase +#define BITING_TIME_WINDOW 4 SECONDS + ///Defines to know how the bait is moving on the minigame slider. #define REELING_STATE_IDLE 0 @@ -162,6 +168,8 @@ if(rod.line.fishing_line_traits & FISHING_LINE_STIFF) completion_loss += 1 completion_gain -= 1 + if(rod.line.fishing_line_traits & FISHING_LINE_AUTOREEL) + special_effects |= FISHING_MINIGAME_AUTOREEL if(rod.hook) if(rod.hook.fishing_hook_traits & FISHING_HOOK_WEIGHTED) bait_bounce_mult = 0.1 @@ -180,6 +188,9 @@ difficulty += comp.fish_source.calculate_difficulty(reward_path, rod, user, src) difficulty = clamp(round(difficulty), 1, 100) + if(difficulty > FISHING_EASY_DIFFICULTY) + completion -= round(MAX_FISH_COMPLETION_MALUS * (difficulty/100), 1) + if(HAS_TRAIT(user, TRAIT_REVEAL_FISH) || (user.mind && HAS_TRAIT(user.mind, TRAIT_REVEAL_FISH))) fish_icon = GLOB.specific_fish_icons[reward_path] || "fish" @@ -259,7 +270,7 @@ return if(phase == WAIT_PHASE) //Reset wait send_alert("miss!") - start_baiting_phase() + start_baiting_phase(TRUE) else if(phase == BITING_PHASE) start_minigame_phase() return COMSIG_MOB_CANCEL_CLICKON @@ -302,14 +313,19 @@ if(!QDELETED(src)) qdel(src) -/datum/fishing_challenge/proc/start_baiting_phase() +/datum/fishing_challenge/proc/start_baiting_phase(penalty = FALSE) + var/wait_time + if(penalty) + wait_time = min(timeleft(next_phase_timer) + rand(3 SECONDS, 5 SECONDS), 30 SECONDS) + else + wait_time = rand(1 SECONDS, 30 SECONDS) + if(special_effects & FISHING_MINIGAME_AUTOREEL && wait_time >= 15 SECONDS) + wait_time = max(wait_time - 7.5 SECONDS, 15 SECONDS) deltimer(next_phase_timer) phase = WAIT_PHASE //Bobbing animation animate(lure, pixel_y = 1, time = 1 SECONDS, loop = -1, flags = ANIMATION_RELATIVE) animate(pixel_y = -1, time = 1 SECONDS, flags = ANIMATION_RELATIVE) - //Setup next phase - var/wait_time = rand(1 SECONDS, 30 SECONDS) next_phase_timer = addtimer(CALLBACK(src, PROC_REF(start_biting_phase)), wait_time, TIMER_STOPPABLE) /datum/fishing_challenge/proc/start_biting_phase() @@ -342,9 +358,11 @@ send_alert("!!!") animate(lure, pixel_y = 3, time = 5, loop = -1, flags = ANIMATION_RELATIVE) animate(pixel_y = -3, time = 5, flags = ANIMATION_RELATIVE) + if(special_effects & FISHING_MINIGAME_AUTOREEL) + start_minigame_phase(auto_reel = TRUE) + return // Setup next phase - var/wait_time = rand(3 SECONDS, 6 SECONDS) - next_phase_timer = addtimer(CALLBACK(src, PROC_REF(start_baiting_phase)), wait_time, TIMER_STOPPABLE) + next_phase_timer = addtimer(CALLBACK(src, PROC_REF(start_baiting_phase)), BITING_TIME_WINDOW, TIMER_STOPPABLE) ///The damage dealt per second to the fish when FISHING_MINIGAME_RULE_KILL is active. #define FISH_DAMAGE_PER_SECOND 2 @@ -366,7 +384,21 @@ var/damage = CEILING((world.time - start_time)/10 * FISH_DAMAGE_PER_SECOND, 1) reward.adjust_health(reward.health - damage) -/datum/fishing_challenge/proc/start_minigame_phase() +/datum/fishing_challenge/proc/start_minigame_phase(auto_reel = FALSE) + if(auto_reel) + completion *= 1.3 + else + var/time_left = timeleft(next_phase_timer) + switch(time_left) + if(0 to BITING_TIME_WINDOW - 3 SECONDS) + completion *= 0.65 + if(BITING_TIME_WINDOW - 3 SECONDS to BITING_TIME_WINDOW - 2 SECONDS) + completion *= 0.82 + if(BITING_TIME_WINDOW - 1 SECONDS to BITING_TIME_WINDOW - 0.5 SECONDS) + completion *= 1.2 + if(BITING_TIME_WINDOW - 0.5 SECONDS to BITING_TIME_WINDOW) + completion *= 1.4 + completion = round(completion, 1) if(!prepare_minigame_hud()) return phase = MINIGAME_PHASE @@ -691,3 +723,5 @@ #undef REELING_STATE_UP #undef REELING_STATE_DOWN +#undef MAX_FISH_COMPLETION_MALUS +#undef BITING_TIME_WINDOW diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 8a3035a9cc9f1..0578ffb078907 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -39,6 +39,9 @@ ///The name of the icon state of the reel overlay var/reel_overlay = "reel_overlay" + ///Prevents spamming the line casting, without affecting the player's click cooldown. + COOLDOWN_DECLARE(casting_cd) + /obj/item/fishing_rod/Initialize(mapload) . = ..() register_context() @@ -220,6 +223,8 @@ if(!CheckToolReach(user, target, cast_range)) balloon_alert(user, "cannot reach there!") return + if(!COOLDOWN_FINISHED(src, casting_cd)) + return /// Annoyingly pre attack is only called in melee SEND_SIGNAL(target, COMSIG_PRE_FISHING) casting = TRUE @@ -232,6 +237,7 @@ cast_projectile.impacted = list(user = TRUE) cast_projectile.preparePixelProjectile(target, user) cast_projectile.fire() + COOLDOWN_START(src, casting_cd, 1 SECONDS) /// Called by hook projectile when hitting things /obj/item/fishing_rod/proc/hook_hit(atom/atom_hit_by_hook_projectile) @@ -361,9 +367,7 @@ if("slot_action") // Simple click with empty hand to remove, click with item to insert/switch var/obj/item/held_item = user.get_active_held_item() - if(held_item == src) - return - use_slot(params["slot"], user, held_item) + use_slot(params["slot"], user, held_item == src ? null : held_item) return TRUE /// Ideally this will be replaced with generic slotted storage datum + display @@ -404,6 +408,9 @@ user.put_in_hands(current_item) balloon_alert(user, "[slot] swapped") + if(new_item) + SEND_SIGNAL(new_item, COMSIG_FISHING_EQUIPMENT_SLOTTED, src) + update_icon() playsound(src, 'sound/items/click.ogg', 50, TRUE) diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm index edab6dc0db5cf..c21579626fe28 100644 --- a/code/modules/fishing/sources/source_types.dm +++ b/code/modules/fishing/sources/source_types.dm @@ -233,12 +233,12 @@ /obj/item/stack/ore/plasma = 3, /mob/living/basic/mining/lobstrosity = 1, /obj/effect/decal/remains/plasma = 1, - /obj/item/stack/sheet/mineral/mythril = 1, + /obj/item/stack/sheet/mineral/runite = 1, /obj/item/stack/sheet/mineral/adamantine = 1, ) fish_counts = list( /obj/item/stack/sheet/mineral/adamantine = 3, - /obj/item/stack/sheet/mineral/mythril = 2, + /obj/item/stack/sheet/mineral/runite = 2, ) /datum/fish_source/moisture_trap @@ -262,7 +262,7 @@ fish_counts = list( /obj/item/storage/wallet/money = 2, ) - fishing_difficulty = FISHING_DEFAULT_DIFFICULTY - 5 //For beginners + fishing_difficulty = FISHING_EASY_DIFFICULTY //For beginners /datum/fish_source/holographic catalog_description = "Holographic water" @@ -275,7 +275,7 @@ /obj/item/fish/holo/checkered = 5, /obj/item/fish/holo/halffish = 5, ) - fishing_difficulty = FISHING_DEFAULT_DIFFICULTY - 5 + fishing_difficulty = FISHING_EASY_DIFFICULTY /datum/fish_source/holographic/reason_we_cant_fish(obj/item/fishing_rod/rod, mob/fisherman, atom/parent) . = ..() @@ -332,7 +332,7 @@ /mob/living/basic/frog = 1, /mob/living/basic/axolotl = 1, ) - fishing_difficulty = FISHING_DEFAULT_DIFFICULTY - 10 + fishing_difficulty = FISHING_EASY_DIFFICULTY - 5 /datum/fish_source/hydro_tray/reason_we_cant_fish(obj/item/fishing_rod/rod, mob/fisherman, atom/parent) if(!istype(parent, /obj/machinery/hydroponics/constructable)) diff --git a/code/modules/food_and_drinks/machinery/coffeemaker.dm b/code/modules/food_and_drinks/machinery/coffeemaker.dm index 36ef9a7638476..8490b2b5cfbec 100644 --- a/code/modules/food_and_drinks/machinery/coffeemaker.dm +++ b/code/modules/food_and_drinks/machinery/coffeemaker.dm @@ -45,10 +45,9 @@ coffeepot = new /obj/item/reagent_containers/cup/coffeepot(src) cartridge = new /obj/item/coffee_cartridge(src) -/obj/machinery/coffeemaker/deconstruct() +/obj/machinery/coffeemaker/on_deconstruction(disassembled) coffeepot?.forceMove(drop_location()) cartridge?.forceMove(drop_location()) - return ..() /obj/machinery/coffeemaker/Destroy() QDEL_NULL(coffeepot) diff --git a/code/modules/food_and_drinks/machinery/deep_fryer.dm b/code/modules/food_and_drinks/machinery/deep_fryer.dm index 2a172df811f7a..a6c3daf5ccaee 100644 --- a/code/modules/food_and_drinks/machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/machinery/deep_fryer.dm @@ -61,11 +61,10 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( QDEL_NULL(frying) return ..() -/obj/machinery/deepfryer/deconstruct(disassembled) +/obj/machinery/deepfryer/on_deconstruction(disassembled) // This handles nulling out frying via exited if(frying) frying.forceMove(drop_location()) - return ..() /obj/machinery/deepfryer/RefreshParts() . = ..() diff --git a/code/modules/food_and_drinks/machinery/gibber.dm b/code/modules/food_and_drinks/machinery/gibber.dm index 57c3248f8cdc1..62157177bdcaf 100644 --- a/code/modules/food_and_drinks/machinery/gibber.dm +++ b/code/modules/food_and_drinks/machinery/gibber.dm @@ -147,6 +147,12 @@ if(!occupant) audible_message(span_hear("You hear a loud metallic grinding sound.")) return + if(occupant.flags_1 & HOLOGRAM_1) + audible_message(span_hear("You hear a very short metallic grinding sound.")) + playsound(loc, 'sound/machines/hiss.ogg', 20, TRUE) + qdel(occupant) + set_occupant(null) + return use_power(active_power_usage) audible_message(span_hear("You hear a loud squelchy grinding sound.")) @@ -173,7 +179,9 @@ if(ishuman(occupant)) var/mob/living/carbon/human/gibee = occupant - if(gibee.dna && gibee.dna.species) + if(prob(40) && (sourcejob in list(JOB_SECURITY_OFFICER,JOB_WARDEN,JOB_HEAD_OF_SECURITY))) + typeofmeat = /obj/item/food/meat/slab/pig + else if(gibee.dna && gibee.dna.species) typeofmeat = gibee.dna.species.meat typeofskin = gibee.dna.species.skinned_type diff --git a/code/modules/food_and_drinks/machinery/grill.dm b/code/modules/food_and_drinks/machinery/grill.dm index 695c70b75dae9..99da62a3c4111 100644 --- a/code/modules/food_and_drinks/machinery/grill.dm +++ b/code/modules/food_and_drinks/machinery/grill.dm @@ -78,7 +78,6 @@ ..() /obj/machinery/grill/process(seconds_per_tick) - ..() update_appearance() if(grill_fuel <= 0) return @@ -90,7 +89,11 @@ smoke.start() if(grilled_item) SEND_SIGNAL(grilled_item, COMSIG_ITEM_GRILL_PROCESS, src, seconds_per_tick) - grill_time += seconds_per_tick + if(QDELETED(grilled_item)) + grilled_item = null + finish_grill() + return + grill_time += seconds_per_tick * 10 //convert to deciseconds grilled_item.reagents.add_reagent(/datum/reagent/consumable/char, 0.5 * seconds_per_tick) grill_fuel -= GRILL_FUELUSAGE_ACTIVE * seconds_per_tick grilled_item.AddComponent(/datum/component/sizzle) @@ -106,13 +109,11 @@ if(default_unfasten_wrench(user, I) != CANT_UNFASTEN) return TRUE -/obj/machinery/grill/deconstruct(disassembled = TRUE) +/obj/machinery/grill/on_deconstruction(disassembled) if(grilled_item) finish_grill() - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 5) - new /obj/item/stack/rods(loc, 5) - ..() + new /obj/item/stack/sheet/iron(loc, 5) + new /obj/item/stack/rods(loc, 5) /obj/machinery/grill/attack_ai(mob/user) return @@ -127,9 +128,16 @@ /obj/machinery/grill/proc/finish_grill() if(!QDELETED(grilled_item)) - if(grill_time >= 20) + var/time_limit = 20 SECONDS + //when items grill themselves in their own unique ways we want to follow their constraints + var/datum/component/grillable/custom_grilling = grilled_item.GetComponent(/datum/component/grillable) + if(!isnull(custom_grilling)) + time_limit = custom_grilling.required_cook_time + + if(grill_time >= time_limit) grilled_item.AddElement(/datum/element/grilled_item, grill_time) UnregisterSignal(grilled_item, COMSIG_ITEM_GRILLED) + grill_time = 0 grill_loop.stop() diff --git a/code/modules/food_and_drinks/machinery/icecream_vat.dm b/code/modules/food_and_drinks/machinery/icecream_vat.dm index e3abf6bf9deca..e5742418c140f 100644 --- a/code/modules/food_and_drinks/machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/machinery/icecream_vat.dm @@ -211,12 +211,10 @@ ice_cream_icon.color = flavor.color return ice_cream_icon -/obj/machinery/icecream_vat/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 4) +/obj/machinery/icecream_vat/on_deconstruction(disassembled = TRUE) + new /obj/item/stack/sheet/iron(loc, 4) if(custom_ice_cream_beaker) custom_ice_cream_beaker.forceMove(loc) - qdel(src) ///Makes an ice cream cone of the make_type, using ingredients list as reagents used to make it. Puts in user's hand if possible. /obj/machinery/icecream_vat/proc/make_cone(mob/user, make_type, list/ingredients) diff --git a/code/modules/food_and_drinks/machinery/microwave.dm b/code/modules/food_and_drinks/machinery/microwave.dm index c4cc6d378e35b..ec5df27ca5a23 100644 --- a/code/modules/food_and_drinks/machinery/microwave.dm +++ b/code/modules/food_and_drinks/machinery/microwave.dm @@ -105,7 +105,7 @@ itemized_ingredient.pixel_y = itemized_ingredient.base_pixel_y + rand(-5, 6) return ..() -/obj/machinery/microwave/on_deconstruction() +/obj/machinery/microwave/on_deconstruction(disassembled) eject() return ..() diff --git a/code/modules/food_and_drinks/machinery/processor.dm b/code/modules/food_and_drinks/machinery/processor.dm index 0aa5532de13df..e1d027306eac6 100644 --- a/code/modules/food_and_drinks/machinery/processor.dm +++ b/code/modules/food_and_drinks/machinery/processor.dm @@ -69,8 +69,9 @@ var/cached_multiplier = (recipe.food_multiplier * rating_amount) for(var/i in 1 to cached_multiplier) var/atom/processed_food = new recipe.output(drop_location()) - processed_food.reagents.clear_reagents() - what.reagents.copy_to(processed_food, what.reagents.total_volume, multiplier = 1 / cached_multiplier) + if(processed_food.reagents && what.reagents) + processed_food.reagents.clear_reagents() + what.reagents.copy_to(processed_food, what.reagents.total_volume, multiplier = 1 / cached_multiplier) if(cached_mats) processed_food.set_custom_materials(cached_mats, 1 / cached_multiplier) diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index 69f62b77d209a..eeb5efd2642ca 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -491,7 +491,7 @@ /obj/machinery/smartfridge/drying_rack/exchange_parts() return -/obj/machinery/smartfridge/drying_rack/on_deconstruction() +/obj/machinery/smartfridge/drying_rack/on_deconstruction(disassembled) new /obj/item/stack/sheet/mineral/wood(drop_location(), 10) /obj/machinery/smartfridge/drying_rack/crowbar_act(mob/living/user, obj/item/tool) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm index fb4f29284b87b..02bb9ae7bf82c 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm @@ -168,7 +168,7 @@ /obj/item/food/onion_slice = 1, /datum/reagent/consumable/nutriment/soup/teriyaki = 4, ) - result = /obj/item/food/salad/bibimbap + result = /obj/item/food/salad/bulgogi_noodles category = CAT_MARTIAN /datum/crafting_recipe/food/yakisoba_katsu diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm index 93851558cffe3..a9f1ad23d8e26 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm @@ -237,3 +237,11 @@ ) result = /obj/item/food/pie/asdfpie category = CAT_PIE + +/datum/crafting_recipe/food/bacid_pie + reqs = list( + /obj/item/food/pie/plain = 1, + /obj/item/stock_parts/cell = 2, + ) + result = /obj/item/food/pie/bacid_pie + category = CAT_PIE diff --git a/code/modules/forensics/_forensics.dm b/code/modules/forensics/_forensics.dm index 75cbc55df280d..40b480182537e 100644 --- a/code/modules/forensics/_forensics.dm +++ b/code/modules/forensics/_forensics.dm @@ -70,6 +70,7 @@ var/atom/parent_atom = parent.resolve() if (!isnull(parent_atom)) UnregisterSignal(parent_atom, list(COMSIG_COMPONENT_CLEAN_ACT)) + parent = null return ..() /// Empties the fingerprints list @@ -147,7 +148,9 @@ /// Adds a single fiber /datum/forensics/proc/add_fibers(mob/living/carbon/human/suspect) var/fibertext - var/atom/actual_parent = parent.resolve() + var/atom/actual_parent = parent?.resolve() + if(isnull(actual_parent)) + parent = null var/item_multiplier = isitem(actual_parent) ? ITEM_FIBER_MULTIPLIER : NON_ITEM_FIBER_MULTIPLIER if(suspect.wear_suit) fibertext = "Material from \a [suspect.wear_suit]." @@ -214,8 +217,11 @@ if(last_stamp_pos) LAZYSET(hiddenprints, suspect.key, copytext(hiddenprints[suspect.key], 1, last_stamp_pos)) hiddenprints[suspect.key] += "\nLast: \[[current_time]\] \"[suspect.real_name]\"[has_gloves]. Ckey: [suspect.ckey]" //made sure to be existing by if(!LAZYACCESS);else - var/atom/parent_atom = parent.resolve() - parent_atom.fingerprintslast = suspect.ckey + var/atom/parent_atom = parent?.resolve() + if(!isnull(parent_atom)) + parent_atom.fingerprintslast = suspect.ckey + else + parent = null return TRUE /// Adds the given list into blood_DNA @@ -230,11 +236,12 @@ /// Updates the blood displayed on parent /datum/forensics/proc/check_blood() - if(!parent || !isitem(parent.resolve())) + var/obj/item/the_thing = parent?.resolve() + if(isnull(the_thing)) + parent = null return - if(isorgan(parent.resolve())) // organs don't spawn with blood decals by default + if(!istype(the_thing) || isorgan(the_thing)) // organs don't spawn with blood decals by default return if(!length(blood_DNA)) return - var/atom/parent_atom = parent.resolve() - parent_atom.AddElement(/datum/element/decal/blood) + the_thing.AddElement(/datum/element/decal/blood) diff --git a/code/modules/hallucination/fake_sound.dm b/code/modules/hallucination/fake_sound.dm index ec578f101d376..aaf8ef468230c 100644 --- a/code/modules/hallucination/fake_sound.dm +++ b/code/modules/hallucination/fake_sound.dm @@ -173,6 +173,7 @@ 'sound/ambience/antag/ling_alert.ogg', 'sound/ambience/antag/malf.ogg', 'sound/ambience/antag/ops.ogg', + 'sound/ambience/antag/spy.ogg', 'sound/ambience/antag/tatoralert.ogg', ) diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm index 1bbedefb2e0ef..afd4c2270388f 100644 --- a/code/modules/holodeck/holo_effect.dm +++ b/code/modules/holodeck/holo_effect.dm @@ -62,11 +62,9 @@ mobtype = pick(mobtype) our_mob = new mobtype(loc) our_mob.flags_1 |= HOLOGRAM_1 - ADD_TRAIT(our_mob, TRAIT_PERMANENTLY_MORTAL, INNATE_TRAIT) // these vars are not really standardized but all would theoretically create stuff on death - for(var/v in list("butcher_results","corpse","weapon1","weapon2","blood_volume") & our_mob.vars) - our_mob.vars[v] = null + our_mob.add_traits(list(TRAIT_PERMANENTLY_MORTAL, TRAIT_NO_BLOOD_OVERLAY, TRAIT_NOBLOOD, TRAIT_NOHUNGER), INNATE_TRAIT) RegisterSignal(our_mob, COMSIG_QDELETING, PROC_REF(handle_mob_delete)) return our_mob @@ -103,7 +101,7 @@ mobtype = /mob/living/basic/bee/toxin /obj/effect/holodeck_effect/mobspawner/monkey - mobtype = /mob/living/carbon/human/species/monkey/holodeck + mobtype = /mob/living/carbon/human/species/monkey /obj/effect/holodeck_effect/mobspawner/monkey/activate(obj/machinery/computer/holodeck/computer) var/mob/living/carbon/human/monkey = ..() diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 00a52ab82a868..5b8ce2a930939 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -458,7 +458,7 @@ update_appearance(UPDATE_ICON) -/obj/machinery/biogenerator/ui_status(mob/user) +/obj/machinery/biogenerator/ui_status(mob/user, datum/ui_state/state) if(machine_stat & BROKEN || panel_open) return UI_CLOSE diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index a2afcdc729f8a..aa02ba7efa1bc 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -72,7 +72,7 @@ name = "ambrosia gaia branch" desc = "Eating this makes you immortal." icon_state = "ambrosia_gaia" - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 3 seed = /obj/item/seeds/ambrosia/gaia wine_power = 70 diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index 948a9d404c69e..2bcc2860458bb 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -89,7 +89,7 @@ gender = PLURAL bite_consumption_mod = 0.5 seed = /obj/item/seeds/wheat/meat - foodtypes = MEAT | GRAIN + foodtypes = MEAT grind_results = list(/datum/reagent/consumable/flour = 0, /datum/reagent/blood = 0) tastes = list("meatwheat" = 1) can_distill = FALSE diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 56f967a0380d9..ca3fee495ce40 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -1184,9 +1184,8 @@ /obj/machinery/hydroponics/soil/CtrlClick(mob/user) return //Soil has no electricity. -/obj/machinery/hydroponics/soil/deconstruct(disassembled) +/obj/machinery/hydroponics/soil/on_deconstruction(disassembled) new /obj/item/stack/ore/glass(drop_location(), 3) - return ..() ///The usb port circuit diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 51cbcfbd878d1..2206030263beb 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -368,7 +368,7 @@ return var/obj/item/seeds/our_seed = our_plant.get_plant_seed() - our_plant.light_system = MOVABLE_LIGHT + our_plant.light_system = OVERLAY_LIGHT our_plant.AddComponent(/datum/component/overlay_lighting, glow_range(our_seed), glow_power(our_seed), glow_color) /* diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index e96bae827fa9b..2be7bba5154d4 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -88,6 +88,17 @@ if(!visualsOnly) other_chefs.cooks++ +/datum/outfit/job/cook/post_equip(mob/living/carbon/human/user, visualsOnly = FALSE) + . = ..() + // Update PDA to match possible new trim. + var/obj/item/card/id/worn_id = user.wear_id + var/obj/item/modular_computer/pda/pda = user.get_item_by_slot(pda_slot) + if(!istype(worn_id) || !istype(pda)) + return + var/assignment = worn_id.get_trim_assignment() + if(!isnull(assignment)) + pda.imprint_id(user.real_name, assignment) + /datum/outfit/job/cook/get_types_to_preload() . = ..() . += /obj/item/clothing/suit/apron/chef diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 25d76bf0156d8..35a3a218f7b1a 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -117,6 +117,12 @@ GLOBAL_LIST_EMPTY(security_officer_distribution) SSid_access.apply_trim_to_card(worn_id, dep_trim) spawning.sec_hud_set_ID() + // Update PDA to match new trim. + var/obj/item/modular_computer/pda/pda = spawning.get_item_by_slot(ITEM_SLOT_BELT) + var/assignment = worn_id.get_trim_assignment() + if(istype(pda) && !isnull(assignment)) + pda.imprint_id(spawning.real_name, assignment) + var/spawn_point = pick(LAZYACCESS(GLOB.department_security_spawns, department)) if(!CONFIG_GET(flag/sec_start_brig) && (destination || spawn_point)) diff --git a/code/modules/jobs/job_types/station_trait/veteran_advisor.dm b/code/modules/jobs/job_types/station_trait/veteran_advisor.dm new file mode 100644 index 0000000000000..87ad65c2c7a71 --- /dev/null +++ b/code/modules/jobs/job_types/station_trait/veteran_advisor.dm @@ -0,0 +1,76 @@ +/datum/job/veteran_advisor + title = JOB_VETERAN_ADVISOR + description = "Advise HoS, and Captain on matters of Security. Train green Officers. \ + Lay back in your wheelchair and say \"I told you\" to the HoS when all of the station collapses." + auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY + department_head = list(JOB_HEAD_OF_SECURITY) + faction = FACTION_STATION + total_positions = 0 + spawn_positions = 0 + supervisors = SUPERVISOR_HOS + minimal_player_age = 7 + exp_requirements = 6000 //100 HOURS! We want really hard boiled people + exp_required_type = EXP_TYPE_CREW + exp_required_type_department = EXP_TYPE_SECURITY + exp_granted_type = EXP_TYPE_CREW + config_tag = "VETERAN_ADVISOR" + + outfit = /datum/outfit/job/veteran_advisor + plasmaman_outfit = /datum/outfit/plasmaman/security + + paycheck = PAYCHECK_CREW + paycheck_department = ACCOUNT_SEC + + liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + + display_order = JOB_DISPLAY_ORDER_VETERAN_ADVISOR + departments_list = list(/datum/job_department/security) + + family_heirlooms = list(/obj/item/plaque) + + mail_goodies = list( + /obj/item/clothing/accessory/medal/conduct = 1, + /obj/item/instrument/trumpet = 5, + /obj/item/storage/fancy/cigarettes/cigars = 10, + ) + rpg_title = "Royal Advisor" + allow_bureaucratic_error = FALSE + job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS + +/datum/job/veteran_advisor/get_roundstart_spawn_point() //Spawning at Brig where Officers spawn + if (length(GLOB.start_landmarks_list["Security Officer"])) + return pick(GLOB.start_landmarks_list["Security Officer"]) + return ..() + +/datum/job/veteran_advisor/after_spawn(mob/living/spawned, client/player_client) + . = ..() + var/mob/living/carbon/veteran = spawned + spawned.add_quirk(/datum/quirk/paraplegic) //Even in 2300s veterans are getting it bad + if(veteran) + veteran.gain_trauma(/datum/brain_trauma/special/ptsd) //War, war never changes... + +/datum/outfit/job/veteran_advisor + name = "Veteran Security Advisor" + jobtype = /datum/job/veteran_advisor + + id_trim = /datum/id_trim/job/veteran_advisor + backpack_contents = list( + /obj/item/modular_computer/pda/veteran_advisor = 1, + /obj/item/storage/fancy/cigarettes/cigars = 1, + /obj/item/lighter = 1, + /obj/item/clothing/accessory/medal/bronze_heart = 1, + ) + + uniform = /obj/item/clothing/under/rank/security/officer/formal + head = /obj/item/clothing/head/soft/veteran + mask = /obj/item/clothing/mask/cigarette/cigar + suit = /obj/item/clothing/suit/jacket/trenchcoat + belt = /obj/item/storage/belt/holster/detective/full/ert //M1911 pistol + ears = /obj/item/radio/headset/heads/hos/advisor + glasses = /obj/item/clothing/glasses/eyepatch + shoes = /obj/item/clothing/shoes/jackboots + l_pocket = /obj/item/coin/antagtoken + r_pocket = /obj/item/melee/baton/telescopic + r_hand = /obj/item/cane + + implants = list(/obj/item/implant/mindshield) diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm index 6dadcd5768ee3..e99e3714c6b60 100644 --- a/code/modules/keybindings/bindings_atom.dm +++ b/code/modules/keybindings/bindings_atom.dm @@ -2,12 +2,21 @@ // Only way to do that is to tie the behavior into the focus's keyLoop(). /atom/movable/keyLoop(client/user) - var/movement_dir = NONE - for(var/_key in user?.keys_held) - movement_dir = movement_dir | user.movement_keys[_key] - if(user?.next_move_dir_add) - movement_dir |= user.next_move_dir_add - if(user?.next_move_dir_sub) + // Clients don't go null randomly. They do go null unexpectedly though, when they're poked in particular ways + // keyLoop is called by a for loop over mobs. We're guarenteed that all the mobs have clients at the START + // But the move of one mob might poke the client of another, so we do this + if(!user) + return FALSE + var/movement_dir = user.intended_direction | user.next_move_dir_add + // If we're not movin anywhere, we aren't movin anywhere + // Safe because nothing adds to movement_dir after this moment + if(!movement_dir) + // No input == our removal would have done nothing + // So we can safely forget about it + user.next_move_dir_sub = NONE + return FALSE + + if(user.next_move_dir_sub) movement_dir &= ~user.next_move_dir_sub // Sanity checks in case you hold left and right and up to make sure you only go up if((movement_dir & NORTH) && (movement_dir & SOUTH)) @@ -15,14 +24,21 @@ if((movement_dir & EAST) && (movement_dir & WEST)) movement_dir &= ~(EAST|WEST) - if(user && movement_dir) //If we're not moving, don't compensate, as byond will auto-fill dir otherwise + if(user.dir != NORTH && movement_dir) //If we're not moving, don't compensate, as byond will auto-fill dir otherwise movement_dir = turn(movement_dir, -dir2angle(user.dir)) //By doing this we ensure that our input direction is offset by the client (camera) direction //turn without moving while using the movement lock key, unless something wants to ignore it and move anyway - if(user?.movement_locked && !(SEND_SIGNAL(src, COMSIG_MOVABLE_KEYBIND_FACE_DIR, movement_dir) & COMSIG_IGNORE_MOVEMENT_LOCK)) + if(user.movement_locked && !(SEND_SIGNAL(src, COMSIG_MOVABLE_KEYBIND_FACE_DIR, movement_dir) & COMSIG_IGNORE_MOVEMENT_LOCK)) keybind_face_direction(movement_dir) - else - user?.Move(get_step(src, movement_dir), movement_dir) + // Null check cause of the signal above + else if(user) + user.Move(get_step(src, movement_dir), movement_dir) return !!movement_dir //true if there was actually any player input return FALSE + +/client/proc/calculate_move_dir() + var/movement_dir = NONE + for(var/_key in keys_held) + movement_dir |= movement_keys[_key] + intended_direction = movement_dir diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index 0aa0fd6952ed2..4a72fb9123da8 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -47,9 +47,10 @@ //the time a key was pressed isn't actually used anywhere (as of 2019-9-10) but this allows easier access usage/checking keys_held[_key] = world.time - if(!movement_locked) - var/movement = movement_keys[_key] - if(!(next_move_dir_sub & movement)) + var/movement = movement_keys[_key] + if(movement) + calculate_move_dir() + if(!movement_locked && !(next_move_dir_sub & movement)) next_move_dir_add |= movement // Client-level keybindings are ones anyone should be able to do at any time @@ -74,11 +75,10 @@ if(kb.can_use(src) && kb.down(src) && keycount >= MAX_COMMANDS_PER_KEY) break - holder?.key_down(_key, src) - mob.focus?.key_down(_key, src) + holder?.key_down(_key, src, full_key) + mob.focus?.key_down(_key, src, full_key) mob.update_mouse_pointer() - /client/verb/keyUp(_key as text) set instant = TRUE set hidden = TRUE @@ -93,9 +93,10 @@ keys_held -= _key - if(!movement_locked) - var/movement = movement_keys[_key] - if(!(next_move_dir_add & movement)) + var/movement = movement_keys[_key] + if(movement) + calculate_move_dir() + if(!movement_locked && !(next_move_dir_add & movement)) next_move_dir_sub |= movement // We don't do full key for release, because for mod keys you diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm index ef87e12d90103..d239c48d9ceee 100644 --- a/code/modules/keybindings/setup.dm +++ b/code/modules/keybindings/setup.dm @@ -1,6 +1,7 @@ // Set a client's focus to an object and override these procs on that object to let it handle keypresses -/datum/proc/key_down(key, client/user) // Called when a key is pressed down initially +/datum/proc/key_down(key, client/user, full_key) // Called when a key is pressed down initially + SHOULD_CALL_PARENT(TRUE) return /datum/proc/key_up(key, client/user) // Called when a key is released return diff --git a/code/modules/library/admin_only.dm b/code/modules/library/admin_only.dm index 3e10617d9fe98..847f28070e6ac 100644 --- a/code/modules/library/admin_only.dm +++ b/code/modules/library/admin_only.dm @@ -80,7 +80,7 @@ page_count = round(max(bookcount - 1, 0) / BOOKS_PER_PAGE) //This is just floor() search_page = clamp(search_page, 0, page_count) -/obj/machinery/computer/libraryconsole/admin_only_do_not_map_in_you_fucker/ui_status(mob/user) +/obj/machinery/computer/libraryconsole/admin_only_do_not_map_in_you_fucker/ui_status(mob/user, datum/ui_state/state) if(!check_rights_for(user.client, R_BAN)) return UI_CLOSE if(!SSdbcore.Connect()) @@ -339,7 +339,7 @@ ui.set_autoupdate(FALSE) // Nothing is changing here brother ui.open() -/datum/admin_book_viewer/ui_status(mob/user) +/datum/admin_book_viewer/ui_status(mob/user, datum/ui_state/state) if(!check_rights_for(user.client, R_BAN)) return UI_CLOSE return UI_INTERACTIVE diff --git a/code/modules/library/barcode_scanner.dm b/code/modules/library/barcode_scanner.dm index f96b60358c2ec..5cacf03e01356 100644 --- a/code/modules/library/barcode_scanner.dm +++ b/code/modules/library/barcode_scanner.dm @@ -6,6 +6,7 @@ throw_speed = 3 throw_range = 5 w_class = WEIGHT_CLASS_TINY + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) ///Weakref to the library computer we are connected to. var/datum/weakref/computer_ref ///The current scanning mode (BARCODE_SCANNER_CHECKIN|BARCODE_SCANNER_INVENTORY) diff --git a/code/modules/library/skill_learning/skill_station.dm b/code/modules/library/skill_learning/skill_station.dm index 697b34d742e2d..b376501f758fd 100644 --- a/code/modules/library/skill_learning/skill_station.dm +++ b/code/modules/library/skill_learning/skill_station.dm @@ -10,7 +10,7 @@ occupant_typecache = list(/mob/living/carbon) //todo make occupant_typecache per type state_open = TRUE // Only opens UI when inside; also, you can use the machine while lying down (for paraplegics and the like) - interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_IGNORE_MOBILITY + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_IGNORE_MOBILITY circuit = /obj/item/circuitboard/machine/skill_station /// Currently implanting/removing var/working = FALSE diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 5d82c33e23fbb..e3f72da5bbffd 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -44,7 +44,7 @@ /atom/proc/update_light() SHOULD_NOT_SLEEP(TRUE) - if(light_system != STATIC_LIGHT) + if(light_system != COMPLEX_LIGHT) CRASH("update_light() for [src] with following light_system value: [light_system]") if (!light_power || !light_range || !light_on) // We won't emit light anyways, destroy the light source. diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index 8918bcb0ed3c6..287102ed7cd10 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -80,7 +80,7 @@ if (needs_update) SSlighting.sources_queue -= src SSlighting.current_sources -= src - + top_atom = null source_atom = null source_turf = null @@ -108,15 +108,6 @@ UnregisterSignal(old_atom_host, COMSIG_MOVABLE_MOVED) return TRUE -///signal handler for when our host atom moves and we need to update our effects -/datum/light_source/proc/update_host_lights(atom/movable/host) - SIGNAL_HANDLER - - if(QDELETED(host)) - return - - host.update_light() - // Yes this doesn't align correctly on anything other than 4 width tabs. // If you want it to go switch everybody to elastic tab stops. // Actually that'd be great if you could! @@ -128,6 +119,19 @@ needs_update = level; \ } +///signal handler for when our host atom moves and we need to update our effects +/datum/light_source/proc/update_host_lights(atom/movable/host) + SIGNAL_HANDLER + if(QDELETED(host)) + return + + // If the host is our owner, we want to call their update so they can decide who the top atom should be + if(host == source_atom) + host.update_light() + return + + // Otherwise, our top atom just moved, so we trigger a normal rebuild + EFFECT_UPDATE(LIGHTING_CHECK_UPDATE) /// This proc will cause the light source to update the top atom, and add itself to the update queue. /datum/light_source/proc/update(atom/new_top_atom) diff --git a/code/modules/logging/categories/log_category_uplink.dm b/code/modules/logging/categories/log_category_uplink.dm index f88d224ad3b34..4ef0f1af0c01a 100644 --- a/code/modules/logging/categories/log_category_uplink.dm +++ b/code/modules/logging/categories/log_category_uplink.dm @@ -21,3 +21,8 @@ category = LOG_CATEGORY_UPLINK_SPELL config_flag = /datum/config_entry/flag/log_uplink master_category = /datum/log_category/uplink + +/datum/log_category/uplink_spy + category = LOG_CATEGORY_UPLINK_SPY + config_flag = /datum/config_entry/flag/log_uplink + master_category = /datum/log_category/uplink diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm index a4bcad876712f..97a543fa7e727 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm @@ -203,7 +203,7 @@ new /obj/item/reagent_containers/cup/beaker(src) new /obj/item/clothing/glasses/science(src) if(7) - new /obj/item/clothing/glasses/sunglasses(src) + new /obj/item/clothing/glasses/sunglasses/big(src) new /obj/item/clothing/mask/cigarette/rollie(src) else //empty grave diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm b/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm new file mode 100644 index 0000000000000..20210d56cc95c --- /dev/null +++ b/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm @@ -0,0 +1,131 @@ +/obj/machinery/computer/terminal/museum + name = "exhibit info terminal" + desc = "A relatively low-tech info board. Not as low-tech as an actual sign though. Appears to be quite old." + upperinfo = "Nanotrasen Museum Exhibit Info" + icon_state = "plaque" + icon_screen = "plaque_screen" + icon_keyboard = null + +/obj/effect/replica_spawner //description and name are intact, better to make a new fluff object for stuff that is not actually ingame as an object + name = "replica creator" + desc = "This creates a fluff object that looks exactly like the input, but like obviously a replica. Do not for the love of god use with stuff that has Initialize side effects." + icon = 'icons/hud/screen_gen.dmi' + icon_state = "x2" + invisibility = INVISIBILITY_ABSTRACT //nope, can't see this + anchored = TRUE + density = TRUE + opacity = FALSE + var/replica_path = /obj/structure/fluff + var/target_path + var/obvious_replica = TRUE + +/obj/effect/replica_spawner/Initialize(mapload) + . = ..() + if(isnull(target_path)) + return INITIALIZE_HINT_QDEL //no use to make a replica of null + var/atom/appearance_object = new target_path + var/atom/new_replica = new replica_path(loc) + + new_replica.icon = appearance_object.icon + new_replica.icon_state = appearance_object.icon_state + new_replica.copy_overlays(appearance_object.appearance, cut_old = TRUE) + new_replica.density = appearance_object.density //for like nondense showers and stuff + + new_replica.name = "[appearance_object.name][obvious_replica ? " replica" : ""]" + new_replica.desc = "[appearance_object.desc][obvious_replica ? " ..except this one is a replica.": ""]" + qdel(appearance_object) + qdel(src) + return INITIALIZE_HINT_QDEL + +/obj/structure/fluff/dnamod + name = "DNA Modifier" + desc = "DNA Manipulator replica. Essentially just a box of cool lights." + icon = 'icons/obj/service/hydroponics/equipment.dmi' + icon_state = "dnamod" + density = TRUE + +/obj/structure/fluff/preserved_borer + name = "preserved borer exhibit" + desc = "A preserved cortical borer. Probably been there long enough to not last long outside the exhibit." + icon = 'icons/obj/structures.dmi' + icon_state = "preservedborer" + density = TRUE + +/obj/structure/fluff/balloon_nuke + name = "nuclear balloon explosive" + desc = "You probably shouldn't stick around to see if this is inflated." + icon = /obj/machinery/nuclearbomb::icon + icon_state = /obj/machinery/nuclearbomb::icon_state + density = TRUE + max_integrity = 5 //one tap + +/obj/structure/fluff/balloon_nuke/atom_destruction() + playsound(loc, 'sound/effects/cartoon_pop.ogg', 75, vary = TRUE) + ..() + +/obj/structure/fluff/fake_camera + name = /obj/machinery/camera::name + desc = /obj/machinery/camera::desc + icon = /obj/machinery/camera::icon + icon_state = /obj/machinery/camera::icon_state + +/obj/structure/fluff/fake_scrubber + name = /obj/machinery/atmospherics/components/unary/vent_scrubber::name + desc = /obj/machinery/atmospherics/components/unary/vent_scrubber::desc + icon = /obj/machinery/atmospherics/components/unary/vent_scrubber::icon + layer = /obj/machinery/atmospherics/components/unary/vent_scrubber::layer + plane = FLOOR_PLANE + icon_state = "scrub_on" + +/obj/structure/fluff/fake_vent + name = /obj/machinery/atmospherics/components/unary/vent_pump::name + desc = /obj/machinery/atmospherics/components/unary/vent_pump::desc + icon = /obj/machinery/atmospherics/components/unary/vent_pump::icon + layer = /obj/machinery/atmospherics/components/unary/vent_scrubber::layer + plane = FLOOR_PLANE + icon_state = "vent_out" + +/turf/open/mirage + icon = 'icons/turf/floors.dmi' + icon_state = "mirage" + invisibility = INVISIBILITY_ABSTRACT + /// target turf x and y are offsets from our location instead of a direct coordinate + var/offset = TRUE + /// tile range that we show, 2 means that the target tile and two tiles ahead of it in our direction will show + var/range + var/target_turf_x = 0 + var/target_turf_y = 0 + /// if not specified, uses our Z + var/target_turf_z + +/turf/open/mirage/Initialize(mapload) + . = ..() + if(isnull(range)) + range = world.view + var/used_z = target_turf_z || z //if target z is not defined, use ours + var/turf/target = locate(offset ? target_turf_x + x : target_turf_x, offset ? target_turf_y + y : target_turf_y, used_z) + AddElement(/datum/element/mirage_border, target, dir, range) + +/obj/effect/mapping_helpers/ztrait_injector/museum + traits_to_add = list(ZTRAIT_NOPARALLAX = TRUE, ZTRAIT_NOXRAY = TRUE, ZTRAIT_NOPHASE = TRUE, ZTRAIT_BASETURF = /turf/open/indestructible/plating, ZTRAIT_SECRET = TRUE) + +/obj/effect/smooths_with_walls + name = "effect that smooths with walls" + desc = "to supplement /turf/open/mirage." + icon = 'icons/hud/screen_gen.dmi' + icon_state = "x2" + invisibility = INVISIBILITY_ABSTRACT + anchored = TRUE + density = TRUE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + +/obj/item/paper/fluff/museum/noend + name = "scrambled note" + default_raw_text = {"this place, +
    god whose idea was to build a museum in the void in the middle of god knows where there is no reason we should have done this +
    and those mannequins why do they stare back where the fuck did you get these from +
    how would we even get visitors here +
    sometimes i can catch them moving +
    +
    we should have never come here"} diff --git a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm index 58d14e0d041a4..5f0935bb8bde9 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm @@ -4,15 +4,24 @@ req_access = list(ACCESS_AWAY_SCIENCE) /obj/machinery/rnd/server/oldstation/Initialize(mapload) - register_context() var/datum/techweb/oldstation_web = locate(/datum/techweb/oldstation) in SSresearch.techwebs stored_research = oldstation_web return ..() /obj/machinery/rnd/server/oldstation/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(held_item && istype(held_item, /obj/item/research_notes)) context[SCREENTIP_CONTEXT_LMB] = "Generate research points" - return CONTEXTUAL_SCREENTIP_SET + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/rnd/server/oldstation/examine(mob/user) + . = ..() + + if(!in_range(user, src) && !isobserver(user)) + return + + . += span_notice("Insert [EXAMINE_HINT("Research Notes")] to generate points.") /obj/machinery/rnd/server/oldstation/attackby(obj/item/attacking_item, mob/user, params) if(istype(attacking_item, /obj/item/research_notes) && stored_research) diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 7676801a0a92f..faaaf9e420642 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -1395,3 +1395,32 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) var/turf/our_turf = get_turf(src) // In case a locker ate us or something our_turf.AddElement(/datum/element/bombable_turf) return INITIALIZE_HINT_QDEL + +/// this helper buckles all mobs on the tile to the first buckleable object +/obj/effect/mapping_helpers/mob_buckler + name = "Buckle Mob" + icon_state = "buckle" + late = TRUE + ///whether we force a buckle + var/force_buckle = FALSE + +/obj/effect/mapping_helpers/mob_buckler/Initialize(mapload) + . = ..() + var/atom/movable/buckle_to + var/list/mobs = list() + for(var/atom/movable/possible_buckle as anything in loc) + if(isnull(buckle_to) && possible_buckle.can_buckle) + buckle_to = possible_buckle + continue + + if(isliving(possible_buckle)) + mobs += possible_buckle + + if(isnull(buckle_to)) + log_mapping("[type] at [x] [y] [z] did not find anything to buckle to") + return INITIALIZE_HINT_QDEL + + for(var/mob/living/mob as anything in mobs) + buckle_to.buckle_mob(mob, force = force_buckle) + + return INITIALIZE_HINT_QDEL diff --git a/code/modules/mining/boulder_processing/_boulder_processing.dm b/code/modules/mining/boulder_processing/_boulder_processing.dm index daa6620a23308..d7d4be2557e10 100644 --- a/code/modules/mining/boulder_processing/_boulder_processing.dm +++ b/code/modules/mining/boulder_processing/_boulder_processing.dm @@ -3,186 +3,264 @@ desc = "You shouldn't be seeing this! And bouldertech isn't even a real company!" icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "ore_redemption" + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.5 anchored = TRUE density = TRUE /// What is the efficiency of minerals produced by the machine? var/refining_efficiency = 1 - /// How many boulders can we process maximum per loop? - var/boulders_processing_max = 1 - /// What boulder(s) are we holding? - var/list/boulders_contained = list() + /// How much durability of an boulder can we reduce + var/boulders_processing_count = 2 /// How many boulders can we hold maximum? var/boulders_held_max = 1 - /// Does this machine have a mineral storage link to the silo? - var/holds_minerals = FALSE - /// What materials do we accept and process out of boulders? Removing iron from an iron/glass boulder would leave a boulder with glass. - var/list/processable_materials = list() - /// If we get a boulder with one of these inside, we'll drop it back out. - var/static/list/drop_if_contained = list( - /obj/item/relic, - ) - /// What sound plays when a thing operates? var/usage_sound = 'sound/machines/mining/wooping_teleport.ogg' - /// Cooldown associated with the usage_sound played. - COOLDOWN_DECLARE(sound_cooldown) - /// Silo link to it's materials list. var/datum/component/remote_materials/silo_materials - ///Does this machine hold mining points? - var/holds_mining_points = FALSE /// Mining points held by the machine for miners. var/points_held = 0 + ///The action verb to display to players + var/action = "processing" + + /// Cooldown associated with the sound played for collecting mining points. + COOLDOWN_DECLARE(sound_cooldown) + /// Cooldown associated with taking in boulds. + COOLDOWN_DECLARE(accept_cooldown) /obj/machinery/bouldertech/Initialize(mapload) . = ..() + + silo_materials = AddComponent( + /datum/component/remote_materials, \ + mapload, \ + mat_container_flags = MATCONTAINER_NO_INSERT \ + ) + register_context() - if(holds_minerals) - silo_materials = AddComponent(/datum/component/remote_materials, mapload) /obj/machinery/bouldertech/LateInitialize() . = ..() - if(!holds_minerals) - return var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) AddElement(/datum/element/connect_loc, loc_connections) /obj/machinery/bouldertech/Destroy() - boulders_contained = null silo_materials = null return ..() -/obj/machinery/bouldertech/update_icon_state() +/obj/machinery/bouldertech/on_deconstruction(disassembled) + if(length(contents)) + for(var/obj/item/boulder/boulder in contents) + remove_boulder(boulder) + +/obj/machinery/bouldertech/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = CONTEXTUAL_SCREENTIP_SET + + if(isnull(held_item)) + context[SCREENTIP_CONTEXT_RMB] = "Remove Boulder" + return + + if(istype(held_item, /obj/item/boulder)) + context[SCREENTIP_CONTEXT_LMB] = "Insert boulder" + else if(istype(held_item, /obj/item/card/id) && points_held > 0) + context[SCREENTIP_CONTEXT_LMB] = "Claim mining points" + else if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] Panel" + else if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "" : "Un"] Anchor" + else if(panel_open && held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + +/obj/machinery/bouldertech/examine(mob/user) . = ..() + . += span_notice("The machine reads that it has [span_bold("[points_held] mining points")] stored. Swipe an ID to claim them.") + . += span_notice("Click to remove a stored boulder.") + + var/boulder_count = 0 + for(var/obj/item/boulder/potential_boulder in contents) + boulder_count += 1 + . += span_notice("Storage capacity = [boulder_count]/[boulders_held_max] boulders.") + . += span_notice("Can process upto [boulders_processing_count] boulders at a time.") + if(anchored) - icon_state ="[initial(icon_state)]" + . += span_notice("Its [EXAMINE_HINT("anchored")] in place.") else - icon_state ="[initial(icon_state)]-off" + . += span_warning("It needs to be [EXAMINE_HINT("anchored")] to start operations.") + + . += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].") + + if(panel_open) + . += span_notice("The whole machine can be [EXAMINE_HINT("pried")] apart.") + +/obj/machinery/bouldertech/update_icon_state() + . = ..() + var/suffix = "" + if(!anchored || !is_operational || (machine_stat & (BROKEN | NOPOWER)) || panel_open) + suffix = "-off" + icon_state ="[initial(icon_state)][suffix]" /obj/machinery/bouldertech/wrench_act(mob/living/user, obj/item/tool) . = ITEM_INTERACT_BLOCKING if(default_unfasten_wrench(user, tool, time = 1.5 SECONDS) == SUCCESSFUL_UNFASTEN) + if(anchored) + begin_processing() + else + end_processing() update_appearance(UPDATE_ICON_STATE) - START_PROCESSING(SSmachines, src) return ITEM_INTERACT_SUCCESS /obj/machinery/bouldertech/screwdriver_act(mob/living/user, obj/item/tool) - . = ..() + . = ITEM_INTERACT_BLOCKING if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-off", initial(icon_state), tool)) + update_appearance(UPDATE_ICON_STATE) return ITEM_INTERACT_SUCCESS /obj/machinery/bouldertech/crowbar_act(mob/living/user, obj/item/tool) - . = ..() - if(default_pry_open(tool, close_after_pry = TRUE, closed_density = FALSE)) - return ITEM_INTERACT_SUCCESS + . = ITEM_INTERACT_BLOCKING if(default_deconstruction_crowbar(tool)) return ITEM_INTERACT_SUCCESS +/obj/machinery/bouldertech/CanAllowThrough(atom/movable/mover, border_dir) + if(!anchored) + return FALSE + if(istype(mover, /obj/item/boulder)) + var/obj/item/boulder/boulder = mover + return can_process_boulder(boulder) + return ..() + +/** + * Can we process the boulder, checks only the boulders state & machines capacity + * Arguments + * + * * obj/item/boulder/new_boulder - the boulder we are checking + */ +/obj/machinery/bouldertech/proc/can_process_boulder(obj/item/boulder/new_boulder) + PRIVATE_PROC(TRUE) + SHOULD_BE_PURE(TRUE) + + //machine not operational + if(!anchored || panel_open || !is_operational || machine_stat & (BROKEN | NOPOWER)) + return FALSE + + //not a valid boulder + if(!istype(new_boulder) || QDELETED(new_boulder)) + return FALSE + + //someone just processed this + if(new_boulder.processed_by) + return FALSE + + //no space to hold boulders + var/boulder_count = 0 + for(var/obj/item/boulder/potential_boulder in contents) + boulder_count += 1 + if(boulder_count >= boulders_held_max) + return FALSE + + //did we cooldown enough to accept a boulder + return COOLDOWN_FINISHED(src, accept_cooldown) + +/** + * Accepts a boulder into the machine. Used when a boulder is first placed into the machine. + * Arguments + * + * * obj/item/boulder/new_boulder - the boulder to accept + */ +/obj/machinery/bouldertech/proc/accept_boulder(obj/item/boulder/new_boulder) + if(!can_process_boulder(new_boulder)) + return FALSE + + new_boulder.forceMove(src) + + COOLDOWN_START(src, accept_cooldown, 1.5 SECONDS) + + return TRUE + +/obj/machinery/bouldertech/proc/on_entered(datum/source, atom/movable/atom_movable) + SIGNAL_HANDLER + + if(!can_process_boulder(atom_movable)) + return + + INVOKE_ASYNC(src, PROC_REF(accept_boulder), atom_movable) + +/** + * Looks for a boost to the machine's efficiency, and applies it if found. + * Applied more on the chemistry integration but can be used for other things if desired. + */ +/obj/machinery/bouldertech/proc/check_for_boosts() + PROTECTED_PROC(TRUE) + + refining_efficiency = initial(refining_efficiency) //Reset refining efficiency to 100%. + +/** + * Checks if this machine can process this material + * Arguments + * + * * datum/material/mat - the material to process + */ +/obj/machinery/bouldertech/proc/can_process_material(datum/material/mat) + PROTECTED_PROC(TRUE) + + return FALSE + /obj/machinery/bouldertech/attackby(obj/item/attacking_item, mob/user, params) - if(holds_minerals && istype(attacking_item, /obj/item/boulder)) + if(panel_open) + return ..() + + if(istype(attacking_item, /obj/item/boulder)) + . = TRUE var/obj/item/boulder/my_boulder = attacking_item - update_boulder_count() if(!accept_boulder(my_boulder)) - balloon_alert_to_viewers("full!") + balloon_alert_to_viewers("cannot accept!") return balloon_alert_to_viewers("accepted") - START_PROCESSING(SSmachines, src) - return TRUE - if(istype(attacking_item, /obj/item/card/id) && holds_mining_points) + return + + if(istype(attacking_item, /obj/item/card/id)) + . = TRUE if(points_held <= 0) balloon_alert_to_viewers("no points to claim!") if(!COOLDOWN_FINISHED(src, sound_cooldown)) - return TRUE + return COOLDOWN_START(src, sound_cooldown, 1.5 SECONDS) playsound(src, 'sound/machines/buzz-sigh.ogg', 30, FALSE) - return FALSE + return + var/obj/item/card/id/id_card = attacking_item var/amount = tgui_input_number(user, "How many mining points do you wish to claim? ID Balance: [id_card.registered_account.mining_points], stored mining points: [points_held]", "Transfer Points", max_value = points_held, min_value = 0, round_value = 1) if(!amount) - return TRUE + return if(amount > points_held) amount = points_held id_card.registered_account.mining_points += amount points_held = round(points_held - amount) to_chat(user, span_notice("You claim [amount] mining points from \the [src] to [id_card].")) - return TRUE + return + return ..() /obj/machinery/bouldertech/attack_hand_secondary(mob/user, list/modifiers) . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) return if(!anchored) balloon_alert(user, "anchor first!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(!holds_minerals) - return SECONDARY_ATTACK_CONTINUE_CHAIN - if(!length(boulders_contained)) - balloon_alert_to_viewers("No boulders to remove!") + if(panel_open) + balloon_alert(user, "close panel!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - remove_boulder(pick(boulders_contained)) - return SECONDARY_ATTACK_CONTINUE_CHAIN - -/obj/machinery/bouldertech/deconstruct(disassembled) - . = ..() - if(length(contents)) - for(var/obj/item/boulder/boulder in contents) - remove_boulder(boulder) - -/obj/machinery/bouldertech/process() - if(!anchored) - return PROCESS_KILL - var/stop_processing_check = FALSE - var/boulders_concurrent = boulders_processing_max ///How many boulders can we touch this process() call - for(var/obj/item/potential_boulder as anything in boulders_contained) - if(QDELETED(potential_boulder)) - boulders_contained -= potential_boulder - break - if(boulders_concurrent <= 0) - break //Try again next time - - if(!istype(potential_boulder, /obj/item/boulder)) - potential_boulder.forceMove(drop_location()) - CRASH("\The [src] had a non-boulder in it's boulders contained!") - var/obj/item/boulder/boulder = potential_boulder - if(boulder.durability < 0) - CRASH("\The [src] had a boulder with negative durability!") - if(!check_for_processable_materials(boulder.custom_materials)) //Checks for any new materials we can process. - boulders_concurrent-- //We count skipped boulders - remove_boulder(boulder) - continue - boulders_concurrent-- - boulder.durability-- //One less durability to the processed boulder. - if(COOLDOWN_FINISHED(src, sound_cooldown)) - COOLDOWN_START(src, sound_cooldown, 1.5 SECONDS) - playsound(loc, usage_sound, 29, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) //This can get annoying. One play per process() call. - stop_processing_check = TRUE - if(boulder.durability <= 0) - breakdown_boulder(boulder) //Crack that bouwlder open! - continue - if(!stop_processing_check) - playsound(src.loc, 'sound/machines/ping.ogg', 50, FALSE) - return PROCESS_KILL - - -/obj/machinery/bouldertech/CanAllowThrough(atom/movable/mover, border_dir) - if(!anchored) - return FALSE - if(boulders_contained.len >= boulders_held_max) - return FALSE - if(istype(mover, /obj/item/boulder)) - var/obj/item/boulder/boulder = mover - return boulder.can_get_processed() - return ..() + var/obj/item/boulder/boulder = locate(/obj/item/boulder) in src + if(!boulder) + balloon_alert_to_viewers("no boulders to remove!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!remove_boulder(boulder)) + balloon_alert_to_viewers("no space to remove!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/machinery/bouldertech/examine(mob/user) - . = ..() - if(holds_mining_points) - . += span_notice("The machine reads that it has [span_bold("[points_held] mining points")] stored. Swipe an ID to claim them.") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /** * Accepts a boulder into the machinery, then converts it into minerals. @@ -191,159 +269,93 @@ * @param chosen_boulder The boulder to being breaking down into minerals. */ /obj/machinery/bouldertech/proc/breakdown_boulder(obj/item/boulder/chosen_boulder) + PRIVATE_PROC(TRUE) + if(QDELETED(chosen_boulder)) return FALSE if(chosen_boulder.loc != src) return FALSE - if(!length(chosen_boulder.custom_materials)) - qdel(chosen_boulder) - playsound(loc, 'sound/weapons/drill.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - update_boulder_count() - return FALSE - if(isnull(silo_materials)) - return FALSE - //here we loop through the boulder's ores - var/list/processable_ores = list() - var/tripped = FALSE - //If a material is in the boulder's custom_materials, but not in the processable_materials list, we add it to the processable_ores list to add back to a leftover boulder. - for(var/datum/material/possible_mat as anything in chosen_boulder.custom_materials) - if(!is_type_in_list(possible_mat, processable_materials)) - continue - var/quantity = chosen_boulder.custom_materials[possible_mat] - points_held = round(points_held + (quantity * possible_mat.points_per_unit * MINING_POINT_MACHINE_MULTIPLIER)) // put point total here into machine - processable_ores += possible_mat - processable_ores[possible_mat] = quantity - chosen_boulder.custom_materials -= possible_mat //Remove it from the boulder now that it's tracked - tripped = TRUE - if(!tripped) - remove_boulder(chosen_boulder) - say("Nothing to process!") - return FALSE //we shouldn't spend more time processing a boulder with contents we don't care about. - use_power(BASE_MACHINE_ACTIVE_CONSUMPTION) - check_for_boosts() //Calls the relevant behavior for boosting the machine's efficiency, if able. - var/is_artifact = (istype(chosen_boulder, /obj/item/boulder/artifact)) //We need to know if it's an artifact so we can carry it over to the new boulder. - var/obj/item/boulder/disposable_boulder = new (src) - disposable_boulder.custom_materials = processable_ores - silo_materials.insert_item(disposable_boulder, refining_efficiency) - qdel(disposable_boulder) - - refining_efficiency = initial(refining_efficiency) //Reset refining efficiency to 100% now that we've processed any relevant ores. - if(!length(chosen_boulder.custom_materials)) - playsound(loc, 'sound/weapons/drill.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - if(is_artifact) - points_held = round((points_held + MINER_POINT_MULTIPLIER) * MINING_POINT_MACHINE_MULTIPLIER) /// Artifacts give bonus points! - chosen_boulder.break_apart() - update_boulder_count() - return TRUE //We've processed all the materials in the boulder, so we can just destroy it in break_apart. - - chosen_boulder.restart_processing_cooldown() //So that we don't pick it back up! - chosen_boulder.durability = rand(chosen_boulder.boulder_size, chosen_boulder.boulder_size + BOULDER_SIZE_SMALL) //Reset durability to a random value between the boulder's size and a little more. + //if boulders are kept inside because there is no space to eject them, then they could be reprocessed, lets avoid that + if(!chosen_boulder.processed_by) + check_for_boosts() + + //here we loop through the boulder's ores + var/list/rejected_mats = list() + for(var/datum/material/possible_mat as anything in chosen_boulder.custom_materials) + var/quantity = chosen_boulder.custom_materials[possible_mat] * refining_efficiency + if(!can_process_material(possible_mat)) + rejected_mats[possible_mat] = quantity + continue + points_held = round(points_held + (quantity * possible_mat.points_per_unit * MINING_POINT_MACHINE_MULTIPLIER)) // put point total here into machine + if(!silo_materials.mat_container.insert_amount_mat(quantity, possible_mat)) + rejected_mats[possible_mat] = quantity + use_power(active_power_usage) + + //puts back materials that couldn't be processed + chosen_boulder.set_custom_materials(rejected_mats, refining_efficiency) + + //break the boulder down if we have processed all its materials + if(!length(chosen_boulder.custom_materials)) + playsound(loc, usage_sound, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + if(istype(chosen_boulder, /obj/item/boulder/artifact)) + points_held = round((points_held + MINER_POINT_MULTIPLIER) * MINING_POINT_MACHINE_MULTIPLIER) /// Artifacts give bonus points! + chosen_boulder.break_apart() + return TRUE //We've processed all the materials in the boulder, so we can just destroy it in break_apart. + + chosen_boulder.processed_by = src + + //eject the boulder since we are done with it remove_boulder(chosen_boulder) - return TRUE -/** - * Accepts a boulder into the machine. Used when a boulder is first placed into the machine. - * @param new_boulder The boulder to be accepted. - */ -/obj/machinery/bouldertech/proc/accept_boulder(obj/item/boulder/new_boulder) - if(isnull(new_boulder)) - return FALSE - if(boulders_contained.len >= boulders_held_max) //Full already - return FALSE - if(!istype(new_boulder)) //Can't be processed - return FALSE - if(!new_boulder.custom_materials) //Shouldn't happen, but just in case. - qdel(new_boulder) - playsound(loc, 'sound/weapons/drill.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - return FALSE - new_boulder.forceMove(src) - boulders_contained += new_boulder - SSore_generation.available_boulders -= new_boulder - START_PROCESSING(SSmachines, src) //Starts processing if we aren't already. - return TRUE +/obj/machinery/bouldertech/process() + if(!anchored || panel_open || !is_operational || machine_stat & (BROKEN | NOPOWER)) + return -/** - * Ejects a boulder from the machine. Used when a boulder is finished processing, or when a boulder can't be processed. - * @param drop_turf The location to eject the boulder to. If null, it will eject to the machine's drop_location(). - * @param specific_boulder The boulder to be ejected. - */ -/obj/machinery/bouldertech/proc/remove_boulder(obj/item/boulder/specific_boulder, turf/drop_turf = null) - if(isnull(specific_boulder)) - CRASH("remove_boulder() called with no boulder!") - if(!length(specific_boulder.custom_materials)) - qdel(specific_boulder) - update_boulder_count() - playsound(loc, 'sound/weapons/drill.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - return FALSE - specific_boulder.restart_processing_cooldown() //Reset the cooldown so we don't pick it back up by the same machine. - if(isturf(drop_turf)) - specific_boulder.forceMove(drop_turf) - else - specific_boulder.forceMove(drop_location()) - if(!update_boulder_count()) - return TRUE - STOP_PROCESSING(SSmachines, src) - balloon_alert_to_viewers("clear!") - playsound(loc, 'sound/machines/ping.ogg', 50, FALSE) - return TRUE + var/boulders_found = FALSE + var/boulders_processed = boulders_processing_count + for(var/obj/item/boulder/potential_boulder in contents) + boulders_found = TRUE + if(boulders_processed <= 0) + break //Try again next time + boulders_processed-- -/** - * Getter proc to determine how many boulders are contained in the machine. - * Also adds their reference to the boulders_contained list. - */ -/obj/machinery/bouldertech/proc/update_boulder_count() - boulders_contained = list() - for(var/obj/item/boulder/boulder in contents) - boulders_contained += boulder - return boulders_contained.len + if(potential_boulder.durability > 0) + potential_boulder.durability -= 1 + if(potential_boulder.durability > 0) + continue -/obj/machinery/bouldertech/proc/on_entered(datum/source, atom/movable/atom_movable) - SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(accept_boulder), atom_movable) + breakdown_boulder(potential_boulder) + boulders_found = FALSE -/** - * Looks for a boost to the machine's efficiency, and applies it if found. - * Applied more on the chemistry integration but can be used for other things if desired. - */ -/obj/machinery/bouldertech/proc/check_for_boosts() - refining_efficiency = initial(refining_efficiency) //Reset refining efficiency to 100%. + //when the boulder is removed it plays sound and displays a balloon alert. don't overlap when that happens + if(boulders_found) + playsound(loc, usage_sound, 29, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) + balloon_alert_to_viewers(action) /** - * Checks if a custom_material is in a list of processable materials in the machine. - * @param list/custom_material A list of materials, presumably taken from a boulder. If a material that this machine can process is in this list, it will return true, inclusively. + * Ejects a boulder from the machine. Used when a boulder is finished processing, or when a boulder can't be processed. + * Arguments + * + * * obj/item/boulder/specific_boulder - the boulder to remove */ -/obj/machinery/bouldertech/proc/check_for_processable_materials(list/boulder_mats) - for(var/material as anything in boulder_mats) - if(is_type_in_list(material, processable_materials)) - return TRUE - return FALSE +/obj/machinery/bouldertech/proc/remove_boulder(obj/item/boulder/specific_boulder) + PRIVATE_PROC(TRUE) -///Beacon to launch a new mining setup when activated. For testing and speed! -/obj/item/boulder_beacon - name = "boulder beacon" - desc = "N.T. approved boulder beacon, toss it down and you will have a full bouldertech mining station." - icon = 'icons/obj/machines/floor.dmi' - icon_state = "floor_beacon" - /// Number of activations left on this beacon. Uses will be removed as the beacon is used and each triggers a different machine to be spawned from it. - var/uses = 3 + if(QDELETED(specific_boulder)) + return TRUE + if(locate(/obj/item/boulder) in loc) //There is an boulder in our loc. it has be removed so we don't clog up our loc with even more boulders + return FALSE -/obj/item/boulder_beacon/attack_self() - loc.visible_message(span_warning("\The [src] begins to beep loudly!")) - addtimer(CALLBACK(src, PROC_REF(launch_payload)), 1 SECONDS) + //Reset durability to little random lower value cause we have crushed it so many times + var/size = specific_boulder.boulder_size + if(size == BOULDER_SIZE_SMALL) + specific_boulder.durability = rand(2, BOULDER_SIZE_SMALL - 1) + else + specific_boulder.durability = rand(BOULDER_SIZE_SMALL, size - 1) + specific_boulder.processed_by = src //so we don't take in the boulder again after we just ejected it + specific_boulder.forceMove(drop_location()) + specific_boulder.processed_by = null //now since move is done we can safely clear the reference + playsound(loc, 'sound/machines/ping.ogg', 50, FALSE) -/** - * Spawns a new bouldertech machine from the beacon, then removes a use from the beacon. - * Use one spawns a BRM teleporter, then a refinery, and lastly a smelter. - */ -/obj/item/boulder_beacon/proc/launch_payload() - playsound(src, SFX_SPARKS, 80, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - switch(uses) - if(3) - new /obj/machinery/bouldertech/brm(drop_location()) - if(2) - new /obj/machinery/bouldertech/refinery(drop_location()) - if(1) - new /obj/machinery/bouldertech/refinery/smelter(drop_location()) - qdel(src) - uses-- + return TRUE diff --git a/code/modules/mining/boulder_processing/beacon.dm b/code/modules/mining/boulder_processing/beacon.dm new file mode 100644 index 0000000000000..576e05baf5373 --- /dev/null +++ b/code/modules/mining/boulder_processing/beacon.dm @@ -0,0 +1,28 @@ +///Beacon to launch a new mining setup when activated. For testing and speed! +/obj/item/boulder_beacon + name = "boulder beacon" + desc = "N.T. approved boulder beacon, toss it down and you will have a full bouldertech mining station." + icon = 'icons/obj/machines/floor.dmi' + icon_state = "floor_beacon" + /// Number of activations left on this beacon. Uses will be removed as the beacon is used and each triggers a different machine to be spawned from it. + var/uses = 3 + +/obj/item/boulder_beacon/attack_self() + visible_message(span_warning("\The [src] begins to beep loudly!")) + addtimer(CALLBACK(src, PROC_REF(launch_payload)), 1 SECONDS) + +/** + * Spawns a new bouldertech machine from the beacon, then removes a use from the beacon. + * Use one spawns a BRM teleporter, then a refinery, and lastly a smelter. + */ +/obj/item/boulder_beacon/proc/launch_payload() + playsound(src, SFX_SPARKS, 80, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + switch(uses) + if(3) + new /obj/machinery/brm(drop_location()) + if(2) + new /obj/machinery/bouldertech/refinery(drop_location()) + if(1) + new /obj/machinery/bouldertech/refinery/smelter(drop_location()) + qdel(src) + uses-- diff --git a/code/modules/mining/boulder_processing/boulder.dm b/code/modules/mining/boulder_processing/boulder.dm index 77260eef0882e..699358c6adbda 100644 --- a/code/modules/mining/boulder_processing/boulder.dm +++ b/code/modules/mining/boulder_processing/boulder.dm @@ -12,38 +12,15 @@ throw_range = 2 throw_speed = 0.5 drag_slowdown = 1.5 // It's still a big rock. + ///When a refinery machine is working on this boulder, we'll set this. Re reset when the process is finished, but the boulder may still be refined/operated on further. - var/obj/machinery/bouldertech/processed_by = null + var/obj/machinery/processed_by = null /// How many steps of refinement this boulder has gone through. Starts at 5-8, goes down one each machine process. var/durability = 5 /// What was the size of the boulder when it was spawned? This is used for inheiriting the icon_state. var/boulder_size = BOULDER_SIZE_SMALL /// Used in inheriting the icon_state from our parent vent in update_icon. var/boulder_string = "boulder" - /// Cooldown used to prevents boulders from getting processed back into a machine immediately after being processed. - COOLDOWN_DECLARE(processing_cooldown) - - /// Static list of all minerals to populate gulag boulders with. - var/list/static/gulag_minerals = list( - /datum/material/diamond = 1, - /datum/material/gold = 8, - /datum/material/iron = 95, - /datum/material/plasma = 30, - /datum/material/silver = 20, - /datum/material/titanium = 8, - /datum/material/uranium = 3, - ) - /// Static list of all minerals to populate gulag boulders with, but with bluespace added where safe. - var/list/static/expanded_gulag_minerals = list( - /datum/material/bluespace = 1, - /datum/material/diamond = 1, - /datum/material/gold = 8, - /datum/material/iron = 94, - /datum/material/plasma = 30, - /datum/material/silver = 20, - /datum/material/titanium = 8, - /datum/material/uranium = 3, - ) /obj/item/boulder/Initialize(mapload) . = ..() @@ -55,18 +32,37 @@ processed_by = null return ..() +/obj/item/boulder/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(held_item?.tool_behaviour == TOOL_MINING || HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) + context[SCREENTIP_CONTEXT_RMB] = "Crush boulder into ore" + return CONTEXTUAL_SCREENTIP_SET + /obj/item/boulder/examine(mob/user) . = ..() . += span_notice("This boulder would take [durability] more steps to refine or break.") + if(HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) + . += span_notice("You can crush this boulder with your bare hands.") /obj/item/boulder/examine_more(mob/user) . = ..() . += span_notice("[span_bold("Boulders")] can either be cracked open by [span_bold("mining tools")], or processed into sheets with [span_bold("refineries or smelters")]. Undisturbed boulders can be collected by the [span_bold("BRM")].") -/obj/item/boulder/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) - if(held_item?.tool_behaviour == TOOL_MINING || HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) - context[SCREENTIP_CONTEXT_RMB] = "Crush boulder into ore" - return CONTEXTUAL_SCREENTIP_SET +/obj/item/boulder/update_icon_state() + . = ..() + switch(boulder_size) + if(BOULDER_SIZE_SMALL) + icon_state = "[boulder_string]_small" + if(BOULDER_SIZE_MEDIUM) + icon_state = "[boulder_string]_medium" + if(BOULDER_SIZE_LARGE) + icon_state = "[boulder_string]_large" + else + icon_state = "[boulder_string]_small" + +/obj/item/boulder/CanAllowThrough(atom/movable/mover, border_dir) + . = ..() + if(istype(mover, /obj/item/boulder)) //This way, boulders can only go one at a time on conveyor belts, but everyone else can go through. + return FALSE /obj/item/boulder/attack_self(mob/user, list/modifiers) . = ..() @@ -84,11 +80,6 @@ manual_process(null, user, INATE_BOULDER_SPEED_MULTIPLIER) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/item/boulder/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(istype(mover, /obj/item/boulder)) //This way, boulders can only go one at a time on conveyor belts, but everyone else can go through. - return FALSE - /obj/item/boulder/attackby_secondary(obj/item/weapon, mob/user, params) . = ..() if(HAS_TRAIT(user, TRAIT_BOULDER_BREAKER) || HAS_TRAIT(weapon, TRAIT_BOULDER_BREAKER)) @@ -107,18 +98,6 @@ manual_process(null, user, INATE_BOULDER_SPEED_MULTIPLIER) //A little hacky but it works around the speed of the blackboard task selection process for now. return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/item/boulder/update_icon_state() - . = ..() - switch(boulder_size) - if(BOULDER_SIZE_SMALL) - icon_state = "[boulder_string]_small" - if(BOULDER_SIZE_MEDIUM) - icon_state = "[boulder_string]_medium" - if(BOULDER_SIZE_LARGE) - icon_state = "[boulder_string]_large" - else - icon_state = "[boulder_string]_small" - /** * This is called when a boulder is processed by a mob or tool, and reduces the durability of the boulder. * @param obj/item/weapon The weapon that is being used to process the boulder, that we pull toolspeed from. If null, we use the override_speed_multiplier instead. @@ -185,104 +164,12 @@ cracked_ore = new cracked_ore_type (drop_location(), quantity) SSblackbox.record_feedback("tally", "ore_mined", quantity, cracked_ore) -/** - * Handles the boulder's processing cooldown to check if it's ready to be processed again. - */ -/obj/item/boulder/proc/can_get_processed() - return COOLDOWN_FINISHED(src, processing_cooldown) - -/** - * Starts the boulder's processing cooldown. - */ -/obj/item/boulder/proc/restart_processing_cooldown() - COOLDOWN_START(src, processing_cooldown, 2 SECONDS) - -/** - * Moves boulder contents to the drop location, and then deletes the boulder. - */ +///Moves boulder contents to the drop location, and then deletes the boulder. /obj/item/boulder/proc/break_apart() - var/list/quips = list("Clang!", "Crack!", "Bang!", "Clunk!", "Clank!") if(length(contents)) + var/list/quips = list("Clang!", "Crack!", "Bang!", "Clunk!", "Clank!") visible_message(span_notice("[pick(quips)] Something falls out of \the [src]!")) playsound(loc, 'sound/effects/picaxe1.ogg', 60, FALSE) for(var/obj/item/content as anything in contents) content.forceMove(get_turf(src)) qdel(src) - -/** - * This is called when a boulder is spawned from a vent, and is used to set the boulder's icon as well as durability. - * We also set our boulder_size variable, which is used for inheiriting the icon_state later on if processed. - * @param obj/structure/ore_vent/parent_vent The vent that spawned this boulder to generate consistent boulder icons. If null, we use the default size. - * @param size The size of the boulder to spawn. If parent_vent is defined, this is ignored. - * @param is_artifact Whether or not this boulder is an artifact boulder. If true, we use the artifact boulder icon state regardless of size. - */ -/obj/item/boulder/proc/flavor_boulder(obj/structure/ore_vent/parent_vent, size = BOULDER_SIZE_SMALL, is_artifact = FALSE) - var/durability_min = size - var/durability_max = size + BOULDER_SIZE_SMALL - if(parent_vent) - durability_min = parent_vent.boulder_size - durability_max = parent_vent.boulder_size + BOULDER_SIZE_SMALL - durability = rand(durability_min, durability_max) //randomize durability a bit for some flavor. - boulder_size = size - if(parent_vent) - boulder_size = parent_vent.boulder_size - boulder_string = parent_vent.boulder_icon_state - update_appearance(UPDATE_ICON_STATE) - -/** - * Unique proc for gulag-style boulders, which adds a random amount of minerals to the boulder. - */ -/obj/item/boulder/proc/add_gulag_minerals() - var/datum/material/new_material = pick_weight(gulag_minerals) - var/list/new_mats = list() - new_mats[new_material] = SHEET_MATERIAL_AMOUNT * rand(1,3) //We only want a few sheets of material in the gulag boulders - set_custom_materials(new_mats) - -/obj/item/boulder/artifact - name = "artifact boulder" - desc = "This boulder is brimming with strange energy. Cracking it open could contain something unusual for science." - icon_state = "boulder_artifact" - /// This is the type of item that will be inside the boulder. Default is a strange object. - var/artifact_type = /obj/item/relic - /// References to the relic inside the boulder, if any. - var/obj/item/artifact_inside - -/obj/item/boulder/artifact/Initialize(mapload) - . = ..() - artifact_inside = new artifact_type(src) /// This could be poggers for archaeology in the future. - -/obj/item/boulder/artifact/Destroy(force) - QDEL_NULL(artifact_inside) - return ..() - -/obj/item/boulder/artifact/convert_to_ore() - . = ..() - artifact_inside.forceMove(drop_location()) - artifact_inside = null - -/obj/item/boulder/artifact/break_apart() - artifact_inside = null - return ..() - - -/obj/item/boulder/gulag - name = "low-quality boulder" - desc = "This rocks. It's a low quality boulder, so it's probably not worth as much." - -/obj/item/boulder/gulag/Initialize(mapload) - . = ..() - add_gulag_minerals(gulag_minerals) - -/obj/item/boulder/gulag_expanded - name = "low-density boulder" - desc = "This rocks. It's not very well packed, and can't contain as many minerals." - -/obj/item/boulder/gulag_expanded/Initialize(mapload) - . = ..() - add_gulag_minerals(expanded_gulag_minerals) - -/obj/item/boulder/shabby - name = "shabby boulder" - desc = "A bizzare, twisted boulder. Wait, wait no, it's just a rock." - custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.1, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.1) - durability = 1 diff --git a/code/modules/mining/boulder_processing/boulder_types.dm b/code/modules/mining/boulder_processing/boulder_types.dm new file mode 100644 index 0000000000000..08ed961404c3a --- /dev/null +++ b/code/modules/mining/boulder_processing/boulder_types.dm @@ -0,0 +1,76 @@ +///Boulders with special artificats that can give higher mining points +/obj/item/boulder/artifact + name = "artifact boulder" + desc = "This boulder is brimming with strange energy. Cracking it open could contain something unusual for science." + icon_state = "boulder_artifact" + /// This is the type of item that will be inside the boulder. Default is a strange object. + var/artifact_type = /obj/item/relic + /// References to the relic inside the boulder, if any. + var/obj/item/artifact_inside + +/obj/item/boulder/artifact/Initialize(mapload) + . = ..() + artifact_inside = new artifact_type(src) /// This could be poggers for archaeology in the future. + +/obj/item/boulder/artifact/Destroy(force) + QDEL_NULL(artifact_inside) + return ..() + +/obj/item/boulder/artifact/convert_to_ore() + . = ..() + artifact_inside.forceMove(drop_location()) + artifact_inside = null + +/obj/item/boulder/artifact/break_apart() + artifact_inside = null + return ..() + +///Boulders usually spawned in lavaland labour camp area +/obj/item/boulder/gulag + name = "low-quality boulder" + desc = "This rocks. It's a low quality boulder, so it's probably not worth as much." + +/obj/item/boulder/gulag/Initialize(mapload) + . = ..() + + /// Static list of all minerals to populate gulag boulders with. + var/list/static/gulag_minerals = list( + /datum/material/diamond = 1, + /datum/material/gold = 8, + /datum/material/iron = 95, + /datum/material/plasma = 30, + /datum/material/silver = 20, + /datum/material/titanium = 8, + /datum/material/uranium = 3, + ) + + set_custom_materials(list(pick_weight(gulag_minerals) = SHEET_MATERIAL_AMOUNT * rand(1, 3))) + +///Boulders usually spawned in lavaland labour camp area but with bluespace material +/obj/item/boulder/gulag_expanded + name = "low-density boulder" + desc = "This rocks. It's not very well packed, and can't contain as many minerals." + +/obj/item/boulder/gulag_expanded/Initialize(mapload) + . = ..() + + /// Static list of all minerals to populate gulag boulders with, but with bluespace added where safe. + var/list/static/expanded_gulag_minerals = list( + /datum/material/bluespace = 1, + /datum/material/diamond = 1, + /datum/material/gold = 8, + /datum/material/iron = 94, + /datum/material/plasma = 30, + /datum/material/silver = 20, + /datum/material/titanium = 8, + /datum/material/uranium = 3, + ) + + set_custom_materials(list(pick_weight(expanded_gulag_minerals) = SHEET_MATERIAL_AMOUNT * rand(1, 3))) + +///lowgrade boulder, most commonly spawned +/obj/item/boulder/shabby + name = "shabby boulder" + desc = "A bizzare, twisted boulder. Wait, wait no, it's just a rock." + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.1, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.1) + durability = 1 diff --git a/code/modules/mining/boulder_processing/brm.dm b/code/modules/mining/boulder_processing/brm.dm index c76ec9dabbd78..e4d525bff056c 100644 --- a/code/modules/mining/boulder_processing/brm.dm +++ b/code/modules/mining/boulder_processing/brm.dm @@ -1,53 +1,183 @@ +///Sound played when boulders are teleported manually by hand #define MANUAL_TELEPORT_SOUND 'sound/machines/mining/manual_teleport.ogg' +///Sound played when boulders are teleported automatically in process() #define AUTO_TELEPORT_SOUND 'sound/machines/mining/auto_teleport.ogg' +///Time taken to spawn a boulder, also the cooldown applied before the next manual teleportation +#define TELEPORTATION_TIME (1.5 SECONDS) +///Cooldown for automatic teleportation after processing boulders_processing_max number of boulders +#define BATCH_COOLDOWN (3 SECONDS) +///Special case when we are trying to teleport a boulder but there is already another boulder in our loc +#define TURF_BLOCKED_BY_BOULDER -1 -/obj/machinery/bouldertech/brm +/obj/machinery/brm name = "boulder retrieval matrix" desc = "A teleportation matrix used to retrieve boulders excavated by mining NODEs from ore vents." + icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "brm" + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.5 circuit = /obj/item/circuitboard/machine/brm - usage_sound = MANUAL_TELEPORT_SOUND processing_flags = START_PROCESSING_MANUALLY - boulders_held_max = 2 + anchored = TRUE + density = TRUE + + /// How many boulders can we process maximum per loop? + var/boulders_processing_max = 1 /// Are we trying to actively collect boulders automatically? var/toggled_on = FALSE - /// How long does it take to collect a boulder? - var/teleportation_time = 1.5 SECONDS + ///Have we finished processing a full batch of boulders + var/batch_processing = FALSE + /// Cooldown used for left click teleportation. COOLDOWN_DECLARE(manual_teleport_cooldown) + /// Cooldown used for automatic teleportation after processing boulders_processing_max number of boulders. + COOLDOWN_DECLARE(batch_start_cooldown) + +/obj/machinery/brm/Initialize(mapload) + . = ..() + register_context() + +/obj/machinery/brm/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = CONTEXTUAL_SCREENTIP_SET + + if(isnull(held_item)) + context[SCREENTIP_CONTEXT_LMB] = "Teleport single boulder" + context[SCREENTIP_CONTEXT_RMB] = "Toggle [toggled_on ? "Off" : "On"] automatic boulder retrieval" + return + + if(!isnull(held_item)) + if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "" : "Un"] Anchor" + return + if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] Panel" + return -/obj/machinery/bouldertech/brm/Initialize(mapload) + if(panel_open) + if(held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/brm/examine(mob/user) . = ..() - set_wires(new /datum/wires/brm(src)) + . += span_notice("The small screen reads there are [span_boldnotice("[SSore_generation.available_boulders.len] boulders")] available to teleport.") + . += span_notice("Can collect upto [boulders_processing_max] boulders at a time.") + . += span_notice("Automatic boulder retrival can be toggled [EXAMINE_HINT("[toggled_on ? "Off" : "On"]")] with [EXAMINE_HINT("Right Click")].") + + if(anchored) + . += span_notice("Its [EXAMINE_HINT("anchored")] in place.") + else + . += span_warning("It needs to be [EXAMINE_HINT("anchored")] to start operations.") + + . += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] [panel_open ? "Closed" : "Open"].") + + if(panel_open) + . += span_notice("The whole machine can be [EXAMINE_HINT("pried")] apart.") -/obj/machinery/bouldertech/brm/Destroy() - QDEL_NULL(wires) +/obj/machinery/brm/update_icon_state() + icon_state = initial(icon_state) + + if(!anchored || !is_operational || machine_stat & (BROKEN | NOPOWER) || panel_open) + icon_state = "[icon_state]-off" + return + + if(toggled_on) + icon_state = "[icon_state]-toggled" + return + + return ..() + +/obj/machinery/brm/wrench_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_unfasten_wrench(user, tool, time = 1.5 SECONDS) == SUCCESSFUL_UNFASTEN) + update_appearance(UPDATE_ICON_STATE) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/brm/screwdriver_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-off", initial(icon_state), tool)) + update_appearance(UPDATE_ICON_STATE) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/brm/crowbar_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + +///To allow boulders on a conveyer belt to move unobstructed if multiple machines are made on a single line +/obj/machinery/brm/CanAllowThrough(atom/movable/mover, border_dir) + if(!anchored) + return FALSE + if(istype(mover, /obj/item/boulder)) + return TRUE return ..() -/obj/machinery/bouldertech/brm/attack_hand(mob/living/user, list/modifiers) +/obj/machinery/brm/RefreshParts() . = ..() + + boulders_processing_max = 0 + for(var/datum/stock_part/part in component_parts) + boulders_processing_max += part.tier + + boulders_processing_max = ROUND_UP((boulders_processing_max / 12) * 7) + +/obj/machinery/brm/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(. || panel_open) + return if(!handle_teleport_conditions(user)) return - pre_collect_boulder() - COOLDOWN_START(src, manual_teleport_cooldown, teleportation_time) + var/result = pre_collect_boulder() + if(result == TURF_BLOCKED_BY_BOULDER) + balloon_alert(user, "no space") + else if(result) + balloon_alert(user, "teleporting") + COOLDOWN_START(src, manual_teleport_cooldown, TELEPORTATION_TIME) + + return TRUE + +/** + * Handles qualifiers for enabling teleportation of boulders. + * Returns TRUE if the teleportation can proceed, FALSE otherwise. + * Arguments + * + * * mob/user - the mob to inform if conditions aren't met + */ +/obj/machinery/brm/proc/handle_teleport_conditions(mob/user) + PRIVATE_PROC(TRUE) + + if(!COOLDOWN_FINISHED(src, manual_teleport_cooldown)) + return FALSE + if(panel_open) + balloon_alert(user, "close panel first!") + return FALSE + if(batch_processing) + balloon_alert(user, "batch still processing!") + return FALSE + playsound(src, MANUAL_TELEPORT_SOUND, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE -/obj/machinery/bouldertech/brm/attack_robot(mob/user) +/obj/machinery/brm/attack_robot(mob/user) + . = ..() + if(. || panel_open) + return if(!handle_teleport_conditions(user)) return - pre_collect_boulder() - COOLDOWN_START(src, manual_teleport_cooldown, teleportation_time) + var/result = pre_collect_boulder() + if(result == TURF_BLOCKED_BY_BOULDER) + balloon_alert(user, "no space") + else if(result) + balloon_alert(user, "teleporting") -/obj/machinery/bouldertech/brm/attackby(obj/item/attacking_item, mob/user, params) - if(is_wire_tool(attacking_item) && panel_open) - wires.interact(user) - return TRUE - return ..() + COOLDOWN_START(src, manual_teleport_cooldown, TELEPORTATION_TIME) + + return TRUE -/obj/machinery/bouldertech/brm/attack_hand_secondary(mob/user, list/modifiers) +/obj/machinery/brm/attack_hand_secondary(mob/user, list/modifiers) . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) return if(!anchored) balloon_alert(user, "anchor first!") @@ -55,133 +185,107 @@ toggle_auto_on(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/machinery/bouldertech/brm/attack_robot_secondary(mob/user, list/modifiers) +/** + * Toggles automatic boulder retrieval on. + * Adjusts the teleportation sound, icon state, and begins processing. + * Arguments + * + * * mob/user - the player who has toggled us + */ +/obj/machinery/brm/proc/toggle_auto_on(mob/user) + PRIVATE_PROC(TRUE) + + if(panel_open) + balloon_alert(user, "close panel first!") + return + if(!anchored) + balloon_alert(user, "anchor first!") + return + if(!is_operational || machine_stat & (BROKEN | NOPOWER)) + return + + toggled_on = ! toggled_on + if(toggled_on) + begin_processing() + else + end_processing() + update_appearance(UPDATE_ICON_STATE) + +/obj/machinery/brm/attack_robot_secondary(mob/user, list/modifiers) . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) return if(!anchored) balloon_alert(user, "anchor first!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + toggle_auto_on(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/machinery/bouldertech/brm/process() - if(SSore_generation.available_boulders.len < 1) - say("No boulders to collect. Entering idle mode.") - toggled_on = FALSE - update_appearance(UPDATE_ICON_STATE) - return PROCESS_KILL - for(var/i in 1 to boulders_processing_max) - if(pre_collect_boulder()) - continue - toggled_on = FALSE - update_appearance(UPDATE_ICON_STATE) - return PROCESS_KILL - for(var/obj/item/boulder/ground_rocks in loc.contents) - boulders_contained += ground_rocks - if(boulders_contained.len < boulders_held_max) - continue - toggled_on = FALSE - boulders_contained.Cut() - update_appearance(UPDATE_ICON_STATE) +/obj/machinery/brm/process() + if(!toggled_on) return PROCESS_KILL -/obj/machinery/bouldertech/brm/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - context[SCREENTIP_CONTEXT_LMB] = "Teleport single boulder" - context[SCREENTIP_CONTEXT_RMB] = "Toggle automatic boulder retrieval" - return CONTEXTUAL_SCREENTIP_SET - -/obj/machinery/bouldertech/brm/examine(mob/user) - . = ..() - . += span_notice("The small screen reads there are [span_boldnotice("[SSore_generation.available_boulders.len] boulders")] available to teleport.") - -/obj/machinery/bouldertech/brm/RefreshParts() - . = ..() - var/scanner_stack = 0 - var/laser_stack = 0 - for(var/datum/stock_part/scanning_module/scanner in component_parts) - scanner_stack += scanner.tier - boulders_processing_max = scanner_stack - for(var/datum/stock_part/micro_laser/laser in component_parts) - laser_stack += laser.tier - boulders_held_max = laser_stack + 1 - -/obj/machinery/bouldertech/brm/update_icon_state() - if(toggled_on && !panel_open) - icon_state = "[initial(icon_state)]-toggled" + //have some cooldown after processing the previous batch of boulders + if(batch_processing || !COOLDOWN_FINISHED(src, batch_start_cooldown)) return - return ..() -/** - * Handles qualifiers for enabling teleportation of boulders. - * Returns TRUE if the teleportation can proceed, FALSE otherwise. - */ -/obj/machinery/bouldertech/brm/proc/handle_teleport_conditions(mob/user) - if(!COOLDOWN_FINISHED(src, manual_teleport_cooldown)) - return FALSE - if(panel_open) - balloon_alert(user, "close panel first!") - return FALSE - playsound(src, MANUAL_TELEPORT_SOUND, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - return TRUE + pre_collect_boulder(FALSE, boulders_processing_max) /** * Begins to collect a boulder from the available boulders list in SSore_generation. - * Boulders must not be processed by another BRM or machine, and must be in the available boulders list. + * Boulders must be in the available boulders list. * A selected boulder is picked randomly. - * The actual movement is then handled by collect_boulder() after a timed callback. + * Arguments + * + * * feedback - should we play sound and display allert if now boulders are available + * * boulders_remaining - how many boulders we want to try & collect spawning a boulder every TELEPORTATION_TIME seconds */ -/obj/machinery/bouldertech/brm/proc/pre_collect_boulder() - if(!SSore_generation.available_boulders.len) - playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) - balloon_alert_to_viewers("no boulders to collect!") - return FALSE //Nothing to collect - var/obj/item/boulder/random_boulder = pick(SSore_generation.available_boulders) - if(random_boulder.processed_by) +/obj/machinery/brm/proc/pre_collect_boulder(feedback = TRUE, boulders_remaining = 1) + PRIVATE_PROC(TRUE) + + batch_processing = TRUE + + //not within operation parameters + if(!anchored || panel_open || !is_operational || machine_stat & (BROKEN | NOPOWER)) + batch_processing = FALSE return FALSE - random_boulder.processed_by = src - random_boulder.Shake(duration = 1.5 SECONDS) - SSore_generation.available_boulders -= random_boulder - addtimer(CALLBACK(src, PROC_REF(collect_boulder), random_boulder), 1.5 SECONDS) - return TRUE + //There is an boulder in our loc. it has be removed so we don't clog up our loc with even more boulders + if(locate(/obj/item/boulder) in loc) + batch_processing = FALSE + return TURF_BLOCKED_BY_BOULDER -/** - * Collects a boulder from the available boulders list in SSore_generation. - * Handles the movement of the boulder as well as visual effects on the BRM. - * @param obj/item/boulder/random_boulder The boulder to collect. - */ -/obj/machinery/bouldertech/brm/proc/collect_boulder(obj/item/boulder/random_boulder) - flick("brm-flash", src) - if(QDELETED(random_boulder)) - playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) - balloon_alert_to_viewers("target lost!") + //no more boulders + if(!SSore_generation.available_boulders.len) + if(feedback) + playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) + balloon_alert_to_viewers("no boulders to collect!") + batch_processing = FALSE return FALSE - playsound(src, AUTO_TELEPORT_SOUND, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + + //pick & spawn the boulder + flick("brm-flash", src) + playsound(src, toggled_on ? AUTO_TELEPORT_SOUND : MANUAL_TELEPORT_SOUND, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + var/obj/item/boulder/random_boulder = pick(SSore_generation.available_boulders) + SSore_generation.available_boulders -= random_boulder random_boulder.forceMove(drop_location()) - random_boulder.processed_by = null random_boulder.pixel_x = rand(-2, 2) random_boulder.pixel_y = rand(-2, 2) balloon_alert_to_viewers("boulder appears!") - random_boulder.visible_message(span_warning("[random_boulder] suddenly appears!")) - use_power(BASE_MACHINE_ACTIVE_CONSUMPTION * 0.1) - return TRUE + use_power(active_power_usage) -/** - * Toggles automatic boulder retrieval on. - * Adjusts the teleportation sound, icon state, and begins processing. - * @param mob/user The user who toggled the BRM. - */ -/obj/machinery/bouldertech/brm/proc/toggle_auto_on(mob/user) - if(panel_open) - if(user) - balloon_alert(user, "close panel first!") - return - toggled_on = TRUE - START_PROCESSING(SSmachines, src) - update_appearance(UPDATE_ICON_STATE) - usage_sound = AUTO_TELEPORT_SOUND + //try again if we have more boulders to work with + boulders_remaining -= 1 + if(boulders_remaining <= 0) + COOLDOWN_START(src, batch_start_cooldown, BATCH_COOLDOWN) + batch_processing = FALSE + return TRUE + else + addtimer(CALLBACK(src, PROC_REF(pre_collect_boulder), feedback, boulders_remaining, FALSE), TELEPORTATION_TIME) #undef MANUAL_TELEPORT_SOUND #undef AUTO_TELEPORT_SOUND +#undef TELEPORTATION_TIME +#undef BATCH_COOLDOWN +#undef TURF_BLOCKED_BY_BOULDER diff --git a/code/modules/mining/boulder_processing/refinery.dm b/code/modules/mining/boulder_processing/refinery.dm index a6c6c2e7dfc4b..662bb3e75e1e5 100644 --- a/code/modules/mining/boulder_processing/refinery.dm +++ b/code/modules/mining/boulder_processing/refinery.dm @@ -7,44 +7,34 @@ name = "boulder refinery" desc = "BR for short. Accepts boulders and refines non-metallic ores into sheets using internal chemicals." icon_state = "stacker" - holds_minerals = TRUE - processable_materials = list( - /datum/material/glass, - /datum/material/plasma, - /datum/material/diamond, - /datum/material/bluespace, - /datum/material/bananium, - /datum/material/plastic, - ) circuit = /obj/item/circuitboard/machine/refinery usage_sound = 'sound/machines/mining/refinery.ogg' - holds_mining_points = TRUE + action = "crushing" -/// okay so var that holds mining points to claim -/// add total of pts from minerals mined in parent proc -/// then, little mini UI showing points to collect? +/obj/machinery/bouldertech/refinery/can_process_material(datum/material/possible_mat) + var/static/list/processable_materials + if(!length(processable_materials)) + processable_materials = list( + /datum/material/glass, + /datum/material/plasma, + /datum/material/diamond, + /datum/material/bluespace, + /datum/material/bananium, + /datum/material/plastic, + ) + return is_type_in_list(possible_mat, processable_materials) /obj/machinery/bouldertech/refinery/RefreshParts() . = ..() - var/manipulator_stack = 0 - var/matter_bin_stack = 0 - for(var/datum/stock_part/servo/servo in component_parts) - manipulator_stack += servo.tier - 1 - boulders_processing_max = clamp(manipulator_stack, 1, 6) - for(var/datum/stock_part/matter_bin/bin in component_parts) - matter_bin_stack += bin.tier - boulders_held_max = matter_bin_stack - -/obj/machinery/bouldertech/refinery/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - if(istype(held_item, /obj/item/boulder)) - context[SCREENTIP_CONTEXT_LMB] = "Insert boulder" - if(istype(held_item, /obj/item/card/id) && points_held > 0) - context[SCREENTIP_CONTEXT_LMB] = "Claim mining points" - context[SCREENTIP_CONTEXT_RMB] = "Remove boulder" - return CONTEXTUAL_SCREENTIP_SET + boulders_held_max = 0 + for(var/datum/stock_part/matter_bin/bin in component_parts) + boulders_held_max += bin.tier + boulders_processing_count = 0 + for(var/datum/stock_part/servo/servo in component_parts) + boulders_processing_count += servo.tier + boulders_processing_count = ROUND_UP((boulders_processing_count / 8) * boulders_held_max) /** * Your other new favorite industrial waste magnet! @@ -55,36 +45,43 @@ name = "boulder smelter" desc = "BS for short. Accept boulders and refines metallic ores into sheets." icon_state = "smelter" - processable_materials = list( - /datum/material/iron, - /datum/material/titanium, - /datum/material/silver, - /datum/material/gold, - /datum/material/uranium, - /datum/material/mythril, - /datum/material/adamantine, - /datum/material/runite, - ) - light_system = MOVABLE_LIGHT - light_range = 1 - light_power = 2 + light_system = OVERLAY_LIGHT + light_range = 2 + light_power = 3 light_color = "#ffaf55" - light_on = FALSE circuit = /obj/item/circuitboard/machine/smelter usage_sound = 'sound/machines/mining/smelter.ogg' + action = "smelting" -/obj/machinery/bouldertech/refinery/smelter/RefreshParts() +/obj/machinery/bouldertech/refinery/smelter/Initialize(mapload) . = ..() - light_power = boulders_processing_max + set_light_on(TRUE) + +/obj/machinery/bouldertech/refinery/smelter/can_process_material(datum/material/possible_mat) + var/static/list/processable_materials + if(!length(processable_materials)) + processable_materials = list( + /datum/material/iron, + /datum/material/titanium, + /datum/material/silver, + /datum/material/gold, + /datum/material/uranium, + ) + return is_type_in_list(possible_mat, processable_materials) -/obj/machinery/bouldertech/refinery/smelter/accept_boulder(obj/item/boulder/new_boulder) +/obj/machinery/bouldertech/refinery/smelter/set_light_on(new_value) + if(panel_open || !anchored || !is_operational || machine_stat & (BROKEN | NOPOWER)) + new_value = FALSE + return ..() + +/obj/machinery/bouldertech/refinery/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) . = ..() - if(.) - set_light_on(TRUE) - return TRUE + set_light_on(TRUE) -/obj/machinery/bouldertech/refinery/smelter/process() +/obj/machinery/bouldertech/refinery/default_unfasten_wrench(mob/user, obj/item/wrench, time) . = ..() - if(. == PROCESS_KILL) - set_light_on(FALSE) + set_light_on(TRUE) + +/obj/machinery/bouldertech/refinery/smelter/on_set_is_operational(old_value) + set_light_on(TRUE) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index add06da08a694..e1df98239e2cd 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -21,7 +21,7 @@ sharpness = SHARP_EDGED actions_types = list(/datum/action/item_action/toggle_light) obj_flags = UNIQUE_RENAME - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 5 light_on = FALSE var/list/trophies = list() diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm index 484720e7159c7..92464c3c7d83a 100644 --- a/code/modules/mining/equipment/mineral_scanner.dm +++ b/code/modules/mining/equipment/mineral_scanner.dm @@ -49,6 +49,9 @@ /// The range of the scanner in tiles. var/range = 7 +/obj/item/t_scanner/adv_mining_scanner/cyborg + shut_off_on_unequip = FALSE + /obj/item/t_scanner/adv_mining_scanner/cyborg/Initialize(mapload) . = ..() toggle_on() diff --git a/code/modules/mining/equipment/monster_organs/monster_organ.dm b/code/modules/mining/equipment/monster_organs/monster_organ.dm index d8e4bfae98676..135373469d847 100644 --- a/code/modules/mining/equipment/monster_organs/monster_organ.dm +++ b/code/modules/mining/equipment/monster_organs/monster_organ.dm @@ -143,7 +143,7 @@ return . | AFTERATTACK_PROCESSED_ITEM /obj/item/organ/internal/monster_core/attack_self(mob/user) - if (!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) + if (!user.can_perform_action(src, FORBID_TELEKINESIS_REACH|ALLOW_RESTING)) return try_apply(user, user) diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index c221e78d69023..f4463434066c7 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -37,35 +37,83 @@ . += "This capsule has the [template.name] stored." . += template.description -/obj/item/survivalcapsule/attack_self() +/obj/item/survivalcapsule/interact(mob/user) + . = ..() + if(.) + return . + //Can't grab when capsule is New() because templates aren't loaded then get_template() - if(!used) - loc.visible_message(span_warning("\The [src] begins to shake. Stand back!")) - used = TRUE - sleep(5 SECONDS) - var/turf/deploy_location = get_turf(src) - var/status = template.check_deploy(deploy_location) - switch(status) - if(SHELTER_DEPLOY_BAD_AREA) - src.loc.visible_message(span_warning("\The [src] will not function in this area.")) - if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS, SHELTER_DEPLOY_OUTSIDE_MAP) - var/width = template.width - var/height = template.height - src.loc.visible_message(span_warning("\The [src] doesn't have room to deploy! You need to clear a [width]x[height] area!")) - if(status != SHELTER_DEPLOY_ALLOWED) - used = FALSE - return - - template.load(deploy_location, centered = TRUE) - var/turf/T = deploy_location - if(!is_mining_level(T.z)) //only report capsules away from the mining/lavaland level - message_admins("[ADMIN_LOOKUPFLW(usr)] activated a bluespace capsule away from the mining level! [ADMIN_VERBOSEJMP(T)]") - log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [AREACOORD(T)]") - - playsound(src, 'sound/effects/phasein.ogg', 100, TRUE) - new /obj/effect/particle_effect/fluid/smoke(get_turf(src)) - qdel(src) + if(used) + return FALSE + + loc.visible_message(span_warning("[src] begins to shake. Stand back!")) + used = TRUE + addtimer(CALLBACK(src, PROC_REF(expand), user), 5 SECONDS) + return TRUE + +/// Expands the capsule into a full shelter, placing the template at the item's location (NOT triggerer's location) +/obj/item/survivalcapsule/proc/expand(mob/triggerer) + if(QDELETED(src)) + return + + var/turf/deploy_location = get_turf(src) + var/status = template.check_deploy(deploy_location) + switch(status) + if(SHELTER_DEPLOY_BAD_AREA) + loc.visible_message(span_warning("[src] will not function in this area.")) + if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS, SHELTER_DEPLOY_OUTSIDE_MAP) + loc.visible_message(span_warning("[src] doesn't have room to deploy! You need to clear a [template.width]x[template.height] area!")) + + if(status != SHELTER_DEPLOY_ALLOWED) + used = FALSE + return + + yote_nearby(deploy_location) + template.load(deploy_location, centered = TRUE) + trigger_admin_alert(triggerer, deploy_location) + playsound(src, 'sound/effects/phasein.ogg', 100, TRUE) + new /obj/effect/particle_effect/fluid/smoke(get_turf(src)) + qdel(src) + +/// Throws any mobs near the deployed location away from the item / shelter +/// Does some math to make closer mobs get thrown further +/obj/item/survivalcapsule/proc/yote_nearby(turf/deploy_location) + var/width = template.width + var/height = template.height + var/base_x_throw_distance = ceil(width / 2) + var/base_y_throw_distance = ceil(height / 2) + for(var/mob/living/did_not_stand_back in range(loc, "[width]x[height]")) + var/dir_to_center = get_dir(deploy_location, did_not_stand_back) || pick(GLOB.alldirs) + // Aiming to throw the target just enough to get them out of the range of the shelter + // IE: Stronger if they're closer, weaker if they're further away + var/throw_dist = 0 + var/x_component = abs(did_not_stand_back.x - deploy_location.x) + var/y_component = abs(did_not_stand_back.y - deploy_location.y) + if(ISDIAGONALDIR(dir_to_center)) + throw_dist = ceil(sqrt(base_x_throw_distance ** 2 + base_y_throw_distance ** 2) - (sqrt(x_component ** 2 + y_component ** 2))) + else if(dir_to_center & (NORTH|SOUTH)) + throw_dist = base_y_throw_distance - y_component + 1 + else if(dir_to_center & (EAST|WEST)) + throw_dist = base_x_throw_distance - x_component + 1 + + did_not_stand_back.Paralyze(3 SECONDS) + did_not_stand_back.Knockdown(6 SECONDS) + did_not_stand_back.throw_at( + target = get_edge_target_turf(did_not_stand_back, dir_to_center), + range = throw_dist, + speed = 3, + force = MOVE_FORCE_VERY_STRONG, + ) + +/// Logs if the capsule was triggered, by default only if it happened on non-lavaland +/obj/item/survivalcapsule/proc/trigger_admin_alert(mob/triggerer, turf/trigger_loc) + //only report capsules away from the mining/lavaland level + if(is_mining_level(trigger_loc.z)) + return + + message_admins("[ADMIN_LOOKUPFLW(triggerer)] activated a bluespace capsule away from the mining level! [ADMIN_VERBOSEJMP(trigger_loc)]") + log_admin("[key_name(triggerer)] activated a bluespace capsule away from the mining level at [AREACOORD(trigger_loc)]") //Non-default pods diff --git a/code/modules/mining/lavaland/tendril_loot.dm b/code/modules/mining/lavaland/tendril_loot.dm index 3470822b6890b..00e97dac83ed4 100644 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ b/code/modules/mining/lavaland/tendril_loot.dm @@ -271,7 +271,7 @@ desc = "Happy to light your way." icon = 'icons/obj/lighting.dmi' icon_state = "orb" - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 7 light_flags = LIGHT_ATTACHED layer = ABOVE_ALL_MOB_LAYER diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 59247be2c0a3f..9320bc012264c 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -136,8 +136,8 @@ "icon" = icon2base64(icon(initial(parent.icon), initial(parent.icon_state), frame = 1)), "name" = parent.name, "onHold" = !!holds[remote], - "location" = get_area_name(parent, TRUE) - ) + "location" = get_area_name(parent, TRUE), + ) ) data["logs"] = list() @@ -150,7 +150,7 @@ "action" = entry.action, "amount" = entry.amount, "time" = entry.timestamp, - "noun" = entry.noun + "noun" = entry.noun, ) ) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 67f3c7089d154..248e3cb890dd8 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -26,6 +26,10 @@ set_cap = 1 set_luminosity = 1.6 +/obj/effect/light_emitter/fake_outdoors + light_color = COLOR_LIGHT_YELLOW + set_cap = 1 + /**********************Miner Lockers**************************/ /obj/structure/closet/wardrobe/miner diff --git a/code/modules/mining/satchel_ore_box.dm b/code/modules/mining/satchel_ore_box.dm index 7a82b9483a042..3b2a5ce054c1d 100644 --- a/code/modules/mining/satchel_ore_box.dm +++ b/code/modules/mining/satchel_ore_box.dm @@ -5,58 +5,68 @@ icon = 'icons/obj/mining.dmi' icon_state = "orebox" name = "ore box" - desc = "A heavy wooden box, which can be filled with a lot of ores." + desc = "A heavy wooden box, which can be filled with a lot of ores or boulders" density = TRUE - pressure_resistance = 5*ONE_ATMOSPHERE - -/obj/structure/ore_box/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/stack/ore) || istype(W, /obj/item/boulder)) - if(!user.transferItemToLoc(W, src)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - else if(W.atom_storage) - W.atom_storage.remove_type(/obj/item/stack/ore, src, INFINITY, TRUE, FALSE, user, null) - to_chat(user, span_notice("You empty the ore in [W] into \the [src].")) - else - return ..() + pressure_resistance = 5 * ONE_ATMOSPHERE -/obj/structure/ore_box/crowbar_act(mob/living/user, obj/item/I) - if(I.use_tool(src, user, 50, volume=50)) - user.visible_message(span_notice("[user] pries \the [src] apart."), - span_notice("You pry apart \the [src]."), - span_hear("You hear splitting wood.")) - deconstruct(TRUE, user) - return TRUE - -/obj/structure/ore_box/examine(mob/living/user) - if(Adjacent(user) && istype(user)) - ui_interact(user) +/obj/structure/ore_box/Initialize(mapload) . = ..() + register_context() -/obj/structure/ore_box/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) +///Dumps all contents of this ore box on the turf +/obj/structure/ore_box/proc/dump_box_contents() + var/drop = drop_location() + for(var/obj/item/weapon in src) + weapon.forceMove(drop) + +/obj/structure/ore_box/deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/mineral/wood(loc, 4) + + dump_box_contents() + + return ..() + +/obj/structure/ore_box/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = NONE + if(isnull(held_item)) return - if(Adjacent(user)) - ui_interact(user) -/obj/structure/ore_box/attack_robot(mob/user) - if(Adjacent(user)) + if(held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET + else if(istype(held_item, /obj/item/stack/ore) || istype(held_item, /obj/item/boulder)) + context[SCREENTIP_CONTEXT_LMB] = "Insert Item" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.atom_storage) + context[SCREENTIP_CONTEXT_LMB] = "Transfer Contents" + return CONTEXTUAL_SCREENTIP_SET + + +/obj/structure/ore_box/examine(mob/living/user) + . = ..() + if(in_range(src, user) || isobserver(user)) + . += span_notice("Can be [EXAMINE_HINT("pried")] apart.") ui_interact(user) -/obj/structure/ore_box/proc/dump_box_contents() - var/drop = drop_location() - var/turf/our_turf = get_turf(src) - for(var/obj/item/O in src) - if(QDELETED(O)) - continue - if(QDELETED(src)) - break - O.forceMove(drop) - SET_PLANE(O, PLANE_TO_TRUE(O.plane), our_turf) - if(TICK_CHECK) - stoplag() - our_turf = get_turf(src) - drop = drop_location() +/obj/structure/ore_box/crowbar_act(mob/living/user, obj/item/I) + . = ITEM_INTERACT_BLOCKING + if(I.use_tool(src, user, 50, volume = 50)) + user.visible_message(span_notice("[user] pries \the [src] apart."), + span_notice("You pry apart \the [src]."), + span_hear("You hear splitting wood.")) + deconstruct(TRUE) + return ITEM_INTERACT_SUCCESS + +/obj/structure/ore_box/attackby(obj/item/weapon, mob/user, params) + if(istype(weapon, /obj/item/stack/ore) || istype(weapon, /obj/item/boulder)) + user.transferItemToLoc(weapon, src) + return TRUE + else if(weapon.atom_storage) + weapon.atom_storage.remove_type(/obj/item/stack/ore, src, INFINITY, TRUE, FALSE, user, null) + to_chat(user, span_notice("You empty the ore in [weapon] into \the [src].")) + return TRUE + else + return ..() /obj/structure/ore_box/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -65,43 +75,36 @@ ui.open() /obj/structure/ore_box/ui_data() - var/item_contents = list() - var/boulder_count = 0 + var/list/materials = list() + var/name + var/amount for(var/obj/item/stack/ore/potental_ore as anything in contents) if(istype(potental_ore, /obj/item/stack/ore)) - item_contents[potental_ore.type] += potental_ore.amount + name = potental_ore.name + amount = potental_ore.amount else - boulder_count++ + name = "Boulders" + amount = 1 - var/data = list() + var/item_found = FALSE + for(var/list/item as anything in materials) + if(item["name"] == name) + item_found = TRUE + item["amount"] += amount + break + if(!item_found) + materials += list(list("name" = name, "amount" = amount)) - data["materials"] = list() - - for(var/obj/item/stone as anything in item_contents) - if(ispath(stone, /obj/item/stack/ore)) - var/obj/item/stack/ore/found_ore = stone - var/name = initial(found_ore.name) - data["materials"] += list(list("name" = name, "amount" = item_contents[stone], "id" = type)) - data["boulders"] = boulder_count - return data + return list("materials" = materials) /obj/structure/ore_box/ui_act(action, params) . = ..() if(.) return - if(!Adjacent(usr)) - return - switch(action) - if("removeall") - dump_box_contents() - to_chat(usr, span_notice("You open the release hatch on the box..")) - -/obj/structure/ore_box/deconstruct(disassembled = TRUE, mob/user) - var/obj/item/stack/sheet/mineral/wood/WD = new (loc, 4) - if(user && !QDELETED(WD)) - WD.add_fingerprint(user) - dump_box_contents() - qdel(src) + + if(action == "removeall") + dump_box_contents() + return TRUE /// Special override for notify_contents = FALSE. /obj/structure/ore_box/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents = FALSE) diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 8d7db7f8e850c..615eb55898c92 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -14,7 +14,6 @@ INITIALIZE_IMMEDIATE(/mob/dead) flags_1 |= INITIALIZED_1 // Initial is non standard here, but ghosts move before they get here so it's needed. this is a cold path too so it's ok SET_PLANE_IMPLICIT(src, initial(plane)) - tag = "mob_[next_mob_id++]" add_to_mob_list() prepare_huds() diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 4526066100c5a..9995821c58cbb 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -16,7 +16,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) invisibility = INVISIBILITY_OBSERVER hud_type = /datum/hud/ghost movement_type = GROUND | FLYING - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 light_power = 2 light_on = FALSE diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index ba07c944652e4..d69665d6bcdec 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -270,17 +270,17 @@ /mob/living/basic/on_fire_stack(seconds_per_tick, datum/status_effect/fire_handler/fire_stacks/fire_handler) adjust_bodytemperature((maximum_survivable_temperature + (fire_handler.stacks * 12)) * 0.5 * seconds_per_tick) -/mob/living/basic/update_fire_overlay(stacks, on_fire, last_icon_state, suffix = "") - var/mutable_appearance/fire_overlay = mutable_appearance('icons/mob/effects/onfire.dmi', "generic_fire") - if(on_fire && isnull(last_icon_state)) - add_overlay(fire_overlay) - return fire_overlay - else if(!on_fire && !isnull(last_icon_state)) - cut_overlay(fire_overlay) - return null - else if(on_fire && !isnull(last_icon_state)) - return last_icon_state - return null +/mob/living/basic/get_fire_overlay(stacks, on_fire) + var/fire_icon = "generic_fire" + if(!GLOB.fire_appearances[fire_icon]) + GLOB.fire_appearances[fire_icon] = mutable_appearance( + 'icons/mob/effects/onfire.dmi', + fire_icon, + -HIGHEST_LAYER, + appearance_flags = RESET_COLOR, + ) + + return GLOB.fire_appearances[fire_icon] /mob/living/basic/put_in_hands(obj/item/I, del_on_fail = FALSE, merge_stacks = TRUE, ignore_animation = TRUE) . = ..() diff --git a/code/modules/mob/living/basic/blob_minions/blob_zombie.dm b/code/modules/mob/living/basic/blob_minions/blob_zombie.dm index c9bf3b7346a98..3cbce54cf29db 100644 --- a/code/modules/mob/living/basic/blob_minions/blob_zombie.dm +++ b/code/modules/mob/living/basic/blob_minions/blob_zombie.dm @@ -51,13 +51,13 @@ . = ..() death() -/mob/living/basic/blob_minion/zombie/update_overlays() - . = ..() +//Sets up our appearance +/mob/living/basic/blob_minion/zombie/proc/set_up_zombie_appearance() copy_overlays(corpse, TRUE) var/mutable_appearance/blob_head_overlay = mutable_appearance('icons/mob/nonhuman-player/blob.dmi', "blob_head") blob_head_overlay.color = LAZYACCESS(atom_colours, FIXED_COLOUR_PRIORITY) || COLOR_WHITE color = initial(color) // reversing what our component did lol, but we needed the value for the overlay - . += blob_head_overlay + overlays += blob_head_overlay /// Create an explosion of spores on death /mob/living/basic/blob_minion/zombie/proc/death_burst() @@ -73,6 +73,7 @@ new_corpse.forceMove(src) corpse = new_corpse update_appearance(UPDATE_ICON) + set_up_zombie_appearance() RegisterSignal(corpse, COMSIG_LIVING_REVIVE, PROC_REF(on_corpse_revived)) /// Dynamic changeling reentry diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm index 8462f4afc355d..56fdc4fc93842 100644 --- a/code/modules/mob/living/basic/bots/_bots.dm +++ b/code/modules/mob/living/basic/bots/_bots.dm @@ -35,7 +35,7 @@ GLOBAL_LIST_INIT(command_strings, list( bubble_icon = "machine" speech_span = SPAN_ROBOT faction = list(FACTION_NEUTRAL, FACTION_SILICON, FACTION_TURRET) - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 3 light_power = 0.9 speed = 3 diff --git a/code/modules/mob/living/basic/clown/clown.dm b/code/modules/mob/living/basic/clown/clown.dm index 1a713ec04f884..88c2b9496a929 100644 --- a/code/modules/mob/living/basic/clown/clown.dm +++ b/code/modules/mob/living/basic/clown/clown.dm @@ -49,7 +49,7 @@ ai_controller.set_blackboard_key(BB_BASIC_MOB_SPEAK_LINES, emotes) //im not putting dynamic humans or whatever its called here because this is the base path of nonhuman clownstrosities if(waddles) - AddElement(/datum/element/waddling) + AddElementTrait(TRAIT_WADDLING, INNATE_TRAIT, /datum/element/waddling) if(length(loot)) loot = string_list(loot) AddElement(/datum/element/death_drops, loot) diff --git a/code/modules/mob/living/basic/drone/_drone.dm b/code/modules/mob/living/basic/drone/_drone.dm index 76f09318b7acb..9298083c67c21 100644 --- a/code/modules/mob/living/basic/drone/_drone.dm +++ b/code/modules/mob/living/basic/drone/_drone.dm @@ -161,6 +161,12 @@ /obj/item/clothing/mask, /obj/item/storage/box/lights, /obj/item/lightreplacer, + /obj/item/construction/rcd, + /obj/item/rcd_ammo, + /obj/item/rcd_upgrade, + /obj/item/storage/part_replacer, + /obj/item/soap, + /obj/item/holosign_creator, ) /// machines whitelisted from being shy with var/list/shy_machine_whitelist = list( diff --git a/code/modules/mob/living/basic/drone/extra_drone_types.dm b/code/modules/mob/living/basic/drone/extra_drone_types.dm index 927d28f0ca249..08c9278b75331 100644 --- a/code/modules/mob/living/basic/drone/extra_drone_types.dm +++ b/code/modules/mob/living/basic/drone/extra_drone_types.dm @@ -33,7 +33,7 @@ /mob/living/basic/drone/syndrone/Initialize(mapload) . = ..() var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink) - hidden_uplink.set_telecrystals(telecrystal_count) + hidden_uplink.uplink_handler.set_telecrystals(telecrystal_count) /obj/effect/mob_spawn/ghost_role/drone/syndrone name = "syndrone shell" diff --git a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm index 66c0d12996299..89eedd7cb5593 100644 --- a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm +++ b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm @@ -25,10 +25,6 @@ response_harm_continuous = "squashes" response_harm_simple = "squash" - mob_size = MOB_SIZE_LARGE - pixel_x = -16 - base_pixel_x = -16 - speed = 1 maxHealth = 10 health = 10 @@ -110,9 +106,13 @@ beegent = null if(flags_1 & HOLOGRAM_1 || gibbed) return ..() - new /obj/item/trash/bee(loc, src) + spawn_corpse() return ..() +/// Leave something to remember us by +/mob/living/basic/bee/proc/spawn_corpse() + new /obj/item/trash/bee(loc, src) + /mob/living/basic/bee/proc/pre_attack(mob/living/puncher, atom/target) SIGNAL_HANDLER @@ -217,12 +217,20 @@ var/datum/reagent/toxin = pick(typesof(/datum/reagent/toxin)) assign_reagent(GLOB.chemical_reagents_list[toxin]) -/mob/living/basic/bee/short - desc = "These bees seem unstable and won't survive for long." +/// A bee which despawns after a short amount of time (beespawns?) +/mob/living/basic/bee/timed + /// How long do we live? + var/lifespan = 50 SECONDS + +/mob/living/basic/bee/timed/short + lifespan = 25 SECONDS -/mob/living/basic/bee/short/Initialize(mapload, timetolive=50 SECONDS) +/mob/living/basic/bee/timed/Initialize(mapload) . = ..() - addtimer(CALLBACK(src, PROC_REF(death)), timetolive) + addtimer(CALLBACK(src, PROC_REF(death)), lifespan) + +/mob/living/basic/bee/timed/spawn_corpse() + new /obj/effect/temp_visual/despawn_effect(get_turf(src), /* copy_from = */ src) /obj/item/queen_bee name = "queen bee" diff --git a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm index 64cff6780dfb9..e9dc43837fff6 100644 --- a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm +++ b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm @@ -16,18 +16,19 @@ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID maxHealth = 220 health = 220 + initial_language_holder = /datum/language_holder/monkey response_help_continuous = "prods" response_help_simple = "prod" response_disarm_continuous = "challenges" response_disarm_simple = "challenge" response_harm_continuous = "thumps" response_harm_simple = "thump" - speed = 0.5 + speed = -0.1 melee_attack_cooldown = CLICK_CD_MELEE - melee_damage_lower = 15 - melee_damage_upper = 18 + melee_damage_lower = 25 + melee_damage_upper = 30 damage_coeff = list(BRUTE = 1, BURN = 1.5, TOX = 1.5, STAMINA = 0, OXY = 1.5) - obj_damage = 20 + obj_damage = 40 attack_verb_continuous = "pummels" attack_verb_simple = "pummel" attack_sound = 'sound/weapons/punch1.ogg' @@ -123,7 +124,7 @@ /// Gorillas are slower when carrying something /datum/movespeed_modifier/gorilla_standing blacklisted_movetypes = (FLYING|FLOATING) - multiplicative_slowdown = 0.5 + multiplicative_slowdown = 1.2 /// A smaller gorilla summoned via magic /mob/living/basic/gorilla/lesser diff --git a/code/modules/mob/living/basic/farm_animals/pony.dm b/code/modules/mob/living/basic/farm_animals/pony.dm index df8f3a1fd4eec..7795ec630e6d5 100644 --- a/code/modules/mob/living/basic/farm_animals/pony.dm +++ b/code/modules/mob/living/basic/farm_animals/pony.dm @@ -40,7 +40,7 @@ AddElement(/datum/element/pet_bonus, "whickers.") AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/ai_flee_while_injured) - AddElement(/datum/element/waddling) + AddElementTrait(TRAIT_WADDLING, INNATE_TRAIT, /datum/element/waddling) AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/apple), tame_chance = 25, bonus_tame_chance = 15, after_tame = CALLBACK(src, PROC_REF(tamed)), unique = unique_tamer) /mob/living/basic/pony/proc/tamed(mob/living/tamer) diff --git a/code/modules/mob/living/basic/guardian/guardian.dm b/code/modules/mob/living/basic/guardian/guardian.dm index 9d79373ccd42e..b338a5a4435c3 100644 --- a/code/modules/mob/living/basic/guardian/guardian.dm +++ b/code/modules/mob/living/basic/guardian/guardian.dm @@ -39,7 +39,7 @@ melee_damage_lower = 15 melee_damage_upper = 15 melee_attack_cooldown = CLICK_CD_MELEE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 3 light_on = FALSE diff --git a/code/modules/mob/living/basic/guardian/guardian_creator.dm b/code/modules/mob/living/basic/guardian/guardian_creator.dm index d01383427df85..3f1f092752217 100644 --- a/code/modules/mob/living/basic/guardian/guardian_creator.dm +++ b/code/modules/mob/living/basic/guardian/guardian_creator.dm @@ -66,7 +66,7 @@ GLOBAL_LIST_INIT(guardian_radial_images, setup_guardian_radial()) if(length(guardians) && !allow_multiple) balloon_alert(user, "already have one!") return - if(user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling) && !allow_changeling) + if(IS_CHANGELING(user) && !allow_changeling) to_chat(user, ling_failure) return if(used) diff --git a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_abilities.dm b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_abilities.dm index b143f471138f4..af17fc0cb01aa 100644 --- a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_abilities.dm +++ b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_abilities.dm @@ -34,8 +34,8 @@ /datum/action/cooldown/mob_cooldown/slippery_ice_floors name = "Iced Floors" desc = "Summon slippery ice floors all around!" - button_icon = 'icons/turf/floors/ice_turf.dmi' - button_icon_state = "ice_turf-6" + button_icon = 'icons/effects/freeze.dmi' + button_icon_state = "ice_cube" cooldown_time = 2 SECONDS click_to_activate = FALSE melee_cooldown_time = 0 SECONDS @@ -84,6 +84,7 @@ /datum/action/cooldown/spell/conjure/limit_summons/create_afterimages name = "Create After Images" + desc = "Creates two illusionary doubles to increase your firepower, but which share some of your life force." button_icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' button_icon_state = "ice_demon" spell_requirements = NONE diff --git a/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm b/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm index 7b1e461991ce7..f0de6c3272e55 100644 --- a/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm +++ b/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm @@ -110,5 +110,5 @@ /mob/living/basic/hivelord_brood/death(gibbed) if (!gibbed) - new /obj/effect/temp_visual/hive_spawn_wither(get_turf(src), /* copy_from = */ src) + new /obj/effect/temp_visual/despawn_effect(get_turf(src), /* copy_from = */ src) return ..() diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm index 7cc5ea06ad8b6..96c7319380a2e 100644 --- a/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm +++ b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm @@ -42,7 +42,7 @@ /mob/living/basic/legion_brood/death(gibbed) if (!gibbed) - new /obj/effect/temp_visual/hive_spawn_wither(get_turf(src), /* copy_from = */ src) + new /obj/effect/temp_visual/despawn_effect(get_turf(src), /* copy_from = */ src) return ..() /mob/living/basic/legion_brood/melee_attack(mob/living/target, list/modifiers, ignore_cooldown) diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm index f9a22f955f1c5..5422ab4ee2e98 100644 --- a/code/modules/mob/living/basic/minebots/minebot.dm +++ b/code/modules/mob/living/basic/minebots/minebot.dm @@ -23,7 +23,7 @@ speak_emote = list("states") mob_biotypes = MOB_ROBOTIC death_message = "blows apart!" - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 6 light_on = FALSE combat_mode = FALSE diff --git a/code/modules/mob/living/basic/pets/cat/cat.dm b/code/modules/mob/living/basic/pets/cat/cat.dm index 207599a1d164a..dd8a588e91502 100644 --- a/code/modules/mob/living/basic/pets/cat/cat.dm +++ b/code/modules/mob/living/basic/pets/cat/cat.dm @@ -134,6 +134,7 @@ icon_state = "spacecat" icon_living = "spacecat" icon_dead = "spacecat_dead" + unsuitable_atmos_damage = 0 minimum_survivable_temperature = TCMB maximum_survivable_temperature = T0C + 40 held_state = "spacecat" diff --git a/code/modules/mob/living/basic/pets/orbie/orbie.dm b/code/modules/mob/living/basic/pets/orbie/orbie.dm new file mode 100644 index 0000000000000..2c9fb3d815c49 --- /dev/null +++ b/code/modules/mob/living/basic/pets/orbie/orbie.dm @@ -0,0 +1,112 @@ +#define ORBIE_MAXIMUM_HEALTH 300 + +/mob/living/basic/orbie + name = "Orbie" + desc = "An orb shaped hologram." + icon = 'icons/mob/simple/pets.dmi' + icon_state = "orbie" + icon_living = "orbie" + speed = 0 + maxHealth = 100 + light_on = FALSE + light_system = OVERLAY_LIGHT + light_range = 6 + light_color = "#64bee1" + health = 100 + habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + unsuitable_atmos_damage = 0 + can_buckle_to = FALSE + density = FALSE + pass_flags = PASSMOB + move_force = 0 + move_resist = 0 + pull_force = 0 + minimum_survivable_temperature = TCMB + maximum_survivable_temperature = INFINITY + death_message = "fades out of existence!" + ai_controller = /datum/ai_controller/basic_controller/orbie + ///are we happy or not? + var/happy_state = FALSE + ///overlay for our neutral eyes + var/static/mutable_appearance/eyes_overlay = mutable_appearance('icons/mob/simple/pets.dmi', "orbie_eye_overlay") + ///overlay for when our eyes are emitting light + var/static/mutable_appearance/orbie_light_overlay = mutable_appearance('icons/mob/simple/pets.dmi', "orbie_light_overlay") + ///overlay for the flame propellar + var/static/mutable_appearance/flame_overlay = mutable_appearance('icons/mob/simple/pets.dmi', "orbie_flame_overlay") + ///overlay for our happy eyes + var/static/mutable_appearance/happy_eyes_overlay = mutable_appearance('icons/mob/simple/pets.dmi', "orbie_happy_eye_overlay") + ///commands we can give orbie + var/list/pet_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/untargeted_ability/pet_lights, + /datum/pet_command/point_targeting/use_ability/take_photo, + /datum/pet_command/follow/orbie, + /datum/pet_command/perform_trick_sequence, + ) + +/mob/living/basic/orbie/Initialize(mapload) + . = ..() + var/static/list/food_types = list(/obj/item/food/virtual_chocolate) + AddComponent(/datum/component/obeys_commands, pet_commands) + AddElement(/datum/element/basic_eating, food_types = food_types) + RegisterSignal(src, COMSIG_ATOM_CAN_BE_PULLED, PROC_REF(on_pulled)) + RegisterSignal(src, COMSIG_VIRTUAL_PET_LEVEL_UP, PROC_REF(on_level_up)) + RegisterSignal(src, COMSIG_MOB_CLICKON, PROC_REF(on_click)) + RegisterSignal(src, COMSIG_ATOM_UPDATE_LIGHT_ON, PROC_REF(on_lights)) + ai_controller.set_blackboard_key(BB_BASIC_FOODS, typecacheof(food_types)) + update_appearance() + +/mob/living/basic/orbie/proc/on_click(mob/living/basic/source, atom/target, params) + SIGNAL_HANDLER + + if(!CanReach(target)) + return + + if(src == target || happy_state || !istype(target)) + return + + toggle_happy_state() + addtimer(CALLBACK(src, PROC_REF(toggle_happy_state)), 30 SECONDS) + +/mob/living/basic/orbie/proc/on_lights(datum/source) + SIGNAL_HANDLER + + update_appearance() + +/mob/living/basic/orbie/proc/toggle_happy_state() + happy_state = !happy_state + update_appearance() + +/mob/living/basic/orbie/proc/on_pulled(datum/source) //i need move resist at 0, but i also dont want him to be pulled + SIGNAL_HANDLER + + return COMSIG_ATOM_CANT_PULL + +/mob/living/basic/orbie/proc/on_level_up(datum/source, new_level) + SIGNAL_HANDLER + + if(maxHealth >= ORBIE_MAXIMUM_HEALTH) + UnregisterSignal(src, COMSIG_VIRTUAL_PET_LEVEL_UP) + return + + maxHealth += 100 + heal_overall_damage(maxHealth - health) + + +/mob/living/basic/orbie/update_overlays() + . = ..() + if(stat == DEAD) + return + . += flame_overlay + if(happy_state) + . += happy_eyes_overlay + else if(light_on) + . += orbie_light_overlay + else + . += eyes_overlay + +/mob/living/basic/orbie/gib() + death(TRUE) + +#undef ORBIE_MAXIMUM_HEALTH diff --git a/code/modules/mob/living/basic/pets/orbie/orbie_abilities.dm b/code/modules/mob/living/basic/pets/orbie/orbie_abilities.dm new file mode 100644 index 0000000000000..fb9994a932161 --- /dev/null +++ b/code/modules/mob/living/basic/pets/orbie/orbie_abilities.dm @@ -0,0 +1,46 @@ +/datum/action/cooldown/mob_cooldown/lights + name = "Toggle Lights" + button_icon = 'icons/mob/simple/pets.dmi' + button_icon_state = "orbie_light_action" + background_icon_state = "bg_default" + overlay_icon_state = "bg_default_border" + click_to_activate = FALSE + +/datum/action/cooldown/mob_cooldown/lights/Activate() + owner.set_light_on(!owner.light_on) + return TRUE + + +/datum/action/cooldown/mob_cooldown/capture_photo + name = "Camera" + button_icon = 'icons/mob/simple/pets.dmi' + button_icon_state = "orbie_light_action" + background_icon_state = "bg_default" + overlay_icon_state = "bg_default_border" + cooldown_time = 30 SECONDS + ///camera we use to take photos + var/obj/item/camera/ability_camera + +/datum/action/cooldown/mob_cooldown/capture_photo/Grant(mob/grant_to) + . = ..() + if(isnull(owner)) + return + ability_camera = new(owner) + ability_camera.print_picture_on_snap = FALSE + RegisterSignal(ability_camera, COMSIG_PREQDELETED, PROC_REF(on_camera_delete)) + +/datum/action/cooldown/mob_cooldown/capture_photo/Activate(atom/target) + if(isnull(ability_camera)) + return FALSE + ability_camera.captureimage(target, owner) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/capture_photo/proc/on_camera_delete(datum/source) + SIGNAL_HANDLER + UnregisterSignal(ability_camera, COMSIG_PREQDELETED) + ability_camera = null + +/datum/action/cooldown/mob_cooldown/capture_photo/Destroy() + QDEL_NULL(ability_camera) + return ..() diff --git a/code/modules/mob/living/basic/pets/orbie/orbie_ai.dm b/code/modules/mob/living/basic/pets/orbie/orbie_ai.dm new file mode 100644 index 0000000000000..854a02094640b --- /dev/null +++ b/code/modules/mob/living/basic/pets/orbie/orbie_ai.dm @@ -0,0 +1,169 @@ +#define PET_PLAYTIME_COOLDOWN (2 MINUTES) +#define MESSAGE_EXPIRY_TIME (30 SECONDS) + +/datum/ai_controller/basic_controller/orbie + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_TRICK_NAME = "Trick", + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/find_playmates, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/relay_pda_message, + /datum/ai_planning_subtree/pet_planning, + ) + +/datum/ai_controller/basic_controller/orbie/TryPossessPawn(atom/new_pawn) + . = ..() + if(. & AI_CONTROLLER_INCOMPATIBLE) + return + RegisterSignal(new_pawn, COMSIG_AI_BLACKBOARD_KEY_SET(BB_LAST_RECIEVED_MESSAGE), PROC_REF(on_set_message)) + +/datum/ai_controller/basic_controller/orbie/proc/on_set_message(datum/source) + SIGNAL_HANDLER + + addtimer(CALLBACK(src, PROC_REF(clear_blackboard_key), BB_LAST_RECIEVED_MESSAGE), MESSAGE_EXPIRY_TIME) + +///ai behavior that lets us search for other orbies to play with +/datum/ai_planning_subtree/find_playmates + +/datum/ai_planning_subtree/find_playmates/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(controller.blackboard[BB_NEXT_PLAYDATE] > world.time) + return + if(controller.blackboard_key_exists(BB_NEARBY_PLAYMATE)) + controller.queue_behavior(/datum/ai_behavior/interact_with_playmate, BB_NEARBY_PLAYMATE) + return SUBTREE_RETURN_FINISH_PLANNING + + controller.queue_behavior(/datum/ai_behavior/find_and_set/find_playmate, BB_NEARBY_PLAYMATE, /mob/living/basic/orbie) + +/datum/ai_behavior/find_and_set/find_playmate + +/datum/ai_behavior/find_and_set/find_playmate/search_tactic(datum/ai_controller/controller, locate_path, search_range) + for(var/mob/living/basic/orbie/playmate in oview(search_range, controller.pawn)) + if(playmate == controller.pawn || playmate.stat == DEAD || isnull(playmate.ai_controller)) + continue + if(playmate.ai_controller.blackboard[BB_NEARBY_PLAYMATE] || playmate.ai_controller.blackboard[BB_NEXT_PLAYDATE] > world.time) //they already have a playmate... + continue + playmate.ai_controller.set_blackboard_key(BB_NEARBY_PLAYMATE, controller.pawn) + return playmate + return null + + +/datum/ai_behavior/interact_with_playmate + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/interact_with_playmate/setup(datum/ai_controller/controller, target_key) + . = ..() + var/turf/target = controller.blackboard[target_key] + if(isnull(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/interact_with_playmate/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/basic/living_pawn = controller.pawn + var/atom/target = controller.blackboard[target_key] + + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + + living_pawn.manual_emote("plays with [target]!") + living_pawn.spin(spintime = 4, speed = 1) + living_pawn.ClickOn(target) + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/interact_with_playmate/finish_action(datum/ai_controller/controller, success, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + controller.set_blackboard_key(BB_NEXT_PLAYDATE, world.time + PET_PLAYTIME_COOLDOWN) + +/datum/ai_planning_subtree/relay_pda_message + +/datum/ai_planning_subtree/relay_pda_message/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(controller.blackboard[BB_VIRTUAL_PET_LEVEL] < 2 || isnull(controller.blackboard[BB_LAST_RECIEVED_MESSAGE])) + return + + controller.queue_behavior(/datum/ai_behavior/relay_pda_message, BB_LAST_RECIEVED_MESSAGE) + +/datum/ai_behavior/relay_pda_message/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/basic/living_pawn = controller.pawn + var/text_to_say = controller.blackboard[target_key] + if(isnull(text_to_say)) + finish_action(controller, FALSE, target_key) + return + + living_pawn.say(text_to_say, forced = "AI controller") + living_pawn.spin(spintime = 4, speed = 1) + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/relay_pda_message/finish_action(datum/ai_controller/controller, success, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +/datum/pet_command/follow/orbie + follow_behavior = /datum/ai_behavior/pet_follow_friend/orbie + +/datum/ai_behavior/pet_follow_friend/orbie + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +///command to make our pet turn its lights on, we need to be level 2 to activate this ability +/datum/pet_command/untargeted_ability/pet_lights + command_name = "Lights" + command_desc = "Toggle your pet's lights!" + radial_icon = 'icons/mob/simple/pets.dmi' + radial_icon_state = "orbie_lights_action" + speech_commands = list("lights", "light", "toggle") + ability_key = BB_LIGHTS_ABILITY + +/datum/pet_command/untargeted_ability/pet_lights/execute_action(datum/ai_controller/controller) + if(controller.blackboard[BB_VIRTUAL_PET_LEVEL] < 2) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return SUBTREE_RETURN_FINISH_PLANNING + return ..() + +/datum/pet_command/point_targeting/use_ability/take_photo + command_name = "Photo" + command_desc = "Make your pet take a photo!" + radial_icon = 'icons/mob/simple/pets.dmi' + radial_icon_state = "orbie_lights_action" + speech_commands = list("photo", "picture", "image") + command_feedback = "Readys camera mode" + pet_ability_key = BB_PHOTO_ABILITY + targeting_strategy_key = BB_TARGETING_STRATEGY + +/datum/pet_command/point_targeting/use_ability/take_photo/execute_action(datum/ai_controller/controller) + if(controller.blackboard[BB_VIRTUAL_PET_LEVEL] < 3) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return SUBTREE_RETURN_FINISH_PLANNING + return ..() + +/datum/pet_command/perform_trick_sequence + command_name = "Trick Sequence" + command_desc = "A trick sequence programmable through your PDA!" + +/datum/pet_command/perform_trick_sequence/find_command_in_text(spoken_text, check_verbosity = FALSE) + var/mob/living/living_pawn = weak_parent.resolve() + if(isnull(living_pawn?.ai_controller)) + return FALSE + var/text_command = living_pawn.ai_controller.blackboard[BB_TRICK_NAME] + if(isnull(text_command)) + return FALSE + return findtext(spoken_text, text_command) + +/datum/pet_command/perform_trick_sequence/execute_action(datum/ai_controller/controller) + var/mob/living/living_pawn = controller.pawn + var/list/trick_sequence = controller.blackboard[BB_TRICK_SEQUENCE] + for(var/index in 1 to length(trick_sequence)) + addtimer(CALLBACK(living_pawn, TYPE_PROC_REF(/mob, emote), trick_sequence[index], index * 0.5 SECONDS)) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return SUBTREE_RETURN_FINISH_PLANNING + +#undef PET_PLAYTIME_COOLDOWN +#undef MESSAGE_EXPIRY_TIME diff --git a/code/modules/mob/living/basic/pets/penguin.dm b/code/modules/mob/living/basic/pets/penguin.dm index 671c2cf30c130..e8e2a038c0ea9 100644 --- a/code/modules/mob/living/basic/pets/penguin.dm +++ b/code/modules/mob/living/basic/pets/penguin.dm @@ -23,7 +23,7 @@ AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/ai_flee_while_injured) AddElement(/datum/element/pet_bonus, "honks happily!") - AddElement(/datum/element/waddling) + AddElementTrait(TRAIT_WADDLING, INNATE_TRAIT, /datum/element/waddling) if(!can_lay_eggs) return AddComponent(\ diff --git a/code/modules/mob/living/basic/space_fauna/ghost.dm b/code/modules/mob/living/basic/space_fauna/ghost.dm index 981357d1a130c..406d2ecefddc6 100644 --- a/code/modules/mob/living/basic/space_fauna/ghost.dm +++ b/code/modules/mob/living/basic/space_fauna/ghost.dm @@ -22,7 +22,7 @@ attack_sound = 'sound/hallucinations/growl1.ogg' death_message = "wails, disintegrating into a pile of ectoplasm!" gold_core_spawnable = NO_SPAWN //too spooky for science - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 // same glowing as visible player ghosts light_power = 2 ai_controller = /datum/ai_controller/basic_controller/ghost diff --git a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm index 3602d5e8a991c..be83d3e058f91 100644 --- a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm +++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm @@ -52,7 +52,7 @@ RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) RegisterSignal(src, COMSIG_MOB_LOGIN, PROC_REF(on_login)) - AddElement(/datum/element/waddling) + AddElementTrait(TRAIT_WADDLING, INNATE_TRAIT, /datum/element/waddling) AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/door_pryer, pry_time = 5 SECONDS, interaction_key = REGALRAT_INTERACTION) AddComponent(\ diff --git a/code/modules/mob/living/basic/space_fauna/statue/mannequin.dm b/code/modules/mob/living/basic/space_fauna/statue/mannequin.dm new file mode 100644 index 0000000000000..7b6bf6c839992 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/statue/mannequin.dm @@ -0,0 +1,89 @@ +/mob/living/basic/statue/mannequin + name = "mannequin" + desc = "Oh, so this is a dress-up game now." + icon = 'icons/mob/human/mannequin.dmi' + icon_state = "mannequin_wood_male" + icon_living = "mannequin_wood_male" + icon_dead = "mannequin_wood_male" + health = 300 + maxHealth = 300 + melee_damage_lower = 15 + melee_damage_upper = 30 + sentience_type = SENTIENCE_ARTIFICIAL + ai_controller = /datum/ai_controller/basic_controller/stares_at_people + /// the path to a fake item we will hold in our right hand + var/obj/item/held_item + /// the path to a fake hat we will wear + var/obj/item/hat + +/mob/living/basic/statue/mannequin/Initialize(mapload) + . = ..() + update_appearance() + +/mob/living/basic/statue/mannequin/update_overlays() + . = ..() + if(held_item) + . += mutable_appearance(initial(held_item.righthand_file), initial(held_item.inhand_icon_state)) + if(hat) + . += mutable_appearance(initial(hat.worn_icon), initial(hat.worn_icon_state) || initial(hat.icon_state)) + +/datum/ai_controller/basic_controller/stares_at_people + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_AGGRO_RANGE = 6, + ) + + ai_movement = /datum/ai_movement/dumb + idle_behavior = null + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/face_target_or_face_initial, // we be creepy and all + ) + +/datum/ai_planning_subtree/face_target_or_face_initial + +/datum/ai_planning_subtree/face_target_or_face_initial/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(isnull(controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET])) + return + var/mob/living/we = controller.pawn + controller.blackboard[BB_STARTING_DIRECTION] = we.dir + controller.queue_behavior(/datum/ai_behavior/face_target_or_face_initial, BB_BASIC_MOB_CURRENT_TARGET) + +/datum/ai_behavior/face_target_or_face_initial + +/datum/ai_behavior/face_target_or_face_initial/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/movable/target = controller.blackboard[target_key] + return ismovable(target) && isturf(target.loc) && ismob(controller.pawn) + +/datum/ai_behavior/face_target_or_face_initial/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/atom/movable/target = controller.blackboard[target_key] + var/mob/living/we = controller.pawn + if(isnull(target) || get_dist(we, target) > 8) + we.dir = controller.blackboard[BB_STARTING_DIRECTION] + finish_action(controller, TRUE) + else + we.face_atom(target) + +/mob/living/basic/statue/mannequin/suspicious + name = "mannequin?" + desc = "Their eyes follow you." + health = 1500 //yeah uhh avoid these + maxHealth = 1500 + ai_controller = /datum/ai_controller/basic_controller/suspicious_mannequin + +/datum/ai_controller/basic_controller/suspicious_mannequin + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_AGGRO_RANGE = 14, + BB_EMOTE_KEY = "scream", //spooky + ) + + ai_movement = /datum/ai_movement/jps //threat + idle_behavior = null + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/run_emote, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/modules/mob/living/basic/vermin/mothroach.dm b/code/modules/mob/living/basic/vermin/mothroach.dm index 15f82d38f8524..4c06665a14afc 100644 --- a/code/modules/mob/living/basic/vermin/mothroach.dm +++ b/code/modules/mob/living/basic/vermin/mothroach.dm @@ -73,3 +73,10 @@ planning_subtrees = list( /datum/ai_planning_subtree/random_speech/mothroach, ) + +/mob/living/basic/mothroach/bar + name = "mothroach bartender" + desc = "A mothroach serving drinks. Look at him go." + icon_state = "barroach" + icon_living = "barroach" + icon_dead = "barroach_dead" diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 0818532cc4df7..4caa7dd1966e2 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -1,4 +1,6 @@ #define BLOOD_DRIP_RATE_MOD 90 //Greater number means creating blood drips more often while bleeding +// Conversion between internal drunk power and common blood alcohol content +#define DRUNK_POWER_TO_BLOOD_ALCOHOL 0.003 /**************************************************** BLOOD SYSTEM @@ -376,4 +378,13 @@ if(!B) B = new(T) +/mob/living/proc/get_blood_alcohol_content() + var/blood_alcohol_content = 0 + var/datum/status_effect/inebriated/inebriation = has_status_effect(/datum/status_effect/inebriated) + if(!isnull(inebriation)) + blood_alcohol_content = round(inebriation.drunk_value * DRUNK_POWER_TO_BLOOD_ALCOHOL, 0.01) + + return blood_alcohol_content + #undef BLOOD_DRIP_RATE_MOD +#undef DRUNK_POWER_TO_BLOOD_ALCOHOL diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index a613e2ad83932..117b5f03835d2 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -61,7 +61,7 @@ name = initial(name) // Special check for if you're trapped in a body you can't control because it's owned by a ling. - if(brain_owner?.mind?.has_antag_datum(/datum/antagonist/changeling) && !(movement_flags & NO_ID_TRANSFER)) + if(IS_CHANGELING(brain_owner) && !(movement_flags & NO_ID_TRANSFER)) if(brainmob && !(brain_owner.stat == DEAD || (HAS_TRAIT(brain_owner, TRAIT_DEATHCOMA)))) to_chat(brainmob, span_danger("You can't feel your body! You're still just a brain!")) forceMove(brain_owner) diff --git a/code/modules/mob/living/carbon/alien/adult/queen.dm b/code/modules/mob/living/carbon/alien/adult/queen.dm index 1a08d2446d257..4387f7db3eca0 100644 --- a/code/modules/mob/living/carbon/alien/adult/queen.dm +++ b/code/modules/mob/living/carbon/alien/adult/queen.dm @@ -19,7 +19,7 @@ // as a wise man once wrote: "pull over that ass too fat" REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) // that'd be a too cheeky shield bashing strat - ADD_TRAIT(src, TRAIT_SHOVE_KNOCKDOWN_BLOCKED, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, INNATE_TRAIT) AddComponent(/datum/component/seethrough_mob) /mob/living/carbon/alien/adult/royal/on_lying_down(new_lying_angle) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 66f555b639a88..9303cd2347413 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -197,23 +197,13 @@ for(var/atom/movable/thing as anything in stomach_contents) if(!digestable_cache[thing.type]) continue - thing.reagents.trans_to(src, 4) - - if(isliving(thing)) - var/mob/living/lad = thing - lad.adjustBruteLoss(6) - else if(!thing.reagents.total_volume) // Mobs can't get dusted like this, too important - qdel(thing) + thing.acid_act(75, 10) /obj/item/organ/internal/stomach/alien/proc/consume_thing(atom/movable/thing) RegisterSignal(thing, COMSIG_MOVABLE_MOVED, PROC_REF(content_moved)) RegisterSignal(thing, COMSIG_QDELETING, PROC_REF(content_deleted)) if(isliving(thing)) - var/mob/living/lad = thing RegisterSignal(thing, COMSIG_LIVING_DEATH, PROC_REF(content_died)) - if(lad.stat == DEAD) - qdel(lad) - return stomach_contents += thing thing.forceMove(owner || src) // We assert that if we have no owner, we will not be nullspaced diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 98cb200ac0e18..ec03414abfcd2 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -85,12 +85,18 @@ span_userdanger("You violently crash into [victim][extra_speed ? " extra hard" : ""], but [victim] managed to block the worst of it!")) log_combat(src, victim, "crashed into and was blocked by") return + else if(HAS_TRAIT(victim, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) + victim.take_bodypart_damage(10 + 5 * extra_speed, check_armor = TRUE, wound_bonus = extra_speed * 5) + victim.apply_damage(10 + 10 * extra_speed, STAMINA) + victim.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS) + visible_message(span_danger("[src] crashes into [victim][extra_speed ? " really hard" : ""], but [victim] was able to stay on their feet!"),\ + span_userdanger("You violently crash into [victim][extra_speed ? " extra hard" : ""], but [victim] managed to stay on their feet!")) else victim.Paralyze(2 SECONDS) victim.take_bodypart_damage(10 + 5 * extra_speed, check_armor = TRUE, wound_bonus = extra_speed * 5) visible_message(span_danger("[src] crashes into [victim][extra_speed ? " really hard" : ""], knocking them both over!"),\ span_userdanger("You violently crash into [victim][extra_speed ? " extra hard" : ""]!")) - log_combat(src, victim, "crashed into") + log_combat(src, victim, "crashed into") if(oof_noise) playsound(src,'sound/weapons/punch1.ogg',50,TRUE) @@ -922,7 +928,7 @@ return ..() /mob/living/carbon/can_be_revived() - if(!get_organ_by_type(/obj/item/organ/internal/brain) && (!mind || !mind.has_antag_datum(/datum/antagonist/changeling)) || HAS_TRAIT(src, TRAIT_HUSK)) + if(!get_organ_by_type(/obj/item/organ/internal/brain) && (!IS_CHANGELING(src)) || HAS_TRAIT(src, TRAIT_HUSK)) return FALSE return ..() @@ -1023,6 +1029,7 @@ set_usable_hands(usable_hands + 1) synchronize_bodytypes() + synchronize_bodyshapes() ///Proc to hook behavior on bodypart removals. Do not directly call. You're looking for [/obj/item/bodypart/proc/drop_limb()]. /mob/living/carbon/proc/remove_bodypart(obj/item/bodypart/old_bodypart, special) @@ -1049,6 +1056,7 @@ set_usable_hands(usable_hands - 1) synchronize_bodytypes() + synchronize_bodyshapes() ///Updates the bodypart speed modifier based on our bodyparts. /mob/living/carbon/proc/update_bodypart_speed_modifier() @@ -1064,6 +1072,9 @@ /proc/cmp_organ_slot_asc(slot_a, slot_b) return GLOB.organ_process_order.Find(slot_a) - GLOB.organ_process_order.Find(slot_b) +/mob/living/carbon/proc/get_footprint_sprite() + return FOOTPRINT_SPRITE_PAWS + /mob/living/carbon/vv_get_dropdown() . = ..() VV_DROPDOWN_OPTION("", "---------") @@ -1344,7 +1355,6 @@ else set_lying_angle(new_lying_angle) - /mob/living/carbon/vv_edit_var(var_name, var_value) switch(var_name) if(NAMEOF(src, disgust)) @@ -1360,17 +1370,18 @@ return ..() - /mob/living/carbon/get_attack_type() if(has_active_hand()) var/obj/item/bodypart/arm/active_arm = get_active_hand() return active_arm.attack_type return ..() - /mob/living/carbon/proc/attach_rot() - if(mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD)) - AddComponent(/datum/component/rot, 6 MINUTES, 10 MINUTES, 1) + if(flags_1 & HOLOGRAM_1) + return + if(!(mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) + return + AddComponent(/datum/component/rot, 6 MINUTES, 10 MINUTES, 1) /** * This proc is used to determine whether or not the mob can handle touching an acid affected object. @@ -1420,3 +1431,20 @@ if(item && ((item in organs) || (item in bodyparts))) //let's not do this, aight? return FALSE return ..() + +/// Helper to cleanly trigger tail wagging +/// Accepts an optional timeout after which we remove the tail wagging +/// Returns true if successful, false otherwise +/mob/living/carbon/proc/wag_tail(timeout = INFINITY) + var/obj/item/organ/external/tail/wagged = get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + if(!wagged) + return FALSE + return wagged.start_wag(src, timeout) + +/// Helper to cleanly stop all tail wagging +/// Returns true if successful, false otherwise +/mob/living/carbon/proc/unwag_tail() // can't unwag a tail + var/obj/item/organ/external/tail/unwagged = get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + if(!unwagged) + return FALSE + return unwagged.stop_wag(src) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index c87b6cb515f29..e6f614ca07ad5 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -69,25 +69,19 @@ if(P.catastropic_dismemberment) apply_damage(P.damage, P.damtype, BODY_ZONE_CHEST, wound_bonus = P.wound_bonus) //stops a projectile blowing off a limb effectively doing no damage. Mostly relevant for sniper rifles. -/mob/living/carbon/proc/can_catch_item(skip_throw_mode_check) - . = FALSE +/mob/living/carbon/try_catch_item(obj/item/item, skip_throw_mode_check = FALSE, try_offhand = FALSE) + . = ..() + if(.) + throw_mode_off(THROW_MODE_TOGGLE) + +/mob/living/carbon/can_catch_item(skip_throw_mode_check = FALSE, try_offhand = FALSE) if(!skip_throw_mode_check && !throw_mode) - return - if(get_active_held_item()) - return - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) - return - return TRUE + return FALSE + return ..() -/mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) - if(!skipcatch && can_catch_item() && isitem(AM) && !HAS_TRAIT(AM, TRAIT_UNCATCHABLE) && isturf(AM.loc)) - var/obj/item/I = AM - I.attack_hand(src) - if(get_active_held_item() == I) //if our attack_hand() picks up the item... - visible_message(span_warning("[src] catches [I]!"), \ - span_userdanger("You catch [I] in mid-air!")) - throw_mode_off(THROW_MODE_TOGGLE) - return TRUE +/mob/living/carbon/hitby(atom/movable/movable, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) + if(!skipcatch && try_catch_item(movable)) + return TRUE return ..() /mob/living/carbon/send_item_attack_message(obj/item/I, mob/living/user, hit_area, def_zone) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index a8b7af95ae611..d3e57c4ec1df1 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -118,6 +118,9 @@ var/last_top_offset /// A bitfield of "bodytypes", updated by /obj/item/bodypart/proc/synchronize_bodytypes() - var/bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC + var/bodytype = BODYTYPE_ORGANIC + + /// A bitfield of "bodyshapes", updated by /obj/item/bodypart/proc/synchronize_bodyshapes() + var/bodyshape = BODYSHAPE_HUMANOID COOLDOWN_DECLARE(bleeding_message_cd) diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index 7aa9afba95ea1..8dfa0be5e2b0c 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -278,8 +278,8 @@ update_held_items() update_worn_handcuffs() update_worn_legcuffs() - update_fire() update_body() + update_appearance(UPDATE_OVERLAYS) /mob/living/carbon/update_held_items() . = ..() @@ -315,27 +315,18 @@ hands += I.build_worn_icon(default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) return hands -/mob/living/carbon/update_fire_overlay(stacks, on_fire, last_icon_state, suffix = "") - var/fire_icon = "[dna?.species.fire_overlay || "human"]_[stacks > MOB_BIG_FIRE_STACK_THRESHOLD ? "big_fire" : "small_fire"][suffix]" +/mob/living/carbon/get_fire_overlay(stacks, on_fire) + var/fire_icon = "[dna?.species.fire_overlay || "human"]_[stacks > MOB_BIG_FIRE_STACK_THRESHOLD ? "big_fire" : "small_fire"]" if(!GLOB.fire_appearances[fire_icon]) - GLOB.fire_appearances[fire_icon] = mutable_appearance('icons/mob/effects/onfire.dmi', fire_icon, -FIRE_LAYER, appearance_flags = RESET_COLOR) - - if((stacks > 0 && on_fire) || HAS_TRAIT(src, TRAIT_PERMANENTLY_ONFIRE)) - if(fire_icon == last_icon_state) - return last_icon_state - - remove_overlay(FIRE_LAYER) - overlays_standing[FIRE_LAYER] = GLOB.fire_appearances[fire_icon] - apply_overlay(FIRE_LAYER) - return fire_icon - - if(!last_icon_state) - return last_icon_state - - remove_overlay(FIRE_LAYER) - apply_overlay(FIRE_LAYER) - return null + GLOB.fire_appearances[fire_icon] = mutable_appearance( + 'icons/mob/effects/onfire.dmi', + fire_icon, + -HIGHEST_LAYER, + appearance_flags = RESET_COLOR, + ) + + return GLOB.fire_appearances[fire_icon] /mob/living/carbon/update_damage_overlays() remove_overlay(DAMAGE_LAYER) diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index 85a6b06a2d340..eafb6f8ba22e1 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -42,7 +42,7 @@ for(var/obj/item/organ/organ as anything in organs) if((drop_bitflags & DROP_BRAIN) && istype(organ, /obj/item/organ/internal/brain)) - if(drop_bitflags & DROP_BODYPARTS) + if((drop_bitflags & DROP_BODYPARTS) && (check_zone(organ.zone) != BODY_ZONE_CHEST)) // chests can't drop continue // the head will drop, so the brain should stay inside organ.Remove(src) diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 6b97a36bab399..e37048ca32fee 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -34,33 +34,25 @@ . += span_deadsay("It appears that [t_his] brain is missing...") var/list/msg = list("") - var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) - var/list/disabled = list() - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - if(BP.bodypart_disabled) - disabled += BP - missing -= BP.body_zone - for(var/obj/item/I in BP.embedded_objects) - if(I.isEmbedHarmless()) - msg += "[t_He] [t_has] [icon2html(I, user)] \a [I] stuck to [t_his] [BP.name]!\n" + for(var/obj/item/bodypart/bodypart as anything in bodyparts) + for(var/obj/item/embedded_item as anything in bodypart.embedded_objects) + if(embedded_item.isEmbedHarmless()) + msg += "[t_He] [t_has] [icon2html(embedded_item, user)] \a [embedded_item] stuck to [t_his] [bodypart.name]!\n" else - msg += "[t_He] [t_has] [icon2html(I, user)] \a [I] embedded in [t_his] [BP.name]!\n" - for(var/i in BP.wounds) - var/datum/wound/W = i - msg += "[W.get_examine_description(user)]\n" + msg += "[t_He] [t_has] [icon2html(embedded_item, user)] \a [embedded_item] embedded in [t_his] [bodypart.name]!\n" + for(var/datum/wound/bodypart_wound as anything in bodypart.wounds) + msg += "[bodypart_wound.get_examine_description(user)]\n" - for(var/X in disabled) - var/obj/item/bodypart/BP = X + for(var/obj/item/bodypart/disabled_limb as anything in get_disabled_limbs()) var/damage_text - damage_text = (BP.brute_dam >= BP.burn_dam) ? BP.heavy_brute_msg : BP.heavy_burn_msg - msg += "[capitalize(t_his)] [BP.name] is [damage_text]!\n" + damage_text = (disabled_limb.brute_dam >= disabled_limb.burn_dam) ? disabled_limb.heavy_brute_msg : disabled_limb.heavy_burn_msg + msg += "[t_His] [disabled_limb.name] is [damage_text]!\n" - for(var/t in missing) - if(t == BODY_ZONE_HEAD) - msg += "[span_deadsay("[t_His] [parse_zone(t)] is missing!")]\n" + for(var/obj/item/bodypart/missing_limb as anything in get_missing_limbs()) + if(missing_limb == BODY_ZONE_HEAD) + msg += "[span_deadsay("[t_His] [parse_zone(missing_limb)] is missing!")]\n" continue - msg += "[span_warning("[t_His] [parse_zone(t)] is missing!")]\n" + msg += "[span_warning("[t_His] [parse_zone(missing_limb)] is missing!")]\n" var/temp = getBruteLoss() diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index bb9f196d00507..ff07ad2ef0e73 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -348,9 +348,12 @@ GLOBAL_LIST_EMPTY(features_by_species) qdel(existing_organ) continue - if(!isnull(old_species) && !isnull(existing_organ)) - if(existing_organ.type != old_species.get_mutant_organ_type_for_slot(slot)) - continue // we don't want to remove organs that are not the default for this species + // we don't want to remove organs that are not the default for this species + if(!isnull(existing_organ)) + if(!isnull(old_species) && existing_organ.type != old_species.get_mutant_organ_type_for_slot(slot)) + continue + else if(!replace_current && existing_organ.type != get_mutant_organ_type_for_slot(slot)) + continue // at this point we already know new_organ is not null if(existing_organ?.type == new_organ) @@ -690,7 +693,7 @@ GLOBAL_LIST_EMPTY(features_by_species) working_shirt.pixel_y += height_offset standing += working_shirt - if(species_human.socks && species_human.num_legs >= 2 && !(species_human.bodytype & BODYTYPE_DIGITIGRADE)) + if(species_human.socks && species_human.num_legs >= 2 && !(species_human.bodyshape & BODYSHAPE_DIGITIGRADE)) var/datum/sprite_accessory/socks/socks = GLOB.socks_list[species_human.socks] if(socks) standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER) @@ -908,7 +911,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(ITEM_SLOT_FEET) if(H.num_legs < 2) return FALSE - if((H.bodytype & BODYTYPE_DIGITIGRADE) && !(I.item_flags & IGNORE_DIGITIGRADE)) + if((H.bodyshape & BODYSHAPE_DIGITIGRADE) && !(I.item_flags & IGNORE_DIGITIGRADE)) if(!(I.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON))) if(!disable_warning) to_chat(H, span_warning("The footwear around here isn't compatible with your feet!")) @@ -939,7 +942,7 @@ GLOBAL_LIST_EMPTY(features_by_species) return equip_delay_self_check(I, H, bypass_equip_delay_self) if(ITEM_SLOT_ICLOTHING) var/obj/item/bodypart/chest = H.get_bodypart(BODY_ZONE_CHEST) - if(chest && (chest.bodytype & BODYTYPE_MONKEY)) + if(chest && (chest.bodyshape & BODYSHAPE_MONKEY)) if(!(I.supports_variations_flags & CLOTHING_MONKEY_VARIATION)) if(!disable_warning) to_chat(H, span_warning("[I] doesn't fit your [chest.name]!")) @@ -1198,13 +1201,15 @@ GLOBAL_LIST_EMPTY(features_by_species) log_combat(user, target, "punched") //If we rolled a punch high enough to hit our stun threshold, or our target is staggered and they have at least 40 damage+stamina loss, we knock them down - if((target.stat != DEAD) && prob(limb_accuracy) || (target.stat != DEAD) && staggered && (target.getStaminaLoss() + user.getBruteLoss()) >= 40) - target.visible_message(span_danger("[user] knocks [target] down!"), \ - span_userdanger("You're knocked down by [user]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_danger("You knock [target] down!")) - var/knockdown_duration = 4 SECONDS + (target.getStaminaLoss() + (target.getBruteLoss()*0.5))*0.8 //50 total damage = 4 second base stun + 4 second stun modifier = 8 second knockdown duration - target.apply_effect(knockdown_duration, EFFECT_KNOCKDOWN, armor_block) - log_combat(user, target, "got a stun punch with their previous punch") + //This does not work against opponents who are knockdown immune, such as from wearing riot armor. + if(!HAS_TRAIT(src, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) + if((target.stat != DEAD) && prob(limb_accuracy) || (target.stat != DEAD) && staggered && (target.getStaminaLoss() + user.getBruteLoss()) >= 40) + target.visible_message(span_danger("[user] knocks [target] down!"), \ + span_userdanger("You're knocked down by [user]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, user) + to_chat(user, span_danger("You knock [target] down!")) + var/knockdown_duration = 4 SECONDS + (target.getStaminaLoss() + (target.getBruteLoss()*0.5))*0.8 //50 total damage = 4 second base stun + 4 second stun modifier = 8 second knockdown duration + target.apply_effect(knockdown_duration, EFFECT_KNOCKDOWN, armor_block) + log_combat(user, target, "got a stun punch with their previous punch") /datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) if(user.body_position != STANDING_UP) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 7d31dd5ff90de..6d15f696bed57 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -6,6 +6,8 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) new /obj/effect/temp_visual/dust_animation(loc, dna.species.dust_anim) /mob/living/carbon/human/spawn_gibs(drop_bitflags=NONE) + if(flags_1 & HOLOGRAM_1) + return if(drop_bitflags & DROP_BODYPARTS) new /obj/effect/gibspawner/human(drop_location(), src, get_static_viruses()) else diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 7c7e84a9ffa65..b205eb2e2e217 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -81,10 +81,14 @@ only_forced_audio = TRUE vary = TRUE +/datum/emote/carbon/human/scream/run_emote(mob/user, params, type_override, intentional = FALSE) + if(!intentional && HAS_TRAIT(user, TRAIT_ANALGESIA)) + return + return ..() + /datum/emote/living/carbon/human/scream/get_sound(mob/living/carbon/human/user) if(!istype(user)) return - return user.dna.species.get_scream_sound(user) /datum/emote/living/carbon/human/scream/screech //If a human tries to screech it'll just scream. @@ -133,10 +137,12 @@ if(!.) return var/obj/item/organ/external/tail/oranges_accessory = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + //I am so sorry my son + //We bypass helpers here cause we already have the tail if(oranges_accessory.wag_flags & WAG_WAGGING) //We verified the tail exists in can_run_emote() - SEND_SIGNAL(user, COMSIG_ORGAN_WAG_TAIL, FALSE) + oranges_accessory.stop_wag(user) else - SEND_SIGNAL(user, COMSIG_ORGAN_WAG_TAIL, TRUE) + oranges_accessory.start_wag(user) /datum/emote/living/carbon/human/wag/select_message_type(mob/user, intentional) . = ..() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 4791c818e1aff..89ad4700aad71 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -24,7 +24,7 @@ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_FACE_ACT, PROC_REF(clean_face)) AddComponent(/datum/component/personal_crafting) AddElement(/datum/element/footstep, FOOTSTEP_MOB_HUMAN, 1, -6) - AddComponent(/datum/component/bloodysoles/feet) + AddComponent(/datum/component/bloodysoles/feet, FOOTPRINT_SPRITE_SHOES) AddElement(/datum/element/ridable, /datum/component/riding/creature/human) AddElement(/datum/element/strippable, GLOB.strippable_human_items, TYPE_PROC_REF(/mob/living/carbon/human/, should_strip)) var/static/list/loc_connections = list( @@ -347,6 +347,10 @@ var/obj/item/bodypart/the_part = isbodypart(target_zone) ? target_zone : get_bodypart(check_zone(target_zone)) //keep these synced to_chat(user, span_alert("There is no exposed flesh or thin material on [p_their()] [the_part.name].")) +/mob/living/carbon/human/get_footprint_sprite() + var/obj/item/bodypart/leg/L = get_bodypart(BODY_ZONE_R_LEG) || get_bodypart(BODY_ZONE_L_LEG) + return shoes?.footprint_sprite || L?.footprint_sprite + #define CHECK_PERMIT(item) (item && item.item_flags & NEEDS_PERMIT) /mob/living/carbon/human/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) @@ -455,30 +459,34 @@ return FALSE if (target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH)) - to_chat(src, span_warning("[target.name] is dead!")) + balloon_alert(src, "[target.p_they()] [target.p_are()] dead!") return FALSE if (is_mouth_covered()) - to_chat(src, span_warning("Remove your mask first!")) + balloon_alert(src, "remove your mask first!") return FALSE if (target.is_mouth_covered()) - to_chat(src, span_warning("Remove [p_their()] mask first!")) + balloon_alert(src, "remove [target.p_their()] mask first!") return FALSE - if (!get_organ_slot(ORGAN_SLOT_LUNGS)) - to_chat(src, span_warning("You have no lungs to breathe with, so you cannot perform CPR!")) + if(HAS_TRAIT_FROM(src, TRAIT_NOBREATH, DISEASE_TRAIT)) + to_chat(src, span_warning("you can't breathe!")) return FALSE - if (HAS_TRAIT(src, TRAIT_NOBREATH)) - to_chat(src, span_warning("You do not breathe, so you cannot perform CPR!")) + var/obj/item/organ/internal/lungs/human_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) + if(isnull(human_lungs)) + balloon_alert(src, "you don't have lungs!") + return FALSE + if(human_lungs.organ_flags & ORGAN_FAILING) + balloon_alert(src, "your lungs are too damaged!") return FALSE visible_message(span_notice("[src] is trying to perform CPR on [target.name]!"), \ span_notice("You try to perform CPR on [target.name]... Hold still!")) if (!do_after(src, delay = panicking ? CPR_PANIC_SPEED : (3 SECONDS), target = target)) - to_chat(src, span_warning("You fail to perform CPR on [target]!")) + balloon_alert(src, "you fail to perform CPR!") return FALSE if (target.health > target.crit_threshold) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index b976b2952d406..6e1f9037018b6 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -146,7 +146,7 @@ return if(!(shove_flags & SHOVE_KNOCKDOWN_BLOCKED)) target.Knockdown(SHOVE_KNOCKDOWN_HUMAN) - if(!HAS_TRAIT(src, TRAIT_SHOVE_KNOCKDOWN_BLOCKED)) + if(!HAS_TRAIT(src, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) Knockdown(SHOVE_KNOCKDOWN_COLLATERAL) target.visible_message(span_danger("[shover] shoves [target.name] into [name]!"), span_userdanger("You're shoved into [name] by [shover]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index 99c9020a09cab..290fe4ce03b94 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -93,26 +93,26 @@ There are several things that need to be remembered: var/mutable_appearance/uniform_overlay //This is how non-humanoid clothing works. You check if the mob has the right bodyflag, and the clothing has the corresponding clothing flag. - //handled_by_bodytype is used to track whether or not we successfully used an alternate sprite. It's set to TRUE to ease up on copy-paste. + //handled_by_bodyshape is used to track whether or not we successfully used an alternate sprite. It's set to TRUE to ease up on copy-paste. //icon_file MUST be set to null by default, or it causes issues. - //handled_by_bodytype MUST be set to FALSE under the if(!icon_exists()) statement, or everything breaks. - //"override_file = handled_by_bodytype ? icon_file : null" MUST be added to the arguments of build_worn_icon() + //handled_by_bodyshape MUST be set to FALSE under the if(!icon_exists()) statement, or everything breaks. + //"override_file = handled_by_bodyshape ? icon_file : null" MUST be added to the arguments of build_worn_icon() //Friendly reminder that icon_exists(file, state, scream = TRUE) is your friend when debugging this code. - var/handled_by_bodytype = TRUE + var/handled_by_bodyshape = TRUE var/icon_file var/woman //BEGIN SPECIES HANDLING - if((bodytype & BODYTYPE_MONKEY) && (uniform.supports_variations_flags & CLOTHING_MONKEY_VARIATION)) + if((bodyshape & BODYSHAPE_MONKEY) && (uniform.supports_variations_flags & CLOTHING_MONKEY_VARIATION)) icon_file = MONKEY_UNIFORM_FILE - else if((bodytype & BODYTYPE_DIGITIGRADE) && (uniform.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) + else if((bodyshape & BODYSHAPE_DIGITIGRADE) && (uniform.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) icon_file = DIGITIGRADE_UNIFORM_FILE //Female sprites have lower priority than digitigrade sprites - else if(dna.species.sexes && (bodytype & BODYTYPE_HUMANOID) && physique == FEMALE && !(uniform.female_sprite_flags & NO_FEMALE_UNIFORM)) //Agggggggghhhhh + else if(dna.species.sexes && (bodyshape & BODYSHAPE_HUMANOID) && physique == FEMALE && !(uniform.female_sprite_flags & NO_FEMALE_UNIFORM)) //Agggggggghhhhh woman = TRUE if(!icon_exists(icon_file, RESOLVE_ICON_STATE(uniform))) icon_file = DEFAULT_UNIFORM_FILE - handled_by_bodytype = FALSE + handled_by_bodyshape = FALSE //END SPECIES HANDLING uniform_overlay = uniform.build_worn_icon( @@ -121,7 +121,7 @@ There are several things that need to be remembered: isinhands = FALSE, female_uniform = woman ? uniform.female_sprite_flags : null, override_state = target_overlay, - override_file = handled_by_bodytype ? icon_file : null, + override_file = handled_by_bodyshape ? icon_file : null, ) var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST) @@ -165,18 +165,16 @@ There are several things that need to be remembered: inv.update_icon() //Bloody hands begin - var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER) - cut_overlay(bloody_overlay) + var/mutable_appearance/bloody_lefthand_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands_left", -GLOVES_LAYER) + var/mutable_appearance/bloody_righthand_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands_right", -GLOVES_LAYER) + cut_overlay(bloody_lefthand_overlay) + cut_overlay(bloody_righthand_overlay) if(!gloves && blood_in_hands && (num_hands > 0)) - bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER) - if(num_hands < 2) - if(has_left_hand(FALSE)) - bloody_overlay.icon_state = "bloodyhands_left" - else if(has_right_hand(FALSE)) - bloody_overlay.icon_state = "bloodyhands_right" - - add_overlay(bloody_overlay) - //Bloody hands end + if(has_left_hand(check_disabled = FALSE)) + add_overlay(bloody_lefthand_overlay) + if(has_right_hand(check_disabled = FALSE)) + add_overlay(bloody_righthand_overlay) + // Bloody hands end if(gloves) var/obj/item/worn_item = gloves diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 8a61096767d62..aede1e69a7289 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -107,37 +107,11 @@ s_store, ) -/// Returns items which are currently visible on the mob -/mob/living/carbon/human/proc/get_visible_items() - var/static/list/visible_slots = list( - ITEM_SLOT_OCLOTHING, - ITEM_SLOT_ICLOTHING, - ITEM_SLOT_GLOVES, - ITEM_SLOT_EYES, - ITEM_SLOT_EARS, - ITEM_SLOT_MASK, - ITEM_SLOT_HEAD, - ITEM_SLOT_FEET, - ITEM_SLOT_ID, - ITEM_SLOT_BELT, - ITEM_SLOT_BACK, - ITEM_SLOT_NECK, - ITEM_SLOT_HANDS, - ITEM_SLOT_BACKPACK, - ITEM_SLOT_SUITSTORE, - ITEM_SLOT_HANDCUFFED, - ITEM_SLOT_LEGCUFFED, - ) - var/list/obscured = check_obscured_slots() - var/list/visible_items = list() - for (var/slot in visible_slots) - if (obscured & slot) - continue - var/obj/item/equipped = get_item_by_slot(slot) - if (equipped) - visible_items += equipped - for (var/obj/item/held in held_items) - visible_items += held +/mob/living/carbon/human/get_visible_items() + var/list/visible_items = ..() + var/obj/item/clothing/under/under = w_uniform + if(istype(under) && length(under.attached_accessories) && (under in visible_items)) + visible_items += under.attached_accessories return visible_items //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() @@ -228,11 +202,8 @@ return not_handled //For future deeper overrides -/mob/living/carbon/human/equipped_speed_mods() - . = ..() - for(var/sloties in get_all_worn_items() - list(l_store, r_store, s_store, back, wear_mask, wear_neck, head, handcuffed, legcuffed)) - var/obj/item/thing = sloties - . += thing?.slowdown +/mob/living/carbon/human/get_equipped_speed_mod_items() + return ..() - list(l_store, r_store, s_store) /mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) . = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should. diff --git a/code/modules/mob/living/carbon/human/monkey.dm b/code/modules/mob/living/carbon/human/monkey.dm index 88d46855a5e3d..7a2e7bb74747d 100644 --- a/code/modules/mob/living/carbon/human/monkey.dm +++ b/code/modules/mob/living/carbon/human/monkey.dm @@ -2,7 +2,6 @@ icon_state = "monkey" //for mapping race = /datum/species/monkey ai_controller = /datum/ai_controller/monkey - faction = list(FACTION_NEUTRAL, FACTION_MONKEY) /mob/living/carbon/human/species/monkey/Initialize(mapload, cubespawned = FALSE, mob/spawner) if (cubespawned) @@ -32,12 +31,6 @@ equip_to_slot_or_del(helmet, ITEM_SLOT_HEAD) helmet.attack_self(src) // todo encapsulate toggle -/mob/living/carbon/human/species/monkey/holodeck - race = /datum/species/monkey/holodeck - -/mob/living/carbon/human/species/monkey/holodeck/spawn_gibs() // no blood and no gibs - return - GLOBAL_DATUM(the_one_and_only_punpun, /mob/living/carbon/human/species/monkey/punpun) /mob/living/carbon/human/species/monkey/punpun diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm index 3c176ff4388c8..1f371d575ac1e 100644 --- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm +++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm @@ -22,6 +22,7 @@ ) no_equip_flags = ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_SUITSTORE changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN | SLIME_EXTRACT + inherent_factions = list(FACTION_MONKEY) sexes = FALSE species_language_holder = /datum/language_holder/monkey @@ -41,9 +42,7 @@ ai_controlled_species = TRUE /datum/species/monkey/random_name(gender,unique,lastname) - var/randname = "monkey ([rand(1,999)])" - - return randname + return "monkey ([rand(1, 999)])" /datum/species/monkey/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) . = ..() @@ -169,7 +168,7 @@ /obj/item/organ/internal/brain/primate/on_mob_insert(mob/living/carbon/primate) . = ..() - RegisterSignal(primate, COMSIG_MOVABLE_CROSS, PROC_REF(on_crossed), TRUE) + RegisterSignal(primate, COMSIG_MOVABLE_CROSS, PROC_REF(on_crossed)) /obj/item/organ/internal/brain/primate/on_mob_remove(mob/living/carbon/primate) . = ..() @@ -184,30 +183,13 @@ var/mob/living/in_the_way_mob = crossed if(iscarbon(in_the_way_mob) && !in_the_way_mob.combat_mode) return - if(in_the_way_mob.pass_flags & PASSTABLE) + if(in_the_way_mob.pass_flags & PASSMOB) return in_the_way_mob.knockOver(owner) /obj/item/organ/internal/brain/primate/get_attacking_limb(mob/living/carbon/human/target) - return owner.get_bodypart(BODY_ZONE_HEAD) - -/// Virtual monkeys that crave virtual bananas. Everything about them is ephemeral (except that bite). -/datum/species/monkey/holodeck - id = SPECIES_MONKEY_HOLODECK - knife_butcher_results = list() - meat = null - skinned_type = null - inherent_traits = list( - TRAIT_GENELESS, - TRAIT_GUN_NATURAL, - TRAIT_NO_AUGMENTS, - TRAIT_NO_BLOOD_OVERLAY, - TRAIT_NO_DNA_COPY, - TRAIT_NO_UNDERWEAR, - TRAIT_NO_ZOMBIFY, - TRAIT_NOBLOOD, - TRAIT_NOHUNGER, - TRAIT_VENTCRAWLER_NUDE, - ) + if(!HAS_TRAIT(owner, TRAIT_ADVANCEDTOOLUSER)) + return owner.get_bodypart(BODY_ZONE_HEAD) + return ..() #undef MONKEY_SPEC_ATTACK_BITE_MISS_CHANCE diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 8ce8be6f6d6b5..c9fa732b2880d 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -115,7 +115,7 @@ else internal_fire = FALSE - H.update_fire() + H.update_appearance(UPDATE_OVERLAYS) /datum/species/plasmaman/handle_fire(mob/living/carbon/human/H, seconds_per_tick, no_protection = FALSE) if(internal_fire) diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index c77ad3dfee1ed..b2027b9e1a654 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -95,6 +95,7 @@ icon = 'icons/obj/medical/organs/shadow_organs.dmi' color_cutoffs = list(20, 10, 40) pepperspray_protect = TRUE + flash_protect = FLASH_PROTECTION_SENSITIVE /// the key to some of their powers /obj/item/organ/internal/brain/shadow diff --git a/code/modules/mob/living/carbon/init_signals.dm b/code/modules/mob/living/carbon/init_signals.dm index 190fe9d845342..e64410ab63573 100644 --- a/code/modules/mob/living/carbon/init_signals.dm +++ b/code/modules/mob/living/carbon/init_signals.dm @@ -13,12 +13,6 @@ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_TOXIMMUNE), PROC_REF(on_toximmune_trait_gain)) RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_GENELESS), PROC_REF(on_geneless_trait_gain)) - - RegisterSignals(src, list( - SIGNAL_ADDTRAIT(TRAIT_PERMANENTLY_ONFIRE), - SIGNAL_REMOVETRAIT(TRAIT_PERMANENTLY_ONFIRE), - ), PROC_REF(update_permanently_on_fire)) - /** * On gain of TRAIT_AGENDER * @@ -90,12 +84,6 @@ reagents.end_metabolization(keep_liverless = TRUE) -///On gain of TRAIT_PERMANENTLY_ONFIRE, update the visuals if not on fire -/mob/living/carbon/proc/update_permanently_on_fire(datum/source) - SIGNAL_HANDLER - if(!on_fire) - update_fire() - /** * On gain of TRAIT_VIRUSIMMUNE * diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 8e154b0977f6f..e0a24d0ab51f0 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -49,6 +49,39 @@ legcuffed, ) +/// Returns items which are currently visible on the mob +/mob/living/carbon/proc/get_visible_items() + var/static/list/visible_slots = list( + ITEM_SLOT_OCLOTHING, + ITEM_SLOT_ICLOTHING, + ITEM_SLOT_GLOVES, + ITEM_SLOT_EYES, + ITEM_SLOT_EARS, + ITEM_SLOT_MASK, + ITEM_SLOT_HEAD, + ITEM_SLOT_FEET, + ITEM_SLOT_ID, + ITEM_SLOT_BELT, + ITEM_SLOT_BACK, + ITEM_SLOT_NECK, + ITEM_SLOT_HANDS, + ITEM_SLOT_BACKPACK, + ITEM_SLOT_SUITSTORE, + ITEM_SLOT_HANDCUFFED, + ITEM_SLOT_LEGCUFFED, + ) + var/list/obscured = check_obscured_slots() + var/list/visible_items = list() + for (var/slot in visible_slots) + if (obscured & slot) + continue + var/obj/item/equipped = get_item_by_slot(slot) + if (equipped) + visible_items += equipped + for (var/obj/item/held in held_items) + visible_items += held + return visible_items + /mob/living/carbon/proc/equip_in_one_of_slots(obj/item/equipping, list/slots, qdel_on_fail = TRUE, indirect_action = FALSE) for(var/slot in slots) if(equip_to_slot_if_possible(equipping, slots[slot], disable_warning = TRUE, indirect_action = indirect_action)) @@ -128,11 +161,8 @@ return not_handled -/mob/living/carbon/equipped_speed_mods() - . = ..() - for(var/sloties in get_all_worn_items()) - var/obj/item/thing = sloties - . += thing?.slowdown +/mob/living/carbon/get_equipped_speed_mod_items() + return ..() + get_all_worn_items() /// This proc is called after an item has been successfully handled and equipped to a slot. /mob/living/carbon/proc/has_equipped(obj/item/item, slot, initial = FALSE) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 7f58c2e911d9c..286a3b30ed843 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -61,7 +61,7 @@ update_damage_overlays() damage_dealt = actual_hit.get_damage() - delta // Unfortunately bodypart receive_damage doesn't return damage dealt so we do it manually else - damage_dealt = adjustBruteLoss(damage_amount, forced = forced) + damage_dealt = -1 * adjustBruteLoss(damage_amount, forced = forced) if(BURN) if(isbodypart(def_zone)) var/obj/item/bodypart/actual_hit = def_zone @@ -77,17 +77,17 @@ damage_source = attacking_item, )) update_damage_overlays() - damage_dealt = delta - actual_hit.get_damage() // See above + damage_dealt = actual_hit.get_damage() - delta // See above else - damage_dealt = adjustFireLoss(damage_amount, forced = forced) + damage_dealt = -1 * adjustFireLoss(damage_amount, forced = forced) if(TOX) - damage_dealt = adjustToxLoss(damage_amount, forced = forced) + damage_dealt = -1 * adjustToxLoss(damage_amount, forced = forced) if(OXY) - damage_dealt = adjustOxyLoss(damage_amount, forced = forced) + damage_dealt = -1 * adjustOxyLoss(damage_amount, forced = forced) if(STAMINA) - damage_dealt = adjustStaminaLoss(damage_amount, forced = forced) + damage_dealt = -1 * adjustStaminaLoss(damage_amount, forced = forced) if(BRAIN) - damage_dealt = adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount) + damage_dealt = -1 * adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount) SEND_SIGNAL(src, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage_dealt, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) return damage_dealt diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 4da845c11df43..0c228775662d8 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -37,6 +37,8 @@ * * DROP_BODYPARTS - Gibs will spawn with bodypart limbs present **/ /mob/living/proc/spawn_gibs(drop_bitflags=NONE) + if(flags_1 & HOLOGRAM_1) + return new /obj/effect/gibspawner/generic(drop_location(), src, get_static_viruses()) /** diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index db8302b49dfa9..3a19eebadc966 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -342,6 +342,11 @@ emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE mob_type_blacklist_typecache = list(/mob/living/carbon/human) //Humans get specialized scream. +/datum/emote/living/scream/run_emote(mob/user, params, type_override, intentional = FALSE) + if(!intentional && HAS_TRAIT(user, TRAIT_ANALGESIA)) + return + return ..() + /datum/emote/living/scream/select_message_type(mob/user, message, intentional) . = ..() if(!intentional && isanimal_or_basicmob(user)) @@ -706,7 +711,7 @@ message = "beeps." message_param = "beeps at %t." sound = 'sound/machines/twobeep.ogg' - mob_type_allowed_typecache = list(/mob/living/brain, /mob/living/silicon) + mob_type_allowed_typecache = list(/mob/living/brain, /mob/living/silicon, /mob/living/basic/orbie) emote_type = EMOTE_AUDIBLE /datum/emote/living/inhale diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f518e29a2b426..e096434cbb966 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1580,11 +1580,6 @@ GLOBAL_LIST_EMPTY(fire_appearances) return fire_status.ignite(silent) -/mob/living/proc/update_fire() - var/datum/status_effect/fire_handler/fire_stacks/fire_stacks = has_status_effect(/datum/status_effect/fire_handler/fire_stacks) - if(fire_stacks) - fire_stacks.update_overlay() - /** * Extinguish all fire on the mob * @@ -1592,7 +1587,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) * Signals the extinguishing. */ /mob/living/proc/extinguish_mob() - if(HAS_TRAIT(src, TRAIT_PERMANENTLY_ONFIRE)) //The everlasting flames will not be extinguished + if(HAS_TRAIT(src, TRAIT_NO_EXTINGUISH)) //The everlasting flames will not be extinguished return var/datum/status_effect/fire_handler/fire_stacks/fire_status = has_status_effect(/datum/status_effect/fire_handler/fire_stacks) if(!fire_status || !fire_status.on_fire) @@ -1611,13 +1606,13 @@ GLOBAL_LIST_EMPTY(fire_appearances) /mob/living/proc/adjust_fire_stacks(stacks, fire_type = /datum/status_effect/fire_handler/fire_stacks) if(stacks < 0) - if(HAS_TRAIT(src, TRAIT_PERMANENTLY_ONFIRE)) //You can't reduce fire stacks of the everlasting flames + if(HAS_TRAIT(src, TRAIT_NO_EXTINGUISH)) //You can't reduce fire stacks of the everlasting flames return stacks = max(-fire_stacks, stacks) apply_status_effect(fire_type, stacks) /mob/living/proc/adjust_wet_stacks(stacks, wet_type = /datum/status_effect/fire_handler/wet_stacks) - if(HAS_TRAIT(src, TRAIT_PERMANENTLY_ONFIRE)) //The everlasting flames will not be extinguished + if(HAS_TRAIT(src, TRAIT_NO_EXTINGUISH)) //The everlasting flames will not be extinguished return if(stacks < 0) stacks = max(fire_stacks, stacks) @@ -1695,19 +1690,18 @@ GLOBAL_LIST_EMPTY(fire_appearances) ignite_mob() /** - * Sets fire overlay of the mob. + * Gets the fire overlay to use for this mob * - * Vars: + * Args: * * stacks: Current amount of fire_stacks * * on_fire: If we're lit on fire - * * last_icon_state: Holds last fire overlay icon state, used for optimization - * * suffix: Suffix for the fire icon state for special fire types * - * This should return last_icon_state for the fire status efect + * Return a mutable appearance, the overlay that will be applied. */ -/mob/living/proc/update_fire_overlay(stacks, on_fire, last_icon_state, suffix = "") - return last_icon_state +/mob/living/proc/get_fire_overlay(stacks, on_fire) + RETURN_TYPE(/mutable_appearance) + return null /** * Handles effects happening when mob is on normal fire diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 61d0c8ae71a9f..562c54ae0b758 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -210,6 +210,26 @@ hitpush = FALSE return ..() +///The core of catching thrown items, which non-carbons cannot without the help of items or abilities yet, as they've no throw mode. +/mob/living/proc/try_catch_item(obj/item/item, skip_throw_mode_check = FALSE, try_offhand = FALSE) + if(!can_catch_item(skip_throw_mode_check, try_offhand) || !isitem(item) || HAS_TRAIT(item, TRAIT_UNCATCHABLE) || !isturf(item.loc)) + return FALSE + if(!can_hold_items(item)) + return FALSE + INVOKE_ASYNC(item, TYPE_PROC_REF(/obj/item, attempt_pickup), src, TRUE) + if(get_active_held_item() == item) //if our attack_hand() picks up the item... + visible_message(span_warning("[src] catches [item]!"), \ + span_userdanger("You catch [item] in mid-air!")) + return TRUE + +///Checks the requites for catching a throw item. +/mob/living/proc/can_catch_item(skip_throw_mode_check = FALSE, try_offhand = FALSE) + if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + return FALSE + if(get_active_held_item() && (!try_offhand || get_inactive_held_item() || !swap_hand())) + return FALSE + return TRUE + /mob/living/fire_act() . = ..() adjust_fire_stacks(3) @@ -527,7 +547,7 @@ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(cult_ending_helper), CULT_VICTORY_MASS_CONVERSION), 120) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper)), 270) if(client) - makeNewConstruct(/mob/living/basic/construct/harvester, src, cultoverride = TRUE) + make_new_construct(/mob/living/basic/construct/harvester, src, cultoverride = TRUE) else switch(rand(1, 4)) if(1) @@ -724,7 +744,7 @@ . |= SHOVE_CAN_MOVE if(!buckled) . |= SHOVE_CAN_HIT_SOMETHING - if(HAS_TRAIT(src, TRAIT_SHOVE_KNOCKDOWN_BLOCKED)) + if(HAS_TRAIT(src, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) . |= SHOVE_KNOCKDOWN_BLOCKED ///Send the chat feedback message for shoving diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index e86c9792f2736..0751cc37d64a9 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -400,11 +400,12 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( var/mob/living/carbon/human/human_speaker = src if(istype(human_speaker.wear_mask, /obj/item/clothing/mask)) var/obj/item/clothing/mask/worn_mask = human_speaker.wear_mask - if(worn_mask.voice_override) - voice_to_use = worn_mask.voice_override - if(worn_mask.voice_filter) - filter += worn_mask.voice_filter - use_radio = worn_mask.use_radio_beeps_tts + if(!worn_mask.mask_adjusted) + if(worn_mask.voice_override) + voice_to_use = worn_mask.voice_override + if(worn_mask.voice_filter) + filter += worn_mask.voice_filter + use_radio = worn_mask.use_radio_beeps_tts if(use_radio) special_filter += TTS_FILTER_RADIO if(issilicon(src)) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 23de5d9417f5d..a7d5b08579930 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -77,7 +77,7 @@ var/mob/camera/ai_eye/eyeobj var/sprint = 10 - var/cooldown = 0 + var/last_moved = 0 var/acceleration = TRUE var/obj/structure/ai_core/deactivated/linked_core //For exosuit control @@ -191,7 +191,8 @@ builtInCamera.network = list("ss13") ai_tracking_tool = new(src) - RegisterSignal(src, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) + RegisterSignal(ai_tracking_tool, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) + RegisterSignal(ai_tracking_tool, COMSIG_TRACKABLE_GLIDE_CHANGED, PROC_REF(tracked_glidesize_changed)) add_traits(list(TRAIT_PULL_BLOCKED, TRAIT_HANDS_BLOCKED), ROUNDSTART_TRAIT) @@ -211,8 +212,7 @@ switch(_key) if("`", "0") if(cam_prev) - if(ai_tracking_tool.tracking) - ai_tracking_tool.set_tracking(FALSE) + ai_tracking_tool.reset_tracking() eyeobj.setLoc(cam_prev) return if("1", "2", "3", "4", "5", "6", "7", "8", "9") @@ -223,8 +223,7 @@ return if(cam_hotkeys[_key]) //if this is false, no hotkey for this slot exists. cam_prev = eyeobj.loc - if(ai_tracking_tool.tracking) - ai_tracking_tool.set_tracking(FALSE) + ai_tracking_tool.reset_tracking() eyeobj.setLoc(cam_hotkeys[_key]) return return ..() @@ -250,7 +249,6 @@ if(ai_voicechanger) ai_voicechanger.owner = null ai_voicechanger = null - UnregisterSignal(src, COMSIG_TRACKABLE_TRACKING_TARGET) return ..() /// Removes all malfunction-related abilities from the AI @@ -401,7 +399,7 @@ set name = "track" set hidden = TRUE //Don't display it on the verb lists. This verb exists purely so you can type "track Oldman Robustin" and follow his ass - ai_tracking_tool.set_tracked_mob(src) + ai_tracking_tool.track_input(src) ///Called when an AI finds their tracking target. /mob/living/silicon/ai/proc/on_track_target(datum/trackable/source, mob/living/target) @@ -411,6 +409,12 @@ else view_core() +/// Keeps our rate of gliding in step with the mob we're following +/mob/living/silicon/ai/proc/tracked_glidesize_changed(datum/trackable/source, mob/living/target, new_glide_size) + SIGNAL_HANDLER + if(eyeobj) + eyeobj.glide_size = new_glide_size + /mob/living/silicon/ai/verb/toggle_anchor() set category = "AI Commands" set name = "Toggle Floor Bolts" @@ -524,7 +528,7 @@ else to_chat(src, span_notice("Unable to project to the holopad.")) if(href_list["track"]) - ai_tracking_tool.set_tracked_mob(src, href_list["track"]) + ai_tracking_tool.track_name(src, href_list["track"]) return if (href_list["ai_take_control"]) //Mech domination var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"]) in GLOB.mechas_list @@ -567,8 +571,7 @@ view_core() return - if(ai_tracking_tool.tracking) - ai_tracking_tool.set_tracking(FALSE) + ai_tracking_tool.reset_tracking() // ok, we're alive, camera is good and in our network... eyeobj.setLoc(get_turf(C)) @@ -642,8 +645,7 @@ set category = "AI Commands" set name = "Jump To Network" unset_machine() - if(ai_tracking_tool.tracking) - ai_tracking_tool.set_tracking(FALSE) + ai_tracking_tool.reset_tracking() var/cameralist[0] if(incapacitated()) @@ -697,7 +699,7 @@ if("Station Member") var/list/personnel_list = list() - for(var/datum/record/crew/record in GLOB.manifest.locked)//Look in data core locked. + for(var/datum/record/locked/record in GLOB.manifest.locked)//Look in data core locked. personnel_list["[record.name]: [record.rank]"] = record.character_appearance//Pull names, rank, and image. if(!length(personnel_list)) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 416bbb19912e8..e8c1919b020f9 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -154,35 +154,44 @@ return var/mob/living/silicon/ai/AI = usr if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z)) - if(AI.ai_tracking_tool.tracking) - AI.ai_tracking_tool.set_tracking(FALSE) + AI.ai_tracking_tool.reset_tracking() if (isturf(loc) || isturf(src)) AI.eyeobj.setLoc(src) // This will move the AIEye. It will also cause lights near the eye to light up, if toggled. // This is handled in the proc below this one. - -/client/proc/AIMove(n, direct, mob/living/silicon/ai/user) - - var/initial = initial(user.sprint) - var/max_sprint = 50 - - if(user.cooldown && user.cooldown < world.timeofday) // 3 seconds - user.sprint = initial - - for(var/i = 0; i < max(user.sprint, initial); i += 20) - var/turf/step = get_turf(get_step(user.eyeobj, direct)) +#define SPRINT_PER_TICK 0.5 +#define MAX_SPRINT 50 +#define SPRINT_PER_STEP 20 +/mob/living/silicon/ai/proc/AIMove(direction) + if(last_moved && last_moved + 1 < world.timeofday) + // Decay sprint based off how long it took us to input this next move + var/missed_sprint = max((world.timeofday + 1) - last_moved, 0) * SPRINT_PER_TICK + sprint = max(sprint - missed_sprint * 7, initial(sprint)) + + // We move a full step, at least. Can't glide more with our current movement mode, so this is how I have to live + var/step_count = 0 + for(var/i = 0; i < max(sprint, initial(sprint)); i += SPRINT_PER_STEP) + step_count += 1 + var/turf/step = get_turf(get_step(eyeobj, direction)) if(step) - user.eyeobj.setLoc(step) + eyeobj.setLoc(step) + + // I'd like to make this scale with the steps we take, but it like, just can't + // So we're doin this instead + eyeobj.glide_size = world.icon_size - user.cooldown = world.timeofday + 5 - if(user.acceleration) - user.sprint = min(user.sprint + 0.5, max_sprint) + last_moved = world.timeofday + if(acceleration) + sprint = min(sprint + SPRINT_PER_TICK, MAX_SPRINT) else - user.sprint = initial + sprint = initial(sprint) + + ai_tracking_tool.reset_tracking() - if(user.ai_tracking_tool.tracking) - user.ai_tracking_tool.set_tracking(FALSE) +#undef SPRINT_PER_STEP +#undef MAX_SPRINT +#undef SPRINT_PER_TICK // Return to the Core. /mob/living/silicon/ai/proc/view_core() @@ -191,8 +200,8 @@ H.clear_holo(src) else current = null - if(ai_tracking_tool && ai_tracking_tool.tracking) - ai_tracking_tool.set_tracking(FALSE) + if(ai_tracking_tool) + ai_tracking_tool.reset_tracking() unset_machine() if(isturf(loc) && (QDELETED(eyeobj) || !eyeobj.loc)) diff --git a/code/modules/mob/living/silicon/ai/robot_control.dm b/code/modules/mob/living/silicon/ai/robot_control.dm index c4cc256244c3f..d963fc77be62f 100644 --- a/code/modules/mob/living/silicon/ai/robot_control.dm +++ b/code/modules/mob/living/silicon/ai/robot_control.dm @@ -14,7 +14,7 @@ return FALSE return TRUE -/datum/robot_control/ui_status(mob/user) +/datum/robot_control/ui_status(mob/user, datum/ui_state/state) if(is_interactable(user)) return ..() return UI_CLOSE diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index ed9cbe09352c3..f73336fe963d7 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -352,7 +352,7 @@ var/mutable_appearance/head_overlay = hat.build_worn_icon(default_layer = 20, default_icon_file = 'icons/mob/clothing/head/default.dmi') head_overlay.pixel_z += hat_offset add_overlay(head_overlay) - update_fire() + update_appearance(UPDATE_OVERLAYS) /mob/living/silicon/robot/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) if(same_z_layer) @@ -1017,25 +1017,19 @@ /mob/living/silicon/robot/proc/untip_roleplay() to_chat(src, span_notice("Your frustration has empowered you! You can now right yourself faster!")) -/mob/living/silicon/robot/update_fire_overlay(stacks, on_fire, last_icon_state, suffix = "") - var/fire_icon = "generic_fire[suffix]" +/mob/living/silicon/robot/get_fire_overlay(stacks, on_fire) + var/fire_icon = "generic_fire" if(!GLOB.fire_appearances[fire_icon]) - var/mutable_appearance/new_fire_overlay = mutable_appearance('icons/mob/effects/onfire.dmi', fire_icon, -FIRE_LAYER) - new_fire_overlay.appearance_flags = RESET_COLOR + var/mutable_appearance/new_fire_overlay = mutable_appearance( + 'icons/mob/effects/onfire.dmi', + fire_icon, + -HIGHEST_LAYER, + appearance_flags = RESET_COLOR, + ) GLOB.fire_appearances[fire_icon] = new_fire_overlay - if(stacks && on_fire) - if(last_icon_state == fire_icon) - return last_icon_state - add_overlay(GLOB.fire_appearances[fire_icon]) - return fire_icon - - if(!last_icon_state) - return last_icon_state - - cut_overlay(GLOB.fire_appearances[fire_icon]) - return null + return GLOB.fire_appearances[fire_icon] /// Draw power from the robot /mob/living/silicon/robot/proc/draw_power(power_to_draw) diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index 576a438a2708b..602815006250e 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -23,7 +23,7 @@ radio = /obj/item/radio/borg blocks_emissive = EMISSIVE_BLOCK_UNIQUE - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index e17ba69550d34..3cd9d45f5c107 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -75,7 +75,7 @@ TRAIT_MADNESS_IMMUNE, TRAIT_MARTIAL_ARTS_IMMUNE, TRAIT_NOFIRE_SPREAD, - TRAIT_SHOVE_KNOCKDOWN_BLOCKED, + TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, ) add_traits(traits_to_apply, ROUNDSTART_TRAIT) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 22c7439ec803f..ff304332c8df6 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -23,7 +23,7 @@ bubble_icon = "machine" speech_span = SPAN_ROBOT faction = list(FACTION_NEUTRAL, FACTION_SILICON, FACTION_TURRET) - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 3 light_power = 0.9 del_on_death = TRUE diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 7e3b0ab0c2ee9..7f13a1954ab84 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -79,13 +79,15 @@ cell = new /obj/item/stock_parts/cell/upgraded(src, 2000) - var/static/mulebot_count = 0 - mulebot_count += 1 - set_id(suffix || id || "#[mulebot_count]") - suffix = null AddElement(/datum/element/ridable, /datum/component/riding/creature/mulebot) diag_hud_set_mulebotcell() + set_id(suffix || assign_random_name()) + suffix = null + if(name == "\improper MULEbot") + name = "\improper MULEbot [id]" + set_home(loc) + /mob/living/simple_animal/bot/mulebot/Exited(atom/movable/gone, direction) . = ..() if(gone == load) @@ -138,6 +140,18 @@ /mob/living/simple_animal/bot/mulebot/proc/set_id(new_id) id = new_id +/mob/living/simple_animal/bot/mulebot/proc/set_home(turf/home_loc) + if(!istype(home_loc)) + CRASH("MULEbot [id] was requested to set a home location to [home_loc ? "an invalid home loc ([home_loc.type])" : "null"]") + + var/obj/machinery/navbeacon/home_beacon = locate() in home_loc + if(!isnull(home_beacon)) + home_destination = home_beacon.location + log_transport("[id]: MULEbot successfuly set home location to ID [home_destination] at [home_beacon.x], [home_beacon.y], [home_beacon.z]") + return + + log_transport("[id]: MULEbot failed to set home at [home_loc.x], [home_loc.y], [home_loc.z]") + /mob/living/simple_animal/bot/mulebot/bot_reset() ..() reached_target = FALSE @@ -322,19 +336,12 @@ if(new_dest) set_destination(new_dest) if("setid") - var/new_id - if(pda) - new_id = tgui_input_text(user, "Enter ID", "ID Assignment", id, MAX_NAME_LEN) - else - new_id = params["value"] + var/new_id = tgui_input_text(user, "Enter ID", "ID Assignment", id, MAX_NAME_LEN) if(new_id) set_id(new_id) + name = "\improper MULEbot [new_id]" if("sethome") - var/new_home - if(pda) - new_home = tgui_input_list(user, "Enter Home", "Mulebot Settings", GLOB.deliverybeacontags, home_destination) - else - new_home = params["value"] + var/new_home = tgui_input_list(user, "Enter Home", "Mulebot Settings", GLOB.deliverybeacontags, home_destination) if(new_home) home_destination = new_home if("unload") diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 582f51fb3aa9c..f99c649b50ec2 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -71,6 +71,11 @@ desc = "It's Officer Beepsky! Powered by a potato and a shot of whiskey, and with a sturdier reinforced chassis, too." health = 45 +/mob/living/simple_animal/bot/secbot/beepsky/officer/Initialize(mapload) + . = ..() + // Beepsky hates people scanning them + RegisterSignal(src, COMSIG_MOVABLE_SPY_STEALING, PROC_REF(retaliate_async)) + /mob/living/simple_animal/bot/secbot/beepsky/ofitser name = "Prison Ofitser" desc = "Powered by the tears and sweat of laborers." @@ -194,6 +199,11 @@ if("arrest_alert") security_mode_flags ^= SECBOT_DECLARE_ARRESTS +/mob/living/simple_animal/bot/secbot/proc/retaliate_async(datum/source, mob/user, ...) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, PROC_REF(retaliate), user) + /mob/living/simple_animal/bot/secbot/proc/retaliate(mob/living/carbon/human/attacking_human) var/judgement_criteria = judgement_criteria() threatlevel = attacking_human.assess_threat(judgement_criteria) diff --git a/code/modules/mob/living/simple_animal/bot/vibebot.dm b/code/modules/mob/living/simple_animal/bot/vibebot.dm index 5a876bd8eca2e..d0d550f77379a 100644 --- a/code/modules/mob/living/simple_animal/bot/vibebot.dm +++ b/code/modules/mob/living/simple_animal/bot/vibebot.dm @@ -9,7 +9,7 @@ health = 25 maxHealth = 25 pass_flags = PASSMOB | PASSFLAPS - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 7 light_power = 3 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index e256e4f292131..ac9031f59c33f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -165,7 +165,7 @@ icon_state = "at_shield2" layer = FLY_LAYER plane = ABOVE_GAME_PLANE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 2 duration = 8 var/target @@ -356,8 +356,7 @@ /obj/machinery/anomalous_crystal/theme_warp/Initialize(mapload) . = ..() - var/terrain_type = pick(subtypesof(/datum/dimension_theme)) - terrain_theme = new terrain_type() + terrain_theme = SSmaterials.dimensional_themes[pick(subtypesof(/datum/dimension_theme))] observer_desc = "This crystal changes the area around it to match the theme of \"[terrain_theme.name]\"." /obj/machinery/anomalous_crystal/theme_warp/ActivationReaction(mob/user, method) @@ -372,7 +371,7 @@ return TRUE /obj/machinery/anomalous_crystal/theme_warp/Destroy() - QDEL_NULL(terrain_theme) + terrain_theme = null converted_areas.Cut() return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm index 342713ee960a5..6632dedd2342b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm @@ -88,8 +88,8 @@ Difficulty: Hard /datum/action/innate/megafauna_attack/shockwave_scream name = "Shockwave Scream" - button_icon = 'icons/turf/walls/wall.dmi' - button_icon_state = "wall-0" + button_icon = 'icons/mob/actions/actions_animal.dmi' + button_icon_state = "expand" chosen_message = "You are now screeching, disorienting targets around you." chosen_attack_num = 3 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 9dcbc28420921..0085d0b2fb693 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1509,8 +1509,11 @@ /mob/proc/set_nutrition(change) //Seriously fuck you oldcoders. nutrition = max(0, change) +///Apply a proper movespeed modifier based on items we have equipped /mob/proc/update_equipment_speed_mods() - var/speedies = equipped_speed_mods() + var/speedies = 0 + for(var/obj/item/thing in get_equipped_speed_mod_items()) + speedies += thing.slowdown if(speedies > 0 && HAS_TRAIT(src, TRAIT_SETTLER)) //if our movespeed mod is in the negatives, we don't modify it since that's a benefit speedies *= 0.2 if(!speedies) @@ -1518,12 +1521,12 @@ else add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/equipment_speedmod, multiplicative_slowdown = speedies) -/// Gets the combined speed modification of all worn items -/// Except base mob type doesnt really wear items -/mob/proc/equipped_speed_mods() - for(var/obj/item/I in held_items) - if(I.item_flags & SLOWS_WHILE_IN_HAND) - . += I.slowdown +///Get all items in our possession that should affect our movespeed +/mob/proc/get_equipped_speed_mod_items() + . = list() + for(var/obj/item/thing in held_items) + if(thing.item_flags & SLOWS_WHILE_IN_HAND) + . += thing /mob/proc/set_stat(new_stat) if(new_stat == stat) @@ -1644,3 +1647,7 @@ set name = "View Skills" mind?.print_levels(src) + +/mob/key_down(key, client/client, full_key) + ..() + SEND_SIGNAL(src, COMSIG_MOB_KEYDOWN, key, client, full_key) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 245afb869323f..aaf654e6dba2b 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -200,4 +200,3 @@ var/active_typing_indicator ///the icon currently used for the thinking indicator's bubble var/active_thinking_indicator - diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 8c6ebe114965b..d2b8ce0f3c380 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -391,7 +391,7 @@ ///Can the mob hear /mob/proc/can_hear() - . = TRUE + return !HAS_TRAIT(src, TRAIT_DEAF) /** * Examine text for traits shared by multiple types. diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index b96f3aec6ca51..acf943b540ee3 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -47,8 +47,8 @@ /client/Move(new_loc, direct) if(world.time < move_delay) //do not move anything ahead of this check please return FALSE - next_move_dir_add = 0 - next_move_dir_sub = 0 + next_move_dir_add = NONE + next_move_dir_sub = NONE var/old_move_delay = move_delay move_delay = world.time + world.tick_lag //this is here because Move() can now be called mutiple times per tick if(!direct || !new_loc) @@ -76,7 +76,8 @@ return mob.remote_control.relaymove(mob, direct) if(isAI(mob)) - return AIMove(new_loc,direct,mob) + var/mob/living/silicon/ai/smoovin_ai = mob + return smoovin_ai.AIMove(direct) if(Process_Grab()) //are we restrained by someone's grip? return @@ -352,7 +353,7 @@ //bodypart selection verbs - Cyberboss //8: repeated presses toggles through head - eyes - mouth -//9: eyes 8: head 7: mouth +//7: mouth 8: head 9: eyes //4: r-arm 5: chest 6: l-arm //1: r-leg 2: groin 3: l-leg @@ -361,12 +362,12 @@ return mob && mob.hud_used && mob.hud_used.zone_select && istype(mob.hud_used.zone_select, /atom/movable/screen/zone_sel) /** - * Hidden verb to set the target zone of a mob to the head + * Hidden verbs to set desired body target zone * - * (bound to 8) - repeated presses toggles through head - eyes - mouth + * Uses numpad keys 1-9 */ -///Hidden verb to target the head, bound to 8 +///Hidden verb to cycle through head zone with repeated presses, head - eyes - mouth. Bound to 8 /client/verb/body_toggle_head() set name = "body-toggle-head" set hidden = TRUE @@ -386,6 +387,17 @@ var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(next_in_line, mob) +///Hidden verb to target the head, unbound by default. +/client/verb/body_head() + set name = "body-head" + set hidden = TRUE + + if(!check_has_body_select()) + return + + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select + selector.set_selected_zone(BODY_ZONE_HEAD, mob) + ///Hidden verb to target the eyes, bound to 7 /client/verb/body_eyes() set name = "body-eyes" @@ -525,7 +537,9 @@ else to_chat(src, span_warning("You are not Superman.")) return - + balloon_alert(src, "moving up...") + if(!do_after(src, 1 SECONDS)) + return if(zMove(UP, z_move_flags = ZMOVE_FLIGHT_FLAGS|ZMOVE_FEEDBACK|ventcrawling_flag)) to_chat(src, span_notice("You move upwards.")) @@ -549,7 +563,9 @@ return loc_atom.relaymove(src, DOWN) var/ventcrawling_flag = HAS_TRAIT(src, TRAIT_MOVE_VENTCRAWLING) ? ZMOVE_VENTCRAWLING : 0 - + balloon_alert(src, "moving down...") + if(!do_after(src, 1 SECONDS)) + return if(zMove(DOWN, z_move_flags = ZMOVE_FLIGHT_FLAGS|ZMOVE_FEEDBACK|ventcrawling_flag)) to_chat(src, span_notice("You move down.")) return FALSE diff --git a/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm b/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm index af5203cc39615..b9a89d0c6dd5c 100644 --- a/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm +++ b/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm @@ -11,6 +11,7 @@ flavour_text = "You are a venus human trap! Protect the kudzu at all costs, and feast on those who oppose you!" faction = list(FACTION_HOSTILE,FACTION_VINES,FACTION_PLANTS) spawner_job_path = /datum/job/venus_human_trap + invisibility = INVISIBILITY_ABSTRACT //The flower bud structure is our visible component, we just handle logic. /// Physical structure housing the spawner var/obj/structure/alien/resin/flower_bud/flower_bud /// Used to determine when to notify ghosts @@ -30,6 +31,10 @@ if(flower_bud.trait_flags & SPACEVINE_COLD_RESISTANT) spawned_human_trap.unsuitable_cold_damage = 0 +/obj/effect/mob_spawn/ghost_role/venus_human_trap/special(mob/living/spawned_mob, mob/mob_possessor) + . = ..() + spawned_mob.mind.add_antag_datum(/datum/antagonist/venus_human_trap) + /// Called when the attached flower bud has borne fruit (ie. is ready) /obj/effect/mob_spawn/ghost_role/venus_human_trap/proc/bear_fruit() ready = TRUE diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index fdbcf47d379df..8442783d33107 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -58,7 +58,7 @@ icon_state = "plasma-flower" desc = "A strange flower from the desolate wastes of lavaland. It pulses with a bright purple glow. \ Its shape is remarkably similar to that of a MOD core." - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_color = "#cc00cc" light_range = 2 diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm index d5c43497982a9..75a5b2385b7bf 100644 --- a/code/modules/mod/mod_core.dm +++ b/code/modules/mod/mod_core.dm @@ -367,7 +367,7 @@ icon_state = "mod-core-plasma-flower" desc = "A strange flower from the desolate wastes of lavaland. It pulses with a strange purple glow. \ The wires coming out of it could be hooked into a MODsuit." - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_color = "#cc00cc" light_range = 2 // Slightly better than the normal plasma core. diff --git a/code/modules/mod/mod_paint.dm b/code/modules/mod/mod_paint.dm index 320276cd00d44..240c0897b33a1 100644 --- a/code/modules/mod/mod_paint.dm +++ b/code/modules/mod/mod_paint.dm @@ -68,7 +68,7 @@ QDEL_NULL(proxy_view) current_color = COLOR_MATRIX_IDENTITY -/obj/item/mod/paint/ui_status(mob/user) +/obj/item/mod/paint/ui_status(mob/user, datum/ui_state/state) if(check_menu(editing_mod, user)) return ..() return UI_CLOSE diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index 4d8f8b4c6b703..81ef6ac0be17a 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -698,7 +698,7 @@ a few years out of date, leading to an overall lower capacity for modules." default_skin = "security" armor_type = /datum/armor/mod_theme_security - complexity_max = DEFAULT_MAX_COMPLEXITY - 3 + complexity_max = DEFAULT_MAX_COMPLEXITY - 2 slowdown_inactive = 1 slowdown_active = 0.5 allowed_suit_storage = list( @@ -1575,7 +1575,9 @@ anti-corrosion coated suit for high-ranking CentCom Officers, deploying pristine protective armor and \ advanced actuators, feeling practically weightless when turned on. Scraping the paint of this suit is \ counted as a war-crime and reason for immediate execution in over fifty Nanotrasen space stations. \ - The resemblance to a Gorlex Marauder helmet is purely coincidental." + The resemblance to a Gorlex Marauder helmet is purely coincidental. This is the newest V2 revision, which has \ + reflective reinforced-plasmaglass shielding weaved with advanced kevlar fibers. Sources say that some of the armor \ + is ripped straight from an Apocryphal MODsuit." default_skin = "corporate" armor_type = /datum/armor/mod_theme_corporate resistance_flags = FIRE_PROOF|ACID_PROOF @@ -1618,11 +1620,11 @@ ) /datum/armor/mod_theme_corporate - melee = 50 - bullet = 40 - laser = 50 + melee = 65 + bullet = 65 + laser = 55 energy = 50 - bomb = 50 + bomb = 60 bio = 100 fire = 100 acid = 100 diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 0933c7e8f185d..0659dd6208ba6 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -55,6 +55,7 @@ /obj/item/mod/module/flashlight, /obj/item/mod/module/tether, /obj/item/mod/module/magboot, + /obj/item/mod/module/headprotector, ) default_pins = list( /obj/item/mod/module/magboot, @@ -72,6 +73,7 @@ /obj/item/mod/module/magboot, /obj/item/mod/module/t_ray, /obj/item/mod/module/quick_carry, + /obj/item/mod/module/headprotector, ) default_pins = list( /obj/item/mod/module/magboot, @@ -87,6 +89,7 @@ /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, /obj/item/mod/module/jetpack, + /obj/item/mod/module/headprotector, ) default_pins = list( /obj/item/mod/module/magboot/advanced, @@ -153,6 +156,7 @@ /obj/item/mod/module/flashlight, /obj/item/mod/module/circuit, /obj/item/mod/module/t_ray, + /obj/item/mod/module/headprotector, ) /obj/item/mod/control/pre_equipped/security @@ -165,6 +169,7 @@ /obj/item/mod/module/criminalcapture, /obj/item/mod/module/dispenser/mirage, /obj/item/mod/module/quick_cuff, + /obj/item/mod/module/headprotector, ) /obj/item/mod/control/pre_equipped/safeguard @@ -179,6 +184,7 @@ /obj/item/mod/module/projectile_dampener, /obj/item/mod/module/pepper_shoulders, /obj/item/mod/module/quick_cuff, + /obj/item/mod/module/headprotector, ) default_pins = list( /obj/item/mod/module/jetpack, @@ -194,6 +200,7 @@ /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/pathfinder, /obj/item/mod/module/quick_cuff, + /obj/item/mod/module/headprotector, ) default_pins = list( /obj/item/mod/module/jetpack/advanced, diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index cf72f62d6c4a5..a35e39365b948 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -11,7 +11,7 @@ module_type = MODULE_TOGGLE active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 removable = FALSE - incompatible_modules = list(/obj/item/mod/module/armor_booster, /obj/item/mod/module/welding) + incompatible_modules = list(/obj/item/mod/module/armor_booster, /obj/item/mod/module/welding, /obj/item/mod/module/headprotector) cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_armorbooster_off" overlay_state_active = "module_armorbooster_on" @@ -26,6 +26,8 @@ var/list/armor_mod = /datum/armor/mod_module_armor_boost /// List of parts of the suit that are spaceproofed, for giving them back the pressure protection. var/list/spaceproofed = list() + /// List of traits added when the mod is activated + var/list/traits_to_add = list(TRAIT_HEAD_INJURY_BLOCKED) /datum/armor/mod_module_armor_boost melee = 25 @@ -50,6 +52,7 @@ actual_speed_added = max(0, min(mod.slowdown_active, speed_added)) mod.slowdown -= actual_speed_added mod.wearer.update_equipment_speed_mods() + mod.wearer.add_traits(traits_to_add, MOD_TRAIT) var/list/parts = mod.mod_parts + mod for(var/obj/item/part as anything in parts) part.set_armor(part.get_armor().add_other_armor(armor_mod)) @@ -69,6 +72,7 @@ balloon_alert(mod.wearer, "armor retracts, EVA ready") mod.slowdown += actual_speed_added mod.wearer.update_equipment_speed_mods() + mod.wearer.remove_traits(traits_to_add, MOD_TRAIT) var/list/parts = mod.mod_parts + mod for(var/obj/item/part as anything in parts) part.set_armor(part.get_armor().subtract_other_armor(armor_mod)) @@ -483,12 +487,15 @@ /obj/item/mod/module/infiltrator name = "MOD infiltration core programs module" desc = "The primary stealth systems operating within the suit. Utilizing electromagnetic signals, \ - the wearer simply cannot be observed closely, or heard clearly by those around them." + the wearer simply cannot be observed closely, or heard clearly by those around them.\ + It also contains some dampening systems to help protect a user from blows to the head." icon_state = "infiltrator" complexity = 0 removable = FALSE idle_power_cost = DEFAULT_CHARGE_DRAIN * 0 - incompatible_modules = list(/obj/item/mod/module/infiltrator, /obj/item/mod/module/armor_booster, /obj/item/mod/module/welding) + incompatible_modules = list(/obj/item/mod/module/infiltrator, /obj/item/mod/module/armor_booster, /obj/item/mod/module/welding, /obj/item/mod/module/headprotector) + /// List of traits added when the suit is activated + var/list/traits_to_add = list(TRAIT_SILENT_FOOTSTEPS, TRAIT_UNKNOWN, TRAIT_HEAD_INJURY_BLOCKED) /obj/item/mod/module/infiltrator/on_install() mod.item_flags |= EXAMINE_SKIP @@ -497,11 +504,11 @@ mod.item_flags &= ~EXAMINE_SKIP /obj/item/mod/module/infiltrator/on_suit_activation() - mod.wearer.add_traits(list(TRAIT_SILENT_FOOTSTEPS, TRAIT_UNKNOWN), MOD_TRAIT) + mod.wearer.add_traits(traits_to_add, MOD_TRAIT) mod.helmet.flash_protect = FLASH_PROTECTION_WELDER /obj/item/mod/module/infiltrator/on_suit_deactivation(deleting = FALSE) - mod.wearer.remove_traits(list(TRAIT_SILENT_FOOTSTEPS, TRAIT_UNKNOWN), MOD_TRAIT) + mod.wearer.remove_traits(traits_to_add, MOD_TRAIT) if(deleting) return mod.helmet.flash_protect = initial(mod.helmet.flash_protect) diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index 9095bbd2c2467..fa746048e8201 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -204,6 +204,24 @@ rcd_scan(src, fade_time = 10 SECONDS) drain_power(use_power_cost) +///Safety-First Head Protection - Protects your brain matter from sudden impacts. +/obj/item/mod/module/headprotector + name = "MOD Safety-First Head Protection module" + desc = "A series of dampening plates are installed along the back and upper areas of \ + the helmet. These plates absorb abrupt kinetic shocks delivered to the skull. \ + The bulk of this module prevents it from being installed in any suit that is capable \ + of combat armor adjustments. However, the rudimentry nature of the module makes it \ + relatively easy to install into most other suits." + icon_state = "welding" + complexity = 1 + incompatible_modules = list(/obj/item/mod/module/armor_booster, /obj/item/mod/module/infiltrator) + +/obj/item/mod/module/constructor/on_suit_activation() + ADD_TRAIT(mod.wearer, TRAIT_HEAD_INJURY_BLOCKED, MOD_TRAIT) + +/obj/item/mod/module/constructor/on_suit_deactivation(deleting = FALSE) + REMOVE_TRAIT(mod.wearer, TRAIT_HEAD_INJURY_BLOCKED, MOD_TRAIT) + ///Mister - Sprays water over an area. /obj/item/mod/module/mister name = "MOD water mister module" diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 354d5564b10e4..9962bc8b9a44d 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -365,7 +365,7 @@ incompatible_modules = list(/obj/item/mod/module/flashlight) cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_light" - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_color = COLOR_WHITE light_range = 4 light_power = 1 diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index fddec2ef13d6c..f5033cea4f67e 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -579,7 +579,7 @@ #undef STORMTROOPER_MODE #undef SHARPSHOOTER_MODE -/obj/item/mod/module/anti_stagger +/obj/item/mod/module/shove_blocker name = "MOD bulwark module" desc = "Layers upon layers of shock dampening plates, just to stop you from getting shoved into a wall by an angry mob." icon_state = "bulwark" @@ -587,10 +587,10 @@ incompatible_modules = list(/obj/item/mod/module/shove_blocker) /obj/item/mod/module/shove_blocker/on_suit_activation() - mod.wearer.add_traits(list(TRAIT_SHOVE_KNOCKDOWN_BLOCKED, TRAIT_NO_STAGGER, TRAIT_NO_THROW_HITPUSH), MOD_TRAIT) + mod.wearer.add_traits(list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, TRAIT_NO_STAGGER, TRAIT_NO_THROW_HITPUSH), MOD_TRAIT) /obj/item/mod/module/shove_blocker/on_suit_deactivation(deleting = FALSE) - mod.wearer.remove_traits(list(TRAIT_SHOVE_KNOCKDOWN_BLOCKED, TRAIT_NO_STAGGER, TRAIT_NO_THROW_HITPUSH), MOD_TRAIT) + mod.wearer.remove_traits(list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, TRAIT_NO_STAGGER, TRAIT_NO_THROW_HITPUSH), MOD_TRAIT) /obj/item/mod/module/shove_blocker/locked name = "superglued MOD bulwark module" diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index 5381a26e88bd4..e6e4a01c66475 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -70,13 +70,13 @@ /obj/item/mod/module/waddle/on_suit_activation() mod.boots.AddComponent(/datum/component/squeak, list('sound/effects/footstep/clownstep1.ogg'=1,'sound/effects/footstep/clownstep2.ogg'=1), 50, falloff_exponent = 20) //die off quick please - mod.wearer.AddElement(/datum/element/waddling) + mod.wearer.AddElementTrait(TRAIT_WADDLING, MOD_TRAIT, /datum/element/waddling) if(is_clown_job(mod.wearer.mind?.assigned_role)) mod.wearer.add_mood_event("clownshoes", /datum/mood_event/clownshoes) /obj/item/mod/module/waddle/on_suit_deactivation(deleting = FALSE) if(!deleting) qdel(mod.boots.GetComponent(/datum/component/squeak)) - mod.wearer.RemoveElement(/datum/element/waddling) + REMOVE_TRAIT(mod.wearer, TRAIT_WADDLING, MOD_TRAIT) if(is_clown_job(mod.wearer.mind?.assigned_role)) mod.wearer.clear_mood_event("clownshoes") diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 999502db795d0..e897bcba179b2 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -568,7 +568,7 @@ range = 6 suppressed = SUPPRESSED_VERY armor_flag = BOMB - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 light_power = 1 light_color = COLOR_LIGHT_ORANGE @@ -590,7 +590,7 @@ icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' anchored = TRUE resistance_flags = FIRE_PROOF|LAVA_PROOF - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 light_power = 1 light_color = COLOR_LIGHT_ORANGE diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index d9bad0fea1c4c..5f718ef04f03c 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -10,7 +10,7 @@ integrity_failure = 0.5 max_integrity = 100 armor_type = /datum/armor/item_modular_computer - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL ///The ID currently stored in the computer. var/obj/item/card/id/computer_id_slot diff --git a/code/modules/modular_computers/computers/item/disks/virus_disk.dm b/code/modules/modular_computers/computers/item/disks/virus_disk.dm index e3eac7736f504..3f646b22d8a06 100644 --- a/code/modules/modular_computers/computers/item/disks/virus_disk.dm +++ b/code/modules/modular_computers/computers/item/disks/virus_disk.dm @@ -154,7 +154,7 @@ hidden_uplink.uplink_handler.generate_objectives() SStraitor.register_uplink_handler(hidden_uplink.uplink_handler) else - hidden_uplink.add_telecrystals(telecrystals) + hidden_uplink.uplink_handler.add_telecrystals(telecrystals) telecrystals = 0 hidden_uplink.locked = FALSE hidden_uplink.active = TRUE diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm index 9e81bb2759215..674520f1fb211 100644 --- a/code/modules/modular_computers/computers/item/pda.dm +++ b/code/modules/modular_computers/computers/item/pda.dm @@ -13,7 +13,7 @@ steel_sheet_cost = 2 custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass=SMALL_MATERIAL_AMOUNT, /datum/material/plastic=SMALL_MATERIAL_AMOUNT) - interaction_flags_atom = INTERACT_ATOM_ALLOW_USER_LOCATION | INTERACT_ATOM_IGNORE_MOBILITY + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_ALLOW_USER_LOCATION | INTERACT_ATOM_IGNORE_MOBILITY icon_state_menu = "menu" max_capacity = 64 @@ -285,6 +285,7 @@ starting_programs = list( /datum/computer_file/program/contract_uplink, + /datum/computer_file/program/secureye/syndicate, ) /** diff --git a/code/modules/modular_computers/computers/item/role_tablet_presets.dm b/code/modules/modular_computers/computers/item/role_tablet_presets.dm index 904b9fc9837cd..205c6a0c422e5 100644 --- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm @@ -429,6 +429,17 @@ /datum/computer_file/program/status, ) +/obj/item/modular_computer/pda/veteran_advisor + name = "security advisor PDA" + greyscale_colors = "#EA3232#FFD700" + inserted_item = /obj/item/pen/fountain + starting_programs = list( + /datum/computer_file/program/records/security, + /datum/computer_file/program/crew_manifest, + /datum/computer_file/program/coupon, //veteran discount + /datum/computer_file/program/skill_tracker, + ) + /** * Non-roles */ diff --git a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm index 2f3898fa3f7df..5fbf6e3d796a8 100644 --- a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm +++ b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm @@ -714,6 +714,8 @@ var/photo_message = signal.data["photo"] ? " (Photo Attached)" : "" to_chat(messaged_mob, span_infoplain("[icon2html(computer, messaged_mob)] PDA message from [sender_title], \"[inbound_message]\"[photo_message] [reply]")) + SEND_SIGNAL(computer, COMSIG_COMPUTER_RECIEVED_MESSAGE, sender_title, inbound_message, photo_message) + if (alert_able && (!alert_silenced || is_rigged)) computer.ring(ringtone) diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm index b506777f3de7a..34771cde63b20 100644 --- a/code/modules/modular_computers/file_system/programs/radar.dm +++ b/code/modules/modular_computers/file_system/programs/radar.dm @@ -149,16 +149,13 @@ return RADAR_NOT_TRACKABLE var/turf/here = get_turf(computer) var/turf/there = get_turf(signal) - if(!here || !there) - return RADAR_NOT_TRACKABLE //I was still getting a runtime even after the above check while scanning, so fuck it - if(there.z != here.z && (!is_station_level(here.z) || !is_station_level(there.z))) + if(isnull(here) || isnull(there) || !is_valid_z_level(here, there)) return RADAR_NOT_TRACKABLE var/trackable_signal = SEND_SIGNAL(computer, COMSIG_MODULAR_COMPUTER_RADAR_TRACKABLE, signal, here, there) - switch(trackable_signal) - if(COMPONENT_RADAR_TRACK_ANYWAY) - return RADAR_TRACKABLE_ANYWAY - if(COMPONENT_RADAR_DONT_TRACK) - return RADAR_NOT_TRACKABLE + if(trackable_signal & COMPONENT_RADAR_TRACK_ANYWAY) + return RADAR_TRACKABLE_ANYWAY + if(trackable_signal & COMPONENT_RADAR_DONT_TRACK) + return RADAR_NOT_TRACKABLE return RADAR_TRACKABLE /** @@ -268,15 +265,16 @@ /datum/computer_file/program/radar/lifeline/trackable(mob/living/carbon/human/humanoid) . = ..() - if(. == RADAR_TRACKABLE_ANYWAY) - return RADAR_TRACKABLE_ANYWAY - if(!humanoid || !istype(humanoid)) + if(. != RADAR_TRACKABLE) + return . + if(!istype(humanoid)) return RADAR_NOT_TRACKABLE if(!istype(humanoid.w_uniform, /obj/item/clothing/under)) return RADAR_NOT_TRACKABLE var/obj/item/clothing/under/uniform = humanoid.w_uniform - if(uniform.has_sensor && uniform.sensor_mode >= SENSOR_COORDS) // Suit sensors must be on maximum - return RADAR_TRACKABLE + if(!uniform.has_sensor || uniform.sensor_mode < SENSOR_COORDS) // Suit sensors must be on maximum + return RADAR_NOT_TRACKABLE + return . ///Tracks all janitor equipment /datum/computer_file/program/radar/custodial_locator diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm index 00bd00f3e67b5..68f7ba3ddef05 100644 --- a/code/modules/modular_computers/file_system/programs/robocontrol.dm +++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm @@ -49,6 +49,7 @@ var/mob/living/simple_animal/bot/mulebot/simple_mulebot = simple_bot mulelist += list(list( "name" = simple_mulebot.name, + "id" = simple_mulebot.id, "dest" = simple_mulebot.destination, "power" = simple_mulebot.cell ? simple_mulebot.cell.percent() : 0, "home" = simple_mulebot.home_destination, @@ -56,9 +57,8 @@ "autoPickup" = simple_mulebot.auto_pickup, "reportDelivery" = simple_mulebot.report_delivery, "mule_ref" = REF(simple_mulebot), + "load" = simple_mulebot.get_load_name(), )) - if(simple_mulebot.load) - data["load"] = simple_mulebot.load.name newbot["mule_check"] = TRUE botlist += list(newbot) diff --git a/code/modules/modular_computers/file_system/programs/secureye.dm b/code/modules/modular_computers/file_system/programs/secureye.dm index c9e4fc087f364..8eb3190afa589 100644 --- a/code/modules/modular_computers/file_system/programs/secureye.dm +++ b/code/modules/modular_computers/file_system/programs/secureye.dm @@ -61,7 +61,6 @@ cam_background = new cam_background.assigned_map = map_name cam_background.del_on_map_removal = FALSE - RegisterSignal(src, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) /datum/computer_file/program/secureye/Destroy() QDEL_NULL(cam_screen) @@ -89,7 +88,7 @@ cam_screen.display_to(user) user.client.register_map_obj(cam_background) -/datum/computer_file/program/secureye/ui_status(mob/user) +/datum/computer_file/program/secureye/ui_status(mob/user, datum/ui_state/state) . = ..() if(. == UI_DISABLED) return UI_CLOSE @@ -138,8 +137,8 @@ playsound(computer, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) if(isnull(camera_ref)) return TRUE - if(internal_tracker && internal_tracker.tracking) - internal_tracker.set_tracking(FALSE) + if(internal_tracker) + internal_tracker.reset_tracking() update_active_camera_screen() return TRUE @@ -147,7 +146,8 @@ if("start_tracking") if(!internal_tracker) internal_tracker = new(src) - internal_tracker.set_tracked_mob(usr) + RegisterSignal(internal_tracker, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) + internal_tracker.track_input(usr) return TRUE /datum/computer_file/program/secureye/proc/on_track_target(datum/trackable/source, mob/living/target) @@ -169,8 +169,8 @@ /datum/computer_file/program/secureye/ui_close(mob/user) . = ..() //don't track anyone while we're shutting off. - if(internal_tracker && internal_tracker.tracking) - internal_tracker.set_tracking(FALSE) + if(internal_tracker) + internal_tracker.reset_tracking() var/user_ref = REF(user) var/is_living = isliving(user) // Living creature or not, we remove you anyway. diff --git a/code/modules/modular_computers/file_system/programs/virtual_pet.dm b/code/modules/modular_computers/file_system/programs/virtual_pet.dm new file mode 100644 index 0000000000000..1d3196789ca87 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/virtual_pet.dm @@ -0,0 +1,568 @@ +GLOBAL_LIST_EMPTY(global_pet_updates) +GLOBAL_LIST_EMPTY(virtual_pets_list) + +#define MAX_UPDATE_LENGTH 50 +#define PET_MAX_LEVEL 3 +#define PET_MAX_STEPS_RECORD 50000 +#define PET_EAT_BONUS 500 +#define PET_CLEAN_BONUS 250 +#define PET_PLAYMATE_BONUS 500 +#define PET_STATE_HUNGRY "hungry" +#define PET_STATE_ASLEEP "asleep" +#define PET_STATE_HAPPY "happy" +#define PET_STATE_NEUTRAL "neutral" + +/datum/computer_file/program/virtual_pet + filename = "virtualpet" + filedesc = "Virtual Pet" + downloader_category = PROGRAM_CATEGORY_GAMES + extended_desc = "Download your very own Orbie today!" + program_flags = PROGRAM_ON_NTNET_STORE + size = 3 + tgui_id = "NtosVirtualPet" + program_icon = "paw" + can_run_on_flags = PROGRAM_PDA + detomatix_resistance = DETOMATIX_RESIST_MALUS + ///how many steps have we walked + var/steps_counter = 0 + ///the pet hologram + var/mob/living/pet + ///the type of our pet + var/pet_type = /mob/living/basic/orbie + ///our current happiness + var/happiness = 0 + ///our max happiness + var/max_happiness = 1750 + ///our current level + var/level = 1 + ///required exp to get to next level + var/to_next_level = 1000 + ///how much exp we currently have + var/current_level_progress = 0 + ///our current hunger + var/hunger = 0 + ///maximum hunger threshold + var/max_hunger = 500 + ///pet icon for each state + var/static/list/pet_state_icons = list( + PET_STATE_HUNGRY = list("icon" = 'icons/ui_icons/virtualpet/pet_state.dmi', "icon_state" = "pet_hungry"), + PET_STATE_HAPPY = list("icon" = 'icons/ui_icons/virtualpet/pet_state.dmi', "icon_state" = "pet_happy"), + PET_STATE_ASLEEP = list("icon" = 'icons/ui_icons/virtualpet/pet_state.dmi', "icon_state" = "pet_asleep"), + PET_STATE_NEUTRAL = list("icon" = 'icons/ui_icons/virtualpet/pet_state.dmi', "icon_state" = "pet_neutral"), + ) + ///hat options and what level they will be unlocked at + var/static/list/hat_selections = list( + /obj/item/clothing/head/hats/tophat = 1, + /obj/item/clothing/head/fedora = 1, + /obj/item/clothing/head/hats/bowler = 2, + /obj/item/clothing/head/hats/warden/police = 2, + /obj/item/clothing/head/hats/warden/red = 3, + /obj/item/clothing/head/hats/caphat = 3, + ) + ///hologram hat we have selected for our pet + var/list/selected_hat = list() + ///area we have picked as dropoff location for petfeed + var/area/selected_area + ///manage hat offsets for when we turn directions + var/static/list/hat_offsets = list( + "west" = list(0,1), + "east" = list(0,1), + "north" = list(1,1), + "south" = list(0,1), + ) + ///possible colors our pet can have + var/static/list/possible_colors= list( + "white" = null, //default color state + "light blue" = "#c3ecf3", + "light green" = "#b1ffe8", + ) + ///areas we wont drop the chocolate in + var/static/list/restricted_areas = typecacheof(list( + /area/station/security, + /area/station/command, + /area/station/ai_monitored, + /area/station/maintenance, + /area/station/solars, + )) + ///our profile picture + var/icon/profile_picture + ///cooldown till we can reroll the pet feed dropzone + COOLDOWN_DECLARE(area_reroll) + ///cooldown till our pet gains happiness again from being cleaned + COOLDOWN_DECLARE(on_clean_cooldown) + ///cooldown till we can release/recall our pet + COOLDOWN_DECLARE(summon_cooldown) + ///cooldown till we can alter our pet's appearance again + COOLDOWN_DECLARE(alter_appearance_cooldown) + +/datum/computer_file/program/virtual_pet/on_install() + . = ..() + profile_picture = getFlatIcon(image(icon = 'icons/ui_icons/virtualpet/pet_state.dmi', icon_state = "pet_preview")) + GLOB.virtual_pets_list += src + pet = new pet_type(computer) + pet.forceMove(computer) + pet.AddComponent(/datum/component/leash, computer, 9, force_teleport_out_effect = /obj/effect/temp_visual/guardian/phase/out) + RegisterSignal(pet, COMSIG_QDELETING, PROC_REF(remove_pet)) + RegisterSignal(pet, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_overlays_updated)) //hologramic hat management + RegisterSignal(pet, COMSIG_ATOM_DIR_CHANGE, PROC_REF(on_change_dir)) + RegisterSignal(pet, COMSIG_MOVABLE_MOVED, PROC_REF(after_pet_move)) + RegisterSignal(pet, COMSIG_MOB_ATE, PROC_REF(after_pet_eat)) // WE ATEEE + RegisterSignal(pet, COMSIG_ATOM_PRE_CLEAN, PROC_REF(pet_pre_clean)) + RegisterSignal(pet, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + RegisterSignal(pet, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(post_cleaned)) + RegisterSignal(pet, COMSIG_AI_BLACKBOARD_KEY_SET(BB_NEARBY_PLAYMATE), PROC_REF(on_playmate_find)) + RegisterSignal(computer, COMSIG_ATOM_ENTERED, PROC_REF(on_pet_entered)) + RegisterSignal(computer, COMSIG_ATOM_EXITED, PROC_REF(on_pet_exit)) + +/datum/computer_file/program/virtual_pet/Destroy() + GLOB.virtual_pets_list -= src + if(!QDELETED(pet)) + QDEL_NULL(pet) + STOP_PROCESSING(SSprocessing, src) + return ..() + +/datum/computer_file/program/virtual_pet/proc/on_death(datum/source) + SIGNAL_HANDLER + + pet.forceMove(computer) + + +/datum/computer_file/program/virtual_pet/proc/on_message_recieve(datum/source, sender_title, inbound_message, photo_message) + SIGNAL_HANDLER + + var/message_to_display = "[sender_title] has sent you a message [photo_message ? "with a photo attached" : ""]: [inbound_message]!" + pet.ai_controller?.set_blackboard_key(BB_LAST_RECIEVED_MESSAGE, message_to_display) + +/datum/computer_file/program/virtual_pet/proc/pet_pre_clean(atom/source, mob/user) + SIGNAL_HANDLER + + if(!COOLDOWN_FINISHED(src, on_clean_cooldown)) + source.balloon_alert(user, "already clean!") + return COMSIG_ATOM_CANCEL_CLEAN + +/datum/computer_file/program/virtual_pet/proc/on_playmate_find(datum/source) + SIGNAL_HANDLER + + happiness = min(happiness + PET_PLAYMATE_BONUS, max_happiness) + START_PROCESSING(SSprocessing, src) + +/datum/computer_file/program/virtual_pet/proc/post_cleaned(mob/source, mob/user) + SIGNAL_HANDLER + + source.spin(spintime = 2 SECONDS, speed = 1) //celebrate! + happiness = min(happiness + PET_CLEAN_BONUS, max_happiness) + COOLDOWN_START(src, on_clean_cooldown, 1 MINUTES) + START_PROCESSING(SSprocessing, src) + +///manage the pet's hat offsets when he changes direction +/datum/computer_file/program/virtual_pet/proc/on_change_dir(datum/source, old_dir, new_dir) + SIGNAL_HANDLER + + if(!length(selected_hat)) + return + set_hat_offsets(new_dir) + +/datum/computer_file/program/virtual_pet/proc/on_photo_captured(datum/source, atom/target, atom/user, datum/picture/photo) + SIGNAL_HANDLER + + if(isnull(photo)) + return + computer.store_file(new /datum/computer_file/picture(photo)) + +/datum/computer_file/program/virtual_pet/proc/set_hat_offsets(new_dir) + var/direction_text = dir2text(new_dir) + var/list/offsets_list = hat_offsets[direction_text] + if(isnull(offsets_list)) + return + var/mutable_appearance/hat_appearance = selected_hat["appearance"] + hat_appearance.pixel_x = offsets_list[1] + hat_appearance.pixel_y = offsets_list[2] + pet.update_appearance(UPDATE_OVERLAYS) + +///give our pet his hologram hat +/datum/computer_file/program/virtual_pet/proc/on_overlays_updated(atom/source, list/overlays) + SIGNAL_HANDLER + + if(!length(selected_hat)) + return + overlays += selected_hat["appearance"] + +/datum/computer_file/program/virtual_pet/proc/alter_profile_picture() + var/image/pet_preview = image(icon = 'icons/ui_icons/virtualpet/pet_state.dmi', icon_state = "pet_preview") + if(LAZYACCESS(pet.atom_colours, FIXED_COLOUR_PRIORITY)) + pet_preview.color = pet.atom_colours[FIXED_COLOUR_PRIORITY] + + if(length(selected_hat)) + var/mutable_appearance/our_selected_hat = selected_hat["appearance"] + var/mutable_appearance/hat_preview = mutable_appearance(our_selected_hat.icon, our_selected_hat.icon_state) + hat_preview.pixel_y = -9 + pet_preview.add_overlay(hat_preview) + + profile_picture = getFlatIcon(pet_preview) + COOLDOWN_START(src, alter_appearance_cooldown, 10 SECONDS) + + +///decrease the pet's hunger after it eats +/datum/computer_file/program/virtual_pet/proc/after_pet_eat(datum/source) + SIGNAL_HANDLER + + hunger = min(hunger + PET_EAT_BONUS, max_hunger) + happiness = min(happiness + PET_EAT_BONUS, max_happiness) + START_PROCESSING(SSprocessing, src) + +///start processing if we enter the pda and need healing +/datum/computer_file/program/virtual_pet/proc/on_pet_entered(atom/movable/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) + SIGNAL_HANDLER + + if(arrived != pet) + return + ADD_TRAIT(pet, TRAIT_AI_PAUSED, REF(src)) + if((datum_flags & DF_ISPROCESSING)) + return + if(pet.health < pet.maxHealth) //if we're in the pda, heal up + START_PROCESSING(SSprocessing, src) + +/datum/computer_file/program/virtual_pet/proc/on_pet_exit(atom/movable/source, atom/movable/exited) + SIGNAL_HANDLER + + if(exited != pet) + return + REMOVE_TRAIT(pet, TRAIT_AI_PAUSED, REF(src)) + if((datum_flags & DF_ISPROCESSING)) + return + if(hunger > 0 || happiness > 0) //if were outside the pda, we become hungry and happiness decreases + START_PROCESSING(SSprocessing, src) + +/datum/computer_file/program/virtual_pet/process() + if(pet.loc == computer) + if(pet.health >= pet.maxHealth) + return PROCESS_KILL + if(pet.stat == DEAD) + pet.revive(ADMIN_HEAL_ALL) + pet.heal_overall_damage(5) + return + + if(hunger > 0) + hunger-- + + if(happiness > 0) + happiness-- + + if(hunger <=0 && happiness <= 0) + return PROCESS_KILL + +/datum/computer_file/program/virtual_pet/proc/after_pet_move(atom/movable/movable, atom/old_loc) + SIGNAL_HANDLER + + if(!isturf(pet.loc) || !isturf(old_loc)) + return + steps_counter = min(steps_counter + 1, PET_MAX_STEPS_RECORD) + increment_exp() + if(steps_counter % 2000 == 0) //every 2000 steps, announce the milestone to the world! + announce_global_updates(message = "has walked [steps_counter] steps!") + +/datum/computer_file/program/virtual_pet/proc/increment_exp() + var/modifier = 1 + var/hunger_happiness = hunger + happiness + var/max_hunger_happiness = max_hunger + max_happiness + + switch(hunger_happiness / max_hunger_happiness) + if(0.8 to 1) + modifier = 3 + if(0.5 to 0.8) + modifier = 2 + + current_level_progress = min(current_level_progress + modifier, to_next_level) + if(current_level_progress >= to_next_level) + handle_level_up() + +/datum/computer_file/program/virtual_pet/proc/handle_level_up() + current_level_progress = 0 + level++ + grant_level_abilities() + pet.ai_controller?.set_blackboard_key(BB_VIRTUAL_PET_LEVEL, level) + playsound(computer.loc, 'sound/items/orbie_level_up.ogg', 50) + to_next_level += (level**2) + 500 + SEND_SIGNAL(pet, COMSIG_VIRTUAL_PET_LEVEL_UP, level) //its a signal so different path types of virtual pets can handle leveling up differently + announce_global_updates(message = "has reached level [level]!") + +/datum/computer_file/program/virtual_pet/proc/grant_level_abilities() + switch(level) + if(2) + RegisterSignal(computer, COMSIG_COMPUTER_RECIEVED_MESSAGE, PROC_REF(on_message_recieve)) // we will now read out PDA messages + var/datum/action/cooldown/mob_cooldown/lights/lights = new(pet) + lights.Grant(pet) + pet.ai_controller?.set_blackboard_key(BB_LIGHTS_ABILITY, lights) + if(3) + var/datum/action/cooldown/mob_cooldown/capture_photo/photo_ability = new(pet) + photo_ability.Grant(pet) + pet.ai_controller?.set_blackboard_key(BB_PHOTO_ABILITY, photo_ability) + RegisterSignal(photo_ability.ability_camera, COMSIG_CAMERA_IMAGE_CAPTURED, PROC_REF(on_photo_captured)) + +/datum/computer_file/program/virtual_pet/proc/announce_global_updates(message) + if(isnull(message)) + return + var/list/message_to_announce = list( + "name" = pet.name, + "pet_picture" = icon2base64(profile_picture), + "message" = message, + "likers" = list(REF(src)) + ) + if(length(GLOB.global_pet_updates) >= MAX_UPDATE_LENGTH) + GLOB.global_pet_updates.Cut(1,2) + + GLOB.global_pet_updates += list(message_to_announce) + playsound(computer.loc, 'sound/items/orbie_notification_sound.ogg', 50) + +/datum/computer_file/program/virtual_pet/proc/remove_pet(datum/source) + SIGNAL_HANDLER + pet = null + if(QDELETED(src)) + return + computer.remove_file(src) //all is lost we no longer have a reason to exist + +/datum/computer_file/program/virtual_pet/kill_program(mob/user) + if(pet && pet.loc != computer) + pet.forceMove(computer) //recall the hologram back to the pda + STOP_PROCESSING(SSprocessing, src) + return ..() + +/datum/computer_file/program/virtual_pet/proc/get_pet_state() + if(isnull(pet)) + return + + if(pet.loc == computer) + return PET_STATE_ASLEEP + + if(happiness/max_happiness > 0.8) + return PET_STATE_HAPPY + + if(hunger/max_hunger < 0.5) + return PET_STATE_HUNGRY + + return PET_STATE_NEUTRAL + +/datum/computer_file/program/virtual_pet/ui_data(mob/user) + var/list/data = list() + data["currently_summoned"] = (pet.loc != computer) + data["selected_area"] = (selected_area ? selected_area.name : "No location set") + data["pet_state"] = get_pet_state() + data["hunger"] = hunger + data["maximum_hunger"] = max_hunger + data["pet_hat"] = (length(selected_hat) ? selected_hat["name"] : "none") + data["can_reroll"] = COOLDOWN_FINISHED(src, area_reroll) + data["can_summon"] = COOLDOWN_FINISHED(src, summon_cooldown) + data["can_alter_appearance"] = COOLDOWN_FINISHED(src, alter_appearance_cooldown) + data["pet_name"] = pet.name + data["steps_counter"] = steps_counter + data["in_dropzone"] = (istype(get_area(computer), selected_area)) + data["pet_area"] = (pet.loc != computer ? get_area_name(pet) : "Sleeping in PDA") + data["current_exp"] = current_level_progress + data["required_exp"] = to_next_level + data["happiness"] = happiness + data["maximum_happiness"] = max_happiness + data["level"] = level + data["pet_color"] = "" + + var/color_value = LAZYACCESS(pet.atom_colours, FIXED_COLOUR_PRIORITY) + for(var/index in possible_colors) + if(possible_colors[index] == color_value) + data["pet_color"] = index + break + + data["pet_gender"] = pet.gender + + data["pet_updates"] = list() + + for(var/i in length(GLOB.global_pet_updates) to 1 step -1) + var/list/update = GLOB.global_pet_updates[i] + + if(isnull(update)) + continue + + data["pet_updates"] += list(list( + "update_id" = i, + "update_name" = update["name"], + "update_picture" = update["pet_picture"], + "update_message" = update["message"], + "update_likers" = length(update["likers"]), + "update_already_liked" = ((REF(src)) in update["likers"]), + )) + + data["all_pets"] = list() + for(var/datum/computer_file/program/virtual_pet/program as anything in GLOB.virtual_pets_list) + data["all_pets"] += list(list( + "other_pet_name" = program.pet.name, + "other_pet_picture" = icon2base64(program.profile_picture), + )) + return data + +/datum/computer_file/program/virtual_pet/ui_static_data(mob/user) + var/list/data = list() + data["pet_state_icons"] = list() + for(var/list_index as anything in pet_state_icons) + var/list/sprite_location = pet_state_icons[list_index] + data["pet_state_icons"] += list(list( + "name" = list_index, + "icon" = icon2base64(getFlatIcon(image(icon = sprite_location["icon"], icon_state = sprite_location["icon_state"]), no_anim=TRUE)) + )) + + data["hat_selections"] = list(list( + "hat_id" = null, + "hat_name" = "none", + )) + + for(var/type_index as anything in hat_selections) + if(level >= hat_selections[type_index]) + var/obj/item/hat = type_index + data["hat_selections"] += list(list( + "hat_id" = type_index, + "hat_name" = initial(hat.name), + )) + + data["possible_colors"] = list() + for(var/color in possible_colors) + data["possible_colors"] += list(list( + "color_name" = color, + "color_value" = possible_colors[color], + )) + + var/static/list/possible_emotes = list( + /datum/emote/flip, + /datum/emote/living/jump, + /datum/emote/living/shiver, + /datum/emote/spin, + /datum/emote/living/beep, + ) + data["possible_emotes"] = list("none") + for(var/datum/emote/target_emote as anything in possible_emotes) + data["possible_emotes"] += target_emote.key + + data["preview_icon"] = icon2base64(profile_picture) + return data + +/datum/computer_file/program/virtual_pet/ui_act(action, params, datum/tgui/ui) + . = ..() + switch(action) + + if("summon_pet") + if(!COOLDOWN_FINISHED(src, summon_cooldown)) + return TRUE + if(pet.loc == computer) + release_pet(ui.user) + else + recall_pet() + COOLDOWN_START(src, summon_cooldown, 10 SECONDS) + + if("apply_customization") + if(!COOLDOWN_FINISHED(src, alter_appearance_cooldown)) + return TRUE + var/obj/item/chosen_type = text2path(params["chosen_hat"]) + if(isnull(chosen_type)) + selected_hat.Cut() + + else if((chosen_type in hat_selections)) + selected_hat["name"] = initial(chosen_type.name) + var/mutable_appearance/selected_hat_appearance = mutable_appearance(icon = initial(chosen_type.worn_icon), icon_state = initial(chosen_type.icon_state), layer = ABOVE_ALL_MOB_LAYER) + selected_hat_appearance.transform = selected_hat_appearance.transform.Scale(0.8, 1) + selected_hat["appearance"] = selected_hat_appearance + set_hat_offsets(pet.dir) + + var/chosen_color = params["chosen_color"] + if(isnull(chosen_color)) + pet.remove_atom_colour(FIXED_COLOUR_PRIORITY) + else + pet.add_atom_colour(chosen_color, FIXED_COLOUR_PRIORITY) + + var/input_name = sanitize_name(params["chosen_name"], allow_numbers = TRUE) + pet.name = (input_name ? input_name : initial(pet.name)) + new /obj/effect/temp_visual/guardian/phase(pet.loc) + + switch(params["chosen_gender"]) + if("male") + pet.gender = MALE + if("female") + pet.gender = FEMALE + if("neuter") + pet.gender = NEUTER + + pet.update_appearance() + alter_profile_picture() + update_static_data(ui.user, ui) + + if("get_feed_location") + generate_petfeed_area() + + if("drop_feed") + drop_feed() + + if("like_update") + var/index = params["update_reference"] + var/list/update_message = GLOB.global_pet_updates[index] + if(isnull(update_message)) + return TRUE + var/our_reference = REF(src) + if(our_reference in update_message["likers"]) + update_message["likers"] -= our_reference + else + update_message["likers"] += our_reference + + if("teach_tricks") + var/trick_name = params["trick_name"] + var/list/trick_sequence = params["tricks"] + if(isnull(pet.ai_controller)) + return TRUE + if(!isnull(trick_name)) + pet.ai_controller.set_blackboard_key(BB_TRICK_NAME, trick_name) + pet.ai_controller.override_blackboard_key(BB_TRICK_SEQUENCE, trick_sequence) + playsound(computer.loc, 'sound/items/orbie_trick_learned.ogg', 50) + + return TRUE + +/datum/computer_file/program/virtual_pet/proc/generate_petfeed_area() + if(!COOLDOWN_FINISHED(src, area_reroll)) + return + var/list/filter_area_list = typecache_filter_list(GLOB.the_station_areas, restricted_areas) + var/list/target_area_list = GLOB.the_station_areas.Copy() - filter_area_list + if(!length(target_area_list)) + return + selected_area = pick(target_area_list) + COOLDOWN_START(src, area_reroll, 2 MINUTES) + +/datum/computer_file/program/virtual_pet/proc/drop_feed() + if(!istype(get_area(computer), selected_area)) + return + announce_global_updates(message = "has found a chocolate at [selected_area.name]") + selected_area = null + var/obj/item/food/virtual_chocolate/chocolate = new(get_turf(computer)) + chocolate.AddElement(/datum/element/temporary_atom, life_time = 30 SECONDS) //we cant maintain its existence for too long! + +/datum/computer_file/program/virtual_pet/proc/recall_pet() + animate(pet, transform = matrix().Scale(0.3, 0.3), time = 1.5 SECONDS) + addtimer(CALLBACK(pet, TYPE_PROC_REF(/atom/movable, forceMove), computer), 1.5 SECONDS) + +/datum/computer_file/program/virtual_pet/proc/release_pet(mob/living/our_user) + var/turf/drop_zone + var/list/turfs_list = get_adjacent_open_turfs(computer.drop_location()) + for(var/turf/possible_turf as anything in turfs_list) + if(possible_turf.is_blocked_turf()) + continue + drop_zone = possible_turf + break + var/turf/final_turf = isnull(drop_zone) ? computer.drop_location() : drop_zone + pet.befriend(our_user) //befriend whoever set us out + animate(pet, transform = matrix(), time = 1.5 SECONDS) + pet.forceMove(final_turf) + playsound(computer.loc, 'sound/items/orbie_send_out.ogg', 20) + new /obj/effect/temp_visual/guardian/phase(pet.loc) + +#undef PET_MAX_LEVEL +#undef PET_MAX_STEPS_RECORD +#undef PET_EAT_BONUS +#undef PET_CLEAN_BONUS +#undef PET_PLAYMATE_BONUS +#undef PET_STATE_HUNGRY +#undef PET_STATE_ASLEEP +#undef PET_STATE_HAPPY +#undef PET_STATE_NEUTRAL +#undef MAX_UPDATE_LENGTH diff --git a/code/modules/pai/card.dm b/code/modules/pai/card.dm index da3bfe4e0ce14..c1a9c5a88ba04 100644 --- a/code/modules/pai/card.dm +++ b/code/modules/pai/card.dm @@ -92,7 +92,7 @@ ui = new(user, src, "PaiCard") ui.open() -/obj/item/pai_card/ui_status(mob/user) +/obj/item/pai_card/ui_status(mob/user, datum/ui_state/state) if(user in get_nested_locs(src)) return UI_INTERACTIVE return ..() diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index 400cf3660b2b8..d5403f28e6af0 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -16,7 +16,7 @@ light_flags = LIGHT_ATTACHED light_on = FALSE light_range = 3 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT maxHealth = 500 mob_size = MOB_SIZE_TINY mobility_flags = MOBILITY_FLAGS_REST_CAPABLE_DEFAULT diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm index b2f985dc357fd..1dfe4ea782160 100644 --- a/code/modules/paperwork/carbonpaper.dm +++ b/code/modules/paperwork/carbonpaper.dm @@ -20,6 +20,12 @@ return . += span_notice("Right-click to tear off the carbon-copy (you must use both hands).") +/obj/item/paper/carbon/AltClick(mob/living/user) + if(!copied) + to_chat(user, span_notice("Take off the carbon copy first.")) + return + return ..() + /obj/item/paper/carbon/proc/removecopy(mob/living/user) if(copied) to_chat(user, span_notice("There are no more carbon copies attached to this paper!")) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 82517f72494ca..5aac6d93bc3a3 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -319,6 +319,7 @@ /obj/item/paper/examine(mob/user) . = ..() + . += span_notice("Alt-click [src] to fold it into a paper plane.") if(!in_range(user, src) && !isobserver(user)) . += span_warning("You're too far away to read it!") return @@ -332,7 +333,7 @@ return . += span_warning("You cannot read it!") -/obj/item/paper/ui_status(mob/user,/datum/ui_state/state) +/obj/item/paper/ui_status(mob/user, datum/ui_state/state) // Are we on fire? Hard to read if so if(resistance_flags & ON_FIRE) return UI_CLOSE @@ -358,6 +359,31 @@ return TRUE return ..() +/obj/item/paper/AltClick(mob/living/user) + . = ..() + if(!user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS)) + return + if(HAS_TRAIT(user, TRAIT_PAPER_MASTER)) + return make_plane(user, /obj/item/paperplane/syndicate) + return make_plane(user, /obj/item/paperplane) + + +/** + * Paper plane folding + * Makes a paperplane depending on args and returns it. + * + * Arguments: + * * mob/living/user - who's folding + * * obj/item/paperplane/plane_type - what it will be folded into (path) + */ +/obj/item/paper/proc/make_plane(mob/living/user, obj/item/paperplane/plane_type = /obj/item/paperplane) + balloon_alert(user, "folded into a plane") + user.temporarilyRemoveItemFromInventory(src) + var/obj/item/paperplane/new_plane = new plane_type(loc, src) + if(user.Adjacent(new_plane)) + user.put_in_hands(new_plane) + return new_plane + /obj/item/proc/burn_paper_product_attackby_check(obj/item/attacking_item, mob/living/user, bypass_clumsy = FALSE) //can't be put on fire! if((resistance_flags & FIRE_PROOF) || !(resistance_flags & FLAMMABLE)) diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index d3688ff2156ac..0b9c4feccb18c 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -3,6 +3,7 @@ desc = "Paper, folded in the shape of a plane." icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "paperplane" + base_icon_state = "paperplane" custom_fire_overlay = "paperplane_onfire" throw_range = 7 throw_speed = 1 @@ -11,43 +12,45 @@ resistance_flags = FLAMMABLE max_integrity = 50 - var/hit_probability = 2 //% - var/obj/item/paper/internalPaper + ///The chance of hitting a mob in the eye when thrown, in percentage. + var/hit_probability = 2 + ///Reference to the paper that's folded up in this paperplane, which we return when unfolded. + var/obj/item/paper/internal_paper /obj/item/paperplane/syndicate desc = "Paper, masterfully folded in the shape of a plane." - throwforce = 20 //same as throwing stars, but no chance of embedding. - hit_probability = 100 //guaranteed to cause eye damage when it hits a mob. + throwforce = 20 + hit_probability = 100 -/obj/item/paperplane/Initialize(mapload, obj/item/paper/newPaper) +/obj/item/paperplane/Initialize(mapload, obj/item/paper/paper_made_of) . = ..() pixel_x = base_pixel_x + rand(-9, 9) pixel_y = base_pixel_y + rand(-8, 8) - if(newPaper) - internalPaper = newPaper - flags_1 = newPaper.flags_1 - color = newPaper.color - newPaper.forceMove(src) + if(paper_made_of) + internal_paper = paper_made_of + flags_1 = paper_made_of.flags_1 + color = paper_made_of.color + paper_made_of.forceMove(src) else - internalPaper = new(src) - if(internalPaper.icon_state == "cpaper" || internalPaper.icon_state == "cpaper_words") - icon_state = "paperplane_carbon" // It's the purple carbon copy. Use the purple paper plane - update_appearance() + internal_paper = new(src) + if(istype(internal_paper, /obj/item/paper/carbon_copy)) + icon_state = "[base_icon_state]_carbon" + update_appearance(UPDATE_ICON) /obj/item/paperplane/Exited(atom/movable/gone, direction) . = ..() - if (internalPaper == gone) - internalPaper = null + if (internal_paper == gone) + internal_paper = null if(!QDELETED(src)) qdel(src) /obj/item/paperplane/Destroy() - internalPaper = null + internal_paper = null return ..() /obj/item/paperplane/suicide_act(mob/living/user) var/obj/item/organ/internal/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES) - user.Stun(200) + user.Stun(20 SECONDS) user.visible_message(span_suicide("[user] jams [src] in [user.p_their()] nose. It looks like [user.p_theyre()] trying to commit suicide!")) user.adjust_eye_blur(12 SECONDS) if(eyes) @@ -57,8 +60,8 @@ /obj/item/paperplane/update_overlays() . = ..() - for(var/stamp in internalPaper.stamp_cache) - . += "paperplane_[stamp]" + for(var/stamp in internal_paper.stamp_cache) + . += "[base_icon_state]_[stamp]" /obj/item/paperplane/attack_self(mob/user) balloon_alert(user, "unfolded") @@ -66,82 +69,45 @@ var/atom/location = drop_location() // Need to keep a reference to the internal paper // when we move it out of the plane, our ref gets set to null - var/obj/item/paper/internal_paper = internalPaper - internal_paper.forceMove(location) + var/obj/item/paper/released_paper = internal_paper + released_paper.forceMove(location) // This will as a side effect, qdel the paper plane, making the user's hands empty - user.put_in_hands(internal_paper) + user.put_in_hands(released_paper) -/obj/item/paperplane/attackby(obj/item/P, mob/living/carbon/human/user, params) - if(burn_paper_product_attackby_check(P, user)) +/obj/item/paperplane/attackby(obj/item/attacking_item, mob/user, params) + if(burn_paper_product_attackby_check(attacking_item, user)) return - if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon)) + if(istype(attacking_item, /obj/item/pen) || istype(attacking_item, /obj/item/toy/crayon)) to_chat(user, span_warning("You should unfold [src] before changing it!")) return - - else if(istype(P, /obj/item/stamp)) //we don't randomize stamps on a paperplane - internalPaper.attackby(P, user) //spoofed attack to update internal paper. + else if(istype(attacking_item, /obj/item/stamp)) //we don't randomize stamps on a paperplane + internal_paper.attackby(attacking_item, user) //spoofed attack to update internal paper. update_appearance() add_fingerprint(user) return - return ..() - -/obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback, gentle, quickstart = TRUE) - . = ..(target, range, speed, thrower, FALSE, diagonals_first, callback, quickstart = quickstart) - /obj/item/paperplane/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - if(iscarbon(hit_atom)) - var/mob/living/carbon/C = hit_atom - if(C.can_catch_item(TRUE)) - var/datum/action/innate/origami/origami_action = locate() in C.actions - if(origami_action?.active) //if they're a master of origami and have the ability turned on, force throwmode on so they'll automatically catch the plane. - C.throw_mode_on(THROW_MODE_TOGGLE) - - if(..() || !ishuman(hit_atom))//if the plane is caught or it hits a nonhuman - return - var/mob/living/carbon/human/H = hit_atom - var/obj/item/organ/internal/eyes/eyes = H.get_organ_slot(ORGAN_SLOT_EYES) - if(prob(hit_probability)) - if(H.is_eyes_covered()) - return - visible_message(span_danger("\The [src] hits [H] in the eye[eyes ? "" : " socket"]!")) - H.adjust_eye_blur(12 SECONDS) - eyes?.apply_organ_damage(rand(6,8)) - H.Paralyze(40) - H.emote("scream") + if(iscarbon(hit_atom) && HAS_TRAIT(hit_atom, TRAIT_PAPER_MASTER)) + var/mob/living/carbon/hit_carbon = hit_atom + if(hit_carbon.can_catch_item(TRUE)) + hit_carbon.throw_mode_on(THROW_MODE_TOGGLE) -/obj/item/paper/examine(mob/user) . = ..() - . += span_notice("Alt-click [src] to fold it into a paper plane.") - -/obj/item/paper/AltClick(mob/living/user, obj/item/I) - if(!user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS)) + if(. || !ishuman(hit_atom)) //if the plane is caught or it hits a nonhuman return - if(istype(src, /obj/item/paper/carbon)) - var/obj/item/paper/carbon/Carbon = src - if(!Carbon.copied) - to_chat(user, span_notice("Take off the carbon copy first.")) - return - //Origami Master - var/datum/action/innate/origami/origami_action = locate() in user.actions - if(origami_action?.active) - make_plane(user, I, /obj/item/paperplane/syndicate) - else - make_plane(user, I, /obj/item/paperplane) + var/mob/living/carbon/human/hit_human = hit_atom + var/obj/item/organ/internal/eyes/eyes = hit_human.get_organ_slot(ORGAN_SLOT_EYES) + if(!prob(hit_probability)) + return + if(hit_human.is_eyes_covered()) + return + visible_message(span_danger("\The [src] hits [hit_human] in the eye[eyes ? "" : " socket"]!")) + hit_human.adjust_eye_blur(12 SECONDS) + eyes?.apply_organ_damage(rand(6, 8)) + hit_human.Paralyze(4 SECONDS) + hit_human.emote("scream") -/** - * Paper plane folding - * - * Arguments: - * * mob/living/user - who's folding - * * obj/item/I - what's being folded - * * obj/item/paperplane/plane_type - what it will be folded into (path) - */ -/obj/item/paper/proc/make_plane(mob/living/user, obj/item/I, obj/item/paperplane/plane_type = /obj/item/paperplane) - balloon_alert(user, "folded into a plane") - user.temporarilyRemoveItemFromInventory(src) - I = new plane_type(loc, src) - if(user.Adjacent(I)) - user.put_in_hands(I) +/obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback, gentle, quickstart = TRUE) + return ..(target, range, speed, thrower, FALSE, diagonals_first, callback, quickstart = quickstart) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 5ee432b365ebe..10a15e88196cc 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -325,7 +325,7 @@ armour_penetration = 20 bare_wound_bonus = 10 item_flags = NO_BLOOD_ON_ITEM - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1.5 light_power = 0.75 light_color = COLOR_SOFT_RED diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index a6cb83aafc0e1..e5a30474f8721 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -598,8 +598,7 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) toner_cartridge.charges = 0 /obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user) - check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off. - if(!istype(target) || target.anchored || target.buckled || !Adjacent(target) || !user.can_perform_action(src) || target == ass || copier_blocked()) + if(!istype(target) || target.anchored || target.buckled || !Adjacent(target) || !user.can_perform_action(src, action_bitflags = ALLOW_RESTING) || target == ass || copier_blocked()) return add_fingerprint(user) if(target == user) diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index c24b8fd73e8b2..56b7343995a2c 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -39,10 +39,8 @@ tickets.Cut() return ..() -/obj/machinery/ticket_machine/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/wallframe/ticket_machine(loc) - qdel(src) +/obj/machinery/ticket_machine/on_deconstruction(disassembled = TRUE) + new /obj/item/wallframe/ticket_machine(loc) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index dae12f33bd4cf..4bdb1c4d93aa8 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -10,7 +10,7 @@ worn_icon_state = "camera" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' - light_system = MOVABLE_LIGHT //Used as a flash here. + light_system = OVERLAY_LIGHT //Used as a flash here. light_range = 8 light_color = COLOR_WHITE light_power = FLASH_LIGHT_POWER @@ -229,7 +229,7 @@ var/datum/picture/picture = new("picture", desc.Join(" "), mobs_spotted, dead_spotted, names, get_icon, null, psize_x, psize_y, blueprints, can_see_ghosts = see_ghosts) after_picture(user, picture) - SEND_SIGNAL(src, COMSIG_CAMERA_IMAGE_CAPTURED, target, user) + SEND_SIGNAL(src, COMSIG_CAMERA_IMAGE_CAPTURED, target, user, picture) blending = FALSE return picture diff --git a/code/modules/plumbing/plumbers/iv_drip.dm b/code/modules/plumbing/plumbers/iv_drip.dm index 4bf4d71ec9f9f..bbdb80f57b16d 100644 --- a/code/modules/plumbing/plumbers/iv_drip.dm +++ b/code/modules/plumbing/plumbers/iv_drip.dm @@ -36,5 +36,5 @@ if(default_unfasten_wrench(user, tool) == SUCCESSFUL_UNFASTEN) return ITEM_INTERACT_SUCCESS -/obj/machinery/iv_drip/plumbing/deconstruct(disassembled = TRUE) +/obj/machinery/iv_drip/plumbing/on_deconstruction(disassembled) qdel(src) diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index 450142b7e92e4..ae120a6d3d70a 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -299,9 +299,7 @@ else . += "The cover is closed." -/obj/machinery/power/apc/deconstruct(disassembled = TRUE) - if(obj_flags & NO_DECONSTRUCTION) - return +/obj/machinery/power/apc/on_deconstruction(disassembled = TRUE) if(!(machine_stat & BROKEN)) set_broken() if(opened != APC_COVER_REMOVED) @@ -395,7 +393,7 @@ update_appearance() remote_control_user = null -/obj/machinery/power/apc/ui_status(mob/user) +/obj/machinery/power/apc/ui_status(mob/user, datum/ui_state/state) . = ..() if(!QDELETED(remote_control_user) && user == remote_control_user) . = UI_INTERACTIVE diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index a2307039959cb..45a8c71d7652a 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -384,10 +384,7 @@ if (prob(75)) electrocute_mob(user, get_area(src), src, (rand(7,10) * 0.1), TRUE) -/obj/machinery/light/deconstruct(disassembled = TRUE) - if(obj_flags & NO_DECONSTRUCTION) - qdel(src) - return +/obj/machinery/light/on_deconstruction(disassembled) var/obj/structure/light_construct/new_light = null var/current_stage = 2 if(!disassembled) @@ -416,7 +413,6 @@ new_light.cell = real_cell real_cell.forceMove(new_light) cell = null - qdel(src) /obj/machinery/light/attacked_by(obj/item/attacking_object, mob/living/user) ..() diff --git a/code/modules/power/monitor.dm b/code/modules/power/monitor.dm index 32e461ba8f8a0..3d4c92d8b19e2 100644 --- a/code/modules/power/monitor.dm +++ b/code/modules/power/monitor.dm @@ -8,7 +8,6 @@ light_color = LIGHT_COLOR_DIM_YELLOW use_power = ACTIVE_POWER_USE circuit = /obj/item/circuitboard/computer/powermonitor - tgui_id = "PowerMonitor" var/datum/weakref/attached_wire_ref var/datum/weakref/local_apc_ref diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 5f17e0101c03f..c83db17c586d8 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -413,6 +413,14 @@ no power level overlay is currently in the overlays list. if(fields.len) ..() +/obj/machinery/field/generator/starts_on + anchored = TRUE + state = FG_WELDED + +/obj/machinery/field/generator/starts_on/Initialize(mapload) + . = ..() + turn_on() + #undef FG_UNSECURED #undef FG_SECURED #undef FG_WELDED diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 2de87210798d4..caba755eb81a7 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -147,7 +147,7 @@ start_ending_the_round() /obj/narsie/attack_ghost(mob/user) - makeNewConstruct(/mob/living/basic/construct/harvester, user, cultoverride = TRUE, loc_override = loc) + make_new_construct(/mob/living/basic/construct/harvester, user, cultoverride = TRUE, loc_override = loc) /obj/narsie/process() var/datum/component/singularity/singularity_component = singularity.resolve() diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index a4e24c5a7287b..308b8bc246519 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -189,7 +189,7 @@ return ..() -/obj/machinery/power/smes/on_deconstruction() +/obj/machinery/power/smes/on_deconstruction(disassembled) for(var/obj/item/stock_parts/cell/cell in component_parts) cell.charge = (charge / capacity) * cell.maxcharge diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 64c09a987ed87..c62552913bbbe 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -121,18 +121,16 @@ visually_turn(new_angle) azimuth_current = new_angle -/obj/machinery/power/solar/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(disassembled) - var/obj/item/solar_assembly/S = locate() in src - if(S) - S.forceMove(loc) - S.give_glass(machine_stat & BROKEN) - else - playsound(src, SFX_SHATTER, 70, TRUE) - new /obj/item/shard(src.loc) - new /obj/item/shard(src.loc) - qdel(src) +/obj/machinery/power/solar/on_deconstruction(disassembled) + if(disassembled) + var/obj/item/solar_assembly/S = locate() in src + if(S) + S.forceMove(loc) + S.give_glass(machine_stat & BROKEN) + else + playsound(src, SFX_SHATTER, 70, TRUE) + new /obj/item/shard(src.loc) + new /obj/item/shard(src.loc) /obj/machinery/power/solar/update_overlays() . = ..() diff --git a/code/modules/power/supermatter/supermatter_delamination/cascade_delam.dm b/code/modules/power/supermatter/supermatter_delamination/cascade_delam.dm index 5d8cfecaa40d2..a9c7a87045da3 100644 --- a/code/modules/power/supermatter/supermatter_delamination/cascade_delam.dm +++ b/code/modules/power/supermatter/supermatter_delamination/cascade_delam.dm @@ -28,8 +28,7 @@ "Something feels very off.", "A drowning sense of dread washes over you.", ) - for(var/mob/victim as anything in GLOB.player_list) - to_chat(victim, span_danger(pick(messages))) + dispatch_announcement_to_players(span_danger(pick(messages)), should_play_sound = FALSE) return TRUE diff --git a/code/modules/power/thermoelectric_generator.dm b/code/modules/power/thermoelectric_generator.dm index 1f8319ad51d39..bded1482825f2 100644 --- a/code/modules/power/thermoelectric_generator.dm +++ b/code/modules/power/thermoelectric_generator.dm @@ -42,7 +42,7 @@ SSair.stop_processing_machine(src) return ..() -/obj/machinery/power/thermoelectric_generator/on_deconstruction() +/obj/machinery/power/thermoelectric_generator/on_deconstruction(disassembled) null_circulators() /obj/machinery/power/thermoelectric_generator/update_overlays() diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index d39840f875ebc..a6118e9ac093f 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -137,18 +137,16 @@ playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) unset_control() -/obj/machinery/power/tracker/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(disassembled) - var/obj/item/solar_assembly/S = locate() in src - if(S) - S.forceMove(loc) - S.give_glass(machine_stat & BROKEN) - else - playsound(src, SFX_SHATTER, 70, TRUE) - new /obj/item/shard(src.loc) - new /obj/item/shard(src.loc) - qdel(src) +/obj/machinery/power/tracker/on_deconstruction(disassembled) + if(disassembled) + var/obj/item/solar_assembly/S = locate() in src + if(S) + S.forceMove(loc) + S.give_glass(machine_stat & BROKEN) + else + playsound(src, SFX_SHATTER, 70, TRUE) + new /obj/item/shard(src.loc) + new /obj/item/shard(src.loc) // Tracker Electronic diff --git a/code/modules/power/turbine/turbine.dm b/code/modules/power/turbine/turbine.dm index fa1a885044a1d..3f4d3fd844650 100644 --- a/code/modules/power/turbine/turbine.dm +++ b/code/modules/power/turbine/turbine.dm @@ -179,7 +179,7 @@ if(default_deconstruction_crowbar(tool)) return ITEM_INTERACT_SUCCESS -/obj/machinery/power/turbine/on_deconstruction() +/obj/machinery/power/turbine/on_deconstruction(disassembled) installed_part?.forceMove(loc) return ..() @@ -547,7 +547,7 @@ disconnect_from_network() SSair.stop_processing_machine(src) -/obj/machinery/power/turbine/core_rotor/on_deconstruction() +/obj/machinery/power/turbine/core_rotor/on_deconstruction(disassembled) deactivate_parts() return ..() diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm index dfd99e24766f2..3b2489022ea45 100644 --- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -13,6 +13,12 @@ /obj/item/ammo_box/magazine/internal/shot/tube/fire ammo_type = /obj/projectile/bullet/incendiary/shotgun/no_trail +/obj/item/ammo_box/magazine/internal/shot/tube/buckshot + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + +/obj/item/ammo_box/magazine/internal/shot/tube/slug + ammo_type = /obj/item/ammo_casing/shotgun + /obj/item/ammo_box/magazine/internal/shot/lethal ammo_type = /obj/item/ammo_casing/shotgun/buckshot diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 69668cfaf40d0..841629f5e38cf 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -264,8 +264,7 @@ casing.bounce_away(TRUE) SEND_SIGNAL(casing, COMSIG_CASING_EJECTED) else if(empty_chamber) - UnregisterSignal(chambered, COMSIG_MOVABLE_MOVED) - chambered = null + clear_chambered() if (chamber_next_round && (magazine?.max_ammo > 1)) chamber_round() diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 70e2210a4e992..4162ca9890f2f 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -159,7 +159,7 @@ /obj/item/gun/ballistic/automatic/m90 name = "\improper M-90gl Carbine" - desc = "A three-round burst 5.56 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher." + desc = "A three-round burst .223 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher." desc_controls = "Right-click to use grenade launcher." icon_state = "m90" w_class = WEIGHT_CLASS_BULKY diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 8a6f15e9a981d..4e81b1e585638 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -97,6 +97,10 @@ desc = "An advanced shotgun with two separate magazine tubes. This one shows signs of bounty hunting customization, meaning it likely has a dual rubber shot/fire slug load." alt_mag_type = /obj/item/ammo_box/magazine/internal/shot/tube/fire +/obj/item/gun/ballistic/shotgun/automatic/dual_tube/deadly + spawn_magazine_type = /obj/item/ammo_box/magazine/internal/shot/tube/buckshot + alt_mag_type = /obj/item/ammo_box/magazine/internal/shot/tube/slug + /obj/item/gun/ballistic/shotgun/automatic/dual_tube/examine(mob/user) . = ..() . += span_notice("Alt-click to pump it.") diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index c4b6f6fb4ce7e..6f80bf0e21435 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -387,4 +387,5 @@ /obj/item/firing_pin/Destroy() if(gun) gun.pin = null + gun = null return ..() diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 33c0a32373386..e902a0e142984 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -9,7 +9,7 @@ armor_flag = LASER eyeblur = 4 SECONDS impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 light_power = 1 light_color = COLOR_SOFT_RED diff --git a/code/modules/reagents/chemistry/equilibrium.dm b/code/modules/reagents/chemistry/equilibrium.dm index c3ccc00020705..4ab88b3caa674 100644 --- a/code/modules/reagents/chemistry/equilibrium.dm +++ b/code/modules/reagents/chemistry/equilibrium.dm @@ -390,11 +390,15 @@ reaction_quality = purity //post reaction checks - if(!(check_fail_states(total_step_added))) + if(!check_fail_states(total_step_added)) to_delete = TRUE return //If the volume of reagents created(total_step_added) >= volume of reagents still to be created(step_target_vol) then end //i.e. we have created all the reagents needed for this reaction - if(total_step_added >= step_target_vol) + //This is only accurate when a single reaction is present and we don't have multiple reactions where + //reaction B consumes the products formed from reaction A(which can happen in add_reagent() as it also triggers handle_reactions() which can consume the reagent just added) + //because total_step_added will be higher than the actual volume that was created leading to the reaction ending early + //and yielding less products than intended + if(total_step_added >= step_target_vol && length(holder.reaction_list) == 1) to_delete = TRUE diff --git a/code/modules/reagents/chemistry/holder/holder.dm b/code/modules/reagents/chemistry/holder/holder.dm index a4e149a2bc862..d32cd92361b46 100644 --- a/code/modules/reagents/chemistry/holder/holder.dm +++ b/code/modules/reagents/chemistry/holder/holder.dm @@ -304,29 +304,36 @@ return total_removed //this should be amount unless the loop is prematurely broken, in which case it'll be lower. It shouldn't ever go OVER amount. /** - * Removes all reagents by an amount equal to - * [amount specified] / total volume present in this holder + * Removes all reagents either proportionally(amount is the direct volume to remove) + * when proportional the total volume of all reagents removed will equal to amount + * or relatively(amount is a percentile between 0->1) when relative amount is the % + * of each reagent to be removed + * * Arguments * - * * amount - the volume of each reagent + * * amount - the amount to remove + * * relative - if TRUE amount is treated as an percentage between 0->1. If FALSE amount is the direct volume to remove */ - -/datum/reagents/proc/remove_all(amount = 1) +/datum/reagents/proc/remove_all(amount = 1, relative = FALSE) if(!total_volume) return FALSE if(!IS_FINITE(amount)) stack_trace("non finite amount passed to remove all reagents [amount]") return FALSE + if(relative && (amount < 0 || amount > 1)) + stack_trace("illegal percentage value passed to remove all reagents [amount]") + return FALSE amount = round(amount, CHEMICAL_QUANTISATION_LEVEL) if(amount <= 0) return FALSE var/list/cached_reagents = reagent_list - var/part = amount / total_volume var/total_removed_amount = 0 - + var/part = amount + if(!relative) + part /= total_volume for(var/datum/reagent/reagent as anything in cached_reagents) total_removed_amount += remove_reagent(reagent.type, reagent.volume * part) diff --git a/code/modules/reagents/chemistry/holder/reactions.dm b/code/modules/reagents/chemistry/holder/reactions.dm index 3fa4c7ac95cdf..80241173deebf 100644 --- a/code/modules/reagents/chemistry/holder/reactions.dm +++ b/code/modules/reagents/chemistry/holder/reactions.dm @@ -97,8 +97,6 @@ if((selected_reaction.reaction_flags & REACTION_INSTANT) || (flags & REAGENT_HOLDER_INSTANT_REACT)) //If we have instant reactions, we process them here instant_react(selected_reaction) .++ - update_total() - continue else var/exists = FALSE for(var/datum/equilibrium/E_exist as anything in reaction_list) diff --git a/code/modules/reagents/chemistry/holder/ui_data.dm b/code/modules/reagents/chemistry/holder/ui_data.dm index bc8b3d6c713f6..39ceaaa06f002 100644 --- a/code/modules/reagents/chemistry/holder/ui_data.dm +++ b/code/modules/reagents/chemistry/holder/ui_data.dm @@ -9,7 +9,7 @@ ui.open() -/datum/reagents/ui_status(mob/user) +/datum/reagents/ui_status(mob/user, datum/ui_state/state) return UI_INTERACTIVE //please advise /datum/reagents/ui_state(mob/user) diff --git a/code/modules/reagents/chemistry/items.dm b/code/modules/reagents/chemistry/items.dm index 37d089aab4231..25f805acdaf1b 100644 --- a/code/modules/reagents/chemistry/items.dm +++ b/code/modules/reagents/chemistry/items.dm @@ -315,7 +315,7 @@ . = ..() INVOKE_ASYNC(src, PROC_REF(remove_thermometer), user) -/obj/item/thermometer/ui_status(mob/user) +/obj/item/thermometer/ui_status(mob/user, datum/ui_state/state) if(!(in_range(src, user))) return UI_CLOSE return UI_INTERACTIVE diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 0f6ea479a96ce..c3910529fc86b 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -464,7 +464,7 @@ update_appearance() return TRUE -/obj/machinery/chem_dispenser/on_deconstruction() +/obj/machinery/chem_dispenser/on_deconstruction(disassembled) cell = null if(beaker) beaker.forceMove(drop_location()) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 6c036d37bef01..a07fd289f0784 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -25,7 +25,7 @@ create_reagents(200, NO_REACT) register_context() -/obj/machinery/chem_heater/on_deconstruction() +/obj/machinery/chem_heater/on_deconstruction(disassembled) beaker?.forceMove(drop_location()) /obj/machinery/chem_heater/Destroy() diff --git a/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm b/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm index e49bc3ec5d6b2..c23a86ca9dc86 100644 --- a/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm +++ b/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm @@ -58,14 +58,13 @@ This will not clean any inverted reagents. Inverted reagents will still be corre for(var/datum/stock_part/micro_laser/laser in component_parts) cms_coefficient /= laser.tier -/obj/machinery/chem_mass_spec/deconstruct(disassembled) +/obj/machinery/chem_mass_spec/on_deconstruction(disassembled) if(beaker1) beaker1.forceMove(drop_location()) beaker1 = null if(beaker2) beaker2.forceMove(drop_location()) beaker2 = null - . = ..() /obj/machinery/chem_mass_spec/update_overlays() . = ..() diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index bbc06437b84c7..6c961571b613f 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -59,7 +59,7 @@ QDEL_NULL(beaker) return ..() -/obj/machinery/chem_master/on_deconstruction() +/obj/machinery/chem_master/on_deconstruction(disassembled) replace_beaker() return ..() diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 586cb0ce8fa1f..bbde13c78a818 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -108,7 +108,7 @@ update_appearance() SStgui.update_uis(src) -/obj/machinery/computer/pandemic/on_deconstruction() +/obj/machinery/computer/pandemic/on_deconstruction(disassembled) eject_beaker() . = ..() diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index f4be905a0738b..6641e63520e00 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -27,6 +27,7 @@ holdingitems = list() beaker = new /obj/item/reagent_containers/cup/beaker/large(src) warn_of_dust() + RegisterSignal(src, COMSIG_STORAGE_DUMP_CONTENT, PROC_REF(on_storage_dump)) /// Add a description to the current beaker warning of blended dust, if it doesn't already have that warning. /obj/machinery/reagentgrinder/proc/warn_of_dust() @@ -42,11 +43,10 @@ QDEL_NULL(beaker) update_appearance() -/obj/machinery/reagentgrinder/deconstruct() +/obj/machinery/reagentgrinder/on_deconstruction(disassmbled) drop_all_items() beaker?.forceMove(drop_location()) beaker = null - return ..() /obj/machinery/reagentgrinder/Destroy() QDEL_NULL(beaker) @@ -206,6 +206,24 @@ holdingitems[weapon] = TRUE return FALSE +/obj/machinery/reagentgrinder/proc/on_storage_dump(datum/source, datum/storage/storage, mob/user) + SIGNAL_HANDLER + + for(var/obj/item/to_dump in storage.real_location) + if(holdingitems.len >= limit) + break + + if(!to_dump.grind_results && !to_dump.juice_typepath) + continue + + if(!storage.attempt_remove(to_dump, src, silent = TRUE)) + continue + + holdingitems[to_dump] = TRUE + + to_chat(user, span_notice("You dump [storage.parent] into [src].")) + return STORAGE_DUMP_HANDLED + /obj/machinery/reagentgrinder/ui_interact(mob/user) // The microwave Menu //I am reasonably certain that this is not a microwave . = ..() diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index a8d1765891bf1..e91aea78d5995 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -111,10 +111,9 @@ return return ..() -/obj/machinery/smoke_machine/deconstruct() +/obj/machinery/smoke_machine/on_deconstruction(disassembled) reagents.expose(loc, TOUCH) reagents.clear_reagents() - return ..() /obj/machinery/smoke_machine/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 714b2ac21979f..f51532b28b19d 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -74,6 +74,10 @@ /// The affected respiration type, if the reagent damages/heals oxygen damage of an affected mob. /// See "Mob bio-types flags" in /code/_DEFINES/mobs.dm var/affected_respiration_type = ALL + /// A list of traits to apply while the reagent is being metabolized. + var/list/metabolized_traits + /// A list of traits to apply while the reagent is in a mob. + var/list/added_traits ///The default reagent container for the reagent, used for icon generation var/obj/item/reagent_containers/default_container = /obj/item/reagent_containers/cup/bottle @@ -191,20 +195,24 @@ Primarily used in reagents/reaction_agents /// Called when this reagent is first added to a mob /datum/reagent/proc/on_mob_add(mob/living/affected_mob, amount) overdose_threshold /= max(normalise_creation_purity(), 1) //Maybe??? Seems like it would help pure chems be even better but, if I normalised this to 1, then everything would take a 25% reduction - return + if(added_traits) + affected_mob.add_traits(added_traits, "base:[type]") /// Called when this reagent is removed while inside a mob /datum/reagent/proc/on_mob_delete(mob/living/affected_mob) affected_mob.clear_mood_event("[type]_overdose") - return + REMOVE_TRAITS_IN(affected_mob, "base:[type]") /// Called when this reagent first starts being metabolized by a liver /datum/reagent/proc/on_mob_metabolize(mob/living/affected_mob) - return + SHOULD_CALL_PARENT(TRUE) + if(metabolized_traits) + affected_mob.add_traits(metabolized_traits, "metabolize:[type]") /// Called when this reagent stops being metabolized by a liver /datum/reagent/proc/on_mob_end_metabolize(mob/living/affected_mob) - return + SHOULD_CALL_PARENT(TRUE) + REMOVE_TRAITS_IN(affected_mob, "metabolize:[type]") /** * Called when a reagent is inside of a mob when they are dead if the reagent has the REAGENT_DEAD_PROCESS flag diff --git a/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm b/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm index 7b13b2d28b1d2..1406e37369359 100644 --- a/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm @@ -23,16 +23,15 @@ color = "90560B" taste_description = "minty" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + metabolized_traits = list(TRAIT_RESISTHEAT) /datum/reagent/halon/on_mob_metabolize(mob/living/breather) . = ..() breather.add_movespeed_modifier(/datum/movespeed_modifier/reagent/halon) - ADD_TRAIT(breather, TRAIT_RESISTHEAT, type) /datum/reagent/halon/on_mob_end_metabolize(mob/living/breather) . = ..() breather.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/halon) - REMOVE_TRAIT(breather, TRAIT_RESISTHEAT, type) /datum/reagent/healium name = "Healium" @@ -81,14 +80,7 @@ ph = 1.8 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE addiction_types = list(/datum/addiction/stimulants = 14) - -/datum/reagent/nitrium_high_metabolization/on_mob_metabolize(mob/living/breather) - . = ..() - ADD_TRAIT(breather, TRAIT_SLEEPIMMUNE, type) - -/datum/reagent/nitrium_high_metabolization/on_mob_end_metabolize(mob/living/breather) - . = ..() - REMOVE_TRAIT(breather, TRAIT_SLEEPIMMUNE, type) + metabolized_traits = list(TRAIT_SLEEPIMMUNE) /datum/reagent/nitrium_high_metabolization/on_mob_life(mob/living/carbon/breather, seconds_per_tick, times_fired) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index 8fb16f6333ac6..039bce7eaa8eb 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -584,8 +584,10 @@ if(affected_mob.health <= (affected_mob.crit_threshold + HEALTH_THRESHOLD_FULLCRIT*(2*normalise_creation_purity()))) //certain death below this threshold REMOVE_TRAIT(affected_mob, TRAIT_STABLEHEART, type) //we have to remove the stable heart trait before we give them a heart attack - to_chat(affected_mob,span_danger("You feel something rupturing inside your chest!")) - affected_mob.emote("scream") + affected_mob.remove_traits(subject_traits, type) + to_chat(affected_mob, span_danger("You feel something rupturing inside your chest!")) + if(!HAS_TRAIT(affected_mob, TRAIT_ANALGESIA)) + affected_mob.emote("scream") affected_mob.set_heartattack(TRUE) volume = 0 if(need_mob_update) diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm index 93954ab944fc7..87033589812cb 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm @@ -158,6 +158,7 @@ drinker.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) /datum/reagent/consumable/ethanol/beer/green/on_mob_end_metabolize(mob/living/drinker) + . = ..() drinker.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, color) /datum/reagent/consumable/ethanol/beer/green/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) @@ -589,37 +590,55 @@ taste_description = "oranges" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/screwdrivercocktail/on_transfer(atom/atom, methods = TOUCH, trans_volume) - if(!(methods & INGEST)) - return ..() - - if(src == atom.reagents.get_master_reagent() && istype(atom, /obj/item/reagent_containers/cup/glass/drinkingglass)) - var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = atom - drink.tool_behaviour = TOOL_SCREWDRIVER +/datum/reagent/consumable/ethanol/screwdrivercocktail/on_new(data) + . = ..() + // We want to turn only base drinking glasses with screwdriver(cocktail) into screwdrivers(tool), + // but we can't check style so we have to check type, and we don't want it match subtypes like istype does + if(holder?.my_atom && holder.my_atom.type == /obj/item/reagent_containers/cup/glass/drinkingglass/) var/list/reagent_change_signals = list( COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_REM_REAGENT, - COMSIG_REAGENTS_DEL_REAGENT, - COMSIG_REAGENTS_CLEAR_REAGENTS, - COMSIG_REAGENTS_REACTED, ) - RegisterSignals(drink.reagents, reagent_change_signals, PROC_REF(on_reagent_change)) - - return ..() + RegisterSignals(holder, reagent_change_signals, PROC_REF(on_reagent_change)) + RegisterSignal(holder, COMSIG_REAGENTS_CLEAR_REAGENTS, PROC_REF(on_reagents_clear)) + RegisterSignal(holder, COMSIG_REAGENTS_DEL_REAGENT, PROC_REF(on_reagent_delete)) + if(src == holder.get_master_reagent()) + var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = holder.my_atom + drink.tool_behaviour = TOOL_SCREWDRIVER + drink.usesound = list('sound/items/screwdriver.ogg', 'sound/items/screwdriver2.ogg') /datum/reagent/consumable/ethanol/screwdrivercocktail/proc/on_reagent_change(datum/reagents/reagents) SIGNAL_HANDLER - if(src != reagents.get_master_reagent()) - var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = reagents.my_atom + var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = reagents.my_atom + if(reagents.get_master_reagent() == src) + drink.tool_behaviour = TOOL_SCREWDRIVER + drink.usesound = list('sound/items/screwdriver.ogg', 'sound/items/screwdriver2.ogg') + else drink.tool_behaviour = initial(drink.tool_behaviour) - UnregisterSignal(reagents, list( + drink.usesound = initial(drink.usesound) + +/datum/reagent/consumable/ethanol/screwdrivercocktail/proc/on_reagents_clear(datum/reagents/reagents) + SIGNAL_HANDLER + unregister_screwdriver(reagents) + +/datum/reagent/consumable/ethanol/screwdrivercocktail/proc/on_reagent_delete(datum/reagents/reagents, datum/reagent/deleted_reagent) + SIGNAL_HANDLER + if(deleted_reagent != src) + return + unregister_screwdriver(reagents) + +/datum/reagent/consumable/ethanol/screwdrivercocktail/proc/unregister_screwdriver(datum/reagents/reagents) + var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = reagents.my_atom + if(drink.tool_behaviour == TOOL_SCREWDRIVER) + drink.tool_behaviour = initial(drink.tool_behaviour) + drink.usesound = initial(drink.usesound) + UnregisterSignal(reagents, list( COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, - COMSIG_REAGENTS_REACTED, )) /datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) @@ -666,6 +685,7 @@ taste_description = "alcoholic bravery" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_EASY + metabolized_traits = list(TRAIT_FEARLESS, TRAIT_ANALGESIA) var/tough_text /datum/reagent/consumable/ethanol/brave_bull/on_mob_metabolize(mob/living/drinker) @@ -674,14 +694,12 @@ to_chat(drinker, span_notice("You feel [tough_text]!")) drinker.maxHealth += 10 //Brave Bull makes you sturdier, and thus capable of withstanding a tiny bit more punishment. drinker.health += 10 - ADD_TRAIT(drinker, TRAIT_FEARLESS, type) /datum/reagent/consumable/ethanol/brave_bull/on_mob_end_metabolize(mob/living/drinker) . = ..() to_chat(drinker, span_notice("You no longer feel [tough_text].")) drinker.maxHealth -= 10 drinker.health = min(drinker.health - 10, drinker.maxHealth) //This can indeed crit you if you're alive solely based on alchol ingestion - REMOVE_TRAIT(drinker, TRAIT_FEARLESS, type) /datum/reagent/consumable/ethanol/tequila_sunrise name = "Tequila Sunrise" @@ -1055,15 +1073,11 @@ quality = DRINK_VERYGOOD taste_description = "concentrated matter" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_MADNESS_IMMUNE) var/static/list/ray_filter = list(type = "rays", size = 40, density = 15, color = SUPERMATTER_SINGULARITY_RAYS_COLOUR, factor = 15) -/datum/reagent/consumable/ethanol/singulo/on_mob_metabolize(mob/living/drinker) - . = ..() - ADD_TRAIT(drinker, TRAIT_MADNESS_IMMUNE, type) - /datum/reagent/consumable/ethanol/singulo/on_mob_end_metabolize(mob/living/drinker) . = ..() - REMOVE_TRAIT(drinker, TRAIT_MADNESS_IMMUNE, type) drinker.remove_filter("singulo_rays") /datum/reagent/consumable/ethanol/singulo/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) @@ -1195,7 +1209,7 @@ /datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/target, seconds_per_tick, times_fired) . = ..() - var/datum/antagonist/changeling/changeling = target.mind?.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(target) changeling?.adjust_chemicals(metabolization_rate * REM * seconds_per_tick) /datum/reagent/consumable/ethanol/irishcarbomb @@ -2155,14 +2169,7 @@ quality = DRINK_GOOD taste_description = "artifical fruityness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/ethanol/rubberneck/on_mob_metabolize(mob/living/drinker) - . = ..() - ADD_TRAIT(drinker, TRAIT_SHOCKIMMUNE, type) - -/datum/reagent/consumable/ethanol/rubberneck/on_mob_end_metabolize(mob/living/drinker) - REMOVE_TRAIT(drinker, TRAIT_SHOCKIMMUNE, type) - return ..() + metabolized_traits = list(TRAIT_SHOCKIMMUNE) /datum/reagent/consumable/ethanol/duplex name = "Duplex" @@ -2242,6 +2249,7 @@ quality = DRINK_NICE taste_description = "sugary tartness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_ANALGESIA) /datum/reagent/consumable/ethanol/pina_colada name = "Pina Colada" @@ -2624,20 +2632,13 @@ /datum/reagent/consumable/ethanol/telepole name = "Telepole" - description = "A grounding rod in the form of a drink. Recharges ethereals, and gives temporary shock resistance." + description = "A grounding rod in the form of a drink. Recharges ethereals, and gives temporary shock resistance." boozepwr = 50 color = "#b300ff" quality = DRINK_NICE taste_description = "the howling storm" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/ethanol/telepole/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_SHOCKIMMUNE, type) - -/datum/reagent/consumable/ethanol/telepole/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_SHOCKIMMUNE, type) + metabolized_traits = list(TRAIT_SHOCKIMMUNE) /datum/reagent/consumable/ethanol/telepole/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) //can't be on life because of the way blood works. . = ..() diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm index e76e0e8fbb5c5..43430d0946916 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm @@ -454,8 +454,10 @@ affected_mob.set_drugginess(1 MINUTES * REM * seconds_per_tick) affected_mob.adjust_dizzy(3 SECONDS * REM * seconds_per_tick) affected_mob.remove_status_effect(/datum/status_effect/drowsiness) - affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) + affected_mob.AdjustSleeping(-4 SECONDS * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + if (SSradiation.can_irradiate_basic(affected_mob)) + affected_mob.AddComponent(/datum/component/irradiated) /datum/reagent/consumable/rootbeer name = "root beer" @@ -497,19 +499,15 @@ quality = DRINK_VERYGOOD taste_description = "carbonated oil" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_SHOCKIMMUNE) /datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/carbon/affected_atom) . = ..() - ADD_TRAIT(affected_atom, TRAIT_SHOCKIMMUNE, type) var/obj/item/organ/internal/liver/liver = affected_atom.get_organ_slot(ORGAN_SLOT_LIVER) if(HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM)) affected_atom.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high) metabolization_rate *= 0.8 -/datum/reagent/consumable/grey_bull/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_SHOCKIMMUNE, type) - /datum/reagent/consumable/grey_bull/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() affected_mob.set_jitter_if_lower(40 SECONDS * REM * seconds_per_tick) @@ -1170,6 +1168,7 @@ quality = DRINK_GOOD taste_description = "citrus soda with cucumber" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_HIGH /datum/reagent/consumable/cucumberlemonade/on_mob_life(mob/living/carbon/doll, seconds_per_tick, times_fired) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 837a34daf7f15..6363a9766a35a 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -5,6 +5,7 @@ var/trippy = TRUE //Does this drug make you trip? /datum/reagent/drug/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() if(trippy) affected_mob.clear_mood_event("[type]_high") @@ -214,13 +215,13 @@ overdose_threshold = 20 taste_description = "salt" // because they're bathsalts? addiction_types = list(/datum/addiction/stimulants = 25) //8 per 2 seconds - var/datum/brain_trauma/special/psychotic_brawling/bath_salts/rage ph = 8.2 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE, TRAIT_ANALGESIA) + var/datum/brain_trauma/special/psychotic_brawling/bath_salts/rage /datum/reagent/drug/bath_salts/on_mob_metabolize(mob/living/affected_mob) . = ..() - affected_mob.add_traits(list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE), type) if(iscarbon(affected_mob)) var/mob/living/carbon/carbon_mob = affected_mob rage = new() @@ -228,7 +229,6 @@ /datum/reagent/drug/bath_salts/on_mob_end_metabolize(mob/living/affected_mob) . = ..() - affected_mob.remove_traits(list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE), type) if(rage) QDEL_NULL(rage) @@ -290,15 +290,14 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED taste_description = "paint thinner" addiction_types = list(/datum/addiction/hallucinogens = 18) + metabolized_traits = list(TRAIT_FEARLESS, TRAIT_ANALGESIA) /datum/reagent/drug/happiness/on_mob_metabolize(mob/living/affected_mob) . = ..() - ADD_TRAIT(affected_mob, TRAIT_FEARLESS, type) affected_mob.add_mood_event("happiness_drug", /datum/mood_event/happiness_drug) /datum/reagent/drug/happiness/on_mob_delete(mob/living/affected_mob) . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_FEARLESS, type) affected_mob.clear_mood_event("happiness_drug") /datum/reagent/drug/happiness/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) @@ -335,19 +334,15 @@ overdose_threshold = 30 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/stimulants = 6) //2.6 per 2 seconds + metabolized_traits = list(TRAIT_BATON_RESISTANCE, TRAIT_ANALGESIA) /datum/reagent/drug/pumpup/on_mob_metabolize(mob/living/carbon/affected_mob) . = ..() - ADD_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM)) affected_mob.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high) metabolization_rate *= 0.8 -/datum/reagent/drug/pumpup/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) - /datum/reagent/drug/pumpup/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) @@ -432,20 +427,13 @@ overdose_threshold = 25 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/maintenance_drugs = 8) - -/datum/reagent/drug/maint/sludge/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob,TRAIT_HARDLY_WOUNDED,type) + metabolized_traits = list(TRAIT_HARDLY_WOUNDED, TRAIT_ANALGESIA) /datum/reagent/drug/maint/sludge/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() if(affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH -/datum/reagent/drug/maint/sludge/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_HARDLY_WOUNDED,type) - /datum/reagent/drug/maint/sludge/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() if(!iscarbon(affected_mob)) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index f7d070ee33dab..a9fad04ff7f1f 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -525,14 +525,7 @@ taste_description = "garlic" metabolization_rate = 0.15 * REAGENTS_METABOLISM chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/garlic/on_mob_add(mob/living/affected_mob, amount) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_GARLIC_BREATH, type) - -/datum/reagent/consumable/garlic/on_mob_delete(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_GARLIC_BREATH, type) + added_traits = list(TRAIT_GARLIC_BREATH) /datum/reagent/consumable/garlic/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm index a54f117265da1..3c677e43d1c07 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm @@ -847,14 +847,7 @@ Basically, we fill the time between now and 2s from now with hands based off the ph = 4.5 metabolization_rate = 0.08 * REM tox_damage = 0 - -/datum/reagent/inverse/salbutamol/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_EASYBLEED, type) - -/datum/reagent/inverse/salbutamol/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_EASYBLEED, type) + metabolized_traits = list(TRAIT_EASYBLEED) /datum/reagent/inverse/pen_acid name = "Pendetide" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 303a85c6b4b6a..d20f2b786277d 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -41,6 +41,7 @@ color = "#E0BB00" //golden for the gods taste_description = "badmins" chemical_flags = REAGENT_DEAD_PROCESS + metabolized_traits = list(TRAIT_ANALGESIA) /// Flags to fullheal every metabolism tick var/full_heal_flags = ~(HEAL_BRUTE|HEAL_BURN|HEAL_TOX|HEAL_RESTRAINTS|HEAL_REFRESH_ORGANS) @@ -252,14 +253,7 @@ metabolization_rate = 0.1 * REAGENTS_METABOLISM ph = 8.1 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/spaceacillin/on_mob_add(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_VIRUS_RESISTANCE, type) - -/datum/reagent/medicine/spaceacillin/on_mob_delete(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_VIRUS_RESISTANCE, type) + added_traits = list(TRAIT_VIRUS_RESISTANCE) //Goon Chems. Ported mainly from Goonstation. Easily mixable (or not so easily) and provide a variety of effects. @@ -279,9 +273,9 @@ . = ..() var/need_mob_update if(affected_mob.getFireLoss() > 25) - need_mob_update = affected_mob.adjustFireLoss(-4 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) //Twice as effective as AIURI for severe burns + need_mob_update = affected_mob.adjustFireLoss(-4 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) //Twice as effective as AIURI for severe burns else - need_mob_update = affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) //But only a quarter as effective for more minor ones + need_mob_update = affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) //But only a quarter as effective for more minor ones if(need_mob_update) return UPDATE_MOB_HEALTH @@ -349,6 +343,7 @@ metabolization_rate = 0.4 * REAGENTS_METABOLISM ph = 2.6 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_AFFECTS_WOUNDS + metabolized_traits = list(TRAIT_ANALGESIA) /datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -496,14 +491,7 @@ metabolization_rate = 2 * REAGENTS_METABOLISM ph = 12 //It's a reducing agent chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/potass_iodide/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_HALT_RADIATION_EFFECTS, "[type]") - -/datum/reagent/medicine/potass_iodide/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_HALT_RADIATION_EFFECTS, "[type]") + metabolized_traits = list(TRAIT_HALT_RADIATION_EFFECTS) /datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -521,14 +509,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED inverse_chem_val = 0.4 inverse_chem = /datum/reagent/inverse/pen_acid - -/datum/reagent/medicine/pen_acid/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_HALT_RADIATION_EFFECTS, "[type]") - -/datum/reagent/medicine/pen_acid/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_HALT_RADIATION_EFFECTS, "[type]") + metabolized_traits = list(TRAIT_HALT_RADIATION_EFFECTS) /datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -554,9 +535,9 @@ . = ..() var/need_mob_update if(affected_mob.getBruteLoss() > 25) - need_mob_update = affected_mob.adjustBruteLoss(-4 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjustBruteLoss(-4 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) else - need_mob_update = affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -603,16 +584,15 @@ addiction_types = list(/datum/addiction/stimulants = 4) //1.6 per 2 seconds inverse_chem = /datum/reagent/inverse/corazargh inverse_chem_val = 0.4 + metabolized_traits = list(TRAIT_BATON_RESISTANCE) /datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/affected_mob) . = ..() affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) - ADD_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) /datum/reagent/medicine/ephedrine/on_mob_end_metabolize(mob/living/affected_mob) . = ..() affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) - REMOVE_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) /datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -668,6 +648,7 @@ ph = 8.96 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/opioids = 10) + metabolized_traits = list(TRAIT_ANALGESIA) /datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/affected_mob) . = ..() @@ -820,14 +801,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED inverse_chem_val = 0.35 inverse_chem = /datum/reagent/inverse/atropine - -/datum/reagent/medicine/atropine/on_mob_add(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION, "[type]") - -/datum/reagent/medicine/atropine/on_mob_delete(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION, "[type]") + added_traits = list(TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION) /datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -863,14 +837,7 @@ overdose_threshold = 30 ph = 10.2 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/epinephrine/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_NOCRITDAMAGE, type) - -/datum/reagent/medicine/epinephrine/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_NOCRITDAMAGE, type) + metabolized_traits = list(TRAIT_NOCRITDAMAGE) /datum/reagent/medicine/epinephrine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -1039,21 +1006,13 @@ purity = REAGENT_STANDARD_PURITY inverse_chem = /datum/reagent/inverse inverse_chem_val = 0.45 + metabolized_traits = list(TRAIT_TUMOR_SUPPRESSED) //Having mannitol in you will pause the brain damage from brain tumor (so it heals an even 2 brain damage instead of 1.8) /datum/reagent/medicine/mannitol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) return UPDATE_MOB_HEALTH -//Having mannitol in you will pause the brain damage from brain tumor (so it heals an even 2 brain damage instead of 1.8) -/datum/reagent/medicine/mannitol/on_mob_metabolize(mob/living/carbon/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_TUMOR_SUPPRESSED, TRAIT_GENERIC) - -/datum/reagent/medicine/mannitol/on_mob_end_metabolize(mob/living/carbon/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_TUMOR_SUPPRESSED, TRAIT_GENERIC) - /datum/reagent/medicine/mannitol/overdose_start(mob/living/affected_mob) . = ..() to_chat(affected_mob, span_notice("You suddenly feel E N L I G H T E N E D!")) @@ -1080,12 +1039,12 @@ purity = REAGENT_STANDARD_PURITY inverse_chem_val = 0.5 inverse_chem = /datum/reagent/inverse/neurine + added_traits = list(TRAIT_ANTICONVULSANT) ///brain damage level when we first started taking the chem var/initial_bdamage = 200 /datum/reagent/medicine/neurine/on_mob_add(mob/living/affected_mob, amount) . = ..() - ADD_TRAIT(affected_mob, TRAIT_ANTICONVULSANT, name) if(!iscarbon(affected_mob)) return var/mob/living/carbon/affected_carbon = affected_mob @@ -1094,7 +1053,6 @@ /datum/reagent/medicine/neurine/on_mob_delete(mob/living/affected_mob) . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_ANTICONVULSANT, name) if(!iscarbon(affected_mob)) return var/mob/living/carbon/affected_carbon = affected_mob @@ -1172,16 +1130,15 @@ ph = 8.7 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE addiction_types = list(/datum/addiction/stimulants = 4) //0.8 per 2 seconds + metabolized_traits = list(TRAIT_BATON_RESISTANCE, TRAIT_ANALGESIA) /datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/affected_mob) . = ..() affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) - ADD_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) /datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/affected_mob) . = ..() affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) - REMOVE_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) /datum/reagent/medicine/stimulants/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -1278,7 +1235,7 @@ need_mob_update = affected_mob.adjustBruteLoss(-5 * REM * seconds_per_tick, updating_health = FALSE) //A ton of healing - this is a 50 telecrystal investment. need_mob_update += affected_mob.adjustFireLoss(-5 * REM * seconds_per_tick, updating_health = FALSE) need_mob_update += affected_mob.adjustOxyLoss(-15 * REM * seconds_per_tick, updating_health = FALSE) - need_mob_update += affected_mob.adjustToxLoss(-5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustToxLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE, required_biotype = affected_biotype) need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15 * REM * seconds_per_tick) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -1298,6 +1255,7 @@ ph = 11 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/hallucinogens = 14) + metabolized_traits = list(TRAIT_PACIFISM) /datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -1323,14 +1281,6 @@ if(need_mob_update) return UPDATE_MOB_HEALTH -/datum/reagent/medicine/earthsblood/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_PACIFISM, type) - -/datum/reagent/medicine/earthsblood/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_PACIFISM, type) - /datum/reagent/medicine/earthsblood/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() affected_mob.adjust_hallucinations_up_to(10 SECONDS * REM * seconds_per_tick, 120 SECONDS) @@ -1446,14 +1396,7 @@ color = "#FF3542" self_consuming = TRUE chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/higadrite/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_STABLELIVER, type) - -/datum/reagent/medicine/higadrite/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_STABLELIVER, type) + metabolized_traits = list(TRAIT_STABLELIVER) /datum/reagent/medicine/cordiolis_hepatico name = "Cordiolis Hepatico" @@ -1474,6 +1417,7 @@ name = "Muscle Stimulant" description = "A potent chemical that allows someone under its influence to be at full physical ability even when under massive amounts of pain." chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + metabolized_traits = list(TRAIT_ANALGESIA) /datum/reagent/medicine/muscle_stimulant/on_mob_metabolize(mob/living/affected_mob) . = ..() @@ -1494,14 +1438,7 @@ var/overdose_progress = 0 // to track overdose progress ph = 7.89 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/modafinil/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_SLEEPIMMUNE, type) - -/datum/reagent/medicine/modafinil/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_SLEEPIMMUNE, type) + metabolized_traits = list(TRAIT_SLEEPIMMUNE) /datum/reagent/medicine/modafinil/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) . = ..() @@ -1565,14 +1502,7 @@ overdose_threshold = 30 ph = 9.12 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/psicodine/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_FEARLESS, type) - -/datum/reagent/medicine/psicodine/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_FEARLESS, type) + metabolized_traits = list(TRAIT_FEARLESS) /datum/reagent/medicine/psicodine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -1694,19 +1624,16 @@ /// For tracking when we tell the person we're no longer bleeding var/was_working chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_COAGULATING) /datum/reagent/medicine/coagulant/on_mob_metabolize(mob/living/affected_mob) . = ..() - ADD_TRAIT(affected_mob, TRAIT_COAGULATING, /datum/reagent/medicine/coagulant) - if(ishuman(affected_mob)) var/mob/living/carbon/human/blood_boy = affected_mob blood_boy.physiology?.bleed_mod *= passive_bleed_modifier /datum/reagent/medicine/coagulant/on_mob_end_metabolize(mob/living/affected_mob) . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_COAGULATING, /datum/reagent/medicine/coagulant) - if(was_working) to_chat(affected_mob, span_warning("The medicine thickening your blood loses its effect!")) if(ishuman(affected_mob)) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 148894386f893..188fbfe622ec9 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -347,6 +347,7 @@ ph = 7.5 //God is alkaline chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_CLEANS|REAGENT_UNAFFECTED_BY_METABOLISM // Operates at fixed metabolism for balancing memes. default_container = /obj/item/reagent_containers/cup/glass/bottle/holywater + metabolized_traits = list(TRAIT_HOLY) /datum/glass_style/drinking_glass/holywater required_drink_type = /datum/reagent/water/holywater @@ -369,14 +370,6 @@ mytray.adjust_plant_health(round(volume * 0.1)) mytray.myseed?.adjust_instability(round(volume * 0.15)) -/datum/reagent/water/holywater/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_HOLY, type) - -/datum/reagent/water/holywater/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_HOLY, type) - /datum/reagent/water/holywater/on_mob_add(mob/living/affected_mob, amount) . = ..() if(IS_CULTIST(affected_mob)) @@ -2416,7 +2409,8 @@ /datum/reagent/magillitis/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() if((ishuman(affected_mob)) && current_cycle > 10) - affected_mob.gorillize() + var/mob/living/basic/gorilla/new_gorilla = affected_mob.gorillize() + new_gorilla.AddComponent(/datum/component/regenerator, regeneration_delay = 12 SECONDS, brute_per_second = 1.5, outline_colour = COLOR_PALE_GREEN) /datum/reagent/growthserum name = "Growth Serum" @@ -2507,14 +2501,7 @@ metabolization_rate = 0.25 * REAGENTS_METABOLISM ph = 15 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/pax/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_PACIFISM, type) - -/datum/reagent/pax/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_PACIFISM, type) + metabolized_traits = list(TRAIT_PACIFISM) /datum/reagent/bz_metabolites name = "BZ Metabolites" @@ -2523,19 +2510,12 @@ taste_description = "acrid cinnamon" metabolization_rate = 0.2 * REAGENTS_METABOLISM chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/bz_metabolites/on_mob_metabolize(mob/living/ling) - . = ..() - ADD_TRAIT(ling, TRAIT_CHANGELING_HIVEMIND_MUTE, type) - -/datum/reagent/bz_metabolites/on_mob_end_metabolize(mob/living/ling) - . = ..() - REMOVE_TRAIT(ling, TRAIT_CHANGELING_HIVEMIND_MUTE, type) + metabolized_traits = list(TRAIT_CHANGELING_HIVEMIND_MUTE) /datum/reagent/bz_metabolites/on_mob_life(mob/living/carbon/target, seconds_per_tick, times_fired) . = ..() if(target.mind) - var/datum/antagonist/changeling/changeling = target.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(target) if(changeling) changeling.adjust_chemicals(-2 * REM * seconds_per_tick) @@ -2767,6 +2747,7 @@ metabolization_rate = 0.75 * REAGENTS_METABOLISM // 5u (WOUND_DETERMINATION_CRITICAL) will last for ~34 seconds chemical_flags = REAGENT_CAN_BE_SYNTHESIZED self_consuming = TRUE + metabolized_traits = list(TRAIT_ANALGESIA) /// Whether we've had at least WOUND_DETERMINATION_SEVERE (2.5u) of determination at any given time. No damage slowdown immunity or indication we're having a second wind if it's just a single moderate wound var/significant = FALSE @@ -2858,10 +2839,16 @@ taste_description = "tiny legs scuttling down the back of your throat" metabolization_rate = 5 * REAGENTS_METABOLISM //1u per second ph = 4.6 // Ants contain Formic Acid - /// How much damage the ants are going to be doing (rises with each tick the ants are in someone's body) - var/ant_damage = 0 + /// Number of ticks the ants have been in the person's body + var/ant_ticks = 0 + /// Amount of damage done per tick the ants have been in the person's system + var/ant_damage = 0.025 /// Tells the debuff how many ants we are being covered with. var/amount_left = 0 + /// Decal to spawn when spilled + var/ants_decal = /obj/effect/decal/cleanable/ants + /// Status effect applied by splashing ants + var/status_effect = /datum/status_effect/ants /// List of possible common statements to scream when eating ants var/static/list/ant_screams = list( "THEY'RE UNDER MY SKIN!!", @@ -2878,15 +2865,15 @@ /datum/reagent/ants/on_mob_life(mob/living/carbon/victim, seconds_per_tick) . = ..() - victim.adjustBruteLoss(max(0.1, round((ant_damage * 0.025),0.1))) //Scales with time. Roughly 32 brute with 100u. - ant_damage++ - if(ant_damage < 5) // Makes ant food a little more appetizing, since you won't be screaming as much. + victim.adjustBruteLoss(max(0.1, round((ant_ticks * ant_damage),0.1))) //Scales with time. Roughly 32 brute with 100u. + ant_ticks++ + if(ant_ticks < 5) // Makes ant food a little more appetizing, since you won't be screaming as much. return if(SPT_PROB(5, seconds_per_tick)) if(SPT_PROB(5, seconds_per_tick)) //Super rare statement - victim.say("AUGH NO NOT THE ANTS! NOT THE ANTS! AAAAUUGH THEY'RE IN MY EYES! MY EYES! AUUGH!!", forced = /datum/reagent/ants) + victim.say("AUGH NO NOT THE ANTS! NOT THE ANTS! AAAAUUGH THEY'RE IN MY EYES! MY EYES! AUUGH!!", forced = type) else - victim.say(pick(ant_screams), forced = /datum/reagent/ants) + victim.say(pick(ant_screams), forced = type) if(SPT_PROB(15, seconds_per_tick)) victim.emote("scream") if(SPT_PROB(2, seconds_per_tick)) // Stuns, but purges ants. @@ -2894,8 +2881,8 @@ /datum/reagent/ants/on_mob_end_metabolize(mob/living/living_anthill) . = ..() - ant_damage = 0 - to_chat(living_anthill, "You feel like the last of the ants are out of your system.") + ant_ticks = 0 + to_chat(living_anthill, span_notice("You feel like the last of the [name] are out of your system.")) /datum/reagent/ants/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -2903,7 +2890,7 @@ return if(methods & (PATCH|TOUCH|VAPOR)) amount_left = round(reac_volume,0.1) - exposed_mob.apply_status_effect(/datum/status_effect/ants, amount_left) + exposed_mob.apply_status_effect(status_effect, amount_left) /datum/reagent/ants/expose_obj(obj/exposed_obj, reac_volume) . = ..() @@ -2922,14 +2909,28 @@ if((reac_volume <= 10)) // Makes sure people don't duplicate ants. return - var/obj/effect/decal/cleanable/ants/pests = exposed_turf.spawn_unique_cleanable(/obj/effect/decal/cleanable/ants) + var/obj/effect/decal/cleanable/ants/pests = exposed_turf.spawn_unique_cleanable(ants_decal) if(!pests) return var/spilled_ants = (round(reac_volume,1) - 5) // To account for ant decals giving 3-5 ants on initialize. - pests.reagents.add_reagent(/datum/reagent/ants, spilled_ants) + pests.reagents.add_reagent(type, spilled_ants) pests.update_ant_damage() +/datum/reagent/ants/fire + name = "Fire ants" + description = "A rare mutation of space ants, born from the heat of a plasma fire. Their bites land a 3.7 on the Schmidt Pain Scale." + color = "#b51f1f" + taste_description = "tiny flaming legs scuttling down the back of your throat" + ant_damage = 0.05 // Roughly 64 brute with 100u + ants_decal = /obj/effect/decal/cleanable/ants/fire + status_effect = /datum/status_effect/ants/fire + +/datum/glass_style/drinking_glass/fire_ants + required_drink_type = /datum/reagent/ants/fire + name = "glass of fire ants" + desc = "This is a terrible idea." + //This is intended to a be a scarce reagent to gate certain drugs and toxins with. Do not put in a synthesizer. Renewable sources of this reagent should be inefficient. /datum/reagent/lead name = "Lead" @@ -3035,6 +3036,7 @@ addtimer(CALLBACK(exposed_obj, TYPE_PROC_REF(/atom/movable/, remove_haunted), HAUNTIUM_REAGENT_TRAIT), volume * 20 SECONDS) /datum/reagent/hauntium/on_mob_metabolize(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() to_chat(affected_mob, span_userdanger("You feel an evil presence inside you!")) if(affected_mob.mob_biotypes & MOB_UNDEAD || HAS_MIND_TRAIT(affected_mob, TRAIT_MORBID)) affected_mob.add_mood_event("morbid_hauntium", /datum/mood_event/morbid_hauntium, name) //8 minutes of slight mood buff if undead or morbid diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 7457acd0687b9..e9bea91fbed64 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -295,14 +295,7 @@ taste_description = "death" ph = 14.5 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/toxin/ghoulpowder/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_FAKEDEATH, type) - -/datum/reagent/toxin/ghoulpowder/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_FAKEDEATH, type) + metabolized_traits = list(TRAIT_FAKEDEATH) /datum/reagent/toxin/ghoulpowder/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -321,14 +314,7 @@ inverse_chem = /datum/reagent/impurity/rosenol chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/hallucinogens = 18) //7.2 per 2 seconds - -/datum/reagent/toxin/mindbreaker/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_RDS_SUPPRESSED, type) - -/datum/reagent/toxin/mindbreaker/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_RDS_SUPPRESSED, type) + metabolized_traits = list(TRAIT_RDS_SUPPRESSED) /datum/reagent/toxin/mindbreaker/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -848,14 +834,7 @@ metabolization_rate = 0.75 * REAGENTS_METABOLISM toxpwr = 0 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/toxin/sodium_thiopental/on_mob_add(mob/living/affected_mob, amount) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_ANTICONVULSANT, name) - -/datum/reagent/toxin/sodium_thiopental/on_mob_delete(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_ANTICONVULSANT, name) + added_traits = list(TRAIT_ANTICONVULSANT) /datum/reagent/toxin/sodium_thiopental/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -1000,20 +979,13 @@ toxpwr = 0 ph = 11.6 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_BLOODY_MESS) /datum/reagent/toxin/heparin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(holder.has_reagent(/datum/reagent/medicine/coagulant)) //Directly purges coagulants from the system. Get rid of the heparin BEFORE attempting to use coagulants. holder.remove_reagent(/datum/reagent/medicine/coagulant, 2 * REM * seconds_per_tick) return ..() -/datum/reagent/toxin/heparin/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_BLOODY_MESS, /datum/reagent/toxin/heparin) - -/datum/reagent/toxin/heparin/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_BLOODY_MESS, /datum/reagent/toxin/heparin) - /datum/reagent/toxin/rotatium //Rotatium. Fucks up your rotation and is hilarious name = "Rotatium" description = "A constantly swirling, oddly colourful fluid. Causes the consumer's sense of direction and hand-eye coordination to become wild." @@ -1184,14 +1156,7 @@ ph = 1.7 taste_description = "stillness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/toxin/mimesbane/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_EMOTEMUTE, type) - -/datum/reagent/toxin/mimesbane/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - REMOVE_TRAIT(affected_mob, TRAIT_EMOTEMUTE, type) + metabolized_traits = list(TRAIT_EMOTEMUTE) /datum/reagent/toxin/bonehurtingjuice //oof ouch name = "Bone Hurting Juice" diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 8e74b0ad6f869..bc41e25090bf1 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -194,7 +194,7 @@ beeagents += R var/bee_amount = round(created_volume * 0.2) for(var/i in 1 to bee_amount) - var/mob/living/basic/bee/short/new_bee = new(location) + var/mob/living/basic/bee/timed/new_bee = new(location) if(LAZYLEN(beeagents)) new_bee.assign_reagent(pick(beeagents)) @@ -419,7 +419,7 @@ determin_ph_range = 6 temp_exponent_factor = 0.5 ph_exponent_factor = 1 - thermic_constant = -7.5 + thermic_constant = -1.5 H_ion_release = 0 rate_up_lim = 10 purity_min = 0.2 diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index ed334adeac036..bdb104a1cfe0b 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -125,6 +125,7 @@ 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) else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume) @@ -137,6 +138,7 @@ 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() diff --git a/code/modules/reagents/reagent_containers/cups/drinkingglass.dm b/code/modules/reagents/reagent_containers/cups/drinkingglass.dm index 8745e61cd9236..adcd2ff79fab9 100644 --- a/code/modules/reagents/reagent_containers/cups/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/cups/drinkingglass.dm @@ -30,6 +30,7 @@ CALLBACK(src, PROC_REF(on_cup_reset)), \ base_container_type = base_container_type, \ ) + RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_cleaned)) /obj/item/reagent_containers/cup/glass/drinkingglass/on_reagent_change(datum/reagents/holder, ...) . = ..() @@ -46,6 +47,22 @@ . = ..() fill_icon_thresholds ||= list(0) +/obj/item/reagent_containers/cup/glass/drinkingglass/examine(mob/user) + . = ..() + if(HAS_TRAIT(src, TRAIT_WAS_RENAMED)) + . += span_notice("This glass has been given a custom name. It can be removed by washing it.") + +/obj/item/reagent_containers/cup/glass/drinkingglass/proc/on_cleaned(obj/source_component, obj/source) + SIGNAL_HANDLER + if(!HAS_TRAIT(src, TRAIT_WAS_RENAMED)) + return + + REMOVE_TRAIT(src, TRAIT_WAS_RENAMED, SHAKER_LABEL_TRAIT) + REMOVE_TRAIT(src, TRAIT_WAS_RENAMED, PEN_LABEL_TRAIT) + name = initial(name) + desc = initial(desc) + update_appearance(UPDATE_NAME | UPDATE_DESC) + //Shot glasses!// // This lets us add shots in here instead of lumping them in with drinks because >logic // // The format for shots is the exact same as iconstates for the drinking glass, except you use a shot glass instead. // diff --git a/code/modules/reagents/reagent_containers/cups/drinks.dm b/code/modules/reagents/reagent_containers/cups/drinks.dm index 12a3d023c72ca..cba2f937da49f 100644 --- a/code/modules/reagents/reagent_containers/cups/drinks.dm +++ b/code/modules/reagents/reagent_containers/cups/drinks.dm @@ -426,6 +426,7 @@ // itself), in Chemistry-Recipes.dm (for the reaction that changes the components into the drink), and here (for the drinking glass // icon states. + /obj/item/reagent_containers/cup/glass/shaker name = "shaker" desc = "A metal shaker to mix drinks in." @@ -435,14 +436,86 @@ amount_per_transfer_from_this = 10 volume = 100 isGlass = FALSE + /// Whether or not poured drinks should use custom names and descriptions + var/using_custom_drinks = FALSE + /// Name custom drinks will have + var/custom_drink_name = "Custom drink" + /// Description custom drinks will have + var/custom_drink_desc = "Mixed by your favourite bartender!" /obj/item/reagent_containers/cup/glass/shaker/Initialize(mapload) . = ..() + register_context() if(prob(10)) name = "\improper Nanotrasen 20th Anniversary Shaker" desc += " It has an emblazoned Nanotrasen logo on it." icon_state = "shaker_n" +/obj/item/reagent_containers/cup/glass/shaker/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + context[SCREENTIP_CONTEXT_ALT_LMB] = "[using_custom_drinks ? "Disable" : "Enable"] custom drinks" + return CONTEXTUAL_SCREENTIP_SET + +/obj/item/reagent_containers/cup/glass/shaker/examine(mob/user) + . = ..() + . += span_notice("Alt-click to [using_custom_drinks ? "disable" : "enable"] custom drink naming") + if(using_custom_drinks) + . += span_notice("Drinks poured from this shaker will have the following name: [custom_drink_name]") + . += span_notice("Drinks poured from this shaker will have the following description: [custom_drink_desc]") + +/obj/item/reagent_containers/cup/glass/shaker/AltClick(mob/user) + . = ..() + if(!user.can_perform_action(src, NEED_HANDS|FORBID_TELEKINESIS_REACH)) + return + + if(using_custom_drinks) + using_custom_drinks = FALSE + disable_custom_drinks() + balloon_alert(user, "custom drinks disabled") + return + + var/new_name = reject_bad_text(tgui_input_text(user, "Drink name", "Set drink name", custom_drink_name, 45, FALSE), 64) + if(!new_name) + balloon_alert(user, "invalid drink name!") + using_custom_drinks = FALSE + return + + if(!user.can_perform_action(src, NEED_HANDS|FORBID_TELEKINESIS_REACH)) + return + + var/new_desc = reject_bad_text(tgui_input_text(user, "Drink description", "Set drink description", custom_drink_desc, 64, TRUE), 128) + if(!new_desc) + balloon_alert(user, "invalid drink description!") + using_custom_drinks = FALSE + return + + if(!user.can_perform_action(src, NEED_HANDS|FORBID_TELEKINESIS_REACH)) + return + + using_custom_drinks = TRUE + custom_drink_name = new_name + custom_drink_desc = new_desc + + enable_custom_drinks() + balloon_alert(user, "now pouring custom drinks") + +/obj/item/reagent_containers/cup/glass/shaker/proc/enable_custom_drinks() + RegisterSignal(src, COMSIG_REAGENTS_CUP_TRANSFER_TO, PROC_REF(handle_transfer)) + +/obj/item/reagent_containers/cup/glass/shaker/proc/disable_custom_drinks() + UnregisterSignal(src, COMSIG_REAGENTS_CUP_TRANSFER_TO) + +/obj/item/reagent_containers/cup/glass/shaker/proc/handle_transfer(atom/origin, atom/target) + SIGNAL_HANDLER + // Should only work on drinking/shot glasses + if(!istype(target, /obj/item/reagent_containers/cup/glass/drinkingglass)) + return + + var/obj/item/reagent_containers/cup/glass/drinkingglass/target_glass = target + target_glass.name = custom_drink_name + target_glass.desc = custom_drink_desc + ADD_TRAIT(target_glass, TRAIT_WAS_RENAMED, SHAKER_LABEL_TRAIT) + /obj/item/reagent_containers/cup/glass/flask name = "flask" desc = "Every good spaceman knows it's a good idea to bring along a couple of pints of whiskey wherever they go." diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm index 83754dd571f3e..9deb658250856 100644 --- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm +++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm @@ -82,7 +82,7 @@ var/obj/item/bodypart/affecting = user.zone_selected //Find what the player is aiming at var/armor_block = 0 //Get the target's armor values for normal attack damage. - var/armor_duration = 0 //The more force the bottle has, the longer the duration. + var/knockdown_effectiveness = 0 //The more force the bottle has, the longer the duration. //Calculating duration and calculating damage. if(ishuman(target)) @@ -95,23 +95,23 @@ if(istype(H.head, /obj/item/clothing/head) && affecting == BODY_ZONE_HEAD) headarmor = H.head.get_armor_rating(MELEE) //Calculate the knockdown duration for the target. - armor_duration = (bottle_knockdown_duration - headarmor) + force + knockdown_effectiveness = (bottle_knockdown_duration - headarmor) + force else //Only humans can have armor, right? armor_block = living_target.run_armor_check(affecting, MELEE) if(affecting == BODY_ZONE_HEAD) - armor_duration = bottle_knockdown_duration + force + knockdown_effectiveness = bottle_knockdown_duration + force //Apply the damage! armor_block = min(90,armor_block) living_target.apply_damage(force, BRUTE, affecting, armor_block) // You are going to knock someone down for longer if they are not wearing a helmet. var/head_attack_message = "" - if(affecting == BODY_ZONE_HEAD && iscarbon(target)) + if(affecting == BODY_ZONE_HEAD && iscarbon(target) && !HAS_TRAIT(target, TRAIT_HEAD_INJURY_BLOCKED)) head_attack_message = " on the head" - if(armor_duration) - living_target.apply_effect(min(armor_duration, 200) , EFFECT_KNOCKDOWN) + if(knockdown_effectiveness && prob(knockdown_effectiveness)) + living_target.apply_effect(min(knockdown_effectiveness, 200) , EFFECT_KNOCKDOWN) //Display an attack message. if(target != user) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index af246ae6e67dd..4cbb4839416c3 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -352,3 +352,11 @@ volume = 15 amount_per_transfer_from_this = 15 list_reagents = list(/datum/reagent/medicine/mutadone = 15) + +/obj/item/reagent_containers/hypospray/medipen/penthrite + name = "penthrite autoinjector" + desc = "Experimental heart medication." + icon_state = "atropen" + inhand_icon_state = "atropen" + base_icon_state = "atropen" + list_reagents = list(/datum/reagent/medicine/c2/penthrite = 10) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 4366482460e77..3bff3a3abbabe 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -267,6 +267,12 @@ list_reagents = list((toxin_to_get) = 5) return ..() +/obj/item/reagent_containers/syringe/crude/mushroom + list_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 5) + +/obj/item/reagent_containers/syringe/crude/blastoff + list_reagents = list(/datum/reagent/drug/blastoff = 5) + /obj/item/reagent_containers/syringe/spider_extract name = "spider extract syringe" desc = "Contains crikey juice - makes any gold core create the most deadly companions in the world." diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index 14108f22bd93d..cb008252037a1 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -92,6 +92,10 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) if(.) set_operating(TRUE) +/obj/machinery/conveyor/auto/inverted + icon_state = "conveyor_map_inverted" + flipped = TRUE + // create a conveyor /obj/machinery/conveyor/Initialize(mapload, new_dir, new_id) ..() diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 47f477382e491..78ffff197bce8 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -276,20 +276,18 @@ H.vent_gas(loc) qdel(H) -/obj/machinery/disposal/deconstruct(disassembled = TRUE) +/obj/machinery/disposal/on_deconstruction(disassembled) var/turf/T = loc - if(!(obj_flags & NO_DECONSTRUCTION)) - if(stored) - var/obj/structure/disposalconstruct/construct = stored - stored = null - construct.forceMove(T) - transfer_fingerprints_to(construct) - construct.set_anchored(FALSE) - construct.set_density(TRUE) - construct.update_appearance() + if(stored) + var/obj/structure/disposalconstruct/construct = stored + stored = null + construct.forceMove(T) + transfer_fingerprints_to(construct) + construct.set_anchored(FALSE) + construct.set_density(TRUE) + construct.update_appearance() for(var/atom/movable/AM in src) //out, out, darned crowbar! AM.forceMove(T) - ..() ///How disposal handles getting a storage dump from a storage object /obj/machinery/disposal/proc/on_storage_dump(datum/source, datum/storage/storage, mob/user) @@ -307,6 +305,16 @@ to_dump.pixel_x = to_dump.base_pixel_x + rand(-5, 5) to_dump.pixel_y = to_dump.base_pixel_y + rand(-5, 5) +/obj/machinery/disposal/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + . = ..() + visible_message(span_warning("[src] is ripped free from the floor!")) + deconstruct() + +/obj/machinery/disposal/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + . = ..() + visible_message(span_warning("[src] is ripped free from the floor!")) + deconstruct() + // Disposal bin // Holds items for disposal into pipe system // Draws air from turf, gradually charges internal reservoir @@ -318,6 +326,7 @@ name = "disposal unit" desc = "A pneumatic waste disposal unit." icon_state = "disposal" + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_IGNORE_MOBILITY // attack by item places it in to disposal /obj/machinery/disposal/bin/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index b1556ca679f88..4b8fef129244e 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -33,12 +33,12 @@ pipename = initial(pipe_type.name) - AddComponent(/datum/component/simple_rotation, AfterRotation = CALLBACK(src, PROC_REF(AfterRotation))) + AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) if(flip) var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation) - rotcomp.Rotate(usr, ROTATION_FLIP) // this only gets used by pipes created by RPDs or pipe dispensers + rotcomp.rotate(usr, ROTATION_FLIP) // this only gets used by pipes created by RPDs or pipe dispensers update_appearance(UPDATE_ICON) @@ -86,7 +86,7 @@ dpdir |= REVERSE_DIR(dir) return dpdir -/obj/structure/disposalconstruct/proc/AfterRotation(mob/user, degrees) +/obj/structure/disposalconstruct/proc/post_rotation(mob/user, degrees) if(degrees == ROTATION_FLIP) var/obj/structure/disposalpipe/temp = pipe_type if(initial(temp.flip_type)) diff --git a/code/modules/recycling/disposal/outlet.dm b/code/modules/recycling/disposal/outlet.dm index 4fa9f1e0aab15..6773e574d3542 100644 --- a/code/modules/recycling/disposal/outlet.dm +++ b/code/modules/recycling/disposal/outlet.dm @@ -137,6 +137,24 @@ eject_range = EJECT_RANGE_YEET return TRUE +/obj/structure/disposaloutlet/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + . = ..() + if(!isnull(stored)) + stored.forceMove(loc) + transfer_fingerprints_to(stored) + stored = null + visible_message(span_warning("[src] is ripped free from the floor!")) + qdel(src) + +/obj/structure/disposaloutlet/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + . = ..() + if(!isnull(stored)) + stored.forceMove(loc) + transfer_fingerprints_to(stored) + stored = null + visible_message(span_warning("[src] is ripped free from the floor!")) + qdel(src) + #undef EJECT_SPEED_SLOW #undef EJECT_SPEED_MED #undef EJECT_SPEED_FAST diff --git a/code/modules/research/anomaly/anomaly_refinery.dm b/code/modules/research/anomaly/anomaly_refinery.dm index 533443a199557..1805a25231833 100644 --- a/code/modules/research/anomaly/anomaly_refinery.dm +++ b/code/modules/research/anomaly/anomaly_refinery.dm @@ -295,7 +295,7 @@ return FALSE tank_to_target = (tank_to_target == inserted_bomb.tank_one) ? inserted_bomb.tank_two : inserted_bomb.tank_one -/obj/machinery/research/anomaly_refinery/on_deconstruction() +/obj/machinery/research/anomaly_refinery/on_deconstruction(disassembled) eject_bomb() eject_core() return ..() diff --git a/code/modules/research/designs/autolathe/service_designs.dm b/code/modules/research/designs/autolathe/service_designs.dm index cccef8e740dfa..6b8d7f474fca4 100644 --- a/code/modules/research/designs/autolathe/service_designs.dm +++ b/code/modules/research/designs/autolathe/service_designs.dm @@ -580,3 +580,14 @@ RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +/datum/design/barcode_scanner + name = "Barcode Scanner" + id = "barcode_scanner" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + build_path = /obj/item/barcodescanner + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SERVICE, + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 08c31feb06e87..0081fe052eca7 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -2049,6 +2049,17 @@ category = list( RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_ENGINEERING ) +/datum/design/module/mod_head_protection + name = "Safety-First Head Protection Module" + id = "mod_safety" + materials = list( + /datum/material/iron =SMALL_MATERIAL_AMOUNT*5, + /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/mod/module/headprotector + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_ENGINEERING + ) /datum/design/module/mod_t_ray name = "T-Ray Scanner Module" id = "mod_t_ray" diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 0b09edf44ac94..46e43b0ac6661 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -679,28 +679,64 @@ /datum/design/implant_chem name = "Chemical Implant Case" - desc = "A glass case containing an implant." + desc = "A glass case containing a chemical implant." id = "implant_chem" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/glass = SMALL_MATERIAL_AMOUNT*7) + materials = list(/datum/material/glass = SMALL_MATERIAL_AMOUNT * 7) build_path = /obj/item/implantcase/chem category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_MISC + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_SECURITY ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY | DEPARTMENT_BITFLAG_MEDICAL /datum/design/implant_tracking name = "Tracking Implant Case" - desc = "A glass case containing an implant." + desc = "A glass case containing a tracking implant." id = "implant_tracking" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5) build_path = /obj/item/implantcase/tracking category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_MISC + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_SECURITY ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY | DEPARTMENT_BITFLAG_MEDICAL +/datum/design/implant_beacon + name = "Beacon Implant Case" + desc = "A glass case containing a beacon implant." + id = "implant_beacon" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3) + build_path = /obj/item/implantcase/beacon + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_SECURITY + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + +/datum/design/implant_bluespace + name = "Bluespace Grounding Implant Case" + desc = "A glass case containing a teleport blocker implant." + id = "implant_bluespace" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3) + build_path = /obj/item/implantcase/teleport_blocker + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_SECURITY + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + +/datum/design/implant_exile + name = "Exile Implant Case" + desc = "A glass case containing an exile implant." + id = "implant_exile" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 3) + build_path = /obj/item/implantcase/exile + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_SECURITY + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + //Cybernetic organs /datum/design/cybernetic_liver diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index ae8f7e43a4078..e17b53da692fe 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -972,7 +972,7 @@ category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE /datum/design/stabilized_hook name = "Gyro-Stabilized Hook" @@ -984,7 +984,19 @@ category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/auto_reel + name = "Fishing Line Auto-Reel" + desc = "An advanced line reel which can be used speed up both fishing and casually snagging other items in your direction." + id = "auto_reel" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 4, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3) + build_path = /obj/item/fishing_line/auto_reel + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE /datum/design/fish_analyzer name = "Fish Analyzer" @@ -996,7 +1008,7 @@ category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE // Coffeemaker Stuff diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index e33a1a7f2ab28..00c7dba3946bd 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -204,6 +204,19 @@ departmental_flags = DEPARTMENT_BITFLAG_SECURITY autolathe_exportable = FALSE +/datum/design/ballistic_shield + name = "Ballistic Shield" + desc = "A heavy shield designed for blocking projectiles, weaker to melee." + id = "ballistic_shield" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, /datum/material/titanium =SHEET_MATERIAL_AMOUNT) + build_path = /obj/item/shield/ballistic + category = list( + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_MELEE + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + autolathe_exportable = FALSE + /datum/design/beamrifle name = "Beam Marksman Rifle Part Kit (Lethal)" desc = "The gunkit for a powerful long ranged anti-material rifle that fires charged particle beams to obliterate targets." diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 72fd12ced7046..e9e34bfd806f0 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -14,16 +14,29 @@ base_icon_state = "d_analyzer" circuit = /obj/item/circuitboard/machine/destructive_analyzer -/obj/machinery/rnd/destructive_analyzer/Initialize(mapload) +/obj/machinery/rnd/destructive_analyzer/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() - register_context() -/obj/machinery/rnd/destructive_analyzer/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + var/screentip_set = FALSE if(loaded_item) context[SCREENTIP_CONTEXT_ALT_LMB] = "Remove Item" + screentip_set = TRUE else if(!isnull(held_item)) context[SCREENTIP_CONTEXT_LMB] = "Insert Item" - return CONTEXTUAL_SCREENTIP_SET + screentip_set = TRUE + + if(screentip_set) + . = CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/rnd/destructive_analyzer/examine(mob/user) + . = ..() + if(!in_range(user, src) && !isobserver(user)) + return + + if(loaded_item) + . += span_notice("[EXAMINE_HINT("Left-Click")] to remove loaded item inside.") + else + . += span_notice("An item can be loaded inside via [EXAMINE_HINT("Left-Click")].") /obj/machinery/rnd/destructive_analyzer/attackby(obj/item/weapon, mob/living/user, params) if(user.combat_mode) diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index dd282040ab04c..f95145b4b9406 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -1,38 +1,38 @@ /obj/machinery/rnd/production name = "technology fabricator" desc = "Makes researched and prototype items with materials and energy." - layer = BELOW_OBJ_LAYER /// The efficiency coefficient. Material costs and print times are multiplied by this number; - /// better parts result in a higher efficiency (and lower value). var/efficiency_coeff = 1 - /// The material storage used by this fabricator. var/datum/component/remote_materials/materials - /// Which departments are allowed to process this design var/allowed_department_flags = ALL - - /// What's flick()'d on print. + /// Icon state when production has started var/production_animation - /// The types of designs this fabricator can print. var/allowed_buildtypes = NONE - /// All designs in the techweb that can be fabricated by this machine, since the last update. var/list/datum/design/cached_designs - /// What color is this machine's stripe? Leave null to not have a stripe. var/stripe_color = null - - /// Does this charge the user's ID on fabrication? - var/charges_tax = TRUE + ///direction we output onto (if 0, on top of us) + var/drop_direction = 0 /obj/machinery/rnd/production/Initialize(mapload) . = ..() cached_designs = list() - materials = AddComponent(/datum/component/remote_materials, mapload) + + materials = AddComponent( + /datum/component/remote_materials, \ + mapload, \ + mat_container_signals = list( \ + COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/rnd, local_material_insert) + ) \ + ) + + RegisterSignal(src, COMSIG_SILO_ITEM_CONSUMED, TYPE_PROC_REF(/obj/machinery/rnd/production, silo_material_insert)) AddComponent( /datum/component/payment, \ @@ -42,9 +42,48 @@ TRUE, \ ) - RefreshParts() update_icon(UPDATE_OVERLAYS) +/obj/machinery/rnd/production/Destroy() + materials = null + cached_designs = null + return ..() + + +// Stuff for the stripe on the department machines +/obj/machinery/rnd/production/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) + . = ..() + + update_icon(UPDATE_OVERLAYS) + +/obj/machinery/rnd/production/update_overlays() + . = ..() + + if(!stripe_color) + return + + var/mutable_appearance/stripe = mutable_appearance('icons/obj/machines/research.dmi', "protolathe_stripe[panel_open ? "_t" : ""]") + stripe.color = stripe_color + . += stripe + +/obj/machinery/rnd/production/examine(mob/user) + . = ..() + if(!in_range(user, src) && !isobserver(user)) + return + + . += span_notice("Material usage cost at [efficiency_coeff * 100]%") + if(drop_direction) + . += span_notice("Currently configured to drop printed objects [dir2text(drop_direction)].") + . += span_notice("[EXAMINE_HINT("Alt-click")] to reset.") + else + . += span_notice("[EXAMINE_HINT("Drag")] towards a direction (while next to it) to change drop direction.") + +/obj/machinery/rnd/production/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(drop_direction) + context[SCREENTIP_CONTEXT_ALT_LMB] = "Reset Drop" + return CONTEXTUAL_SCREENTIP_SET + /obj/machinery/rnd/production/connect_techweb(datum/techweb/new_techweb) if(stored_research) UnregisterSignal(stored_research, list(COMSIG_TECHWEB_ADD_DESIGN, COMSIG_TECHWEB_REMOVE_DESIGN)) @@ -55,24 +94,14 @@ RegisterSignals( stored_research, list(COMSIG_TECHWEB_ADD_DESIGN, COMSIG_TECHWEB_REMOVE_DESIGN), - PROC_REF(on_techweb_update) + TYPE_PROC_REF(/obj/machinery/rnd/production, on_techweb_update) ) update_designs() -/obj/machinery/rnd/production/Destroy() - materials = null - cached_designs = null - return ..() - -/obj/machinery/rnd/production/proc/on_techweb_update() - SIGNAL_HANDLER - - // We're probably going to get more than one update (design) at a time, so batch - // them together. - addtimer(CALLBACK(src, PROC_REF(update_designs)), 2 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) - /// Updates the list of designs this fabricator can print. /obj/machinery/rnd/production/proc/update_designs() + PROTECTED_PROC(TRUE) + var/previous_design_count = cached_designs.len cached_designs.Cut() @@ -91,12 +120,100 @@ update_static_data_for_all_viewers() +/obj/machinery/rnd/production/proc/on_techweb_update() + SIGNAL_HANDLER + + // We're probably going to get more than one update (design) at a time, so batch + // them together. + addtimer(CALLBACK(src, PROC_REF(update_designs)), 2 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + +///When materials are instered via silo link +/obj/machinery/rnd/proc/silo_material_insert(obj/machinery/rnd/machine, container, obj/item/item_inserted, last_inserted_id, list/mats_consumed, amount_inserted) + SIGNAL_HANDLER + + process_item(item_inserted, mats_consumed, amount_inserted) + +/** + * Consumes power for the item inserted either into silo or local storage. + * Arguments + * + * * obj/item/item_inserted - the item to process + * * list/mats_consumed - list of mats consumed + * * amount_inserted - amount of material actually processed + */ +/obj/machinery/rnd/proc/process_item(obj/item/item_inserted, list/mats_consumed, amount_inserted) + PRIVATE_PROC(TRUE) + + //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it + if(directly_use_power(ROUND_UP((amount_inserted / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * 0.01 * initial(active_power_usage)))) + var/mat_name = "iron" + + var/highest_mat = 0 + for(var/datum/material/mat as anything in mats_consumed) + var/present_mat = mats_consumed[mat] + if(present_mat > highest_mat) + mat_name = initial(mat.name) + if(mat_name == "silver" || mat_name == "titanium" || mat_name == "plastic") //these materials have similar appearances so use an common overlay for them + mat_name = "shiny" + highest_mat = present_mat + + flick_animation(mat_name) +/** + * Plays an visual animation when materials are inserted + * Arguments + * + * * mat_name - the name of the material we are trying to animate on the machine + */ +/obj/machinery/rnd/proc/flick_animation(mat_name) + PROTECTED_PROC(TRUE) + SHOULD_CALL_PARENT(FALSE) + + flick_overlay_view(mutable_appearance('icons/obj/machines/research.dmi', "protolathe_[mat_name]"), 1 SECONDS) + +///When materials are instered into local storage +/obj/machinery/rnd/proc/local_material_insert(container, obj/item/item_inserted, last_inserted_id, list/mats_consumed, amount_inserted, atom/context) + SIGNAL_HANDLER + + process_item(item_inserted, mats_consumed, amount_inserted) + /obj/machinery/rnd/production/RefreshParts() . = ..() - calculate_efficiency() + if(materials) + var/total_storage = 0 + for(var/datum/stock_part/matter_bin/bin in component_parts) + total_storage += bin.tier * 37.5 * SHEET_MATERIAL_AMOUNT + materials.set_local_size(total_storage) + + efficiency_coeff = compute_efficiency() + update_static_data_for_all_viewers() +///Computes this machines cost efficiency based on the available parts +/obj/machinery/rnd/production/proc/compute_efficiency() + PROTECTED_PROC(TRUE) + + var/efficiency = 1.2 + for(var/datum/stock_part/servo/servo in component_parts) + efficiency -= servo.tier * 0.1 + + return efficiency + +/** + * The cost efficiency for an particular design + * Arguments + * + * * path - the design path to check for + */ +/obj/machinery/rnd/production/proc/build_efficiency(path) + PRIVATE_PROC(TRUE) + SHOULD_BE_PURE(TRUE) + + if(ispath(path, /obj/item/stack/sheet) || ispath(path, /obj/item/stack/ore/bluespace_crystal)) + return 1 + else + return efficiency_coeff + /obj/machinery/rnd/production/ui_assets(mob/user) return list( get_asset_datum(/datum/asset/spritesheet/sheetmaterials), @@ -117,16 +234,13 @@ var/datum/asset/spritesheet/research_designs/spritesheet = get_asset_datum(/datum/asset/spritesheet/research_designs) var/size32x32 = "[spritesheet.name]32x32" - var/max_multiplier = INFINITY var/coefficient for(var/datum/design/design in cached_designs) var/cost = list() - max_multiplier = INFINITY coefficient = build_efficiency(design.build_path) for(var/datum/material/mat in design.materials) cost[mat.name] = OPTIMAL_COST(design.materials[mat] * coefficient) - max_multiplier = min(max_multiplier, 50, round(materials.mat_container.get_material_amount(mat) / cost[mat.name])) var/icon_size = spritesheet.icon_size_id(design.id) designs[design.id] = list( @@ -135,9 +249,7 @@ "cost" = cost, "id" = design.id, "categories" = design.category, - "icon" = "[icon_size == size32x32 ? "" : "[icon_size] "][design.id]", - "constructionTime" = 0, - "maxmult" = max_multiplier + "icon" = "[icon_size == size32x32 ? "" : "[icon_size] "][design.id]" ) data["designs"] = designs @@ -158,141 +270,131 @@ /obj/machinery/rnd/production/ui_act(action, list/params, datum/tgui/ui) . = ..() - if(.) return - . = TRUE - switch (action) if("remove_mat") var/datum/material/material = locate(params["ref"]) - var/amount = text2num(params["amount"]) - // SAFETY: eject_sheets checks for valid mats - materials.eject_sheets(material, amount) - - if("build") - user_try_print_id(ui.user, params["ref"], params["amount"]) - -/// Updates the fabricator's efficiency coefficient based on the installed parts. -/obj/machinery/rnd/production/proc/calculate_efficiency() - efficiency_coeff = 1 - - if(materials) - var/total_storage = 0 - - for(var/datum/stock_part/matter_bin/bin in component_parts) - total_storage += bin.tier * (37.5*SHEET_MATERIAL_AMOUNT) - - materials.set_local_size(total_storage) - - var/total_rating = 1.2 - - for(var/datum/stock_part/servo/servo in component_parts) - total_rating -= servo.tier * 0.1 - - efficiency_coeff = max(total_rating, 0) - -/obj/machinery/rnd/production/proc/build_efficiency(path) - if(ispath(path, /obj/item/stack/sheet) || ispath(path, /obj/item/stack/ore/bluespace_crystal)) - return 1 - else - return efficiency_coeff - -/obj/machinery/rnd/production/proc/user_try_print_id(mob/user, design_id, print_quantity) - if(!design_id) - return FALSE - - if(istext(print_quantity)) - print_quantity = text2num(print_quantity) - - if(isnull(print_quantity)) - print_quantity = 1 - - var/datum/design/design = stored_research.researched_designs[design_id] ? SSresearch.techweb_design_by_id(design_id) : null - - if(!istype(design)) - return FALSE - - if(busy) - say("Warning: fabricator is busy!") - return FALSE - - if(!(isnull(allowed_department_flags) || (design.departmental_flags & allowed_department_flags))) - say("This fabricator does not have the necessary keys to decrypt this design.") - return FALSE + if(!istype(material)) + return - if(design.build_type && !(design.build_type & allowed_buildtypes)) - say("This fabricator does not have the necessary manipulation systems for this design.") - return FALSE + var/amount = params["amount"] + if(isnull(amount)) + return - if(!materials.mat_container) - say("No connection to material storage, please contact the quartermaster.") - return FALSE + amount = text2num(amount) + if(isnull(amount)) + return - if(materials.on_hold()) - say("Mineral access is on hold, please contact the quartermaster.") - return FALSE + //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it + if(!directly_use_power(ROUND_UP((amount / MAX_STACK_SIZE) * 0.01 * initial(active_power_usage)))) + say("No power to dispense sheets") + return - print_quantity = clamp(print_quantity, 1, 50) - var/coefficient = build_efficiency(design.build_path) - - // check if sufficient materials are available. - if(!materials.mat_container.has_materials(design.materials, coefficient, print_quantity)) - say("Not enough materials to complete prototype[print_quantity > 1 ? "s" : ""].") - return FALSE - - //use power - var/total_charge = 0 - for(var/material in design.materials) - total_charge += round(design.materials[material] * coefficient * print_quantity / 35) - var/charge_per_item = total_charge / print_quantity - - if(production_animation) - flick(production_animation, src) - - var/total_time = (design.construction_time * design.lathe_time_factor * print_quantity) ** 0.8 - var/time_per_item = total_time / print_quantity - start_making(design, print_quantity, time_per_item, coefficient, charge_per_item) - - return TRUE - -/// Begins the act of making the given design the given number of items -/// Does not check or use materials/power/etc -/obj/machinery/rnd/production/proc/start_making(datum/design/design, build_count, build_time_per_item, build_efficiency, charge_per_item) - PROTECTED_PROC(TRUE) - - busy = TRUE - update_static_data_for_all_viewers() - addtimer(CALLBACK(src, PROC_REF(do_make_item), design, build_efficiency, build_time_per_item, charge_per_item, build_count), build_time_per_item) + materials.eject_sheets(material, amount) + return TRUE -/// Callback for start_making, actually makes the item -/// Called using timers started by start_making -/obj/machinery/rnd/production/proc/do_make_item(datum/design/design, build_efficiency, time_per_item, charge_per_item, items_remaining) + if("build") + if(busy) + say("Warning: fabricator is busy!") + return + + //validate design + var/design_id = params["ref"] + if(!design_id) + return + var/datum/design/design = stored_research.researched_designs[design_id] ? SSresearch.techweb_design_by_id(design_id) : null + if(!istype(design)) + return FALSE + if(!(isnull(allowed_department_flags) || (design.departmental_flags & allowed_department_flags))) + say("This fabricator does not have the necessary keys to decrypt this design.") + return FALSE + if(design.build_type && !(design.build_type & allowed_buildtypes)) + say("This fabricator does not have the necessary manipulation systems for this design.") + return FALSE + + //validate print quantity + var/print_quantity = params["amount"] + if(isnull(print_quantity)) + return + print_quantity = text2num(print_quantity) + if(isnull(print_quantity)) + return + print_quantity = clamp(print_quantity, 1, 50) + + //efficiency for this design, stacks use exact materials + var/coefficient = build_efficiency(design.build_path) + + //check for materials + if(!materials.can_use_resource()) + return + if(!materials.mat_container.has_materials(design.materials, coefficient, print_quantity)) + say("Not enough materials to complete prototype[print_quantity > 1 ? "s" : ""].") + return FALSE + + //compute power & time to print 1 item + var/charge_per_item = 0 + for(var/material in design.materials) + charge_per_item += design.materials[material] + charge_per_item = ROUND_UP((charge_per_item / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * coefficient * 0.05 * active_power_usage) + var/build_time_per_item = (design.construction_time * design.lathe_time_factor) ** 0.8 + + //start production + busy = TRUE + SStgui.update_uis(src) + if(production_animation) + icon_state = production_animation + var/turf/target_location + if(drop_direction) + target_location = get_step(src, drop_direction) + if(isclosedturf(target_location)) + target_location = get_turf(src) + else + target_location = get_turf(src) + addtimer(CALLBACK(src, PROC_REF(do_make_item), design, print_quantity, build_time_per_item, coefficient, charge_per_item, target_location), build_time_per_item) + + return TRUE + +/** + * Callback for start_making, actually makes the item + * Arguments + * + * * datum/design/design - the design we are trying to print + * * items_remaining - the number of designs left out to print + * * build_time_per_item - the time taken to print 1 item + * * material_cost_coefficient - the cost efficiency to print 1 design + * * charge_per_item - the amount of power to print 1 item + * * turf/target - the location to drop the printed item on +*/ +/obj/machinery/rnd/production/proc/do_make_item(datum/design/design, items_remaining, build_time_per_item, material_cost_coefficient, charge_per_item, turf/target) PROTECTED_PROC(TRUE) if(!items_remaining) // how finalize_build() return - if(!directly_use_power(charge_per_item)) + if(!is_operational || !directly_use_power(charge_per_item)) say("Unable to continue production, power failure.") finalize_build() return + if(!materials.can_use_resource()) + finalize_build() + return var/is_stack = ispath(design.build_path, /obj/item/stack) var/list/design_materials = design.materials - if(!materials.mat_container.has_materials(design_materials, build_efficiency, is_stack ? items_remaining : 1)) + if(!materials.mat_container.has_materials(design_materials, material_cost_coefficient, is_stack ? items_remaining : 1)) say("Unable to continue production, missing materials.") return - materials.use_materials(design_materials, build_efficiency, is_stack ? items_remaining : 1, "built", "[design.name]") + materials.use_materials(design_materials, material_cost_coefficient, is_stack ? items_remaining : 1, "built", "[design.name]") var/atom/movable/created if(is_stack) - created = new design.build_path(get_turf(src), items_remaining) + created = new design.build_path(target, items_remaining) else - created = new design.build_path(get_turf(src)) - split_materials_uniformly(design_materials, build_efficiency, created) + created = new design.build_path(target) + split_materials_uniformly(design_materials, material_cost_coefficient, created) created.pixel_x = created.base_pixel_x + rand(-6, 6) created.pixel_y = created.base_pixel_y + rand(-6, 6) @@ -305,40 +407,36 @@ if(!items_remaining) finalize_build() return - addtimer(CALLBACK(src, PROC_REF(do_make_item), design, build_efficiency, time_per_item, items_remaining), time_per_item) + addtimer(CALLBACK(src, PROC_REF(do_make_item), design, items_remaining, build_time_per_item, material_cost_coefficient, charge_per_item, target), build_time_per_item) /// Resets the busy flag /// Called at the end of do_make_item's timer loop /obj/machinery/rnd/production/proc/finalize_build() PROTECTED_PROC(TRUE) - busy = FALSE - update_static_data_for_all_viewers() -// Stuff for the stripe on the department machines -/obj/machinery/rnd/production/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) - . = ..() - - update_icon(UPDATE_OVERLAYS) + busy = FALSE + SStgui.update_uis(src) + icon_state = initial(icon_state) -/obj/machinery/rnd/production/update_overlays() +/obj/machinery/rnd/production/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) . = ..() - - if(!stripe_color) + if((!issilicon(usr) && !isAdminGhostAI(usr)) && !Adjacent(usr)) return + if(busy) + balloon_alert(usr, "busy printing!") + return + var/direction = get_dir(src, over_location) + if(!direction) + return + drop_direction = direction + balloon_alert(usr, "dropping [dir2text(drop_direction)]") - var/mutable_appearance/stripe = mutable_appearance('icons/obj/machines/research.dmi', "protolate_stripe") - - if(!panel_open) - stripe.icon_state = "protolathe_stripe" - else - stripe.icon_state = "protolathe_stripe_t" - - stripe.color = stripe_color - - . += stripe - -/obj/machinery/rnd/production/examine(mob/user) +/obj/machinery/rnd/production/AltClick(mob/user) . = ..() - - if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Storing up to [materials.local_size] material units.
    Material consumption at [efficiency_coeff * 100]%.
    Build time reduced by [100 - efficiency_coeff * 100]%.") + if(!drop_direction || !can_interact(user)) + return + if(busy) + balloon_alert(user, "busy printing!") + return + balloon_alert(user, "drop direction reset") + drop_direction = 0 diff --git a/code/modules/research/machinery/circuit_imprinter.dm b/code/modules/research/machinery/circuit_imprinter.dm index 8127bc45d0ab0..2dcbde23663ad 100644 --- a/code/modules/research/machinery/circuit_imprinter.dm +++ b/code/modules/research/machinery/circuit_imprinter.dm @@ -2,23 +2,22 @@ name = "circuit imprinter" desc = "Manufactures circuit boards for the construction of machines." icon_state = "circuit_imprinter" - circuit = /obj/item/circuitboard/machine/circuit_imprinter production_animation = "circuit_imprinter_ani" + circuit = /obj/item/circuitboard/machine/circuit_imprinter allowed_buildtypes = IMPRINTER -/obj/machinery/rnd/production/circuit_imprinter/calculate_efficiency() - . = ..() - +/obj/machinery/rnd/production/circuit_imprinter/compute_efficiency() var/rating = 0 - for(var/datum/stock_part/servo/servo in component_parts) - rating += servo.tier // There is only one. + rating += servo.tier + + return 0.5 ** max(rating - 1, 0) // One sheet, half sheet, quarter sheet, eighth sheet. - efficiency_coeff = 0.5 ** max(rating - 1, 0) // One sheet, half sheet, quarter sheet, eighth sheet. +/obj/machinery/rnd/production/circuit_imprinter/flick_animation(mat_name) + return //we presently have no animation /obj/machinery/rnd/production/circuit_imprinter/offstation name = "ancient circuit imprinter" desc = "Manufactures circuit boards for the construction of machines. Its ancient construction may limit its ability to print all known technology." allowed_buildtypes = AWAY_IMPRINTER circuit = /obj/item/circuitboard/machine/circuit_imprinter/offstation - charges_tax = FALSE diff --git a/code/modules/research/machinery/departmental_protolathe.dm b/code/modules/research/machinery/departmental_protolathe.dm index dc0b882ef5176..81e83f8451e59 100644 --- a/code/modules/research/machinery/departmental_protolathe.dm +++ b/code/modules/research/machinery/departmental_protolathe.dm @@ -11,10 +11,6 @@ stripe_color = "#EFB341" payment_department = ACCOUNT_ENG -/obj/machinery/rnd/production/protolathe/department/engineering/no_tax - circuit = /obj/item/circuitboard/machine/protolathe/department/engineering/no_tax - charges_tax = FALSE - /obj/machinery/rnd/production/protolathe/department/service name = "department protolathe (Service)" allowed_department_flags = DEPARTMENT_BITFLAG_SERVICE diff --git a/code/modules/research/machinery/protolathe.dm b/code/modules/research/machinery/protolathe.dm index b48f64ca9d74a..7a81a5cd36f19 100644 --- a/code/modules/research/machinery/protolathe.dm +++ b/code/modules/research/machinery/protolathe.dm @@ -6,7 +6,7 @@ production_animation = "protolathe_n" allowed_buildtypes = PROTOLATHE -/obj/machinery/rnd/production/protolathe/deconstruct(disassembled) +/obj/machinery/rnd/production/protolathe/on_deconstruction(disassembled) log_game("Protolathe of type [type] [disassembled ? "disassembled" : "deconstructed"] by [key_name(usr)] at [get_area_name(src, TRUE)]") return ..() @@ -23,4 +23,3 @@ desc = "Converts raw materials into useful objects. Its ancient construction may limit its ability to print all known technology." circuit = /obj/item/circuitboard/machine/protolathe/offstation allowed_buildtypes = AWAY_LATHE - charges_tax = FALSE diff --git a/code/modules/research/machinery/techfab.dm b/code/modules/research/machinery/techfab.dm index 38df3fc038df1..7f1428882e7d3 100644 --- a/code/modules/research/machinery/techfab.dm +++ b/code/modules/research/machinery/techfab.dm @@ -3,6 +3,5 @@ desc = "Produces researched prototypes with raw materials and energy." icon_state = "protolathe" circuit = /obj/item/circuitboard/machine/techfab - console_link = FALSE production_animation = "protolathe_n" allowed_buildtypes = PROTOLATHE | IMPRINTER diff --git a/code/modules/research/ordnance/doppler_array.dm b/code/modules/research/ordnance/doppler_array.dm index a109e5061df1b..a6fe3c9f3ac0e 100644 --- a/code/modules/research/ordnance/doppler_array.dm +++ b/code/modules/research/ordnance/doppler_array.dm @@ -18,7 +18,7 @@ var/obj/item/computer_disk/inserted_disk // Lighting system to better communicate the directions. - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 4 light_power = 1 light_color = COLOR_RED @@ -237,7 +237,7 @@ else if (machine_stat & NOPOWER) . += mutable_appearance(icon, "[base_icon_state]_screen-off") -/obj/machinery/doppler_array/on_deconstruction() +/obj/machinery/doppler_array/on_deconstruction(disassembled) eject_disk() . = ..() diff --git a/code/modules/research/ordnance/tank_compressor.dm b/code/modules/research/ordnance/tank_compressor.dm index ff03b368291c5..830c004acad5e 100644 --- a/code/modules/research/ordnance/tank_compressor.dm +++ b/code/modules/research/ordnance/tank_compressor.dm @@ -238,7 +238,7 @@ update_appearance() return ..() -/obj/machinery/atmospherics/components/binary/tank_compressor/on_deconstruction() +/obj/machinery/atmospherics/components/binary/tank_compressor/on_deconstruction(disassembled) eject_tank() eject_disk() return ..() diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 4ab9d73dca7b5..58d7f1f29cf3d 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -7,21 +7,22 @@ icon = 'icons/obj/machines/research.dmi' density = TRUE use_power = IDLE_POWER_USE + + ///Are we currently printing a machine var/busy = FALSE + ///Is this machne hacked via wires var/hacked = FALSE - var/console_link = TRUE //allow console link. + ///Is this machine disabled via wires var/disabled = FALSE - /// Ref to global science techweb. + ///Ref to global science techweb. var/datum/techweb/stored_research ///The item loaded inside the machine, used by experimentors and destructive analyzers only. var/obj/item/loaded_item -/obj/machinery/rnd/proc/reset_busy() - busy = FALSE - /obj/machinery/rnd/Initialize(mapload) . = ..() set_wires(new /datum/wires/rnd(src)) + register_context() /obj/machinery/rnd/LateInitialize() . = ..() @@ -37,6 +38,46 @@ QDEL_NULL(wires) return ..() +/obj/machinery/rnd/examine(mob/user) + . = ..() + if(!in_range(user, src) && !isobserver(user)) + return + + . += span_notice("A [EXAMINE_HINT("multitool")] with techweb designs can be uploaded here.") + . += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].") + if(panel_open) + . += span_notice("Use a [EXAMINE_HINT("multitool")] or [EXAMINE_HINT("wirecutters")] to interact with wires.") + . += span_notice("The machine can be [EXAMINE_HINT("pried")] apart.") + +/obj/machinery/rnd/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = NONE + if(isnull(held_item)) + return + + if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] Panel" + context[SCREENTIP_CONTEXT_RMB] = "[panel_open ? "Close" : "Open"] Panel" + return CONTEXTUAL_SCREENTIP_SET + + if(panel_open) + var/msg + if(held_item.tool_behaviour == TOOL_CROWBAR) + msg = "Deconstruct" + else if(is_wire_tool(held_item)) + msg = "Open Wires" + + if(msg) + context[SCREENTIP_CONTEXT_LMB] = msg + context[SCREENTIP_CONTEXT_RMB] = msg + return CONTEXTUAL_SCREENTIP_SET + else + if(held_item.tool_behaviour == TOOL_MULTITOOL) + var/obj/item/multitool/tool = held_item + if(!QDELETED(tool.buffer) && istype(tool.buffer, /datum/techweb)) + context[SCREENTIP_CONTEXT_LMB] = "Upload Techweb" + context[SCREENTIP_CONTEXT_RMB] = "Upload Techweb" + return CONTEXTUAL_SCREENTIP_SET + ///Called when attempting to connect the machine to a techweb, forgetting the old. /obj/machinery/rnd/proc/connect_techweb(datum/techweb/new_techweb) if(stored_research) @@ -49,52 +90,42 @@ /obj/machinery/rnd/proc/on_connected_techweb() SHOULD_CALL_PARENT(FALSE) -/obj/machinery/rnd/proc/shock(mob/user, prb) - if(machine_stat & (BROKEN|NOPOWER)) // unpowered, no shock - return FALSE - if(!prob(prb)) - return FALSE - do_sparks(5, TRUE, src) - if (electrocute_mob(user, get_area(src), src, 0.7, TRUE)) - return TRUE - else - return FALSE +///Reset the state of this machine +/obj/machinery/rnd/proc/reset_busy() + busy = FALSE /obj/machinery/rnd/crowbar_act(mob/living/user, obj/item/tool) return default_deconstruction_crowbar(tool) /obj/machinery/rnd/crowbar_act_secondary(mob/living/user, obj/item/tool) - return default_deconstruction_crowbar(tool) + return crowbar_act(user, tool) /obj/machinery/rnd/screwdriver_act(mob/living/user, obj/item/tool) return default_deconstruction_screwdriver(user, "[initial(icon_state)]_t", initial(icon_state), tool) /obj/machinery/rnd/screwdriver_act_secondary(mob/living/user, obj/item/tool) - return default_deconstruction_screwdriver(user, "[initial(icon_state)]_t", initial(icon_state), tool) + return screwdriver_act(user, tool) /obj/machinery/rnd/multitool_act(mob/living/user, obj/item/multitool/tool) + . = ITEM_INTERACT_BLOCKING if(panel_open) wires.interact(user) - return TRUE + return ITEM_INTERACT_SUCCESS if(!QDELETED(tool.buffer) && istype(tool.buffer, /datum/techweb)) connect_techweb(tool.buffer) - return TRUE - return FALSE + return ITEM_INTERACT_SUCCESS /obj/machinery/rnd/multitool_act_secondary(mob/living/user, obj/item/tool) - if(panel_open) - wires.interact(user) - return TRUE + return multitool_act(user, tool) /obj/machinery/rnd/wirecutter_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING if(panel_open) wires.interact(user) - return TRUE + return ITEM_INTERACT_SUCCESS /obj/machinery/rnd/wirecutter_act_secondary(mob/living/user, obj/item/tool) - if(panel_open) - wires.interact(user) - return TRUE + return wirecutter_act(user, tool) //whether the machine can have an item inserted in its current state. /obj/machinery/rnd/proc/is_insertion_ready(mob/user) @@ -119,19 +150,7 @@ return TRUE //we eject the loaded item when deconstructing the machine -/obj/machinery/rnd/on_deconstruction() +/obj/machinery/rnd/on_deconstruction(disassembled) if(loaded_item) loaded_item.forceMove(drop_location()) ..() - -/obj/machinery/rnd/proc/AfterMaterialInsert(item_inserted, id_inserted, amount_inserted) - var/stack_name - if(istype(item_inserted, /obj/item/stack/ore/bluespace_crystal)) - stack_name = "bluespace" - use_power(SHEET_MATERIAL_AMOUNT / 10) - else - var/obj/item/stack/S = item_inserted - stack_name = S.name - use_power(min(active_power_usage, (amount_inserted / 100))) - add_overlay("protolathe_[stack_name]") - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, cut_overlay), "protolathe_[stack_name]"), 10) diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index b3c10eaac93b8..e446672bc33a9 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -230,7 +230,7 @@ to_chat(user, span_notice("You delicately cut the wire. [hdd_wires] wire\s left...")) return TRUE -/obj/machinery/rnd/server/master/on_deconstruction() +/obj/machinery/rnd/server/master/on_deconstruction(disassembled) // If the machine contains a source code HDD, destroying it will negatively impact research speed. Safest to log this. if(source_code_hdd) // Destroyed with a hard drive inside = harm income diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index fee78cf41db32..79d24b9c55ab9 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -21,46 +21,35 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good /obj/item/storage/part_replacer/pre_attack(obj/attacked_object, mob/living/user, params) . = ..() if(.) - return - - if(!works_from_distance && !user.Adjacent(attacked_object)) - return + return . return part_replace_action(attacked_object, user) /obj/item/storage/part_replacer/proc/part_replace_action(obj/attacked_object, mob/living/user) - if(!ismachinery(attacked_object) && !istype(attacked_object, /obj/structure/frame/machine) && !istype(attacked_object, /obj/structure/frame/computer)) + if(!ismachinery(attacked_object) || istype(attacked_object, /obj/machinery/computer)) return FALSE - if(ismachinery(attacked_object) && !istype(attacked_object, /obj/machinery/computer)) - var/obj/machinery/attacked_machinery = attacked_object - - if(!attacked_machinery.component_parts) - return FALSE - - attacked_machinery.exchange_parts(user, src) - if(works_from_distance) - user.Beam(attacked_machinery, icon_state = "rped_upgrade", time = 5) - return TRUE - - var/obj/structure/frame/attacked_frame = attacked_object - if(istype(attacked_frame, /obj/structure/frame/machine)) - var/obj/structure/frame/machine/machine_frame = attacked_frame - if(attacked_frame.state == 1 || (!machine_frame.components && !(locate(/obj/item/circuitboard/machine) in contents))) - return FALSE - else - if(attacked_frame.state == 0 || (attacked_frame.state == 1 && !(locate(/obj/item/circuitboard/computer) in contents))) - return FALSE + var/obj/machinery/attacked_machinery = attacked_object + if(!LAZYLEN(attacked_machinery.component_parts)) + return FALSE - attacked_frame.attackby(src, user) - if(works_from_distance) - user.Beam(attacked_frame, icon_state = "rped_upgrade", time = 5) + if(attacked_machinery.exchange_parts(user, src) && works_from_distance) + 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) - part_replace_action(attacked_object, user) - return ..() + . = ..() + 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/proc/play_rped_sound() //Plays the sound for RPED exhanging or installing parts. diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 12b72f283a0d5..66fb0a8caa3bd 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -209,6 +209,7 @@ "mod_plating_standard", "mod_storage", "mod_welding", + "mod_safety", "mod_mouthhole", "mod_flashlight", "mod_longfall", @@ -1180,10 +1181,11 @@ description = "Computers and how they work." prereq_ids = list("datatheory") design_ids = list( + "bankmachine", + "barcode_scanner", "cargo", "cargorequest", "comconsole", - "bankmachine", "crewconsole", "idcard", "libraryconsole", @@ -1339,12 +1341,24 @@ "c38_trac", "implant_chem", "implant_tracking", + "implant_exile", "implantcase", "implanter", "locator", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) +/datum/techweb_node/advanced_implants + id = "adv_subdermal_implants" + display_name = "Advanced Subdermal Implants" + description = "Subdermal implants that leverage bluespace research to control their bluespace signature." + prereq_ids = list("subdermal_implants", "micro_bluespace") + design_ids = list( + "implant_beacon", + "implant_bluespace", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + /datum/techweb_node/cyber_organs id = "cyber_organs" display_name = "Cybernetic Organs" @@ -1536,6 +1550,7 @@ design_ids = list( "fishing_rod_tech", "stabilized_hook", + "auto_reel", "fish_analyzer", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) @@ -1610,6 +1625,7 @@ description = "Our researchers have found new ways to weaponize just about everything now." prereq_ids = list("engineering") design_ids = list( + "ballistic_shield", "pin_testing", "tele_shield", "lasershell", diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 8eb166bf8207f..7b85a878ec39b 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -175,6 +175,12 @@ Slimecrossing Items w_class = WEIGHT_CLASS_SMALL icon = 'icons/obj/science/slimecrossing.dmi' icon_state = "capturedevice" + ///traits we give and remove from the mob on exit and entry + var/static/list/traits_on_transfer = list( + TRAIT_IMMOBILIZED, + TRAIT_HANDS_BLOCKED, + TRAIT_AI_PAUSED, + ) /obj/item/capturedevice/attack(mob/living/pokemon, mob/user) if(length(contents)) @@ -211,11 +217,11 @@ Slimecrossing Items /obj/item/capturedevice/proc/store(mob/living/pokemon) pokemon.forceMove(src) - pokemon.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), ABSTRACT_ITEM_TRAIT) + pokemon.add_traits(traits_on_transfer, ABSTRACT_ITEM_TRAIT) pokemon.cancel_camera() /obj/item/capturedevice/proc/release() for(var/mob/living/pokemon in contents) pokemon.forceMove(get_turf(loc)) - pokemon.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), ABSTRACT_ITEM_TRAIT) + pokemon.remove_traits(traits_on_transfer, ABSTRACT_ITEM_TRAIT) pokemon.cancel_camera() diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index 210a1d7dc9d9b..e4b2eaa6c2829 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -52,7 +52,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26) data["bsa_unlock"] = GLOB.bsa_unlock return data -/obj/machinery/keycard_auth/ui_status(mob/user) +/obj/machinery/keycard_auth/ui_status(mob/user, datum/ui_state/state) if(isdrone(user)) return UI_CLOSE if(!isanimal_or_basicmob(user)) diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index e5b8d5e87ff8a..d92402859911a 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -378,15 +378,13 @@ var/change = FALSE if(payees[AM] > 0) change = TRUE - var/obj/item/holochip/HC = new /obj/item/holochip(AM.loc) //Change is made in holocredits exclusively. - HC.credits = payees[AM] - HC.name = "[HC.credits] credit holochip" + var/obj/item/holochip/holocred = new /obj/item/holochip(AM.loc, payees[AM]) //Change is made in holocredits exclusively. if(ishuman(AM)) var/mob/living/carbon/human/H = AM - if(!H.put_in_hands(HC)) - AM.pulling = HC + if(!H.put_in_hands(holocred)) + AM.pulling = holocred else - AM.pulling = HC + AM.pulling = holocred payees[AM] -= payees[AM] say("Welcome to first class, [driver_holdout ? "[driver_holdout]" : "[AM]" ]![change ? " Here is your change." : ""]") diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 6e946cca05c4c..01657d2ebb976 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -30,6 +30,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/structure/blob, /obj/structure/checkoutmachine, /obj/structure/disposalpipe, + /obj/structure/disposaloutlet, /obj/structure/extraction_point, /obj/structure/guardian_beacon, /obj/tear_in_reality, diff --git a/code/modules/spells/spell_types/pointed/finger_guns.dm b/code/modules/spells/spell_types/pointed/finger_guns.dm index 5ed666d9e64ed..24f51a0e90862 100644 --- a/code/modules/spells/spell_types/pointed/finger_guns.dm +++ b/code/modules/spells/spell_types/pointed/finger_guns.dm @@ -46,4 +46,7 @@ /datum/action/cooldown/spell/pointed/projectile/finger_guns/before_cast(atom/cast_on) . = ..() - invocation = span_notice("[cast_on] fires [cast_on.p_their()] finger gun!") + if(isnull(owner)) + invocation = initial(invocation) + else + invocation = span_notice("[owner] fires [owner.p_their()] finger gun!") diff --git a/code/modules/spells/spell_types/touch/smite.dm b/code/modules/spells/spell_types/touch/smite.dm index f02ea8247dd22..7bef97c8a6582 100644 --- a/code/modules/spells/spell_types/touch/smite.dm +++ b/code/modules/spells/spell_types/touch/smite.dm @@ -57,3 +57,13 @@ icon = 'icons/obj/weapons/hand.dmi' icon_state = "disintegrate" inhand_icon_state = "disintegrate" + +/obj/item/melee/touch_attack/smite/suicide_act(mob/living/user) + + user.visible_message(span_suicide("[user] spreads [user.p_their()] arms apart, lightning arcing between them! It looks like [user.p_theyre()] going out with a bang!")) + user.say("SHIA KAZING!!", forced = "smite suicide") + do_sparks(4, FALSE, get_turf(user)) + explosion(user, heavy_impact_range = 2, explosion_cause = src) //Cheap explosion imitation because putting detonate() here causes runtimes + user.gib(DROP_BODYPARTS) + qdel(src) + return MANUAL_SUICIDE diff --git a/code/modules/surgery/autopsy.dm b/code/modules/surgery/autopsy.dm index 2d106cfd4415e..6ff32f8b465c9 100644 --- a/code/modules/surgery/autopsy.dm +++ b/code/modules/surgery/autopsy.dm @@ -10,7 +10,8 @@ ) /datum/surgery/autopsy/can_start(mob/user, mob/living/patient) - . = ..() + if(!..()) + return FALSE if(patient.stat != DEAD) return FALSE if(HAS_TRAIT_FROM(patient, TRAIT_DISSECTED, AUTOPSY_TRAIT)) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index c81b691980ad9..58e91646c0fee 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -34,8 +34,10 @@ * Set to BIO_STANDARD_UNJOINTED because most species have both flesh bone and blood in their limbs. */ var/biological_state = BIO_STANDARD_UNJOINTED - ///A bitfield of bodytypes for clothing, surgery, and misc information - var/bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC + ///A bitfield of bodytypes for surgery, and misc information + var/bodytype = BODYTYPE_ORGANIC + ///A bitfield of bodyshapes for clothing and other sprite information + var/bodyshape = BODYSHAPE_HUMANOID ///Defines when a bodypart should not be changed. Example: BP_BLOCK_CHANGE_SPECIES prevents the limb from being overwritten on species gain var/change_exempt_flags = NONE ///Random flags that describe this bodypart diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 042628c2a33c3..03f4cc98e1401 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -211,8 +211,8 @@ associated_hand?.update_appearance() if(arm_owner.gloves) arm_owner.dropItemToGround(arm_owner.gloves, TRUE) + . = ..() arm_owner.update_worn_gloves() //to remove the bloody hands overlay - return ..() /obj/item/bodypart/leg/drop_limb(special, dismembered, move_to_floor = TRUE) if(owner && !special) @@ -270,7 +270,7 @@ return FALSE var/obj/item/bodypart/chest/mob_chest = new_limb_owner.get_bodypart(BODY_ZONE_CHEST) - if(mob_chest && !(mob_chest.acceptable_bodytype & bodytype) && !special) + if(mob_chest && !(mob_chest.acceptable_bodytype & bodytype) && !(mob_chest.acceptable_bodyshape & bodyshape) && !special) return FALSE return TRUE @@ -363,6 +363,14 @@ new_head_owner.update_body() new_head_owner.update_damage_overlays() +/obj/item/bodypart/arm/try_attach_limb(mob/living/carbon/new_arm_owner, special = FALSE) + . = ..() + + if(!.) + return + + new_arm_owner.update_worn_gloves() // To apply bloody hands overlay + /mob/living/carbon/proc/regenerate_limbs(list/excluded_zones = list()) SEND_SIGNAL(src, COMSIG_CARBON_REGENERATE_LIMBS, excluded_zones) var/list/zone_list = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 0373401d9047c..f1ea0c06645b4 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -212,7 +212,7 @@ husk_type = "monkey" icon_state = "default_monkey_head" limb_id = SPECIES_MONKEY - bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_MONKEY should_draw_greyscale = FALSE dmg_overlay_type = SPECIES_MONKEY is_dimorphic = FALSE @@ -229,7 +229,8 @@ px_y = 0 bodypart_flags = BODYPART_UNREMOVABLE max_damage = LIMB_MAX_HP_ALIEN_CORE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodytype = BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_HUMANOID /obj/item/bodypart/head/larva icon = 'icons/mob/human/species/alien/bodyparts.dmi' diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 52671b5fbc16c..126bd3db33a4f 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -179,6 +179,16 @@ bodytype = all_limb_flags +/// Makes sure that the owner's bodyshape flags match the flags of all of it's parts and organs +/mob/living/carbon/proc/synchronize_bodyshapes() + var/all_limb_flags = NONE + for(var/obj/item/bodypart/limb as anything in bodyparts) + for(var/obj/item/organ/external/ext_organ in limb) + all_limb_flags |= ext_organ.external_bodyshapes + all_limb_flags |= limb.bodyshape + + bodyshape = all_limb_flags + /proc/skintone2hex(skin_tone) . = 0 switch(skin_tone) diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 2031ea4c72309..ead03aa0f707c 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -13,8 +13,10 @@ grind_results = null wound_resistance = 10 bodypart_trait_source = CHEST_TRAIT + ///The bodyshape(s) allowed to attach to this chest. + var/acceptable_bodyshape = BODYSHAPE_HUMANOID ///The bodytype(s) allowed to attach to this chest. - var/acceptable_bodytype = BODYTYPE_HUMANOID + var/acceptable_bodytype = ALL var/obj/item/cavity_item @@ -78,8 +80,8 @@ should_draw_greyscale = FALSE is_dimorphic = FALSE wound_resistance = -10 - bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC - acceptable_bodytype = BODYTYPE_MONKEY + bodyshape = BODYSHAPE_MONKEY + acceptable_bodyshape = BODYSHAPE_MONKEY dmg_overlay_type = SPECIES_MONKEY /obj/item/bodypart/chest/alien @@ -87,12 +89,13 @@ icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_chest" limb_id = BODYPART_ID_ALIEN - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodytype = BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_HUMANOID is_dimorphic = FALSE should_draw_greyscale = FALSE bodypart_flags = BODYPART_UNREMOVABLE max_damage = LIMB_MAX_HP_ALIEN_CORE - acceptable_bodytype = BODYTYPE_HUMANOID + acceptable_bodyshape = BODYSHAPE_HUMANOID wing_types = NONE /obj/item/bodypart/chest/larva @@ -245,14 +248,14 @@ icon_state = "default_monkey_l_arm" limb_id = SPECIES_MONKEY should_draw_greyscale = FALSE - bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_MONKEY wound_resistance = -10 px_x = -5 px_y = -3 dmg_overlay_type = SPECIES_MONKEY - unarmed_damage_low = 1 /// monkey punches must be really weak, considering they bite people instead and their bites are weak as hell. - unarmed_damage_high = 2 - unarmed_effectiveness = 0 + unarmed_damage_low = 3 + unarmed_damage_high = 8 + unarmed_effectiveness = 5 appendage_noun = "paw" /obj/item/bodypart/arm/left/alien @@ -260,7 +263,8 @@ icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_l_arm" limb_id = BODYPART_ID_ALIEN - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodytype = BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_HUMANOID px_x = 0 px_y = 0 bodypart_flags = BODYPART_UNREMOVABLE @@ -341,14 +345,14 @@ husk_type = "monkey" icon_state = "default_monkey_r_arm" limb_id = SPECIES_MONKEY - bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_MONKEY should_draw_greyscale = FALSE wound_resistance = -10 px_x = 5 px_y = -3 dmg_overlay_type = SPECIES_MONKEY - unarmed_damage_low = 1 - unarmed_damage_high = 2 + unarmed_damage_low = 3 + unarmed_damage_high = 8 unarmed_effectiveness = 0 appendage_noun = "paw" @@ -357,7 +361,8 @@ icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_r_arm" limb_id = BODYPART_ID_ALIEN - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodytype = BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_HUMANOID px_x = 0 px_y = 0 bodypart_flags = BODYPART_UNREMOVABLE @@ -383,7 +388,8 @@ unarmed_effectiveness = 15 /// Datum describing how to offset things worn on the foot of this leg, note that an x offset won't do anything here var/datum/worn_feature_offset/worn_foot_offset - + /// Used by the bloodysoles component to make footprints + var/footprint_sprite = FOOTPRINT_SPRITE_SHOES biological_state = BIO_STANDARD_JOINTED /obj/item/bodypart/leg/Destroy() @@ -456,20 +462,22 @@ icon_state = "default_monkey_l_leg" limb_id = SPECIES_MONKEY should_draw_greyscale = FALSE - bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_MONKEY wound_resistance = -10 px_y = 4 dmg_overlay_type = SPECIES_MONKEY unarmed_damage_low = 2 unarmed_damage_high = 3 - unarmed_effectiveness = 0 + unarmed_effectiveness = 5 + footprint_sprite = FOOTPRINT_SPRITE_PAWS /obj/item/bodypart/leg/left/alien icon = 'icons/mob/human/species/alien/bodyparts.dmi' icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_l_leg" limb_id = BODYPART_ID_ALIEN - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodytype = BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_HUMANOID px_x = 0 px_y = 0 bodypart_flags = BODYPART_UNREMOVABLE @@ -545,20 +553,22 @@ icon_state = "default_monkey_r_leg" limb_id = SPECIES_MONKEY should_draw_greyscale = FALSE - bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_MONKEY wound_resistance = -10 px_y = 4 dmg_overlay_type = SPECIES_MONKEY unarmed_damage_low = 2 unarmed_damage_high = 3 - unarmed_effectiveness = 0 + unarmed_effectiveness = 5 + footprint_sprite = FOOTPRINT_SPRITE_PAWS /obj/item/bodypart/leg/right/alien icon = 'icons/mob/human/species/alien/bodyparts.dmi' icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_r_leg" limb_id = BODYPART_ID_ALIEN - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodytype = BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_HUMANOID px_x = 0 px_y = 0 bodypart_flags = BODYPART_UNREMOVABLE diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 3f5e6972ed6b5..ca4b61228da42 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -23,7 +23,8 @@ icon_state = "borg_l_arm" is_dimorphic = FALSE should_draw_greyscale = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + bodytype = BODYTYPE_ROBOTIC + bodyshape = BODYSHAPE_HUMANOID change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" @@ -56,7 +57,8 @@ icon_state = "borg_r_arm" is_dimorphic = FALSE should_draw_greyscale = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + bodytype = BODYTYPE_ROBOTIC + bodyshape = BODYSHAPE_HUMANOID change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" @@ -90,7 +92,8 @@ icon_state = "borg_l_leg" is_dimorphic = FALSE should_draw_greyscale = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + bodytype = BODYTYPE_ROBOTIC + bodyshape = BODYSHAPE_HUMANOID change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" @@ -137,7 +140,8 @@ icon_state = "borg_r_leg" is_dimorphic = FALSE should_draw_greyscale = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + bodytype = BODYTYPE_ROBOTIC + bodyshape = BODYSHAPE_HUMANOID change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" @@ -183,7 +187,8 @@ icon_state = "borg_chest" is_dimorphic = FALSE should_draw_greyscale = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + bodytype = BODYTYPE_ROBOTIC + bodyshape = BODYSHAPE_HUMANOID change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" @@ -357,7 +362,8 @@ icon_state = "borg_head" is_dimorphic = FALSE should_draw_greyscale = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + bodytype = BODYTYPE_ROBOTIC + bodyshape = BODYSHAPE_HUMANOID change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm index 24178d9bd1610..8dccd4b4a2d5b 100644 --- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm @@ -45,7 +45,7 @@ /obj/item/bodypart/leg/left/digitigrade icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = BODYPART_ID_DIGITIGRADE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE + bodyshape = BODYSHAPE_HUMANOID | BODYSHAPE_DIGITIGRADE /obj/item/bodypart/leg/left/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE) . = ..() @@ -71,7 +71,7 @@ /obj/item/bodypart/leg/right/digitigrade icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = BODYPART_ID_DIGITIGRADE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE + bodyshape = BODYSHAPE_HUMANOID | BODYSHAPE_DIGITIGRADE /obj/item/bodypart/leg/right/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE) . = ..() diff --git a/code/modules/surgery/bone_mending.dm b/code/modules/surgery/bone_mending.dm index cac9051ceb44f..87fc3db0af2c4 100644 --- a/code/modules/surgery/bone_mending.dm +++ b/code/modules/surgery/bone_mending.dm @@ -20,13 +20,6 @@ /datum/surgery_step/close, ) -/datum/surgery/repair_bone_hairline/can_start(mob/living/user, mob/living/carbon/target) - . = ..() - if(.) - var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) - return(targeted_bodypart.get_wound_type(targetable_wound)) - - ///// Repair Compound Fracture (Critical) /datum/surgery/repair_bone_compound name = "Repair Compound Fracture" @@ -49,12 +42,6 @@ /datum/surgery_step/close, ) -/datum/surgery/repair_bone_compound/can_start(mob/living/user, mob/living/carbon/target) - . = ..() - if(.) - var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) - return(targeted_bodypart.get_wound_type(targetable_wound)) - //SURGERY STEPS ///// Repair Hairline Fracture (Severe) @@ -217,14 +204,6 @@ /datum/surgery_step/repair_skull ) -/datum/surgery/cranial_reconstruction/can_start(mob/living/user, mob/living/carbon/target) - . = ..() - if(!.) - return FALSE - - var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) - return !isnull(targeted_bodypart.get_wound_type(targetable_wound)) - /datum/surgery_step/clamp_bleeders/discard_skull_debris name = "discard skull debris (hemostat)" implements = list( diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm index 294b87afb866f..f9de1e01514d9 100644 --- a/code/modules/surgery/brain_surgery.dm +++ b/code/modules/surgery/brain_surgery.dm @@ -24,10 +24,7 @@ failure_sound = 'sound/surgery/organ2.ogg' /datum/surgery/brain_surgery/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) - if(!target_brain) - return FALSE - return TRUE + return target.get_organ_slot(ORGAN_SLOT_BRAIN) && ..() /datum/surgery_step/fix_brain/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( diff --git a/code/modules/surgery/burn_dressing.dm b/code/modules/surgery/burn_dressing.dm index c22a8f4be9734..61be9056f6c18 100644 --- a/code/modules/surgery/burn_dressing.dm +++ b/code/modules/surgery/burn_dressing.dm @@ -20,12 +20,14 @@ ) /datum/surgery/debride/can_start(mob/living/user, mob/living/carbon/target) - if(!istype(target)) - return FALSE - if(..()) - var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) - var/datum/wound/burn/flesh/burn_wound = targeted_bodypart.get_wound_type(targetable_wound) - return(burn_wound && burn_wound.infestation > 0) + . = ..() + if(!.) + return . + + var/datum/wound/burn/flesh/burn_wound = target.get_bodypart(user.zone_selected).get_wound_type(targetable_wound) + // Should be guaranteed to have the wound by this point + ASSERT(burn_wound, "[type] on [target] has no burn wound when it should have been guaranteed to have one by can_start") + return burn_wound.infestation > 0 //SURGERY STEPS diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm index 47f1e983f1986..aa4028997e762 100644 --- a/code/modules/surgery/core_removal.dm +++ b/code/modules/surgery/core_removal.dm @@ -16,9 +16,7 @@ ) /datum/surgery/core_removal/can_start(mob/user, mob/living/target) - if(target.stat == DEAD) - return TRUE - return FALSE + return target.stat == DEAD && ..() //extract brain /datum/surgery_step/extract_core diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm index 7536598fe7ddd..af08987fd9398 100644 --- a/code/modules/surgery/coronary_bypass.dm +++ b/code/modules/surgery/coronary_bypass.dm @@ -14,10 +14,9 @@ /datum/surgery/coronary_bypass/can_start(mob/user, mob/living/carbon/target) var/obj/item/organ/internal/heart/target_heart = target.get_organ_slot(ORGAN_SLOT_HEART) - if(target_heart) - if(target_heart.damage > 60 && !target_heart.operated) - return TRUE - return FALSE + if(isnull(target_heart) || target_heart.damage < 60 || target_heart.operated) + return FALSE + return ..() //an incision but with greater bleed, and a 90% base success chance diff --git a/code/modules/surgery/ear_surgery.dm b/code/modules/surgery/ear_surgery.dm index 416857bafb256..4333b00913ba3 100644 --- a/code/modules/surgery/ear_surgery.dm +++ b/code/modules/surgery/ear_surgery.dm @@ -23,10 +23,7 @@ time = 64 /datum/surgery/ear_surgery/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/internal/ears/target_ears = target.get_organ_slot(ORGAN_SLOT_EARS) - if(!target_ears) - return FALSE - return TRUE + return target.get_organ_slot(ORGAN_SLOT_EARS) && ..() /datum/surgery_step/fix_ears/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm index 6ae5e447e0bf2..69c246d9e8de5 100644 --- a/code/modules/surgery/experimental_dissection.dm +++ b/code/modules/surgery/experimental_dissection.dm @@ -10,16 +10,19 @@ /datum/surgery_step/experimental_dissection, /datum/surgery_step/close, ) - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_MORBID_CURIOSITY possible_locs = list(BODY_ZONE_CHEST) target_mobtypes = list(/mob/living) /datum/surgery/advanced/experimental_dissection/can_start(mob/user, mob/living/target) . = ..() + if(!.) + return . if(HAS_TRAIT_FROM(target, TRAIT_DISSECTED, EXPERIMENTAL_SURGERY_TRAIT)) return FALSE if(target.stat != DEAD) return FALSE + return . /datum/surgery_step/experimental_dissection name = "dissection" @@ -44,8 +47,7 @@ var/obj/item/research_notes/hand_dossier = user.get_inactive_held_item() hand_dossier.merge(the_dossier) - var/obj/item/bodypart/target_chest = target.get_bodypart(BODY_ZONE_CHEST) - target.apply_damage(80, BRUTE, target_chest) + target.apply_damage(80, BRUTE, BODY_ZONE_CHEST) ADD_TRAIT(target, TRAIT_DISSECTED, EXPERIMENTAL_SURGERY_TRAIT) return ..() @@ -61,8 +63,7 @@ var/obj/item/research_notes/hand_dossier = user.get_inactive_held_item() hand_dossier.merge(the_dossier) - var/obj/item/bodypart/L = target.get_bodypart(BODY_ZONE_CHEST) - target.apply_damage(80, BRUTE, L) + target.apply_damage(80, BRUTE, BODY_ZONE_CHEST) return TRUE ///Calculates how many research points dissecting 'target' is worth. diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index 748dab1f4ec85..fb759baca8771 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -21,8 +21,7 @@ time = 64 /datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/internal/eyes/target_eyes = target.get_organ_slot(ORGAN_SLOT_EYES) - return !isnull(target_eyes) + return target.get_organ_slot(ORGAN_SLOT_EYES) && ..() /datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( diff --git a/code/modules/surgery/gastrectomy.dm b/code/modules/surgery/gastrectomy.dm index 417e6716eb57b..a86805e3e5825 100644 --- a/code/modules/surgery/gastrectomy.dm +++ b/code/modules/surgery/gastrectomy.dm @@ -16,10 +16,9 @@ /datum/surgery/gastrectomy/can_start(mob/user, mob/living/carbon/target) var/obj/item/organ/internal/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH) - if(target_stomach) - if(target_stomach.damage > 50 && !target_stomach.operated) - return TRUE - return FALSE + if(isnull(target_stomach) || target_stomach.damage < 50 || target_stomach.operated) + return FALSE + return ..() ////Gastrectomy, because we truly needed a way to repair stomachs. //95% chance of success to be consistent with most organ-repairing surgeries. @@ -72,4 +71,3 @@ span_warning("[user] cuts the wrong part of [target]'s stomach!"), ) display_pain(target, "Your stomach throbs with pain; it's not getting any better!") - diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm index efef97cca74f3..e2e65003a3231 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -2,7 +2,7 @@ target_mobtypes = list(/mob/living) requires_bodypart_type = NONE replaced_by = /datum/surgery - surgery_flags = SURGERY_IGNORE_CLOTHES | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB + surgery_flags = SURGERY_IGNORE_CLOTHES | SURGERY_REQUIRE_RESTING possible_locs = list(BODY_ZONE_CHEST) steps = list( /datum/surgery_step/incise, @@ -18,8 +18,11 @@ /datum/surgery/healing/can_start(mob/user, mob/living/patient) . = ..() + if(!.) + return . if(!(patient.mob_biotypes & (MOB_ORGANIC|MOB_HUMANOID))) return FALSE + return . /datum/surgery/healing/New(surgery_target, surgery_location, surgery_bodypart) ..() @@ -27,7 +30,8 @@ steps = list( /datum/surgery_step/incise/nobleed, healing_step_type, //hehe cheeky - /datum/surgery_step/close) + /datum/surgery_step/close, + ) /datum/surgery_step/heal name = "repair body (hemostat)" diff --git a/code/modules/surgery/hepatectomy.dm b/code/modules/surgery/hepatectomy.dm index 1d609836a8e7d..934e6589e9df5 100644 --- a/code/modules/surgery/hepatectomy.dm +++ b/code/modules/surgery/hepatectomy.dm @@ -15,10 +15,9 @@ /datum/surgery/hepatectomy/can_start(mob/user, mob/living/carbon/target) var/obj/item/organ/internal/liver/target_liver = target.get_organ_slot(ORGAN_SLOT_LIVER) - if(target_liver) - if(target_liver.damage > 50 && !target_liver.operated) - return TRUE - return FALSE + if(isnull(target_liver) || target_liver.damage < 50 || target_liver.operated) + return FALSE + return ..() ////hepatectomy, removes damaged parts of the liver so that the liver may regenerate properly //95% chance of success, not 100 because organs are delicate diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index 7f43d56ffb1b0..a2b9eb33cbf06 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -2,6 +2,7 @@ name = "Implant Removal" target_mobtypes = list(/mob/living) possible_locs = list(BODY_ZONE_CHEST) + surgery_flags = SURGERY_REQUIRE_RESTING steps = list( /datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, @@ -83,6 +84,7 @@ name = "Implant Removal" requires_bodypart_type = BODYTYPE_ROBOTIC target_mobtypes = list(/mob/living/carbon/human) // Simpler mobs don't have bodypart types + surgery_flags = parent_type::surgery_flags | SURGERY_REQUIRE_LIMB steps = list( /datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index f635d0da02032..031534b0723e3 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -10,9 +10,9 @@ ) /datum/surgery/lipoplasty/can_start(mob/user, mob/living/carbon/target) - if(HAS_TRAIT(target, TRAIT_FAT) && target.nutrition >= NUTRITION_LEVEL_WELL_FED) - return TRUE - return FALSE + if(!HAS_TRAIT(target, TRAIT_FAT) || target.nutrition < NUTRITION_LEVEL_WELL_FED) + return FALSE + return ..() //cut fat @@ -24,6 +24,10 @@ /obj/item/hatchet = 35, /obj/item/knife/butcher = 25) time = 64 + preop_sound = list( + /obj/item/circular_saw = 'sound/surgery/saw.ogg', + /obj/item = 'sound/surgery/scalpel1.ogg', + ) /datum/surgery_step/cut_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message(span_notice("[user] begins to cut away [target]'s excess fat."), span_notice("You begin to cut away [target]'s excess fat...")) @@ -55,6 +59,8 @@ TOOL_SCREWDRIVER = 45, TOOL_WIRECUTTER = 35) time = 32 + preop_sound = 'sound/surgery/retractor1.ogg' + success_sound = 'sound/surgery/retractor2.ogg' /datum/surgery_step/remove_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( @@ -81,14 +87,17 @@ var/mob/living/carbon/human/human = target var/typeofmeat = /obj/item/food/meat/slab/human - if(human.dna && human.dna.species) + if(target.flags_1 & HOLOGRAM_1) + typeofmeat = null + else if(human.dna && human.dna.species) typeofmeat = human.dna.species.meat - var/obj/item/food/meat/slab/human/newmeat = new typeofmeat - newmeat.name = "fatty meat" - newmeat.desc = "Extremely fatty tissue taken from a patient." - newmeat.subjectname = human.real_name - newmeat.subjectjob = human.job - newmeat.reagents.add_reagent (/datum/reagent/consumable/nutriment, (removednutriment / 15)) //To balance with nutriment_factor of nutriment - newmeat.forceMove(target.loc) + if(typeofmeat) + var/obj/item/food/meat/slab/human/newmeat = new typeofmeat + newmeat.name = "fatty meat" + newmeat.desc = "Extremely fatty tissue taken from a patient." + newmeat.subjectname = human.real_name + newmeat.subjectjob = human.job + newmeat.reagents.add_reagent (/datum/reagent/consumable/nutriment, (removednutriment / 15)) //To balance with nutriment_factor of nutriment + newmeat.forceMove(target.loc) return ..() diff --git a/code/modules/surgery/lobectomy.dm b/code/modules/surgery/lobectomy.dm index 56e256534f7fb..83f9279818b8d 100644 --- a/code/modules/surgery/lobectomy.dm +++ b/code/modules/surgery/lobectomy.dm @@ -13,10 +13,9 @@ /datum/surgery/lobectomy/can_start(mob/user, mob/living/carbon/target) var/obj/item/organ/internal/lungs/target_lungs = target.get_organ_slot(ORGAN_SLOT_LUNGS) - if(target_lungs) - if(target_lungs.damage > 60 && !target_lungs.operated) - return TRUE - return FALSE + if(isnull(target_lungs) || target_lungs.damage < 60 || target_lungs.operated) + return FALSE + return ..() //lobectomy, removes the most damaged lung lobe with a 95% base success chance diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index b577b9f8ec048..a2cf91c72f5e9 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -177,3 +177,8 @@ /obj/item/autosurgeon/syndicate/emaggedsurgerytoolset starting_organ = /obj/item/organ/internal/cyberimp/arm/surgery/emagged + +/obj/item/autosurgeon/syndicate/contraband_sechud + desc = "Contains a contraband SecHUD implant, undetectable by health scanners." + uses = 1 + starting_organ = /obj/item/organ/internal/cyberimp/eyes/hud/security/syndicate diff --git a/code/modules/surgery/organs/external/_external_organ.dm b/code/modules/surgery/organs/external/_external_organ.dm index 540c090d2e430..b58f08fe97d7e 100644 --- a/code/modules/surgery/organs/external/_external_organ.dm +++ b/code/modules/surgery/organs/external/_external_organ.dm @@ -25,6 +25,8 @@ var/use_mob_sprite_as_obj_sprite = FALSE ///Does this organ have any bodytypes to pass to it's bodypart_owner? var/external_bodytypes = NONE + ///Does this organ have any bodyshapes to pass to it's bodypart_owner? + var/external_bodyshapes = NONE ///Which flags does a 'modification tool' need to have to restyle us, if it all possible (located in code/_DEFINES/mobs) var/restyle_flags = NONE @@ -80,12 +82,15 @@ if(external_bodytypes) receiver.synchronize_bodytypes() + if(external_bodyshapes) + receiver.synchronize_bodyshapes() receiver.update_body_parts() /obj/item/organ/external/mob_remove(mob/living/carbon/organ_owner, special, moving) if(!special) organ_owner.synchronize_bodytypes() + organ_owner.synchronize_bodyshapes() organ_owner.update_body_parts() return ..() @@ -216,7 +221,7 @@ slot = ORGAN_SLOT_EXTERNAL_SNOUT preference = "feature_lizard_snout" - external_bodytypes = BODYTYPE_SNOUTED + external_bodyshapes = BODYSHAPE_SNOUTED dna_block = DNA_SNOUT_BLOCK restyle_flags = EXTERNAL_RESTYLE_FLESH diff --git a/code/modules/surgery/organs/external/spines.dm b/code/modules/surgery/organs/external/spines.dm index 524810a2a67c3..743b7fa8d47f2 100644 --- a/code/modules/surgery/organs/external/spines.dm +++ b/code/modules/surgery/organs/external/spines.dm @@ -7,6 +7,8 @@ zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_EXTERNAL_SPINES + preference = "feature_lizard_spines" + dna_block = DNA_SPINES_BLOCK restyle_flags = EXTERNAL_RESTYLE_FLESH diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index 5c1ec393d5d21..17be616ba7935 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -23,7 +23,6 @@ /obj/item/organ/external/tail/Insert(mob/living/carbon/receiver, special, movement_flags) . = ..() if(.) - RegisterSignal(receiver, COMSIG_ORGAN_WAG_TAIL, PROC_REF(wag)) original_owner ||= WEAKREF(receiver) receiver.clear_mood_event("tail_lost") @@ -74,54 +73,58 @@ . = ..() if(wag_flags & WAG_WAGGING) - wag(organ_owner, start = FALSE) - - UnregisterSignal(organ_owner, COMSIG_ORGAN_WAG_TAIL) + stop_wag(organ_owner) if(type in organ_owner.dna.species.external_organs) organ_owner.add_mood_event("tail_lost", /datum/mood_event/tail_lost) organ_owner.add_mood_event("tail_balance_lost", /datum/mood_event/tail_balance_lost) -/obj/item/organ/external/tail/proc/wag(mob/living/carbon/organ_owner, start = TRUE, stop_after = 0) - if(!(wag_flags & WAG_ABLE)) - return - - if(start) - if(start_wag(organ_owner) && stop_after) - addtimer(CALLBACK(src, PROC_REF(wag), organ_owner, FALSE), stop_after, TIMER_STOPPABLE|TIMER_DELETE_ME) - else - stop_wag(organ_owner) - ///We need some special behaviour for accessories, wrapped here so we can easily add more interactions later -/obj/item/organ/external/tail/proc/start_wag(mob/living/carbon/organ_owner) - if(wag_flags & WAG_WAGGING) // we are already wagging +///Accepts an optional timeout after which we remove the tail wagging +///Returns false if the wag worked, true otherwise +/obj/item/organ/external/tail/proc/start_wag(mob/living/carbon/organ_owner, stop_after = INFINITY) + if(wag_flags & WAG_WAGGING || !(wag_flags & WAG_ABLE)) // we are already wagging return FALSE if(organ_owner.stat == DEAD || organ_owner != owner) // no wagging when owner is dead or tail has been disembodied return FALSE + if(stop_after != INFINITY) + addtimer(CALLBACK(src, PROC_REF(stop_wag), organ_owner), stop_after, TIMER_STOPPABLE|TIMER_DELETE_ME) + var/datum/bodypart_overlay/mutant/tail/accessory = bodypart_overlay wag_flags |= WAG_WAGGING accessory.wagging = TRUE if(tail_spines_overlay) //if there are spines, they should wag with the tail tail_spines_overlay.wagging = TRUE organ_owner.update_body_parts() - RegisterSignal(organ_owner, COMSIG_LIVING_DEATH, PROC_REF(stop_wag)) + RegisterSignal(organ_owner, COMSIG_LIVING_DEATH, PROC_REF(owner_died)) return TRUE +/obj/item/organ/external/tail/proc/owner_died(mob/living/carbon/organ_owner) // Resisting the urge to replace owner with daddy + SIGNAL_HANDLER + stop_wag(organ_owner) + ///We need some special behaviour for accessories, wrapped here so we can easily add more interactions later +///Returns false if the wag stopping worked, true otherwise /obj/item/organ/external/tail/proc/stop_wag(mob/living/carbon/organ_owner) - SIGNAL_HANDLER + if(!(wag_flags & WAG_ABLE)) + return FALSE - var/datum/bodypart_overlay/mutant/tail/accessory = bodypart_overlay - wag_flags &= ~WAG_WAGGING - accessory.wagging = FALSE + var/succeeded = FALSE + if(wag_flags & WAG_WAGGING) + wag_flags &= ~WAG_WAGGING + succeeded = TRUE + + var/datum/bodypart_overlay/mutant/tail/tail_overlay = bodypart_overlay + tail_overlay.wagging = FALSE if(tail_spines_overlay) //if there are spines, they should stop wagging with the tail tail_spines_overlay.wagging = FALSE if(isnull(organ_owner)) - return + return succeeded organ_owner.update_body_parts() UnregisterSignal(organ_owner, COMSIG_LIVING_DEATH) + return succeeded ///Tail parent type, with wagging functionality /datum/bodypart_overlay/mutant/tail diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm b/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm index cec0241ece34c..cd9de70c4e23e 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm @@ -16,7 +16,7 @@ var/HUD_type = 0 var/HUD_trait = null /// Whether the HUD implant is on or off - var/toggled_on = TRUE + var/toggled_on = TRUE /obj/item/organ/internal/cyberimp/eyes/hud/proc/toggle_hud(mob/living/carbon/eye_owner) @@ -25,11 +25,13 @@ var/datum/atom_hud/hud = GLOB.huds[HUD_type] hud.hide_from(eye_owner) toggled_on = FALSE + balloon_alert(eye_owner, "hud disabled") else if(HUD_type) var/datum/atom_hud/hud = GLOB.huds[HUD_type] hud.show_to(eye_owner) toggled_on = TRUE + balloon_alert(eye_owner, "hud enabled") /obj/item/organ/internal/cyberimp/eyes/hud/Insert(mob/living/carbon/eye_owner, special = FALSE, movement_flags) . = ..() diff --git a/code/modules/surgery/organs/internal/ears/_ears.dm b/code/modules/surgery/organs/internal/ears/_ears.dm index ad48645e89366..f538f8789b600 100644 --- a/code/modules/surgery/organs/internal/ears/_ears.dm +++ b/code/modules/surgery/organs/internal/ears/_ears.dm @@ -89,15 +89,13 @@ /obj/item/organ/internal/ears/penguin/on_mob_insert(mob/living/carbon/human/ear_owner) . = ..() - if(istype(ear_owner)) - to_chat(ear_owner, span_notice("You suddenly feel like you've lost your balance.")) - ear_owner.AddElement(/datum/element/waddling) + to_chat(ear_owner, span_notice("You suddenly feel like you've lost your balance.")) + ear_owner.AddElementTrait(TRAIT_WADDLING, ORGAN_TRAIT, /datum/element/waddling) /obj/item/organ/internal/ears/penguin/on_mob_remove(mob/living/carbon/human/ear_owner) . = ..() - if(istype(ear_owner)) - to_chat(ear_owner, span_notice("Your sense of balance comes back to you.")) - ear_owner.RemoveElement(/datum/element/waddling) + to_chat(ear_owner, span_notice("Your sense of balance comes back to you.")) + REMOVE_TRAIT(ear_owner, TRAIT_WADDLING, ORGAN_TRAIT) /obj/item/organ/internal/ears/cybernetic name = "basic cybernetic ears" diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index 2f84b9ed93b56..c174d12260806 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -446,7 +446,7 @@ /obj/item/organ/internal/eyes/robotic/glow/ui_state(mob/user) return GLOB.default_state -/obj/item/organ/internal/eyes/robotic/glow/ui_status(mob/user) +/obj/item/organ/internal/eyes/robotic/glow/ui_status(mob/user, datum/ui_state/state) if(!QDELETED(owner)) if(owner == user) return min( @@ -722,16 +722,9 @@ low_light_cutoff = list(5, 12, 20) medium_light_cutoff = list(15, 20, 30) high_light_cutoff = list(30, 35, 50) - var/obj/item/flashlight/eyelight/adapted/adapt_light /obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_mob_insert(mob/living/carbon/eye_owner) . = ..() - //add lighting - if(!adapt_light) - adapt_light = new /obj/item/flashlight/eyelight/adapted() - adapt_light.set_light_on(TRUE) - adapt_light.forceMove(eye_owner) - adapt_light.update_brightness(eye_owner) ADD_TRAIT(eye_owner, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) /obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_life(seconds_per_tick, times_fired) @@ -744,9 +737,5 @@ . = ..() /obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_mob_remove(mob/living/carbon/unadapted, special = FALSE) - //remove lighting - adapt_light.set_light_on(FALSE) - adapt_light.update_brightness(unadapted) - adapt_light.forceMove(src) REMOVE_TRAIT(unadapted, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) return ..() diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index a39bdfc727ef7..5098d738d305b 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -184,6 +184,7 @@ liked_foodtypes = GORE | MEAT | SEAFOOD | NUTS | BUGS disliked_foodtypes = GRAIN | DAIRY | CLOTH | GROSS voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.9,aresample=%SAMPLE_RATE%,atempo=1/0.9,aformat=channel_layouts=mono,volume=0.2 [p0]; [out2] asetrate=%SAMPLE_RATE%*1.1,aresample=%SAMPLE_RATE%,atempo=1/1.1,aformat=channel_layouts=mono,volume=0.2[p2]; [p0][0][p2] amix=inputs=3"} + /obj/item/organ/internal/tongue/lizard/modify_speech(datum/source, list/speech_args) var/static/regex/lizard_hiss = new("s+", "g") var/static/regex/lizard_hiSS = new("S+", "g") diff --git a/code/modules/surgery/organs/organ_movement.dm b/code/modules/surgery/organs/organ_movement.dm index 073ef4b113730..7c6907da86334 100644 --- a/code/modules/surgery/organs/organ_movement.dm +++ b/code/modules/surgery/organs/organ_movement.dm @@ -58,12 +58,12 @@ else replaced.forceMove(get_turf(receiver)) - if(!IS_ROBOTIC_ORGAN(src) && (organ_flags & ORGAN_VIRGIN)) - blood_dna_info = receiver.get_blood_dna_list() - // need to remove the synethic blood DNA that is initialized - // wash also adds the blood dna again - wash(CLEAN_TYPE_BLOOD) - organ_flags &= ~ORGAN_VIRGIN + if(!IS_ROBOTIC_ORGAN(src) && (organ_flags & ORGAN_VIRGIN)) + blood_dna_info = receiver.get_blood_dna_list() + // need to remove the synethic blood DNA that is initialized + // wash also adds the blood dna again + wash(CLEAN_TYPE_BLOOD) + organ_flags &= ~ORGAN_VIRGIN receiver.organs |= src receiver.organs_slot[slot] = src diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index b2c8c7485375e..818c7a788d953 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -17,6 +17,8 @@ ) /datum/surgery/prosthetic_replacement/can_start(mob/user, mob/living/carbon/target) + if(!..()) + return FALSE if(!iscarbon(target)) return FALSE var/mob/living/carbon/carbon_target = target @@ -53,7 +55,7 @@ if(ishuman(target)) var/mob/living/carbon/human/human_target = target var/obj/item/bodypart/chest/target_chest = human_target.get_bodypart(BODY_ZONE_CHEST) - if(!(bodypart_to_attach.bodytype & target_chest.acceptable_bodytype)) + if((!(bodypart_to_attach.bodyshape & target_chest.acceptable_bodyshape)) && (!(bodypart_to_attach.bodytype & target_chest.acceptable_bodytype))) to_chat(user, span_warning("[bodypart_to_attach] doesn't match the patient's morphology.")) return SURGERY_STEP_FAIL if(bodypart_to_attach.check_for_frankenstein(target)) diff --git a/code/modules/surgery/repair_puncture.dm b/code/modules/surgery/repair_puncture.dm index bb33c314689bc..9b9071cff89c5 100644 --- a/code/modules/surgery/repair_puncture.dm +++ b/code/modules/surgery/repair_puncture.dm @@ -27,13 +27,13 @@ ) /datum/surgery/repair_puncture/can_start(mob/living/user, mob/living/carbon/target) - if(!istype(target)) - return FALSE . = ..() - if(.) - var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) - var/datum/wound/burn/flesh/pierce_wound = targeted_bodypart.get_wound_type(targetable_wound) - return(pierce_wound && pierce_wound.blood_flow > 0) + if(!.) + return . + + var/datum/wound/pierce/bleed/pierce_wound = target.get_bodypart(user.zone_selected).get_wound_type(targetable_wound) + ASSERT(pierce_wound, "[type] on [target] has no pierce wound when it should have been guaranteed to have one by can_start") + return pierce_wound.blood_flow > 0 //SURGERY STEPS @@ -45,6 +45,7 @@ TOOL_SCALPEL = 85, TOOL_WIRECUTTER = 40) time = 3 SECONDS + preop_sound = 'sound/surgery/hemostat1.ogg' /datum/surgery_step/repair_innards/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound @@ -104,6 +105,8 @@ TOOL_WELDER = 70, /obj/item = 30) time = 4 SECONDS + preop_sound = 'sound/surgery/cautery1.ogg' + success_sound = 'sound/surgery/cautery2.ogg' /datum/surgery_step/seal_veins/tool_check(mob/user, obj/item/tool) if(implement_type == TOOL_WELDER || implement_type == /obj/item) diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm index 0d920b80c8135..fc55598643103 100644 --- a/code/modules/surgery/revival.dm +++ b/code/modules/surgery/revival.dm @@ -5,7 +5,7 @@ requires_bodypart_type = NONE possible_locs = list(BODY_ZONE_CHEST) target_mobtypes = list(/mob/living) - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_MORBID_CURIOSITY steps = list( /datum/surgery_step/incise, /datum/surgery_step/retract_skin, @@ -123,6 +123,7 @@ /datum/surgery/revival/carbon possible_locs = list(BODY_ZONE_HEAD) target_mobtypes = list(/mob/living/carbon) + surgery_flags = parent_type::surgery_flags | SURGERY_REQUIRE_LIMB /datum/surgery/revival/carbon/is_valid_target(mob/living/carbon/patient) var/obj/item/organ/internal/brain/target_brain = patient.get_organ_slot(ORGAN_SLOT_BRAIN) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 7320e6ed94753..a555548e43268 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -20,17 +20,19 @@ var/list/possible_locs = list() ///Mobs that are valid to have surgery performed on them. var/list/target_mobtypes = list(/mob/living/carbon/human) + ///The person the surgery is being performed on. Funnily enough, it isn't always a carbon. - var/mob/living/carbon/target + VAR_FINAL/mob/living/carbon/target ///The specific bodypart being operated on. - var/obj/item/bodypart/operated_bodypart + VAR_FINAL/obj/item/bodypart/operated_bodypart ///The wound datum that is being operated on. - var/datum/wound/operated_wound - ///Types of wounds this surgery can target. - var/datum/wound/targetable_wound + VAR_FINAL/datum/wound/operated_wound + ///Types of wounds this surgery can target. + var/targetable_wound ///The types of bodyparts that this surgery can have performed on it. Used for augmented surgeries. var/requires_bodypart_type = BODYTYPE_ORGANIC + ///The speed modifier given to the surgery through external means. var/speed_modifier = 0 ///Whether the surgery requires research to do. You need to add a design if using this! @@ -69,6 +71,8 @@ /datum/surgery/proc/can_start(mob/user, mob/living/patient) //FALSE to not show in list + SHOULD_CALL_PARENT(TRUE) + . = TRUE if(replaced_by == /datum/surgery) return FALSE @@ -102,6 +106,7 @@ return FALSE if(type in opcomputer.advanced_surgeries) return TRUE + return . /datum/surgery/proc/next_step(mob/living/user, modifiers) if(location != user.zone_selected) diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 6d20a58b9e426..342f984042fec 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -70,6 +70,8 @@ #define SURGERY_SPEED_DISSECTION_MODIFIER 0.8 ///Modifier given to users with TRAIT_MORBID on certain surgeries #define SURGERY_SPEED_MORBID_CURIOSITY 0.7 +///Modifier given to patients with TRAIT_ANALGESIA +#define SURGERY_SPEED_TRAIT_ANALGESIA 0.8 /datum/surgery_step/proc/initiate(mob/living/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) // Only followers of Asclepius have the ability to use Healing Touch and perform miracle feats of surgery. @@ -95,6 +97,9 @@ if(check_morbid_curiosity(user, tool, surgery)) speed_mod *= SURGERY_SPEED_MORBID_CURIOSITY + if(HAS_TRAIT(target, TRAIT_ANALGESIA)) + speed_mod *= SURGERY_SPEED_TRAIT_ANALGESIA + var/implement_speed_mod = 1 if(implement_type) //this means it isn't a require hand or any item step. implement_speed_mod = implements[implement_type] / 100.0 @@ -260,10 +265,14 @@ */ /datum/surgery_step/proc/display_pain(mob/living/target, pain_message, mechanical_surgery = FALSE) if(target.stat < UNCONSCIOUS) - to_chat(target, span_userdanger(pain_message)) - if(prob(30) && !mechanical_surgery) - target.emote("scream") + if(HAS_TRAIT(target, TRAIT_ANALGESIA)) + to_chat(target, span_notice("You feel a dull, numb sensation as your body is surgically operated on.")) + else + to_chat(target, span_userdanger(pain_message)) + if(prob(30) && !mechanical_surgery) + target.emote("scream") +#undef SURGERY_SPEED_TRAIT_ANALGESIA #undef SURGERY_SPEED_DISSECTION_MODIFIER #undef SURGERY_SPEED_MORBID_CURIOSITY #undef SURGERY_SLOWDOWN_CAP_MULTIPLIER diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 571e8c422d98e..fee7f389dcaef 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -93,7 +93,7 @@ hitsound = 'sound/items/welder.ogg' w_class = WEIGHT_CLASS_NORMAL toolspeed = 0.7 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 light_color = COLOR_SOFT_RED @@ -378,7 +378,7 @@ force = 16 w_class = WEIGHT_CLASS_NORMAL toolspeed = 0.7 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 light_color = LIGHT_COLOR_BLUE sharpness = SHARP_EDGED diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm index 8be96f27404a4..15622228e91fe 100644 --- a/code/modules/tgs/core/core.dm +++ b/code/modules/tgs/core/core.dm @@ -166,3 +166,11 @@ var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) if(api) return api.Visibility() + +/world/TgsTriggerEvent(event_name, list/parameters, wait_for_completion = FALSE) + var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) + if(api) + if(!istype(parameters, /list)) + parameters = list() + + return api.TriggerEvent(event_name, parameters, wait_for_completion) diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm index 07ce3b684584e..898516f12486f 100644 --- a/code/modules/tgs/core/datum.dm +++ b/code/modules/tgs/core/datum.dm @@ -17,7 +17,7 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null) world.sleep_offline = FALSE // https://www.byond.com/forum/post/2894866 del(world) world.sleep_offline = FALSE // just in case, this is BYOND after all... - sleep(1) + sleep(world.tick_lag) TGS_DEBUG_LOG("BYOND DIDN'T TERMINATE THE WORLD!!! TICK IS: [world.time], sleep_offline: [world.sleep_offline]") /datum/tgs_api/latest @@ -69,3 +69,6 @@ TGS_PROTECT_DATUM(/datum/tgs_api) /datum/tgs_api/proc/Visibility() return TGS_UNIMPLEMENTED + +/datum/tgs_api/proc/TriggerEvent(event_name, list/parameters, wait_for_completion) + return FALSE diff --git a/code/modules/tgs/v4/api.dm b/code/modules/tgs/v4/api.dm index 945e2e4117671..7c87922750b9b 100644 --- a/code/modules/tgs/v4/api.dm +++ b/code/modules/tgs/v4/api.dm @@ -181,7 +181,7 @@ var/json = json_encode(data) while(requesting_new_port && !override_requesting_new_port) - sleep(1) + sleep(world.tick_lag) //we need some port open at this point to facilitate return communication if(!world.port) @@ -209,7 +209,7 @@ requesting_new_port = FALSE while(export_lock) - sleep(1) + sleep(world.tick_lag) export_lock = TRUE last_interop_response = null @@ -217,7 +217,7 @@ text2file(json, server_commands_json_path) for(var/I = 0; I < EXPORT_TIMEOUT_DS && !last_interop_response; ++I) - sleep(1) + sleep(world.tick_lag) if(!last_interop_response) TGS_ERROR_LOG("Failed to get export result for: [json]") diff --git a/code/modules/tgs/v5/__interop_version.dm b/code/modules/tgs/v5/__interop_version.dm index 616263098fd3e..f4806f7adb97c 100644 --- a/code/modules/tgs/v5/__interop_version.dm +++ b/code/modules/tgs/v5/__interop_version.dm @@ -1 +1 @@ -"5.8.0" +"5.9.0" diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm index 1c7d67d20cdf6..92c7a8388a711 100644 --- a/code/modules/tgs/v5/_defines.dm +++ b/code/modules/tgs/v5/_defines.dm @@ -14,6 +14,7 @@ #define DMAPI5_BRIDGE_COMMAND_KILL 4 #define DMAPI5_BRIDGE_COMMAND_CHAT_SEND 5 #define DMAPI5_BRIDGE_COMMAND_CHUNK 6 +#define DMAPI5_BRIDGE_COMMAND_EVENT 7 #define DMAPI5_PARAMETER_ACCESS_IDENTIFIER "accessIdentifier" #define DMAPI5_PARAMETER_CUSTOM_COMMANDS "customCommands" @@ -34,6 +35,7 @@ #define DMAPI5_BRIDGE_PARAMETER_VERSION "version" #define DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE "chatMessage" #define DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL "minimumSecurityLevel" +#define DMAPI5_BRIDGE_PARAMETER_EVENT_INVOCATION "eventInvocation" #define DMAPI5_BRIDGE_RESPONSE_NEW_PORT "newPort" #define DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION "runtimeInformation" @@ -81,6 +83,7 @@ #define DMAPI5_TOPIC_COMMAND_SEND_CHUNK 9 #define DMAPI5_TOPIC_COMMAND_RECEIVE_CHUNK 10 #define DMAPI5_TOPIC_COMMAND_RECEIVE_BROADCAST 11 +#define DMAPI5_TOPIC_COMMAND_COMPLETE_EVENT 12 #define DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE "commandType" #define DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND "chatCommand" @@ -116,3 +119,9 @@ #define DMAPI5_CUSTOM_CHAT_COMMAND_NAME "name" #define DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT "helpText" #define DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY "adminOnly" + +#define DMAPI5_EVENT_ID "eventId" + +#define DMAPI5_EVENT_INVOCATION_NAME "eventName" +#define DMAPI5_EVENT_INVOCATION_PARAMETERS "parameters" +#define DMAPI5_EVENT_INVOCATION_NOTIFY_COMPLETION "notifyCompletion" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index a5c064a8eaf1e..95b8edd3ee5c2 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -27,6 +27,8 @@ var/chunked_requests = 0 var/list/chunked_topics = list() + var/list/pending_events = list() + var/detached = FALSE /datum/tgs_api/v5/New() @@ -46,6 +48,10 @@ var/datum/tgs_version/api_version = ApiVersion() version = null // we want this to be the TGS version, not the interop version + + // sleep once to prevent an issue where world.Export on the first tick can hang indefinitely + sleep(world.tick_lag) + var/list/bridge_response = Bridge(DMAPI5_BRIDGE_COMMAND_STARTUP, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = api_version.raw_parameter, DMAPI5_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands(), DMAPI5_PARAMETER_TOPIC_PORT = GetTopicPort())) if(!istype(bridge_response)) TGS_ERROR_LOG("Failed initial bridge request!") @@ -125,7 +131,7 @@ TGS_DEBUG_LOG("RequireInitialBridgeResponse: Starting sleep") logged = TRUE - sleep(1) + sleep(world.tick_lag) TGS_DEBUG_LOG("RequireInitialBridgeResponse: Passed") @@ -249,6 +255,40 @@ WaitForReattach(TRUE) return chat_channels.Copy() +/datum/tgs_api/v5/TriggerEvent(event_name, list/parameters, wait_for_completion) + RequireInitialBridgeResponse() + WaitForReattach(TRUE) + + if(interop_version.minor < 9) + TGS_WARNING_LOG("Interop version too low for custom events!") + return FALSE + + var/str_parameters = list() + for(var/i in parameters) + str_parameters += "[i]" + + var/list/response = Bridge(DMAPI5_BRIDGE_COMMAND_EVENT, list(DMAPI5_BRIDGE_PARAMETER_EVENT_INVOCATION = list(DMAPI5_EVENT_INVOCATION_NAME = event_name, DMAPI5_EVENT_INVOCATION_PARAMETERS = str_parameters, DMAPI5_EVENT_INVOCATION_NOTIFY_COMPLETION = wait_for_completion))) + if(!response) + return FALSE + + var/event_id = response[DMAPI5_EVENT_ID] + if(!event_id) + return FALSE + + TGS_DEBUG_LOG("Created event ID: [event_id]") + if(!wait_for_completion) + return TRUE + + TGS_DEBUG_LOG("Waiting for completion of event ID: [event_id]") + + while(!pending_events[event_id]) + sleep(world.tick_lag) + + TGS_DEBUG_LOG("Completed wait on event ID: [event_id]") + pending_events -= event_id + + return TRUE + /datum/tgs_api/v5/proc/DecodeChannels(chat_update_json) TGS_DEBUG_LOG("DecodeChannels()") var/list/chat_channels_json = chat_update_json[DMAPI5_CHAT_UPDATE_CHANNELS] diff --git a/code/modules/tgs/v5/bridge.dm b/code/modules/tgs/v5/bridge.dm index a0ab359876704..0c5e701a32b60 100644 --- a/code/modules/tgs/v5/bridge.dm +++ b/code/modules/tgs/v5/bridge.dm @@ -65,7 +65,7 @@ if(detached) // Wait up to one minute for(var/i in 1 to 600) - sleep(1) + sleep(world.tick_lag) if(!detached && (!require_channels || length(chat_channels))) break @@ -77,8 +77,11 @@ /datum/tgs_api/v5/proc/PerformBridgeRequest(bridge_request) WaitForReattach(FALSE) + TGS_DEBUG_LOG("Bridge request start") // This is an infinite sleep until we get a response var/export_response = world.Export(bridge_request) + TGS_DEBUG_LOG("Bridge request complete") + if(!export_response) TGS_ERROR_LOG("Failed bridge request: [bridge_request]") return @@ -88,7 +91,7 @@ TGS_ERROR_LOG("Failed bridge request, missing content!") return - var/response_json = file2text(content) + var/response_json = TGS_FILE2TEXT_NATIVE(content) if(!response_json) TGS_ERROR_LOG("Failed bridge request, failed to load content!") return diff --git a/code/modules/tgs/v5/topic.dm b/code/modules/tgs/v5/topic.dm index 05e6c4e1b2146..e1f2cb6385789 100644 --- a/code/modules/tgs/v5/topic.dm +++ b/code/modules/tgs/v5/topic.dm @@ -176,6 +176,10 @@ var/list/reattach_response = TopicResponse(error_message) reattach_response[DMAPI5_PARAMETER_CUSTOM_COMMANDS] = ListCustomCommands() reattach_response[DMAPI5_PARAMETER_TOPIC_PORT] = GetTopicPort() + + for(var/eventId in pending_events) + pending_events[eventId] = TRUE + return reattach_response if(DMAPI5_TOPIC_COMMAND_SEND_CHUNK) @@ -276,6 +280,15 @@ TGS_WORLD_ANNOUNCE(message) return TopicResponse() + if(DMAPI5_TOPIC_COMMAND_COMPLETE_EVENT) + var/event_id = topic_parameters[DMAPI5_EVENT_ID] + if (!istext(event_id)) + return TopicResponse("Invalid or missing [DMAPI5_EVENT_ID]") + + TGS_DEBUG_LOG("Completing event ID [event_id]...") + pending_events[event_id] = TRUE + return TopicResponse() + return TopicResponse("Unknown command: [command]") /datum/tgs_api/v5/proc/WorldBroadcast(message) diff --git a/code/modules/tgs/v5/undefs.dm b/code/modules/tgs/v5/undefs.dm index d531d4b7b9dd1..237207fdfd056 100644 --- a/code/modules/tgs/v5/undefs.dm +++ b/code/modules/tgs/v5/undefs.dm @@ -14,6 +14,7 @@ #undef DMAPI5_BRIDGE_COMMAND_KILL #undef DMAPI5_BRIDGE_COMMAND_CHAT_SEND #undef DMAPI5_BRIDGE_COMMAND_CHUNK +#undef DMAPI5_BRIDGE_COMMAND_EVENT #undef DMAPI5_PARAMETER_ACCESS_IDENTIFIER #undef DMAPI5_PARAMETER_CUSTOM_COMMANDS @@ -34,6 +35,7 @@ #undef DMAPI5_BRIDGE_PARAMETER_VERSION #undef DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE #undef DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL +#undef DMAPI5_BRIDGE_PARAMETER_EVENT_INVOCATION #undef DMAPI5_BRIDGE_RESPONSE_NEW_PORT #undef DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION @@ -81,6 +83,7 @@ #undef DMAPI5_TOPIC_COMMAND_SEND_CHUNK #undef DMAPI5_TOPIC_COMMAND_RECEIVE_CHUNK #undef DMAPI5_TOPIC_COMMAND_RECEIVE_BROADCAST +#undef DMAPI5_TOPIC_COMMAND_COMPLETE_EVENT #undef DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE #undef DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND @@ -116,3 +119,9 @@ #undef DMAPI5_CUSTOM_CHAT_COMMAND_NAME #undef DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT #undef DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY + +#undef DMAPI5_EVENT_ID + +#undef DMAPI5_EVENT_INVOCATION_NAME +#undef DMAPI5_EVENT_INVOCATION_PARAMETERS +#undef DMAPI5_EVENT_INVOCATION_NOTIFY_COMPLETION diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index 16fa83445c508..92fa3b5b5c190 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -71,10 +71,9 @@ return UI_UPDATE return UI_INTERACTIVE -/mob/living/shared_ui_interaction(src_object) +/mob/living/shared_ui_interaction(atom/src_object) . = ..() - var/obj/item/object = src_object - if(!(mobility_flags & MOBILITY_UI) && !(object.interaction_flags_atom & INTERACT_ATOM_IGNORE_MOBILITY) && . == UI_INTERACTIVE) + if(!(mobility_flags & MOBILITY_UI) && !(src_object.interaction_flags_atom & INTERACT_ATOM_IGNORE_MOBILITY) && . == UI_INTERACTIVE) return UI_UPDATE /mob/living/silicon/ai/shared_ui_interaction(src_object) diff --git a/code/modules/tgui_input/keycombo.dm b/code/modules/tgui_input/keycombo.dm new file mode 100644 index 0000000000000..948dbaea234a8 --- /dev/null +++ b/code/modules/tgui_input/keycombo.dm @@ -0,0 +1,126 @@ +/** + * Creates a TGUI window with a key input. Returns the user's response as a full key with modifiers, eg ShiftK. + * + * This proc should be used to create windows for key entry that the caller will wait for a response from. + * If tgui fancy chat is turned off: Will return a normal input. + * + * Arguments: + * * user - The user to show the number input to. + * * message - The content of the number input, shown in the body of the TGUI window. + * * title - The title of the number input modal, shown on the top of the TGUI window. + * * default - The default (or current) key, shown as a placeholder. + */ +/proc/tgui_input_keycombo(mob/user = usr, message, title = "Key Input", default = 0, timeout = 0, ui_state = GLOB.always_state) + if (!istype(user)) + if (istype(user, /client)) + var/client/client = user + user = client.mob + else + return null + + if (isnull(user.client)) + return null + + // Client does NOT have tgui_input on: Returns regular input + if(!user.client.prefs.read_preference(/datum/preference/toggle/tgui_input)) + var/input_key = input(user, message, title + "(Modifiers are TGUI only, sorry!)", default) as null|text + return input_key[1] + var/datum/tgui_input_keycombo/key_input = new(user, message, title, default, timeout, ui_state) + key_input.ui_interact(user) + key_input.wait() + if (key_input) + . = key_input.entry + qdel(key_input) + +/** + * # tgui_input_keycombo + * + * Datum used for instantiating and using a TGUI-controlled key input that prompts the user with + * a message and listens for key presses. + */ +/datum/tgui_input_keycombo + /// Boolean field describing if the tgui_input_number was closed by the user. + var/closed + /// The default (or current) value, shown as a default. Users can press reset with this. + var/default + /// The entry that the user has return_typed in. + var/entry + /// The prompt's body, if any, of the TGUI window. + var/message + /// The time at which the number input was created, for displaying timeout progress. + var/start_time + /// The lifespan of the number input, after which the window will close and delete itself. + var/timeout + /// The title of the TGUI window + var/title + /// The TGUI UI state that will be returned in ui_state(). Default: always_state + var/datum/ui_state/state + +/datum/tgui_input_keycombo/New(mob/user, message, title, default, timeout, ui_state) + src.default = default + src.message = message + src.title = title + src.state = ui_state + if (timeout) + src.timeout = timeout + start_time = world.time + QDEL_IN(src, timeout) + +/datum/tgui_input_keycombo/Destroy(force) + SStgui.close_uis(src) + state = null + return ..() + +/** + * Waits for a user's response to the tgui_input_keycombo's prompt before returning. Returns early if + * the window was closed by the user. + */ +/datum/tgui_input_keycombo/proc/wait() + while (!entry && !closed && !QDELETED(src)) + stoplag(1) + +/datum/tgui_input_keycombo/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "KeyComboModal") + ui.open() + +/datum/tgui_input_keycombo/ui_close(mob/user) + . = ..() + closed = TRUE + +/datum/tgui_input_keycombo/ui_state(mob/user) + return state + +/datum/tgui_input_keycombo/ui_static_data(mob/user) + var/list/data = list() + data["init_value"] = default // Default is a reserved keyword + data["large_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_large) + data["message"] = message + data["swapped_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_swapped) + data["title"] = title + return data + +/datum/tgui_input_keycombo/ui_data(mob/user) + var/list/data = list() + if(timeout) + data["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS)) + return data + +/datum/tgui_input_keycombo/ui_act(action, list/params) + . = ..() + if (.) + return + switch(action) + if("submit") + set_entry(params["entry"]) + closed = TRUE + SStgui.close_uis(src) + return TRUE + if("cancel") + closed = TRUE + SStgui.close_uis(src) + return TRUE + +/datum/tgui_input_keycombo/proc/set_entry(entry) + src.entry = entry diff --git a/code/modules/transport/elevator/elev_panel.dm b/code/modules/transport/elevator/elev_panel.dm index 3e9e0e073c19f..24b6e0fa3175c 100644 --- a/code/modules/transport/elevator/elev_panel.dm +++ b/code/modules/transport/elevator/elev_panel.dm @@ -254,7 +254,7 @@ ui = new(user, src, "ElevatorPanel", name) ui.open() -/obj/machinery/elevator_control_panel/ui_status(mob/user) +/obj/machinery/elevator_control_panel/ui_status(mob/user, datum/ui_state/state) // We moved up a z-level, probably via the elevator itself, so don't preserve the UI. if(user.z != z) return UI_CLOSE diff --git a/code/modules/transport/linear_controller.dm b/code/modules/transport/linear_controller.dm index dd90562deb643..80c161c32918d 100644 --- a/code/modules/transport/linear_controller.dm +++ b/code/modules/transport/linear_controller.dm @@ -35,6 +35,9 @@ ///if true, the platform cannot be manually moved. var/controls_locked = FALSE + /// probability of being thrown hard during an emergency stop + var/throw_chance = 17.5 + /datum/transport_controller/linear/New(obj/structure/transport/linear/transport_module) transport_id = transport_module.transport_id create_modular_set = transport_module.create_modular_set diff --git a/code/modules/transport/tram/tram_controller.dm b/code/modules/transport/tram/tram_controller.dm index 5665755520e66..4dceecbfc4c26 100644 --- a/code/modules/transport/tram/tram_controller.dm +++ b/code/modules/transport/tram/tram_controller.dm @@ -17,17 +17,15 @@ var/travel_remaining = 0 ///how far in total we'll be travelling var/travel_trip_length = 0 - ///multiplier on how much damage/force the tram imparts on things it hits var/collision_lethality = 1 - var/obj/effect/landmark/transport/nav_beacon/tram/nav/nav_beacon - /// reference to the destination landmarks we consider ourselves "at" or travelling towards. since we potentially span multiple z levels we dont actually + /// reference to the navigation landmark associated with this tram. since we potentially span multiple z levels we dont actually /// know where on us this platform is. as long as we know THAT its on us we can just move the distance and direction between this /// and the destination landmark. + var/obj/effect/landmark/transport/nav_beacon/tram/nav/nav_beacon + /// reference to the landmark we consider ourself stationary at. var/obj/effect/landmark/transport/nav_beacon/tram/platform/idle_platform - /// reference to the destination landmarks we consider ourselves travelling towards. since we potentially span multiple z levels we dont actually - /// know where on us this platform is. as long as we know THAT its on us we can just move the distance and direction between this - /// and the destination landmark. + /// reference to the destination landmark we consider ourselves travelling towards. var/obj/effect/landmark/transport/nav_beacon/tram/platform/destination_platform var/current_speed = 0 @@ -284,7 +282,11 @@ degraded_stop() return PROCESS_KILL - normal_stop() + if((controller_status & COMM_ERROR) && prob(5)) // malfunctioning tram has a small chance to e-stop + degraded_stop() + else + normal_stop() + return PROCESS_KILL else if(world.time >= scheduled_move) @@ -538,7 +540,8 @@ set_status_code(COMM_ERROR, TRUE) SEND_TRANSPORT_SIGNAL(COMSIG_COMMS_STATUS, src, FALSE) paired_cabinet.generate_repair_signals() - collision_lethality = 1.25 + collision_lethality *= 1.25 + throw_chance *= 1.25 log_transport("TC: [specific_transport_id] starting Tram Malfunction event.") /** @@ -553,6 +556,7 @@ set_status_code(COMM_ERROR, FALSE) paired_cabinet.clear_repair_signals() collision_lethality = initial(collision_lethality) + throw_chance = initial(throw_chance) SEND_TRANSPORT_SIGNAL(COMSIG_COMMS_STATUS, src, TRUE) log_transport("TC: [specific_transport_id] ending Tram Malfunction event.") @@ -672,6 +676,11 @@ dispatch_transport(destination_platform = push_destination) return push_destination + +/datum/transport_controller/linear/tram/slow //for some reason speed is set to initial() in the code but if i touched it it would probably break so + speed_limiter = 3 + base_speed_limiter = 3 + /** * The physical cabinet on the tram. Acts as the interface between players and the controller datum. */ @@ -852,10 +861,7 @@ balloon_alert(user, "[panel_open ? "mounting bolts exposed" : "mounting bolts hidden"]") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/machinery/transport/tram_controller/deconstruct(disassembled = TRUE) - if(obj_flags & NO_DECONSTRUCTION) - return - +/obj/machinery/transport/tram_controller/on_deconstruction(disassembled) var/turf/drop_location = find_obstruction_free_location(1, src) if(disassembled) @@ -863,7 +869,6 @@ else new /obj/item/stack/sheet/mineral/titanium(drop_location, 2) new /obj/item/stack/sheet/iron(drop_location, 1) - qdel(src) /** * Update the blinky lights based on the controller status, allowing to quickly check without opening up the cabinet. diff --git a/code/modules/transport/tram/tram_controls.dm b/code/modules/transport/tram/tram_controls.dm index db8fe767155d2..435b47f9d1bfd 100644 --- a/code/modules/transport/tram/tram_controls.dm +++ b/code/modules/transport/tram/tram_controls.dm @@ -83,7 +83,7 @@ /obj/machinery/computer/tram_controls/ui_state(mob/user) return GLOB.not_incapacitated_state -/obj/machinery/computer/tram_controls/ui_status(mob/user,/datum/tgui/ui) +/obj/machinery/computer/tram_controls/ui_status(mob/user, datum/tgui/ui) var/datum/transport_controller/linear/tram/tram = transport_ref?.resolve() if(tram?.controller_active) diff --git a/code/modules/transport/tram/tram_displays.dm b/code/modules/transport/tram/tram_displays.dm index 0e36295f97ec7..47fe21f2ff19e 100644 --- a/code/modules/transport/tram/tram_displays.dm +++ b/code/modules/transport/tram/tram_displays.dm @@ -81,9 +81,7 @@ if(panel_open) . += span_notice("It is secured to the tram wall with [EXAMINE_HINT("bolts.")]") -/obj/machinery/transport/destination_sign/deconstruct(disassembled = TRUE) - if(obj_flags & NO_DECONSTRUCTION) - return +/obj/machinery/transport/destination_sign/on_deconstruction(disassembled) if(disassembled) new /obj/item/wallframe/indicator_display(drop_location()) else @@ -91,7 +89,6 @@ new /obj/item/stack/sheet/iron(drop_location(), 1) new /obj/item/shard(drop_location()) new /obj/item/shard(drop_location()) - qdel(src) /obj/machinery/transport/destination_sign/indicator/wrench_act_secondary(mob/living/user, obj/item/tool) . = ..() diff --git a/code/modules/transport/tram/tram_structures.dm b/code/modules/transport/tram/tram_structures.dm index ccf6a99d92967..74532d87be76d 100644 --- a/code/modules/transport/tram/tram_structures.dm +++ b/code/modules/transport/tram/tram_structures.dm @@ -31,6 +31,7 @@ opacity = FALSE anchored = TRUE flags_1 = PREVENT_CLICK_UNDER_1 + pass_flags_self = PASSWINDOW armor_type = /datum/armor/tram_structure smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_TRAM_STRUCTURE diff --git a/code/modules/transport/transport_module.dm b/code/modules/transport/transport_module.dm index 7a57529b8ff22..9fdfefc835cae 100644 --- a/code/modules/transport/transport_module.dm +++ b/code/modules/transport/transport_module.dm @@ -86,6 +86,7 @@ if(radial_travel) AddElement(/datum/element/contextual_screentip_bare_hands, lmb_text = "Send Transport") + ADD_TRAIT(src, TRAIT_CHASM_STOPPER, INNATE_TRAIT) set_movement_registrations() //since transport_controller datums find all connected platforms when a transport structure first creates it and then @@ -933,6 +934,12 @@ /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) var/throw_target = get_edge_target_turf(src, throw_direction) - var/datum/callback/land_slam = new(passenger, TYPE_PROC_REF(/mob/living/, tram_slam_land)) - passenger.throw_at(throw_target, 400, 4, force = MOVE_FORCE_OVERPOWERING, callback = land_slam) + passenger.throw_at(throw_target, 30, 7, force = MOVE_FORCE_OVERPOWERING) + +/obj/structure/transport/linear/tram/slow + transport_controller_type = /datum/transport_controller/linear/tram/slow + speed_limiter = /datum/transport_controller/linear/tram/slow::speed_limiter diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 61bc9ec6d4e6e..46b2470d647f4 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -247,6 +247,7 @@ #include "spell_mindswap.dm" #include "spell_names.dm" #include "spell_shapeshift.dm" +#include "spies.dm" #include "spritesheets.dm" #include "stack_singular_name.dm" #include "station_trait_tests.dm" diff --git a/code/modules/unit_tests/achievements.dm b/code/modules/unit_tests/achievements.dm index 44e1384c2e01a..decda52a2f5d7 100644 --- a/code/modules/unit_tests/achievements.dm +++ b/code/modules/unit_tests/achievements.dm @@ -2,13 +2,13 @@ /datum/unit_test/achievements /datum/unit_test/achievements/Run() - var/award_icons = icon_states(ACHIEVEMENTS_SET) for(var/datum/award/award as anything in subtypesof(/datum/award)) if(!initial(award.name)) //Skip abstract achievements types continue var/init_icon = initial(award.icon) - if(!init_icon || !(init_icon in award_icons)) - TEST_FAIL("Award [initial(award.name)] has an unexistent icon: \"[init_icon || "null"]\"") + var/init_icon_state = initial(award.icon_state) + if(!init_icon_state || !icon_exists(init_icon, init_icon_state)) + TEST_FAIL("Award [initial(award.name)] has a non-existent icon in [init_icon]: \"[init_icon_state || "null"]\"") if(length(initial(award.database_id)) > 32) //sql schema limit TEST_FAIL("Award [initial(award.name)] database id is too long") var/init_category = initial(award.category) diff --git a/code/modules/unit_tests/cardboard_cutouts.dm b/code/modules/unit_tests/cardboard_cutouts.dm index ce7066de1ca95..d18c7f0eb8a32 100644 --- a/code/modules/unit_tests/cardboard_cutouts.dm +++ b/code/modules/unit_tests/cardboard_cutouts.dm @@ -2,6 +2,14 @@ /datum/unit_test/cardboard_cutouts /datum/unit_test/cardboard_cutouts/Run() + for(var/datum/cardboard_cutout/cutout as anything in subtypesof(/datum/cardboard_cutout)) + var/direct_icon = initial(cutout.direct_icon) + if(isnull(direct_icon)) //these are dynamically generated. + continue + var/direct_state = initial(cutout.direct_icon_state) + if(!icon_exists(direct_icon, direct_state)) + TEST_FAIL("[cutout] has a non-existant icon state at: [direct_icon] - [direct_state]") + var/obj/item/cardboard_cutout/normal_cutout = new test_screenshot("normal_cutout", getFlatIcon(normal_cutout)) diff --git a/code/modules/unit_tests/changeling.dm b/code/modules/unit_tests/changeling.dm index c01105ce9c44c..1393eee838988 100644 --- a/code/modules/unit_tests/changeling.dm +++ b/code/modules/unit_tests/changeling.dm @@ -8,7 +8,7 @@ /datum/unit_test/transformation_sting/Run() var/mob/living/carbon/human/ling = setup_ling() var/mob/living/carbon/human/victim = setup_victim() - var/datum/antagonist/changeling/ling_datum = ling.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/ling_datum = IS_CHANGELING(ling) // Get the ability we're testing ling_datum.purchase_power(/datum/action/changeling/sting/transformation) diff --git a/code/modules/unit_tests/machine_disassembly.dm b/code/modules/unit_tests/machine_disassembly.dm index 59edb4ae9db6b..296df67b9d7ef 100644 --- a/code/modules/unit_tests/machine_disassembly.dm +++ b/code/modules/unit_tests/machine_disassembly.dm @@ -1,12 +1,35 @@ /// Ensures that when disassembling a machine, all the parts are given back +/datum/unit_test/machine_disassembly + /datum/unit_test/machine_disassembly/Run() var/obj/machinery/freezer = allocate(/obj/machinery/atmospherics/components/unary/thermomachine/freezer) var/turf/freezer_location = freezer.loc - freezer.deconstruct() + freezer.deconstruct(TRUE) // Check that the components are created TEST_ASSERT(locate(/obj/item/stock_parts/micro_laser) in freezer_location, "Couldn't find micro-laser when disassembling freezer") // Check that the circuit board itself is created TEST_ASSERT(locate(/obj/item/circuitboard/machine/thermomachine) in freezer_location, "Couldn't find the circuit board when disassembling freezer") + + // Frame should be spawned as well + TEST_ASSERT(locate(/obj/structure/frame/machine) in freezer_location, "Couldn't find the frame when disassembling freezer") + +/// Test that the computer is disassembled correctly +/datum/unit_test/computer_disassembly + +/datum/unit_test/computer_disassembly/Run() + var/obj/machinery/computer/pc = allocate(/obj/machinery/computer/crew) + var/pc_circuit = pc.circuit + var/turf/pc_location = pc.loc + pc.deconstruct(TRUE) + + var/obj/structure/frame/computer/frame = locate() in pc_location + TEST_ASSERT(frame, "Couldn't find the frame when disassembling computer") + TEST_ASSERT(frame.circuit == pc_circuit, "Circuit board in frame doesn't match the one in the computer") + + frame.deconstruct(TRUE) + TEST_ASSERT(locate(/obj/item/circuitboard/computer/crew) in pc_location, "Couldn't find the circuit board when disassembling computer frame") + TEST_ASSERT(locate(/obj/item/stack/cable_coil) in pc_location, "Couldn't find the cable coil when disassembling computer frame") + TEST_ASSERT(locate(/obj/item/stack/sheet/glass) in pc_location, "Couldn't find the glass sheet when disassembling computer frame") diff --git a/code/modules/unit_tests/outfit_sanity.dm b/code/modules/unit_tests/outfit_sanity.dm index 683cba3b2fd5f..842f5f1f7ebe6 100644 --- a/code/modules/unit_tests/outfit_sanity.dm +++ b/code/modules/unit_tests/outfit_sanity.dm @@ -5,7 +5,9 @@ if (!outfit_item) { \ TEST_FAIL("[outfit.name]'s [#outfit_key] is invalid! Could not equip a [outfit.##outfit_key] into that slot."); \ } \ - outfit_item.on_outfit_equip(H, FALSE, ##slot_name); \ + else { \ + outfit_item.on_outfit_equip(H, FALSE, ##slot_name); \ + } \ } /// See #66313 and #60901. outfit_sanity used to runtime whenever you had two mergable sheets in either hand. Previously, this only had a 3% chance of occuring. Now 100%. diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png index b1ec4226567d3..c63a02c837052 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changelingmidround.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changelingmidround.png index d8e9c548db997..e43584b63a010 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changelingmidround.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changelingmidround.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png index 3b723129ac84d..853ef8453830e 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_spy.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_spy.png new file mode 100644 index 0000000000000..103e9d60faf7c Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_spy.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_stowawaychangeling.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_stowawaychangeling.png index b1ec4226567d3..c63a02c837052 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_stowawaychangeling.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_stowawaychangeling.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey_holodeck.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey_holodeck.png deleted file mode 100644 index e0d02f4302f43..0000000000000 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey_holodeck.png and /dev/null differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png index 61656a8889214..5cdeedeffca7b 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png differ diff --git a/code/modules/unit_tests/spies.dm b/code/modules/unit_tests/spies.dm new file mode 100644 index 0000000000000..b4b1add333cb6 --- /dev/null +++ b/code/modules/unit_tests/spies.dm @@ -0,0 +1,41 @@ +/// Tests spy bounty setup +/datum/unit_test/spy_bounty + +/datum/unit_test/spy_bounty/Run() + var/mob/living/carbon/human/james_bond = allocate(/mob/living/carbon/human/consistent) + james_bond.mind_initialize() + james_bond.equipOutfit(/datum/outfit/job/assistant/consistent) + var/datum/antagonist/spy/spy = james_bond.mind.add_antag_datum(/datum/antagonist/spy) + + var/datum/component/spy_uplink/uplink = spy.uplink_weakref?.resolve() + TEST_ASSERT_NOTNULL(uplink, "Spy failed to be given an uplink!") + + var/datum/spy_bounty_handler/handler = uplink.handler + handler.num_attempts_override = 100 + + for(var/difficulty in handler.possible_uplink_items) + var/list/loot_pool = handler.possible_uplink_items[difficulty] + if(!length(loot_pool)) + TEST_FAIL("No rewards generated for spy bounty difficulty [difficulty]") + + for(var/difficulty in UNLINT(handler.bounty_types)) + var/list/bounty_type_pool = UNLINT(handler.bounty_types[difficulty]) + if(!length(bounty_type_pool)) + TEST_FAIL("No bounty types for spy bounty difficulty [difficulty] found") + + for(var/difficulty in UNLINT(handler.bounties)) + var/list/generated_bounties = UNLINT(handler.bounties[difficulty]) + if(difficulty == SPY_DIFFICULTY_HARD) + if(length(generated_bounties)) + TEST_FAIL("No [difficulty] bounties should not be generated on initial refresh!") + + else + if(!length(generated_bounties)) + TEST_FAIL("No bounties were generated on initial refresh for difficulty [difficulty]") + + handler.force_refresh() + + for(var/difficulty in UNLINT(handler.bounties)) + var/list/generated_bounties = UNLINT(handler.bounties[difficulty]) + if(!length(generated_bounties)) + TEST_FAIL("No bounties were generated on first refresh for difficulty [difficulty]") diff --git a/code/modules/unit_tests/tail_wag.dm b/code/modules/unit_tests/tail_wag.dm index ceb82e98c0d6b..cd82dfdfd50c9 100644 --- a/code/modules/unit_tests/tail_wag.dm +++ b/code/modules/unit_tests/tail_wag.dm @@ -11,22 +11,34 @@ // SANITY TEST // start wagging - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, TRUE) + dummy.wag_tail() if(!(dummy_tail.wag_flags & WAG_WAGGING)) TEST_FAIL("Tail did not start wagging when it should have!") // stop wagging - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, FALSE) + dummy.unwag_tail() if(dummy_tail.wag_flags & WAG_WAGGING) TEST_FAIL("Tail did not stop wagging when it should have!") + // TESTING WAG EMOTE + + // start wagging + dummy.emote("wag") + if(!(dummy_tail.wag_flags & WAG_WAGGING)) + TEST_FAIL("Tail did not start wagging after using the *wag emote!") + + // stop wagging + dummy.emote("wag") + if(dummy_tail.wag_flags & WAG_WAGGING) + TEST_FAIL("Tail did not stop wagging after using the *wag emote!") + // TESTING WAG_ABLE FLAG // flip the wag flag to unwaggable dummy_tail.wag_flags &= ~WAG_ABLE // try to wag it again - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, TRUE) + dummy.wag_tail() if(dummy_tail.wag_flags & WAG_WAGGING) TEST_FAIL("Tail should not have the ability to wag, yet it did!") @@ -34,19 +46,19 @@ dummy_tail.wag_flags |= WAG_ABLE // start wagging again - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, TRUE) + dummy.wag_tail() if(!(dummy_tail.wag_flags & WAG_WAGGING)) TEST_FAIL("Tail did not start wagging when it should have!") // TESTING STOP_AFTER // stop wagging - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, FALSE) + dummy.unwag_tail() if(dummy_tail.wag_flags & WAG_WAGGING) TEST_FAIL("Tail did not stop wagging when it should have!") // start wagging, stop after 0.1 seconds - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, TRUE, 0.1 SECONDS) + dummy.wag_tail(0.1 SECONDS) // because timers are a pain addtimer(VARSET_CALLBACK(src, timer_finished, TRUE), 0.2 SECONDS) if(!(dummy_tail.wag_flags & WAG_WAGGING)) @@ -67,7 +79,7 @@ TEST_FAIL("Tail was still wagging after being removed!") // try to wag the removed tail - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, TRUE) + dummy.wag_tail() if(dummy_tail.wag_flags & WAG_WAGGING) TEST_FAIL("A disembodied tail was able to start wagging!") @@ -75,7 +87,7 @@ // put it back and start wagging again dummy_tail.Insert(dummy, special = TRUE, movement_flags = DELETE_IF_REPLACED) - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, TRUE) + dummy.wag_tail() if(!(dummy_tail.wag_flags & WAG_WAGGING)) TEST_FAIL("Tail did not start wagging when it should have!") @@ -85,6 +97,6 @@ TEST_FAIL("A mob's tail was still wagging after being killed!") // check if we are still able to wag the tail after death - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, TRUE) + dummy.wag_tail() if(dummy_tail.wag_flags & WAG_WAGGING) TEST_FAIL("A dead mob was able to wag their tail!") diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 32783504fe871..bb76564e42c46 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1,4 +1,3 @@ - // TODO: Work into reworked uplinks. /// Selects a set number of unique items from the uplink, and deducts a percentage discount from them /proc/create_uplink_sales(num, datum/uplink_category/category, limited_stock, list/sale_items) @@ -8,7 +7,20 @@ var/datum/uplink_item/taken_item = pick_n_take(sale_items_copy) var/datum/uplink_item/uplink_item = new taken_item.type() var/discount = uplink_item.get_discount() - var/list/disclaimer = list("Void where prohibited.", "Not recommended for children.", "Contains small parts.", "Check local laws for legality in region.", "Do not taunt.", "Not responsible for direct, indirect, incidental or consequential damages resulting from any defect, error or failure to perform.", "Keep away from fire or flames.", "Product is provided \"as is\" without any implied or expressed warranties.", "As seen on TV.", "For recreational use only.", "Use only as directed.", "16% sales tax will be charged for orders originating within Space Nebraska.") + var/static/list/disclaimer = list( + "Void where prohibited.", + "Not recommended for children.", + "Contains small parts.", + "Check local laws for legality in region.", + "Do not taunt.", + "Not responsible for direct, indirect, incidental or consequential damages resulting from any defect, error or failure to perform.", + "Keep away from fire or flames.", + "Product is provided \"as is\" without any implied or expressed warranties.", + "As seen on TV.", + "For recreational use only.", + "Use only as directed.", + "16% sales tax will be charged for orders originating within Space Nebraska.", + ) uplink_item.limited_stock = limited_stock if(uplink_item.cost >= 20) //Tough love for nuke ops discount *= 0.5 @@ -111,10 +123,10 @@ /// Spawns an item and logs its purchase /datum/uplink_item/proc/purchase(mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) - var/atom/A = spawn_item(item, user, uplink_handler, source) + var/atom/spawned_item = spawn_item(item, user, uplink_handler, source) log_uplink("[key_name(user)] purchased [src] for [cost] telecrystals from [source]'s uplink") if(purchase_log_vis && uplink_handler.purchase_log) - uplink_handler.purchase_log.LogPurchase(A, src, cost) + uplink_handler.purchase_log.LogPurchase(spawned_item, src, cost) if(lock_other_purchases) uplink_handler.shop_locked = TRUE @@ -122,20 +134,48 @@ /datum/uplink_item/proc/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) if(!spawn_path) return - var/atom/A + var/atom/spawned_item if(ispath(spawn_path)) - A = new spawn_path(get_turf(user)) + spawned_item = new spawn_path(get_turf(user)) else - A = spawn_path + spawned_item = spawn_path if(refundable) - A.AddElement(/datum/element/uplink_reimburse, (refund_amount ? refund_amount : cost)) - if(ishuman(user) && isitem(A)) - var/mob/living/carbon/human/H = user - if(H.put_in_hands(A)) - to_chat(H, span_boldnotice("[A] materializes into your hands!")) - return A - to_chat(user, span_boldnotice("[A] materializes onto the floor!")) - return A + spawned_item.AddElement(/datum/element/uplink_reimburse, (refund_amount ? refund_amount : cost)) + var/mob/living/carbon/human/human_user = user + if(istype(human_user) && isitem(spawned_item) && human_user.put_in_hands(spawned_item)) + to_chat(human_user, span_boldnotice("[spawned_item] materializes into your hands!")) + else + to_chat(user, span_boldnotice("[spawned_item] materializes onto the floor!")) + SEND_SIGNAL(uplink_handler, COMSIG_ON_UPLINK_PURCHASE, spawned_item, user) + return spawned_item + +/// Used to create the uplink's item for generic use, rather than use by a Syndie specifically +/// Can be used to "de-restrict" some items, such as Nukie guns spawning with Syndicate pins +/datum/uplink_item/proc/spawn_item_for_generic_use(mob/user) + var/atom/movable/created = new item(user.loc) + + if(isgun(created)) + replace_pin(created) + else if(istype(created, /obj/item/storage/toolbox/guncase)) + for(var/obj/item/gun/gun in created) + replace_pin(gun) + + if(isobj(created)) + var/obj/created_obj = created + LAZYREMOVE(created_obj.req_access, ACCESS_SYNDICATE) + LAZYREMOVE(created_obj.req_one_access, ACCESS_SYNDICATE) + + return created + +/// Used by spawn_item_for_generic_use to replace the pin of a gun with a normal one +/datum/uplink_item/proc/replace_pin(obj/item/gun/gun_reward) + PRIVATE_PROC(TRUE) + + if(!istype(gun_reward.pin, /obj/item/firing_pin/implant/pindicate)) + return + + QDEL_NULL(gun_reward.pin) + gun_reward.pin = new /obj/item/firing_pin(gun_reward) ///For special overrides if an item can be bought or not. /datum/uplink_item/proc/can_be_bought(datum/uplink_handler/source) @@ -156,6 +196,7 @@ //Discounts (dynamically filled above) /datum/uplink_item/discounts category = /datum/uplink_category/discounts + purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY // Probably not necessary but just in case // Special equipment (Dynamically fills in uplink component) /datum/uplink_item/special_equipment @@ -164,6 +205,7 @@ desc = "Equipment necessary for accomplishing specific objectives. If you are seeing this, something has gone wrong." limited_stock = 1 illegal_tech = FALSE + purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY // Ditto /datum/uplink_item/special_equipment/purchase(mob/user, datum/component/uplink/U) ..() diff --git a/code/modules/uplink/uplink_items/ammunition.dm b/code/modules/uplink/uplink_items/ammunition.dm index e88727812528d..5326880d31be6 100644 --- a/code/modules/uplink/uplink_items/ammunition.dm +++ b/code/modules/uplink/uplink_items/ammunition.dm @@ -53,5 +53,5 @@ For when you really need a lot of things dead." item = /obj/item/ammo_box/a357 cost = 4 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //nukies get their own version + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) //nukies get their own version illegal_tech = FALSE diff --git a/code/modules/uplink/uplink_items/bundle.dm b/code/modules/uplink/uplink_items/bundle.dm index f236aa4da253a..b708af62b69c9 100644 --- a/code/modules/uplink/uplink_items/bundle.dm +++ b/code/modules/uplink/uplink_items/bundle.dm @@ -7,11 +7,12 @@ category = /datum/uplink_category/bundle surplus = 0 cant_discount = TRUE + purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY /datum/uplink_item/bundles_tc/random name = "Random Item" desc = "Picking this will purchase a random item. Useful if you have some TC to spare or if you haven't decided on a strategy yet." - item = /obj/effect/gibspawner/generic // non-tangible item because techwebs use this path to determine illegal tech + item = ABSTRACT_UPLINK_ITEM cost = 0 cost_override_string = "Varies" @@ -61,7 +62,7 @@ item = /obj/item/storage/box/syndicate/bundle_a cost = 20 stock_key = UPLINK_SHARED_STOCK_KITS - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) /datum/uplink_item/bundles_tc/bundle_b name = "Syndi-kit Special" @@ -72,7 +73,7 @@ item = /obj/item/storage/box/syndicate/bundle_b cost = 20 stock_key = UPLINK_SHARED_STOCK_KITS - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) /datum/uplink_item/bundles_tc/surplus name = "Syndicate Surplus Crate" @@ -81,7 +82,7 @@ Contents are sorted to always be worth 30 TC. The Syndicate will only provide one surplus item per agent." item = /obj/structure/closet/crate // will be replaced in purchase() cost = 20 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) stock_key = UPLINK_SHARED_STOCK_SURPLUS /// Value of items inside the crate in TC var/crate_tc_value = 30 @@ -170,5 +171,5 @@ The Syndicate will only provide one surplus item per agent." cost = 20 item = /obj/item/syndicrate_key - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) stock_key = UPLINK_SHARED_STOCK_SURPLUS diff --git a/code/modules/uplink/uplink_items/clownops.dm b/code/modules/uplink/uplink_items/clownops.dm index 852676dbcbb74..56c11fedc0cb8 100644 --- a/code/modules/uplink/uplink_items/clownops.dm +++ b/code/modules/uplink/uplink_items/clownops.dm @@ -8,7 +8,7 @@ cost = 10 item = /obj/item/pneumatic_cannon/pie/selfcharge surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/weapon_kits/bananashield name = "Bananium Energy Shield" @@ -18,7 +18,7 @@ item = /obj/item/shield/energy/bananium cost = 16 surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/weapon_kits/clownsword name = "Bananium Energy Sword" @@ -27,7 +27,7 @@ item = /obj/item/melee/energy/sword/bananium cost = 3 surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/weapon_kits/clownoppin name = "Ultra Hilarious Firing Pin" @@ -51,7 +51,7 @@ item = /obj/item/gun/ballistic/automatic/c20r/toy cost = 5 surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/weapon_kits/foammachinegun name = "Toy Machine Gun" @@ -60,7 +60,7 @@ item = /obj/item/gun/ballistic/automatic/l6_saw/toy cost = 10 surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/explosives/bombanana name = "Bombanana" @@ -69,7 +69,7 @@ item = /obj/item/food/grown/banana/bombanana cost = 4 //it is a bit cheaper than a minibomb because you have to take off your helmet to eat it, which is how you arm it surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/explosives/clown_bomb_clownops name = "Clown Bomb" @@ -81,7 +81,7 @@ item = /obj/item/sbeacondrop/clownbomb cost = 15 surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/explosives/clown_bomb_clownops/New() . = ..() @@ -94,7 +94,7 @@ item = /obj/item/grenade/chem_grenade/teargas/moustache cost = 3 surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/explosives/pinata name = "Weapons Grade Pinata Kit" @@ -158,4 +158,3 @@ cost = 1 purchasable_from = UPLINK_CLOWN_OPS illegal_tech = FALSE - diff --git a/code/modules/uplink/uplink_items/contractor.dm b/code/modules/uplink/uplink_items/contractor.dm index 6004caf97452e..7d261410e314d 100644 --- a/code/modules/uplink/uplink_items/contractor.dm +++ b/code/modules/uplink/uplink_items/contractor.dm @@ -13,7 +13,7 @@ item = /obj/item/storage/box/syndicate/contract_kit category = /datum/uplink_category/contractor cost = 20 - purchasable_from = ~(UPLINK_CLOWN_OPS | UPLINK_NUKE_OPS | UPLINK_TRAITORS) + purchasable_from = UPLINK_INFILTRATORS /datum/uplink_item/bundles_tc/contract_kit/purchase(mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) . = ..() @@ -36,7 +36,7 @@ name = "Contract Reroll" desc = "Request a reroll of your current contract list. Will generate a new target, \ payment, and dropoff for the contracts you currently have available." - item = /obj/effect/gibspawner/generic + item = ABSTRACT_UPLINK_ITEM limited_stock = 2 cost = 0 diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm index 66cb58c7b2899..7f87d93464e48 100644 --- a/code/modules/uplink/uplink_items/device_tools.dm +++ b/code/modules/uplink/uplink_items/device_tools.dm @@ -134,7 +134,7 @@ /datum/uplink_item/device_tools/failsafe name = "Failsafe Uplink Code" desc = "When entered the uplink will self-destruct immediately." - item = /obj/effect/gibspawner/generic + item = ABSTRACT_UPLINK_ITEM cost = 1 surplus = 0 restricted = TRUE diff --git a/code/modules/uplink/uplink_items/implant.dm b/code/modules/uplink/uplink_items/implant.dm index 87c9fd6c96c07..a2b21574f6f34 100644 --- a/code/modules/uplink/uplink_items/implant.dm +++ b/code/modules/uplink/uplink_items/implant.dm @@ -49,6 +49,7 @@ // An empty uplink is kinda useless. surplus = 0 restricted = TRUE + purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY /datum/uplink_item/implants/uplink/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) var/obj/item/storage/box/syndie_kit/uplink_box = ..() diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index 8793bc0fbe8e3..df4f235f50cca 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -28,7 +28,7 @@ /datum/uplink_item/role_restricted/bureaucratic_error name = "Organic Capital Disturbance Virus" desc = "Randomizes job positions presented to new hires. May lead to too many/too few security officers and/or clowns. Single use." - item = /obj/effect/gibspawner/generic + item = ABSTRACT_UPLINK_ITEM surplus = 0 limited_stock = 1 cost = 2 @@ -156,16 +156,17 @@ /datum/uplink_item/role_restricted/magillitis_serum name = "Magillitis Serum Autoinjector" desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in Hominidae. \ - Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." + Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas. \ + Now also contains regenerative chemicals to keep users healthy as they exercise their newfound muscles." item = /obj/item/reagent_containers/hypospray/medipen/magillitis cost = 15 restricted_roles = list(JOB_GENETICIST, JOB_RESEARCH_DIRECTOR) -/datum/uplink_item/role_restricted/gorillacubes - name = "Box of Gorilla Cubes" - desc = "A box with three Waffle Co. brand gorilla cubes. Eat big to get big. \ +/datum/uplink_item/role_restricted/gorillacube + name = "Gorilla Cube" + desc = "A Waffle Co. brand gorilla cube. Eat big to get big. \ Caution: Product may rehydrate when exposed to water." - item = /obj/item/storage/box/gorillacubes + item = /obj/item/food/monkeycube/gorilla cost = 6 restricted_roles = list(JOB_GENETICIST, JOB_RESEARCH_DIRECTOR) @@ -183,7 +184,7 @@ desc = "A bootleg copy of an collector item, this disk contains the procedure to perform advanced plastic surgery, allowing you to model someone's face and voice based on a picture taken by a camera on your offhand. \ All changes are superficial and does not change ones genetic makeup. \ Insert into an Operating Console to enable the procedure." - item = /obj/item/disk/surgery/brainwashing + item = /obj/item/disk/surgery/advanced_plastic_surgery restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_ROBOTICIST) cost = 1 surplus = 50 @@ -285,6 +286,13 @@ restricted_roles = list(JOB_CLOWN) surplus = 10 +/datum/uplink_item/role_restricted/clowncar/spawn_item_for_generic_use(mob/user) + var/obj/vehicle/sealed/car/clowncar/car = ..() + car.enforce_clown_role = FALSE + var/obj/item/key = new car.key_type(user.loc) + car.visible_message(span_notice("[key] drops out of [car] onto the floor.")) + return car + /datum/uplink_item/role_restricted/his_grace name = "His Grace" desc = "An incredibly dangerous weapon recovered from a station overcome by the grey tide. Once activated, He will thirst for blood and must be used to kill to sate that thirst. \ @@ -297,6 +305,7 @@ cost = 20 surplus = 0 restricted_roles = list(JOB_CHAPLAIN) + purchasable_from = ~UPLINK_SPY /datum/uplink_item/role_restricted/concealed_weapon_bay name = "Concealed Weapon Bay" @@ -380,3 +389,4 @@ restricted_roles = list(JOB_MIME) restricted = TRUE refundable = FALSE + purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index d8bead5da6781..127f17e84729b 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -76,26 +76,28 @@ name = "12g Buckshot Drum (Bulldog)" desc = "An additional 8-round buckshot magazine for use with the Bulldog shotgun. Front towards enemy." item = /obj/item/ammo_box/magazine/m12g + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/basic/slug name = "12g Slug Drum (Bulldog)" desc = "An additional 8-round slug magazine for use with the Bulldog shotgun. \ Now 8 times less likely to shoot your pals." item = /obj/item/ammo_box/magazine/m12g/slug + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/incendiary/dragon name = "12g Dragon's Breath Drum (Bulldog)" desc = "An alternative 8-round dragon's breath magazine for use in the Bulldog shotgun. \ 'I'm a fire starter, twisted fire starter!'" item = /obj/item/ammo_box/magazine/m12g/dragon - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/special/meteor name = "12g Meteorslug Shells (Bulldog)" desc = "An alternative 8-round meteorslug magazine for use in the Bulldog shotgun. \ Great for blasting holes into the hull and knocking down enemies." item = /obj/item/ammo_box/magazine/m12g/meteor - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = parent_type::purchasable_from | UPLINK_SPY // ~~ Ansem Pistol ~~ @@ -109,24 +111,28 @@ name = "10mm Handgun Magazine (Ansem)" desc = "An additional 8-round 10mm magazine, compatible with the Ansem pistol." item = /obj/item/ammo_box/magazine/m10mm + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/ap/m10mm name = "10mm Armour Piercing Magazine (Ansem)" desc = "An additional 8-round 10mm magazine, compatible with the Ansem pistol. \ These rounds are less effective at injuring the target but penetrate protective gear." item = /obj/item/ammo_box/magazine/m10mm/ap + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/hp/m10mm name = "10mm Hollow Point Magazine (Ansem)" desc = "An additional 8-round 10mm magazine, compatible with the Ansem pistol. \ These rounds are more damaging but ineffective against armour." item = /obj/item/ammo_box/magazine/m10mm/hp + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/incendiary/m10mm name = "10mm Incendiary Magazine (Ansem)" desc = "An additional 8-round 10mm magazine, compatible with the Ansem pistol. \ Loaded with incendiary rounds which inflict less damage, but ignite the target." item = /obj/item/ammo_box/magazine/m10mm/fire + purchasable_from = parent_type::purchasable_from | UPLINK_SPY //Medium-cost: 14 TC each. Meant for more expensive purchases with a goal in mind. @@ -197,6 +203,7 @@ desc = "A speed loader that contains seven additional .357 Magnum rounds; usable with the Syndicate revolver. \ For when you really need a lot of things dead. Operatives get a discount from most of our agents!" item = /obj/item/ammo_box/a357 + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/special/revolver/phasic name = ".357 Phasic Speed Loader (Revolver)" @@ -204,6 +211,7 @@ These bullets are made from an experimental alloy, 'Ghost Lead', that allows it to pass through almost any non-organic material. \ The name is a misnomer. It doesn't contain any lead whatsoever!" item = /obj/item/ammo_box/a357/phasic + purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/special/revolver/heartseeker name = ".357 Heartseeker Speed Loader (Revolver)" @@ -212,6 +220,7 @@ Brought to you by Roseus Galactic!" item = /obj/item/ammo_box/a357/heartseeker cost = 3 + purchasable_from = parent_type::purchasable_from | UPLINK_SPY // ~~ Grenade Launcher ~~ // 'If god had wanted you to live, he would not have created ME!' @@ -591,7 +600,7 @@ desc = "An upgraded, elite version of the Syndicate MODsuit. It features fireproofing, and also \ provides the user with superior armor and mobility compared to the standard Syndicate MODsuit." item = /obj/item/mod/control/pre_equipped/elite - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/suits/energy_shield name = "MODsuit Energy Shield Module" @@ -599,28 +608,28 @@ before needing to recharge. Used wisely, this module will keep you alive for a lot longer." item = /obj/item/mod/module/energy_shield cost = 8 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/suits/emp_shield name = "MODsuit Advanced EMP Shield Module" desc = "An advanced EMP shield module for a MODsuit. It protects your entire body from electromagnetic pulses." item = /obj/item/mod/module/emp_shield/advanced cost = 5 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/suits/injector name = "MODsuit Injector Module" desc = "An injector module for a MODsuit. It is an extendable piercing injector with 30u capacity." item = /obj/item/mod/module/injector cost = 2 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/suits/holster name = "MODsuit Holster Module" desc = "A holster module for a MODsuit. It can stealthily store any not too heavy gun inside it." item = /obj/item/mod/module/holster cost = 2 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/device_tools/medgun_mod name = "Medbeam Gun Module" @@ -665,7 +674,7 @@ In its crowbar configuration, it can be used to force open airlocks. Very useful for entering the station or its departments." item = /obj/item/crowbar/power/syndicate cost = 4 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY /datum/uplink_item/device_tools/medkit name = "Syndicate Combat Medic Kit" @@ -692,7 +701,7 @@ desc = "A potion recovered at great risk by undercover Syndicate operatives and then subsequently modified with Syndicate technology. \ Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors." cost = 4 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY restricted = TRUE // Implants @@ -717,6 +726,7 @@ This will permanently destroy your body, however." item = /obj/item/storage/box/syndie_kit/imp_microbomb cost = 2 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_SPY /datum/uplink_item/implants/nuclear/macrobomb name = "Macrobomb Implant" @@ -732,18 +742,21 @@ Prevents collapsing from critical condition, but explodes after a while." item = /obj/item/storage/box/syndie_kit/imp_deniability cost = 6 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_SPY /datum/uplink_item/implants/nuclear/reviverplus name = "Reviver Implant" desc = "This implant will attempt to revive and heal you if you lose consciousness. Comes with an autosurgeon." item = /obj/item/autosurgeon/syndicate/reviver cost = 8 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_SPY /datum/uplink_item/implants/nuclear/thermals name = "Thermal Eyes" desc = "These cybernetic eyes will give you thermal vision. Comes with a free autosurgeon." item = /obj/item/autosurgeon/syndicate/thermal_eyes cost = 8 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_SPY /datum/uplink_item/implants/nuclear/implants/xray name = "X-ray Vision Implant" @@ -756,6 +769,7 @@ desc = "This implant will help you get back up on your feet faster after being stunned. Comes with an autosurgeon." item = /obj/item/autosurgeon/syndicate/anti_stun cost = 8 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_SPY // Badass (meme items) diff --git a/code/modules/uplink/uplink_items/species.dm b/code/modules/uplink/uplink_items/species.dm index 54ba353c00adb..5eb4bbdcb1776 100644 --- a/code/modules/uplink/uplink_items/species.dm +++ b/code/modules/uplink/uplink_items/species.dm @@ -4,7 +4,7 @@ /datum/uplink_item/species_restricted category = /datum/uplink_category/species - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) /datum/uplink_item/species_restricted/moth_lantern name = "Extra-Bright Lantern" diff --git a/code/modules/uplink/uplink_items/spy_unique.dm b/code/modules/uplink/uplink_items/spy_unique.dm new file mode 100644 index 0000000000000..2f9c4b32576dc --- /dev/null +++ b/code/modules/uplink/uplink_items/spy_unique.dm @@ -0,0 +1,123 @@ +/datum/uplink_category/spy_unique + name = "Spy Unique" + +// This is solely for uplink items that the spy can randomly obtain via bounties. +/datum/uplink_item/spy_unique + category = /datum/uplink_category/spy_unique + cant_discount = TRUE + surplus = FALSE + purchasable_from = UPLINK_SPY + // Cost doesn't really matter since it's free, but it determines which loot pool it falls into. + // By default, these fall into easy-medium spy bounty loot pool + cost = SPY_LOWER_COST_THRESHOLD + +/datum/uplink_item/spy_unique/syndie_bowman + name = "Syndicate Bowman" + desc = "A bowman headset for members of the Syndicate. Not very conspicuous." + item = /obj/item/radio/headset/syndicate/alt + cost = 1 + +/datum/uplink_item/spy_unique/megaphone + name = "Megaphone" + desc = "A megaphone. It's loud." + item = /obj/item/megaphone + cost = 1 + +/datum/uplink_item/spy_unique/combat_gloves + name = "Combat Gloves" + desc = "A pair of combat gloves. They're insulated!" + item = /obj/item/clothing/gloves/combat + cost = 1 + +/datum/uplink_item/spy_unique/krav_maga + name = "Combat Gloves Plus" + desc = "A pair of combat gloves plus. They're insulated AND you can do martial arts with it!" + item = /obj/item/clothing/gloves/krav_maga/combatglovesplus + +/datum/uplink_item/spy_unique/tackle_gloves + name = "Guerrilla Gloves" + desc = "A pair of Guerrilla gloves. They're insulated AND you can tackle people with it!" + item = /obj/item/clothing/gloves/tackler/combat/insulated + +/datum/uplink_item/spy_unique/kudzu + name = "Kudzu" + desc = "A packet of Kudzu - plant and forget, a great distraction." + item = /obj/item/seeds/kudzu + +/datum/uplink_item/spy_unique/big_knife + name = "Combat Knife" + desc = "A big knife. It's sharp." + item = /obj/item/knife/combat + +/datum/uplink_item/spy_unique/switchblade + name = "Switchblade" + desc = "A switchblade. Switches between not sharp and sharp." + item = /obj/item/switchblade + +/datum/uplink_item/spy_unique/sechud_implant + name = "SecHUD Implant" + desc = "A SecHUD implant. Shows you the ID of people you're looking at. It's also stealthy!" + item = /obj/item/autosurgeon/syndicate/contraband_sechud + +/datum/uplink_item/spy_unique/rifle_prime + name = "Bolt-Action Rifle" + desc = "A bolt-action rifle, with a scope. Won't jam, either." + item = /obj/item/gun/ballistic/rifle/boltaction/prime + cost = SPY_UPPER_COST_THRESHOLD + +/datum/uplink_item/spy_unique/cycler_shotgun + name = "Cycler Shotgun" + desc = "A cycler shotgun. It's a shotgun that cycles between two barrels." + item = /obj/item/gun/ballistic/shotgun/automatic/dual_tube/deadly + cost = SPY_UPPER_COST_THRESHOLD + +/datum/uplink_item/spy_unique/bulldog_shotgun + name = "Bulldog Shotgun" + desc = "A bulldog shotgun. It's a shotgun that shoots bulldogs." + item = /obj/item/gun/ballistic/shotgun/bulldog/unrestricted + cost = SPY_UPPER_COST_THRESHOLD + +/datum/uplink_item/spy_unique/ansem_pistol + name = "Ansem Pistol" + desc = "A pistol that's really good at making people sleep." + item = /obj/item/gun/ballistic/automatic/pistol/clandestine + cost = SPY_UPPER_COST_THRESHOLD + +/datum/uplink_item/spy_unique/rocket_launcher + name = "Rocket Launcher" + desc = "A rocket launcher. I would recommend against jumping with it." + item = /obj/item/gun/ballistic/rocketlauncher + cost = SPY_UPPER_COST_THRESHOLD - 1 // It's a meme item + +/datum/uplink_item/spy_unique/shotgun_ammo + name = "Box of Buckshot" + desc = "A box of buckshot rounds for a shotgun. For when you don't want to miss." + item = /obj/item/storage/box/lethalshot + cost = 1 + +/datum/uplink_item/spy_unique/shotgun_ammo/breacher_slug + name = "Box of Breacher Slugs" + desc = "A box of breacher slugs for a shotgun. For making a good first impression." + item = /obj/item/storage/box/breacherslug + +/datum/uplink_item/spy_unique/shotgun_ammo/slugs + name = "Box of Slugs" + desc = "A box of slugs for a shotgun. For big game hunting." + item = /obj/item/storage/box/slugs + +/datum/uplink_item/spy_unique/stealth_belt + name = "Stealth Belt" + desc = "A stealth belt that lets you sneak behind enemy lines." + item = /obj/item/shadowcloak/weaker + cost = SPY_UPPER_COST_THRESHOLD + +/datum/uplink_item/spy_unique/katana + name = "Katana" + desc = "A really sharp Katana. Did I mention it's sharp?" + item = /obj/item/katana + cost = /datum/uplink_item/dangerous/doublesword::cost // Puts it in the same pool as Desword + +/datum/uplink_item/spy_unique/medkit_lite + name = "Syndicate First Medic Kit" + desc = "A syndicate tactical combat medkit, but only stocked enough to do basic first aid." + item = /obj/item/storage/medkit/tactical_lite diff --git a/code/modules/uplink/uplink_items/stealthy.dm b/code/modules/uplink/uplink_items/stealthy.dm index 793120fe56f34..fb450fb68df93 100644 --- a/code/modules/uplink/uplink_items/stealthy.dm +++ b/code/modules/uplink/uplink_items/stealthy.dm @@ -102,4 +102,4 @@ cost = 7 surplus = 50 limited_stock = 1 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_INFILTRATORS) + purchasable_from = UPLINK_TRAITORS | UPLINK_SPY diff --git a/code/modules/uplink/uplink_items/stealthy_tools.dm b/code/modules/uplink/uplink_items/stealthy_tools.dm index 60f007ebae772..59b8f6fca77e6 100644 --- a/code/modules/uplink/uplink_items/stealthy_tools.dm +++ b/code/modules/uplink/uplink_items/stealthy_tools.dm @@ -102,7 +102,7 @@ /datum/uplink_item/stealthy_tools/telecomm_blackout name = "Disable Telecomms" desc = "When purchased, a virus will be uploaded to the telecommunication processing servers to temporarily disable themselves." - item = /obj/effect/gibspawner/generic + item = ABSTRACT_UPLINK_ITEM surplus = 0 progression_minimum = 15 MINUTES limited_stock = 1 @@ -117,7 +117,7 @@ /datum/uplink_item/stealthy_tools/blackout name = "Trigger Stationwide Blackout" desc = "When purchased, a virus will be uploaded to the engineering processing servers to force a routine power grid check, forcing all APCs on the station to be temporarily disabled." - item = /obj/effect/gibspawner/generic + item = ABSTRACT_UPLINK_ITEM surplus = 0 progression_minimum = 20 MINUTES limited_stock = 1 diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index d5a3d7bdc7d80..37f6eb7efa501 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -9,7 +9,7 @@ movedelay = 0.6 car_traits = CAN_KIDNAP key_type = /obj/item/bikehorn - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 8 light_power = 2 light_on = FALSE @@ -179,7 +179,7 @@ to_chat(user, span_danger("You scramble [src]'s child safety lock, and a panel with six colorful buttons appears!")) initialize_controller_action_type(/datum/action/vehicle/sealed/roll_the_dice, VEHICLE_CONTROL_DRIVE) initialize_controller_action_type(/datum/action/vehicle/sealed/cannon, VEHICLE_CONTROL_DRIVE) - AddElement(/datum/element/waddling) + AddElementTrait(TRAIT_WADDLING, INNATE_TRAIT, /datum/element/waddling) return TRUE /obj/vehicle/sealed/car/clowncar/atom_destruction(damage_flag) diff --git a/code/modules/vehicles/cars/vim.dm b/code/modules/vehicles/cars/vim.dm index a37c6e18b8eee..53eee5105a97e 100644 --- a/code/modules/vehicles/cars/vim.dm +++ b/code/modules/vehicles/cars/vim.dm @@ -13,7 +13,7 @@ enter_delay = 20 movedelay = 0.6 engine_sound_length = 0.3 SECONDS - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 4 light_power = 2 light_on = FALSE diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index dc7304a138807..e03847037c8db 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -29,7 +29,7 @@ move_force = MOVE_FORCE_VERY_STRONG move_resist = MOVE_FORCE_EXTREMELY_STRONG COOLDOWN_DECLARE(mecha_bump_smash) - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE light_range = 8 generic_canpass = FALSE @@ -457,9 +457,9 @@ . += span_notice("[icon2html(ME, user)] \A [ME].") if(mecha_flags & PANEL_OPEN) if(servo) - . += span_notice("Micro-servos reduce movement power usage by [100 - round(100 / servo.rating)]%") + . += span_notice("Servo reduces movement power usage by [100 - round(100 / servo.rating)]%") else - . += span_warning("It's missing a micro-servo.") + . += span_warning("It's missing a servo.") if(capacitor) . += span_notice("Capacitor increases armor against energy attacks by [capacitor.rating * 5].") else diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index f1c7bac4f81cd..35b53c30ccfc8 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -164,7 +164,7 @@ own integrity back to max. Shield is automatically dropped if we run out of powe pixel_y = 4 max_integrity = 10000 anchored = TRUE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = MINIMUM_USEFUL_LIGHT_RANGE light_power = 5 light_color = LIGHT_COLOR_ELECTRIC_CYAN diff --git a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm index c7c082a20e887..42a61e03b5e0f 100644 --- a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm @@ -32,11 +32,16 @@ ADD_TRAIT(src, TRAIT_INSTANTLY_PROCESSES_BOULDERS, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_BOULDER_BREAKER, INNATE_TRAIT) -/obj/item/mecha_parts/mecha_equipment/drill/action(mob/source, atom/target, list/modifiers) - // Check if we can even use the equipment to begin with. +/obj/item/mecha_parts/mecha_equipment/drill/do_after_checks(atom/target) + // Gotta be close to the target + if(!loc.Adjacent(target)) + return FALSE + // Check if we can still use the equipment & use power for every iteration of do after if(!action_checks(target)) - return + return FALSE + return ..() +/obj/item/mecha_parts/mecha_equipment/drill/action(mob/source, atom/target, list/modifiers) // We can only drill non-space turfs, living mobs and objects. if(isspaceturf(target) || !(isliving(target) || isobj(target) || isturf(target))) return @@ -50,17 +55,23 @@ // You can't drill harder by clicking more. if(!DOING_INTERACTION_WITH_TARGET(source, target) && do_after_cooldown(target, source, DOAFTER_SOURCE_MECHADRILL)) - target.visible_message(span_warning("[chassis] starts to drill [target]."), \ span_userdanger("[chassis] starts to drill [target]..."), \ span_hear("You hear drilling.")) log_message("Started drilling [target]", LOG_MECHA) + // Drilling a turf is a one-and-done procedure. if(isturf(target)) + // Check if we can even use the equipment to begin with. + if(!action_checks(target)) + return + var/turf/T = target T.drill_act(src, source) + return ..() + // Drilling objects and mobs is a repeating procedure. while(do_after_mecha(target, source, drill_delay)) if(isliving(target)) diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index 335e8bc5a3e12..c0047eb91d7f0 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -552,6 +552,7 @@ range = MECHA_MELEE toolspeed = 0.8 mech_flags = EXOSUIT_MODULE_PADDY + projectiles_per_shot = 0 ///Chassis but typed for the cargo_hold var var/obj/vehicle/sealed/mecha/ripley/secmech ///Audio for using the hydraulic clamp @@ -570,10 +571,13 @@ secmech = null return ..() -/obj/item/mecha_parts/mecha_equipment/weapon/paddy_claw/action(mob/living/source, atom/target, list/modifiers) +/obj/item/mecha_parts/mecha_equipment/weapon/paddy_claw/action(mob/source, atom/target, list/modifiers) if(!secmech.cargo_hold) //We did try CRASH("Mech [chassis] has a claw device, but no internal storage. This should be impossible.") - if(ismob(target)) + if(!action_checks(target)) + return + if(isliving(target)) + . = ..() var/mob/living/mobtarget = target if(mobtarget.move_resist == MOVE_FORCE_OVERPOWERING) //No megafauna or bolted AIs, please. to_chat(source, "[span_warning("[src] is unable to lift [mobtarget].")]") @@ -596,11 +600,12 @@ carbontarget.update_handcuffed() return - if(!istype(target, /obj/machinery/door)) + if(istype(target, /obj/machinery/door)) + . = ..() + var/obj/machinery/door/target_door = target + playsound(chassis, clampsound, 50, FALSE, -6) + target_door.try_to_crowbar(src, source) return - var/obj/machinery/door/target_door = target - playsound(chassis, clampsound, 50, FALSE, -6) - target_door.try_to_crowbar(src, source) /obj/item/mecha_parts/mecha_equipment/weapon/paddy_claw/get_snowflake_data() return list( diff --git a/code/modules/vehicles/mecha/mecha_construction_paths.dm b/code/modules/vehicles/mecha/mecha_construction_paths.dm index 3287d66c7bf2c..9a05e3df696d6 100644 --- a/code/modules/vehicles/mecha/mecha_construction_paths.dm +++ b/code/modules/vehicles/mecha/mecha_construction_paths.dm @@ -197,24 +197,24 @@ "key" = /obj/item/stock_parts/servo, "action" = ITEM_MOVE_INSIDE, "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanning module is secured, the micro-servo can be added.", - "forward_message" = "added micro-servo", + "desc" = "Scanning module is secured, the servo can be added.", + "forward_message" = "added servo", "backward_message" = "unsecured capacitor" ), list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, - "desc" = "Micro-servo is installed, and can be screwed into place.", - "forward_message" = "secured micro-servo", - "backward_message" = "removed micro-servo" + "desc" = "Servo is installed, and can be screwed into place.", + "forward_message" = "secured servo", + "backward_message" = "removed servo" ), list( "key" = /obj/item/stock_parts/cell, "action" = ITEM_MOVE_INSIDE, "back_key" = TOOL_SCREWDRIVER, - "desc" = "Micro-servo is secured, and the power cell can be added.", + "desc" = "Servo is secured, and the power cell can be added.", "forward_message" = "added power cell", - "backward_message" = "unsecured micro-servo" + "backward_message" = "unsecured servo" ), list( "key" = TOOL_SCREWDRIVER, @@ -534,7 +534,7 @@ list( "key" = /obj/item/stock_parts/servo, "action" = ITEM_MOVE_INSIDE, - "desc" = "Humor micro-servo can be added!", + "desc" = "Humor servo can be added!", "forward_message" = "added smile" ), list( @@ -680,24 +680,24 @@ "key" = /obj/item/stock_parts/servo, "action" = ITEM_MOVE_INSIDE, "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured, the micro-servo can be added.", - "forward_message" = "added micro-servo", + "desc" = "Capacitor is secured, the servo can be added.", + "forward_message" = "added servo", "backward_message" = "unsecured capacitor" ), list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, - "desc" = "Micro-servo is installed, and can be screwed into place.", - "forward_message" = "secured micro-servo", - "backward_message" = "removed micro-servo" + "desc" = "Servo is installed, and can be screwed into place.", + "forward_message" = "secured servo", + "backward_message" = "removed servo" ), list( "key" = /obj/item/stack/ore/bluespace_crystal, "amount" = 1, "back_key" = TOOL_SCREWDRIVER, - "desc" = "Micro-servo is secured, and the bluespace crystal can be added.", + "desc" = "Servo is secured, and the bluespace crystal can be added.", "forward_message" = "added bluespace crystal", - "backward_message" = "unsecured micro-servo" + "backward_message" = "unsecured servo" ), list( "key" = /obj/item/stack/cable_coil, diff --git a/code/modules/vehicles/mecha/mecha_movement.dm b/code/modules/vehicles/mecha/mecha_movement.dm index a77381fe97a87..aa86d57a0da8f 100644 --- a/code/modules/vehicles/mecha/mecha_movement.dm +++ b/code/modules/vehicles/mecha/mecha_movement.dm @@ -97,7 +97,7 @@ if(isnull(capacitor)) missing_parts += "capacitor" if(isnull(servo)) - missing_parts += "micro-servo" + missing_parts += "servo" if(length(missing_parts)) if(TIMER_COOLDOWN_FINISHED(src, COOLDOWN_MECHA_MESSAGE)) to_chat(occupants, "[icon2html(src, occupants)][span_warning("Missing [english_list(missing_parts)].")]") diff --git a/code/modules/vehicles/mecha/mecha_ui.dm b/code/modules/vehicles/mecha/mecha_ui.dm index 1bf5b8674a47d..712d5f0d712bf 100644 --- a/code/modules/vehicles/mecha/mecha_ui.dm +++ b/code/modules/vehicles/mecha/mecha_ui.dm @@ -9,7 +9,7 @@ ui.open() ui_view.display_to(user) -/obj/vehicle/sealed/mecha/ui_status(mob/user) +/obj/vehicle/sealed/mecha/ui_status(mob/user, datum/ui_state/state) if(contains(user)) return UI_INTERACTIVE return min( diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 41ed5a0445782..f101c5b2f7486 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -236,6 +236,11 @@ voice = vendor_voice_by_type[type] if(build_inv) //non-constructable vending machine + ///Non-constructible vending machines do not have a refill canister to populate its products list from, + ///Which apparently is still needed in the case we use product categories instead. + if(product_categories) + for(var/list/category as anything in product_categories) + products |= category["products"] build_inventories() slogan_list = splittext(product_slogans, ";") @@ -298,12 +303,10 @@ for(var/obj/item/vending_refill/installed_refill in component_parts) restock(installed_refill) -/obj/machinery/vending/deconstruct(disassembled = TRUE) +/obj/machinery/vending/on_deconstruction(disassembled) if(refill_canister) return ..() - if(!(obj_flags & NO_DECONSTRUCTION)) //the non constructable vendors drop metal instead of a machine frame. - new /obj/item/stack/sheet/iron(loc, 3) - qdel(src) + new /obj/item/stack/sheet/iron(loc, 3) /obj/machinery/vending/update_appearance(updates=ALL) . = ..() @@ -818,7 +821,7 @@ post_crush_living(living_target, was_alive) flags_to_return |= (SUCCESSFULLY_CRUSHED_MOB|SUCCESSFULLY_CRUSHED_ATOM) - else if (atom_target.uses_integrity && !(atom_target.invisibility > SEE_INVISIBLE_LIVING) && !(is_type_in_typecache(atom_target, GLOB.WALLITEMS_INTERIOR) || is_type_in_typecache(atom_target, GLOB.WALLITEMS_EXTERIOR))) + else if(check_atom_crushable(atom_target)) atom_target.take_damage(adjusted_damage, damage_type, damage_flag, FALSE, crush_dir) crushed = TRUE flags_to_return |= SUCCESSFULLY_CRUSHED_ATOM @@ -858,6 +861,21 @@ /atom/movable/proc/post_tilt() return +/proc/check_atom_crushable(atom/atom_target) + /// Contains structures and items that vendors shouldn't crush when we land on them. + var/static/list/vendor_uncrushable_objects = list( + /obj/structure/chair, + /obj/machinery/conveyor, + ) + GLOB.WALLITEMS_INTERIOR + GLOB.WALLITEMS_EXTERIOR + + if(is_type_in_list(atom_target, vendor_uncrushable_objects)) //make sure its not in the list of "uncrushable" stuff + return FALSE + + if (atom_target.uses_integrity && !(atom_target.invisibility > SEE_INVISIBLE_LIVING)) //check if it has integrity + allow ninjas, etc to be crushed in cloak + return TRUE //SMUSH IT + + return FALSE + /obj/machinery/vending/post_crush_living(mob/living/crushed, was_alive) if(was_alive && crushed.stat == DEAD && crushed.client) @@ -1085,7 +1103,7 @@ replacer.play_rped_sound() return TRUE -/obj/machinery/vending/on_deconstruction() +/obj/machinery/vending/on_deconstruction(disassembled) update_canister() . = ..() @@ -1656,14 +1674,13 @@ /obj/machinery/vending/custom/crowbar_act(mob/living/user, obj/item/attack_item) return FALSE -/obj/machinery/vending/custom/deconstruct(disassembled) +/obj/machinery/vending/custom/on_deconstruction(disassembled) unbuckle_all_mobs(TRUE) var/turf/current_turf = get_turf(src) if(current_turf) for(var/obj/item/stored_item in contents) stored_item.forceMove(current_turf) explosion(src, devastation_range = -1, light_impact_range = 3) - return ..() /** * Vends an item to the user. Handles all the logic: diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index eeca2422e0c6c..47276acb25914 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -18,6 +18,7 @@ /obj/item/clothing/mask/bandana = 3, /obj/item/clothing/mask/bandana/striped = 3, /obj/item/clothing/mask/bandana/skull = 3, + /obj/item/clothing/mask/facescarf = 3, /obj/item/clothing/neck/scarf = 6, /obj/item/clothing/neck/large_scarf = 6, /obj/item/clothing/neck/large_scarf/red = 6, @@ -161,6 +162,8 @@ /obj/item/clothing/suit/hooded/ethereal_raincoat = 3, /obj/item/clothing/under/ethereal_tunic = 3, + /obj/item/clothing/mask/kitsune = 3, + /obj/item/clothing/mask/rebellion = 6, /obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian = 1, /obj/item/clothing/suit/costume/irs = 20, /obj/item/clothing/head/costume/irs = 20, diff --git a/code/modules/wiremod/components/admin/proccall.dm b/code/modules/wiremod/components/admin/proccall.dm index 56baaee1447a5..b86e05e6c8a8b 100644 --- a/code/modules/wiremod/components/admin/proccall.dm +++ b/code/modules/wiremod/components/admin/proccall.dm @@ -88,7 +88,7 @@ . = list() .["possible_types"] = GLOB.wiremod_fundamental_types -/obj/item/circuit_component/proccall/ui_status(mob/user) +/obj/item/circuit_component/proccall/ui_status(mob/user, datum/ui_state/state) if(!check_rights_for(user.client, R_VAREDIT)) return UI_CLOSE return UI_INTERACTIVE diff --git a/code/modules/wiremod/components/bci/hud/bar_overlay.dm b/code/modules/wiremod/components/bci/hud/bar_overlay.dm index 5a1a46f5716ea..07d13a4ccfb9e 100644 --- a/code/modules/wiremod/components/bci/hud/bar_overlay.dm +++ b/code/modules/wiremod/components/bci/hud/bar_overlay.dm @@ -58,6 +58,7 @@ /datum/atom_hud/alternate_appearance/basic/one_person, "bar_overlay_[REF(src)]", cool_overlay, + null, owner, ) alt_appearance.show_to(owner) diff --git a/code/modules/wiremod/components/bci/hud/counter_overlay.dm b/code/modules/wiremod/components/bci/hud/counter_overlay.dm index d46c34ab047bf..a0f83b6f72eff 100644 --- a/code/modules/wiremod/components/bci/hud/counter_overlay.dm +++ b/code/modules/wiremod/components/bci/hud/counter_overlay.dm @@ -76,6 +76,7 @@ /datum/atom_hud/alternate_appearance/basic/one_person, "counter_overlay_[REF(src)]", counter, + null, owner, ) alt_appearance.show_to(owner) @@ -101,6 +102,7 @@ /datum/atom_hud/alternate_appearance/basic/one_person, "counter_overlay_[REF(src)]_[i]", number, + null, owner, ) number_alt_appearance.show_to(owner) diff --git a/code/modules/wiremod/components/bci/hud/object_overlay.dm b/code/modules/wiremod/components/bci/hud/object_overlay.dm index 28e54cb7ee277..07e0f76761e55 100644 --- a/code/modules/wiremod/components/bci/hud/object_overlay.dm +++ b/code/modules/wiremod/components/bci/hud/object_overlay.dm @@ -118,6 +118,7 @@ /datum/atom_hud/alternate_appearance/basic/one_person, "object_overlay_[REF(src)]", cool_overlay, + null, owner, ) alt_appearance.show_to(owner) diff --git a/code/modules/wiremod/core/component_printer.dm b/code/modules/wiremod/core/component_printer.dm index 3fb736540ec18..7c691e3a4c47b 100644 --- a/code/modules/wiremod/core/component_printer.dm +++ b/code/modules/wiremod/core/component_printer.dm @@ -184,8 +184,7 @@ "cost" = cost, "id" = researched_design_id, "categories" = design.category, - "icon" = "[icon_size == size32x32 ? "" : "[icon_size] "][design.id]", - "constructionTime" = -1 + "icon" = "[icon_size == size32x32 ? "" : "[icon_size] "][design.id]" ) data["designs"] = designs diff --git a/code/modules/wiremod/core/integrated_circuit.dm b/code/modules/wiremod/core/integrated_circuit.dm index 0499a56dcd474..7dde89e511612 100644 --- a/code/modules/wiremod/core/integrated_circuit.dm +++ b/code/modules/wiremod/core/integrated_circuit.dm @@ -413,7 +413,7 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit) return FALSE return ..() -/obj/item/integrated_circuit/ui_status(mob/user) +/obj/item/integrated_circuit/ui_status(mob/user, datum/ui_state/state) . = ..() if (isobserver(user)) diff --git a/code/modules/wiremod/core/marker.dm b/code/modules/wiremod/core/marker.dm index ecd68be413cc8..50d4324c1547f 100644 --- a/code/modules/wiremod/core/marker.dm +++ b/code/modules/wiremod/core/marker.dm @@ -32,6 +32,13 @@ if(marked_atom || !user.Adjacent(target) || is_right_clicking) return ..() + if(isliving(target)) + INVOKE_ASYNC(src, PROC_REF(mark_mob_or_contents), user, target) + return TRUE + + mark_target(target) + +/obj/item/multitool/circuit/proc/mark_target(atom/target) say("Marked [target].") marked_atom = target RegisterSignal(marked_atom, COMSIG_QDELETING, PROC_REF(cleanup_marked_atom)) @@ -40,6 +47,51 @@ playsound(src.loc, 'sound/misc/compiler-stage2.ogg', 30, TRUE) return TRUE +/// Allow users to mark items equipped by the target that are visible. +/obj/item/multitool/circuit/proc/mark_mob_or_contents(mob/user, mob/living/target) + var/list/visible_items + var/mob/living/carbon/carbon_target + if(iscarbon(target)) + carbon_target = target + visible_items = carbon_target.get_visible_items() + else + visible_items = target.get_equipped_items() + + visible_items -= src // the multitool cannot mark itself. + + if(!length(visible_items)) + mark_target(target) + return + + var/list/selectable_targets = list() + var/datum/radial_menu_choice/mob_choice = new + mob_choice.image = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_mob") + mob_choice.name = target.name + selectable_targets[REF(target)] = mob_choice + for(var/obj/item/item as anything in visible_items) + var/datum/radial_menu_choice/item_choice = new + + var/mutable_appearance/item_appearance = new(item) + item_appearance.layer = FLOAT_LAYER + item_appearance.plane = FLOAT_PLANE + + item_choice.name = item.name + item_choice.image = item_appearance + selectable_targets[REF(item)] = item_choice + + var/picked_ref = show_radial_menu(user, src, selectable_targets, uniqueid = TRUE, radius = 38, custom_check = CALLBACK(src, PROC_REF(check_menu), user, target), tooltips = TRUE) + if(!picked_ref) + return + + var/atom/movable/chosen = locate(picked_ref) + if(chosen == target || (chosen in (carbon_target ? carbon_target.get_visible_items() : target.get_equipped_items()))) + mark_target(chosen) + else + balloon_alert(user, "cannot mark entity") + +/obj/item/multitool/circuit/proc/check_menu(mob/user, mob/living/target) + return !marked_atom && user.is_holding(src) && user.Adjacent(target) + /obj/item/multitool/circuit/update_overlays() . = ..() cut_overlays() diff --git a/code/modules/wiremod/shell/bot.dm b/code/modules/wiremod/shell/bot.dm index dfd9845bc05b1..533c654e787fa 100644 --- a/code/modules/wiremod/shell/bot.dm +++ b/code/modules/wiremod/shell/bot.dm @@ -9,7 +9,7 @@ icon_state = "setup_medium_box" density = FALSE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_on = FALSE /obj/structure/bot/Initialize(mapload) diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm index f41d4fa8bf191..57bb2ed45cbb3 100644 --- a/code/modules/wiremod/shell/brain_computer_interface.dm +++ b/code/modules/wiremod/shell/brain_computer_interface.dm @@ -283,7 +283,7 @@ . = ..() occupant_typecache = typecacheof(/mob/living/carbon) -/obj/machinery/bci_implanter/on_deconstruction() +/obj/machinery/bci_implanter/on_deconstruction(disassembled) drop_stored_bci() /obj/machinery/bci_implanter/Destroy() diff --git a/code/modules/wiremod/shell/compact_remote.dm b/code/modules/wiremod/shell/compact_remote.dm index 38fdfccf9515d..3336be06ddbf8 100644 --- a/code/modules/wiremod/shell/compact_remote.dm +++ b/code/modules/wiremod/shell/compact_remote.dm @@ -11,7 +11,7 @@ worn_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE /obj/item/compact_remote/Initialize(mapload) diff --git a/code/modules/wiremod/shell/controller.dm b/code/modules/wiremod/shell/controller.dm index 3092d3315f165..ad03867b89be4 100644 --- a/code/modules/wiremod/shell/controller.dm +++ b/code/modules/wiremod/shell/controller.dm @@ -12,7 +12,7 @@ worn_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE /obj/item/controller/Initialize(mapload) diff --git a/code/modules/wiremod/shell/dispenser.dm b/code/modules/wiremod/shell/dispenser.dm index 5fa2d2b1a8e0c..4ea2d03c9d706 100644 --- a/code/modules/wiremod/shell/dispenser.dm +++ b/code/modules/wiremod/shell/dispenser.dm @@ -9,7 +9,7 @@ icon_state = "setup_drone_arms" density = FALSE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_on = FALSE var/max_weight = WEIGHT_CLASS_NORMAL diff --git a/code/modules/wiremod/shell/drone.dm b/code/modules/wiremod/shell/drone.dm index 6f7afcfea0496..96fe3b2fa0a7d 100644 --- a/code/modules/wiremod/shell/drone.dm +++ b/code/modules/wiremod/shell/drone.dm @@ -10,7 +10,7 @@ maxHealth = 300 health = 300 living_flags = 0 - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE /mob/living/circuit_drone/Initialize(mapload) diff --git a/code/modules/wiremod/shell/gun.dm b/code/modules/wiremod/shell/gun.dm index e9176d8c6caa4..3a37501e8e17c 100644 --- a/code/modules/wiremod/shell/gun.dm +++ b/code/modules/wiremod/shell/gun.dm @@ -11,7 +11,7 @@ ammo_type = list(/obj/item/ammo_casing/energy/wiremod_gun) cell_type = /obj/item/stock_parts/cell/emproof/wiremod_gun item_flags = NONE - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE automatic_charge_overlays = FALSE trigger_guard = TRIGGER_GUARD_ALLOW_ALL diff --git a/code/modules/wiremod/shell/keyboard.dm b/code/modules/wiremod/shell/keyboard.dm index 05b9ded074baa..0b28959aa9c69 100644 --- a/code/modules/wiremod/shell/keyboard.dm +++ b/code/modules/wiremod/shell/keyboard.dm @@ -6,7 +6,7 @@ worn_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE /obj/item/keyboard_shell/Initialize(mapload) diff --git a/code/modules/wiremod/shell/moneybot.dm b/code/modules/wiremod/shell/moneybot.dm index 20eb596eb7267..cacb457149dc7 100644 --- a/code/modules/wiremod/shell/moneybot.dm +++ b/code/modules/wiremod/shell/moneybot.dm @@ -9,7 +9,7 @@ icon_state = "setup_large" density = FALSE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_on = FALSE var/stored_money = 0 diff --git a/code/modules/wiremod/shell/scanner.dm b/code/modules/wiremod/shell/scanner.dm index 3012fe65e490c..c88d7b1fb5f97 100644 --- a/code/modules/wiremod/shell/scanner.dm +++ b/code/modules/wiremod/shell/scanner.dm @@ -11,7 +11,7 @@ worn_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE /obj/item/wiremod_scanner/Initialize(mapload) diff --git a/code/modules/wiremod/shell/server.dm b/code/modules/wiremod/shell/server.dm index fc71bfaa265b8..24501797197c7 100644 --- a/code/modules/wiremod/shell/server.dm +++ b/code/modules/wiremod/shell/server.dm @@ -10,7 +10,7 @@ icon_state = "setup_stationary" density = TRUE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_on = FALSE /obj/structure/server/Initialize(mapload) diff --git a/config/arenas/README.md b/config/arenas/README.md deleted file mode 100644 index 9f31ce2349a93..0000000000000 --- a/config/arenas/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Add admin arena dmms here. - -**These are fully cached so keep this directory empty by default.** \ No newline at end of file diff --git a/config/awaymissionconfig.txt b/config/awaymissionconfig.txt index 5338ae36cc6f1..15d6b0ac71871 100644 --- a/config/awaymissionconfig.txt +++ b/config/awaymissionconfig.txt @@ -7,12 +7,11 @@ #Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once. #DO tick the associated code file for the away mission you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors! -#_maps/RandomZLevels/blackmarketpackers.dmm #_maps/RandomZLevels/TheBeach.dmm -#_maps/RandomZLevels/centcomAway.dmm #_maps/RandomZLevels/moonoutpost19.dmm #_maps/RandomZLevels/undergroundoutpost45.dmm #_maps/RandomZLevels/caves.dmm #_maps/RandomZLevels/snowdin.dmm #_maps/RandomZLevels/research.dmm #_maps/RandomZLevels/SnowCabin.dmm +#_maps/RandomZLevels/museum.dmm diff --git a/config/config.txt b/config/config.txt index 2c552361c6bb4..1c87fc110ae9a 100644 --- a/config/config.txt +++ b/config/config.txt @@ -532,9 +532,9 @@ URGENT_AHELP_COOLDOWN 300 MOTD motd.txt #MOTD motd_extra.txt -## Assets can opt-in to caching their results into `tmp`. +## Assets can opt-in to caching their results into `cache/`. ## This is important, as preferences assets take upwards of 30 seconds (without sleeps) to collect. -## The cache is assumed to be cleared by TGS recompiling, which deletes `tmp`. +## The cache is assumed to be cleared by TGS recompiling, which deletes `cache/`. ## This should be disabled (through `CACHE_ASSETS 0`) on development, ## but enabled on production (the default). CACHE_ASSETS 0 diff --git a/config/jobconfig.toml b/config/jobconfig.toml index c8a5c5c3dfa5d..7106d2f2a4ef5 100644 --- a/config/jobconfig.toml +++ b/config/jobconfig.toml @@ -263,6 +263,13 @@ "# Spawn Positions" = 5 "# Total Positions" = 5 +[VETERAN_ADVISOR] +"# Playtime Requirements" = 6000 +"# Required Account Age" = 7 +"# Required Character Age" = 0 +"# Spawn Positions" = 0 +"# Total Positions" = 0 + [VIROLOGIST] "# Playtime Requirements" = 60 "# Required Account Age" = 0 diff --git a/html/changelogs/AutoChangeLog-pr-81170.yml b/html/changelogs/AutoChangeLog-pr-81170.yml deleted file mode 100644 index 8cefce36647c7..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81170.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed text effects for runechat messages (the stuff enclosed in +, | and _ characters)." - - spellcheck: "Improved the tip for say/text effects." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81231.yml b/html/changelogs/AutoChangeLog-pr-81231.yml new file mode 100644 index 0000000000000..e2e6e3362007f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81231.yml @@ -0,0 +1,4 @@ +author: "Melbert" +delete-after: True +changes: + - rscadd: "Spies may now roam the halls of Space Station 13. Watch your belongings closely." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81281.yml b/html/changelogs/AutoChangeLog-pr-81281.yml deleted file mode 100644 index 1dd471b0e3fba..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81281.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "EEASAS" -delete-after: True -changes: - - bugfix: "Fixed some things in Ice Box's gas station ruin" - - rscadd: "Adds some things in Ice Box's gas station ruin" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81615.yml b/html/changelogs/AutoChangeLog-pr-81615.yml new file mode 100644 index 0000000000000..eb35d9eb4ffed --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81615.yml @@ -0,0 +1,5 @@ +author: "DrDiasyl" +delete-after: True +changes: + - rscadd: "Adds 2 new shields to the game! Ballistic Shield - researched by Science, and Improvised Shield - made out of iron and sticky tape" + - image: "Riot, Strobe, Telescopic, Energy shields got new less flat sprites!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81720.yml b/html/changelogs/AutoChangeLog-pr-81720.yml new file mode 100644 index 0000000000000..dec65a6a181f2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81720.yml @@ -0,0 +1,6 @@ +author: "Jacquerel" +delete-after: True +changes: + - image: "Bubblegum Hallucination Surround Charge, Wendigo Shockwave Scream, and Ice Demon Floor Freeze all have more appropriate action icons." + - qol: "Adds a tooltip to Ice Demon Afterimages ability." + - image: "Cyborg view items now use the same sprites as their corresponding goggles instead of old versions of those sprites." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81746.yml b/html/changelogs/AutoChangeLog-pr-81746.yml new file mode 100644 index 0000000000000..aab7a23775050 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81746.yml @@ -0,0 +1,4 @@ +author: "JohnFulpWillard" +delete-after: True +changes: + - bugfix: "Buying the advanced plastic surgery disk from the uplink now gives you advanced plastic surgery instead of brainwashing." \ No newline at end of file diff --git a/html/changelogs/archive/2024-02.yml b/html/changelogs/archive/2024-02.yml index 8001507bdbd48..e98a9540d4a2b 100644 --- a/html/changelogs/archive/2024-02.yml +++ b/html/changelogs/archive/2024-02.yml @@ -191,3 +191,678 @@ condition to rotate them optimumtact, whomst didn't write this CL entry.: - bugfix: Fixed the colorful lights of the ethereal disco ball. +2024-02-09: + EEASAS: + - bugfix: Fixed some things in Ice Box's gas station ruin + - rscadd: Adds some things in Ice Box's gas station ruin + Ghommie: + - bugfix: Fixed text effects for runechat messages (the stuff enclosed in +, | and + _ characters). + - spellcheck: Improved the tip for say/text effects. + JohnFulpWillard: + - qol: The barcode scanner is now part of computer tech and can be printed at the + service techfab. + - bugfix: Species that can eat mice don't get disgusted from seeing one in the toilet + bong. + - rscadd: Grabbing an unwrenched statue/mannequin/skeleton model will now move its + direction as you move yours, and you can talk through it. + LT3: + - bugfix: SM cascade delam messages no longer display to clients not in game + Melbert: + - bugfix: Fixed Puncture Repair surgery not having surgical sounds + - bugfix: Fixed Surgery Initiator potentially showing invalid surgeries + - bugfix: Krav Maga users can shove again + Swiftfeather: + - qol: Added a new head-only target hotkey, unbound by default. + SyncIt21: + - qol: adds screentips & examines for screwdriver & crowbar acts & alt click. + - qol: techfabs can now use the mouse drop functionality to set drop target. + - qol: lathe printing animation plays on loop while printing rather than flicking + once for more visual feedback + - bugfix: lathe sheet insertion animations are now linked & work again for all material + types inserted via remote silo/local storage + - bugfix: printing custom materials items from autolathe works again. + - bugfix: printing multiple items from lathes will actually print that correct quantity + of items requested. + - bugfix: printing items the 2nd time around from lathes won't cause the UI to reload + each time. + - code_imp: autodoc for some vars & procs, merges procs. + - refactor: Optimized code for autolathe & techfabs in general. Report bugs on github + ViktorKoL: + - bugfix: fix heretic's rust mark failing to damage any items if the victim has + any container on them with another item inside, and maybe other bugs of similar + nature + Wallem: + - rscadd: Adds a new suicide_act() to the smite spell + Zergspower: + - bugfix: icebox ore generation underground is normal again +2024-02-10: + 00-Steven: + - bugfix: As they should've for a while, screwdrivers (cocktail) actually work as + screwdrivers (tool). + - sound: The screwdriver cocktail also actually plays the screwdriver sound when + used. + 1393F: + - bugfix: The HFR now provides the max temperature for recipes + - bugfix: the crystallizer now provides the dangerous object created instead of + itself in admin logging + Ben10Omintrix: + - rscadd: settlers can rename their pets + FernandoJ8: + - code_imp: added an IS_CHANGELING() helper and used it where applicable + Holoo-1: + - admin: remade everyone is traitor into everyone is antag in secrets panel + IndieanaJones: + - bugfix: Bolas in your pockets no longer slow you down. + JohnFulpWillard: + - rscadd: Changeling's reviving stasis ability now puts you in stasis. + LT3: + - qol: Health analyzer will now display blood alcohol content + LemonInTheDark: + - rscdel: Removes halloween screen tint, we're taking him to retire by the seaside + (he was alone and unloved) + Melbert: + - bugfix: Fixed some situations in which you couldn't interact with heretic runes + - bugfix: Fixed Finger Guns giving a misleading chat message + - bugfix: You know that one bug that makes the cryo cells on Deltastation unusuable? + Well it's not fixed but at least those cryo cells are usuable again, maybe at + the cost of another station's cryo cells. Who knows! + larentoun: + - bugfix: Now falsewalls visually don't close when they shouldn't. +2024-02-11: + Absolucy: + - bugfix: Fix succumb last words being double-encoded (i.e `i'm` becoming `i'lm`) + Higgin: + - bugfix: deathtrap recycler can now be moved. + - refactor: moved check for NO_DECONSTRUCTION flag to be inside can_be_unfasten_wrench, + allowing us to set specific machines to be movable but not deconstructable. + JohnFulpWillard: + - bugfix: Space Dragon's carp allies no longer turn the entire roundend report into + bold. + - bugfix: Uplinks now update their UI when you add telecrystals in them, so you + don't need to close and reopen it. + - bugfix: Bar bots asking for Cucumber Lemonade now gives you money for completing + it. + Melbert: + - balance: Rats are now 5x less likely to decide to eat a cable when idling. (1%, + down from 5%) + - refactor: Fire effects get added to mobs in a different way now. Maybe it will + get stuck less. Report any oddities. + - rscadd: Freedom Implants and Biodegrade can you free you of the shackles of knotted + shoes. + - rscadd: Shaft Miner's Bluespace Survival Capsules will now throw people away from + it when it deploys. Be sure to heed the warning to "Stand back". + Momo8289: + - rscadd: Fire ants can now be scooped up and used as a chem like normal space ants + Rhials: + - bugfix: You can now refine ectoplasmic raw cores at the implosion machine thing. + - balance: Beacon and Teleport Blocker implants have been moved from cargo to the + security lathe. + - balance: A new research node has been created, requiring Subdermal Implants and + Miniature Bluespace, to unlock Beacon/Teleport Blocker implants. + - balance: Exile implants can now be printed from the security lathe after researching + basic cybernetic implants. + - bugfix: The Energy Cake slice now does its on-eat effect AFTER being eaten, instead + of before. + - bugfix: The beach bar virtual domain's bar closets no longer have default locker + doors. + SyncIt21: + - bugfix: lathes now use moderate power for printing operations + necromanceranne: + - bugfix: The shove blocker module parent type now has the correct typepath. +2024-02-12: + Atlasle, JohnFulpWillard: + - rscadd: Adds the Touchy quirk, you need to be next to something to examine it, + for 2 extra quirk points. + Ed640: + - bugfix: Sculpted statues stop including light layers. + LT3: + - bugfix: MULEbot will correctly display its loaded cargo on BotKeeper + - bugfix: MULEbot home beacon can be set from control panel + - code_imp: MULEbot home location is automatically set on init + Melbert: + - qol: Glasses colors should be a lot less harsh, and being blind no longer also + blinds your hud. + - bugfix: Lavaland Beech Bartender's clothing storage is named the right thing now + - bugfix: Lipoplasty is An Option again + Momo8289: + - rscadd: Shakers can now pour drinks with custom names and descriptions! Alt-click + the shaker to enable this. + NeonNik2245: + - rscadd: 3 new masks for your characters (thanks to Kovac for the scarf sprites) + Rhials: + - bugfix: You can now click things as an alien larva again. + SyncIt21: + - bugfix: machines that should not drop contents when deleted no longer do. + - refactor: refactors how machines are deconstructed. report bugs on github. + Thunder12345: + - bugfix: The wizard's pets Jimmy and Jommy no longer fight to the death. + Xander3359: + - balance: Contractor kit no longer gets RNG items, it's a specific pool now + mc-oofert: + - rscadd: nanotrasen museum gateway map +2024-02-13: + 00-Steven: + - bugfix: Fixed stamps not accounting for scroll offset. You can actually stamp + paperwork properly without using accursed knowledge again. + - bugfix: Fixed PDA messenger not scrolling to the bottom when a new message gets + sent. + - bugfix: Paperwork should actually use the writing utensil's font, colour, and + boldness outside of input fields again. + LemonInTheDark: + - bugfix: Fixes fancy lights not updating their source location when picked up and + moved + Melbert: + - bugfix: You can once again see love on Valentines Day + MelokGleb and KREKS, McRamon, Ghommie: + - image: New sprites for changeling powers and items. Woooh. + Rex9001: + - balance: Smile of the moon's effects now last for longer and have a longer minimum + active time + - balance: Mark of moon detonations now do sanity damage + - qol: Ascended moon heretics and lunatics are now able to see who is and isn't + a lunatic. + - qol: People inside the ascended moon heretics sanity draining aura now gain an + effect under their tile. + Rhials: + - qol: Venus Human Traps are now visible in the orbit menu. Cool! + - bugfix: Spawning as a Venus Human Trap now properly gives you an antag datum/objective. + - bugfix: Venus human trap flowers no longer have a second, identical flower under + themselves. + - qol: Map hazard anomalies are no longer treated as points-of-interest in the orbit + menu. + Singul0: + - balance: Brainwashed individuals can no longer be debrainwashed through a mindshield + implant, they still protect you from brainwashing though! You just need to get + medical to fix them up. + - bugfix: You can now use bluespace launchpads from shuttles (except cargo and ferry + shuttles) + - bugfix: Fixes backwards engines in a few of centcom's ferries! + intercepti0n: + - bugfix: Separated logs list into pages in ore silo UI, thus fixing lag when logs + list grows too long. + siliconOpossum: + - bugfix: Getting blood on your hand when you only have one no longer makes your + hands visually permanently bloody + - bugfix: Holding bloodied gloves no longer makes your hands look bloody, bloodied + gloves now look bloody when worn, and damaged gloves now look damaged when worn + - bugfix: Gaining or losing an arm now correctly updates your hand overlays +2024-02-14: + Absolucy: + - rscadd: Painkillers (i.e morphine, miner's salve) now actually induce analgesic + effects, preventing various pain-related effects, such as screaming due to pain, + and also provides a speed bonus during surgery. + - rscadd: The tenacity trauma (traumatic neuropathy) also applies analgesic effects. + - refactor: Simplified code related to reagents adding traits. + Aylong: + - rscadd: Added `Mute` button into `Chat Tabs` settings, it disables tab unread + counter + - rscadd: Added `Clear chat` button into `General` settings, you can clear your + dirty chat like you did it before TGchat + - bugfix: Case-sensitive highlighting now works properly + JohnFulpWillard: + - bugfix: Revenants (and other flying mobs) will not make noise when walking into + pools of gibs, + Rhials: + - spellcheck: Some space ruin area names have been made more distinct. + - bugfix: Ghost role polls should spam you less when multiple of the same roll occur + in succession. + ViktorKoL: + - bugfix: heretics no longer lose their spells when returning from a shapeshift + - bugfix: knit flesh now heals organs as intended, and does not cause its victims + to be red forever if interrupted + - spellcheck: knit flesh chat messages are no longer gramatically incorrect + vinylspiders: + - bugfix: '*wag emote is now functional again' +2024-02-15: + CandleJaxx and Iamgoofball: + - bugfix: Fixes Krav Maga allowing pacifism bypasses. + IndieanaJones: + - balance: Nightmare's Light Eater takes less time in jaunt to gain a critical strike, + being reduced to 7 seconds from 15 seconds. + K4rlox: + - balance: Maintenance drones now can use RPED, RCD, Holosign, and Spray bottles + LemonInTheDark: + - rscadd: AI's acceleration now smoothly decays, instead of just falling back down + to 0 after 0.5 seconds + - bugfix: AI's standard movement (non accelerated) is smooth now, instead of constantly + jumping around + - bugfix: AIs will now follow their targets more closely, shouldn't have any issues + with them lagging behind anymore + Melbert: + - bugfix: Valentines no longer see themselves covered in hearts. They only see their + Valentine covered in hearts. + - balance: Scientists have discovered Nuka Cola is not good for short term health. +2024-02-16: + 00-Steven: + - bugfix: Fixed the lizardperson spine preference dropdown not showing up in the + character menu. + Kylerace: + - admin: admins/maintainers can now make the profiler focus on specific subsystems + by setting the subsystem var profile_focused to TRUE + LemonInTheDark: + - refactor: Fucks with how movement keys are handled. Please report any bugs + WinterDarkraven: + - rscadd: In an attempt to stop the greytide, NanoTrasen has increased security's + baton energy output. This has, through testing, done nothing but make the device + spark more than it used to. +2024-02-17: + 00-Steven: + - bugfix: Space cats CAN into space. (They're back to surviving being in unsuitable + atmos.) + 13spacemen: + - code_imp: Removed unused global lists and sprite accessories related to tail spines + - code_imp: removed redundant check for plasmamen in survival box code + Ghommie: + - rscadd: Added three new 'special' bedsheets. One of them is quite rare and made + from gondola hide. + IndieanaJones: + - bugfix: Tank spider corpses should no longer be conditionally invisible + - bugfix: Blob Zombies now render their blob heads correctly again. + MLGTASTICa: + - balance: Oxandrolone now scales with purity. Its default purity is 100% + - balance: Salicylic acid now scales with purity. Its default purity is 100% + Melbert: + - rscadd: Wizards have a new mobility option available, the Telegram Scepter. The + ability to travel anywhere you can see at the point of a wand... but at a price? + Sylphet: + - bugfix: cargo lockboxes update iconstates correctly now + SyncIt21: + - bugfix: Indestructible items like the pai card don't teleport to the ore silo + when you insert them into silo linked machine & also displays a message saying + it was rejected. + - qol: adds examines & screentips for ore box + - code_imp: cleans up some procs for ore box + - spellcheck: corrected description & ui notice of ore box to specify it can hold + boulders too + Thunder12345: + - qol: The bitrunning quantum console UI now lists domains in tabs by difficulty. + destrucktoid: + - bugfix: Restorative Nanites now heal Slimepeople just as well as they do other + people. + kawaiinick: + - rscadd: Your mouth now fits combat or survival knives(it's totally safe) + mc-oofert: + - balance: assemblybombs are bulky + - qol: you may altclick action buttons to bind them to a key + mogeoko: + - bugfix: Thermomachines now reconnect to pipes on multitool's act. + - bugfix: Multi-deck connectors won't connect pipes not located in front/top/bottom + of it. +2024-02-18: + 1393F: + - bugfix: The crystallizer screentip for rotating it has been updated with the correct + button + Ghommie: + - rscadd: Players holding cardboard cutouts will now assume their appearance, just + like for potted plants. + GoldenAlpharex: + - bugfix: The Spawners menu now accurately displays the amount of uses left in each + spawner option, taking into account individual spawners that either allow more + than one use, or an infinite amount of uses. + Melbert: + - bugfix: Lifeline can no longer track mobs with suit sensors off + Roastglue: + - bugfix: Crafting Bulgogi no longer makes Bibimbap. It instead makes Bulgogi. +2024-02-19: + Cursor: + - rscadd: Security Officers are now Haram. + Ghommie: + - qol: Circuit multitools can now mark (visible) items worn/held by a mob. + Kashargul: + - qol: makes the tgui_input_number user friendly for negative and decimal inputs + - code_imp: the onBlur={(_, value) => onBlur(value)} event should now be used on + all uses of RestrictedInput to ensure that the number is fully sanitized whenever + the user leaves the field or submits it through a button + - qol: hides the delete button on the main tab allows to reorder all other chat + tabs + LT3: + - rscadd: The tram has been equipped with enhanced safety glass to reduce the severity + of crew injuries + LemonInTheDark: + - bugfix: Maps loaded in after roundstart will no longer have broken smoothing + Melbert: + - rscadd: Valentines Day now polls all players for candidates when it triggers rather + than forcing all players to be a Valentine. Consent is important. + - rscadd: Valentine silicons now gain special laws pertaining to their date. + - qol: Valentines Cards are now paper, so you can write on them, stamp them, or + burn them. + - qol: Valentine's roundend report no longer takes up a massive amount of space + and also no longer sound so, so weird. + - bugfix: Fixes AI double-click tracking + - rscdel: You can only vote for 1 map at a time again + - admin: You can now set someone's TC to 0 + - admin: Removing Traitor from automatically removes the uplink from them + - admin: Removing Uplink from someone no longer wipes ALL of their memories + Rhials: + - bugfix: Removes the double-newscaster from the arrivals sec post. + SyncIt21: + - qol: adds examines & screentips for crowbar, screwdriver acts to BRM & refinery + machines + - qol: adds examines about the number of boulders stored & processed to BRM & refinery + machines + - qol: BRM now has its lights turn on/off depending on wether automatic boulder + retrieval is on/off for visual clarity along with examines + - qol: refinery machines now display ballon alerts & plays sounds more frequently + when processing boulders for better feedback + - bugfix: vents now spawn boulders of all sizes & not just small ones + - bugfix: expanded gulag boulders now have correct materials in them. + - bugfix: manual tapping of vents now has a cooldown applied as intended. + - bugfix: BRM has its light turned off when area power goes off + - bugfix: boulders ejected from refineries by hand no longer teleport all over the + place occasionally. + - bugfix: refineries no longer eject boulders with 0 durability + - bugfix: Boulders & refineries no longer pile up on top of BRM's & refineries in + long rounds. Their locs have to be clear of boulders before they spit out more + boulders to prevent a large pile of boulders from causing lag + - bugfix: sheets ejected from lathes no longer get rejected when inserted back which + could happen at random, no more boulders with empty materials + - code_imp: splits boulder types into its own file along with other items + - code_imp: merges & autodocs procs, vars related to boulders + - refactor: repaths BRM to a simpler subtype + - refactor: BRM now spawns boulders in batches(batch size can be increased with + upgraded parts) with a boulder appearing every second. After a batch is processed + a 3 second cooldown is applied to stop the conveyer belt from clogging up, With + this BRM wires are removed as there is no need for timers to be attached to + wires which intefers without our batch processing timings. + - bugfix: mecha drill won't use power & do other checks if the target cannot be + drilled. + - bugfix: mecha drill will stop drilling if the mech moves even without changing + direction. Also will use power & check other conditions every drill cycle. + - bugfix: Grill checks if the item got deleted to avoid runtimes. Also cook time + is set based on the individual items type & not a constant of 20 seconds + - bugfix: BBQ ribs can be grilled on a grill but now takes anywhere between 30 to + 40 seconds to get proper smoked ribs and not lightly smoked ribs or turn into + a mouldy mess on a girddle. Delicious. + mc-oofert: + - rscadd: deathmatch minigame + - bugfix: you may not put disposal outlets on cargo shuttle + - bugfix: forcefully pushing disposal outlets and chutes deconstructs them instead + of making them behave like budget eigenstatium lockers + rageguy505: + - bugfix: The door above tool storage on birdshot now has maintenance access on + it and officials can now enter the CC dock room. +2024-02-20: + Ghommie: + - rscadd: Curators now get a 22.5% cut on credits spent on painting patronages (divided + by the number of curators). The service department also gets another, 12.5% + cut. + - qol: Added a zoom in and out buttons to the painting UI. + JohnFulpWillard: + - bugfix: The DNA scanner's joker button no longer instantly activates itself when + the cooldown between uses is done. + - bugfix: Regenerative cores (and other monster organs) now work when using it in-hand + while resting. + LT3: + - qol: Air alarms now display the source of triggered fire alarms/firedoors + LemonInTheDark, Kryson: + - image: Modified railing sprites to be a bit more three-d + SyncIt21: + - bugfix: multiple reactions occuring in the same holder like mixing drinks will + yield correct reagent result volumes + - code_imp: ' Removes `update_total()` from instant reactions improving performance + slightly' + - code_imp: merges `remove_all_direct()` with `remove_all()` to reduce code size + - bugfix: boulders are no longer lost when teleported by the BRM + - bugfix: batch processing cooldown works when teleporting multiple boulders + mc-oofert: + - code_imp: deathmatch lobbies take 8 seconds to start as to give lighting a breather +2024-02-21: + 00-Steven: + - bugfix: Ethereal heart revive doesn't delete organs alien to your species, like + prosthetics, cybernetics, and possibly itself. + - bugfix: Nightmare heart revive doesn't delete organs alien to your species, like + itself, upon which it would stop the conversion to shadowperson. + Cheshify: + - bugfix: The North Star's disposals are now functional! + - qol: The North Star has had a staggering amount of quality of life changes. + - rscadd: Nanotrasen has now supplied North Star security outposts with a disposals + line leading directly to the drunk tank. + Ghommie: + - bugfix: fixed an issue with tactical appearance (potted plants / cardboard cutouts) + not going away after giving the item to someone else. + - bugfix: Fixed slaughter demon cutouts being invisible. Also fixed another issue + with the tactical appearance not going away when the cardboard cutout is pushed + down. + mc-oofert: + - bugfix: you may not teleport in or out of deathmatch arenas + - bugfix: if you died as a changeling/anyone that has cool mind spells you do not + get them in deathmatch +2024-02-22: + Derpguy3: + - bugfix: Adds a missing servo component into the MK1 Ripley Crate ordered from + cargo. + Ghommie: + - bugfix: sec-hailers no longer apply filters on TTS when pushed out of the way. + Melbert: + - bugfix: Chasms no longer break your verbs + - refactor: Frames have been refactored, you know the things you use to build computers + and machines, report any oddities + - bugfix: You can now smack (de)constructed computer and machine frames to break + them, rather than doing nothing. + - rscadd: Machine frames can now be deconstructed with screwdrivers, and computer + frames can now be deconstructed with welding torches. Welders are faster. + - bugfix: Organs have the blood DNA of their owns on them again +2024-02-23: + 00-Steven: + - bugfix: Chefs (not to be confused with cooks) actually display as being a part + of service on the crew monitor. + 13spacemen: + - refactor: Bloody item overlays no longer use icon procs to generate the overlay + 13spacemen, Kapu1178: + - refactor: Footprint sprites are now based on your shoes and legs, shoes have priority + - image: Monkey legs now produce pawprints instead of footprints + JohnFulpWillard: + - refactor: Holographic mobs now gives better feedback to players and should more + consistently not give any drops. + - spellcheck: Removed a double space in health analyzer's message telling you someone + is deaf. + Melbert: + - bugfix: You can now take our your anger upon arcade cabinets upon losing (they + can be hit again) + - rscdel: Deletes Mythril Coins from random coin spawners + - rscdel: Replaces Mythril sheets in icebox vent fishing with Runite sheets + SgtHunk: + - bugfix: The Summon Simians spell will now properly check for monkey faction, allowing + people who are monkeys to not be mauled. + nevimer: + - bugfix: ForceEvent tgui panel search is more reliable. +2024-02-24: + 00-Steven: + - bugfix: Chef and department security have the assignment on their ID imprinted + onto their PDA by default, instead of defaulting to Cook/Security Officer and + requiring you to do so manually. + A.C.M.O.: + - qol: CPR can be administered by species which do not need to breathe, so long + as they have functional lungs. + ArcaneMusic: + - bugfix: Mining cyborgs now keep the state of their mining scanner when stored, + without shutting off. + Echriser: + - bugfix: you can no longer feed people with covered mouths using spoons or ladles + JohnFulpWillard: + - bugfix: Alien larvas' examine text no longer tells you they are missing arms and + legs. + Melbert: + - bugfix: Cyborgs spark and spit out oil when smacked again. Among other things. + vinylspiders: + - bugfix: fixes spurious CI failure in museum + - code_imp: adds a blacklist feature to spawners +2024-02-25: + bigfatbananacyclops: + - rscadd: floortile camouflage suit, boots, gloves and crate containing the former + items +2024-02-26: + 00-Steven: + - bugfix: Disabled the popsicle stick maximizer. (Producing popsicle sticks actually + deletes the input logs.) + 13spacemen: + - refactor: Bodytypes to do with character sprite shape now have their own bodyshape + var, all sprite handling is done with bodyshape and not bodytype anymore + Cheshify: + - bugfix: meatwheat is now firmly made out of meat, instead of sometimes being wheat + and sometimes being meat and sometimes being both. + - bugfix: The North Star finally has a bluespace gas sender system. + Derpguy3: + - bugfix: Three stationary water tanks on Birdshot which supplied a sink in the + bar, a sink in the medical storage and a sink in the perma-brig's kitchen are + now properly rotated and connected with the plumbing. + - bugfix: The unisex showers on Birdshot have been given a water tank for its plumbing. + EEASAS: + - balance: buffs corporate modsuit(centcom only) + Higgin: + - qol: Blood Brother convert objective now explains who you can convert and what + to do if you mess up with your flash. + MrDas: + - spellcheck: The tier of servo in mech construction is no longer explicitly stated. + necromanceranne: + - balance: Nanotrasen, in direct response to the increasing danger posed by wannabe + martial artists and rioters in the fringes of the Spinward Sector, have upgraded + the impact dampeners found in their riot armor. Staff have also started to rediscover + the value of medieval armor; it isn't particularly easy to topple a knight in + a suit of plate with just your fists. + - balance: Melee-focused armor is now more able to protect you from various RNG-based + knockdowns, such as critical hits from punches (as well as the ones applied + through the staggered status), shoves, critical hits with a blunt weapon to + the chest, and body throws. + - balance: Melee-focused helmets also protect you from head injuries, such as bottle + smashes, accidentally hitting something dense during a tackle, and critical + hits from a blunt weapon to the head. + - balance: Bottlesmash knockdowns are less reliable in general. + - rscadd: A new module, the Safety-First Head Protection module, protects you from + head trauma! Available in most modsuits expected to take hits to the head often. + And from roundstart exofabricators. +2024-02-27: + 00-Steven: + - bugfix: Newscasters no longer say "No wanted issue posted. Have a secure day." + when there is, in fact, an active wanted issue currently posted. + - bugfix: Medical/security records now show an icon based on the registered trim, + rather than showing a question mark for records with customized titles. + 13spacemen: + - bugfix: Blood overlays on items no longer leak onto other objects + Absolucy: + - qol: Constructs now reuse the victim's mind instead of just moving their client + ArcaneMusic: + - bugfix: Fixed instances where holochip/holocredits would spawn with a total of + zero credits contained within. + Ben10Omintrix: + - bugfix: fixes pokemon ai still being active when inside the pokeball + Iamgoofball: + - balance: Adds a 1 second delay to moving up and down with the verb/keybinds to + disable z-level combat cheese + IndieanaJones: + - balance: Gorillas are faster, stronger, but not bigger too. Note while holding + an item, they are the same speed as they were prior. + - balance: Gorillas now have the understanding of languages as monkeys do. + - balance: The Gorilla Cube Box for traitors has been replaced with a singular gorilla + cube. Due to the aforementioned changes, this singular gorilla should be as + scary if not scarier than 3 gorillas were prior. + - balance: ' Magillitis Serum Autoinjector now grants the resulting gorilla a slow + passive regeneration effect which kicks in after not taking damage for 12 seconds.' + JohnFulpWillard: + - qol: You can use atmos machines, holopads, crayons, spray cans, and disposal bins + while floored. + - bugfix: You can close extinguisher cabinets while floored. + - bugfix: You can climb onto a photocopier from the floor. + Melbert: + - bugfix: The Paddy's Claw should be properly unusable in situations which it should + be properly unusable. + Singul0: + - bugfix: The say TGUI would recognize :g (changeling hivemind) prefix. and give + a visual indicator in it that you are talking in the right channel + SyncIt21: + - qol: adds examines & screentips for building & deconstructing both machine & computer + frames. + - qol: Adding a circuitboard from a rped to n computer frame will automatically + screw it in place like before. + - code_imp: merged procs for computer & machine frames. autodocs them where possible. + - code_imp: moved code for machine frame into its own file. + - bugfix: RCD converts miscellaneous turfs like basalt, sand, beach etc to plating + first & not put a wall directly on top of them + TJatPBnJ: + - balance: Power crepes are now finger food + mc-oofert: + - bugfix: You may no longer make deathmatch arenas dark with a lightswitch. + - rscadd: Added an option to deathmatch loadout dropdown that allows you to pick + a random loadout + - bugfix: In deathmatch, plasmamen are made humans and the UI supports more players + vinylspiders: + - bugfix: fixes cardboard cutouts not updating when held and using the crayon on + them to change their appearance, and fixes the alt_appearance being added to + the cutout instead of the mob holding it +2024-02-28: + 00-Steven: + - bugfix: Lobby manifest shows the head/captain symbols next to heads and captains + with custom titles, as long as they're registered with a head/captain trim. + - bugfix: Fixed Bluespace RPEDs failing to apply circuits from a distance if you + had to select between multiple. + ArcaneMusic: + - image: New sprites for plant grafts! + Cheshify: + - bugfix: the north star's main intersections are brighter, the elevator is properly + lit, and a single floating poster was moved. + - qol: The chapel has been slightly overhauled on Birdshot, with the chaplain now + having a place to preach sermons. + - bugfix: Sparring chaplains are now able to operate on Birdshot! + DrDiasyl: + - rscadd: 'NEW TRAIT JOB: Veteran Security Advisor! Advise HoS and Captain on Security + matters, mentor Security Officers. Note that they are paraplegic and are suffering + PTSD due to their past experience.' + Ghommie: + - rscadd: Added a multi-dimensional bomb payload to the black market. It's very + expensive. + - balance: '"Freshness Jars full of Natural Bait" is now a goodie and costs 200 + credits instead of 2000' + Iamgoofball: + - balance: xenomorph stomachs will no longer destroy items directly, refactored + it to use acid_act() + - bugfix: fixes xenomorph vore accidentally destroying mobs it wasn't supposed to + destroy, im thinking this was modified list in place shenanigans + IndieanaJones: + - rscadd: 'New Changeling Ability: Hive Head' + - bugfix: Fixed bees having an improper sprite offset + Jacquerel: + - rscadd: Displaying the voting statistics is now optional on a per-poll basis, + and is disabled for map voting. + JohnFulpWillard: + - qol: Intelligent monkeys now punch people instead of biting them. + KingkumaArt: + - rscadd: a list of items called vendor_nocrush that vendors dont deal integrity + damage to upon hitting them. + - bugfix: Makes vending machines no longer crush chairs and conveyors. + LT3: + - code_imp: Tram throwing now breaks grilles consistently + - code_imp: Tram malfunction lethality/throw chance are now a multiplier instead + of flat value + - code_imp: Tram throw chance can be adjusted + - code_imp: Unlucky trait is now used in tram throw calculation + Melbert: + - bugfix: Rat hearts apply their damage modifier malus correctly + PapaMichael: + - balance: Fugitive hunters will spawn early if the emergency shuttle is called. + softcerv: + - code_imp: TRAIT_DEAF now works on non-carbon mobs +2024-02-29: + 13spacemen: + - bugfix: You can build material airlocks again + A.C.M.O.: + - bugfix: Fixed the AI hologram's ability to copy the appearance of crew members. + Jacquerel: + - image: adds a visual effect for hive head bees despawning + Momo8289: + - bugfix: Fixes the slot machine's jackpot. It should now give all of the available + prize money + 10,000 credits as payout for a jackpot. + - refactor: Converts the slot machine's UI over to TGUI + - rscadd: The slot machine now has a whole new type of jackpot! This one's a banger! + SyncIt21: + - bugfix: Cryostylane reaction now has a moderate & not extreme cooling effect. + Helps you achieve more pure amounts of Cryostylane + TheVekter: + - rscadd: Added a new law to the Artist lawset in order to encourage Artist AIs + to build an audience. + mc-oofert: + - bugfix: Grilles dont break by just walking into them under any circumstances + necromanceranne: + - bugfix: Being in a Swat Suit appropriately protects you from collisions with a + body, rather than the body thrown at you having these protections protecting + YOU, the victim of the collision. diff --git a/html/changelogs/archive/2024-03.yml b/html/changelogs/archive/2024-03.yml new file mode 100644 index 0000000000000..09b069eeb9859 --- /dev/null +++ b/html/changelogs/archive/2024-03.yml @@ -0,0 +1,36 @@ +2024-03-01: + Ben10Omintrix: + - rscadd: new virtual pet app on the pda + Cheshify: + - spellcheck: changed the fitness skill title to powerlifter + Echriser: + - qol: Allows dragging from boxes into All-In-One Grinders + Ghommie: + - bugfix: Fixed (cross)bows' strings not loosening once fired. + - bugfix: the multi-dimensional bomb payload now works as intended and doesn't break + once you select a theme. + - bugfix: Meat and other bloody things will not spread blood forever. + Higgin: + - balance: the shadow eyes of nightmares and shadowpeople more broadly are now sensitive + to light, requiring additional protection. + Melbert: + - bugfix: Fixes grabbing yourself when you tackle someone. + Momo8289: + - qol: HUD implants will now notify you when toggled on or off + Pickle-Coding: + - admin: Logs holosign swatting. + TheSmallBlue: + - qol: added an HUD button to go up and down floors + bigfatbananacyclops: + - rscadd: box with a set of floortile camo, which can be ordered in black market + uplink + - rscadd: also adds a backpack to camouflage + - bugfix: i had the crate under emagged console, should be fixed now. + mc-oofert: + - rscadd: Pipebombs + - rscdel: Improvised Firebombs + necromanceranne: + - bugfix: The M-90GL now correctly states that it accepts .223 toploader magazines. + vinylspiders: + - bugfix: fixes an issue where being gibbed while under the HARS mutation can sometimes + lead to the brain being deleted when it's not supposed to be diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi index 93f836f4c84bd..fb31da10ee983 100644 Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 072fbe0255848..d0734355c5e3f 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/footprints.dmi b/icons/effects/footprints.dmi index a98344abe41ee..a00c6a0f780db 100644 Binary files a/icons/effects/footprints.dmi and b/icons/effects/footprints.dmi differ diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index d28d2770ec4fb..351bb5f00c4aa 100644 Binary files a/icons/effects/mapping_helpers.dmi and b/icons/effects/mapping_helpers.dmi differ diff --git a/icons/effects/random_spawners.dmi b/icons/effects/random_spawners.dmi index c03b196a13798..08df14c0ffc99 100644 Binary files a/icons/effects/random_spawners.dmi and b/icons/effects/random_spawners.dmi differ diff --git a/icons/hud/lobby/signup_button.dmi b/icons/hud/lobby/signup_button.dmi index a67cc5584424e..daa2669069742 100644 Binary files a/icons/hud/lobby/signup_button.dmi and b/icons/hud/lobby/signup_button.dmi differ diff --git a/icons/hud/radial.dmi b/icons/hud/radial.dmi index 42d5c451018ae..90813b4d7d210 100644 Binary files a/icons/hud/radial.dmi and b/icons/hud/radial.dmi differ diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 289d02da46ada..7aa32c94b8e2a 100644 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/icons/hud/screen_changeling.dmi b/icons/hud/screen_changeling.dmi index 61d3513cbfa3d..c3bab062ac497 100644 Binary files a/icons/hud/screen_changeling.dmi and b/icons/hud/screen_changeling.dmi differ diff --git a/icons/hud/screen_clockwork.dmi b/icons/hud/screen_clockwork.dmi index aa815e957e4ae..0923e42e7e429 100644 Binary files a/icons/hud/screen_clockwork.dmi and b/icons/hud/screen_clockwork.dmi differ diff --git a/icons/hud/screen_detective.dmi b/icons/hud/screen_detective.dmi index d1d7e49a832d1..aed6e0d6572a5 100644 Binary files a/icons/hud/screen_detective.dmi and b/icons/hud/screen_detective.dmi differ diff --git a/icons/hud/screen_gen.dmi b/icons/hud/screen_gen.dmi index 1484e3f4042a9..608be00b2e1fb 100644 Binary files a/icons/hud/screen_gen.dmi and b/icons/hud/screen_gen.dmi differ diff --git a/icons/hud/screen_glass.dmi b/icons/hud/screen_glass.dmi index 29f8cb47bfd25..63ad3293921b8 100644 Binary files a/icons/hud/screen_glass.dmi and b/icons/hud/screen_glass.dmi differ diff --git a/icons/hud/screen_midnight.dmi b/icons/hud/screen_midnight.dmi index 9cfe8db9727c5..5483ddf4564a5 100644 Binary files a/icons/hud/screen_midnight.dmi and b/icons/hud/screen_midnight.dmi differ diff --git a/icons/hud/screen_operative.dmi b/icons/hud/screen_operative.dmi index b4b38782fe179..f2d60d394acc9 100644 Binary files a/icons/hud/screen_operative.dmi and b/icons/hud/screen_operative.dmi differ diff --git a/icons/hud/screen_plasmafire.dmi b/icons/hud/screen_plasmafire.dmi index 8225adbda6046..5423d3855b2b6 100644 Binary files a/icons/hud/screen_plasmafire.dmi and b/icons/hud/screen_plasmafire.dmi differ diff --git a/icons/hud/screen_retro.dmi b/icons/hud/screen_retro.dmi index a00d16cac5eb9..b4252109d6847 100644 Binary files a/icons/hud/screen_retro.dmi and b/icons/hud/screen_retro.dmi differ diff --git a/icons/hud/screen_slimecore.dmi b/icons/hud/screen_slimecore.dmi index b7e3a87e07ae9..a75fe55c37839 100644 Binary files a/icons/hud/screen_slimecore.dmi and b/icons/hud/screen_slimecore.dmi differ diff --git a/icons/hud/screen_trasenknox.dmi b/icons/hud/screen_trasenknox.dmi index 58c28d83e4be8..2569d2a635edd 100644 Binary files a/icons/hud/screen_trasenknox.dmi and b/icons/hud/screen_trasenknox.dmi differ diff --git a/icons/mob/actions/actions_changeling.dmi b/icons/mob/actions/actions_changeling.dmi index 0969b03725e19..25a4e10aa578b 100644 Binary files a/icons/mob/actions/actions_changeling.dmi and b/icons/mob/actions/actions_changeling.dmi differ diff --git a/icons/mob/actions/backgrounds.dmi b/icons/mob/actions/backgrounds.dmi index 558045a0656b0..c9aa153453880 100644 Binary files a/icons/mob/actions/backgrounds.dmi and b/icons/mob/actions/backgrounds.dmi differ diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index 49e46149a670f..c3e5dc82069ad 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/back/backpack.dmi b/icons/mob/clothing/back/backpack.dmi index bf5207d85c409..afab07d9f13b2 100644 Binary files a/icons/mob/clothing/back/backpack.dmi and b/icons/mob/clothing/back/backpack.dmi differ diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi index 3a6faaf1ef8e6..5bd3005ab8e58 100644 Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index a99bff784cee0..d0e5093d459c5 100644 Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ diff --git a/icons/mob/clothing/head/hats.dmi b/icons/mob/clothing/head/hats.dmi index 0fd0de8e4250e..4183d5fa6cb4c 100644 Binary files a/icons/mob/clothing/head/hats.dmi and b/icons/mob/clothing/head/hats.dmi differ diff --git a/icons/mob/clothing/head/helmet.dmi b/icons/mob/clothing/head/helmet.dmi index 5b30ae65b8f23..49edcf8422f26 100644 Binary files a/icons/mob/clothing/head/helmet.dmi and b/icons/mob/clothing/head/helmet.dmi differ diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index 375de24626918..db1259996c867 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index fcfdb55f52250..5440bf9d99dae 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/clothing/under/syndicate.dmi b/icons/mob/clothing/under/syndicate.dmi index 57e0cf14a3a76..0e9d8dfc91b02 100644 Binary files a/icons/mob/clothing/under/syndicate.dmi and b/icons/mob/clothing/under/syndicate.dmi differ diff --git a/icons/mob/huds/antag_hud.dmi b/icons/mob/huds/antag_hud.dmi index d8d6dd1ac40d3..90056e499fd2b 100644 Binary files a/icons/mob/huds/antag_hud.dmi and b/icons/mob/huds/antag_hud.dmi differ diff --git a/icons/mob/huds/hud.dmi b/icons/mob/huds/hud.dmi index 3dff7642a9613..7ee3267280d2a 100644 Binary files a/icons/mob/huds/hud.dmi and b/icons/mob/huds/hud.dmi differ diff --git a/icons/mob/inhands/antag/changeling_lefthand.dmi b/icons/mob/inhands/antag/changeling_lefthand.dmi index daf0e2fb3f624..a3723f8dab012 100644 Binary files a/icons/mob/inhands/antag/changeling_lefthand.dmi and b/icons/mob/inhands/antag/changeling_lefthand.dmi differ diff --git a/icons/mob/inhands/antag/changeling_righthand.dmi b/icons/mob/inhands/antag/changeling_righthand.dmi index aa2144c5962b6..d3f320a38a9f1 100644 Binary files a/icons/mob/inhands/antag/changeling_righthand.dmi and b/icons/mob/inhands/antag/changeling_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/shields_lefthand.dmi b/icons/mob/inhands/equipment/shields_lefthand.dmi index d31dbb3f830b1..ce99a16d476c0 100644 Binary files a/icons/mob/inhands/equipment/shields_lefthand.dmi and b/icons/mob/inhands/equipment/shields_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/shields_righthand.dmi b/icons/mob/inhands/equipment/shields_righthand.dmi index dfd72809be71f..1c9c990b43dc9 100644 Binary files a/icons/mob/inhands/equipment/shields_righthand.dmi and b/icons/mob/inhands/equipment/shields_righthand.dmi differ diff --git a/icons/mob/inhands/items/bedsheet_lefthand.dmi b/icons/mob/inhands/items/bedsheet_lefthand.dmi index 1f2d7df00753d..2795277a183ca 100644 Binary files a/icons/mob/inhands/items/bedsheet_lefthand.dmi and b/icons/mob/inhands/items/bedsheet_lefthand.dmi differ diff --git a/icons/mob/inhands/items/bedsheet_righthand.dmi b/icons/mob/inhands/items/bedsheet_righthand.dmi index 5c831140c9eab..4fe73af823a4c 100644 Binary files a/icons/mob/inhands/items/bedsheet_righthand.dmi and b/icons/mob/inhands/items/bedsheet_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/staves_lefthand.dmi b/icons/mob/inhands/weapons/staves_lefthand.dmi index 83504696b61a3..5e4eb552f2a5c 100644 Binary files a/icons/mob/inhands/weapons/staves_lefthand.dmi and b/icons/mob/inhands/weapons/staves_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/staves_righthand.dmi b/icons/mob/inhands/weapons/staves_righthand.dmi index c83e0eed3abee..9de32d8cd9533 100644 Binary files a/icons/mob/inhands/weapons/staves_righthand.dmi and b/icons/mob/inhands/weapons/staves_righthand.dmi differ diff --git a/icons/mob/silicon/robot_items.dmi b/icons/mob/silicon/robot_items.dmi index 9f8b0142e9c62..e18a9d08f8691 100644 Binary files a/icons/mob/silicon/robot_items.dmi and b/icons/mob/silicon/robot_items.dmi differ diff --git a/icons/mob/simple/animal.dmi b/icons/mob/simple/animal.dmi index 3bd3438bc62d5..7fcf0e9d65e79 100644 Binary files a/icons/mob/simple/animal.dmi and b/icons/mob/simple/animal.dmi differ diff --git a/icons/mob/simple/arachnoid.dmi b/icons/mob/simple/arachnoid.dmi index d17297f2ccf57..7e15fde685240 100644 Binary files a/icons/mob/simple/arachnoid.dmi and b/icons/mob/simple/arachnoid.dmi differ diff --git a/icons/mob/simple/pets.dmi b/icons/mob/simple/pets.dmi index 9bd7d69c06bc5..311fff1e6b0dc 100644 Binary files a/icons/mob/simple/pets.dmi and b/icons/mob/simple/pets.dmi differ diff --git a/icons/obj/bedsheets.dmi b/icons/obj/bedsheets.dmi index 8db48b45fc684..daa0c3cdd7904 100644 Binary files a/icons/obj/bedsheets.dmi and b/icons/obj/bedsheets.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 6397cf6fb5b5a..5bcd1df47d929 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index 2a5fea8c20bb6..d8a2fc0bd13cd 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/head/hats.dmi b/icons/obj/clothing/head/hats.dmi index 6cca3da61f41a..b655dd1756708 100644 Binary files a/icons/obj/clothing/head/hats.dmi and b/icons/obj/clothing/head/hats.dmi differ diff --git a/icons/obj/clothing/head/helmet.dmi b/icons/obj/clothing/head/helmet.dmi index d9f02085e732e..94d11e6b82040 100644 Binary files a/icons/obj/clothing/head/helmet.dmi and b/icons/obj/clothing/head/helmet.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 20951b3264f08..568c059a54d78 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 104812240fec6..0acc23d128217 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/under/syndicate.dmi b/icons/obj/clothing/under/syndicate.dmi index ffa19bd0d6257..de712a41f6b3f 100644 Binary files a/icons/obj/clothing/under/syndicate.dmi and b/icons/obj/clothing/under/syndicate.dmi differ diff --git a/icons/obj/fishing.dmi b/icons/obj/fishing.dmi index 8e8be783fb7a9..92d7da8238ad3 100644 Binary files a/icons/obj/fishing.dmi and b/icons/obj/fishing.dmi differ diff --git a/icons/obj/fluff/general.dmi b/icons/obj/fluff/general.dmi index 2628eea874694..1aa7ae5c89857 100644 Binary files a/icons/obj/fluff/general.dmi and b/icons/obj/fluff/general.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index c4d93c23b0b5d..2fb08c78be71a 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/food/piecake.dmi b/icons/obj/food/piecake.dmi index 8474ba29fe9f8..e6c0a71022d50 100644 Binary files a/icons/obj/food/piecake.dmi and b/icons/obj/food/piecake.dmi differ diff --git a/icons/obj/machines/computer.dmi b/icons/obj/machines/computer.dmi index cba0069cf6f38..aae3a83a45562 100644 Binary files a/icons/obj/machines/computer.dmi and b/icons/obj/machines/computer.dmi differ diff --git a/icons/obj/machines/mining_machines.dmi b/icons/obj/machines/mining_machines.dmi index 91f7f434ad34d..c1a4076e3a2f5 100644 Binary files a/icons/obj/machines/mining_machines.dmi and b/icons/obj/machines/mining_machines.dmi differ diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi index 02d848eb4e9da..544054279e97a 100644 Binary files a/icons/obj/machines/research.dmi and b/icons/obj/machines/research.dmi differ diff --git a/icons/obj/railings.dmi b/icons/obj/railings.dmi index 6518908d544c2..7dcb4e7c6f7d7 100644 Binary files a/icons/obj/railings.dmi and b/icons/obj/railings.dmi differ diff --git a/icons/obj/service/hydroponics/equipment.dmi b/icons/obj/service/hydroponics/equipment.dmi index ed339a8a4209d..0fcebb3c51988 100644 Binary files a/icons/obj/service/hydroponics/equipment.dmi and b/icons/obj/service/hydroponics/equipment.dmi differ diff --git a/icons/obj/storage/backpack.dmi b/icons/obj/storage/backpack.dmi index c61d9321611b6..e4364146a1c99 100644 Binary files a/icons/obj/storage/backpack.dmi and b/icons/obj/storage/backpack.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 40420db37050c..1e6a2ba68724e 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/weapons/changeling_items.dmi b/icons/obj/weapons/changeling_items.dmi index 4c26dfea49efe..ca577e6d2b28e 100644 Binary files a/icons/obj/weapons/changeling_items.dmi and b/icons/obj/weapons/changeling_items.dmi differ diff --git a/icons/obj/weapons/grenade.dmi b/icons/obj/weapons/grenade.dmi index 40ab4d99e05fc..b3fb018bafa07 100644 Binary files a/icons/obj/weapons/grenade.dmi and b/icons/obj/weapons/grenade.dmi differ diff --git a/icons/obj/weapons/guns/magic.dmi b/icons/obj/weapons/guns/magic.dmi index 90eb4bdc669a5..3d7238a72bb0b 100644 Binary files a/icons/obj/weapons/guns/magic.dmi and b/icons/obj/weapons/guns/magic.dmi differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index a4c321a05435d..6e6b1797c42ea 100644 Binary files a/icons/obj/weapons/guns/projectiles.dmi and b/icons/obj/weapons/guns/projectiles.dmi differ diff --git a/icons/obj/weapons/shields.dmi b/icons/obj/weapons/shields.dmi index 3f90af83196ba..7c4be107566ec 100644 Binary files a/icons/obj/weapons/shields.dmi and b/icons/obj/weapons/shields.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 6fc1178a6b464..89b4876c0cec2 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/ui_icons/virtualpet/pet_state.dmi b/icons/ui_icons/virtualpet/pet_state.dmi new file mode 100644 index 0000000000000..7ec865d104bc1 Binary files /dev/null and b/icons/ui_icons/virtualpet/pet_state.dmi differ diff --git a/sound/ambience/antag/spy.ogg b/sound/ambience/antag/spy.ogg new file mode 100644 index 0000000000000..1a5c64a3979b1 Binary files /dev/null and b/sound/ambience/antag/spy.ogg differ diff --git a/sound/ambience/license.txt b/sound/ambience/license.txt index 607dd6628e79b..a0b6efb24c5c1 100644 --- a/sound/ambience/license.txt +++ b/sound/ambience/license.txt @@ -1,4 +1,4 @@ -ambidet1.ogg is Fast Talking by Kevin Macleod. It has been licensed under the CC-BY 3.0 license. +ambidet1.ogg and spy.ogg is Fast Talking by Kevin Macleod. It has been licensed under the CC-BY 3.0 license. It has been cropped for use ingame. ambidet2.ogg is Night on the Docks, Piano by Kevin Macleod. It has been licensed under CC-BY 3.0 license. It has been cropped for use ingame, and also fades in. diff --git a/sound/creatures/bee_swarm.ogg b/sound/creatures/bee_swarm.ogg new file mode 100644 index 0000000000000..7cf5a5a3d9f2e Binary files /dev/null and b/sound/creatures/bee_swarm.ogg differ diff --git a/sound/items/orbie_level_up.ogg b/sound/items/orbie_level_up.ogg new file mode 100644 index 0000000000000..c876c9d78173a Binary files /dev/null and b/sound/items/orbie_level_up.ogg differ diff --git a/sound/items/orbie_notification_sound.ogg b/sound/items/orbie_notification_sound.ogg new file mode 100644 index 0000000000000..b43bba41ae5a6 Binary files /dev/null and b/sound/items/orbie_notification_sound.ogg differ diff --git a/sound/items/orbie_send_out.ogg b/sound/items/orbie_send_out.ogg new file mode 100644 index 0000000000000..aba3d84e18609 Binary files /dev/null and b/sound/items/orbie_send_out.ogg differ diff --git a/sound/items/orbie_trick_learned.ogg b/sound/items/orbie_trick_learned.ogg new file mode 100644 index 0000000000000..bc50cf41b1ced Binary files /dev/null and b/sound/items/orbie_trick_learned.ogg differ diff --git a/strings/antagonist_flavor/spy_objective.json b/strings/antagonist_flavor/spy_objective.json new file mode 100644 index 0000000000000..aa696baad6fa0 --- /dev/null +++ b/strings/antagonist_flavor/spy_objective.json @@ -0,0 +1,84 @@ +{ + "objective_body": [ + "Assassinate a high profile crewmember without being caught.", + "Cause a disaster to shake the station.", + "Cause a station evacuation.", + "Deprive the station of as many @pick(stealables) as you can.", + "Ensure @pick(department) is @pick(affected) by the end of the shift.", + "Ensure @pick(location) is @pick(affected) by the end of the shift.", + "Ensure no heads of staff @pick(escape) the station.", + "Ensure no members of @pick(department) @pick(escape) the station.", + "Ensure no rival @pick(rivals) @pick(escape) the station.", + "Frame a crewmember for a crime.", + "Free the station's AI from its laws.", + "Halt the station's @pick(happenings).", + "Invoke a mutiny against the heads of staff.", + "Make it difficult, but not impossible to @pick(escape) the station.", + "Sabotage the station's power grid or engine.", + "Steal as many @pick(stealables) as you can.", + "Take control of the station as the new Captain.", + "Take hostages of high value crewmembers and demand a ransom." + ], + "department": [ + "Security", + "Engineering", + "Medical", + "Science", + "Supply" + ], + "location": [ + "engineering", + "genetics", + "hydroponics", + "medbay", + "the bar", + "the bridge", + "the brig", + "the cargo bay", + "the chapel", + "the kitchen", + "the library", + "xenobiology" + ], + "happenings": [ + "research", + "cargo operations", + "communications", + "genetic research", + "mining operation" + ], + "affected": [ + "ablaze", + "burning", + "covered in blood", + "demolished", + "destroyed", + "engulfed in flames", + "obliterated", + "on fire", + "ruined", + "sabotaged", + "wrecked" + ], + "rivals": [ + "agents", + "moles", + "operatives", + "spies", + "traitors" + ], + "stealables": [ + "items", + "objects", + "things", + "tools", + "weapons" + ], + "escape": [ + "depart", + "escape", + "evacuate", + "flee", + "leave" + ] +} diff --git a/strings/tips.txt b/strings/tips.txt index f12ad3760bed9..2f17afc84afb2 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -33,6 +33,7 @@ As a Cultist, check the alert in the upper-right of your screen for all the deta As a Cultist, do not cause too much chaos before your objective is completed. If the shuttle gets called too soon, you may not have enough time to win. As a Cultist, the Blood Boil rune will deal massive amounts of brute damage to non-cultists, and some damage to fellow cultists of Nar'Sie nearby, but will create a fire where the rune stands on use. As a Cultist, your team starts off very weak, but if necessary can quickly convert everything they have into raw power. Make sure you have the numbers and equipment to support going loud, or the cult will fall flat on its face. +As a Curator, you earn a 22% cut (divided by number of curators) of all credits spent on painting patronages. Turn others' patience and artistry skills into your own income! As a Cyborg, choose your model carefully, as only cutting and mending your reset wire will let you re-pick it. If possible, refrain from choosing a model until a situation that requires one occurs. As a Cyborg, you are extremely vulnerable to EMPs as EMPs both stun you and damage you. The ion rifle in the armory or a traitor with an EMP kit can kill you in seconds. As a Cyborg, you are immune to most forms of stunning, and excel at almost everything far better than humans. However, flashes can easily stunlock you and you cannot do any precision work as you lack hands. diff --git a/tgstation.dme b/tgstation.dme index 92c4b4ddb166c..93fd556793f74 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -184,6 +184,7 @@ #include "code\__DEFINES\radiation.dm" #include "code\__DEFINES\radio.dm" #include "code\__DEFINES\radioactive_nebula.dm" +#include "code\__DEFINES\random_spawner.dm" #include "code\__DEFINES\reactions.dm" #include "code\__DEFINES\reagents.dm" #include "code\__DEFINES\reagents_specific_heat.dm" @@ -357,6 +358,7 @@ #include "code\__DEFINES\dcs\signals\signals_wash.dm" #include "code\__DEFINES\dcs\signals\signals_wizard.dm" #include "code\__DEFINES\dcs\signals\signals_xeno_control.dm" +#include "code\__DEFINES\dcs\signals\uplink.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_attack.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_explosion.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_lighting.dm" @@ -1113,6 +1115,7 @@ #include "code\datums\components\manual_blinking.dm" #include "code\datums\components\manual_breathing.dm" #include "code\datums\components\manual_heart.dm" +#include "code\datums\components\marionette.dm" #include "code\datums\components\mind_linker.dm" #include "code\datums\components\mirv.dm" #include "code\datums\components\mob_chain.dm" @@ -1443,6 +1446,7 @@ #include "code\datums\elements\openspace_item_click_handler.dm" #include "code\datums\elements\ore_collecting.dm" #include "code\datums\elements\organ_set_bonus.dm" +#include "code\datums\elements\permanent_fire_overlay.dm" #include "code\datums\elements\pet_bonus.dm" #include "code\datums\elements\plant_backfire.dm" #include "code\datums\elements\point_of_interest.dm" @@ -1466,6 +1470,7 @@ #include "code\datums\elements\soft_landing.dm" #include "code\datums\elements\spooky.dm" #include "code\datums\elements\squish.dm" +#include "code\datums\elements\squish_sound.dm" #include "code\datums\elements\sticker.dm" #include "code\datums\elements\strippable.dm" #include "code\datums\elements\structure_repair.dm" @@ -1491,6 +1496,7 @@ #include "code\datums\elements\weather_listener.dm" #include "code\datums\elements\web_walker.dm" #include "code\datums\elements\wheel.dm" +#include "code\datums\elements\window_smash.dm" #include "code\datums\elements\decals\_decal.dm" #include "code\datums\elements\decals\blood.dm" #include "code\datums\elements\food\dunkable.dm" @@ -1671,6 +1677,7 @@ #include "code\datums\quirks\negative_quirks\softspoken.dm" #include "code\datums\quirks\negative_quirks\tin_man.dm" #include "code\datums\quirks\negative_quirks\unstable.dm" +#include "code\datums\quirks\negative_quirks\unusual.dm" #include "code\datums\quirks\neutral_quirks\bald.dm" #include "code\datums\quirks\neutral_quirks\colorist.dm" #include "code\datums\quirks\neutral_quirks\deviant_tastes.dm" @@ -1828,7 +1835,6 @@ #include "code\datums\wires\airlock.dm" #include "code\datums\wires\apc.dm" #include "code\datums\wires\autolathe.dm" -#include "code\datums\wires\brm.dm" #include "code\datums\wires\conveyor.dm" #include "code\datums\wires\ecto_sniffer.dm" #include "code\datums\wires\emitter.dm" @@ -1948,6 +1954,7 @@ #include "code\game\machinery\launch_pad.dm" #include "code\game\machinery\lightswitch.dm" #include "code\game\machinery\limbgrower.dm" +#include "code\game\machinery\machine_frame.dm" #include "code\game\machinery\mass_driver.dm" #include "code\game\machinery\mechlaunchpad.dm" #include "code\game\machinery\medical_kiosk.dm" @@ -1990,7 +1997,6 @@ #include "code\game\machinery\computer\accounting.dm" #include "code\game\machinery\computer\aifixer.dm" #include "code\game\machinery\computer\apc_control.dm" -#include "code\game\machinery\computer\arena.dm" #include "code\game\machinery\computer\atmos_alert.dm" #include "code\game\machinery\computer\buildandrepair.dm" #include "code\game\machinery\computer\camera.dm" @@ -2171,6 +2177,7 @@ #include "code\game\objects\effects\spawners\random\ai_module.dm" #include "code\game\objects\effects\spawners\random\animalhide.dm" #include "code\game\objects\effects\spawners\random\armory.dm" +#include "code\game\objects\effects\spawners\random\bedsheet.dm" #include "code\game\objects\effects\spawners\random\bureaucracy.dm" #include "code\game\objects\effects\spawners\random\clothing.dm" #include "code\game\objects\effects\spawners\random\contraband.dm" @@ -3143,6 +3150,10 @@ #include "code\modules\antagonists\space_dragon\space_dragon.dm" #include "code\modules\antagonists\space_ninja\space_ninja.dm" #include "code\modules\antagonists\spiders\spiders.dm" +#include "code\modules\antagonists\spy\spy.dm" +#include "code\modules\antagonists\spy\spy_bounty.dm" +#include "code\modules\antagonists\spy\spy_bounty_handler.dm" +#include "code\modules\antagonists\spy\spy_uplink.dm" #include "code\modules\antagonists\survivalist\survivalist.dm" #include "code\modules\antagonists\syndicate_monkey\syndicate_monkey.dm" #include "code\modules\antagonists\traitor\balance_helper.dm" @@ -3190,6 +3201,7 @@ #include "code\modules\antagonists\wizard\equipment\chuunibyou_spell.dm" #include "code\modules\antagonists\wizard\equipment\enchanted_clown_suit.dm" #include "code\modules\antagonists\wizard\equipment\soulstone.dm" +#include "code\modules\antagonists\wizard\equipment\teleport_rod.dm" #include "code\modules\antagonists\wizard\equipment\wizard_spellbook.dm" #include "code\modules\antagonists\wizard\equipment\spellbook_entries\_entry.dm" #include "code\modules\antagonists\wizard\equipment\spellbook_entries\assistance.dm" @@ -3801,6 +3813,11 @@ #include "code\modules\clothing\under\jobs\Plasmaman\engineering.dm" #include "code\modules\clothing\under\jobs\Plasmaman\medsci.dm" #include "code\modules\clothing\under\jobs\Plasmaman\security.dm" +#include "code\modules\deathmatch\deathmatch_controller.dm" +#include "code\modules\deathmatch\deathmatch_loadouts.dm" +#include "code\modules\deathmatch\deathmatch_lobby.dm" +#include "code\modules\deathmatch\deathmatch_mapping.dm" +#include "code\modules\deathmatch\deathmatch_maps.dm" #include "code\modules\detectivework\evidence.dm" #include "code\modules\detectivework\scanner.dm" #include "code\modules\discord\accountlink.dm" @@ -4240,6 +4257,7 @@ #include "code\modules\jobs\job_types\spawner\zombie.dm" #include "code\modules\jobs\job_types\station_trait\bridge_assistant.dm" #include "code\modules\jobs\job_types\station_trait\cargo_gorilla.dm" +#include "code\modules\jobs\job_types\station_trait\veteran_advisor.dm" #include "code\modules\keybindings\bindings_atom.dm" #include "code\modules\keybindings\bindings_client.dm" #include "code\modules\keybindings\focus.dm" @@ -4356,6 +4374,7 @@ #include "code\modules\mapfluff\ruins\lavalandruin_code\watcher_grave.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\ash_walker_den.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\cursed_slot_machine.dm" +#include "code\modules\mapfluff\ruins\objects_and_mobs\museum.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\necropolis_gate.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\sin_ruins.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\allamericandiner.dm" @@ -4428,7 +4447,9 @@ #include "code\modules\mining\shelters.dm" #include "code\modules\mining\voucher_sets.dm" #include "code\modules\mining\boulder_processing\_boulder_processing.dm" +#include "code\modules\mining\boulder_processing\beacon.dm" #include "code\modules\mining\boulder_processing\boulder.dm" +#include "code\modules\mining\boulder_processing\boulder_types.dm" #include "code\modules\mining\boulder_processing\brm.dm" #include "code\modules\mining\boulder_processing\refinery.dm" #include "code\modules\mining\equipment\explorer_gear.dm" @@ -4671,6 +4692,9 @@ #include "code\modules\mob\living\basic\pets\dog\corgi.dm" #include "code\modules\mob\living\basic\pets\dog\dog_subtypes.dm" #include "code\modules\mob\living\basic\pets\dog\strippable_items.dm" +#include "code\modules\mob\living\basic\pets\orbie\orbie.dm" +#include "code\modules\mob\living\basic\pets\orbie\orbie_abilities.dm" +#include "code\modules\mob\living\basic\pets\orbie\orbie_ai.dm" #include "code\modules\mob\living\basic\pets\parrot\_parrot.dm" #include "code\modules\mob\living\basic\pets\parrot\parrot_items.dm" #include "code\modules\mob\living\basic\pets\parrot\parrot_subtypes.dm" @@ -4759,6 +4783,7 @@ #include "code\modules\mob\living\basic\space_fauna\spider\spiderlings\spiderling_subtypes.dm" #include "code\modules\mob\living\basic\space_fauna\spider\young_spider\young_spider.dm" #include "code\modules\mob\living\basic\space_fauna\spider\young_spider\young_spider_subtypes.dm" +#include "code\modules\mob\living\basic\space_fauna\statue\mannequin.dm" #include "code\modules\mob\living\basic\space_fauna\statue\statue.dm" #include "code\modules\mob\living\basic\space_fauna\wumborian_fugu\fugu_gland.dm" #include "code\modules\mob\living\basic\space_fauna\wumborian_fugu\inflation.dm" @@ -5080,6 +5105,7 @@ #include "code\modules\modular_computers\file_system\programs\statusdisplay.dm" #include "code\modules\modular_computers\file_system\programs\techweb.dm" #include "code\modules\modular_computers\file_system\programs\theme_selector.dm" +#include "code\modules\modular_computers\file_system\programs\virtual_pet.dm" #include "code\modules\modular_computers\file_system\programs\wirecarp.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\contractor_program.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" @@ -5789,6 +5815,7 @@ #include "code\modules\tgui\states\zlevel.dm" #include "code\modules\tgui_input\alert.dm" #include "code\modules\tgui_input\checkboxes.dm" +#include "code\modules\tgui_input\keycombo.dm" #include "code\modules\tgui_input\list.dm" #include "code\modules\tgui_input\number.dm" #include "code\modules\tgui_input\text.dm" @@ -5841,6 +5868,7 @@ #include "code\modules\uplink\uplink_items\nukeops.dm" #include "code\modules\uplink\uplink_items\special.dm" #include "code\modules\uplink\uplink_items\species.dm" +#include "code\modules\uplink\uplink_items\spy_unique.dm" #include "code\modules\uplink\uplink_items\stealthy.dm" #include "code\modules\uplink\uplink_items\stealthy_tools.dm" #include "code\modules\uplink\uplink_items\suits.dm" diff --git a/tgui/package.json b/tgui/package.json index 1370aacc48a05..bfbc5a34aba21 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -17,7 +17,9 @@ "tgui:test": "jest --watch", "tgui:test-simple": "CI=true jest --color", "tgui:test-ci": "CI=true jest --color --collect-coverage", - "tgui:tsc": "tsc" + "tgui:tsc": "tsc", + "tgui:prettier-fix": "prettier --write .", + "tgui:eslint-fix": "eslint --fix packages --ext .js,.cjs,.ts,.tsx" }, "dependencies": { "@swc/core": "^1.3.100", diff --git a/tgui/packages/tgui-panel/chat/ChatPageSettings.jsx b/tgui/packages/tgui-panel/chat/ChatPageSettings.jsx index 67028168f8e86..4bd0383d7d759 100644 --- a/tgui/packages/tgui-panel/chat/ChatPageSettings.jsx +++ b/tgui/packages/tgui-panel/chat/ChatPageSettings.jsx @@ -14,7 +14,13 @@ import { Stack, } from 'tgui/components'; -import { removeChatPage, toggleAcceptedType, updateChatPage } from './actions'; +import { + moveChatPageLeft, + moveChatPageRight, + removeChatPage, + toggleAcceptedType, + updateChatPage, +} from './actions'; import { MESSAGE_TYPES } from './constants'; import { selectCurrentChatPage } from './selectors'; @@ -24,9 +30,9 @@ export const ChatPageSettings = (props) => { return (
    - + dispatch( @@ -39,20 +45,74 @@ export const ChatPageSettings = (props) => { /> - + /> + {!page.isMain ? ( + + + + ) : ( + '' + )} + + + + {!page.isMain ? ( + + Reorder Chat:  + + + + ) : ( + '' + )}
    diff --git a/tgui/packages/tgui-panel/chat/ChatTabs.jsx b/tgui/packages/tgui-panel/chat/ChatTabs.jsx index 2031f6a255b00..3e3880a2aec2f 100644 --- a/tgui/packages/tgui-panel/chat/ChatTabs.jsx +++ b/tgui/packages/tgui-panel/chat/ChatTabs.jsx @@ -39,6 +39,7 @@ export const ChatTabs = (props) => { key={page.id} selected={page === currentPage} rightSlot={ + !page.hideUnreadCount && page.unreadCount > 0 && ( ) diff --git a/tgui/packages/tgui-panel/chat/actions.js b/tgui/packages/tgui-panel/chat/actions.js index 3814fbe611f79..0b6a73f659a79 100644 --- a/tgui/packages/tgui-panel/chat/actions.js +++ b/tgui/packages/tgui-panel/chat/actions.js @@ -10,6 +10,7 @@ import { createPage } from './model'; export const loadChat = createAction('chat/load'); export const rebuildChat = createAction('chat/rebuild'); +export const clearChat = createAction('chat/clear'); export const updateMessageCount = createAction('chat/updateMessageCount'); export const addChatPage = createAction('chat/addPage', () => ({ payload: createPage(), @@ -20,3 +21,5 @@ export const toggleAcceptedType = createAction('chat/toggleAcceptedType'); export const removeChatPage = createAction('chat/removePage'); export const changeScrollTracking = createAction('chat/changeScrollTracking'); export const saveChatToDisk = createAction('chat/saveToDisk'); +export const moveChatPageLeft = createAction('chat/movePageLeft'); +export const moveChatPageRight = createAction('chat/movePageRight'); diff --git a/tgui/packages/tgui-panel/chat/middleware.js b/tgui/packages/tgui-panel/chat/middleware.js index 0eeb0d6957d74..83fc28dc86a99 100644 --- a/tgui/packages/tgui-panel/chat/middleware.js +++ b/tgui/packages/tgui-panel/chat/middleware.js @@ -19,7 +19,10 @@ import { addChatPage, changeChatPage, changeScrollTracking, + clearChat, loadChat, + moveChatPageLeft, + moveChatPageRight, rebuildChat, removeChatPage, saveChatToDisk, @@ -153,7 +156,9 @@ export const chatMiddleware = (store) => { type === changeChatPage.type || type === addChatPage.type || type === removeChatPage.type || - type === toggleAcceptedType.type + type === toggleAcceptedType.type || + type === moveChatPageLeft.type || + type === moveChatPageRight.type ) { next(action); const page = selectCurrentChatPage(store.getState()); @@ -190,6 +195,10 @@ export const chatMiddleware = (store) => { chatRenderer.saveToDisk(); return; } + if (type === clearChat.type) { + chatRenderer.clearChat(); + return; + } return next(action); }; }; diff --git a/tgui/packages/tgui-panel/chat/model.js b/tgui/packages/tgui-panel/chat/model.js index fdb5521b505b9..ca2c585d2ec8a 100644 --- a/tgui/packages/tgui-panel/chat/model.js +++ b/tgui/packages/tgui-panel/chat/model.js @@ -19,10 +19,12 @@ export const createPage = (obj) => { } return { + isMain: false, id: createUuid(), name: 'New Tab', acceptedTypes: acceptedTypes, unreadCount: 0, + hideUnreadCount: false, createdAt: Date.now(), ...obj, }; @@ -34,6 +36,7 @@ export const createMainPage = () => { acceptedTypes[typeDef.type] = true; } return createPage({ + isMain: true, name: 'Main', acceptedTypes, }); diff --git a/tgui/packages/tgui-panel/chat/reducer.js b/tgui/packages/tgui-panel/chat/reducer.js index 7a7681ada7416..effc9423955e8 100644 --- a/tgui/packages/tgui-panel/chat/reducer.js +++ b/tgui/packages/tgui-panel/chat/reducer.js @@ -9,6 +9,8 @@ import { changeChatPage, changeScrollTracking, loadChat, + moveChatPageLeft, + moveChatPageRight, removeChatPage, toggleAcceptedType, updateChatPage, @@ -188,5 +190,52 @@ export const chatReducer = (state = initialState, action) => { } return nextState; } + if (type === moveChatPageLeft.type) { + const { pageId } = payload; + const nextState = { + ...state, + pages: [...state.pages], + pageById: { + ...state.pageById, + }, + }; + const tmpPage = nextState.pageById[pageId]; + const fromIndex = nextState.pages.indexOf(tmpPage.id); + const toIndex = fromIndex - 1; + // don't ever move leftmost page + if (fromIndex > 0) { + // don't ever move anything to the leftmost page + if (toIndex > 0) { + const tmp = nextState.pages[fromIndex]; + nextState.pages[fromIndex] = nextState.pages[toIndex]; + nextState.pages[toIndex] = tmp; + } + } + return nextState; + } + + if (type === moveChatPageRight.type) { + const { pageId } = payload; + const nextState = { + ...state, + pages: [...state.pages], + pageById: { + ...state.pageById, + }, + }; + const tmpPage = nextState.pageById[pageId]; + const fromIndex = nextState.pages.indexOf(tmpPage.id); + const toIndex = fromIndex + 1; + // don't ever move leftmost page + if (fromIndex > 0) { + // don't ever move anything out of the array + if (toIndex < nextState.pages.length) { + const tmp = nextState.pages[fromIndex]; + nextState.pages[fromIndex] = nextState.pages[toIndex]; + nextState.pages[toIndex] = tmp; + } + } + return nextState; + } return state; }; diff --git a/tgui/packages/tgui-panel/chat/renderer.jsx b/tgui/packages/tgui-panel/chat/renderer.jsx index 899839e56cc11..0d26061f60b0a 100644 --- a/tgui/packages/tgui-panel/chat/renderer.jsx +++ b/tgui/packages/tgui-panel/chat/renderer.jsx @@ -205,7 +205,7 @@ class ChatRenderer { const highlightWholeMessage = setting.highlightWholeMessage; const matchWord = setting.matchWord; const matchCase = setting.matchCase; - const allowedRegex = /^[a-z0-9_\-$/^[\s\]\\]+$/gi; + const allowedRegex = /^[a-zĐ°-ŃŹŃ‘0-9_\-$/^[\s\]\\]+$/gi; const regexEscapeCharacters = /[!#$%^&*)(+=.<>{}[\]:;'"|~`_\-\\/]/g; const lines = String(text) .split(',') @@ -562,6 +562,29 @@ class ChatRenderer { }); } + /** + * @clearChat + * @copyright 2023 + * @author Cheffie + * @link https://github.com/CheffieGithub + * @license MIT + */ + clearChat() { + const messages = this.visibleMessages; + this.visibleMessages = []; + for (let i = 0; i < messages.length; i++) { + const message = messages[i]; + this.rootNode.removeChild(message.node); + // Mark this message as pruned + message.node = 'pruned'; + } + // Remove pruned messages from the message array + this.messages = this.messages.filter( + (message) => message.node !== 'pruned', + ); + logger.log(`Cleared chat`); + } + saveToDisk() { // Allow only on IE11 if (Byond.IS_LTE_IE10) { diff --git a/tgui/packages/tgui-panel/chat/replaceInTextNode.js b/tgui/packages/tgui-panel/chat/replaceInTextNode.js index 4c91b604dacf7..7148bfe7aa698 100644 --- a/tgui/packages/tgui-panel/chat/replaceInTextNode.js +++ b/tgui/packages/tgui-panel/chat/replaceInTextNode.js @@ -93,7 +93,7 @@ export const replaceInTextNode = (regex, words, createNode) => (node) => { for (let word of words) { // Capture if the word is at the beginning, end, middle, // or by itself in a message - wordRegexStr += `^${word}\\W|\\W${word}\\W|\\W${word}$|^${word}$`; + wordRegexStr += `^${word}\\s\\W|\\s\\W${word}\\s\\W|\\s\\W${word}$|^${word}\\s\\W$`; // Make sure the last character for the expression is NOT '|' if (++i !== words.length) { wordRegexStr += '|'; diff --git a/tgui/packages/tgui-panel/settings/SettingsPanel.jsx b/tgui/packages/tgui-panel/settings/SettingsPanel.jsx index a7c90af8cc922..230f655181ec3 100644 --- a/tgui/packages/tgui-panel/settings/SettingsPanel.jsx +++ b/tgui/packages/tgui-panel/settings/SettingsPanel.jsx @@ -13,7 +13,6 @@ import { ColorBox, Divider, Dropdown, - Flex, Input, LabeledList, NumberInput, @@ -24,7 +23,7 @@ import { } from 'tgui/components'; import { ChatPageSettings } from '../chat'; -import { rebuildChat, saveChatToDisk } from '../chat/actions'; +import { clearChat, rebuildChat, saveChatToDisk } from '../chat/actions'; import { THEMES } from '../themes'; import { addHighlightSetting, @@ -130,7 +129,6 @@ export const SettingsGeneral = (props) => { content="Custom font" icon={freeFont ? 'lock-open' : 'lock'} color={freeFont ? 'good' : 'bad'} - ml={1} onClick={() => { setFreeFont(!freeFont); }} @@ -140,7 +138,7 @@ export const SettingsGeneral = (props) => { { { - + + +
    ); }; @@ -188,30 +201,28 @@ const TextHighlightSettings = (props) => { const highlightSettings = useSelector(selectHighlightSettings); const dispatch = useDispatch(); return ( -
    -
    - - {highlightSettings.map((id, i) => ( - + + {highlightSettings.map((id, i) => ( + + ))} + {highlightSettings.length < MAX_HIGHLIGHT_SETTINGS && ( + +
    + + )} +